Files
OpenRA/mods/ra/maps/allies-04/allies04.lua
2023-03-28 11:45:15 +02:00

163 lines
4.2 KiB
Lua

--[[
Copyright (c) The OpenRA Developers and Contributors
This file is part of OpenRA, which is free software. It is made
available to you under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version. For more
information, see COPYING.
]]
ConvoyUnits =
{
{ "ftrk", "ftrk", "truk", "truk", "apc", "ftrk" },
{ "ftrk", "3tnk", "truk", "truk", "apc" },
{ "3tnk", "3tnk", "truk", "truk", "ftrk" }
}
ConvoyRallyPoints =
{
{ SovietEntry1.Location, SovietRally1.Location, SovietRally3.Location, SovietRally5.Location, SovietRally4.Location, SovietRally6.Location },
{ SovietEntry2.Location, SovietRally10.Location, SovietRally11.Location }
}
ConvoyDelays =
{
easy = { DateTime.Minutes(4), DateTime.Minutes(5) + DateTime.Seconds(20) },
normal = { DateTime.Minutes(2) + DateTime.Seconds(30), DateTime.Minutes(4) },
hard = { DateTime.Minutes(1) + DateTime.Seconds(30), DateTime.Minutes(2) + DateTime.Seconds(30) },
tough = { DateTime.Minutes(1), DateTime.Minutes(1) + DateTime.Seconds(15) }
}
Convoys =
{
easy = 2,
normal = 3,
hard = 5,
tough = 10
}
ParadropDelays =
{
easy = { DateTime.Seconds(40), DateTime.Seconds(90) },
normal = { DateTime.Seconds(30), DateTime.Seconds(70) },
hard = { DateTime.Seconds(20), DateTime.Seconds(50) },
tough = { DateTime.Seconds(10), DateTime.Seconds(25) }
}
ParadropWaves =
{
easy = 4,
normal = 6,
hard = 10,
tough = 25
}
ParadropLZs = { ParadropPoint1.CenterPosition, ParadropPoint2.CenterPosition, ParadropPoint3.CenterPosition }
Paradropped = 0
Paradrop = function()
Trigger.AfterDelay(Utils.RandomInteger(ParadropDelay[1], ParadropDelay[2]), function()
local aircraft = PowerProxy.TargetParatroopers(Utils.Random(ParadropLZs))
Utils.Do(aircraft, function(a)
Trigger.OnPassengerExited(a, function(_, p)
IdleHunt(p)
end)
end)
Paradropped = Paradropped + 1
if Paradropped <= ParadropWaves[Difficulty] then
Paradrop()
end
end)
end
ConvoysSent = 0
SendConvoys = function()
Trigger.AfterDelay(Utils.RandomInteger(ConvoyDelay[1], ConvoyDelay[2]), function()
local path = Utils.Random(ConvoyRallyPoints)
local units = Reinforcements.Reinforce(USSR, Utils.Random(ConvoyUnits), { path[1] })
local lastWaypoint = path[#path]
Utils.Do(units, function(unit)
Trigger.OnAddedToWorld(unit, function()
if unit.Type == "truk" then
Utils.Do(path, function(waypoint)
unit.Move(waypoint)
end)
Trigger.OnIdle(unit, function()
unit.Move(lastWaypoint)
end)
else
unit.Patrol(path)
Trigger.OnIdle(unit, function()
unit.AttackMove(lastWaypoint)
end)
end
end)
end)
local id = Trigger.OnEnteredFootprint({ lastWaypoint }, function(a, id)
if a.Owner == USSR and Utils.Any(units, function(unit) return unit == a end) then
-- We are at our destination and thus don't care about other queued actions anymore
a.Stop()
a.Destroy()
if a.Type == "truk" then
Greece.MarkFailedObjective(DestroyConvoys)
end
end
end)
Trigger.OnAllRemovedFromWorld(units, function()
Trigger.RemoveFootprintTrigger(id)
ConvoysSent = ConvoysSent + 1
if ConvoysSent <= Convoys[Difficulty] then
SendConvoys()
else
Greece.MarkCompletedObjective(DestroyConvoys)
end
end)
Media.PlaySpeechNotification(Greece, "ConvoyApproaching")
end)
end
Tick = function()
if Greece.HasNoRequiredUnits() then
Greece.MarkFailedObjective(KillUSSR)
end
if USSR.HasNoRequiredUnits() then
Greece.MarkCompletedObjective(KillUSSR)
-- We don't care about future convoys anymore
Greece.MarkCompletedObjective(DestroyConvoys)
end
end
AddObjectives = function()
KillUSSR = AddPrimaryObjective(Greece, "destroy-soviet-units-buildings")
DestroyConvoys = AddSecondaryObjective(Greece, "destroy-convoys")
end
WorldLoaded = function()
Greece = Player.GetPlayer("Greece")
USSR = Player.GetPlayer("USSR")
Camera.Position = AlliedConyard.CenterPosition
InitObjectives(Greece)
AddObjectives()
ConvoyDelay = ConvoyDelays[Difficulty]
ParadropDelay = ParadropDelays[Difficulty]
PowerProxy = Actor.Create("powerproxy.paratroopers", false, { Owner = USSR })
Paradrop()
SendConvoys()
Trigger.AfterDelay(0, ActivateAI)
end