From cf8cfdc42d031e1ff79308a53bf580d16b4bca56 Mon Sep 17 00:00:00 2001 From: alzeih Date: Sun, 13 Mar 2011 14:12:40 +1300 Subject: [PATCH] SpyToolTip - Display tooltip of disguised unit to other players, and a modified one for the local player. --- OpenRA.Game/Traits/TraitsInterfaces.cs | 8 ++- OpenRA.Mods.RA/Spy.cs | 63 +++++++++++++++++++- OpenRA.Mods.RA/Valued.cs | 25 +++++++- OpenRA.Mods.RA/Widgets/WorldTooltipWidget.cs | 15 +++-- mods/ra/rules/infantry.yaml | 2 +- 5 files changed, 98 insertions(+), 15 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index ebfa13c103..a5fdb2405c 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -64,7 +64,13 @@ namespace OpenRA.Traits public interface INotifyOtherCaptured { void OnActorCaptured(Actor self, Actor captured, Actor captor, Player oldOwner, Player newOwner); } public interface IAcceptSpy { void OnInfiltrate(Actor self, Actor spy); } public interface IStoreOre { int Capacity { get; }} - + public interface IToolTip + { + string Name(); + Player Owner(); + Stance Stance(); + } + public interface IDisable { bool Disabled { get; } } public interface IExplodeModifier { bool ShouldExplode(Actor self); } public interface INudge { void OnNudge(Actor self, Actor nudger); } diff --git a/OpenRA.Mods.RA/Spy.cs b/OpenRA.Mods.RA/Spy.cs index 72ade7dc2a..ef6d09a711 100644 --- a/OpenRA.Mods.RA/Spy.cs +++ b/OpenRA.Mods.RA/Spy.cs @@ -19,12 +19,67 @@ using OpenRA.Mods.RA.Render; namespace OpenRA.Mods.RA { + class SpyToolTipInfo : TooltipInfo, ITraitPrerequisite + { + public override object Create (ActorInitializer init) { return new SpyToolTip(init.self, this); } + } + + class SpyToolTip : IToolTip + { + Actor self; + TooltipInfo Info; + Spy spy; + + public string Name() + { + if (spy.Disguised) + { + if (self.Owner == self.World.LocalPlayer) + return "{0} ({1})".F(Info.Name, spy.disguisedAsName); + return spy.disguisedAsName; + } + return Info.Name; + } + + public Player Owner() + { + if (spy.Disguised) + { + if (self.Owner == self.World.LocalPlayer) + return self.Owner; + return spy.disguisedAsPlayer; + } + return self.Owner; + } + + public Stance Stance() + { + if (spy.Disguised) + { + if (self.Owner == self.World.LocalPlayer) + return self.World.LocalPlayer.Stances[self.Owner]; + return self.World.LocalPlayer.Stances[spy.disguisedAsPlayer]; + } + return self.World.LocalPlayer.Stances[self.Owner]; + } + + public SpyToolTip( Actor self, TooltipInfo info ) + { + this.self = self; + Info = info; + spy = self.Trait(); + } + } + + class SpyInfo : TraitInfo { } class Spy : IIssueOrder, IResolveOrder, IOrderVoice { public Player disguisedAsPlayer; - public string disguisedAsSprite; + public string disguisedAsSprite, disguisedAsName; + + public bool Disguised { get { return disguisedAsPlayer != null; } } public IEnumerable Orders { @@ -57,13 +112,17 @@ namespace OpenRA.Mods.RA if (order.OrderString == "Disguise") { var target = order.TargetActor == self ? null : order.TargetActor; + if (target != null && target.IsInWorld) { - disguisedAsPlayer = target.Owner; + var tooltip = target.Trait(); + disguisedAsName = tooltip.Name(); + disguisedAsPlayer = tooltip.Owner(); disguisedAsSprite = target.Trait().GetImage(target); } else { + disguisedAsName = null; disguisedAsPlayer = null; disguisedAsSprite = null; } diff --git a/OpenRA.Mods.RA/Valued.cs b/OpenRA.Mods.RA/Valued.cs index 1e7c470e57..aaea5ae45a 100755 --- a/OpenRA.Mods.RA/Valued.cs +++ b/OpenRA.Mods.RA/Valued.cs @@ -17,14 +17,33 @@ namespace OpenRA.Mods.RA public readonly int Cost = 0; } - public class TooltipInfo : TraitInfo + public class TooltipInfo : ITraitInfo { public readonly string Description = ""; public readonly string Name = ""; public readonly string Icon = null; public readonly string[] AlternateName = { }; - } + + public virtual object Create (ActorInitializer init) { return new Tooltip(init.self, this); } +} public class Valued { } - public class Tooltip { } + + public class Tooltip : IToolTip + { + Actor self; + TooltipInfo Info; + + public string Name() { return Info.Name; } + + public Player Owner() { return self.Owner; } + + public Stance Stance() { return self.World.LocalPlayer.Stances[self.Owner]; } + + public Tooltip( Actor self, TooltipInfo info ) + { + this.self = self; + Info = info; + } + } } diff --git a/OpenRA.Mods.RA/Widgets/WorldTooltipWidget.cs b/OpenRA.Mods.RA/Widgets/WorldTooltipWidget.cs index c747b9b96e..8241ee9568 100755 --- a/OpenRA.Mods.RA/Widgets/WorldTooltipWidget.cs +++ b/OpenRA.Mods.RA/Widgets/WorldTooltipWidget.cs @@ -13,6 +13,7 @@ using System.Drawing; using System.Linq; using OpenRA.Graphics; using OpenRA.Widgets; +using OpenRA.Traits; namespace OpenRA.Mods.RA.Widgets { @@ -53,14 +54,12 @@ namespace OpenRA.Mods.RA.Widgets if (actor == null) return; - var name = actor.Info.Traits.Contains() - ? actor.Info.Traits.Get().Name - : actor.Info.Name; - var owner = (actor.Owner.NonCombatant) - ? "" : "{0}".F(actor.Owner.PlayerName); - var stance = (actor.Owner == world.LocalPlayer || actor.Owner.NonCombatant) - ? "" : " ({0})".F(world.LocalPlayer.Stances[actor.Owner]); - + var tooltip = actor.TraitsImplementing().FirstOrDefault(); + + var name = tooltip != null ? tooltip.Name() : actor.Info.Name; + var owner = (tooltip != null && !tooltip.Owner().NonCombatant) ? "{0}".F(tooltip.Owner().PlayerName) : ""; + var stance = (tooltip != null && tooltip.Owner() != actor.World.LocalPlayer && !tooltip.Owner().NonCombatant) ? " ({0})".F(tooltip.Stance()) : ""; + var nameSize = Game.Renderer.BoldFont.Measure(name); var ownerSize = Game.Renderer.RegularFont.Measure(owner); var stanceSize = Game.Renderer.RegularFont.Measure(stance); diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index f6ca0584e4..6fb5d5f051 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -181,7 +181,7 @@ SPY: BuiltAt: tent Valued: Cost: 500 - Tooltip: + SpyToolTip: Name: Spy Description: Infiltrates enemy structures to gather \nintelligence. Exact effect depends on the \nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised Selectable: