Generalize reinforcement insertion / extraction.

This commit is contained in:
Paul Chote
2013-12-20 18:57:29 +13:00
parent 09b694095c
commit 883b014888
3 changed files with 54 additions and 53 deletions

View File

@@ -28,8 +28,20 @@ Actor.MoveNear = function(actor, location, nearEnough)
end end
Actor.ScriptedMove = function(actor, location) Actor.ScriptedMove = function(actor, location)
if Actor.HasTrait(actor, "Helicopter") then
actor:QueueActivity(OpenRA.New("HeliFly", { location.CenterPosition }))
else
actor:QueueActivity(OpenRA.New("Move", { location })) actor:QueueActivity(OpenRA.New("Move", { location }))
end end
end
Actor.AfterMove = function(actor)
local heli = Actor.TraitOrDefault(actor, "Helicopter")
if heli ~= nil then
Actor.Turn(actor, heli.Info.InitialFacing)
Actor.HeliLand(actor, true)
end
end
Actor.Teleport = function(actor, location) Actor.Teleport = function(actor, location)
actor:QueueActivity(OpenRA.New("SimpleTeleport", { location })) actor:QueueActivity(OpenRA.New("SimpleTeleport", { location }))
@@ -174,3 +186,11 @@ end
Actor.TraitInfo = function(actorType, className) Actor.TraitInfo = function(actorType, className)
return Internal.TraitInfo(actorType, className) return Internal.TraitInfo(actorType, className)
end end
Actor.InitialAltitude = function(actorName)
if Actor.HasTraitInfo("AircraftInfo") then
return Actor.TraitInfo(actorName, "AircraftInfo").CruiseAltitude
end
return 0
end

View File

@@ -1,62 +1,43 @@
Reinforcements = { } Reinforcements = { }
Reinforcements.PerformHelicopterInsertion = function(owner, helicopterName, passengerNames, enterPosition, unloadPosition, exitPosition) Reinforcements.Insert = function(owner, transportName, passengerNames, enterPath, exitPath)
local facing = { Map.GetFacing(WPos.op_Subtraction(unloadPosition, enterPosition), 0), "Int32" } local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" }
local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" } local altitude = Actor.InitialAltitude(transportName)
local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude }) local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], Facing = facing, Altitude = { altitude, "Int32" } })
local cargo = Actor.Trait(heli, "Cargo") local cargo = Actor.Trait(transport, "Cargo")
local passengers = { } local passengers = { }
for i, passengerName in ipairs(passengerNames) do for i, passengerName in ipairs(passengerNames) do
local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner }) local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner })
cargo:Load(heli, passenger)
passengers[i] = passenger passengers[i] = passenger
end cargo:Load(transport, passenger)
Actor.HeliFly(heli, unloadPosition)
Actor.Turn(heli, 0)
Actor.HeliLand(heli, true)
Actor.UnloadCargo(heli, true)
Actor.Wait(heli, 125)
Actor.HeliFly(heli, exitPosition)
Actor.RemoveSelf(heli)
return heli, passengers
end end
Reinforcements.PerformHelicopterExtraction = function(owner, helicopterName, passengers, enterPosition, loadPosition, exitPosition) Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
local facing = { Map.GetFacing(WPos.op_Subtraction(loadPosition, enterPosition), 0), "Int32" } Actor.AfterMove(transport)
local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" } Actor.UnloadCargo(transport, true)
local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude }) Actor.Wait(transport, 25)
local cargo = Actor.Trait(heli, "Cargo") Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
Actor.HeliFly(heli, loadPosition) Actor.RemoveSelf(transport)
Actor.Turn(heli, 0) return transport, passengers
Actor.HeliLand(heli, true) end
Actor.WaitFor(heli, function()
return Utils.All(passengers, function(passenger) return cargo.Passengers:Contains(passenger) end) Reinforcements.Extract = function(owner, transportName, passengerNames, enterPath, exitPath)
local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" }
local altitude = Actor.InitialAltitude(transportName)
local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], Facing = facing, Altitude = { altitude, "Int32" } })
local cargo = Actor.Trait(transport, "Cargo")
Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
Actor.AfterMove(transport)
Actor.WaitFor(transport, function()
return Utils.All(passengerNames, function(passenger) return cargo.Passengers:Contains(passenger) end)
end) end)
Actor.Wait(heli, 125)
Actor.HeliFly(heli, exitPosition)
Actor.RemoveSelf(heli)
return heli
end
Reinforcements.PerformInsertion = function(owner, vehicleName, passengerNames, enterPath, exitPath) Actor.Wait(transport, 125)
local facing = { 0, "Int32" } Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
if #enterPath > 1 then Actor.RemoveSelf(transport)
facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" } return transport
end
local vehicle = Actor.Create(vehicleName, { Owner = owner, Location = enterPath[1], Facing = facing })
local cargo = Actor.Trait(vehicle, "Cargo")
local passengers = { }
for i, passengerName in ipairs(passengerNames) do
local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner })
passengers[i] = passenger
cargo:Load(vehicle, passenger)
end
Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(vehicle, l) end)
Actor.UnloadCargo(vehicle, true)
Actor.Wait(vehicle, 25)
Utils.Do(exitPath, function(l) Actor.ScriptedMove(vehicle, l) end)
Actor.RemoveSelf(vehicle)
return vehicle, passengers
end end
Reinforcements.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc) Reinforcements.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc)

View File

@@ -13,8 +13,8 @@ CivilianWait = 150
BaseAlertDelay = 300 BaseAlertDelay = 300
SendInsertionHelicopter = function() SendInsertionHelicopter = function()
local heli, passengers = Reinforcements.PerformHelicopterInsertion(player, InsertionHelicopterType, { TanyaType }, local heli, passengers = Reinforcements.Insert(player, InsertionHelicopterType, { TanyaType },
InsertionEntry.CenterPosition, InsertionLZ.CenterPosition, InsertionEntry.CenterPosition) { InsertionEntry.Location, InsertionLZ.Location }, { InsertionEntry.Location })
tanya = passengers[1] tanya = passengers[1]
Actor.OnKilled(tanya, TanyaKilled) Actor.OnKilled(tanya, TanyaKilled)
end end
@@ -59,8 +59,8 @@ LabGuardsKilled = function()
end end
SendExtractionHelicopter = function() SendExtractionHelicopter = function()
local heli = Reinforcements.PerformHelicopterExtraction(player, ExtractionHelicopterType, { einstein }, local heli = Reinforcements.Extract(player, ExtractionHelicopterType, { einstein },
SouthReinforcementsPoint.CenterPosition, ExtractionLZ.CenterPosition, ExtractionExitPoint.CenterPosition) { SouthReinforcementsPoint.Location, ExtractionLZ.Location }, { ExtractionExitPoint.Location })
Actor.OnKilled(heli, HelicopterDestroyed) Actor.OnKilled(heli, HelicopterDestroyed)
Actor.OnRemovedFromWorld(heli, HelicopterExtractionCompleted) Actor.OnRemovedFromWorld(heli, HelicopterExtractionCompleted)
end end