Files
OpenRA/mods/ra/maps/soviet-07/soviet07.lua
Matthias Mailänder c94c1f8a6c Remove missing actors.
2023-03-28 11:45:15 +02:00

322 lines
12 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.
]]
if Difficulty == "easy" then
remainingTime = DateTime.Minutes(7)
elseif Difficulty == "normal" then
remainingTime = DateTime.Minutes(6)
elseif Difficulty == "hard" then
remainingTime = DateTime.Minutes(5)
end
Dogs = { Dog1, Dog2, Dog3, Dog4, Dog5, Dog6, Dog7, Dog8, Dog9, Dog10, Dog11, Dog12, Dog13, Dog14, Dog15, Dog16, Dog17, Dog18, Dog19 }
Engineers = { Prisoner1, Prisoner2, Prisoner3, Prisoner4, Prisoner5 }
PrisonerGuards = { PrisonerGuard1, PrisonerGuard2, PrisonerGuard3 }
EntranceGuards = { EntranceGuard1, EntranceGuard2, EntranceGuard3, EntranceGuard4, EntranceGuard5, EntranceGuard6, EntranceGuard7, EntranceGuard8 }
GoalGuards = { GoalGuard1, GoalGuard2, GoalGuard3, GoalGuard4 }
CCGuards = { CCGuard1, CCGuard2, CCGuard3, CCGuard4 }
StartingUnitsReinforcements = { "e1", "e1", "e1", "e1" }
CameraCCTrigger = { CPos.New(83, 71), CPos.New(84,71) }
CameraGoalCenterTrigger = { CPos.New(74, 66), CPos.New(75, 66), CPos.New(76, 66), CPos.New(77, 66) }
CameraGoalLeftTrigger = { CPos.New(62, 59), CPos.New(62, 60), CPos.New(62, 62), CPos.New(62, 63) }
CameraGoalRightTrigger = { CPos.New(90, 59), CPos.New(90, 60), CPos.New(90, 62), CPos.New(90, 63) }
ControlCenterTrigger = { CPos.New(87, 67), CPos.New(88, 67) }
ControlCenterEngineerTrigger = { CPos.New(87, 67), CPos.New(88, 67) }
FTurBottomTrigger = { CPos.New(67, 82), CPos.New(67, 83) }
FTurLeftTrigger = { CPos.New(57, 70), CPos.New(58, 70), CPos.New(59, 70), CPos.New(60, 70) }
FTurRightTrigger = { CPos.New(97, 68), CPos.New(97, 69), CPos.New(97, 70) }
GoalCenterTrigger = { CPos.New(73, 52), CPos.New(74, 52), CPos.New(75, 52), CPos.New(76, 52), CPos.New(77, 52), CPos.New(78, 52) }
GoalLeft1Trigger = { CPos.New(65, 58), CPos.New(66, 58), CPos.New(67, 58), CPos.New(65, 59), CPos.New(66, 59), CPos.New(67, 59) }
GoalLeft2Trigger = { CPos.New(65, 64), CPos.New(66, 64), CPos.New(67, 64), CPos.New(65, 65), CPos.New(66, 65), CPos.New(67, 65) }
GoalRight1Trigger = { CPos.New(86, 57), CPos.New(87, 57), CPos.New(88, 57), CPos.New(86, 58), CPos.New(87, 58), CPos.New(88, 58) }
GoalRight2Trigger = { CPos.New(86, 64), CPos.New(87, 64), CPos.New(88, 64), CPos.New(86, 65), CPos.New(87, 65), CPos.New(88, 65) }
RSoldierTrapTrigger = { CPos.New(72, 72), CPos.New(72,73), CPos.New(72,74) }
SoldierTrap2Trigger = { CPos.New(51, 73), CPos.New(51, 74) }
Trigger.OnEnteredFootprint(CameraCCTrigger, function(a, id)
if not cameraCCTrigger and a.Owner == player then
cameraCCTrigger = true
Actor.Create("camera", true, { Owner = player, Location = CameraCC.Location })
end
end)
Trigger.OnEnteredFootprint(CameraGoalCenterTrigger, function(a, id)
if not cameraGoalCenterTrigger and a.Owner == player then
cameraGoalCenterTrigger = true
if not controlCenterEngineerTrigger then
Actor.Create("camera", true, { Owner = player, Location = CameraGoalCenter1.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraGoalCenter2.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraGoalCenter3.Location })
end
end
end)
Trigger.OnEnteredFootprint(CameraGoalLeftTrigger, function(a, id)
if not cameraGoalLeftTrigger and a.Owner == player then
cameraGoalLeftTrigger = true
Actor.Create("camera", true, { Owner = player, Location = CameraGoalLeft1.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraGoalLeft2.Location })
end
end)
Trigger.OnEnteredFootprint(CameraGoalRightTrigger, function(a, id)
if not cameraGoalRightTrigger and a.Owner == player then
cameraGoalRightTrigger = true
Actor.Create("camera", true, { Owner = player, Location = CameraGoalRight1.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraGoalRight2.Location })
end
end)
Trigger.OnEnteredFootprint(ControlCenterTrigger, function(a, id)
if not controlCenterTrigger and a.Owner == player and a.Type == "e1" then
controlCenterTrigger = true
FTurPrisoners.Kill()
FTurLeft.Kill()
FTurRight.Kill()
FTurBottom.Kill()
player.MarkCompletedObjective(sovietObjective1)
end
end)
Trigger.OnEnteredFootprint(ControlCenterEngineerTrigger, function(a, id)
if not controlCenterEngineerTrigger and a.Owner == player and a.Type == "e6" then
controlCenterEngineerTrigger = true
local fturA = Actor.Create("ftur", true, { Owner = player, Location = FTur1Goal.Location})
local fturB = Actor.Create("ftur", true, { Owner = player, Location = FTur2Goal.Location})
Camera.Position = CameraGoalCenter1.CenterPosition
if not cameraGoalRightTrigger then
Actor.Create("camera", true, { Owner = player, Location = CameraGoalCenter1.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraGoalCenter2.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraGoalCenter3.Location })
end
Utils.Do(GoalGuards, function(actor)
if not actor.IsDead then
actor.AttackMove(FTur1Goal.Location)
end
end)
if not Tanya.IsDead then
Tanya.Demolish(fturA)
Tanya.Demolish(fturB)
end
player.MarkCompletedObjective(sovietObjective4)
end
end)
Trigger.OnEnteredFootprint(FTurBottomTrigger, function(a, id)
if not fTurBottomTrigger and a.Owner == player then
fTurBottomTrigger = true
if not rSoldierTrapTrigger then
Actor.Create("camera", true, { Owner = player, Location = CameraRSoldier.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraFTurBottom.Location })
end
end
end)
Trigger.OnEnteredFootprint(FTurLeftTrigger, function(a, id)
if not fTurLeftTrigger and a.Owner == player then
fTurLeftTrigger = true
Actor.Create("camera", true, { Owner = player, Location = CameraFTurLeft.Location })
end
end)
Trigger.OnEnteredFootprint(FTurRightTrigger, function(a, id)
if not fTurRightTrigger and a.Owner == player then
fTurRightTrigger = true
Actor.Create("camera", true, { Owner = player, Location = CameraFTurRight.Location })
end
end)
Trigger.OnEnteredFootprint(GoalCenterTrigger, function(a, id)
if not goalCenterTrigger and a.Owner == player and a.Type == "e6" then
goalCenterTrigger = true
player.MarkCompletedObjective(sovietObjective5)
end
end)
Trigger.OnEnteredFootprint(GoalLeft1Trigger, function(a, id)
if not goalLeft1Trigger and a.Owner == player and a.Type == "e6" then
goalLeft1Trigger = true
Media.PlaySpeechNotification(player, "ControlCenterDeactivated")
end
end)
Trigger.OnEnteredFootprint(GoalLeft2Trigger, function(a, id)
if not goalLeft2Trigger and a.Owner == player and a.Type == "e6" then
goalLeft2Trigger = true
Media.PlaySpeechNotification(player, "ControlCenterDeactivated")
end
end)
Trigger.OnEnteredFootprint(GoalRight1Trigger, function(a, id)
if not goalRight1Trigger and a.Owner == player and a.Type == "e6" then
goalRight1Trigger = true
Media.PlaySpeechNotification(player, "ControlCenterDeactivated")
end
end)
Trigger.OnEnteredFootprint(GoalRight2Trigger, function(a, id)
if not goalRight2Trigger and a.Owner == player and a.Type == "e6" then
goalRight2Trigger = true
Media.PlaySpeechNotification(player, "ControlCenterDeactivated")
end
end)
Trigger.OnEnteredFootprint(RSoldierTrapTrigger, function(a, id)
if not rSoldierTrapTrigger and a.Owner == player then
rSoldierTrapTrigger = true
if not fTurBottomTrigger then
Actor.Create("camera", true, { Owner = player, Location = CameraRSoldier.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraFTurBottom.Location })
end
if not RSoldier1.IsDead and not RSoldierTrap1.IsDead then
RSoldier1.Attack(RSoldierTrap1)
end
if not RSoldier2.IsDead and not RSoldierTrap2.IsDead then
RSoldier2.Attack(RSoldierTrap2)
end
end
end)
Trigger.OnEnteredFootprint(SoldierTrap2Trigger, function(a, id)
if not soldierTrap2Trigger and a.Owner == player then
soldierTrap2Trigger = true
Actor.Create("camera", true, { Owner = player, Location = CameraSoldierTrap2.Location })
if not SoldierTrap2.IsDead then
PrisonEntranceGuard.Attack(SoldierTrap2)
end
PrisonEntranceGuard.Move(SoldierTrap2Waypoint.Location)
end
end)
Trigger.OnAllKilled(Engineers, function()
enemy.MarkCompletedObjective(alliedObjective)
end)
Trigger.OnAllKilled(PrisonerGuards, function()
Utils.Do(Engineers, function(actor)
actor.Owner = player
end)
Prisoner6.Owner = player
player.MarkCompletedObjective(sovietObjective2)
end)
Trigger.OnKilled(BarlCC, function()
if not cameraCCTrigger then
Actor.Create("camera", true, { Owner = player, Location = CameraCC.Location })
cameraCCTrigger = true
end
Utils.Do(CCGuards, function(actor)
if not actor.IsDead then
actor.Hunt()
end
end)
end)
Trigger.OnKilled(PBoxBrl, function()
PBox.Kill()
Utils.Do(Dogs, function(actor)
actor.Owner = player
end)
player.MarkCompletedObjective(sovietObjective6)
end)
Trigger.OnKilled(PrisonEntranceGuard, function()
if controlCenterTrigger then
Utils.Do(PrisonerGuards, function(actor)
if not actor.IsDead then
actor.Hunt()
end
end)
end
end)
IntroSequence = function()
StartingUnits = Reinforcements.Reinforce(player, StartingUnitsReinforcements, { StartingUnitsSpawn.Location, SoldierTrap1Waypoint1.Location }, 0)
Trigger.AfterDelay(DateTime.Seconds(3), function()
Utils.Do(EntranceGuards, function(actor)
if not SoldierTrap1.IsDead then
actor.Attack(SoldierTrap1)
end
actor.AttackMove(SoldierTrap1Waypoint1.Location)
actor.AttackMove(SoldierTrap1Waypoint2.Location)
actor.AttackMove(SoldierTrap1Waypoint3.Location)
end)
Media.PlaySpeechNotification(player, "TimerStarted")
timerStarted = true
end)
-- Trigger a game over if the player lost all human units before the security system has been deactivated
Trigger.OnAllKilled(StartingUnits, function()
if not controlCenterTrigger then
enemy.MarkCompletedObjective(alliedObjective)
end
end)
end
WorldLoaded = function()
player = Player.GetPlayer("USSR")
enemy = Player.GetPlayer("Greece")
Camera.Position = SoldierTrap1Waypoint1.CenterPosition
Actor.Create("camera", true, { Owner = player, Location = CameraStart1.Location })
Actor.Create("camera", true, { Owner = player, Location = CameraStart2.Location })
IntroSequence()
InitObjectives(player)
alliedObjective = AddPrimaryObjective(enemy, "")
sovietObjective1 = AddPrimaryObjective(player, "deactivate-security-system")
sovietObjective2 = AddPrimaryObjective(player, "rescue-engineers")
sovietObjective3 = AddPrimaryObjective(player, "engineers-coolant-station")
sovietObjective4 = AddPrimaryObjective(player, "engineer-reprogram-security")
sovietObjective5 = AddPrimaryObjective(player, "engineer-reactor-core")
sovietObjective6 = AddSecondaryObjective(player, "free-dogs")
end
Tick = function()
if player.HasNoRequiredUnits() and timerStarted then
enemy.MarkCompletedObjective(alliedObjective)
end
if remainingTime == DateTime.Minutes(5) and Difficulty ~= "hard" then
Media.PlaySpeechNotification(player, "WarningFiveMinutesRemaining")
elseif remainingTime == DateTime.Minutes(4) then
Media.PlaySpeechNotification(player, "WarningFourMinutesRemaining")
elseif remainingTime == DateTime.Minutes(3) then
Media.PlaySpeechNotification(player, "WarningThreeMinutesRemaining")
elseif remainingTime == DateTime.Minutes(2) then
Media.PlaySpeechNotification(player, "WarningTwoMinutesRemaining")
elseif remainingTime == DateTime.Minutes(1) then
Media.PlaySpeechNotification(player, "WarningOneMinuteRemaining")
end
if goalLeft1Trigger and goalLeft2Trigger and goalRight1Trigger and goalRight2Trigger then
player.MarkCompletedObjective(sovietObjective3)
end
if remainingTime > 0 and timerStarted then
if (remainingTime % DateTime.Seconds(1)) == 0 then
Timer = UserInterface.Translate("time-until-meltdown", { ["time"] = Utils.FormatTime(remainingTime) })
UserInterface.SetMissionText(Timer, player.Color)
end
remainingTime = remainingTime - 1
elseif remainingTime == 0 then
UserInterface.SetMissionText("")
enemy.MarkCompletedObjective(alliedObjective)
end
end