diff --git a/OpenRA.Mods.RA/Missions/Allies01Script.cs b/OpenRA.Mods.RA/Missions/Allies01Script.cs index ed813ee017..f28919d5f9 100644 --- a/OpenRA.Mods.RA/Missions/Allies01Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies01Script.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Missions class Allies01Script : IHasObjectives, IWorldLoaded, ITick { - public event Action OnObjectivesUpdated; + public event ObjectivesUpdatedEventHandler OnObjectivesUpdated; public IEnumerable Objectives { get { return objectives.Values; } } @@ -123,13 +123,13 @@ namespace OpenRA.Mods.RA.Missions SendShips(); objectives[FindEinsteinID].Status = ObjectiveStatus.Completed; objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); currentAttackWaveFrameNumber = world.FrameNumber; } if (lab.Destroyed) { objectives[FindEinsteinID].Status = ObjectiveStatus.Failed; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); MissionFailed("Einstein was killed."); } } @@ -156,13 +156,13 @@ namespace OpenRA.Mods.RA.Missions if (einsteinChinook.Destroyed) { objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); MissionFailed("The extraction helicopter was destroyed."); } else if (!world.Map.IsInMap(einsteinChinook.Location) && einsteinChinook.Trait().Passengers.Contains(einstein)) { objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); MissionAccomplished("Einstein was rescued."); } } diff --git a/OpenRA.Mods.RA/Missions/Allies02Script.cs b/OpenRA.Mods.RA/Missions/Allies02Script.cs index a9115612c4..6560675a8e 100644 --- a/OpenRA.Mods.RA/Missions/Allies02Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies02Script.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Missions class Allies02Script : IHasObjectives, IWorldLoaded, ITick { - public event Action OnObjectivesUpdated; + public event ObjectivesUpdatedEventHandler OnObjectivesUpdated; public IEnumerable Objectives { get { return objectives.Values; } } @@ -37,18 +37,23 @@ namespace OpenRA.Mods.RA.Missions { FindEinsteinID, new Objective(ObjectiveType.Primary, FindEinstein, ObjectiveStatus.InProgress) }, { DestroySamSitesID, new Objective(ObjectiveType.Primary, DestroySamSites, ObjectiveStatus.InProgress) }, { ExtractEinsteinID, new Objective(ObjectiveType.Primary, ExtractEinstein, ObjectiveStatus.Inactive) }, - { MaintainPresenceID, new Objective(ObjectiveType.Primary, MaintainPresence, ObjectiveStatus.InProgress) } + { MaintainPresenceID, new Objective(ObjectiveType.Primary, MaintainPresence, ObjectiveStatus.InProgress) }, + { FewDeathsID, new Objective(ObjectiveType.Secondary, "", ObjectiveStatus.InProgress) } }; const int FindEinsteinID = 0; const int DestroySamSitesID = 1; const int ExtractEinsteinID = 2; const int MaintainPresenceID = 3; + const int FewDeathsID = 4; const string FindEinstein = "Find Einstein's crashed helicopter. Tanya must survive."; const string DestroySamSites = "Destroy the SAM sites. Tanya must survive."; const string ExtractEinstein = "Wait for the helicopter and extract Einstein. Tanya and Einstein must survive."; const string MaintainPresence = "Maintain an Allied presence in the area. Reinforcements will arrive soon."; + const string FewDeathsTemplate = "Lose fewer than {0}/100 units."; + + const int DeathsThreshold = 100; Actor sam1; Actor sam2; @@ -232,12 +237,19 @@ namespace OpenRA.Mods.RA.Missions BuildSovietUnits(); ManageSovietUnits(); } + objectives[FewDeathsID].Text = FewDeathsTemplate.F(allies1.Deaths + allies2.Deaths); + OnObjectivesUpdated(false); + if (allies1.Deaths + allies2.Deaths > DeathsThreshold && objectives[FewDeathsID].Status == ObjectiveStatus.InProgress) + { + objectives[FewDeathsID].Status = ObjectiveStatus.Failed; + OnObjectivesUpdated(true); + } if (objectives[FindEinsteinID].Status == ObjectiveStatus.InProgress) { if (AlliesNearTown()) { objectives[FindEinsteinID].Status = ObjectiveStatus.Completed; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); TransferTownUnitsToAllies(); SovietsAttackTown(); } @@ -248,7 +260,7 @@ namespace OpenRA.Mods.RA.Missions { objectives[DestroySamSitesID].Status = ObjectiveStatus.Completed; objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); SpawnSignalFlare(); Sound.Play("flaren1.aud"); ExtractEinsteinAtLZ(); @@ -260,14 +272,18 @@ namespace OpenRA.Mods.RA.Missions { objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed; objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); MissionFailed("The extraction helicopter was destroyed."); } else if (!world.Map.IsInMap(einsteinChinook.Location) && einsteinChinook.Trait().Passengers.Contains(einstein)) { objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed; objectives[MaintainPresenceID].Status = ObjectiveStatus.Completed; - OnObjectivesUpdated(); + if (objectives[FewDeathsID].Status == ObjectiveStatus.InProgress) + { + objectives[FewDeathsID].Status = ObjectiveStatus.Completed; + } + OnObjectivesUpdated(true); MissionAccomplished("Einstein was rescued."); } } @@ -284,7 +300,7 @@ namespace OpenRA.Mods.RA.Missions if (!world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20).Any(a => a.HasTrait() && !a.HasTrait() && a.Owner == allies2)) { objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed; - OnObjectivesUpdated(); + OnObjectivesUpdated(true); MissionFailed("The Allied reinforcements have been defeated."); } }); @@ -582,7 +598,6 @@ namespace OpenRA.Mods.RA.Missions { Game.MoveViewport(allies2BasePoint.Location.ToFloat2()); } - OnObjectivesUpdated(); PlayMusic(); Game.ConnectionStateChanged += StopMusic; } diff --git a/OpenRA.Mods.RA/Missions/Objective.cs b/OpenRA.Mods.RA/Missions/Objective.cs index 4eb55ed5ba..5a1fe70128 100644 --- a/OpenRA.Mods.RA/Missions/Objective.cs +++ b/OpenRA.Mods.RA/Missions/Objective.cs @@ -31,9 +31,11 @@ namespace OpenRA.Mods.RA.Missions public enum ObjectiveType { Primary, Secondary } public enum ObjectiveStatus { Inactive, InProgress, Completed, Failed } + public delegate void ObjectivesUpdatedEventHandler(bool notify); + public interface IHasObjectives { - event Action OnObjectivesUpdated; + event ObjectivesUpdatedEventHandler OnObjectivesUpdated; IEnumerable Objectives { get; } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs index e2dfc3f185..e011256c46 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/MissionObjectivesLogic.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic objectivesButton.OnClick += () => objectivesButton.Highlighted = false; objectives.OnObjectivesUpdated += UpdateObjectives; - UpdateObjectives(); + UpdateObjectives(true); Game.ConnectionStateChanged += RemoveHandlers; } @@ -53,9 +53,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic } } - public void UpdateObjectives() + public void UpdateObjectives(bool notify) { - objectivesButton.Highlighted = true; + if (notify) + { + objectivesButton.Highlighted = true; + } primaryPanel.RemoveChildren(); secondaryPanel.RemoveChildren(); foreach (var o in objectives.Objectives.Where(o => o.Status != ObjectiveStatus.Inactive))