Files
OpenRA/mods/ra/maps/situation-critical/situation-critical.lua
2023-03-28 11:45:15 +02:00

199 lines
6.5 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.
]]
MissleSubs = { MSub1, MSub2, MSub3, MSub4 }
VolkovEntryPath = { LSTEntry.Location, LZ.Location }
VolkovandFriend = { "volk", "delphi" }
InsertionTransport = "lst.reinforcement"
SamSites = { Sam1, Sam2, Sam3, Sam4, Sam5, Sam6, Sam7, Sam8, Sam9, Sam10, Sam11, Sam12 }
PrimaryTargets = { BioLab, Silo1, Silo2 }
TimerTicks = DateTime.Minutes(8)
Shocktroopers = { Shok1, Shok2, Shok3, Shok4 }
InnerPatrolPaths =
{
{ InnerPatrol2.Location, InnerPatrol3.Location, InnerPatrol4.Location, InnerPatrol1.Location },
{ InnerPatrol3.Location, InnerPatrol2.Location, InnerPatrol1.Location, InnerPatrol4.Location },
{ InnerPatrol4.Location, InnerPatrol1.Location, InnerPatrol2.Location, InnerPatrol3.Location },
{ InnerPatrol1.Location, InnerPatrol4.Location, InnerPatrol3.Location, InnerPatrol2.Location }
}
OuterPatrols =
{
{ TeamOne1, TeamOne2, TeamOne3 },
{ TeamTwo1, TeamTwo2, TeamTwo3 },
{ TeamThree1, TeamThree2, TeamThree3 },
{ TeamFour1, TeamFour2, TeamFour3 },
{ TeamFive1, TeamFive2, TeamFive3 }
}
OuterPatrolPaths =
{
{ OuterPatrol1.Location, OuterPatrol2.Location, OuterPatrol3.Location, OuterPatrol4.Location, OuterPatrol5.Location, OuterPatrol6.Location, OuterPatrol7.Location },
{ OuterPatrol5.Location, OuterPatrol4.Location, OuterPatrol3.Location, OuterPatrol2.Location, OuterPatrol1.Location, OuterPatrol7.Location, OuterPatrol6.Location },
{ OuterPatrol6.Location, OuterPatrol7.Location, OuterPatrol1.Location, OuterPatrol2.Location, OuterPatrol3.Location, OuterPatrol4.Location, OuterPatrol5.Location },
{ OuterPatrol3.Location, OuterPatrol4.Location, OuterPatrol5.Location, OuterPatrol6.Location, OuterPatrol7.Location, OuterPatrol1.Location, OuterPatrol2.Location },
{ OuterPatrol3.Location, OuterPatrol2.Location, OuterPatrol1.Location, OuterPatrol7.Location, OuterPatrol6.Location, OuterPatrol5.Location, OuterPatrol4.Location }
}
GroupPatrol = function(units, waypoints, delay)
local i = 1
local stop = false
Utils.Do(units, function(unit)
Trigger.OnIdle(unit, function()
if stop then
return
end
if unit.Location == waypoints[i] then
local bool = Utils.All(units, function(actor) return actor.IsIdle end)
if bool then
stop = true
i = i + 1
if i > #waypoints then
i = 1
end
Trigger.AfterDelay(delay, function() stop = false end)
end
else
unit.AttackMove(waypoints[i])
end
end)
end)
end
StartPatrols = function()
for i = 1, 5 do
GroupPatrol(OuterPatrols[i], OuterPatrolPaths[i], DateTime.Seconds(3))
end
for i = 1, 4 do
Trigger.AfterDelay(DateTime.Seconds(3* (i - 1)), function()
Trigger.OnIdle(Shocktroopers[i], function()
Shocktroopers[i].Patrol(InnerPatrolPaths[i])
end)
end)
end
end
LabInfiltrated = false
SetupTriggers = function()
Trigger.OnAllKilled(SamSites, function()
USSR.MarkCompletedObjective(KillSams)
SendInBombers()
end)
Trigger.OnInfiltrated(BioLab, function()
Media.DisplayMessage("plans-stolen-erase-data", "scientist")
Trigger.AfterDelay(DateTime.Seconds(5), function()
USSR.MarkCompletedObjective(InfiltrateLab)
LabInfiltrated = true
SendInBombers()
end)
end)
Trigger.OnKilled(BioLab, function()
if not LabInfiltrated then
USSR.MarkFailedObjective(InfiltrateLab)
end
end)
Trigger.OnAllKilled(PrimaryTargets, function()
USSR.MarkCompletedObjective(DestroyFacility)
USSR.MarkCompletedObjective(VolkovSurvive)
end)
Trigger.OnAllKilled(MissleSubs, function()
if not VolkovArrived then
USSR.MarkFailedObjective(KillPower)
end
end)
end
SendInBombers = function()
if LabInfiltrated and USSR.IsObjectiveCompleted(KillSams) then
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR })
proxy.TargetAirstrike(TacticalNuke1.CenterPosition, Angle.SouthWest)
proxy.TargetAirstrike(TacticalNuke2.CenterPosition, Angle.SouthWest)
proxy.TargetAirstrike(TacticalNuke3.CenterPosition, Angle.SouthWest)
proxy.Destroy()
end
end
SendInVolkov = function()
if not VolkovArrived then
USSR.MarkCompletedObjective(KillPower)
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
local teamVolkov = Reinforcements.ReinforceWithTransport(USSR, InsertionTransport, VolkovandFriend, VolkovEntryPath, { VolkovEntryPath[1] })[2]
VolkovArrived = true
Trigger.OnKilled(teamVolkov[1], function()
USSR.MarkFailedObjective(VolkovSurvive)
end)
Trigger.OnAddedToWorld(teamVolkov[1], function(a)
Media.DisplayMessage(UserInterface.Translate("software-update-failed-manual-targets"), UserInterface.Translate("volkov"))
end)
Trigger.OnAddedToWorld(teamVolkov[2], function(b)
Trigger.OnKilled(b, function()
if not LabInfiltrated then
USSR.MarkFailedObjective(InfiltrateLab)
end
end)
end)
end
end
Ticked = TimerTicks
Tick = function()
if Turkey.PowerState ~= "Normal" then
SendInVolkov()
end
if Ticked > 0 then
if (Ticked % DateTime.Seconds(1)) == 0 then
Timer = UserInterface.Translate("missiles-launch-in", { ["time"] = Utils.FormatTime(Ticked) })
UserInterface.SetMissionText(Timer, TimerColor)
end
Ticked = Ticked - 1
elseif Ticked == 0 then
UserInterface.SetMissionText(UserInterface.Translate("too-late"), USSR.Color)
Turkey.MarkCompletedObjective(LaunchMissles)
end
end
WorldLoaded = function()
USSR = Player.GetPlayer("USSR")
Turkey = Player.GetPlayer("Turkey")
InitObjectives(USSR)
LaunchMissles = AddPrimaryObjective(Turkey, "")
KillPower = AddPrimaryObjective(USSR, "kill-power")
InfiltrateLab = AddPrimaryObjective(USSR, "infiltrate-bio-weapons-lab-scientist")
DestroyFacility = AddPrimaryObjective(USSR, "destroy-bio-weapons-lab-missile-silos")
KillSams = AddSecondaryObjective(USSR, "destroy-all-sam-sites-strategic-bombers")
VolkovSurvive = AddPrimaryObjective(USSR, "volkov-survive")
Trigger.AfterDelay(DateTime.Minutes(3), function()
Media.PlaySpeechNotification(USSR, "WarningFiveMinutesRemaining")
end)
Trigger.AfterDelay(DateTime.Minutes(5), function()
Media.PlaySpeechNotification(USSR, "WarningThreeMinutesRemaining")
end)
Trigger.AfterDelay(DateTime.Minutes(7), function()
Media.PlaySpeechNotification(USSR, "WarningOneMinuteRemaining")
end)
StartPatrols()
SetupTriggers()
Camera.Position = DefaultCameraPosition.CenterPosition
TimerColor = Turkey.Color
end