From b99e6647265c852ce5374c417732259a1fd4063e Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Thu, 10 May 2012 19:54:57 +0200 Subject: [PATCH 1/7] A Game-tick can execute viewport.Tick itself, removed this dependency from World. --- OpenRA.Game/Game.cs | 2 ++ OpenRA.Game/World.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index deed94a085..4df9808aa5 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -188,6 +188,8 @@ namespace OpenRA else if (orderManager.NetFrameNumber == 0) orderManager.LastTickTime = Environment.TickCount; + + viewport.Tick(); } } } diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index e2ec53704c..e4c6dc4b50 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -183,7 +183,7 @@ namespace OpenRA while (frameEndActions.Count != 0) frameEndActions.Dequeue()(this); - Game.viewport.Tick(); + } public IEnumerable Actors { get { return actors; } } From a07697be035330bb1bec9ebaff2d00e4e399e8b4 Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 16 May 2012 17:35:10 +0200 Subject: [PATCH 2/7] Pause the game option. Game is paused when PAUSE on the keyboard has been hit. It can also be unpaused this way. --- OpenRA.Game/Game.cs | 2 +- OpenRA.Game/Network/Order.cs | 11 +++++++++++ OpenRA.Game/Network/OrderManager.cs | 1 + OpenRA.Game/Network/UnitOrders.cs | 6 ++++++ OpenRA.Game/Server/Server.cs | 17 +++++++++++++---- .../Widgets/WorldInteractionControllerWidget.cs | 4 ++++ 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 4df9808aa5..41638ce1b4 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -166,7 +166,7 @@ namespace OpenRA { var isNetTick = LocalTick % NetTickScale == 0; - if (!isNetTick || orderManager.IsReadyForNextFrame) + if ((!isNetTick || orderManager.IsReadyForNextFrame) && !orderManager.GamePaused ) { ++orderManager.LocalFrameNumber; diff --git a/OpenRA.Game/Network/Order.cs b/OpenRA.Game/Network/Order.cs index b81a9f2731..7f2bb449b7 100755 --- a/OpenRA.Game/Network/Order.cs +++ b/OpenRA.Game/Network/Order.cs @@ -199,7 +199,18 @@ namespace OpenRA { return new Order("HandshakeResponse", null, false) { IsImmediate = true, TargetString = text }; } + + public static Order PauseRequest() + { + return new Order("PauseRequest", null, false) { IsImmediate = true, TargetString="" }; //TODO: targetbool? + } + + public static Order PauseGame() + { + return new Order("PauseGame", null, false) { IsImmediate = true, TargetString=""}; //TODO: targetbool? + } + public static Order Command(string text) { return new Order("Command", null, false) { IsImmediate = true, TargetString = text }; diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index 708caf08fd..8d16467ad1 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -36,6 +36,7 @@ namespace OpenRA.Network public int LastTickTime = Environment.TickCount; public bool GameStarted { get { return NetFrameNumber != 0; } } + public bool GamePaused {get; set;} public IConnection Connection { get; private set; } public readonly int SyncHeaderSize = 9; diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 92f3fb3e93..36c18f1eab 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -94,6 +94,12 @@ namespace OpenRA.Network Game.StartGame(orderManager.LobbyInfo.GlobalSettings.Map, false); break; } + + case "PauseGame": + { + orderManager.GamePaused = !orderManager.GamePaused; + break; + } case "HandshakeRequest": { diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index e50101bb5b..c5cd929119 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -332,6 +332,9 @@ namespace OpenRA.Server void InterpretServerOrder(Connection conn, ServerOrder so) { + var fromClient = GetClient(conn); + var fromIndex = fromClient != null ? fromClient.Index : 0; + switch (so.Name) { case "Command": @@ -347,17 +350,23 @@ namespace OpenRA.Server } break; + case "HandshakeResponse": ValidateClient(conn, so.Data); break; + case "Chat": case "TeamChat": - var fromClient = GetClient(conn); - var fromIndex = fromClient != null ? fromClient.Index : 0; - foreach (var c in conns.Except(conn).ToArray()) DispatchOrdersToClient(c, fromIndex, 0, so.Serialize()); - break; + break; + + case "PauseRequest": + foreach (var c in conns.ToArray()) + { var x = Order.PauseGame(); + DispatchOrdersToClient(c, fromIndex, 0, x.Serialize()); + } + break; } } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index accef80e75..bcdc813434 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -148,6 +148,10 @@ namespace OpenRA.Widgets world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers); return true; } + else if(e.KeyName == "pause") + { + world.IssueOrder(Order.PauseRequest()); + } bool handled = false; From 7e1986ecbcbf9395e645e29b39f3da097f3e62ba Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 16 May 2012 19:04:43 +0200 Subject: [PATCH 3/7] Timer shows text "(paused)" when game is in pause. --- OpenRA.Game/Widgets/TimerWidget.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenRA.Game/Widgets/TimerWidget.cs b/OpenRA.Game/Widgets/TimerWidget.cs index 420352d896..d0b7e419be 100644 --- a/OpenRA.Game/Widgets/TimerWidget.cs +++ b/OpenRA.Game/Widgets/TimerWidget.cs @@ -16,12 +16,18 @@ namespace OpenRA.Widgets { public override void Draw() { - var s = WidgetUtils.FormatTime(Game.LocalTick); var font = Game.Renderer.Fonts["Title"]; var rb = RenderBounds; + + var s = WidgetUtils.FormatTime(Game.LocalTick); var pos = new float2(rb.Left - font.Measure(s).X / 2, rb.Top); + var s_paused = (Game.orderManager.GamePaused ? "\n (paused)" : ""); + var pos_paused = new float2(rb.Left - font.Measure(s_paused).X / 2, rb.Top+1); + font.DrawTextWithContrast(s, pos, Color.White, Color.Black, 1); + font.DrawTextWithContrast(s_paused, pos_paused, Color.White, Color.Black, 1); + } } } From ae94d7ecc7603e8388c761a0836c446ba39a0330 Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 16 May 2012 19:11:46 +0200 Subject: [PATCH 4/7] Chat-text displayed when the game is paused and unpaused. : The game is (un-)paused by --- OpenRA.Game/Network/UnitOrders.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 36c18f1eab..7c7a844f61 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -96,8 +96,21 @@ namespace OpenRA.Network } case "PauseGame": - { - orderManager.GamePaused = !orderManager.GamePaused; + { + if(clientId != null) + { + var client = orderManager.LobbyInfo.ClientWithIndex(clientId); + + orderManager.GamePaused = !orderManager.GamePaused; + if(orderManager.GamePaused) + { + Game.AddChatLine(Color.White, "", "The game is paused by "+client.Name); + } + else + { + Game.AddChatLine(Color.White, "", "The game is un-paused by "+client.Name); + } + } break; } From 8f981977e0eafcb3fac64f49c2dc4e00b3df1f38 Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 6 Jun 2012 10:47:13 +0200 Subject: [PATCH 5/7] TimeWidget does not collide anymore with koth layout. Screen resolution should be 1024x786+ --- OpenRA.Game/Widgets/TimerWidget.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/OpenRA.Game/Widgets/TimerWidget.cs b/OpenRA.Game/Widgets/TimerWidget.cs index d0b7e419be..b2f5bfb2ba 100644 --- a/OpenRA.Game/Widgets/TimerWidget.cs +++ b/OpenRA.Game/Widgets/TimerWidget.cs @@ -19,15 +19,9 @@ namespace OpenRA.Widgets var font = Game.Renderer.Fonts["Title"]; var rb = RenderBounds; - var s = WidgetUtils.FormatTime(Game.LocalTick); + var s = WidgetUtils.FormatTime(Game.LocalTick) + (Game.orderManager.GamePaused?" (paused)":""); var pos = new float2(rb.Left - font.Measure(s).X / 2, rb.Top); - - var s_paused = (Game.orderManager.GamePaused ? "\n (paused)" : ""); - var pos_paused = new float2(rb.Left - font.Measure(s_paused).X / 2, rb.Top+1); - font.DrawTextWithContrast(s, pos, Color.White, Color.Black, 1); - font.DrawTextWithContrast(s_paused, pos_paused, Color.White, Color.Black, 1); - } } } From 8ad4e0865164241a179a263093c93a6dce85e420 Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 6 Jun 2012 10:54:21 +0200 Subject: [PATCH 6/7] Unit order client != null check fixed (int != null -> always true!) . Removed if-else branch in favour of sugar construct a?b:c. Note: One should (at least) consider to move var client = ... to the start of the switch construct. 4 branches of this switch are using this. (DRY) --- OpenRA.Game/Network/UnitOrders.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 7c7a844f61..a7e1d9c730 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -97,19 +97,13 @@ namespace OpenRA.Network case "PauseGame": { - if(clientId != null) + var client = orderManager.LobbyInfo.ClientWithIndex(clientId); + + if(client != null) { - var client = orderManager.LobbyInfo.ClientWithIndex(clientId); - orderManager.GamePaused = !orderManager.GamePaused; - if(orderManager.GamePaused) - { - Game.AddChatLine(Color.White, "", "The game is paused by "+client.Name); - } - else - { - Game.AddChatLine(Color.White, "", "The game is un-paused by "+client.Name); - } + var pausetext = "The game is {0} by {1}".F( orderManager.GamePaused ? "paused" : "un-paused", client.Name ); + Game.AddChatLine(Color.White, "", pausetext); } break; } From 84124de79de169cb7890339ce9ae56354a487dca Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 6 Jun 2012 11:22:46 +0200 Subject: [PATCH 7/7] Game can now be paused by pressing f3 as well. --- OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index bcdc813434..29721ccaa2 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -148,7 +148,7 @@ namespace OpenRA.Widgets world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers); return true; } - else if(e.KeyName == "pause") + else if(e.KeyName == "pause" || e.KeyName == "f3") { world.IssueOrder(Order.PauseRequest()); }