Support for updating objectives without flashing the objectives button. Added a secondary objective: lose fewer than 100 units.
This commit is contained in:
@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
|
|
||||||
class Allies01Script : IHasObjectives, IWorldLoaded, ITick
|
class Allies01Script : IHasObjectives, IWorldLoaded, ITick
|
||||||
{
|
{
|
||||||
public event Action OnObjectivesUpdated;
|
public event ObjectivesUpdatedEventHandler OnObjectivesUpdated;
|
||||||
|
|
||||||
public IEnumerable<Objective> Objectives { get { return objectives.Values; } }
|
public IEnumerable<Objective> Objectives { get { return objectives.Values; } }
|
||||||
|
|
||||||
@@ -123,13 +123,13 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
SendShips();
|
SendShips();
|
||||||
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed;
|
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed;
|
||||||
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
|
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
currentAttackWaveFrameNumber = world.FrameNumber;
|
currentAttackWaveFrameNumber = world.FrameNumber;
|
||||||
}
|
}
|
||||||
if (lab.Destroyed)
|
if (lab.Destroyed)
|
||||||
{
|
{
|
||||||
objectives[FindEinsteinID].Status = ObjectiveStatus.Failed;
|
objectives[FindEinsteinID].Status = ObjectiveStatus.Failed;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
MissionFailed("Einstein was killed.");
|
MissionFailed("Einstein was killed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,13 +156,13 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
if (einsteinChinook.Destroyed)
|
if (einsteinChinook.Destroyed)
|
||||||
{
|
{
|
||||||
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed;
|
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
MissionFailed("The extraction helicopter was destroyed.");
|
MissionFailed("The extraction helicopter was destroyed.");
|
||||||
}
|
}
|
||||||
else if (!world.Map.IsInMap(einsteinChinook.Location) && einsteinChinook.Trait<Cargo>().Passengers.Contains(einstein))
|
else if (!world.Map.IsInMap(einsteinChinook.Location) && einsteinChinook.Trait<Cargo>().Passengers.Contains(einstein))
|
||||||
{
|
{
|
||||||
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed;
|
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
MissionAccomplished("Einstein was rescued.");
|
MissionAccomplished("Einstein was rescued.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
|
|
||||||
class Allies02Script : IHasObjectives, IWorldLoaded, ITick
|
class Allies02Script : IHasObjectives, IWorldLoaded, ITick
|
||||||
{
|
{
|
||||||
public event Action OnObjectivesUpdated;
|
public event ObjectivesUpdatedEventHandler OnObjectivesUpdated;
|
||||||
|
|
||||||
public IEnumerable<Objective> Objectives { get { return objectives.Values; } }
|
public IEnumerable<Objective> Objectives { get { return objectives.Values; } }
|
||||||
|
|
||||||
@@ -37,18 +37,23 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
{ FindEinsteinID, new Objective(ObjectiveType.Primary, FindEinstein, ObjectiveStatus.InProgress) },
|
{ FindEinsteinID, new Objective(ObjectiveType.Primary, FindEinstein, ObjectiveStatus.InProgress) },
|
||||||
{ DestroySamSitesID, new Objective(ObjectiveType.Primary, DestroySamSites, ObjectiveStatus.InProgress) },
|
{ DestroySamSitesID, new Objective(ObjectiveType.Primary, DestroySamSites, ObjectiveStatus.InProgress) },
|
||||||
{ ExtractEinsteinID, new Objective(ObjectiveType.Primary, ExtractEinstein, ObjectiveStatus.Inactive) },
|
{ 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 FindEinsteinID = 0;
|
||||||
const int DestroySamSitesID = 1;
|
const int DestroySamSitesID = 1;
|
||||||
const int ExtractEinsteinID = 2;
|
const int ExtractEinsteinID = 2;
|
||||||
const int MaintainPresenceID = 3;
|
const int MaintainPresenceID = 3;
|
||||||
|
const int FewDeathsID = 4;
|
||||||
|
|
||||||
const string FindEinstein = "Find Einstein's crashed helicopter. Tanya must survive.";
|
const string FindEinstein = "Find Einstein's crashed helicopter. Tanya must survive.";
|
||||||
const string DestroySamSites = "Destroy the SAM sites. 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 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 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 sam1;
|
||||||
Actor sam2;
|
Actor sam2;
|
||||||
@@ -232,12 +237,19 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
BuildSovietUnits();
|
BuildSovietUnits();
|
||||||
ManageSovietUnits();
|
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 (objectives[FindEinsteinID].Status == ObjectiveStatus.InProgress)
|
||||||
{
|
{
|
||||||
if (AlliesNearTown())
|
if (AlliesNearTown())
|
||||||
{
|
{
|
||||||
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed;
|
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
TransferTownUnitsToAllies();
|
TransferTownUnitsToAllies();
|
||||||
SovietsAttackTown();
|
SovietsAttackTown();
|
||||||
}
|
}
|
||||||
@@ -248,7 +260,7 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
{
|
{
|
||||||
objectives[DestroySamSitesID].Status = ObjectiveStatus.Completed;
|
objectives[DestroySamSitesID].Status = ObjectiveStatus.Completed;
|
||||||
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
|
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
SpawnSignalFlare();
|
SpawnSignalFlare();
|
||||||
Sound.Play("flaren1.aud");
|
Sound.Play("flaren1.aud");
|
||||||
ExtractEinsteinAtLZ();
|
ExtractEinsteinAtLZ();
|
||||||
@@ -260,14 +272,18 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
{
|
{
|
||||||
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed;
|
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed;
|
||||||
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
|
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
MissionFailed("The extraction helicopter was destroyed.");
|
MissionFailed("The extraction helicopter was destroyed.");
|
||||||
}
|
}
|
||||||
else if (!world.Map.IsInMap(einsteinChinook.Location) && einsteinChinook.Trait<Cargo>().Passengers.Contains(einstein))
|
else if (!world.Map.IsInMap(einsteinChinook.Location) && einsteinChinook.Trait<Cargo>().Passengers.Contains(einstein))
|
||||||
{
|
{
|
||||||
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed;
|
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed;
|
||||||
objectives[MaintainPresenceID].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.");
|
MissionAccomplished("Einstein was rescued.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,7 +300,7 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
if (!world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20).Any(a => a.HasTrait<Building>() && !a.HasTrait<Wall>() && a.Owner == allies2))
|
if (!world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20).Any(a => a.HasTrait<Building>() && !a.HasTrait<Wall>() && a.Owner == allies2))
|
||||||
{
|
{
|
||||||
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
|
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
|
||||||
OnObjectivesUpdated();
|
OnObjectivesUpdated(true);
|
||||||
MissionFailed("The Allied reinforcements have been defeated.");
|
MissionFailed("The Allied reinforcements have been defeated.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -582,7 +598,6 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
{
|
{
|
||||||
Game.MoveViewport(allies2BasePoint.Location.ToFloat2());
|
Game.MoveViewport(allies2BasePoint.Location.ToFloat2());
|
||||||
}
|
}
|
||||||
OnObjectivesUpdated();
|
|
||||||
PlayMusic();
|
PlayMusic();
|
||||||
Game.ConnectionStateChanged += StopMusic;
|
Game.ConnectionStateChanged += StopMusic;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,9 +31,11 @@ namespace OpenRA.Mods.RA.Missions
|
|||||||
public enum ObjectiveType { Primary, Secondary }
|
public enum ObjectiveType { Primary, Secondary }
|
||||||
public enum ObjectiveStatus { Inactive, InProgress, Completed, Failed }
|
public enum ObjectiveStatus { Inactive, InProgress, Completed, Failed }
|
||||||
|
|
||||||
|
public delegate void ObjectivesUpdatedEventHandler(bool notify);
|
||||||
|
|
||||||
public interface IHasObjectives
|
public interface IHasObjectives
|
||||||
{
|
{
|
||||||
event Action OnObjectivesUpdated;
|
event ObjectivesUpdatedEventHandler OnObjectivesUpdated;
|
||||||
IEnumerable<Objective> Objectives { get; }
|
IEnumerable<Objective> Objectives { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
objectivesButton.OnClick += () => objectivesButton.Highlighted = false;
|
objectivesButton.OnClick += () => objectivesButton.Highlighted = false;
|
||||||
|
|
||||||
objectives.OnObjectivesUpdated += UpdateObjectives;
|
objectives.OnObjectivesUpdated += UpdateObjectives;
|
||||||
UpdateObjectives();
|
UpdateObjectives(true);
|
||||||
Game.ConnectionStateChanged += RemoveHandlers;
|
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();
|
primaryPanel.RemoveChildren();
|
||||||
secondaryPanel.RemoveChildren();
|
secondaryPanel.RemoveChildren();
|
||||||
foreach (var o in objectives.Objectives.Where(o => o.Status != ObjectiveStatus.Inactive))
|
foreach (var o in objectives.Objectives.Where(o => o.Status != ObjectiveStatus.Inactive))
|
||||||
|
|||||||
Reference in New Issue
Block a user