Delay loading the observer UI until the game is actually over

This commit is contained in:
Oliver Brakmann
2015-07-25 00:06:41 +02:00
committed by deniz1a
parent a725d63b0c
commit a77e9c0d87
2 changed files with 13 additions and 11 deletions

View File

@@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
public class MissionObjectives : INotifyObjectivesUpdated, ISync, IResolveOrder public class MissionObjectives : INotifyObjectivesUpdated, ISync, IResolveOrder
{ {
readonly MissionObjectivesInfo info; public readonly MissionObjectivesInfo Info;
readonly List<MissionObjective> objectives = new List<MissionObjective>(); readonly List<MissionObjective> objectives = new List<MissionObjective>();
public ReadOnlyList<MissionObjective> Objectives; public ReadOnlyList<MissionObjective> Objectives;
@@ -64,9 +64,9 @@ namespace OpenRA.Mods.Common.Traits
// The player's WinState is only updated when his allies have all completed their objective as well. // The player's WinState is only updated when his allies have all completed their objective as well.
public WinState WinStateCooperative { get; private set; } public WinState WinStateCooperative { get; private set; }
public MissionObjectives(World world, MissionObjectivesInfo moInfo) public MissionObjectives(World world, MissionObjectivesInfo info)
{ {
info = moInfo; Info = info;
Objectives = new ReadOnlyList<MissionObjective>(objectives); Objectives = new ReadOnlyList<MissionObjective>(objectives);
} }
@@ -139,7 +139,7 @@ namespace OpenRA.Mods.Common.Traits
var gameOver = players.All(p => p.WinState != WinState.Undefined || !p.HasObjectives); var gameOver = players.All(p => p.WinState != WinState.Undefined || !p.HasObjectives);
if (gameOver) if (gameOver)
Game.RunAfterDelay(info.GameOverDelay, () => Game.RunAfterDelay(Info.GameOverDelay, () =>
{ {
player.World.EndGame(); player.World.EndGame();
player.World.SetPauseState(true); player.World.SetPauseState(true);
@@ -152,7 +152,7 @@ namespace OpenRA.Mods.Common.Traits
var players = player.World.Players.Where(p => !p.NonCombatant); var players = player.World.Players.Where(p => !p.NonCombatant);
var enemies = players.Where(p => !p.IsAlliedWith(player)); var enemies = players.Where(p => !p.IsAlliedWith(player));
if (info.Cooperative) if (Info.Cooperative)
{ {
WinStateCooperative = WinState.Won; WinStateCooperative = WinState.Won;
var allies = players.Where(p => p.IsAlliedWith(player)); var allies = players.Where(p => p.IsAlliedWith(player));
@@ -165,7 +165,7 @@ namespace OpenRA.Mods.Common.Traits
p.World.OnPlayerWinStateChanged(p); p.World.OnPlayerWinStateChanged(p);
} }
if (info.EarlyGameOver) if (Info.EarlyGameOver)
foreach (var p in enemies) foreach (var p in enemies)
p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p); p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p);
} }
@@ -175,7 +175,7 @@ namespace OpenRA.Mods.Common.Traits
player.WinState = WinState.Won; player.WinState = WinState.Won;
player.World.OnPlayerWinStateChanged(player); player.World.OnPlayerWinStateChanged(player);
if (info.EarlyGameOver) if (Info.EarlyGameOver)
foreach (var p in enemies) foreach (var p in enemies)
p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p); p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p);
} }
@@ -188,7 +188,7 @@ namespace OpenRA.Mods.Common.Traits
var players = player.World.Players.Where(p => !p.NonCombatant); var players = player.World.Players.Where(p => !p.NonCombatant);
var enemies = players.Where(p => !p.IsAlliedWith(player)); var enemies = players.Where(p => !p.IsAlliedWith(player));
if (info.Cooperative) if (Info.Cooperative)
{ {
WinStateCooperative = WinState.Lost; WinStateCooperative = WinState.Lost;
var allies = players.Where(p => p.IsAlliedWith(player)); var allies = players.Where(p => p.IsAlliedWith(player));
@@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Traits
p.World.OnPlayerWinStateChanged(p); p.World.OnPlayerWinStateChanged(p);
} }
if (info.EarlyGameOver) if (Info.EarlyGameOver)
foreach (var p in enemies) foreach (var p in enemies)
p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p); p.PlayerActor.Trait<MissionObjectives>().ForceDefeat(p);
} }
@@ -211,7 +211,7 @@ namespace OpenRA.Mods.Common.Traits
player.WinState = WinState.Lost; player.WinState = WinState.Lost;
player.World.OnPlayerWinStateChanged(player); player.World.OnPlayerWinStateChanged(player);
if (info.EarlyGameOver) if (Info.EarlyGameOver)
foreach (var p in enemies) foreach (var p in enemies)
{ {
p.WinState = WinState.Won; p.WinState = WinState.Won;

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using OpenRA.Mods.Common.Scripting; using OpenRA.Mods.Common.Scripting;
using OpenRA.Mods.Common.Traits;
using OpenRA.Widgets; using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets.Logic namespace OpenRA.Mods.Common.Widgets.Logic
@@ -29,12 +30,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs()); var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs());
var sidebarTicker = playerWidgets.Get<LogicTickerWidget>("SIDEBAR_TICKER"); var sidebarTicker = playerWidgets.Get<LogicTickerWidget>("SIDEBAR_TICKER");
var objectives = world.LocalPlayer.PlayerActor.TraitOrDefault<MissionObjectives>();
sidebarTicker.OnTick = () => sidebarTicker.OnTick = () =>
{ {
// Switch to observer mode after win/loss // Switch to observer mode after win/loss
if (world.LocalPlayer.WinState != WinState.Undefined) if (world.LocalPlayer.WinState != WinState.Undefined)
Game.RunAfterTick(() => Game.RunAfterDelay(objectives != null ? objectives.Info.GameOverDelay : 0, () =>
{ {
world.LocalPlayer.Spectating = true; world.LocalPlayer.Spectating = true;
playerRoot.RemoveChildren(); playerRoot.RemoveChildren();