Files
OpenRA/mods/ra/maps/allies-02/allies02.lua
2024-02-11 18:29:30 +02:00

286 lines
7.7 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.
]]
ConstructionVehicleReinforcements = { "mcv" }
ConstructionVehiclePath = { ReinforcementsEntryPoint.Location, DeployPoint.Location }
JeepReinforcements = { "e1", "e1", "e1", "jeep" }
JeepPath = { ReinforcementsEntryPoint.Location, ReinforcementsRallyPoint.Location }
TruckReinforcements = { "truk", "truk", "truk" }
TruckPath = { TruckEntryPoint.Location, TruckRallyPoint.Location }
PathGuards = { PathGuard1, PathGuard2, PathGuard3, PathGuard4, PathGuard5, PathGuard6, PathGuard7, PathGuard8, PathGuard9, PathGuard10, PathGuard11, PathGuard12, PathGuard13, PathGuard14, PathGuard15 }
SovietBase = { SovietConyard, SovietRefinery, SovietPower1, SovietPower2, SovietSilo, SovietKennel, SovietBarracks, SovietWarfactory }
IdlingUnits = { }
if Difficulty == "easy" then
DateTime.TimeLimit = DateTime.Minutes(10) + DateTime.Seconds(3)
elseif Difficulty == "normal" then
DateTime.TimeLimit = DateTime.Minutes(5) + DateTime.Seconds(3)
InfantryTypes = { "e1", "e1", "e1", "e2", "e2", "e1" }
InfantryDelay = DateTime.Seconds(18)
AttackGroupSize = 5
elseif Difficulty == "hard" then
DateTime.TimeLimit = DateTime.Minutes(3) + DateTime.Seconds(3)
InfantryTypes = { "e1", "e1", "e1", "e2", "e2", "e1" }
InfantryDelay = DateTime.Seconds(10)
VehicleTypes = { "ftrk" }
VehicleDelay = DateTime.Seconds(30)
AttackGroupSize = 7
else
DateTime.TimeLimit = DateTime.Minutes(1) + DateTime.Seconds(3)
ConstructionVehicleReinforcements = { "jeep" }
InfantryTypes = { "e1", "e1", "e1", "e2", "e2", "dog", "dog" }
InfantryDelay = DateTime.Seconds(10)
VehicleTypes = { "ftrk" }
VehicleDelay = DateTime.Minutes(1) + DateTime.Seconds(10)
AttackGroupSize = 5
end
SendJeepReinforcements = function()
Media.PlaySpeechNotification(Greece, "ReinforcementsArrived")
Reinforcements.Reinforce(Greece, JeepReinforcements, JeepPath, DateTime.Seconds(1))
end
RunInitialActivities = function()
Harvester.FindResources()
Trigger.OnKilled(Harvester, function() HarvesterKilled = true end)
ScheduleEarlyAttackers()
Trigger.OnAllKilled(PathGuards, function()
Greece.MarkCompletedObjective(SecureObjective)
SendTrucks()
end)
Trigger.OnAllKilled(SovietBase, function()
local livePathGuards = Utils.Where(PathGuards, function(pg) return not pg.IsDead end)
Utils.Do(USSR.GetGroundAttackers(), function(unit)
if Utils.Any(livePathGuards, function(pg) return pg == unit end) then
return
end
Trigger.OnIdle(unit, unit.Hunt)
end)
end)
if InfantryTypes then
Trigger.AfterDelay(InfantryDelay, ProduceInfantry)
end
if VehicleTypes then
Trigger.AfterDelay(VehicleDelay, ProduceVehicles)
end
end
ProduceInfantry = function()
if SovietBarracks.IsDead then
return
end
local toBuild = { Utils.Random(InfantryTypes) }
if SovietKennel.IsDead and toBuild == "dog" then
toBuild = { "e1" }
end
USSR.Build(toBuild, function(unit)
IdlingUnits[#IdlingUnits + 1] = unit[1]
Trigger.AfterDelay(InfantryDelay, ProduceInfantry)
if #IdlingUnits >= (AttackGroupSize * 1.5) then
SendAttack()
end
end)
end
ProduceVehicles = function()
if SovietWarfactory.IsDead then
return
end
if HarvesterKilled then
USSR.Build({ "harv" }, function(harv)
harv[1].FindResources()
Trigger.OnKilled(harv[1], function() HarvesterKilled = true end)
HarvesterKilled = false
ProduceVehicles()
end)
return
end
local toBuild = { Utils.Random(VehicleTypes) }
USSR.Build(toBuild, function(unit)
IdlingUnits[#IdlingUnits + 1] = unit[1]
Trigger.AfterDelay(VehicleDelay, ProduceVehicles)
if #IdlingUnits >= (AttackGroupSize * 1.5) then
SendAttack()
end
end)
end
SendAttack = function()
local units = { }
for i = 0, AttackGroupSize, 1 do
local number = Utils.RandomInteger(1, #IdlingUnits)
if IdlingUnits[number] and not IdlingUnits[number].IsDead then
units[i] = IdlingUnits[number]
table.remove(IdlingUnits, number)
end
end
Utils.Do(units, function(unit)
if Difficulty ~= "tough" then
unit.AttackMove(DeployPoint.Location)
end
Trigger.OnIdle(unit, unit.Hunt)
end)
end
Tick = function()
USSR.Resources = USSR.Resources - (0.01 * USSR.ResourceCapacity / 25)
if USSR.HasNoRequiredUnits() then
Greece.MarkCompletedObjective(ConquestObjective)
end
if Greece.HasNoRequiredUnits() then
USSR.MarkCompletedObjective(USSRobjective)
end
end
FinishTimer = function()
DateTime.TimeLimit = 0
for i = 0, 5, 1 do
local c = TimerColor
if i % 2 == 0 then
c = HSLColor.White
end
Trigger.AfterDelay(DateTime.Seconds(i), function()
UserInterface.SetMissionText(UserInterface.Translate("convoy-arrived"), c)
end)
end
Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end)
end
ConvoyOnSite = false
SendTrucks = function()
if not ConvoyOnSite then
ConvoyOnSite = true
DateTime.TimeLimit = 0
UserInterface.SetMissionText("")
ConvoyObjective = AddPrimaryObjective(Greece, "escort-convoy")
Media.PlaySpeechNotification(Greece, "ConvoyApproaching")
Trigger.AfterDelay(DateTime.Seconds(3), function()
ConvoyUnharmed = true
local trucks = Reinforcements.Reinforce(England, TruckReinforcements, TruckPath, DateTime.Seconds(1),
function(truck)
Trigger.OnIdle(truck, function() truck.Move(TruckExitPoint.Location) end)
end)
local count = 0
Trigger.OnEnteredFootprint( { TruckExitPoint.Location }, function(a, id)
if a.Owner == England then
count = count + 1
a.Destroy()
if count == 3 then
Greece.MarkCompletedObjective(ConvoyObjective)
Trigger.RemoveFootprintTrigger(id)
end
end
end)
Trigger.OnAnyKilled(trucks, ConvoyCasualties)
end)
end
end
ConvoyCasualties = function()
Media.PlaySpeechNotification(Greece, "ConvoyUnitLost")
if ConvoyUnharmed then
ConvoyUnharmed = false
Trigger.AfterDelay(DateTime.Seconds(1), function() Greece.MarkFailedObjective(ConvoyObjective) end)
end
end
ScheduleEarlyAttackers = function()
if Difficulty == "tough" then
Trigger.AfterDelay(DateTime.Seconds(12), SendEarlyAttackers)
return
end
Trigger.AfterDelay(DateTime.Seconds(6), function()
if not Greece.HasPrerequisites({ "anypower" }) then
ScheduleEarlyAttackers()
return
end
SendEarlyAttackers()
end)
end
SendEarlyAttackers = function()
local team = { EarlyAttacker1, EarlyAttacker2, EarlyAttacker3, EarlyAttacker4 }
local dogTargets = Greece.GetActorsByType("e1")
Utils.Do(team, function(member)
if member.IsDead then
return
end
-- Get attack dogs sprinting.
if member.Type == "dog" and #dogTargets > 0 then
member.Attack(Utils.Random(dogTargets))
end
Trigger.OnIdle(member, member.Hunt)
end)
end
WorldLoaded = function()
Greece = Player.GetPlayer("Greece")
England = Player.GetPlayer("England")
USSR = Player.GetPlayer("USSR")
InitObjectives(Greece)
USSRobjective = AddPrimaryObjective(USSR, "")
SecureObjective = AddPrimaryObjective(Greece, "secure-convoy")
ConquestObjective = AddPrimaryObjective(Greece, "eliminate-soviets")
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(Allies, "MissionTimerInitialised") end)
RunInitialActivities()
Reinforcements.Reinforce(Greece, ConstructionVehicleReinforcements, ConstructionVehiclePath)
Trigger.AfterDelay(DateTime.Seconds(5), SendJeepReinforcements)
Trigger.AfterDelay(DateTime.Seconds(10), SendJeepReinforcements)
Trigger.OnTimerExpired(function()
FinishTimer()
SendTrucks()
end)
Camera.Position = ReinforcementsEntryPoint.CenterPosition
TimerColor = Greece.Color
end