diff --git a/OpenRA.Server/Server.cs b/OpenRA.Server/Server.cs index 00e988ddbc..881798da9b 100644 --- a/OpenRA.Server/Server.cs +++ b/OpenRA.Server/Server.cs @@ -301,6 +301,29 @@ namespace OpenRA.Server new ServerOrder(conn.PlayerIndex, "SetPalette", pal.ToString()).Serialize()); return true; }}, + { "map", + s => + { + if (conn.PlayerIndex != 0) + { + DispatchOrdersToClient(conn, 0, + new ServerOrder( conn.PlayerIndex, "Chat", + "Only the host can change the map" ).Serialize() ); + return true; + } + + if (conn.IsReady) + { + DispatchOrdersToClient(conn, 0, + new ServerOrder( conn.PlayerIndex, "Chat", + "You can't change the map after the game has started" ).Serialize() ); + return true; + } + + DispatchOrders( null, 0, + new ServerOrder(0, "ChangeMap", s).Serialize()); + return true; + }}, }; var cmdName = cmd.Split(' ').First(); diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 0557c1c372..458746cf5a 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -48,45 +48,68 @@ namespace OpenRa.Game public static bool skipMakeAnims = true; - public static void Initialize(string mapName, Renderer renderer, int2 clientSize, - int localPlayer, bool useAftermath, Controller controller) + static Renderer renderer; + static bool usingAftermath; + static int2 clientSize; + + public static void ChangeMap(string mapName) { - Rules.LoadRules(mapName, useAftermath); + SheetBuilder.Initialize(renderer); + + Rules.LoadRules(mapName, usingAftermath); world = new World(); - for( int i = 0 ; i < 8 ; i++ ) + for (int i = 0; i < 8; i++) { - var a = new Actor( null, new int2( int.MaxValue, int.MaxValue ), null ); - players[ i ] = new Player( a, i, i, "Multi{0}".F( i ), Race.Allies ); - a.Owner = players[ i ]; - a.traits.Add( new Traits.ProductionQueue( a ) ); - Game.world.Add( a ); + var a = new Actor(null, new int2(int.MaxValue, int.MaxValue), null); + players[i] = new Player(a, i, i, "Multi{0}".F(i), Race.Allies); + a.Owner = players[i]; + a.traits.Add(new Traits.ProductionQueue(a)); + Game.world.Add(a); } - localPlayerIndex = localPlayer; - Rules.Map.InitOreDensity(); + worldRenderer = new WorldRenderer(renderer); - Game.controller = controller; - worldRenderer = new WorldRenderer( renderer ); - - SequenceProvider.Initialize(useAftermath); - viewport = new Viewport( clientSize, Rules.Map.Offset, Rules.Map.Offset + Rules.Map.Size, renderer ); - - Sound.Initialize(); + SequenceProvider.Initialize(usingAftermath); + viewport = new Viewport(clientSize, Rules.Map.Offset, Rules.Map.Offset + Rules.Map.Size, renderer); BuildingInfluence = new BuildingInfluenceMap(); UnitInfluence = new UnitInfluenceMap(); + skipMakeAnims = true; foreach (var treeReference in Rules.Map.Trees) - world.Add(new Actor(Rules.UnitInfo[treeReference.Image], + world.Add(new Actor(Rules.UnitInfo[treeReference.Image], new int2(treeReference.Location), null)); - + LoadMapActors(Rules.AllRules); + skipMakeAnims = false; PathFinder = new PathFinder(); + chrome = new Chrome(renderer); + + oreFrequency = (int)(Rules.General.GrowthRate * 60 * 1000); + oreTicks = oreFrequency; + } + + public static void Initialize(string mapName, Renderer renderer, int2 clientSize, + int localPlayer, bool useAftermath, Controller controller) + { + localPlayerIndex = localPlayer; + usingAftermath = useAftermath; + Game.renderer = renderer; + Game.clientSize = clientSize; + + // todo + Sound.Initialize(); + PerfHistory.items["render"].hasNormalTick = false; + PerfHistory.items["batches"].hasNormalTick = false; + Game.controller = controller; + + ChangeMap(mapName); + if (Replay != "") orderManager = new OrderManager(new IOrderSource[] { new ReplayOrderSource(Replay) }); else @@ -96,15 +119,6 @@ namespace OpenRa.Game : new IOrderSource[] { new LocalOrderSource(), new NetworkOrderSource(new TcpClient(NetworkHost, NetworkPort)) }; orderManager = new OrderManager(orderSources, "replay.rep"); } - - skipMakeAnims = false; - PerfHistory.items["render"].hasNormalTick = false; - PerfHistory.items["batches"].hasNormalTick = false; - - chrome = new Chrome(renderer); - - oreFrequency = (int)(Rules.General.GrowthRate * 60 * 1000); - oreTicks = oreFrequency; } static void LoadMapActors(IniFile mapfile) diff --git a/OpenRa.Game/Graphics/SequenceProvider.cs b/OpenRa.Game/Graphics/SequenceProvider.cs index 6228d84831..16b18bfc88 100644 --- a/OpenRa.Game/Graphics/SequenceProvider.cs +++ b/OpenRa.Game/Graphics/SequenceProvider.cs @@ -8,13 +8,14 @@ namespace OpenRa.Game.Graphics { static class SequenceProvider { - static Dictionary> units = - new Dictionary>(); - - static Dictionary cursors = new Dictionary(); + static Dictionary> units; + static Dictionary cursors; public static void Initialize( bool useAftermath ) { + units = new Dictionary>(); + cursors = new Dictionary(); + LoadSequenceSource("sequences.xml"); if (useAftermath) LoadSequenceSource("sequences-aftermath.xml"); diff --git a/OpenRa.Game/Graphics/SheetBuilder.cs b/OpenRa.Game/Graphics/SheetBuilder.cs index 6b09296967..bfd67f0019 100644 --- a/OpenRa.Game/Graphics/SheetBuilder.cs +++ b/OpenRa.Game/Graphics/SheetBuilder.cs @@ -7,6 +7,9 @@ namespace OpenRa.Game.Graphics public static void Initialize(Renderer r) { renderer = r; + current = null; + rowHeight = 0; + channel = null; } public static Sprite Add(byte[] src, Size size) diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index fb835ba60b..47cf5a3623 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -16,7 +16,7 @@ namespace OpenRa.Game.Graphics public readonly SpriteRenderer spriteRenderer; public readonly LineRenderer lineRenderer; public readonly UiOverlay uiOverlay; - readonly Renderer renderer; + public readonly Renderer renderer; public static bool ShowUnitPaths = false; diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 490ed037b7..38773e93b8 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -56,7 +56,6 @@ namespace OpenRa.Game bool windowed = !settings.GetValue( "fullscreen", false ); renderer = new Renderer( this, GetResolution( settings ), windowed ); - SheetBuilder.Initialize( renderer ); var controller = new Controller( () => (Modifiers)(int)ModifierKeys ); /* a bit of insane input routing */ diff --git a/OpenRa.Game/UnitOrders.cs b/OpenRa.Game/UnitOrders.cs index ed7579e171..86e94d913e 100755 --- a/OpenRa.Game/UnitOrders.cs +++ b/OpenRa.Game/UnitOrders.cs @@ -105,6 +105,12 @@ namespace OpenRa.Game Game.orderManager.StartGame(); break; } + case "ChangeMap": + { + Game.chat.AddLine(Color.White, "Server", "Changing map to {0}".F(order.TargetString)); + Game.ChangeMap(order.TargetString); + break; + } default: throw new NotImplementedException();