322 lines
12 KiB
Lua
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 CameraCCTriggered and a.Owner == USSR then
|
|
CameraCCTriggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraCC.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(CameraGoalCenterTrigger, function(a, id)
|
|
if not CameraGoalCenterTriggered and a.Owner == USSR then
|
|
CameraGoalCenterTriggered = true
|
|
if not ControlCenterEngineerTriggered then
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalCenter1.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalCenter2.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalCenter3.Location })
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(CameraGoalLeftTrigger, function(a, id)
|
|
if not CameraGoalLeftTriggered and a.Owner == USSR then
|
|
CameraGoalLeftTriggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalLeft1.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalLeft2.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(CameraGoalRightTrigger, function(a, id)
|
|
if not CameraGoalRightTriggered and a.Owner == USSR then
|
|
CameraGoalRightTriggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalRight1.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalRight2.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(ControlCenterTrigger, function(a, id)
|
|
if not ControlCenterTriggered and a.Owner == USSR and a.Type == "e1" then
|
|
ControlCenterTriggered = true
|
|
FTurPrisoners.Kill()
|
|
FTurLeft.Kill()
|
|
FTurRight.Kill()
|
|
FTurBottom.Kill()
|
|
USSR.MarkCompletedObjective(SovietObjective1)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(ControlCenterEngineerTrigger, function(a, id)
|
|
if not ControlCenterEngineerTriggered and a.Owner == USSR and a.Type == "e6" then
|
|
ControlCenterEngineerTriggered = true
|
|
local fturA = Actor.Create("ftur", true, { Owner = USSR, Location = FTur1Goal.Location})
|
|
local fturB = Actor.Create("ftur", true, { Owner = USSR, Location = FTur2Goal.Location})
|
|
Camera.Position = CameraGoalCenter1.CenterPosition
|
|
|
|
if not CameraGoalRightTriggered then
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalCenter1.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraGoalCenter2.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, 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
|
|
|
|
USSR.MarkCompletedObjective(SovietObjective4)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(FTurBottomTrigger, function(a, id)
|
|
if not FTurBottomTriggered and a.Owner == USSR then
|
|
FTurBottomTriggered = true
|
|
if not RSoldierTrapTriggered then
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraRSoldier.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraFTurBottom.Location })
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(FTurLeftTrigger, function(a, id)
|
|
if not FTurLeftTriggered and a.Owner == USSR then
|
|
FTurLeftTriggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraFTurLeft.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(FTurRightTrigger, function(a, id)
|
|
if not FTurRightTriggered and a.Owner == USSR then
|
|
FTurRightTriggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraFTurRight.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(GoalCenterTrigger, function(a, id)
|
|
if not GoalCenterTriggered and a.Owner == USSR and a.Type == "e6" then
|
|
GoalCenterTriggered = true
|
|
USSR.MarkCompletedObjective(SovietObjective5)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(GoalLeft1Trigger, function(a, id)
|
|
if not GoalLeft1Triggered and a.Owner == USSR and a.Type == "e6" then
|
|
GoalLeft1Triggered = true
|
|
Media.PlaySpeechNotification(USSR, "ControlCenterDeactivated")
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(GoalLeft2Trigger, function(a, id)
|
|
if not GoalLeft2Triggered and a.Owner == USSR and a.Type == "e6" then
|
|
GoalLeft2Triggered = true
|
|
Media.PlaySpeechNotification(USSR, "ControlCenterDeactivated")
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(GoalRight1Trigger, function(a, id)
|
|
if not GoalRight1Triggered and a.Owner == USSR and a.Type == "e6" then
|
|
GoalRight1Triggered = true
|
|
Media.PlaySpeechNotification(USSR, "ControlCenterDeactivated")
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(GoalRight2Trigger, function(a, id)
|
|
if not GoalRight2Triggered and a.Owner == USSR and a.Type == "e6" then
|
|
GoalRight2Triggered = true
|
|
Media.PlaySpeechNotification(USSR, "ControlCenterDeactivated")
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(RSoldierTrapTrigger, function(a, id)
|
|
if not RSoldierTrapTriggered and a.Owner == USSR then
|
|
RSoldierTrapTriggered = true
|
|
if not FTurBottomTriggered then
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraRSoldier.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, 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 SoldierTrap2Triggered and a.Owner == USSR then
|
|
SoldierTrap2Triggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraSoldierTrap2.Location })
|
|
if not SoldierTrap2.IsDead then
|
|
PrisonEntranceGuard.Attack(SoldierTrap2)
|
|
end
|
|
PrisonEntranceGuard.Move(SoldierTrap2Waypoint.Location)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnAllKilled(Engineers, function()
|
|
Greece.MarkCompletedObjective(AlliedObjective)
|
|
end)
|
|
|
|
Trigger.OnAllKilled(PrisonerGuards, function()
|
|
Utils.Do(Engineers, function(actor)
|
|
actor.Owner = USSR
|
|
end)
|
|
|
|
Prisoner6.Owner = USSR
|
|
USSR.MarkCompletedObjective(SovietObjective2)
|
|
end)
|
|
|
|
Trigger.OnKilled(BarlCC, function()
|
|
if not CameraCCTriggered then
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraCC.Location })
|
|
CameraCCTriggered = 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 = USSR
|
|
end)
|
|
USSR.MarkCompletedObjective(SovietObjective6)
|
|
end)
|
|
|
|
Trigger.OnKilled(PrisonEntranceGuard, function()
|
|
if ControlCenterTriggered then
|
|
Utils.Do(PrisonerGuards, function(actor)
|
|
if not actor.IsDead then
|
|
actor.Hunt()
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
IntroSequence = function()
|
|
StartingUnits = Reinforcements.Reinforce(USSR, 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(USSR, "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 ControlCenterTriggered then
|
|
Greece.MarkCompletedObjective(AlliedObjective)
|
|
end
|
|
end)
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
USSR = Player.GetPlayer("USSR")
|
|
Greece = Player.GetPlayer("Greece")
|
|
|
|
Camera.Position = SoldierTrap1Waypoint1.CenterPosition
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraStart1.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraStart2.Location })
|
|
|
|
IntroSequence()
|
|
|
|
InitObjectives(USSR)
|
|
AlliedObjective = AddPrimaryObjective(Greece, "")
|
|
SovietObjective1 = AddPrimaryObjective(USSR, "deactivate-security-system")
|
|
SovietObjective2 = AddPrimaryObjective(USSR, "rescue-engineers")
|
|
SovietObjective3 = AddPrimaryObjective(USSR, "engineers-coolant-station")
|
|
SovietObjective4 = AddPrimaryObjective(USSR, "engineer-reprogram-security")
|
|
SovietObjective5 = AddPrimaryObjective(USSR, "engineer-reactor-core")
|
|
SovietObjective6 = AddSecondaryObjective(USSR, "free-dogs")
|
|
end
|
|
|
|
Tick = function()
|
|
if USSR.HasNoRequiredUnits() and TimerStarted then
|
|
Greece.MarkCompletedObjective(AlliedObjective)
|
|
end
|
|
|
|
if RemainingTime == DateTime.Minutes(5) and Difficulty ~= "hard" then
|
|
Media.PlaySpeechNotification(USSR, "WarningFiveMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(4) then
|
|
Media.PlaySpeechNotification(USSR, "WarningFourMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(3) then
|
|
Media.PlaySpeechNotification(USSR, "WarningThreeMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(2) then
|
|
Media.PlaySpeechNotification(USSR, "WarningTwoMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(1) then
|
|
Media.PlaySpeechNotification(USSR, "WarningOneMinuteRemaining")
|
|
end
|
|
|
|
if GoalLeft1Triggered and GoalLeft2Triggered and GoalRight1Triggered and GoalRight2Triggered then
|
|
USSR.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, USSR.Color)
|
|
end
|
|
RemainingTime = RemainingTime - 1
|
|
elseif RemainingTime == 0 then
|
|
UserInterface.SetMissionText("")
|
|
Greece.MarkCompletedObjective(AlliedObjective)
|
|
end
|
|
end
|