diff --git a/OpenRA.Game/Traits/Player/FrozenActorLayer.cs b/OpenRA.Game/Traits/Player/FrozenActorLayer.cs index 544bc3ea43..de43f88321 100755 --- a/OpenRA.Game/Traits/Player/FrozenActorLayer.cs +++ b/OpenRA.Game/Traits/Player/FrozenActorLayer.cs @@ -32,7 +32,7 @@ namespace OpenRA.Traits public IRenderable[] Renderables { private get; set; } public Player Owner; - public string TooltipName; + public ITooltipInfo TooltipInfo; public Player TooltipOwner; public int HP; diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index f843856bcc..e3450cba19 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -26,6 +26,7 @@ namespace OpenRA.Traits [Flags] public enum Stance { + None = 0, Enemy = 1, Neutral = 2, Ally = 4, @@ -125,10 +126,17 @@ namespace OpenRA.Traits bool Disguised { get; } Player Owner { get; } } + public interface IToolTip { - string Name(); - Player Owner(); + ITooltipInfo TooltipInfo { get; } + Player Owner { get; } + } + + public interface ITooltipInfo + { + string TooltipForPlayerStance(Stance stance); + bool IsOwnerRowVisible { get; } } public interface IDisable { bool Disabled { get; } } diff --git a/OpenRA.Game/Widgets/ViewportControllerWidget.cs b/OpenRA.Game/Widgets/ViewportControllerWidget.cs index 98821bf2a2..4e5b17488f 100644 --- a/OpenRA.Game/Widgets/ViewportControllerWidget.cs +++ b/OpenRA.Game/Widgets/ViewportControllerWidget.cs @@ -114,7 +114,7 @@ namespace OpenRA.Widgets } var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) - .Where(a => a.TooltipName != null && a.IsValid) + .Where(a => a.TooltipInfo != null && a.IsValid) .WithHighestSelectionPriority(); if (frozen != null) diff --git a/OpenRA.Mods.RA/Disguise.cs b/OpenRA.Mods.RA/Disguise.cs index cf8c58374c..24c561b021 100644 --- a/OpenRA.Mods.RA/Disguise.cs +++ b/OpenRA.Mods.RA/Disguise.cs @@ -36,28 +36,28 @@ namespace OpenRA.Mods.RA disguise = self.Trait(); } - public string Name() + public ITooltipInfo TooltipInfo { - if (disguise.Disguised) + get { - if (self.Owner == self.World.LocalPlayer) - return "{0} ({1})".F(info.Name, disguise.AsName); - - return disguise.AsName; + return disguise.Disguised ? disguise.AsTooltipInfo : info; } - return info.Name; } - public Player Owner() + public Player Owner { - if (disguise.Disguised) + get { - if (self.Owner == self.World.LocalPlayer) - return self.Owner; + if (disguise.Disguised) + { + if (self.Owner == self.World.LocalPlayer) + return self.Owner; - return disguise.AsPlayer; + return disguise.AsPlayer; + } + + return self.Owner; } - return self.Owner; } } @@ -65,9 +65,9 @@ namespace OpenRA.Mods.RA class Disguise : IEffectiveOwner, IIssueOrder, IResolveOrder, IOrderVoice, IRadarColorModifier, INotifyAttack { - public Player AsPlayer; - public string AsSprite; - public string AsName; + public Player AsPlayer { get; private set; } + public string AsSprite { get; private set; } + public ITooltipInfo AsTooltipInfo { get; private set; } public bool Disguised { get { return AsPlayer != null; } } public Player Owner { get { return AsPlayer; } } @@ -117,13 +117,13 @@ namespace OpenRA.Mods.RA if (target != null) { var tooltip = target.TraitsImplementing().FirstOrDefault(); - AsName = tooltip.Name(); - AsPlayer = tooltip.Owner(); + AsTooltipInfo = tooltip.TooltipInfo; + AsPlayer = tooltip.Owner; AsSprite = target.Trait().GetImage(target); } else { - AsName = null; + AsTooltipInfo = null; AsPlayer = null; AsSprite = null; } diff --git a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs index 239e77fe7a..d914d74fc0 100644 --- a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs @@ -101,8 +101,8 @@ namespace OpenRA.Mods.RA if (tooltip.Value != null) { - actor.TooltipName = tooltip.Value.Name(); - actor.TooltipOwner = tooltip.Value.Owner(); + actor.TooltipInfo = tooltip.Value.TooltipInfo; + actor.TooltipOwner = tooltip.Value.Owner; } } } diff --git a/OpenRA.Mods.RA/Tooltip.cs b/OpenRA.Mods.RA/Tooltip.cs index 9a1ee16bec..524502e817 100644 --- a/OpenRA.Mods.RA/Tooltip.cs +++ b/OpenRA.Mods.RA/Tooltip.cs @@ -13,29 +13,58 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA { [Desc("Shown in the build palette widget.")] - public class TooltipInfo : ITraitInfo + public class TooltipInfo : ITraitInfo, ITooltipInfo { [Translate] public readonly string Description = ""; [Translate] public readonly string Name = ""; + [Desc("An optional generic name (i.e. \"Soldier\" or \"Structure\")" + + "to be shown to chosen players.")] + [Translate] public readonly string GenericName = null; + + [Desc("Prefix generic tooltip name with 'Enemy' or 'Allied'.")] + public readonly bool GenericStancePrefix = true; + + [Desc("Player stances that the generic name should be shown to.")] + public readonly Stance GenericVisibility = Stance.None; + + [Desc("Show the actor's owner and their faction flag")] + public readonly bool ShowOwnerRow = true; + [Desc("Sequence of the actor that contains the cameo.")] public readonly string Icon = "icon"; public virtual object Create(ActorInitializer init) { return new Tooltip(init.self, this); } + + public string TooltipForPlayerStance(Stance stance) + { + if (stance == Stance.None || !GenericVisibility.HasFlag(stance)) + return Name; + + if (GenericStancePrefix && stance == Stance.Ally) + return "Allied " + GenericName; + + if (GenericStancePrefix && stance == Stance.Enemy) + return "Enemy " + GenericName; + + return GenericName; + } + + public bool IsOwnerRowVisible { get { return ShowOwnerRow; } } } public class Tooltip : IToolTip { - Actor self; - TooltipInfo Info; + readonly Actor self; + readonly TooltipInfo info; - public string Name() { return Info.Name; } - public Player Owner() { return self.Owner; } + public ITooltipInfo TooltipInfo { get { return info; } } + public Player Owner { get { return self.Owner; } } public Tooltip(Actor self, TooltipInfo info) { this.self = self; - Info = info; + this.info = info; } } } \ No newline at end of file diff --git a/OpenRA.Mods.RA/Widgets/Logic/WorldTooltipLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/WorldTooltipLogic.cs index b9282ffbd2..f62eddbab8 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/WorldTooltipLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/WorldTooltipLogic.cs @@ -10,6 +10,7 @@ using System; using System.Drawing; +using OpenRA.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic @@ -17,7 +18,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic public class WorldTooltipLogic { [ObjectCreator.UseCtor] - public WorldTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, ViewportControllerWidget viewport) + public WorldTooltipLogic(Widget widget, World world, TooltipContainerWidget tooltipContainer, ViewportControllerWidget viewport) { widget.IsVisible = () => viewport.TooltipType != WorldTooltipType.None; var label = widget.Get("LABEL"); @@ -41,20 +42,32 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (viewport == null || viewport.TooltipType == WorldTooltipType.None) return; + showOwner = false; + Player o = null; switch (viewport.TooltipType) { - case WorldTooltipType.Unexplored: - labelText = "Unexplored Terrain"; - break; - case WorldTooltipType.Actor: - labelText = viewport.ActorTooltip.Name(); - o = viewport.ActorTooltip.Owner(); - break; - case WorldTooltipType.FrozenActor: - labelText = viewport.FrozenActorTooltip.TooltipName; - o = viewport.FrozenActorTooltip.TooltipOwner; - break; + case WorldTooltipType.Unexplored: + labelText = "Unexplored Terrain"; + break; + case WorldTooltipType.Actor: + { + o = viewport.ActorTooltip.Owner; + showOwner = !o.NonCombatant && viewport.ActorTooltip.TooltipInfo.IsOwnerRowVisible; + + var stance = o == null || world.RenderPlayer == null? Stance.None : o.Stances[world.RenderPlayer]; + labelText = viewport.ActorTooltip.TooltipInfo.TooltipForPlayerStance(stance); + break; + } + case WorldTooltipType.FrozenActor: + { + o = viewport.FrozenActorTooltip.TooltipOwner; + showOwner = !o.NonCombatant && viewport.FrozenActorTooltip.TooltipInfo.IsOwnerRowVisible; + + var stance = o == null || world.RenderPlayer == null? Stance.None : o.Stances[world.RenderPlayer]; + labelText = viewport.FrozenActorTooltip.TooltipInfo.TooltipForPlayerStance(stance); + break; + } } var textWidth = font.Measure(labelText).X; @@ -64,8 +77,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic widget.Bounds.Width = 2*label.Bounds.X + textWidth; } - showOwner = o != null && !o.NonCombatant; - if (showOwner) { flagRace = o.Country.Race;