From 8c9fbb8d6b1eeca46dd8364ff1692c9eb9449c6f Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 5 Jan 2010 15:25:12 +1300 Subject: [PATCH] cargo: added EnterTransport activity; made things mostly work. still very WIP. --- OpenRa.Game/Actor.cs | 1 - OpenRa.Game/OpenRa.Game.csproj | 1 + .../Traits/Activities/EnterTransport.cs | 36 +++++++++++++++++++ OpenRa.Game/Traits/Activities/UnloadCargo.cs | 3 +- OpenRa.Game/Traits/Cargo.cs | 17 ++++----- OpenRa.Game/Traits/Passenger.cs | 4 +-- OpenRa.Game/World.cs | 12 +++++-- 7 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 OpenRa.Game/Traits/Activities/EnterTransport.cs diff --git a/OpenRa.Game/Actor.cs b/OpenRa.Game/Actor.cs index e8a2e177ca..3d99808bbc 100755 --- a/OpenRa.Game/Actor.cs +++ b/OpenRa.Game/Actor.cs @@ -36,7 +36,6 @@ namespace OpenRa.Game Location = location; CenterLocation = Traits.Util.CenterOfCell(Location); Owner = owner; - IsInWorld = true; if (Info == null) return; diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 752d599047..296dae3aa4 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -118,6 +118,7 @@ + diff --git a/OpenRa.Game/Traits/Activities/EnterTransport.cs b/OpenRa.Game/Traits/Activities/EnterTransport.cs new file mode 100644 index 0000000000..daa875173d --- /dev/null +++ b/OpenRa.Game/Traits/Activities/EnterTransport.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OpenRa.Game.Traits.Activities +{ + class EnterTransport : IActivity + { + public IActivity NextActivity { get; set; } + bool isCanceled; + public Actor transport; + + public EnterTransport(Actor self, Actor transport) + { + this.transport = transport; + } + + public IActivity Tick(Actor self) + { + if (isCanceled) return NextActivity; + if (transport == null || !transport.IsInWorld) return NextActivity; + + var cargo = transport.traits.Get(); + if (cargo.IsFull(transport)) + return NextActivity; + + cargo.Load(transport, self); + Game.world.AddFrameEndTask(w => w.Remove(self)); + + return this; + } + + public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } + } +} diff --git a/OpenRa.Game/Traits/Activities/UnloadCargo.cs b/OpenRa.Game/Traits/Activities/UnloadCargo.cs index 2f23dc7886..b0af980ab5 100644 --- a/OpenRa.Game/Traits/Activities/UnloadCargo.cs +++ b/OpenRa.Game/Traits/Activities/UnloadCargo.cs @@ -51,7 +51,8 @@ namespace OpenRa.Game.Traits.Activities if (exitTile == null) return this; - var actor = cargo.UnloadOne(self); + var actor = cargo.Unload(self); + Game.world.AddFrameEndTask(w => { w.Add(actor); diff --git a/OpenRa.Game/Traits/Cargo.cs b/OpenRa.Game/Traits/Cargo.cs index 2f2bff52a8..c895c98bd9 100644 --- a/OpenRa.Game/Traits/Cargo.cs +++ b/OpenRa.Game/Traits/Cargo.cs @@ -11,15 +11,7 @@ namespace OpenRa.Game.Traits { List cargo = new List(); - public Cargo(Actor self) - { - // hack: - cargo.Add(new Actor(Rules.UnitInfo["E1"], int2.Zero, self.Owner)); - cargo.Add(new Actor(Rules.UnitInfo["E1"], int2.Zero, self.Owner)); - cargo.Add(new Actor(Rules.UnitInfo["E1"], int2.Zero, self.Owner)); - cargo.Add(new Actor(Rules.UnitInfo["E6"], int2.Zero, self.Owner)); - cargo.Add(new Actor(Rules.UnitInfo["E7"], int2.Zero, self.Owner)); - } + public Cargo(Actor self) {} public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) { @@ -50,7 +42,7 @@ namespace OpenRa.Game.Traits return cargo.Count == 0; } - public Actor UnloadOne(Actor self) + public Actor Unload(Actor self) { var a = cargo[0]; cargo.RemoveAt(0); @@ -79,5 +71,10 @@ namespace OpenRa.Game.Traits return PipType.Green; } + + public void Load(Actor self, Actor a) + { + cargo.Add(a); + } } } diff --git a/OpenRa.Game/Traits/Passenger.cs b/OpenRa.Game/Traits/Passenger.cs index a4092d63d9..29521ecb09 100644 --- a/OpenRa.Game/Traits/Passenger.cs +++ b/OpenRa.Game/Traits/Passenger.cs @@ -34,8 +34,8 @@ namespace OpenRa.Game.Traits if (order.OrderString == "EnterTransport") { self.CancelActivity(); - self.QueueActivity(new Move(order.TargetActor, 0)); - // todo: actually enter the transport + self.QueueActivity(new Move(order.TargetActor.Location, 1)); + self.QueueActivity(new EnterTransport(self, order.TargetActor)); } } } diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index 53dcfc9e37..f8db600406 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -10,10 +10,18 @@ namespace OpenRa.Game List effects = new List(); List> frameEndActions = new List>(); - public void Add(Actor a) { actors.Add(a); ActorAdded(a); } + public void Add(Actor a) + { + a.IsInWorld = true; + actors.Add(a); + ActorAdded(a); + } + public void Remove(Actor a) { - a.IsInWorld = false; actors.Remove(a); ActorRemoved(a); + a.IsInWorld = false; + actors.Remove(a); + ActorRemoved(a); } public void Add(IEffect b) { effects.Add(b); }