diff --git a/OpenRA.Server/Server.cs b/OpenRA.Server/Server.cs index defb7c98b2..9fbc7dd2fa 100644 --- a/OpenRA.Server/Server.cs +++ b/OpenRA.Server/Server.cs @@ -149,6 +149,9 @@ namespace OpenRA.Server case ReceiveState.Data: { + if (bytes.Length > 0) + Console.WriteLine("{0} bytes", bytes.Length); + DispatchOrders(conn, conn.Frame, bytes); conn.ExpectLength = 8; conn.State = ReceiveState.Header; @@ -203,10 +206,16 @@ namespace OpenRA.Server case "ToggleReady": conn.IsReady ^= true; + Console.WriteLine("Player @{0} is {1}", + conn.socket.RemoteEndPoint, conn.IsReady ? "ready" : "not ready"); + // start the game if everyone is ready. if (conns.All(c => c.IsReady)) - DispatchOrders(null, 0, + { + Console.WriteLine("All players are ready. Starting the game!"); + DispatchOrders(null, 0, new ServerOrder(0, "StartGame", "").Serialize()); + } break; } } diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index f5b7db954c..82b4f4f351 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -33,11 +33,24 @@ namespace OpenRa.Game public void AddOrder(Order o) { recentOrders.Add(o); } - public List GetRecentOrders() + public List GetRecentOrders( bool imm ) { - var ret = recentOrders; - recentOrders = new List(); - return ret; + if (imm) + { + var result = recentOrders.Where(o => o.IsImmediate).ToList(); + recentOrders.RemoveAll(o => o.IsImmediate); + return result; + } + else + { + var result = recentOrders.Where(o => !o.IsImmediate).ToList(); + recentOrders.RemoveAll(o => !o.IsImmediate); + return result; + } + + //var ret = recentOrders; + //recentOrders = new List(); + //return ret; } static string GetVoiceSuffix(Actor unit) diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 1842965afc..630f191d8c 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -172,9 +172,11 @@ namespace OpenRa.Game { lastTime += timestep; + orderManager.TickImmediate(); + if (orderManager.IsReadyForNextFrame) { - orderManager.Tick(false); + orderManager.Tick(); if (controller.orderGenerator != null) controller.orderGenerator.Tick(); @@ -191,11 +193,8 @@ namespace OpenRa.Game player.Tick(); } else - orderManager.Tick(true); - // if (orderManager.FrameNumber == 0) - //{ - // lastTime = Environment.TickCount; - //} + if (orderManager.FrameNumber == 0) + lastTime = Environment.TickCount; } PerfHistory.Tick(); diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 79a0289a23..aea92176a8 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -134,7 +134,8 @@ namespace OpenRa.Game Game.LocalPlayer.IsReady ^= true; Game.controller.AddOrder( new Order(Game.LocalPlayer, - "ToggleReady", null, null, int2.Zero, "") { IsImmediate = true }); + "ToggleReady", null, null, int2.Zero, + Game.LocalPlayer.IsReady ? "ready" : "not ready") { IsImmediate = true }); } } diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 35d9b32a23..8b8cb29a1b 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -30,6 +30,8 @@ false true v3.5 + + true diff --git a/OpenRa.Game/OrderManager.cs b/OpenRa.Game/OrderManager.cs index 31af937afe..3b82e402d2 100755 --- a/OpenRa.Game/OrderManager.cs +++ b/OpenRa.Game/OrderManager.cs @@ -51,28 +51,38 @@ namespace OpenRa.Game } } - public void Tick( bool immediateOnly ) + public void TickImmediate() { - var localOrders = Game.controller.GetRecentOrders(); + var localOrders = Game.controller.GetRecentOrders(true); + if (localOrders.Count > 0) + foreach (var p in sources) + p.SendLocalOrders(0, localOrders); + + var immOrders = sources.SelectMany( p => p.OrdersForFrame(0) ).OrderBy(o => o.Player.Index).ToList(); + foreach (var order in immOrders) + UnitOrders.ProcessOrder(order); + } + + public void Tick() + { + var localOrders = Game.controller.GetRecentOrders(false); foreach( var p in sources ) p.SendLocalOrders( frameNumber + FramesAhead, localOrders ); var allOrders = sources.SelectMany(p => p.OrdersForFrame(frameNumber)).OrderBy(o => o.Player.Index).ToList(); + foreach (var order in allOrders) UnitOrders.ProcessOrder(order); if( savingReplay != null ) savingReplay.WriteFrameData( allOrders, frameNumber ); - if (frameNumber != 0 && !immediateOnly) - ++frameNumber; /* game hasnt started yet.. */ + ++frameNumber; // sanity check on the framenumber. This is 2^31 frames maximum, or multiple *years* at 40ms/frame. if( ( frameNumber & 0x80000000 ) != 0 ) throw new InvalidOperationException( "(OrderManager) Frame number too large" ); - - return; } } @@ -97,6 +107,7 @@ namespace OpenRa.Game public void SendLocalOrders( int localFrame, List localOrders ) { + if (localFrame == 0) return; orders[ localFrame ] = localOrders; } @@ -189,18 +200,12 @@ namespace OpenRa.Game public List OrdersForFrame( int currentFrame ) { var orderData = ExtractOrders(currentFrame); - if (currentFrame != 0) - orderData.AddRange(ExtractOrders(0)); - return orderData.SelectMany(a => a.ToOrderList()).ToList(); } public void SendLocalOrders( int localFrame, List localOrders ) { - socket.GetStream().WriteFrameData( - localOrders.Where(o => o.IsImmediate), 0); - socket.GetStream().WriteFrameData( - localOrders.Where( o => !o.IsImmediate ), localFrame ); + socket.GetStream().WriteFrameData( localOrders, localFrame ); } public bool IsReadyForFrame( int frameNumber ) diff --git a/OpenRa.Game/UnitOrders.cs b/OpenRa.Game/UnitOrders.cs index f6be083700..f4e2d46113 100755 --- a/OpenRa.Game/UnitOrders.cs +++ b/OpenRa.Game/UnitOrders.cs @@ -99,7 +99,7 @@ namespace OpenRa.Game } case "ToggleReady": { - Game.chat.AddLine(Pair.New(order.Player.PlayerName, "toggled ready status" )); + Game.chat.AddLine(Pair.New(order.Player.PlayerName, "is " + order.TargetString )); break; } case "AssignPlayer":