From 6d4a69fa9be12f70d8d09deb22ecba10e02afd29 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 20 Jan 2010 12:34:00 +1300 Subject: [PATCH 1/3] OrdersForFrame now returns serialized orders --- OpenRa.Game/Orders/IOrderSource.cs | 2 +- OpenRa.Game/Orders/LocalOrderSource.cs | 9 +++++---- OpenRa.Game/Orders/NetworkOrderSource.cs | 5 ++--- OpenRa.Game/Orders/OrderManager.cs | 1 + OpenRa.Game/Orders/ReplayOrderSource.cs | 10 +++++----- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/OpenRa.Game/Orders/IOrderSource.cs b/OpenRa.Game/Orders/IOrderSource.cs index 74c3d3c252..a9717de2c0 100644 --- a/OpenRa.Game/Orders/IOrderSource.cs +++ b/OpenRa.Game/Orders/IOrderSource.cs @@ -5,7 +5,7 @@ namespace OpenRa.Orders interface IOrderSource { void SendLocalOrders(int localFrame, List localOrders); - List OrdersForFrame(int currentFrame); + List OrdersForFrame(int currentFrame); bool IsReadyForFrame(int frameNumber); } } diff --git a/OpenRa.Game/Orders/LocalOrderSource.cs b/OpenRa.Game/Orders/LocalOrderSource.cs index ef6d3c61af..bf9238ffe2 100644 --- a/OpenRa.Game/Orders/LocalOrderSource.cs +++ b/OpenRa.Game/Orders/LocalOrderSource.cs @@ -1,15 +1,16 @@ using System.Collections.Generic; +using System.Linq; namespace OpenRa.Orders { class LocalOrderSource : IOrderSource { - Dictionary> orders = new Dictionary>(); + Dictionary> orders = new Dictionary>(); - public List OrdersForFrame(int currentFrame) + public List OrdersForFrame(int currentFrame) { if (!orders.ContainsKey(currentFrame)) - return new List(); + return new List(); var result = orders[currentFrame]; orders.Remove(currentFrame); @@ -19,7 +20,7 @@ namespace OpenRa.Orders public void SendLocalOrders(int localFrame, List localOrders) { if (localFrame == 0) return; - orders[localFrame] = localOrders; + orders[localFrame] = localOrders.Select(o=>o.Serialize()).ToList(); } public bool IsReadyForFrame(int frameNumber) diff --git a/OpenRa.Game/Orders/NetworkOrderSource.cs b/OpenRa.Game/Orders/NetworkOrderSource.cs index cf3c24f79c..7f4a744ff9 100644 --- a/OpenRa.Game/Orders/NetworkOrderSource.cs +++ b/OpenRa.Game/Orders/NetworkOrderSource.cs @@ -92,10 +92,9 @@ namespace OpenRa.Orders } } - public List OrdersForFrame(int currentFrame) + public List OrdersForFrame(int currentFrame) { - var orderData = ExtractOrders(currentFrame); - return orderData.SelectMany(a => a.ToOrderList()).ToList(); + return ExtractOrders(currentFrame).ToList(); } public void SendLocalOrders(int localFrame, List localOrders) diff --git a/OpenRa.Game/Orders/OrderManager.cs b/OpenRa.Game/Orders/OrderManager.cs index 1a5dfd1d2d..debcc6c362 100644 --- a/OpenRa.Game/Orders/OrderManager.cs +++ b/OpenRa.Game/Orders/OrderManager.cs @@ -58,6 +58,7 @@ namespace OpenRa.Orders { var orders = sources .SelectMany(s => s.OrdersForFrame(frame)) + .SelectMany(x => x.ToOrderList()) .Where(o => o.Validate()) /* drop bogus things */ .OrderBy(o => o.Player.Index) .ToList(); diff --git a/OpenRa.Game/Orders/ReplayOrderSource.cs b/OpenRa.Game/Orders/ReplayOrderSource.cs index d8376d0aeb..52f5b34073 100644 --- a/OpenRa.Game/Orders/ReplayOrderSource.cs +++ b/OpenRa.Game/Orders/ReplayOrderSource.cs @@ -14,25 +14,25 @@ namespace OpenRa.Orders public void SendLocalOrders(int localFrame, List localOrders) { } - public List OrdersForFrame(int frameNumber) + public List OrdersForFrame(int frameNumber) { if (frameNumber == 0) - return new List(); + return new List(); try { var len = replayReader.ReadInt32() - 4; var frame = replayReader.ReadInt32(); - var ret = replayReader.ReadBytes(len).ToOrderList(); + var ret = replayReader.ReadBytes(len); if (frameNumber != frame) throw new InvalidOperationException("Attempted time-travel in OrdersForFrame (replay)"); - return ret; + return new List { ret }; } catch (EndOfStreamException) { - return new List(); + return new List(); } } From 645760a60b0d253a5e58234abf3735a515f91112 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 20 Jan 2010 13:09:25 +1300 Subject: [PATCH 2/3] store Actors, not ActorIds, in Order. --- OpenRa.Game/Controller.cs | 3 +-- OpenRa.Game/Orders/Order.cs | 31 ++++++------------------ OpenRa.Game/Orders/OrderManager.cs | 1 - OpenRa.Game/Orders/UnitOrderGenerator.cs | 1 - 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index c58809c124..eb17ecb269 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -47,8 +47,7 @@ namespace OpenRa { if (orderGenerator == null) return; - var orders = orderGenerator.Order(xy.ToInt2(), mi) - .Where(order => order.Validate()).ToArray(); + var orders = orderGenerator.Order(xy.ToInt2(), mi).ToArray(); recentOrders.AddRange( orders ); var voicedActor = orders.Select(o => o.Subject) diff --git a/OpenRa.Game/Orders/Order.cs b/OpenRa.Game/Orders/Order.cs index 221dad9228..b6a4b013b6 100644 --- a/OpenRa.Game/Orders/Order.cs +++ b/OpenRa.Game/Orders/Order.cs @@ -8,41 +8,24 @@ namespace OpenRa public sealed class Order { public readonly string OrderString; - readonly uint SubjectId; - readonly uint TargetActorId; + public readonly Actor Subject; + public readonly Actor TargetActor; public readonly int2 TargetLocation; public readonly string TargetString; public bool IsImmediate; - public Actor Subject { get { return ActorFromUInt(SubjectId); } } - public Actor TargetActor { get { return ActorFromUInt(TargetActorId); } } public Player Player { get { return Subject.Owner; } } public Order(string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString) - : this( orderString, UIntFromActor( subject ), - UIntFromActor( targetActor ), targetLocation, targetString) {} - - Order(string orderString, uint subjectId, - uint targetActorId, int2 targetLocation, string targetString) { this.OrderString = orderString; - this.SubjectId = subjectId; - this.TargetActorId = targetActorId; + this.Subject = subject; + this.TargetActor = targetActor; this.TargetLocation = targetLocation; this.TargetString = targetString; } - public bool Validate() - { - if ((SubjectId != 0xffffffff) && Subject == null) - return false; - if ((TargetActorId != 0xffffffff) && TargetActor == null) - return false; - - return true; - } - public byte[] Serialize() { if (IsImmediate) /* chat, whatever */ @@ -69,8 +52,8 @@ namespace OpenRa var w = new BinaryWriter(ret); w.Write( (byte)0xFF ); w.Write(OrderString); - w.Write(SubjectId); - w.Write(TargetActorId); + w.Write(UIntFromActor(Subject)); + w.Write(UIntFromActor(TargetActor)); w.Write(TargetLocation.X); w.Write(TargetLocation.Y); w.Write(TargetString != null); @@ -103,7 +86,7 @@ namespace OpenRa if (r.ReadBoolean()) targetString = r.ReadString(); - return new Order( order, subjectId, targetActorId, targetLocation, targetString); + return new Order( order, ActorFromUInt( subjectId ), ActorFromUInt( targetActorId ), targetLocation, targetString); } case 0xfe: diff --git a/OpenRa.Game/Orders/OrderManager.cs b/OpenRa.Game/Orders/OrderManager.cs index debcc6c362..85edf10ac4 100644 --- a/OpenRa.Game/Orders/OrderManager.cs +++ b/OpenRa.Game/Orders/OrderManager.cs @@ -59,7 +59,6 @@ namespace OpenRa.Orders var orders = sources .SelectMany(s => s.OrdersForFrame(frame)) .SelectMany(x => x.ToOrderList()) - .Where(o => o.Validate()) /* drop bogus things */ .OrderBy(o => o.Player.Index) .ToList(); diff --git a/OpenRa.Game/Orders/UnitOrderGenerator.cs b/OpenRa.Game/Orders/UnitOrderGenerator.cs index ce8cff226d..30599a7fe7 100644 --- a/OpenRa.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRa.Game/Orders/UnitOrderGenerator.cs @@ -45,7 +45,6 @@ namespace OpenRa.Orders { var p = Game.controller.MousePosition; var c = Order(p.ToInt2(), mi) - .Where(o => o.Validate()) .Select(o => CursorForOrderString(o.OrderString, o.Subject, o.TargetLocation)) .FirstOrDefault(a => a != null); From 6d6a435b2dc1847d15c28af1be030e6648be68e8 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 20 Jan 2010 14:25:51 +1300 Subject: [PATCH 3/3] fixes bug in prev. --- OpenRa.Game/Orders/Order.cs | 25 +++++++++++++++++++++---- OpenRa.Game/Orders/OrderIO.cs | 8 ++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/OpenRa.Game/Orders/Order.cs b/OpenRa.Game/Orders/Order.cs index b6a4b013b6..d8d0b33027 100644 --- a/OpenRa.Game/Orders/Order.cs +++ b/OpenRa.Game/Orders/Order.cs @@ -86,7 +86,11 @@ namespace OpenRa if (r.ReadBoolean()) targetString = r.ReadString(); - return new Order( order, ActorFromUInt( subjectId ), ActorFromUInt( targetActorId ), targetLocation, targetString); + Actor subject, targetActor; + if( !TryGetActorFromUInt( subjectId, out subject ) || !TryGetActorFromUInt( targetActorId, out targetActor ) ) + return null; + + return new Order( order, subject, targetActor, targetLocation, targetString); } case 0xfe: @@ -109,10 +113,23 @@ namespace OpenRa return a.ActorID; } - static Actor ActorFromUInt(uint aID) + static bool TryGetActorFromUInt(uint aID, out Actor ret ) { - if (aID == 0xFFFFFFFF) return null; - return Game.world.Actors.SingleOrDefault(x => x.ActorID == aID); + if( aID == 0xFFFFFFFF ) + { + ret = null; + return true; + } + else + { + foreach( var a in Game.world.Actors.Where( x => x.ActorID == aID ) ) + { + ret = a; + return true; + } + ret = null; + return false; + } } // Named constructors for Orders. diff --git a/OpenRa.Game/Orders/OrderIO.cs b/OpenRa.Game/Orders/OrderIO.cs index 0adf49745b..cc2d52fe69 100644 --- a/OpenRa.Game/Orders/OrderIO.cs +++ b/OpenRa.Game/Orders/OrderIO.cs @@ -27,8 +27,12 @@ namespace OpenRa.Orders var ms = new MemoryStream(bytes); var reader = new BinaryReader(ms); var ret = new List(); - while (ms.Position < ms.Length) - ret.Add(Order.Deserialize(reader)); + while( ms.Position < ms.Length ) + { + var o = Order.Deserialize( reader ); + if( o != null ) + ret.Add( o ); + } return ret; } }