Refactor Allies 02 objectives code

This commit is contained in:
ScottNZ
2013-06-06 01:47:38 +12:00
parent fdfd2eacea
commit aecc3624ba

View File

@@ -28,27 +28,19 @@ namespace OpenRA.Mods.RA.Missions
{ {
public event Action<bool> OnObjectivesUpdated = notify => { }; public event Action<bool> OnObjectivesUpdated = notify => { };
public IEnumerable<Objective> Objectives { get { return objectives.Values; } } public IEnumerable<Objective> Objectives { get { return new[] { findEinstein, destroySamSites, extractEinstein, maintainPresence, fewDeaths }; } }
Dictionary<int, Objective> objectives = new Dictionary<int, Objective>() Objective findEinstein = new Objective(ObjectiveType.Primary, FindEinsteinText, ObjectiveStatus.InProgress);
{ Objective destroySamSites = new Objective(ObjectiveType.Primary, DestroySamSitesText, ObjectiveStatus.InProgress);
{ FindEinsteinID, new Objective(ObjectiveType.Primary, FindEinstein, ObjectiveStatus.InProgress) }, Objective extractEinstein = new Objective(ObjectiveType.Primary, ExtractEinsteinText, ObjectiveStatus.Inactive);
{ DestroySamSitesID, new Objective(ObjectiveType.Primary, DestroySamSites, ObjectiveStatus.InProgress) }, Objective maintainPresence = new Objective(ObjectiveType.Primary, MaintainPresenceText, ObjectiveStatus.InProgress);
{ ExtractEinsteinID, new Objective(ObjectiveType.Primary, ExtractEinstein, ObjectiveStatus.Inactive) }, Objective fewDeaths = new Objective(ObjectiveType.Secondary, "", ObjectiveStatus.InProgress);
{ MaintainPresenceID, new Objective(ObjectiveType.Primary, MaintainPresence, ObjectiveStatus.InProgress) },
{ FewDeathsID, new Objective(ObjectiveType.Secondary, "", ObjectiveStatus.InProgress) }
};
const int FindEinsteinID = 0; const string FindEinsteinText = "Find Einstein's crashed helicopter. Tanya must survive.";
const int DestroySamSitesID = 1; const string DestroySamSitesText = "Destroy the SAM sites. Tanya must survive.";
const int ExtractEinsteinID = 2; const string ExtractEinsteinText = "Wait for the helicopter and extract Einstein. Tanya and Einstein must survive.";
const int MaintainPresenceID = 3; const string MaintainPresenceText = "Maintain an Allied presence in the area. Reinforcements will arrive soon.";
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}/{1} units."; const string FewDeathsTemplate = "Lose fewer than {0}/{1} units.";
const int DeathsThreshold = 200; const int DeathsThreshold = 200;
@@ -195,44 +187,45 @@ namespace OpenRA.Mods.RA.Missions
UpdateDeaths(); UpdateDeaths();
if (objectives[FindEinsteinID].Status == ObjectiveStatus.InProgress) if (findEinstein.Status == ObjectiveStatus.InProgress)
{ {
if (AlliesNearTown()) if (AlliesNearTown())
{ {
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed; findEinstein.Status = ObjectiveStatus.Completed;
OnObjectivesUpdated(true); OnObjectivesUpdated(true);
TransferTownUnitsToAllies(); TransferTownUnitsToAllies();
SovietsAttackTown(); SovietsAttackTown();
} }
} }
if (objectives[DestroySamSitesID].Status == ObjectiveStatus.InProgress) if (destroySamSites.Status == ObjectiveStatus.InProgress)
{ {
if (sams.All(s => s.IsDead() || s.Owner != soviets)) if (sams.All(s => s.IsDead() || s.Owner != soviets))
{ {
objectives[DestroySamSitesID].Status = ObjectiveStatus.Completed; destroySamSites.Status = ObjectiveStatus.Completed;
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress; extractEinstein.Status = ObjectiveStatus.InProgress;
OnObjectivesUpdated(true); OnObjectivesUpdated(true);
world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies1), new LocationInit(extractionLZ.Location) }); world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies1), new LocationInit(extractionLZ.Location) });
Sound.Play("flaren1.aud"); Sound.Play("flaren1.aud");
ExtractEinsteinAtLZ(); ExtractEinsteinAtLZ();
} }
} }
if (objectives[ExtractEinsteinID].Status == ObjectiveStatus.InProgress && einsteinChinook != null) if (extractEinstein.Status == ObjectiveStatus.InProgress && einsteinChinook != null)
{ {
if (einsteinChinook.IsDead()) if (einsteinChinook.IsDead())
{ {
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed; extractEinstein.Status = ObjectiveStatus.Failed;
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
OnObjectivesUpdated(true); 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; extractEinstein.Status = ObjectiveStatus.Completed;
objectives[MaintainPresenceID].Status = ObjectiveStatus.Completed; maintainPresence.Status = ObjectiveStatus.Completed;
if (objectives[FewDeathsID].Status == ObjectiveStatus.InProgress) if (fewDeaths.Status == ObjectiveStatus.InProgress)
objectives[FewDeathsID].Status = ObjectiveStatus.Completed; fewDeaths.Status = ObjectiveStatus.Completed;
OnObjectivesUpdated(true); OnObjectivesUpdated(true);
MissionAccomplished("Einstein was rescued."); MissionAccomplished("Einstein was rescued.");
@@ -250,7 +243,7 @@ namespace OpenRA.Mods.RA.Missions
if (!w.FindAliveCombatantActorsInBox(alliedBaseTopLeft.ToPPos(), alliedBaseBottomRight.ToPPos()) if (!w.FindAliveCombatantActorsInBox(alliedBaseTopLeft.ToPPos(), alliedBaseBottomRight.ToPPos())
.Any(a => (a.Owner == allies || a.Owner == allies2) && (a.HasTrait<Building>() && !a.HasTrait<Wall>()) || a.HasTrait<BaseBuilding>())) .Any(a => (a.Owner == allies || a.Owner == allies2) && (a.HasTrait<Building>() && !a.HasTrait<Wall>()) || a.HasTrait<BaseBuilding>()))
{ {
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed; maintainPresence.Status = ObjectiveStatus.Failed;
OnObjectivesUpdated(true); OnObjectivesUpdated(true);
MissionFailed("The Allied reinforcements have been defeated."); MissionFailed("The Allied reinforcements have been defeated.");
} }
@@ -260,11 +253,11 @@ namespace OpenRA.Mods.RA.Missions
void UpdateDeaths() void UpdateDeaths()
{ {
var unitDeaths = allies1.Deaths + allies2.Deaths; var unitDeaths = allies1.Deaths + allies2.Deaths;
objectives[FewDeathsID].Text = FewDeathsTemplate.F(unitDeaths, DeathsThreshold); fewDeaths.Text = FewDeathsTemplate.F(unitDeaths, DeathsThreshold);
OnObjectivesUpdated(false); OnObjectivesUpdated(false);
if (unitDeaths >= DeathsThreshold && objectives[FewDeathsID].Status == ObjectiveStatus.InProgress) if (unitDeaths >= DeathsThreshold && fewDeaths.Status == ObjectiveStatus.InProgress)
{ {
objectives[FewDeathsID].Status = ObjectiveStatus.Failed; fewDeaths.Status = ObjectiveStatus.Failed;
OnObjectivesUpdated(true); OnObjectivesUpdated(true);
} }
} }