diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index 274501aac0..449df6c7db 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -146,7 +146,8 @@ namespace OpenRA public void Tick(World world) { if (!Game.IsStarted) return; - + if (world.LocalPlayer == null) return; + TickPaletteAnimation(); TickRadarAnimation(); diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index f57193e974..5ce9b8e2d5 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -185,12 +185,13 @@ namespace OpenRA AvailableMaps = FindMaps(LobbyInfo.GlobalSettings.Mods); ChangeMods(); - LoadMap(new Manifest(LobbyInfo.GlobalSettings.Mods).ShellmapUid); if( Settings.Replay != "" ) orderManager = new OrderManager( new ReplayConnection( Settings.Replay ) ); else JoinLocal(); + + LoadShellMap(new Manifest(LobbyInfo.GlobalSettings.Mods).ShellmapUid); } public static string CurrentHost = ""; @@ -340,7 +341,21 @@ namespace OpenRA public static void IssueOrder(Order o) { orderManager.IssueOrder(o); } /* avoid exposing the OM to mod code */ public static bool IsStarted { get { return orderManager.GameStarted; } } + + public static void LoadShellMap(string map) + { + LoadMap(map); + world.Queries = new World.AllQueries(world); + foreach (var p in world.players.Values) + foreach (var q in world.players.Values) + p.Stances[q] = ChooseInitialStance(p, q); + + foreach (var gs in world.WorldActor.traits.WithInterface()) + gs.GameStarted(world); + orderManager.StartGame(); + } + public static void StartGame() { LoadMap(LobbyInfo.GlobalSettings.Map); diff --git a/OpenRA.Game/GameRules/TechTree.cs b/OpenRA.Game/GameRules/TechTree.cs index 7f2aef7bda..086d481d36 100755 --- a/OpenRA.Game/GameRules/TechTree.cs +++ b/OpenRA.Game/GameRules/TechTree.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -43,6 +43,9 @@ namespace OpenRA.GameRules public Cache> GatherBuildings( Player player ) { var ret = new Cache>( x => new List() ); + if (player == null) + return ret; + foreach( var b in player.World.Queries.OwnedBy[player].Where( x=>x.Info.Traits.Contains() ) ) { ret[ b.Info.Name ].Add( b ); @@ -56,6 +59,9 @@ namespace OpenRA.GameRules public bool CanBuild( ActorInfo info, Player player, Cache> playerBuildings ) { + if (player == null) + return false; + var bi = info.Traits.GetOrDefault(); if( bi == null ) return false; @@ -74,6 +80,9 @@ namespace OpenRA.GameRules public IEnumerable BuildableItems( Player player, params string[] categories ) { + if (player == null) + yield break; + var playerBuildings = GatherBuildings( player ); foreach (var unit in AllBuildables(categories)) if( CanBuild( unit, player, playerBuildings ) ) diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index d9d603f4c8..3bccfb2033 100644 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -75,7 +75,8 @@ namespace OpenRA.Graphics world.WorldRenderer.Draw(); if( Game.orderManager.GameStarted ) { - Game.chrome.Draw( world ); + if (world.LocalPlayer != null) + Game.chrome.Draw( world ); if( Game.orderManager.Connection.ConnectionState == ConnectionState.NotConnected ) Game.chrome.DrawDialog("Connection lost."); diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index a0b2923d36..66b051e6f2 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -23,7 +23,7 @@ using System.Drawing; using System.Linq; using OpenRA.FileFormats; using OpenRA.Traits; - +using System; namespace OpenRA.Graphics { public class WorldRenderer @@ -118,7 +118,7 @@ namespace OpenRA.Graphics var actors = world.FindUnits( new float2(bounds.Left, bounds.Top), new float2(bounds.Right, bounds.Bottom)); - + var renderables = actors.SelectMany(a => a.Render()) .OrderBy(r => r, comparer); diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 62bd45784b..a3e08bd1fd 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -155,7 +155,10 @@ namespace OpenRA frameEndActions = new List>(); foreach (var a in acts) a(this); - Minimap.Update(); + // TODO: This doesn't even belong here -> move into a widget + if (LocalPlayer != null) + Minimap.Update(); + foreach (var player in players.Values) player.Tick(); }