Merge pull request #7081 from Mailaender/ignore-missing-npc-objectives

Removed the need to give NPCs fake objectives to properly end the game
This commit is contained in:
Chris Forbes
2014-12-08 14:05:59 +13:00
4 changed files with 22 additions and 13 deletions

View File

@@ -41,6 +41,7 @@ namespace OpenRA
public readonly PlayerReference PlayerReference; public readonly PlayerReference PlayerReference;
public bool IsBot; public bool IsBot;
public int SpawnPoint; public int SpawnPoint;
public bool HasObjectives = false;
public Shroud Shroud; public Shroud Shroud;
public World World { get; private set; } public World World { get; private set; }

View File

@@ -129,7 +129,7 @@ namespace OpenRA.Mods.RA
{ {
foreach (var inou in inous) foreach (var inou in inous)
inou.OnPlayerLost(player); inou.OnPlayerLost(player);
CheckIfGameIsOver(player); CheckIfGameIsOver(player);
} }
} }
@@ -139,7 +139,7 @@ namespace OpenRA.Mods.RA
{ {
var players = player.World.Players.Where(p => !p.NonCombatant); var players = player.World.Players.Where(p => !p.NonCombatant);
var gameOver = players.All(p => p.WinState != WinState.Undefined); var gameOver = players.All(p => p.WinState != WinState.Undefined || !p.HasObjectives);
if (gameOver) if (gameOver)
Game.RunAfterDelay(info.GameOverDelay, () => Game.RunAfterDelay(info.GameOverDelay, () =>
{ {
@@ -181,6 +181,8 @@ namespace OpenRA.Mods.RA
foreach (var p in enemies) foreach (var p in enemies)
p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p); p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p);
} }
CheckIfGameIsOver(player);
} }
public void OnPlayerLost(Player player) public void OnPlayerLost(Player player)
@@ -218,6 +220,8 @@ namespace OpenRA.Mods.RA
p.World.OnPlayerWinStateChanged(p); p.World.OnPlayerWinStateChanged(p);
} }
} }
CheckIfGameIsOver(player);
} }
public void ForceDefeat(Player player) public void ForceDefeat(Player player)
@@ -227,7 +231,7 @@ namespace OpenRA.Mods.RA
MarkFailed(player, id); MarkFailed(player, id);
} }
public event Action<Player> ObjectiveAdded = player => { }; public event Action<Player> ObjectiveAdded = player => { player.HasObjectives = true; };
public void OnObjectiveAdded(Player player, int id) {} public void OnObjectiveAdded(Player player, int id) {}
public void OnObjectiveCompleted(Player player, int id) {} public void OnObjectiveCompleted(Player player, int id) {}

View File

@@ -12,7 +12,7 @@ SendInsertionHelicopter = function()
local passengers = Reinforcements.ReinforceWithTransport(player, InsertionHelicopterType, local passengers = Reinforcements.ReinforceWithTransport(player, InsertionHelicopterType,
TanyaReinforcements, InsertionPath, { InsertionEntry.Location })[2] TanyaReinforcements, InsertionPath, { InsertionEntry.Location })[2]
local tanya = passengers[1] local tanya = passengers[1]
Trigger.OnKilled(tanya, RescueFailed) Trigger.OnKilled(tanya, TanyaKilledInAction)
tanya.Stance = "HoldFire" tanya.Stance = "HoldFire"
end end
@@ -95,8 +95,13 @@ LabDestroyed = function()
end end
RescueFailed = function() RescueFailed = function()
player.MarkFailedObjective(SurviveObjective) Media.PlaySpeechNotification(player, "ObjectiveNotMet")
ussr.MarkCompletedObjective(DefendObjective) player.MarkFailedObjective(EinsteinSurviveObjective)
end
TanyaKilledInAction = function()
Media.PlaySpeechNotification(player, "ObjectiveNotMet")
player.MarkFailedObjective(TanyaSurviveObjective)
end end
OilPumpDestroyed = function() OilPumpDestroyed = function()
@@ -124,8 +129,10 @@ HelicopterGone = function()
Media.PlaySpeechNotification(player, "TargetRescued") Media.PlaySpeechNotification(player, "TargetRescued")
Trigger.AfterDelay(DateTime.Seconds(1), function() Trigger.AfterDelay(DateTime.Seconds(1), function()
player.MarkCompletedObjective(ExtractObjective) player.MarkCompletedObjective(ExtractObjective)
player.MarkCompletedObjective(SurviveObjective) player.MarkCompletedObjective(EinsteinSurviveObjective)
ussr.MarkFailedObjective(DefendObjective) if not Tanya.IsDead then
player.MarkCompletedObjective(TanyaSurviveObjective)
end
if not collateralDamage then if not collateralDamage then
player.MarkCompletedObjective(CivilProtectionObjective) player.MarkCompletedObjective(CivilProtectionObjective)
end end
@@ -177,10 +184,9 @@ WorldLoaded = function()
Media.PlayMovieFullscreen("landing.vqa", function() Media.PlayMovieFullscreen("landing.vqa", function()
FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.") FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.")
SurviveObjective = player.AddPrimaryObjective("Tanya and Einstein must survive.") TanyaSurviveObjective = player.AddPrimaryObjective("Tanya must survive.")
england.AddPrimaryObjective("Destroy the soviet base after a successful rescue.") EinsteinSurviveObjective = player.AddPrimaryObjective("Einstein must survive.")
CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.") CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.")
DefendObjective = ussr.AddPrimaryObjective("Kill Tanya and keep Einstein hostage.")
RunInitialActivities() RunInitialActivities()
end) end)

View File

@@ -111,8 +111,6 @@ WorldLoaded = function()
Media.PlayMovieFullscreen("mcv.vqa", function() Media.PlayMovieFullscreen("mcv.vqa", function()
ConquestObjective = player.AddPrimaryObjective("Secure the area.") ConquestObjective = player.AddPrimaryObjective("Secure the area.")
ussr.AddPrimaryObjective("Defend your base.")
ukraine.AddPrimaryObjective("Destroy the convoy.")
end) end)
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end) Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end)