frame0 runs continuously until game start (currently hacked onto F8)

This commit is contained in:
Chris Forbes
2009-12-01 19:04:50 +13:00
parent 454a302f56
commit 235ff36792
4 changed files with 46 additions and 17 deletions

View File

@@ -190,8 +190,12 @@ namespace OpenRa.Game
foreach (var player in players.Values) foreach (var player in players.Values)
player.Tick(); player.Tick();
} }
else if (orderManager.FrameNumber == 0) else
lastTime = Environment.TickCount; orderManager.Tick();
// if (orderManager.FrameNumber == 0)
//{
// lastTime = Environment.TickCount;
//}
} }
PerfHistory.Tick(); PerfHistory.Tick();

View File

@@ -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) protected override void OnKeyPress(KeyPressEventArgs e)
{ {
base.OnKeyPress(e); base.OnKeyPress(e);

View File

@@ -15,8 +15,10 @@ namespace OpenRa.Game
public readonly Actor TargetActor; public readonly Actor TargetActor;
public readonly int2 TargetLocation; public readonly int2 TargetLocation;
public readonly string TargetString; 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.Player = player;
this.OrderString = orderString; this.OrderString = orderString;
@@ -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. // 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) 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) public static Order Attack(Actor subject, Actor target)

View File

@@ -11,19 +11,25 @@ namespace OpenRa.Game
{ {
Stream savingReplay; Stream savingReplay;
List<OrderSource> sources; List<OrderSource> sources;
int frameNumber = 1; int frameNumber = 0;
const int FramesAhead = 3; 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<Order>());
}
public int FrameNumber { get { return frameNumber; } } public int FrameNumber { get { return frameNumber; } }
public OrderManager( IEnumerable<OrderSource> sources ) public OrderManager( IEnumerable<OrderSource> sources )
{ {
this.sources = sources.ToList(); this.sources = sources.ToList();
foreach( var p in this.sources )
for( int i = 1 ; i <= FramesAhead ; i++ )
p.SendLocalOrders( i, new List<Order>() );
} }
public OrderManager( IEnumerable<OrderSource> sources, string replayFilename ) public OrderManager( IEnumerable<OrderSource> sources, string replayFilename )
@@ -57,7 +63,9 @@ namespace OpenRa.Game
if( savingReplay != null ) if( savingReplay != null )
savingReplay.WriteFrameData( allOrders, frameNumber ); 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. // sanity check on the framenumber. This is 2^31 frames maximum, or multiple *years* at 40ms/frame.
if( ( frameNumber & 0x80000000 ) != 0 ) if( ( frameNumber & 0x80000000 ) != 0 )
throw new InvalidOperationException( "(OrderManager) Frame number too large" ); throw new InvalidOperationException( "(OrderManager) Frame number too large" );
@@ -80,6 +88,8 @@ namespace OpenRa.Game
public List<Order> OrdersForFrame( int currentFrame ) public List<Order> OrdersForFrame( int currentFrame )
{ {
// TODO: prune `orders` based on currentFrame. // TODO: prune `orders` based on currentFrame.
if (!orders.ContainsKey(currentFrame))
return new List<Order>();
return orders[ currentFrame ]; return orders[ currentFrame ];
} }
@@ -131,7 +141,7 @@ namespace OpenRa.Game
class NetworkOrderSource : OrderSource class NetworkOrderSource : OrderSource
{ {
int nextLocalOrderFrame = 1; // int nextLocalOrderFrame = 1;
TcpClient socket; TcpClient socket;
Dictionary<int, List<byte[]>> orderBuffers = new Dictionary<int, List<byte[]>>(); Dictionary<int, List<byte[]>> orderBuffers = new Dictionary<int, List<byte[]>>();
@@ -183,10 +193,13 @@ namespace OpenRa.Game
public void SendLocalOrders( int localFrame, List<Order> localOrders ) public void SendLocalOrders( int localFrame, List<Order> localOrders )
{ {
if( nextLocalOrderFrame != localFrame ) // if( nextLocalOrderFrame != localFrame )
throw new InvalidOperationException( "Attempted time-travel in NetworkOrderSource.SendLocalOrders()" ); // 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 ) public bool IsReadyForFrame( int frameNumber )
@@ -206,7 +219,7 @@ namespace OpenRa.Game
static class OrderIO static class OrderIO
{ {
public static MemoryStream ToMemoryStream( this List<Order> orders, int nextLocalOrderFrame ) public static MemoryStream ToMemoryStream( this IEnumerable<Order> orders, int nextLocalOrderFrame )
{ {
var ms = new MemoryStream(); var ms = new MemoryStream();
ms.Write( BitConverter.GetBytes( nextLocalOrderFrame ) ); ms.Write( BitConverter.GetBytes( nextLocalOrderFrame ) );
@@ -215,7 +228,7 @@ namespace OpenRa.Game
return ms; return ms;
} }
public static void WriteFrameData( this Stream s, List<Order> orders, int frameNumber ) public static void WriteFrameData( this Stream s, IEnumerable<Order> orders, int frameNumber )
{ {
var ms = orders.ToMemoryStream( frameNumber ); var ms = orders.ToMemoryStream( frameNumber );
s.Write( BitConverter.GetBytes( (int)ms.Length ) ); s.Write( BitConverter.GetBytes( (int)ms.Length ) );