diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index fb44ad7411..da78566662 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -22,7 +22,6 @@ namespace OpenRa.Game foreach (var order in orderGenerator.Order(xy.ToInt2(), left)) { recentOrders.Add(order); - //UnitOrders.ProcessOrder( order ); if (order.Subject != null && order.Player == Game.LocalPlayer) doVoice = order.Subject; } @@ -30,6 +29,8 @@ namespace OpenRa.Game Game.PlaySound(Game.SovietVoices.First.GetNext() + GetVoiceSuffix(doVoice), false); } + public void AddOrder(Order o) { recentOrders.Add(o); } + public List GetRecentOrders() { var ret = recentOrders; diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 163864c159..f8fa50de0e 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -253,9 +253,9 @@ namespace OpenRa.Game var mobile = unit.traits.Get(); mobile.facing = 128; mobile.QueueActivity(new Mobile.MoveTo(unit.Location + new int2(0, 3))); - } - - world.AddFrameEndTask(_ => world.Add(unit)); + } + + world.Add(unit); if (producer.traits.Contains()) producer.traits.Get().EjectUnit(); diff --git a/OpenRa.Game/Order.cs b/OpenRa.Game/Order.cs index 88dab7be82..b309384b7b 100644 --- a/OpenRa.Game/Order.cs +++ b/OpenRa.Game/Order.cs @@ -3,106 +3,111 @@ using System.Collections.Generic; using System.Text; using System.Linq; using OpenRa.Game.Traits; -using System.IO; - -namespace OpenRa.Game -{ - sealed class Order - { - public readonly Player Player; - public readonly string OrderString; - public readonly Actor Subject; - public readonly Actor TargetActor; - public readonly int2 TargetLocation; - public readonly string TargetString; - - private Order( Player player, string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString ) - { - this.Player = player; - this.OrderString = orderString; - this.Subject = subject; - this.TargetActor = targetActor; - this.TargetLocation = targetLocation; - this.TargetString = targetString; +using System.IO; + +namespace OpenRa.Game +{ + sealed class Order + { + public readonly Player Player; + public readonly string OrderString; + public readonly Actor Subject; + public readonly Actor TargetActor; + public readonly int2 TargetLocation; + public readonly string TargetString; + + private Order(Player player, string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString) + { + this.Player = player; + this.OrderString = orderString; + this.Subject = subject; + this.TargetActor = targetActor; + this.TargetLocation = targetLocation; + this.TargetString = targetString; } public byte[] Serialize() { - switch( OrderString ) + switch (OrderString) { - // Format: - // u32 : player, with msb set. (if msb is clear, not an order) - // u8 : orderID. - // 0xFF: Full serialized order. - // varies: rest of order. - default: - // TODO: specific serializers for specific orders. - { - var ret = new MemoryStream(); - var w = new BinaryWriter(ret); - w.Write( (uint)Player.Palette | 0x80000000u ); - w.Write( (byte)0xFF ); // - w.Write( OrderString ); - w.Write( Subject == null ? 0xFFFFFFFF : Subject.ActorID ); - w.Write( TargetActor == null ? 0xFFFFFFFF : TargetActor.ActorID ); - w.Write( TargetLocation.X ); - w.Write( TargetLocation.Y ); - w.Write( TargetString != null ); - if( TargetString != null ) - w.Write( TargetString ); - return ret.ToArray(); - } + // Format: + // u32 : player, with msb set. (if msb is clear, not an order) + // u8 : orderID. + // 0xFF: Full serialized order. + // varies: rest of order. + default: + // TODO: specific serializers for specific orders. + { + var ret = new MemoryStream(); + var w = new BinaryWriter(ret); + w.Write((uint)Player.Palette | 0x80000000u); + w.Write((byte)0xFF); // + w.Write(OrderString); + w.Write(Subject == null ? 0xFFFFFFFF : Subject.ActorID); + w.Write(TargetActor == null ? 0xFFFFFFFF : TargetActor.ActorID); + w.Write(TargetLocation.X); + w.Write(TargetLocation.Y); + w.Write(TargetString != null); + if (TargetString != null) + w.Write(TargetString); + return ret.ToArray(); + } } } - public static Order Deserialize( BinaryReader r, uint first ) + public static Order Deserialize(BinaryReader r, uint first) { - if( ( first >> 31 ) == 0 ) return null; + if ((first >> 31) == 0) return null; - var player = Game.players.Where( x => x.Value.Palette == (first & 0x7FFFFFFF) ).First().Value; - switch( r.ReadByte() ) + var player = Game.players.Where(x => x.Value.Palette == (first & 0x7FFFFFFF)).First().Value; + switch (r.ReadByte()) { - case 0xFF: - { - var order = r.ReadString(); - var subject = ActorFromUInt( r.ReadUInt32() ); - var targetActor = ActorFromUInt( r.ReadUInt32() ); - var targetLocation = new int2( r.ReadInt32(), 0 ); - targetLocation.Y = r.ReadInt32(); - var targetString = null as string; - if( r.ReadBoolean() ) - targetString = r.ReadString(); - return new Order( player, order, subject, targetActor, targetLocation, targetString ); - } - default: - throw new NotImplementedException(); + case 0xFF: + { + var order = r.ReadString(); + var subject = ActorFromUInt(r.ReadUInt32()); + var targetActor = ActorFromUInt(r.ReadUInt32()); + var targetLocation = new int2(r.ReadInt32(), 0); + targetLocation.Y = r.ReadInt32(); + var targetString = null as string; + if (r.ReadBoolean()) + targetString = r.ReadString(); + return new Order(player, order, subject, targetActor, targetLocation, targetString); + } + default: + throw new NotImplementedException(); } } - static Actor ActorFromUInt( uint aID ) + static Actor ActorFromUInt(uint aID) { - if( aID == 0xFFFFFFFF ) return null; - return Game.world.Actors.Where( x => x.ActorID == aID ).First(); + if (aID == 0xFFFFFFFF) return null; + return Game.world.Actors.Where(x => x.ActorID == aID).First(); } - public static Order Attack( Actor subject, Actor target ) - { - return new Order( subject.Owner, "Attack", subject, target, int2.Zero, null ); - } - - public static Order Move( Actor subject, int2 target ) - { - return new Order( subject.Owner, "Move", subject, null, target, null ); - } - - public static Order DeployMcv( Actor subject ) - { - return new Order( subject.Owner, "DeployMcv", subject, null, int2.Zero, null ); - } - - public static Order PlaceBuilding( Player subject, int2 target, string buildingName ) - { - return new Order( subject, "PlaceBuilding", null, null, target, buildingName ); + public static Order Attack(Actor subject, Actor target) + { + return new Order(subject.Owner, "Attack", subject, target, int2.Zero, null); } - } + + public static Order Move(Actor subject, int2 target) + { + return new Order(subject.Owner, "Move", subject, null, target, null); + } + + public static Order DeployMcv(Actor subject) + { + return new Order(subject.Owner, "DeployMcv", subject, null, int2.Zero, null); + } + + public static Order PlaceBuilding(Player subject, int2 target, string buildingName) + { + return new Order(subject, "PlaceBuilding", null, null, target, buildingName); + } + + public static Order BuildUnit(Player subject, string unitName) + { + return new Order(subject, "BuildUnit", null, null, int2.Zero, unitName); + } + } } diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index 82b04a64d3..81df8c4f4f 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -59,15 +59,14 @@ namespace OpenRa.Game } public void Build(SidebarItem item) - { - if (item != null) - { - if (item.techTreeItem.IsStructure) - Game.controller.orderGenerator = new PlaceBuilding(Game.LocalPlayer, - item.techTreeItem.tag.ToLowerInvariant()); - else - Game.BuildUnit(Game.LocalPlayer, item.techTreeItem.tag.ToLowerInvariant()); - } + { + if (item == null) return; + + if (item.techTreeItem.IsStructure) + Game.controller.orderGenerator = new PlaceBuilding(Game.LocalPlayer, + item.techTreeItem.tag.ToLowerInvariant()); + else + Game.controller.AddOrder(Order.BuildUnit(Game.LocalPlayer, item.techTreeItem.tag.ToLowerInvariant())); } void LoadSprites( string category, string group ) diff --git a/OpenRa.Game/UnitOrders.cs b/OpenRa.Game/UnitOrders.cs index de2a61fc18..854d495dba 100755 --- a/OpenRa.Game/UnitOrders.cs +++ b/OpenRa.Game/UnitOrders.cs @@ -65,6 +65,11 @@ namespace OpenRa.Game } ); break; } + case "BuildUnit": + { + Game.world.AddFrameEndTask(_ => Game.BuildUnit( order.Player, order.TargetString )); + break; + } default: throw new NotImplementedException(); }