diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 574a05585a..3f123eccd3 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -31,7 +31,6 @@ namespace OpenRA public static int CellSize { get { return modData.Manifest.TileSize; } } public static ModData modData; - private static World world; private static WorldRenderer worldRenderer; public static Viewport viewport; @@ -44,15 +43,6 @@ namespace OpenRA public static Renderer Renderer; public static bool HasInputFocus = false; - static void LoadMap(string uid) - { - var map = modData.PrepareMap(uid); - - viewport = new Viewport(new float2(Renderer.Resolution), map.TopLeft, map.BottomRight, Renderer); - world = new World(modData.Manifest, map, orderManager); - worldRenderer = new WorldRenderer(world); - } - public static void MoveViewport(int2 loc) { viewport.Center(loc); @@ -93,14 +83,14 @@ namespace OpenRA } internal static int RenderFrame = 0; - internal static int LocalTick = 0; + internal static int LocalTick { get { return orderManager.LocalFrameNumber; } } const int NetTickScale = 3; // 120ms net tick for 40ms local tick internal static event Action ConnectionStateChanged = _ => { }; static ConnectionState lastConnectionState = ConnectionState.PreConnecting; public static int LocalClientId { get { return orderManager.Connection.LocalClientId; } } - static void Tick( World world, OrderManager orderManager, Viewport viewPort ) + static void Tick( OrderManager orderManager, Viewport viewPort ) { if (orderManager.Connection.ConnectionState != lastConnectionState) { @@ -116,20 +106,21 @@ namespace OpenRA { lastTime += Settings.Game.Timestep; Widget.DoTick(); - if( world.GameHasStarted && world.LocalPlayer != null ) + var world = orderManager.world; + if( orderManager.GameStarted && world.LocalPlayer != null ) ++Viewport.TicksSinceLastMove; Sound.Tick(); - Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate( world ); } ); + Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } ); var isNetTick = LocalTick % NetTickScale == 0; if (!isNetTick || orderManager.IsReadyForNextFrame) { - ++LocalTick; + ++orderManager.LocalFrameNumber; Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local"); - if (isNetTick) orderManager.Tick(world); + if (isNetTick) orderManager.Tick(); world.OrderGenerator.Tick(world); world.Selection.Tick(world); @@ -139,7 +130,7 @@ namespace OpenRA PerfHistory.Tick(); } else - if (orderManager.FrameNumber == 0) + if (orderManager.NetFrameNumber == 0) lastTime = Environment.TickCount; } } @@ -147,7 +138,7 @@ namespace OpenRA using (new PerfSample("render")) { ++RenderFrame; - viewport.DrawRegions(worldRenderer, world); + viewport.DrawRegions(worldRenderer); Sound.SetListenerPosition(viewport.Location + .5f * new float2(viewport.Width, viewport.Height)); } @@ -166,31 +157,30 @@ namespace OpenRA LobbyInfoChanged(); } - public static void IssueOrder( Order o ) { orderManager.IssueOrder( o ); } /* avoid exposing the OM to mod code */ - public static event Action AfterGameStart = _ => {}; public static event Action BeforeGameStart = () => {}; - internal static void StartGame(string map) + internal static void StartGame(string mapUID) { - world = null; BeforeGameStart(); - LoadMap(map); + + var map = modData.PrepareMap(mapUID); + viewport = new Viewport(new float2(Renderer.Resolution), map.TopLeft, map.BottomRight, Renderer); + orderManager.world = new World(modData.Manifest, map, orderManager); + worldRenderer = new WorldRenderer(orderManager.world); + if (orderManager.GameStarted) return; Widget.SelectedWidget = null; - LocalTick = 0; + orderManager.LocalFrameNumber = 0; orderManager.StartGame(); worldRenderer.RefreshPalette(); - AfterGameStart( world ); + AfterGameStart( orderManager.world ); } public static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Modifiers modifierKeys) { - var world = Game.world; - if (world == null) return; - - Sync.CheckSyncUnchanged( world, () => + Sync.CheckSyncUnchanged( orderManager.world, () => { var mi = new MouseInput { @@ -210,10 +200,7 @@ namespace OpenRA public static void HandleKeyEvent(KeyInput e) { - var world = Game.world; - if( world == null ) return; - - Sync.CheckSyncUnchanged( world, () => + Sync.CheckSyncUnchanged( orderManager.world, () => { Widget.HandleKeyPress( e ); } ); @@ -269,7 +256,7 @@ namespace OpenRA JoinLocal(); StartGame(modData.Manifest.ShellmapUid); - Game.AfterGameStart += world => Widget.OpenWindow("INGAME_ROOT", new Dictionary{{"world", world}}); + Game.AfterGameStart += world => Widget.OpenWindow("INGAME_ROOT", new Dictionary{{"world", world},{"orderManager",orderManager}}); Game.ConnectionStateChanged += orderManager => { @@ -309,7 +296,7 @@ namespace OpenRA { while (!quit) { - Tick( world, orderManager, viewport ); + Tick( orderManager, viewport ); Application.DoEvents(); } } diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 2396b59b77..51940e2ecc 100644 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -95,7 +95,7 @@ namespace OpenRA.Graphics this.scrollPosition = Game.CellSize* mapStart; } - public void DrawRegions( WorldRenderer wr, World world ) + public void DrawRegions( WorldRenderer wr ) { renderer.BeginFrame(scrollPosition); wr.Draw(); diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index f40f2958b1..35340178e2 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -18,19 +18,21 @@ namespace OpenRA.Network { class OrderManager : IDisposable { - readonly SyncReport syncReport = new SyncReport(); + readonly SyncReport syncReport; readonly FrameData frameData = new FrameData(); public Session LobbyInfo = new Session( Game.Settings.Game.Mods ); public Session.Client LocalClient { get { return LobbyInfo.ClientWithIndex( Connection.LocalClientId ); } } + public World world; public readonly string Host; public readonly int Port; - public int FrameNumber { get; private set; } + public int NetFrameNumber { get; private set; } + public int LocalFrameNumber; public int FramesAhead = 0; - public bool GameStarted { get { return FrameNumber != 0; } } + public bool GameStarted { get { return NetFrameNumber != 0; } } public IConnection Connection { get; private set; } public readonly int SyncHeaderSize = 9; @@ -41,8 +43,8 @@ namespace OpenRA.Network { if (GameStarted) return; - FrameNumber = 1; - for( int i = FrameNumber ; i <= FramesAhead ; i++ ) + NetFrameNumber = 1; + for( int i = NetFrameNumber ; i <= FramesAhead ; i++ ) Connection.Send( new List().Serialize( i ) ); } @@ -51,6 +53,7 @@ namespace OpenRA.Network this.Host = host; this.Port = port; Connection = conn; + syncReport = new SyncReport( this ); } public void IssueOrders( Order[] orders ) @@ -64,7 +67,7 @@ namespace OpenRA.Network localOrders.Add( order ); } - public void TickImmediate( World world ) + public void TickImmediate() { var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList(); if( immediateOrders.Count != 0 ) @@ -80,7 +83,7 @@ namespace OpenRA.Network if( packet.Length == 5 && packet[ 4 ] == 0xBF ) frameData.ClientQuit( clientId, frame ); else if( packet.Length >= 5 && packet[ 4 ] == 0x65 ) - CheckSync( world, packet ); + CheckSync( packet ); else if( frame == 0 ) immediatePackets.Add( Pair.New( clientId, packet ) ); else @@ -94,7 +97,7 @@ namespace OpenRA.Network Dictionary syncForFrame = new Dictionary(); - void CheckSync(World world, byte[] packet) + void CheckSync(byte[] packet) { var frame = BitConverter.ToInt32(packet, 0); byte[] existingSync; @@ -116,7 +119,7 @@ namespace OpenRA.Network if (i < SyncHeaderSize) OutOfSync(frame, "Tick"); else - OutOfSync(world, frame, (i - SyncHeaderSize) / 4); + OutOfSync(frame, (i - SyncHeaderSize) / 4); } } } @@ -125,7 +128,7 @@ namespace OpenRA.Network syncForFrame.Add(frame, packet); } - void OutOfSync( World world, int frame, int index) + void OutOfSync(int frame, int index) { var order = frameData.OrdersForFrame( world, frame ).ElementAt(index); throw new InvalidOperationException("Out of sync in frame {0}.\n {1}".F(frame, order.Order.ToString())); @@ -143,34 +146,34 @@ namespace OpenRA.Network public bool IsReadyForNextFrame { - get { return FrameNumber >= 1 && frameData.IsReadyForFrame( FrameNumber ); } + get { return NetFrameNumber >= 1 && frameData.IsReadyForFrame( NetFrameNumber ); } } - public void Tick( World world ) + public void Tick() { if( !IsReadyForNextFrame ) throw new InvalidOperationException(); - Connection.Send( localOrders.Serialize( FrameNumber + FramesAhead ) ); + Connection.Send( localOrders.Serialize( NetFrameNumber + FramesAhead ) ); localOrders.Clear(); var sync = new List(); sync.Add( world.SyncHash() ); - foreach( var order in frameData.OrdersForFrame( world, FrameNumber) ) + foreach( var order in frameData.OrdersForFrame( world, NetFrameNumber) ) { UnitOrders.ProcessOrder( this, world, order.Client, order.Order ); sync.Add( world.SyncHash() ); } - var ss = sync.SerializeSync( FrameNumber ); + var ss = sync.SerializeSync( NetFrameNumber ); Connection.Send( ss ); - syncReport.UpdateSyncReport( world ); + syncReport.UpdateSyncReport(); - CheckSync( world, ss ); + CheckSync( ss ); - ++FrameNumber; + ++NetFrameNumber; } bool disposed; diff --git a/OpenRA.Game/Network/ReplayConnection.cs b/OpenRA.Game/Network/ReplayConnection.cs index 1e42f528ad..b8a73b6710 100755 --- a/OpenRA.Game/Network/ReplayConnection.cs +++ b/OpenRA.Game/Network/ReplayConnection.cs @@ -42,9 +42,6 @@ namespace OpenRA.Network var packetLen = reader.ReadInt32(); var packet = reader.ReadBytes( packetLen ); packetFn( client, packet ); - - if( !Game.orderManager.GameStarted ) - return; } replayStream = null; } diff --git a/OpenRA.Game/Network/SyncReport.cs b/OpenRA.Game/Network/SyncReport.cs index d211014f7b..5d5048e38f 100755 --- a/OpenRA.Game/Network/SyncReport.cs +++ b/OpenRA.Game/Network/SyncReport.cs @@ -9,31 +9,33 @@ namespace OpenRA.Network { class SyncReport { + readonly OrderManager orderManager; const int numSyncReports = 5; Report[] syncReports = new Report[numSyncReports]; int curIndex = 0; - public SyncReport() + public SyncReport( OrderManager orderManager ) { + this.orderManager = orderManager; for (var i = 0; i < numSyncReports; i++) syncReports[i] = new SyncReport.Report(); } - internal void UpdateSyncReport( World world ) + internal void UpdateSyncReport() { if (!Game.Settings.Debug.RecordSyncReports) return; - GenerateSyncReport(world, syncReports[curIndex]); + GenerateSyncReport(syncReports[curIndex]); curIndex = ++curIndex % numSyncReports; } - void GenerateSyncReport(World world, Report report) + void GenerateSyncReport(Report report) { - report.Frame = Game.orderManager.FrameNumber; - report.SyncedRandom = world.SharedRandom.Last; + report.Frame = orderManager.NetFrameNumber; + report.SyncedRandom = orderManager.world.SharedRandom.Last; report.Traits.Clear(); - foreach (var a in world.Queries.WithTraitMultiple()) + foreach (var a in orderManager.world.Queries.WithTraitMultiple()) { var sync = Sync.CalculateSyncHash(a.Trait); if (sync != 0) diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 3e8c63ffa4..d106b5b3da 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -52,10 +52,9 @@ namespace OpenRA.Network if (client != null) { var player = world.FindPlayerByClientId(clientId); - var display = (world.GameHasStarted) ? - player != null && (world.LocalPlayer != null && player.Stances[world.LocalPlayer] == Stance.Ally - || player.WinState == WinState.Lost) : - client == orderManager.LocalClient || (client.Team == orderManager.LocalClient.Team && client.Team != 0); + var display = player != null + && (world.LocalPlayer != null && player.Stances[world.LocalPlayer] == Stance.Ally + || player.WinState == WinState.Lost); if (display) { diff --git a/OpenRA.Game/Sync.cs b/OpenRA.Game/Sync.cs index 63dc9f0ac4..9e502cfcfe 100755 --- a/OpenRA.Game/Sync.cs +++ b/OpenRA.Game/Sync.cs @@ -139,6 +139,7 @@ namespace OpenRA public static T CheckSyncUnchanged( World world, Func fn ) { + if( world == null ) return fn(); int sync = world.SyncHash(); bool prevInUnsyncedCode = inUnsyncedCode; inUnsyncedCode = true; diff --git a/OpenRA.Game/Widgets/ChatEntryWidget.cs b/OpenRA.Game/Widgets/ChatEntryWidget.cs index d162bf1c52..98c04451eb 100644 --- a/OpenRA.Game/Widgets/ChatEntryWidget.cs +++ b/OpenRA.Game/Widgets/ChatEntryWidget.cs @@ -10,6 +10,7 @@ using System.Drawing; using OpenRA.Graphics; +using OpenRA.Network; namespace OpenRA.Widgets { @@ -25,6 +26,13 @@ namespace OpenRA.Widgets bool composing = false; bool teamChat = false; + readonly OrderManager orderManager; + [ObjectCreator.UseCtor] + internal ChatEntryWidget( [ObjectCreator.Param] OrderManager orderManager ) + { + this.orderManager = orderManager; + } + public override void DrawInner( WorldRenderer wr ) { if (composing) @@ -61,7 +69,7 @@ namespace OpenRA.Widgets composing = false; if (content != "") - Game.IssueOrder(teamChat + orderManager.IssueOrder(teamChat ? Order.TeamChat(content) : Order.Chat(content)); content = ""; diff --git a/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs b/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs index ad9a695db8..b1c4ab5949 100644 --- a/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs @@ -45,7 +45,7 @@ namespace OpenRA.Widgets.Delegates () => world.LocalPlayer.PlayerActor.Trait().DisableShroud; devmodeBG.GetWidget("CHECKBOX_SHROUD").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevShroud", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevShroud", world.LocalPlayer.PlayerActor)); return true; }; @@ -53,7 +53,7 @@ namespace OpenRA.Widgets.Delegates () => Game.Settings.Debug.ShowCollisions; devmodeBG.GetWidget("CHECKBOX_UNITDEBUG").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor)); return true; }; @@ -61,13 +61,13 @@ namespace OpenRA.Widgets.Delegates () => world.LocalPlayer.PlayerActor.Trait().PathDebug; devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("GIVE_CASH").OnMouseUp = mi => { - Game.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor)); return true; }; @@ -75,7 +75,7 @@ namespace OpenRA.Widgets.Delegates () => world.LocalPlayer.PlayerActor.Trait().FastBuild; devmodeBG.GetWidget("INSTANT_BUILD").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevFastBuild", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevFastBuild", world.LocalPlayer.PlayerActor)); return true; }; @@ -83,7 +83,7 @@ namespace OpenRA.Widgets.Delegates () => world.LocalPlayer.PlayerActor.Trait().FastCharge; devmodeBG.GetWidget("INSTANT_CHARGE").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevFastCharge", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevFastCharge", world.LocalPlayer.PlayerActor)); return true; }; @@ -91,13 +91,13 @@ namespace OpenRA.Widgets.Delegates () => world.LocalPlayer.PlayerActor.Trait().AllTech; devmodeBG.GetWidget("ENABLE_TECH").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevEnableTech", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevEnableTech", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("GIVE_EXPLORATION").OnMouseUp = mi => { - Game.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor)); return true; }; diff --git a/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs b/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs index 7ab3e71ac4..11ba8edf29 100644 --- a/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs @@ -138,7 +138,7 @@ namespace OpenRA.Widgets.Delegates var nextStance = GetNextStance((Stance)Enum.Parse(typeof(Stance), bw.Text)); - Game.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, + world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, new int2(p.Index, (int)nextStance))); bw.Text = nextStance.ToString(); diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index 6a658caf51..90419959f6 100755 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -52,7 +52,7 @@ namespace OpenRA.Widgets.Delegates if (orderManager.LocalClient.State == Session.ClientState.Ready) return; var owned = orderManager.LobbyInfo.Clients.Any(c => c.SpawnPoint == sp); if (sp == 0 || !owned) - Game.IssueOrder(Order.Command("spawn {0}".F(sp))); + orderManager.IssueOrder(Order.Command("spawn {0}".F(sp))); }; mapPreview.SpawnColors = () => @@ -95,7 +95,7 @@ namespace OpenRA.Widgets.Delegates lockTeamsCheckbox.OnMouseDown = mi => { if (Game.IsHost) - Game.IssueOrder(Order.Command( + orderManager.IssueOrder(Order.Command( "lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams))); return true; }; @@ -106,7 +106,7 @@ namespace OpenRA.Widgets.Delegates mapButton.Visible = false; disconnectButton.Visible = false; lockTeamsCheckbox.Visible = false; - Game.IssueOrder(Order.Command("startgame")); + orderManager.IssueOrder(Order.Command("startgame")); return true; }; startGameButton.IsVisible = () => Game.IsHost; @@ -126,7 +126,7 @@ namespace OpenRA.Widgets.Delegates return true; var order = (teamChat) ? Order.TeamChat(chatTextField.Text) : Order.Chat(chatTextField.Text); - Game.IssueOrder(order); + orderManager.IssueOrder(order); chatTextField.Text = ""; return true; }; @@ -166,7 +166,7 @@ namespace OpenRA.Widgets.Delegates Game.Settings.Player.Color1 = c1; Game.Settings.Player.Color2 = c2; Game.Settings.Save(); - Game.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); + orderManager.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); } void UpdateColorPreview(float hf, float sf, float lf, float r) @@ -190,13 +190,13 @@ namespace OpenRA.Widgets.Delegates hasJoined = true; if (orderManager.LocalClient.Name != Game.Settings.Player.Name) - Game.IssueOrder(Order.Command("name " + Game.Settings.Player.Name)); + orderManager.IssueOrder(Order.Command("name " + Game.Settings.Player.Name)); var c1 = Game.Settings.Player.Color1; var c2 = Game.Settings.Player.Color2; if (orderManager.LocalClient.Color1 != c1 || orderManager.LocalClient.Color2 != c2) - Game.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); + orderManager.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); } void ResetConnectionState( OrderManager orderManager ) @@ -235,14 +235,14 @@ namespace OpenRA.Widgets.Delegates if (s.Closed) { s.Bot = null; - Game.IssueOrder(Order.Command("slot_open " + s.Index)); + orderManager.IssueOrder(Order.Command("slot_open " + s.Index)); } else { if (s.Bot == null) - Game.IssueOrder(Order.Command("slot_bot {0} HackyAI".F(s.Index))); + orderManager.IssueOrder(Order.Command("slot_bot {0} HackyAI".F(s.Index))); else - Game.IssueOrder(Order.Command("slot_close " + s.Index)); + orderManager.IssueOrder(Order.Command("slot_close " + s.Index)); } return true; }; @@ -257,7 +257,7 @@ namespace OpenRA.Widgets.Delegates var join = template.GetWidget("JOIN"); if (join != null) { - join.OnMouseUp = _ => { Game.IssueOrder(Order.Command("slot " + s.Index)); return true; }; + join.OnMouseUp = _ => { orderManager.IssueOrder(Order.Command("slot " + s.Index)); return true; }; join.IsVisible = () => !s.Closed && s.Bot == null; } } @@ -276,7 +276,7 @@ namespace OpenRA.Widgets.Delegates if (name.Text == c.Name) return true; - Game.IssueOrder(Order.Command("name " + name.Text)); + orderManager.IssueOrder(Order.Command("name " + name.Text)); Game.Settings.Player.Name = name.Text; Game.Settings.Save(); return true; @@ -372,14 +372,14 @@ namespace OpenRA.Widgets.Delegates if (nextCountry == null) nextCountry = countries.First(); - Game.IssueOrder(Order.Command("race " + nextCountry)); + orderManager.IssueOrder(Order.Command("race " + nextCountry)); return true; } bool CycleReady(MouseInput mi) { - Game.IssueOrder(Order.Command("ready")); + orderManager.IssueOrder(Order.Command("ready")); return true; } @@ -388,7 +388,7 @@ namespace OpenRA.Widgets.Delegates var d = (mi.Button == MouseButton.Left) ? +1 : Map.PlayerCount; var newIndex = (orderManager.LocalClient.Team + d) % (Map.PlayerCount + 1); - Game.IssueOrder( + orderManager.IssueOrder( Order.Command("team " + newIndex)); return true; } diff --git a/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs b/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs index 80e99a2e48..642e1aa8f8 100644 --- a/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs @@ -11,6 +11,7 @@ using System.Drawing; using System.Linq; using OpenRA.FileFormats; +using OpenRA.Network; namespace OpenRA.Widgets.Delegates { @@ -19,7 +20,7 @@ namespace OpenRA.Widgets.Delegates MapStub Map = null; [ObjectCreator.UseCtor] - public MapChooserDelegate( [ObjectCreator.Param( "widget" )] Widget bg ) + internal MapChooserDelegate( [ObjectCreator.Param( "widget" )] Widget bg, [ObjectCreator.Param] OrderManager orderManager ) { bg.SpecialOneArg = (map) => RefreshMapList(map); var ml = bg.GetWidget("MAP_LIST"); @@ -32,7 +33,7 @@ namespace OpenRA.Widgets.Delegates bg.GetWidget("BUTTON_OK").OnMouseUp = mi => { - Game.IssueOrder(Order.Command("map " + Map.Uid)); + orderManager.IssueOrder(Order.Command("map " + Map.Uid)); Widget.CloseWindow(); return true; }; diff --git a/OpenRA.Game/Widgets/Delegates/PerfDebugDelegate.cs b/OpenRA.Game/Widgets/Delegates/PerfDebugDelegate.cs index beaf16ced6..36459c9871 100644 --- a/OpenRA.Game/Widgets/Delegates/PerfDebugDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/PerfDebugDelegate.cs @@ -24,7 +24,7 @@ namespace OpenRA.Widgets.Delegates var perfText = perfRoot.GetWidget("TEXT"); perfText.GetText = () => "Render {0} ({5}={2:F1} ms)\nTick {4} ({3:F1} ms)".F( Game.RenderFrame, - Game.orderManager.FrameNumber, + Game.orderManager.NetFrameNumber, PerfHistory.items["render"].LastValue, PerfHistory.items["tick_time"].LastValue, Game.LocalTick, diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index 3b4e77f0d7..99a841610f 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -90,8 +90,8 @@ namespace OpenRA.Widgets { if (world.OrderGenerator == null) return; - var orders = world.OrderGenerator.Order(world, xy.ToInt2(), mi).ToArray(); - Game.orderManager.IssueOrders( orders ); + var orders = world.OrderGenerator.Order(world, xy.ToInt2(), mi).ToArray(); + orders.Do( o => world.IssueOrder( o ) ); // Find an actor with a phrase to say var done = false; @@ -113,9 +113,6 @@ namespace OpenRA.Widgets { return Sync.CheckSyncUnchanged( world, () => { - if (!world.GameHasStarted) - return "default"; - var mi = new MouseInput { Location = pos, diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index f869eaa28e..85e9433ce5 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -38,8 +38,6 @@ namespace OpenRA public void AddPlayer(Player p) { players[p.Index] = p; } - public bool GameHasStarted { get { return Game.orderManager.GameStarted; } } - int localPlayerIndex; public Player LocalPlayer { @@ -57,6 +55,8 @@ namespace OpenRA public readonly Map Map; public readonly TileSet TileSet; + public void IssueOrder( Order o ) { orderManager.IssueOrder( o ); } /* avoid exposing the OM to mod code */ + IOrderGenerator orderGenerator_; public IOrderGenerator OrderGenerator { diff --git a/OpenRA.Mods.RA/HackyAI.cs b/OpenRA.Mods.RA/HackyAI.cs index b21337173b..75a8ccc88b 100644 --- a/OpenRA.Mods.RA/HackyAI.cs +++ b/OpenRA.Mods.RA/HackyAI.cs @@ -299,7 +299,7 @@ namespace OpenRA.Mods.RA int2 newRallyPoint = ChooseRallyLocationNear(a.Location); newRallyPoint.X += 4; newRallyPoint.Y += 4; - Game.IssueOrder(new Order("SetRallyPoint", a, newRallyPoint)); + world.IssueOrder(new Order("SetRallyPoint", a, newRallyPoint)); } } @@ -332,7 +332,7 @@ namespace OpenRA.Mods.RA range = Math.Max(range, loopCount / 2); if (loopCount > 10) return false; } while (!a.Trait().CanEnterCell(xy) && xy != a.Location); - Game.IssueOrder(new Order("Move", a, xy)); + world.IssueOrder(new Order("Move", a, xy)); return true; } @@ -345,7 +345,7 @@ namespace OpenRA.Mods.RA if (mcv != null) { baseCenter = mcv.Location; - Game.IssueOrder(new Order("DeployTransform", mcv)); + world.IssueOrder(new Order("DeployTransform", mcv)); } else Game.Debug("AI: Can't find the MCV."); @@ -380,7 +380,7 @@ namespace OpenRA.Mods.RA if (found == true) { - Game.IssueOrder(Order.StartProduction(queue.self, unit.Name, 1)); + world.IssueOrder(Order.StartProduction(queue.self, unit.Name, 1)); } } } @@ -411,7 +411,7 @@ namespace OpenRA.Mods.RA { Game.Debug("AI: Starting production of {0}".F(item.Name)); bstate = BuildState.WaitForProduction; - Game.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); + world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); } } break; @@ -420,7 +420,7 @@ namespace OpenRA.Mods.RA if (currentBuilding == null) return; /* let it happen.. */ else if (currentBuilding.Paused) - Game.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); + world.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); else if (currentBuilding.Done) { bstate = BuildState.WaitForFeedback; @@ -431,11 +431,11 @@ namespace OpenRA.Mods.RA if (location == null) { Game.Debug("AI: Nowhere to place {0}".F(currentBuilding.Item)); - Game.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); + world.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); } else { - Game.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item)); + world.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item)); } } break; @@ -473,7 +473,7 @@ namespace OpenRA.Mods.RA { Game.Debug("AI: Starting production of {0}".F(item.Name)); dstate = BuildState.WaitForProduction; - Game.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); + world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); } } break; @@ -482,7 +482,7 @@ namespace OpenRA.Mods.RA if (currentBuilding == null) return; /* let it happen.. */ else if (currentBuilding.Paused) - Game.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); + world.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); else if (currentBuilding.Done) { dstate = BuildState.WaitForFeedback; @@ -493,11 +493,11 @@ namespace OpenRA.Mods.RA if (location == null) { Game.Debug("AI: Nowhere to place {0}".F(currentBuilding.Item)); - Game.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); + world.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); } else { - Game.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item)); + world.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item)); } } break; diff --git a/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs b/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs index 925ac6760f..a293c6c3a2 100755 --- a/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs +++ b/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA protected override void OnActivate() { - Game.IssueOrder(new Order("SonarPulse", Owner.PlayerActor)); + Self.World.IssueOrder(new Order("SonarPulse", Owner.PlayerActor)); } public void ResolveOrder(Actor self, Order order) diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 22b1082d85..2ab7bf5d7b 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -347,7 +347,7 @@ namespace OpenRA.Mods.RA.Widgets if (producing.Paused) { - Game.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, false)); + world.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, false)); return; } } @@ -368,12 +368,12 @@ namespace OpenRA.Mods.RA.Widgets { numberToCancel = -1; //cancel all } - Game.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel)); + world.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel)); } else { Sound.Play(eva.OnHoldAudio); - Game.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, true)); + world.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, true)); } } } @@ -386,7 +386,7 @@ namespace OpenRA.Mods.RA.Widgets Sound.Play(unit.Traits.Contains() ? eva.BuildingSelectAudio : eva.UnitSelectAudio); - Game.IssueOrder(Order.StartProduction(CurrentQueue.self, item, + world.IssueOrder(Order.StartProduction(CurrentQueue.self, item, Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1)); } diff --git a/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs index b5563c3807..7d44680dd1 100755 --- a/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates optionsBG.GetWidget("SURRENDER").OnMouseUp = mi => { - Game.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor)); + world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor)); return true; };