diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 7513a2f51d..1b7bc12b36 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -190,8 +190,12 @@ namespace OpenRa.Game foreach (var player in players.Values) player.Tick(); } - else if (orderManager.FrameNumber == 0) - lastTime = Environment.TickCount; + else + orderManager.Tick(); + // if (orderManager.FrameNumber == 0) + //{ + // lastTime = Environment.TickCount; + //} } PerfHistory.Tick(); diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 942c504787..5adc13624c 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -124,6 +124,15 @@ namespace OpenRa.Game }); } + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + + /* hack hack hack */ + if (e.KeyCode == Keys.F8 && !Game.orderManager.GameStarted) + Game.orderManager.StartGame(); + } + protected override void OnKeyPress(KeyPressEventArgs e) { base.OnKeyPress(e); diff --git a/OpenRa.Game/Order.cs b/OpenRa.Game/Order.cs index 24c1440c93..c9f1fd8a22 100644 --- a/OpenRa.Game/Order.cs +++ b/OpenRa.Game/Order.cs @@ -15,8 +15,10 @@ namespace OpenRa.Game public readonly Actor TargetActor; public readonly int2 TargetLocation; public readonly string TargetString; + public bool IsImmediate; - Order(Player player, string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString) + Order(Player player, string orderString, Actor subject, + Actor targetActor, int2 targetLocation, string targetString) { this.Player = player; this.OrderString = orderString; @@ -71,7 +73,7 @@ namespace OpenRa.Game targetString = r.ReadString(); var player = Game.players.Where( x => x.Value.Index == playerID ).First().Value; - return new Order( player, order, subject, targetActor, targetLocation, targetString ); + return new Order( player, order, subject, targetActor, targetLocation, targetString); } default: throw new NotImplementedException(); @@ -88,7 +90,8 @@ namespace OpenRa.Game // Now that Orders are resolved by individual Actors, these are weird; you unpack orders manually, but not pack them. public static Order Chat(Player subject, string text) { - return new Order(subject, "Chat", null, null, int2.Zero, text); + return new Order(subject, "Chat", null, null, int2.Zero, text) + { IsImmediate = true }; } public static Order Attack(Actor subject, Actor target) diff --git a/OpenRa.Game/OrderManager.cs b/OpenRa.Game/OrderManager.cs index 433e74659e..bdb8f37f02 100755 --- a/OpenRa.Game/OrderManager.cs +++ b/OpenRa.Game/OrderManager.cs @@ -11,19 +11,25 @@ namespace OpenRa.Game { Stream savingReplay; List sources; - int frameNumber = 1; + int frameNumber = 0; const int FramesAhead = 3; + public bool GameStarted { get { return frameNumber != 0; } } + + public void StartGame() + { + frameNumber = 1; + foreach (var p in this.sources) + for (int i = frameNumber; i <= FramesAhead; i++) + p.SendLocalOrders(i, new List()); + } + public int FrameNumber { get { return frameNumber; } } public OrderManager( IEnumerable sources ) { this.sources = sources.ToList(); - - foreach( var p in this.sources ) - for( int i = 1 ; i <= FramesAhead ; i++ ) - p.SendLocalOrders( i, new List() ); } public OrderManager( IEnumerable sources, string replayFilename ) @@ -57,7 +63,9 @@ namespace OpenRa.Game if( savingReplay != null ) savingReplay.WriteFrameData( allOrders, frameNumber ); - ++frameNumber; + if (frameNumber != 0) + ++frameNumber; /* game hasnt started yet.. */ + // 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" ); @@ -80,6 +88,8 @@ namespace OpenRa.Game public List OrdersForFrame( int currentFrame ) { // TODO: prune `orders` based on currentFrame. + if (!orders.ContainsKey(currentFrame)) + return new List(); return orders[ currentFrame ]; } @@ -131,7 +141,7 @@ namespace OpenRa.Game class NetworkOrderSource : OrderSource { - int nextLocalOrderFrame = 1; + // int nextLocalOrderFrame = 1; TcpClient socket; Dictionary> orderBuffers = new Dictionary>(); @@ -183,10 +193,13 @@ namespace OpenRa.Game public void SendLocalOrders( int localFrame, List localOrders ) { - if( nextLocalOrderFrame != localFrame ) - throw new InvalidOperationException( "Attempted time-travel in NetworkOrderSource.SendLocalOrders()" ); +// if( nextLocalOrderFrame != localFrame ) +// throw new InvalidOperationException( "Attempted time-travel in NetworkOrderSource.SendLocalOrders()" ); - socket.GetStream().WriteFrameData( localOrders, nextLocalOrderFrame++ ); + socket.GetStream().WriteFrameData( + localOrders.Where(o => o.IsImmediate), 0); + socket.GetStream().WriteFrameData( + localOrders.Where( o => !o.IsImmediate ), localFrame );//nextLocalOrderFrame++ ); } public bool IsReadyForFrame( int frameNumber ) @@ -206,7 +219,7 @@ namespace OpenRa.Game static class OrderIO { - public static MemoryStream ToMemoryStream( this List orders, int nextLocalOrderFrame ) + public static MemoryStream ToMemoryStream( this IEnumerable orders, int nextLocalOrderFrame ) { var ms = new MemoryStream(); ms.Write( BitConverter.GetBytes( nextLocalOrderFrame ) ); @@ -215,7 +228,7 @@ namespace OpenRa.Game return ms; } - public static void WriteFrameData( this Stream s, List orders, int frameNumber ) + public static void WriteFrameData( this Stream s, IEnumerable orders, int frameNumber ) { var ms = orders.ToMemoryStream( frameNumber ); s.Write( BitConverter.GetBytes( (int)ms.Length ) );