Skip to content

Commit

Permalink
Port Intervention to the new Lua API
Browse files Browse the repository at this point in the history
  • Loading branch information
obrakmann committed Oct 18, 2014
1 parent 537d65a commit 39ca6af
Show file tree
Hide file tree
Showing 4 changed files with 338 additions and 279 deletions.
1 change: 1 addition & 0 deletions OpenRA.sln
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re
mods\ra\maps\allies-01-classic\allies01.lua = mods\ra\maps\allies-01-classic\allies01.lua
mods\ra\maps\allies-02-classic\allies02.lua = mods\ra\maps\allies-02-classic\allies02.lua
mods\ra\maps\desert-shellmap\desert-shellmap.lua = mods\ra\maps\desert-shellmap\desert-shellmap.lua
mods\ra\maps\intervention\intervention.lua = mods\ra\maps\intervention\intervention.lua
mods\ra\maps\fort-lonestar\fort-lonestar.lua = mods\ra\maps\fort-lonestar\fort-lonestar.lua
EndProjectSection
EndProject
Expand Down
279 changes: 279 additions & 0 deletions mods/ra/maps/intervention/intervention.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
BeachheadTrigger =
{
CPos.New(120, 90), CPos.New(120, 89), CPos.New(120, 88), CPos.New(121, 88), CPos.New(122, 88), CPos.New(123, 88), CPos.New(124, 88),
CPos.New(125, 88), CPos.New(126, 88), CPos.New(126, 89), CPos.New(127, 89), CPos.New(128, 89), CPos.New(128, 90), CPos.New(129, 90),
CPos.New(130, 90), CPos.New(130, 91), CPos.New(131, 91), CPos.New(132, 91), CPos.New(133, 91), CPos.New(134, 91), CPos.New(134, 92),
CPos.New(135, 92), CPos.New(136, 92), CPos.New(137, 92), CPos.New(137, 93), CPos.New(138, 93), CPos.New(139, 93), CPos.New(140, 93),
CPos.New(140, 94), CPos.New(140, 95), CPos.New(140, 96), CPos.New(140, 97), CPos.New(140, 98), CPos.New(140, 99), CPos.New(140, 100),
CPos.New(139, 100), CPos.New(139, 101), CPos.New(139, 102), CPos.New(138, 102), CPos.New(138, 103), CPos.New(138, 104),
CPos.New(137, 104), CPos.New(137, 105), CPos.New(137, 106), CPos.New(136, 106), CPos.New(136, 107)
}

BaseRaidInterval = Utils.Minutes(3)
BaseFrontAttackInterval = Utils.Minutes(3) + Utils.Seconds(30)
BaseRearAttackInterval = Utils.Minutes(8)
UBoatPatrolDelay = Utils.Minutes(2) + Utils.Seconds(30)
BaseFrontAttackWpts = { PatrolWpt1.Location, BaseRaidWpt1.Location }

Village = { FarmHouse1, FarmHouse2, FarmHouse3, FarmHouse4, FarmHouse5, FarmHouse6, FarmHouse7, FarmHouse8, FarmHouse9, Church }
VillageRaidInterval = Utils.Minutes(3)
VillageRaidAircraft = { "mig", "mig" }
VillageRaidWpts = { VillageRaidEntrypoint.Location, VillageRaidWpt1.Location, VillageRaidWpt2.Location }

BaseRaidAircraft = { "mig", "mig" }
BaseRaidWpts = { BaseRaidEntrypoint.Location, UboatPatrolWpt1.Location, BaseRaidWpt2.Location }

BaseFrontAttackUnits = { "e3", "e3", "e1", "e1", "e1", "3tnk", "3tnk", "apc" }
BaseRearAttackUnits = { "e3", "e3", "e1", "e1", "3tnk", "3tnk", "v2rl" }
BaseRearAttackWpts = { GroundAttackWpt1.Location, BaseRearAttackWpt1.Location, BaseRearAttackWpt2.Location, BaseRearAttackWpt3.Location }

SovietHarvesters = { Harvester1, Harvester2, Harvester3 }
HarvesterGuard = { HarvGuard1, HarvGuard2, HarvGuard3 }

UBoats = { Uboat1, Uboat2, Uboat3, Uboat4, Uboat5, Uboat6 }
UboatPatrolWpts1 = { UboatPatrolWpt1.Location, UboatPatrolWpt2.Location, UboatPatrolWpt3.Location, UboatPatrolWpt4.Location }
UboatPatrolWpts2 = { UboatPatrolWpt4.Location, UboatPatrolWpt2.Location, UboatPatrolWpt1.Location }
UBoatPatrolUnits = { "ss" }

HunterSubs = { "ss", "ss" }

GroundPatrolWpts = { PatrolWpt1.Location, PatrolWpt2.Location }
GroundPatrolUnits =
{
{ "e1", "e1", "e1", "e3", "e3", "dog" },
{ "apc", "apc", "ftrk" },
{ "3tnk", "3tnk" }
}
Paratroopers = { "e1", "e1", "e1", "e3", "e3" }

ParadropSovietUnits = function()
local start = BaseRaidEntrypoint.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("badr"))
local transport = Actor.Create("badr", true, { CenterPosition = start, Owner = soviets, Facing = (Utils.CenterOfCell(MCVDeployLocation.Location) - start).Facing })

Utils.Do(Paratroopers, function(type)
local a = Actor.Create(type, false, { Owner = soviets })
transport.LoadPassenger(a)
Trigger.OnIdle(a, function(b) b.Hunt() end)
end)

transport.Paradrop(MCVDeployLocation.Location)
end

AirRaid = function(planeTypes, ingress, egress, target)
if target == nil then
return
end

for i = 1, #planeTypes do
Trigger.AfterDelay((i - 1) * Utils.Seconds(1), function()
local start = Utils.CenterOfCell(ingress[1]) + WVec.New(0, 0, Actor.CruiseAltitude(planeTypes[i]))
local plane = Actor.Create(planeTypes[i], true, { CenterPosition = start, Owner = soviets, Facing = (Utils.CenterOfCell(ingress[2]) - start).Facing })

Utils.Do(ingress, function(wpt) plane.Move(wpt) end)
plane.Attack(target)
Utils.Do(egress, function(wpt) plane.Move(wpt) end)
plane.Destroy()
end)
end
end

BaseRaid = function()
local targets = Map.ActorsInBox(AlliedAreaTopLeft.CenterPosition, AlliedAreaBottomRight.CenterPosition, function(actor)
return actor.Owner == player and actor.HasProperty("RepairBuilding")
end)

if #targets == 0 then
return
end

local target = Utils.Random(targets)

AirRaid(BaseRaidAircraft, BaseRaidWpts, { VillageRaidEntrypoint.Location }, target)

Trigger.AfterDelay(BaseRaidInterval, BaseRaid)
end

VillageRaid = function()
local target = nil
Utils.Do(Village, function(tgt)
if target == nil and not tgt.IsDead then
target = tgt
return
end
end)

if target == nil then
return
end

AirRaid(VillageRaidAircraft, VillageRaidWpts, { BaseRaidEntrypoint.Location }, target)

Trigger.AfterDelay(VillageRaidInterval, VillageRaid)
end

SendUboatPatrol = function(team)
Trigger.AfterDelay(UBoatPatrolDelay, function()
Utils.Do(team, function(uboat)
if not uboat.IsDead then
uboat.PatrolUntil(UboatPatrolWpts1, function()
return Time.GameTime > Utils.Minutes(2) + UBoatPatrolDelay
end)
uboat.Patrol(UboatPatrolWpts2)
end
end)
end)
end

SendGroundPatrol = function(team)
Utils.Do(team, function(unit) unit.Patrol(GroundPatrolWpts, true, Utils.Seconds(3)) end)
Utils.Do(team, function(unit)
Trigger.OnIdle(unit, function(actor) actor.Hunt() end)
end)
Trigger.OnAllKilled(team, function()
Build(Utils.Random(GroundPatrolUnits), SendGroundPatrol)
end)
end

BaseFrontAttack = function(team)
Utils.Do(team, function(unit) unit.Patrol(BaseFrontAttackWpts, false) end)
Utils.Do(team, function(unit)
Trigger.OnIdle(unit, function(actor) actor.Hunt() end)
end)
Trigger.AfterDelay(BaseFrontAttackInterval, function() Build(BaseFrontAttackUnits, BaseFrontAttack) end)
end

BaseRearAttack = function(team)
Utils.Do(team, function(unit) unit.Patrol(BaseRearAttackWpts, false) end)
Utils.Do(team, function(unit)
Trigger.OnIdle(unit, function(actor) actor.Hunt() end)
end)
Trigger.AfterDelay(BaseRearAttackInterval, function() Build(BaseRearAttackUnits, BaseRearAttack) end)
end

Build = function(units, action)
if not soviets.Build(units, action) then
Trigger.AfterDelay(Utils.Seconds(15), function()
Build(units, action)
end)
end
end

SetupWorld = function()
Utils.Do(SovietHarvesters, function(a) a.FindResources() end)

Utils.Do(SovietHarvesters, function(harvester)
Trigger.OnDamaged(harvester, function(h)
Utils.Do(HarvesterGuard, function(g)
if not g.IsDead then
g.Stop()
g.AttackMove(h.Location, 3)
end
end)
end)
end)

Utils.Do(UBoats, function(a) a.Stance = "Defend" end)

Utils.Do(Map.NamedActors, function(actor)
if actor.Owner == soviets and actor.HasProperty("RepairBuilding") then
Trigger.OnDamaged(actor, function(building)
if building.Owner == soviets then
building.RepairBuilding()
end
end)
end
end)

WarFactory.RallyPoint = Rallypoint.Location
WarFactory.IsPrimaryBuilding = true
Barracks.IsPrimaryBuilding = true
SubPen.IsPrimaryBuilding = true
end

Tick = function()
if soviets.Resources > soviets.ResourceCapacity * 0.75 then
soviets.Resources = soviets.Resources - ((soviets.ResourceCapacity * 0.01) / 25)
end

if player.HasNoRequiredUnits() then
player.MarkFailedObjective(villageObjective)
end
end

WorldLoaded = function()
player = Player.GetPlayer("Allies")
soviets = Player.GetPlayer("Soviets")

Trigger.OnObjectiveAdded(player, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
end)
Trigger.OnObjectiveCompleted(player, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
end)
Trigger.OnObjectiveFailed(player, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
end)

Trigger.OnPlayerWon(player, function()
Media.PlaySpeechNotification(player, "Win")
end)

Trigger.OnPlayerLost(player, function()
Media.PlaySpeechNotification(player, "Lose")
end)

sovietObjective = soviets.AddPrimaryObjective("Destroy the village.")
villageObjective = player.AddPrimaryObjective("Save the village.")
beachheadObjective = player.AddSecondaryObjective("Get your MCV to the main island.")

beachheadTrigger = false
Trigger.OnExitedFootprint(BeachheadTrigger, function(a, id)
if not beachheadTrigger and a.Owner == player and a.Type == "mcv" then
beachheadTrigger = true
Trigger.RemoveFootprintTrigger(id)
player.MarkCompletedObjective(beachheadObjective)

captureObjective = player.AddPrimaryObjective("Locate and capture the enemy's Air Force HQ.")
Trigger.OnCapture(AirForceHQ, function()
Trigger.AfterDelay(Utils.Seconds(3), function()
player.MarkCompletedObjective(captureObjective)
player.MarkCompletedObjective(villageObjective)
end)
end)
Trigger.OnKilled(AirForceHQ, function() player.MarkFailedObjective(captureObjective) end)

Trigger.AfterDelay(BaseFrontAttackInterval, function()
Build(BaseFrontAttackUnits, BaseFrontAttack)
ParadropSovietUnits()
end)
Trigger.AfterDelay(BaseRearAttackInterval, function()
Build(BaseRearAttackUnits, BaseRearAttack)
end)
Trigger.AfterDelay(BaseRaidInterval, BaseRaid)

Trigger.AfterDelay(UBoatPatrolDelay, function()
Build(HunterSubs, function(subs)
Utils.Do(subs, function(sub)
Trigger.OnIdle(sub, function(s) s.Hunt() end)
end)
end)
end)
end
end)

Trigger.OnAllKilled(Village, function() player.MarkFailedObjective(villageObjective) end)

SetupWorld()

Trigger.AfterDelay(VillageRaidInterval, VillageRaid)

Trigger.AfterDelay(1, function() Build(UBoatPatrolUnits, SendUboatPatrol) end)
Trigger.AfterDelay(1, function() Build(Utils.Random(GroundPatrolUnits), SendGroundPatrol) end)

Reinforcements.Reinforce(player, { "mcv" }, { MCVInsertLocation.Location, MCVDeployLocation.Location }, 0, function(mcv)
mcv.Deploy()
end)

Camera.Position = CameraSpot.CenterPosition
Trigger.AfterDelay(Utils.Seconds(5), function() CameraSpot.Destroy() end)
end
Loading

0 comments on commit 39ca6af

Please sign in to comment.