diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 3f123eccd3..8ef5a05701 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -75,13 +75,6 @@ namespace OpenRA ConnectionStateChanged( orderManager ); } - static int lastTime = Environment.TickCount; - - static void ResetTimer() - { - lastTime = Environment.TickCount; - } - internal static int RenderFrame = 0; internal static int LocalTick { get { return orderManager.LocalFrameNumber; } } const int NetTickScale = 3; // 120ms net tick for 40ms local tick @@ -98,42 +91,9 @@ namespace OpenRA ConnectionStateChanged( orderManager ); } - int t = Environment.TickCount; - int dt = t - lastTime; - if (dt >= Settings.Game.Timestep) - { - using (new PerfSample("tick_time")) - { - lastTime += Settings.Game.Timestep; - Widget.DoTick(); - var world = orderManager.world; - if( orderManager.GameStarted && world.LocalPlayer != null ) - ++Viewport.TicksSinceLastMove; - Sound.Tick(); - Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } ); - - var isNetTick = LocalTick % NetTickScale == 0; - - if (!isNetTick || orderManager.IsReadyForNextFrame) - { - ++orderManager.LocalFrameNumber; - - Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local"); - - if (isNetTick) orderManager.Tick(); - - world.OrderGenerator.Tick(world); - world.Selection.Tick(world); - world.Tick(); - worldRenderer.Tick(); - - PerfHistory.Tick(); - } - else - if (orderManager.NetFrameNumber == 0) - lastTime = Environment.TickCount; - } - } + Tick( orderManager ); + if( orderManager.world != worldRenderer.world ) + Tick( worldRenderer.world.orderManager ); using (new PerfSample("render")) { @@ -150,6 +110,44 @@ namespace OpenRA MasterServerQuery.Tick(); } + private static void Tick( OrderManager orderManager ) + { + int t = Environment.TickCount; + int dt = t - orderManager.LastTickTime; + if (dt >= Settings.Game.Timestep) + using( new PerfSample( "tick_time" ) ) + { + orderManager.LastTickTime += Settings.Game.Timestep; + Widget.DoTick(); + var world = orderManager.world; + if( orderManager.GameStarted && world.LocalPlayer != null ) + ++Viewport.TicksSinceLastMove; + Sound.Tick(); + Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } ); + + var isNetTick = LocalTick % NetTickScale == 0; + + if( !isNetTick || orderManager.IsReadyForNextFrame ) + { + ++orderManager.LocalFrameNumber; + + Log.Write( "debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local" ); + + if( isNetTick ) orderManager.Tick(); + + world.OrderGenerator.Tick( world ); + world.Selection.Tick( world ); + world.Tick(); + worldRenderer.Tick(); + + PerfHistory.Tick(); + } + else + if( orderManager.NetFrameNumber == 0 ) + orderManager.LastTickTime = Environment.TickCount; + } + } + internal static event Action LobbyInfoChanged = () => { }; internal static void SyncLobbyInfo() @@ -288,7 +286,7 @@ namespace OpenRA modData.WidgetLoader.LoadWidget( new Dictionary(), Widget.RootWidget, "PERF_BG" ); Widget.OpenWindow("MAINMENU_BG"); - ResetTimer(); + Game.orderManager.LastTickTime = Environment.TickCount; } static bool quit; diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 5f8458a53e..f5b4828603 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -19,7 +19,7 @@ namespace OpenRA.Graphics { public class WorldRenderer { - readonly World world; + public readonly World world; internal readonly TerrainRenderer terrainRenderer; public readonly UiOverlay uiOverlay; internal readonly HardwarePalette palette; diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index 35340178e2..31758deaa1 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -32,6 +32,8 @@ namespace OpenRA.Network public int LocalFrameNumber; public int FramesAhead = 0; + public int LastTickTime = Environment.TickCount; + public bool GameStarted { get { return NetFrameNumber != 0; } } public IConnection Connection { get; private set; } diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index 90419959f6..28904b554a 100755 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -76,7 +76,7 @@ namespace OpenRA.Widgets.Delegates var mapButton = lobby.GetWidget("CHANGEMAP_BUTTON"); mapButton.OnMouseUp = mi => { - Widget.OpenWindow("MAP_CHOOSER").SpecialOneArg(MapUid); // WTF + Widget.OpenWindow( "MAP_CHOOSER", new Dictionary { { "orderManager", orderManager }, { "mapName", MapUid } } ); return true; }; diff --git a/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs b/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs index 642e1aa8f8..67d2db62db 100644 --- a/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs @@ -20,11 +20,17 @@ namespace OpenRA.Widgets.Delegates MapStub Map = null; [ObjectCreator.UseCtor] - internal MapChooserDelegate( [ObjectCreator.Param( "widget" )] Widget bg, [ObjectCreator.Param] OrderManager orderManager ) + internal MapChooserDelegate( + [ObjectCreator.Param( "widget" )] Widget bg, + [ObjectCreator.Param] OrderManager orderManager, + [ObjectCreator.Param] string mapName ) { - bg.SpecialOneArg = (map) => RefreshMapList(map); - var ml = bg.GetWidget("MAP_LIST"); + if (mapName != null) + Map = Game.modData.AvailableMaps[mapName]; + else + Map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; + var ml = bg.GetWidget("MAP_LIST"); bg.GetWidget("MAPCHOOSER_MAP_PREVIEW").Map = () => Map; bg.GetWidget("CURMAP_TITLE").GetText = () => Map.Title; bg.GetWidget("CURMAP_SIZE").GetText = () => "{0}x{1}".F(Map.Width, Map.Height); @@ -67,15 +73,5 @@ namespace OpenRA.Widgets.Delegates ml.ContentHeight += template.Bounds.Height; } } - - public void RefreshMapList(object uidobj) - { - // Set the default selected map - var uid = uidobj as string; - if (uid != null) - Map = Game.modData.AvailableMaps[uid]; - else - Map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; - } } } diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index 23d9de41f6..07fec84d11 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -39,7 +39,6 @@ namespace OpenRA.Widgets public static Stack WindowList = new Stack(); // Common Funcs that most widgets will want - public Action SpecialOneArg = (arg) => {}; public Func OnMouseDown = mi => false; public Func OnMouseUp = mi => false; public Func OnMouseMove = mi => false; diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 85e9433ce5..82cd774d84 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -29,7 +29,7 @@ namespace OpenRA List effects = new List(); Queue> frameEndActions = new Queue>(); - readonly OrderManager orderManager; + internal readonly OrderManager orderManager; public Session LobbyInfo { get { return orderManager.LobbyInfo; } } public XRandom SharedRandom = new XRandom(0);