BuildUnit order is now in replay

This commit is contained in:
Chris Forbes
2009-10-29 20:45:07 +13:00
parent 318a1c40dd
commit c3f8019ab4
5 changed files with 107 additions and 97 deletions

View File

@@ -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<Order> GetRecentOrders()
{
var ret = recentOrders;

View File

@@ -255,7 +255,7 @@ namespace OpenRa.Game
mobile.QueueActivity(new Mobile.MoveTo(unit.Location + new int2(0, 3)));
}
world.AddFrameEndTask(_ => world.Add(unit));
world.Add(unit);
if (producer.traits.Contains<RenderWarFactory>())
producer.traits.Get<RenderWarFactory>().EjectUnit();

View File

@@ -16,7 +16,7 @@ namespace OpenRa.Game
public readonly int2 TargetLocation;
public readonly string TargetString;
private Order( Player player, string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString )
private Order(Player player, string orderString, Actor subject, Actor targetActor, int2 targetLocation, string targetString)
{
this.Player = player;
this.OrderString = orderString;
@@ -28,7 +28,7 @@ namespace OpenRa.Game
public byte[] Serialize()
{
switch( OrderString )
switch (OrderString)
{
// Format:
// u32 : player, with msb set. (if msb is clear, not an order)
@@ -40,69 +40,74 @@ namespace OpenRa.Game
{
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 );
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 );
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() )
if (r.ReadBoolean())
targetString = r.ReadString();
return new Order( player, order, subject, targetActor, targetLocation, targetString );
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 )
public static Order Attack(Actor subject, Actor target)
{
return new Order( subject.Owner, "Attack", subject, target, int2.Zero, null );
return new Order(subject.Owner, "Attack", subject, target, int2.Zero, null);
}
public static Order Move( Actor subject, int2 target )
public static Order Move(Actor subject, int2 target)
{
return new Order( subject.Owner, "Move", subject, null, target, null );
return new Order(subject.Owner, "Move", subject, null, target, null);
}
public static Order DeployMcv( Actor subject )
public static Order DeployMcv(Actor subject)
{
return new Order( subject.Owner, "DeployMcv", subject, null, int2.Zero, null );
return new Order(subject.Owner, "DeployMcv", subject, null, int2.Zero, null);
}
public static Order PlaceBuilding( Player subject, int2 target, string buildingName )
public static Order PlaceBuilding(Player subject, int2 target, string buildingName)
{
return new Order( subject, "PlaceBuilding", null, null, target, 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);
}
}
}

View File

@@ -60,14 +60,13 @@ namespace OpenRa.Game
public void Build(SidebarItem item)
{
if (item != null)
{
if (item == null) return;
if (item.techTreeItem.IsStructure)
Game.controller.orderGenerator = new PlaceBuilding(Game.LocalPlayer,
item.techTreeItem.tag.ToLowerInvariant());
else
Game.BuildUnit(Game.LocalPlayer, item.techTreeItem.tag.ToLowerInvariant());
}
Game.controller.AddOrder(Order.BuildUnit(Game.LocalPlayer, item.techTreeItem.tag.ToLowerInvariant()));
}
void LoadSprites( string category, string group )

View File

@@ -65,6 +65,11 @@ namespace OpenRa.Game
} );
break;
}
case "BuildUnit":
{
Game.world.AddFrameEndTask(_ => Game.BuildUnit( order.Player, order.TargetString ));
break;
}
default:
throw new NotImplementedException();
}