From c90317fb35b70932f2b192e641d228faddc6cc3d Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 23 Jul 2010 19:10:10 +1200 Subject: [PATCH] Aircraft/Helicopter move/dock flashing and cursor fixes --- OpenRA.Game/Effects/MoveFlash.cs | 11 ++++++++++- OpenRA.Game/Traits/Mobile.cs | 8 +++++--- OpenRA.Mods.RA/Helicopter.cs | 24 ++++++++++++++++-------- OpenRA.Mods.RA/Plane.cs | 20 +++++++++++++++----- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/OpenRA.Game/Effects/MoveFlash.cs b/OpenRA.Game/Effects/MoveFlash.cs index bce18093d0..aeab773f24 100755 --- a/OpenRA.Game/Effects/MoveFlash.cs +++ b/OpenRA.Game/Effects/MoveFlash.cs @@ -14,11 +14,20 @@ using OpenRA.Traits; namespace OpenRA.Effects { - class MoveFlash : IEffect + public class MoveFlash : IEffect { Animation anim = new Animation("moveflsh"); float2 pos; + + public MoveFlash( World world, int2 cell ) + { + this.pos = Game.CellSize * (cell + new float2(0.5f, 0.5f)); + anim.PlayThen( "idle", + () => world.AddFrameEndTask( + w => w.Remove( this ) ) ); + } + public MoveFlash( World world, float2 pos ) { this.pos = pos; diff --git a/OpenRA.Game/Traits/Mobile.cs b/OpenRA.Game/Traits/Mobile.cs index 551dba4846..04af7720d9 100644 --- a/OpenRA.Game/Traits/Mobile.cs +++ b/OpenRA.Game/Traits/Mobile.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Linq; +using OpenRA.Effects; using OpenRA.Traits.Activities; using OpenRA.FileFormats; @@ -97,6 +98,7 @@ namespace OpenRA.Traits } if (MovementSpeedForCell(self, self.Location) == 0) return null; /* allow disabling move orders from modifiers */ if (xy == toCell) return null; + return new Order("Move", self, xy, mi.Modifiers.HasModifier(Modifiers.Shift)); } @@ -106,11 +108,11 @@ namespace OpenRA.Traits { if (self.traits.GetOrDefault().CanEnterCell(order.TargetLocation)) { + if (self.Owner == self.World.LocalPlayer) + self.World.AddFrameEndTask(w => w.Add(new MoveFlash(self.World, order.TargetLocation))); + if( !order.Queued ) self.CancelActivity(); self.QueueActivity(new Activities.Move(order.TargetLocation, 8)); - - if (self.Owner == self.World.LocalPlayer) - self.World.Add(new Effects.MoveFlash(self.World, Game.CellSize * (order.TargetLocation + new float2(0.5f, 0.5f)))); } } } diff --git a/OpenRA.Mods.RA/Helicopter.cs b/OpenRA.Mods.RA/Helicopter.cs index b58e990022..551827d33f 100644 --- a/OpenRA.Mods.RA/Helicopter.cs +++ b/OpenRA.Mods.RA/Helicopter.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Linq; +using OpenRA.Effects; using OpenRA.Mods.RA.Activities; using OpenRA.Traits; using OpenRA.Traits.Activities; @@ -38,27 +39,28 @@ namespace OpenRA.Mods.RA if (mi.Button == MouseButton.Left) return null; if (underCursor == null) - { if (self.traits.GetOrDefault().CanEnterCell(xy)) return new Order("Move", self, xy); - } if (AircraftCanEnter(self, underCursor) - && underCursor.Owner == self.Owner - && !Reservable.IsReserved(underCursor)) + && underCursor.Owner == self.Owner) return new Order("Enter", self, underCursor); - + return null; } public string CursorForOrder(Actor self, Order order) { - return (order.OrderString == "Enter") ? "enter" : null; + if (order.OrderString == "Move") return "move"; + if (order.OrderString == "Enter") + return Reservable.IsReserved(order.TargetActor) ? "enter-blocked" : "enter"; + + return null; } public string VoicePhraseForOrder(Actor self, Order order) { - return (order.OrderString == "Move") ? "Move" : null; + return (order.OrderString == "Move" || order.OrderString == "Enter") ? "Move" : null; } public void ResolveOrder(Actor self, Order order) @@ -71,6 +73,9 @@ namespace OpenRA.Mods.RA if (order.OrderString == "Move") { + if (self.Owner == self.World.LocalPlayer) + self.World.AddFrameEndTask(w => w.Add(new MoveFlash(self.World, order.TargetLocation))); + self.CancelActivity(); self.QueueActivity(new HeliFly(Util.CenterOfCell(order.TargetLocation))); @@ -91,7 +96,10 @@ namespace OpenRA.Mods.RA var productionInfo = order.TargetActor.Info.Traits.GetOrDefault(); var offset = productionInfo != null ? productionInfo.SpawnOffset : null; var offsetVec = offset != null ? new float2(offset[0], offset[1]) : float2.Zero; - + + if (self.Owner == self.World.LocalPlayer) + self.World.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor))); + self.CancelActivity(); self.QueueActivity(new HeliFly(order.TargetActor.CenterLocation + offsetVec)); self.QueueActivity(new Turn(self.Info.Traits.GetOrDefault().InitialFacing)); diff --git a/OpenRA.Mods.RA/Plane.cs b/OpenRA.Mods.RA/Plane.cs index e87ab0cbc3..7ce490c9b4 100644 --- a/OpenRA.Mods.RA/Plane.cs +++ b/OpenRA.Mods.RA/Plane.cs @@ -10,6 +10,7 @@ using System; using System.Linq; +using OpenRA.Effects; using OpenRA.Mods.RA.Activities; using OpenRA.Traits; @@ -32,10 +33,9 @@ namespace OpenRA.Mods.RA if (underCursor == null) return new Order("Move", self, xy); - + if (AircraftCanEnter(self, underCursor) - && underCursor.Owner == self.Owner - && !Reservable.IsReserved(underCursor)) + && underCursor.Owner == self.Owner) return new Order("Enter", self, underCursor); return null; @@ -43,12 +43,16 @@ namespace OpenRA.Mods.RA public string CursorForOrder(Actor self, Order order) { - return (order.OrderString == "Enter") ? "enter" : null; + if (order.OrderString == "Move") return "move"; + if (order.OrderString == "Enter") + return Reservable.IsReserved(order.TargetActor) ? "enter-blocked" : "enter"; + + return null; } public string VoicePhraseForOrder(Actor self, Order order) { - return (order.OrderString == "Move") ? "Move" : null; + return (order.OrderString == "Move" || order.OrderString == "Enter") ? "Move" : null; } public void ResolveOrder(Actor self, Order order) @@ -61,6 +65,9 @@ namespace OpenRA.Mods.RA if (order.OrderString == "Move") { + if (self.Owner == self.World.LocalPlayer) + self.World.AddFrameEndTask(w => w.Add(new MoveFlash(self.World, order.TargetLocation))); + self.CancelActivity(); self.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation))); } @@ -74,6 +81,9 @@ namespace OpenRA.Mods.RA var info = self.Info.Traits.Get(); + if (self.Owner == self.World.LocalPlayer) + self.World.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor))); + self.CancelActivity(); self.QueueActivity(new ReturnToBase(self, order.TargetActor)); self.QueueActivity(