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,7 +28,19 @@ 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
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 end
Actor.Teleport = function(actor, location) Actor.Teleport = function(actor, 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
cargo:Load(transport, passenger)
end end
Actor.HeliFly(heli, unloadPosition)
Actor.Turn(heli, 0) Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
Actor.HeliLand(heli, true) Actor.AfterMove(transport)
Actor.UnloadCargo(heli, true) Actor.UnloadCargo(transport, true)
Actor.Wait(heli, 125) Actor.Wait(transport, 25)
Actor.HeliFly(heli, exitPosition) Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
Actor.RemoveSelf(heli) Actor.RemoveSelf(transport)
return heli, passengers return transport, passengers
end end
Reinforcements.PerformHelicopterExtraction = function(owner, helicopterName, passengers, enterPosition, loadPosition, exitPosition) Reinforcements.Extract = function(owner, transportName, passengerNames, enterPath, exitPath)
local facing = { Map.GetFacing(WPos.op_Subtraction(loadPosition, 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")
Actor.HeliFly(heli, loadPosition)
Actor.Turn(heli, 0) Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
Actor.HeliLand(heli, true) Actor.AfterMove(transport)
Actor.WaitFor(heli, function() Actor.WaitFor(transport, function()
return Utils.All(passengers, function(passenger) return cargo.Passengers:Contains(passenger) end) 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