diff --git a/OpenRA.Mods.RA/Missions/Allies04Script.cs b/OpenRA.Mods.RA/Missions/Allies04Script.cs index 921f7b35a7..df96b208de 100644 --- a/OpenRA.Mods.RA/Missions/Allies04Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies04Script.cs @@ -19,6 +19,7 @@ using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Render; using OpenRA.Network; using OpenRA.Traits; +using OpenRA.Widgets; namespace OpenRA.Mods.RA.Missions { @@ -33,12 +34,12 @@ namespace OpenRA.Mods.RA.Missions Dictionary objectives = new Dictionary { { InfiltrateID, new Objective(ObjectiveType.Primary, "", ObjectiveStatus.InProgress) }, - { DestroyID, new Objective(ObjectiveType.Primary, "Secure the Soviet research laboratory and destroy the rest of the Soviet base.", ObjectiveStatus.Inactive) } + { DestroyID, new Objective(ObjectiveType.Primary, "Secure the Soviet research laboratory and destroy the rest of the Soviet base. Ensure that the Soviet research laboratory is not destroyed.", ObjectiveStatus.Inactive) } }; const int InfiltrateID = 0; const int DestroyID = 1; - const string Infiltrate = "The Soviets are currently developing a new defensive system named the \"Iron Curtain\" at their main research laboratories. Get our {0} into the Soviet research laboratories undetected."; + const string Infiltrate = "The Soviets are currently developing a new defensive system named the \"Iron Curtain\" at their main research laboratory. Get our {0} into the laboratory undetected."; Actor lstEntryPoint; Actor lstUnloadPoint; @@ -56,6 +57,9 @@ namespace OpenRA.Mods.RA.Missions bool allies2SpyInfiltratedLab; int frameInfiltrated = -1; + CountdownTimer destroyBaseTimer; + CountdownTimerWidget destroyBaseTimerWidget; + Player allies; Player allies1; Player allies2; @@ -128,10 +132,24 @@ namespace OpenRA.Mods.RA.Missions { SendHind(hind1EntryPoint, hind1Points, hind1ExitPoint); } - if (frameInfiltrated != -1 && world.FrameNumber == frameInfiltrated + 100) + if (frameInfiltrated != -1) { - Sound.Play("aarrivs1.aud"); - world.AddFrameEndTask(w => SendReinforcements()); + if (world.FrameNumber == frameInfiltrated + 100) + { + Sound.Play("aarrivs1.aud"); + world.AddFrameEndTask(w => SendReinforcements()); + } + else if (world.FrameNumber >= frameInfiltrated + 200) + { + if (world.FrameNumber == frameInfiltrated + 200) + { + Sound.Play("timergo1.aud"); + destroyBaseTimer = new CountdownTimer(1500 * 25, OnDestroyBaseTimerExpired, true); + destroyBaseTimerWidget = new CountdownTimerWidget(destroyBaseTimer, "Secure lab: {0}"); + Ui.Root.AddChild(destroyBaseTimerWidget); + } + destroyBaseTimer.Tick(); + } } PatrolTick(ref patrol1, ref currentPatrolPoint1, soviets, DogPatrol, patrolPoints1); PatrolTick(ref patrol2, ref currentPatrolPoint2, soviets, InfantryPatrol, patrolPoints2); @@ -148,7 +166,7 @@ namespace OpenRA.Mods.RA.Missions } else if (lab.Destroyed) { - MissionFailed("The research laboratory was destroyed."); + MissionFailed("The Soviet research laboratory was destroyed."); } else if (!world.Actors.Any(a => (a.Owner == allies1 || a.Owner == allies2) && !a.IsDead() && (a.HasTrait() && !a.HasTrait()) || a.HasTrait())) @@ -167,6 +185,19 @@ namespace OpenRA.Mods.RA.Missions } } + void OnDestroyBaseTimerExpired(CountdownTimer t) + { + if (!world.Actors.Any(a => a.Owner == soviets && a.IsInWorld && !a.IsDead() + && a.HasTrait() && !a.HasTrait() && !a.HasTrait() && a != lab) + && objectives[InfiltrateID].Status == ObjectiveStatus.Completed) + { + return; + } + objectives[DestroyID].Status = ObjectiveStatus.Failed; + OnObjectivesUpdated(true); + MissionFailed("The Soviet research laboratory was not secured in time."); + } + void ManageSovietOre() { var res = soviets.PlayerActor.Trait();