diff --git a/OpenRa.Game/OrderManager.cs b/OpenRa.Game/OrderManager.cs new file mode 100755 index 0000000000..e7b9bb83f7 --- /dev/null +++ b/OpenRa.Game/OrderManager.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Net; +using IjwFramework.Types; + +namespace OpenRa.Game +{ + class OrderManager + { + BinaryWriter savingReplay; + List players; + int frameNumber = 0; + + public OrderManager( IEnumerable players ) + { + this.players = players.ToList(); + } + + public OrderManager( IEnumerable players, string replayFilename ) + : this( players ) + { + savingReplay = new BinaryWriter( new FileStream( replayFilename, FileMode.Create ) ); + } + + public void Tick() + { + var localOrders = Game.controller.GetRecentOrders(); + foreach( var p in players ) + p.Tick( localOrders ); + + if( savingReplay != null ) + savingReplay.Write( frameNumber ); + + foreach( var p in players ) + { + foreach( var order in p.OrdersForFrame( frameNumber ) ) + { + UnitOrders.ProcessOrder( order ); + if( savingReplay != null ) + savingReplay.Write( order.Serialize() ); + } + } + ++frameNumber; + } + } + + interface OrderSource + { + void Tick( List localOrders ); + List OrdersForFrame( int frameNumber ); + } + + class LocalOrderSource : OrderSource + { + List orders; + + public void Tick( List localOrders ) + { + orders = localOrders; + } + + public List OrdersForFrame( int frameNumber ) + { + return orders; + } + } + + class ReplayOrderSource : OrderSource + { + BinaryReader replayReader; + public ReplayOrderSource( string replayFilename ) + { + replayReader = new BinaryReader( File.Open( replayFilename, FileMode.Open ) ); + replayReader.ReadUInt32(); + } + + public void Tick( List localOrders ) + { + } + + public List OrdersForFrame( int frameNumber ) + { + var ret = new List(); + while( true ) + { + try + { + var first = replayReader.ReadUInt32(); + var order = Order.Deserialize( replayReader, first ); + if( order == null ) + { + if( (uint)frameNumber + 1 != first ) + throw new NotImplementedException(); + return ret; + } + ret.Add( order ); + } + catch( EndOfStreamException ) + { + return ret; + } + } + } + } +}