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
Actor.ScriptedMove = function(actor, location)
actor:QueueActivity(OpenRA.New("Move", { location }))
if Actor.HasTrait(actor, "Helicopter") then
actor:QueueActivity(OpenRA.New("HeliFly", { location.CenterPosition }))
else
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
Actor.Teleport = function(actor, location)
@@ -173,4 +185,12 @@ end
Actor.TraitInfo = function(actorType, className)
return Internal.TraitInfo(actorType, className)
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.PerformHelicopterInsertion = function(owner, helicopterName, passengerNames, enterPosition, unloadPosition, exitPosition)
local facing = { Map.GetFacing(WPos.op_Subtraction(unloadPosition, enterPosition), 0), "Int32" }
local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" }
local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude })
local cargo = Actor.Trait(heli, "Cargo")
Reinforcements.Insert = 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")
local passengers = { }
for i, passengerName in ipairs(passengerNames) do
local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner })
cargo:Load(heli, passenger)
passengers[i] = passenger
cargo:Load(transport, passenger)
end
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
Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end)
Actor.AfterMove(transport)
Actor.UnloadCargo(transport, true)
Actor.Wait(transport, 25)
Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
Actor.RemoveSelf(transport)
return transport, passengers
end
Reinforcements.PerformHelicopterExtraction = function(owner, helicopterName, passengers, enterPosition, loadPosition, exitPosition)
local facing = { Map.GetFacing(WPos.op_Subtraction(loadPosition, enterPosition), 0), "Int32" }
local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" }
local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude })
local cargo = Actor.Trait(heli, "Cargo")
Actor.HeliFly(heli, loadPosition)
Actor.Turn(heli, 0)
Actor.HeliLand(heli, true)
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)
Actor.Wait(heli, 125)
Actor.HeliFly(heli, exitPosition)
Actor.RemoveSelf(heli)
return heli
end
Reinforcements.PerformInsertion = function(owner, vehicleName, passengerNames, enterPath, exitPath)
local facing = { 0, "Int32" }
if #enterPath > 1 then
facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" }
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
Actor.Wait(transport, 125)
Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end)
Actor.RemoveSelf(transport)
return transport
end
Reinforcements.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc)

View File

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