diff --git a/OpenRA.Game/Exts.cs b/OpenRA.Game/Exts.cs
index a90f1cb652..8b8f577b87 100644
--- a/OpenRA.Game/Exts.cs
+++ b/OpenRA.Game/Exts.cs
@@ -22,6 +22,16 @@ namespace OpenRA
{
public static class Exts
{
+ /// Returns of the , taking into account.
+ public static Color OwnerColor(this Actor actor)
+ {
+ var effectiveOwner = actor.EffectiveOwner;
+ if (effectiveOwner != null && effectiveOwner.Disguised && actor.World.RenderPlayer != null)
+ return effectiveOwner.Owner.Color;
+
+ return actor.Owner.Color;
+ }
+
public static string FormatInvariant(this string format, params object[] args)
{
return string.Format(CultureInfo.InvariantCulture, format, args);
diff --git a/OpenRA.Game/GameInformation.cs b/OpenRA.Game/GameInformation.cs
index 82cfccf22d..1401ad6dec 100644
--- a/OpenRA.Game/GameInformation.cs
+++ b/OpenRA.Game/GameInformation.cs
@@ -122,7 +122,7 @@ namespace OpenRA
FactionId = runtimePlayer.Faction.InternalName,
DisplayFactionName = runtimePlayer.DisplayFaction.Name,
DisplayFactionId = runtimePlayer.DisplayFaction.InternalName,
- Color = runtimePlayer.Color,
+ Color = OpenRA.Player.GetColor(runtimePlayer),
Team = client.Team,
Handicap = client.Handicap,
SpawnPoint = runtimePlayer.SpawnPoint,
diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs
index 08cdcb408d..d1012316d4 100644
--- a/OpenRA.Game/Graphics/WorldRenderer.cs
+++ b/OpenRA.Game/Graphics/WorldRenderer.cs
@@ -65,6 +65,8 @@ namespace OpenRA.Graphics
foreach (var p in world.Players)
UpdatePalettesForPlayer(p.InternalName, p.Color, false);
+ Player.SetupRelationshipColors(world.Players, world.LocalPlayer);
+
palette.Initialize();
TerrainLighting = world.WorldActor.TraitOrDefault();
diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs
index 7df35e0128..7b5c2c94c6 100644
--- a/OpenRA.Game/Player.cs
+++ b/OpenRA.Game/Player.cs
@@ -38,8 +38,6 @@ namespace OpenRA
public class Player : IScriptBindable, IScriptNotifyBind, ILuaTableBinding, ILuaEqualityBinding, ILuaToStringBinding
{
public readonly Actor PlayerActor;
- public readonly Color Color;
-
public readonly string PlayerName;
public readonly string InternalName;
public readonly FactionInfo Faction;
@@ -54,6 +52,11 @@ namespace OpenRA
public readonly Shroud Shroud;
public readonly FrozenActorLayer FrozenActorLayer;
+ readonly Color color;
+
+ /// Returns player color with relationship colors applied.
+ public Color Color { get; private set; }
+
/// The faction (including Random, etc.) that was selected in the lobby.
public readonly FactionInfo DisplayFaction;
@@ -152,7 +155,8 @@ namespace OpenRA
if (client != null)
{
ClientIndex = client.Index;
- Color = client.Color;
+ color = client.Color;
+ Color = color;
PlayerName = ResolvePlayerName(client, world.LobbyInfo.Clients, world.Map.Rules.Actors[SystemActors.Player].TraitInfos());
BotType = client.Bot;
@@ -170,6 +174,7 @@ namespace OpenRA
{
// Map player
ClientIndex = world.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin)?.Index ?? 0; // Owned by the host (TODO: fix this)
+ color = pr.Color;
Color = pr.Color;
PlayerName = pr.Name;
NonCombatant = pr.NonCombatant;
@@ -244,28 +249,30 @@ namespace OpenRA
return RelationshipWith(p) == PlayerRelationship.Ally;
}
- public static Color PlayerRelationshipColor(Actor a)
+ /// Returns , ignoring player relationship colors.
+ public static Color GetColor(Player p) => p.color;
+
+ public static void SetupRelationshipColors(Player[] players, Player viewer)
{
- var renderPlayer = a.World.RenderPlayer;
- var player = renderPlayer ?? a.World.LocalPlayer;
- if (player != null && !player.Spectating)
- {
- var effectiveOwner = a.EffectiveOwner;
- var apparentOwner = a.Owner;
- if (effectiveOwner != null && effectiveOwner.Disguised && !a.Owner.IsAlliedWith(renderPlayer))
- apparentOwner = effectiveOwner.Owner;
+ foreach (var p in players)
+ p.Color = PlayerRelationshipColor(p, viewer);
+ }
- if (apparentOwner == player)
- return ChromeMetrics.Get("PlayerStanceColorSelf");
+ public static Color PlayerRelationshipColor(Player player, Player viewer)
+ {
+ if (!Game.Settings.Game.UsePlayerStanceColors || viewer == null || viewer.Spectating)
+ return player.color;
- if (apparentOwner.IsAlliedWith(player))
- return ChromeMetrics.Get("PlayerStanceColorAllies");
+ if (viewer == player)
+ return ChromeMetrics.Get("PlayerStanceColorSelf");
- if (!apparentOwner.NonCombatant)
- return ChromeMetrics.Get("PlayerStanceColorEnemies");
- }
+ if (player.IsAlliedWith(viewer))
+ return ChromeMetrics.Get("PlayerStanceColorAllies");
- return ChromeMetrics.Get("PlayerStanceColorNeutrals");
+ if (player.NonCombatant)
+ return ChromeMetrics.Get("PlayerStanceColorNeutrals");
+
+ return ChromeMetrics.Get("PlayerStanceColorEnemies");
}
internal void PlayerDisconnected(Player p)
diff --git a/OpenRA.Mods.Cnc/Traits/Disguise.cs b/OpenRA.Mods.Cnc/Traits/Disguise.cs
index dd5c0c7817..9d27eebded 100644
--- a/OpenRA.Mods.Cnc/Traits/Disguise.cs
+++ b/OpenRA.Mods.Cnc/Traits/Disguise.cs
@@ -99,7 +99,7 @@ namespace OpenRA.Mods.Cnc.Traits
public override object Create(ActorInitializer init) { return new Disguise(init.Self, this); }
}
- sealed class Disguise : IEffectiveOwner, IIssueOrder, IResolveOrder, IOrderVoice, IRadarColorModifier, INotifyAttack,
+ sealed class Disguise : IEffectiveOwner, IIssueOrder, IResolveOrder, IOrderVoice, INotifyAttack,
INotifyDamage, INotifyLoadCargo, INotifyUnloadCargo, INotifyDemolition, INotifyInfiltration, ITick
{
public ActorInfo AsActor { get; private set; }
@@ -158,14 +158,6 @@ namespace OpenRA.Mods.Cnc.Traits
return order.OrderString == "Disguise" ? info.Voice : null;
}
- Color IRadarColorModifier.RadarColorOverride(Actor self, Color color)
- {
- if (!Disguised || self.Owner.IsAlliedWith(self.World.RenderPlayer))
- return color;
-
- return Game.Settings.Game.UsePlayerStanceColors ? Player.PlayerRelationshipColor(self) : AsPlayer.Color;
- }
-
public void DisguiseAs(Actor target)
{
var oldEffectiveActor = AsActor;
diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs
index 15b46f23e0..4c0cb4f867 100644
--- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs
+++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs
@@ -94,7 +94,7 @@ namespace OpenRA.Mods.Cnc.Traits
TextNotificationsManager.AddTransientLine(infiltrator.Owner, info.InfiltrationTextNotification);
if (info.ShowTicks)
- self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, infiltrator.Owner.Color, FloatingText.FormatCashTick(toGive), 30)));
+ self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, infiltrator.OwnerColor(), FloatingText.FormatCashTick(toGive), 30)));
}
}
}
diff --git a/OpenRA.Mods.Cnc/Traits/ResourcePurifier.cs b/OpenRA.Mods.Cnc/Traits/ResourcePurifier.cs
index 8f6572afcc..d2c4afd91e 100644
--- a/OpenRA.Mods.Cnc/Traits/ResourcePurifier.cs
+++ b/OpenRA.Mods.Cnc/Traits/ResourcePurifier.cs
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Cnc.Traits
{
var temp = currentDisplayValue;
if (self.Owner.IsAlliedWith(self.World.RenderPlayer))
- self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(temp), Info.TickLifetime)));
+ self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(temp), Info.TickLifetime)));
currentDisplayTick = Info.TickRate;
currentDisplayValue = 0;
diff --git a/OpenRA.Mods.Common/Activities/DonateCash.cs b/OpenRA.Mods.Common/Activities/DonateCash.cs
index cf9a52703a..73780fe7b6 100644
--- a/OpenRA.Mods.Common/Activities/DonateCash.cs
+++ b/OpenRA.Mods.Common/Activities/DonateCash.cs
@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Activities
exp.GiveExperience(playerExperience);
if (self.Owner.IsAlliedWith(self.World.RenderPlayer))
- self.World.AddFrameEndTask(w => w.Add(new FloatingText(targetActor.CenterPosition, targetOwner.Color, FloatingText.FormatCashTick(donated), 30)));
+ self.World.AddFrameEndTask(w => w.Add(new FloatingText(targetActor.CenterPosition, targetActor.OwnerColor(), FloatingText.FormatCashTick(donated), 30)));
foreach (var nct in targetActor.TraitsImplementing())
nct.OnAcceptingCash(targetActor, self);
diff --git a/OpenRA.Mods.Common/Activities/Sell.cs b/OpenRA.Mods.Common/Activities/Sell.cs
index 825aabebc0..78b061a480 100644
--- a/OpenRA.Mods.Common/Activities/Sell.cs
+++ b/OpenRA.Mods.Common/Activities/Sell.cs
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Activities
ns.Sold(self);
if (showTicks && refund > 0 && self.Owner.IsAlliedWith(self.World.RenderPlayer))
- self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(refund), 30)));
+ self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(refund), 30)));
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", sellableInfo.Notification, self.Owner.Faction.InternalName);
TextNotificationsManager.AddTransientLine(self.Owner, sellableInfo.TextNotification);
diff --git a/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs b/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs
index 8ce304d8b8..2f2dc0a094 100644
--- a/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs
+++ b/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs
@@ -129,7 +129,7 @@ namespace OpenRA.Mods.Common.Effects
{
var targetLine = new[] { prev, pos };
prev = pos;
- yield return new TargetLineRenderable(targetLine, building.Owner.Color, rp.Info.LineWidth, 1);
+ yield return new TargetLineRenderable(targetLine, building.OwnerColor(), rp.Info.LineWidth, 1);
}
}
}
diff --git a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs
index 8069c0666f..edafecbcc9 100644
--- a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs
+++ b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs
@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Projectiles
public IProjectile Create(ProjectileArgs args)
{
- var c = UsePlayerColor ? args.SourceActor.Owner.Color : Color;
+ var c = UsePlayerColor ? args.SourceActor.OwnerColor() : Color;
return new AreaBeam(this, args, c);
}
}
diff --git a/OpenRA.Mods.Common/Projectiles/Bullet.cs b/OpenRA.Mods.Common/Projectiles/Bullet.cs
index 4861bf4903..8cb1ccdd9b 100644
--- a/OpenRA.Mods.Common/Projectiles/Bullet.cs
+++ b/OpenRA.Mods.Common/Projectiles/Bullet.cs
@@ -201,8 +201,8 @@ namespace OpenRA.Mods.Common.Projectiles
if (info.ContrailLength > 0)
{
- var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, args.SourceActor.Owner.Color) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor);
- var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, args.SourceActor.Owner.Color) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor);
+ var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor);
+ var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor);
contrail = new ContrailRenderable(world, startcolor, endcolor, info.ContrailStartWidth, info.ContrailEndWidth ?? info.ContrailStartWidth, info.ContrailLength, info.ContrailDelay, info.ContrailZOffset);
}
diff --git a/OpenRA.Mods.Common/Projectiles/LaserZap.cs b/OpenRA.Mods.Common/Projectiles/LaserZap.cs
index 5f578ece9b..ff7016aa4c 100644
--- a/OpenRA.Mods.Common/Projectiles/LaserZap.cs
+++ b/OpenRA.Mods.Common/Projectiles/LaserZap.cs
@@ -98,7 +98,7 @@ namespace OpenRA.Mods.Common.Projectiles
public IProjectile Create(ProjectileArgs args)
{
- var c = UsePlayerColor ? args.SourceActor.Owner.Color : Color;
+ var c = UsePlayerColor ? args.SourceActor.OwnerColor() : Color;
return new LaserZap(this, args, c);
}
}
@@ -126,7 +126,7 @@ namespace OpenRA.Mods.Common.Projectiles
this.args = args;
this.info = info;
this.color = color;
- secondaryColor = info.SecondaryBeamUsePlayerColor ? args.SourceActor.Owner.Color : info.SecondaryBeamColor;
+ secondaryColor = info.SecondaryBeamUsePlayerColor ? args.SourceActor.OwnerColor() : info.SecondaryBeamColor;
target = args.PassiveTarget;
source = args.Source;
diff --git a/OpenRA.Mods.Common/Projectiles/Missile.cs b/OpenRA.Mods.Common/Projectiles/Missile.cs
index 4d39ba130b..894cd3914f 100644
--- a/OpenRA.Mods.Common/Projectiles/Missile.cs
+++ b/OpenRA.Mods.Common/Projectiles/Missile.cs
@@ -285,8 +285,8 @@ namespace OpenRA.Mods.Common.Projectiles
if (info.ContrailLength > 0)
{
- var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, args.SourceActor.Owner.Color) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor);
- var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, args.SourceActor.Owner.Color) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor);
+ var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor);
+ var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor);
contrail = new ContrailRenderable(world, startcolor, endcolor, info.ContrailStartWidth, info.ContrailEndWidth ?? info.ContrailStartWidth, info.ContrailLength, info.ContrailDelay, info.ContrailZOffset);
}
diff --git a/OpenRA.Mods.Common/Projectiles/Railgun.cs b/OpenRA.Mods.Common/Projectiles/Railgun.cs
index 9080fdcd66..799d78ccfd 100644
--- a/OpenRA.Mods.Common/Projectiles/Railgun.cs
+++ b/OpenRA.Mods.Common/Projectiles/Railgun.cs
@@ -95,8 +95,8 @@ namespace OpenRA.Mods.Common.Projectiles
public IProjectile Create(ProjectileArgs args)
{
- var bc = BeamPlayerColor ? Color.FromArgb(BeamColor.A, args.SourceActor.Owner.Color) : BeamColor;
- var hc = HelixPlayerColor ? Color.FromArgb(HelixColor.A, args.SourceActor.Owner.Color) : HelixColor;
+ var bc = BeamPlayerColor ? Color.FromArgb(BeamColor.A, args.SourceActor.OwnerColor()) : BeamColor;
+ var hc = HelixPlayerColor ? Color.FromArgb(HelixColor.A, args.SourceActor.OwnerColor()) : HelixColor;
return new Railgun(args, this, bc, hc);
}
}
diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs
index 8b62a6fb86..a0e53b0525 100644
--- a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs
+++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Scripting
public string Name => Player.PlayerName;
[Desc("The player's color.")]
- public Color Color => Player.Color;
+ public Color Color => Player.GetColor(Player);
[Desc("The player's faction.")]
public string Faction => Player.Faction.InternalName;
diff --git a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs
index 10db8db5ff..3a294533df 100644
--- a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs
+++ b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs
@@ -96,7 +96,7 @@ namespace OpenRA.Mods.Common.Traits
{
var temp = currentDisplayValue;
if (self.Owner.IsAlliedWith(self.World.RenderPlayer))
- self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(temp), 30)));
+ self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(temp), 30)));
currentDisplayTick = info.TickRate;
currentDisplayValue = 0;
}
diff --git a/OpenRA.Mods.Common/Traits/CashTrickler.cs b/OpenRA.Mods.Common/Traits/CashTrickler.cs
index 75c6dc4998..3b01ab26db 100644
--- a/OpenRA.Mods.Common/Traits/CashTrickler.cs
+++ b/OpenRA.Mods.Common/Traits/CashTrickler.cs
@@ -91,7 +91,7 @@ namespace OpenRA.Mods.Common.Traits
void AddCashTick(Actor self, int amount)
{
self.World.AddFrameEndTask(w => w.Add(
- new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(amount), info.DisplayDuration)));
+ new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(amount), info.DisplayDuration)));
}
void ModifyCash(Actor self, int amount)
diff --git a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs
index c3352cf6fe..58f3ca5cf9 100644
--- a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs
+++ b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs
@@ -132,7 +132,7 @@ namespace OpenRA.Mods.Common.Traits
var maxHP = healthInfo.MaxHP > 0 ? healthInfo.MaxHP : 1;
var damageText = $"{-e.Damage.Value} ({e.Damage.Value * 100 / maxHP}%)";
- self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.Owner.Color, damageText, 30)));
+ self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.OwnerColor(), damageText, 30)));
}
}
}
diff --git a/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs
index 85c85cbd5a..600c57f7fa 100644
--- a/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs
+++ b/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs
@@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits
var amount = collector.Owner.PlayerActor.Trait().ChangeCash(info.Amount);
if (info.UseCashTick)
- w.Add(new FloatingText(collector.CenterPosition, collector.Owner.Color, FloatingText.FormatCashTick(amount), 30));
+ w.Add(new FloatingText(collector.CenterPosition, collector.OwnerColor(), FloatingText.FormatCashTick(amount), 30));
});
base.Activate(collector);
diff --git a/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs b/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs
index 6ac2131e1b..4710b4e6f1 100644
--- a/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs
+++ b/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs
@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits
{
foreach (var exitCell in exitCells)
{
- var color = self.Owner.Color;
+ var color = self.OwnerColor();
var vec = exitCell - self.Location;
var center = wr.World.Map.CenterOfCell(exitCell);
yield return new TextAnnotationRenderable(manager.Font, center, 0, color, vec.ToString());
@@ -96,7 +96,7 @@ namespace OpenRA.Mods.Common.Traits
continue;
var exitCellCenter = self.World.Map.CenterOfCell(exitCells[i]);
- yield return new LineAnnotationRenderable(spawnPos, exitCellCenter, 1, self.Owner.Color);
+ yield return new LineAnnotationRenderable(spawnPos, exitCellCenter, 1, self.OwnerColor());
}
}
}
diff --git a/OpenRA.Mods.Common/Traits/GivesBounty.cs b/OpenRA.Mods.Common/Traits/GivesBounty.cs
index 3c58d0fc15..779092dc39 100644
--- a/OpenRA.Mods.Common/Traits/GivesBounty.cs
+++ b/OpenRA.Mods.Common/Traits/GivesBounty.cs
@@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits
var displayedBounty = GetDisplayedBountyValue(self);
if (Info.ShowBounty && self.IsInWorld && displayedBounty != 0 && e.Attacker.Owner.IsAlliedWith(self.World.RenderPlayer))
- e.Attacker.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.Owner.Color, FloatingText.FormatCashTick(displayedBounty), 30)));
+ e.Attacker.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.OwnerColor(), FloatingText.FormatCashTick(displayedBounty), 30)));
e.Attacker.Owner.PlayerActor.Trait().ChangeCash(GetBountyValue(self));
}
diff --git a/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs
index 57e2fb7a9f..d580ce71a7 100644
--- a/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs
+++ b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs
@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits
return;
self.World.AddFrameEndTask(w => w.Add(
- new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(amount), info.DisplayDuration)));
+ new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(amount), info.DisplayDuration)));
}
}
}
diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs
index 6ccac014e9..096c889d39 100644
--- a/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs
+++ b/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs
@@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits
playerRadarPing = radarPings.Add(
() => self.Owner.IsAlliedWith(self.World.RenderPlayer),
order.Target.CenterPosition,
- self.Owner.Color,
+ self.OwnerColor(),
info.Duration);
}
});
diff --git a/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs b/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs
index 8fdf20c8ad..200d72f8ec 100644
--- a/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs
+++ b/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs
@@ -47,7 +47,7 @@ namespace OpenRA.Mods.Common.Traits.Radar
if (IsTraitDisabled || (viewer != null && !Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(viewer))))
return;
- var color = Game.Settings.Game.UsePlayerStanceColors ? Player.PlayerRelationshipColor(self) : self.Owner.Color;
+ var color = self.OwnerColor();
if (modifier != null)
color = modifier.RadarColorOverride(self, color);
diff --git a/OpenRA.Mods.Common/Traits/Render/Contrail.cs b/OpenRA.Mods.Common/Traits/Render/Contrail.cs
index 9e4d6f9aec..465d7ae09a 100644
--- a/OpenRA.Mods.Common/Traits/Render/Contrail.cs
+++ b/OpenRA.Mods.Common/Traits/Render/Contrail.cs
@@ -75,8 +75,8 @@ namespace OpenRA.Mods.Common.Traits
{
this.info = info;
- startcolor = info.StartColorUsePlayerColor ? Color.FromArgb(info.StartColorAlpha, self.Owner.Color) : Color.FromArgb(info.StartColorAlpha, info.StartColor);
- endcolor = info.EndColorUsePlayerColor ? Color.FromArgb(info.EndColorAlpha, self.Owner.Color) : Color.FromArgb(info.EndColorAlpha, info.EndColor ?? startcolor);
+ startcolor = info.StartColorUsePlayerColor ? Color.FromArgb(info.StartColorAlpha, Player.ActorColor(self)) : Color.FromArgb(info.StartColorAlpha, info.StartColor);
+ endcolor = info.EndColorUsePlayerColor ? Color.FromArgb(info.EndColorAlpha, Player.ActorColor(self)) : Color.FromArgb(info.EndColorAlpha, info.EndColor ?? startcolor);
trail = new ContrailRenderable(self.World, startcolor, endcolor, info.StartWidth, info.EndWidth ?? info.StartWidth, info.TrailLength, info.TrailDelay, info.ZOffset);
body = self.Trait();
diff --git a/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs b/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs
index bea697c060..4721c335d0 100644
--- a/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs
+++ b/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs
@@ -30,7 +30,6 @@ namespace OpenRA.Mods.Common.Traits.Render
{
readonly DebugVisualizations debugVis;
readonly SpriteFont font;
- readonly Actor self;
readonly WVec offset;
SquadManagerBotModule[] squadManagerModules;
@@ -43,8 +42,7 @@ namespace OpenRA.Mods.Common.Traits.Render
var yOffset = buildingInfo?.Dimensions.Y ?? 1;
offset = new WVec(0, 512 * yOffset, 0);
- this.self = self;
- color = GetColor();
+ color = self.OwnerColor();
font = Game.Renderer.Fonts[info.Font];
debugVis = self.World.WorldActor.TraitOrDefault();
@@ -60,15 +58,7 @@ namespace OpenRA.Mods.Common.Traits.Render
tagString = self.ToString();
}
- void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
- {
- color = GetColor();
- }
-
- Color GetColor()
- {
- return self.EffectiveOwner != null && self.EffectiveOwner.Disguised ? self.EffectiveOwner.Owner.Color : self.Owner.Color;
- }
+ void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) => color = self.OwnerColor();
IEnumerable IRenderAnnotationsWhenSelected.RenderAnnotations(Actor self, WorldRenderer wr)
{
diff --git a/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs
index 6030709470..0738d5c6c0 100644
--- a/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs
+++ b/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs
@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits.Render
: base(self, info)
{
font = Game.Renderer.Fonts[info.Font];
- color = info.UsePlayerColor ? self.Owner.Color : info.Color;
+ color = info.UsePlayerColor ? self.OwnerColor() : info.Color;
name = self.Owner.PlayerName;
if (name.Length > info.MaxLength)
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Traits.Render
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{
if (Info.UsePlayerColor)
- color = newOwner.Color;
+ color = self.OwnerColor();
name = self.Owner.PlayerName;
if (name.Length > Info.MaxLength)
diff --git a/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs b/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs
index 1b6ae5c77b..e8dc83fb48 100644
--- a/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs
+++ b/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs
@@ -102,7 +102,7 @@ namespace OpenRA.Mods.Common.Traits.Render
self.CenterPosition,
Info.Range,
0,
- Info.UsePlayerColor ? self.Owner.Color : Info.Color,
+ Info.UsePlayerColor ? self.OwnerColor() : Info.Color,
Info.Width,
Info.BorderColor,
Info.BorderWidth);
diff --git a/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs
index 982c17a6ee..4e47a9f4b8 100644
--- a/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs
+++ b/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits.Render
{
this.info = info;
font = Game.Renderer.Fonts[info.Font];
- color = info.UsePlayerColor ? self.Owner.Color : info.Color;
+ color = info.UsePlayerColor ? self.OwnerColor() : info.Color;
label = new CachedTransform(g => self.World.ControlGroups.Groups[g]);
}
@@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Traits.Render
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{
if (info.UsePlayerColor)
- color = newOwner.Color;
+ color = self.OwnerColor();
}
}
}
diff --git a/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs
index 2f14eeaee7..046616762e 100644
--- a/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs
+++ b/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs
@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits.Render
: base(self, info)
{
font = Game.Renderer.Fonts[info.Font];
- color = info.UsePlayerColor ? self.Owner.Color : info.Color;
+ color = info.UsePlayerColor ? self.OwnerColor() : info.Color;
}
protected override IEnumerable RenderDecoration(Actor self, WorldRenderer wr, int2 screenPos)
@@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Traits.Render
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{
if (Info.UsePlayerColor)
- color = newOwner.Color;
+ color = self.OwnerColor();
}
}
}
diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/TogglePlayerStanceColorHotkeyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/TogglePlayerStanceColorHotkeyLogic.cs
index f276b322b9..ce7d85c71e 100644
--- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/TogglePlayerStanceColorHotkeyLogic.cs
+++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/TogglePlayerStanceColorHotkeyLogic.cs
@@ -18,13 +18,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic.Ingame
[ChromeLogicArgsHotkeys("TogglePlayerStanceColorKey")]
public class TogglePlayerStanceColorHotkeyLogic : SingleHotkeyBaseLogic
{
+ readonly World world;
+
[ObjectCreator.UseCtor]
- public TogglePlayerStanceColorHotkeyLogic(Widget widget, ModData modData, Dictionary logicArgs)
- : base(widget, modData, "TogglePlayerStanceColorKey", "WORLD_KEYHANDLER", logicArgs) { }
+ public TogglePlayerStanceColorHotkeyLogic(Widget widget, World world, ModData modData, Dictionary logicArgs)
+ : base(widget, modData, "TogglePlayerStanceColorKey", "WORLD_KEYHANDLER", logicArgs)
+ {
+ this.world = world;
+ }
protected override bool OnHotkeyActivated(KeyInput e)
{
Game.Settings.Game.UsePlayerStanceColors ^= true;
+ Player.SetupRelationshipColors(world.Players, world.LocalPlayer);
return true;
}
diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs
index e43e67fc80..07d0109fec 100644
--- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs
+++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs
@@ -515,8 +515,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
static void SetupPlayerColor(Player player, ScrollItemWidget template, ColorBlockWidget colorBlockWidget, GradientColorBlockWidget gradientColorBlockWidget)
{
- var color = Color.FromArgb(128, player.Color.R, player.Color.G, player.Color.B);
- var hoverColor = Color.FromArgb(192, player.Color.R, player.Color.G, player.Color.B);
+ var pColor = player.Color;
+ var color = Color.FromArgb(128, pColor.R, pColor.G, pColor.B);
+ var hoverColor = Color.FromArgb(192, pColor.R, pColor.G, pColor.B);
var isMouseOver = new CachedTransform(w => w == template || template.Children.Contains(w));
diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs
index 1e55ed57fe..6cde3ad671 100644
--- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs
+++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs
@@ -69,6 +69,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
o = viewport.ActorTooltip.Owner;
showOwner = o != null && !o.NonCombatant && viewport.ActorTooltip.TooltipInfo.IsOwnerRowVisible;
+ if (showOwner)
+ ownerColor = o.Color;
+
var stance = o == null || world.RenderPlayer == null ? PlayerRelationship.None : o.RelationshipWith(world.RenderPlayer);
labelText = viewport.ActorTooltip.TooltipInfo.TooltipForPlayerStance(stance);
break;
@@ -79,6 +82,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
o = viewport.FrozenActorTooltip.TooltipOwner;
showOwner = o != null && !o.NonCombatant && viewport.FrozenActorTooltip.TooltipInfo.IsOwnerRowVisible;
+ if (showOwner)
+ ownerColor = o.Color;
+
var stance = o == null || world.RenderPlayer == null ? PlayerRelationship.None : o.RelationshipWith(world.RenderPlayer);
labelText = viewport.FrozenActorTooltip.TooltipInfo.TooltipForPlayerStance(stance);
break;
@@ -107,7 +113,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
flagFaction = o.Faction.InternalName;
ownerName = o.PlayerName;
- ownerColor = o.Color;
widget.Bounds.Height = doubleHeight;
widget.Bounds.Width = Math.Max(widget.Bounds.Width,
owner.Bounds.X + ownerFont.Measure(ownerName).X + label.Bounds.X);
diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs
index 7c614f6533..897ae9bb1f 100644
--- a/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs
+++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/DisplaySettingsLogic.cs
@@ -137,6 +137,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
var ds = Game.Settings.Graphics;
var gs = Game.Settings.Game;
+ var world = worldRenderer.World;
var scrollPanel = panel.Get("SETTINGS_SCROLLPANEL");
SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
@@ -145,6 +146,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic
SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_GAMESPEED_CHECKBOX", ds, "CapFramerateToGameFps");
SettingsUtils.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate");
SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
+
+ var cb = panel.Get("PLAYER_STANCE_COLORS_CHECKBOX");
+ cb.IsChecked = () => gs.UsePlayerStanceColors;
+ cb.OnClick = () =>
+ {
+ gs.UsePlayerStanceColors = cb.IsChecked() ^ true;
+ Player.SetupRelationshipColors(world.Players, world.LocalPlayer);
+ };
+
if (panel.GetOrNull("PAUSE_SHELLMAP_CHECKBOX") != null)
SettingsUtils.BindCheckboxPref(panel, "PAUSE_SHELLMAP_CHECKBOX", gs, "PauseShellmap");
@@ -208,7 +218,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var minResolution = viewportSizes.MinEffectiveResolution;
var resolution = Game.Renderer.Resolution;
- var disableUIScale = worldRenderer.World.Type != WorldType.Shellmap ||
+ var disableUIScale = world.Type != WorldType.Shellmap ||
resolution.Width * ds.UIScale < 1.25f * minResolution.Width ||
resolution.Height * ds.UIScale < 1.25f * minResolution.Height;
@@ -240,7 +250,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var escPressed = false;
var nameTextfield = panel.Get("PLAYERNAME");
- nameTextfield.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap;
+ nameTextfield.IsDisabled = () => world.Type != WorldType.Shellmap;
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name);
nameTextfield.OnLoseFocus = () =>
{
@@ -272,7 +282,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var colorManager = modData.DefaultRules.Actors[SystemActors.World].TraitInfo();
var colorDropdown = panel.Get("PLAYERCOLOR");
- colorDropdown.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap;
+ colorDropdown.IsDisabled = () => world.Type != WorldType.Shellmap;
colorDropdown.OnMouseDown = _ => colorManager.ShowColorDropDown(colorDropdown, ps.Color, null, worldRenderer, color =>
{
ps.Color = color;
diff --git a/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs b/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs
index c78bba496c..1b92511efc 100644
--- a/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs
+++ b/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs
@@ -61,8 +61,7 @@ namespace OpenRA.Mods.Common.Widgets
var time = WidgetUtils.FormatTime(p.RemainingTicks, false, self.World.Timestep);
var text = TranslationProvider.GetString(Format, Translation.Arguments("player", self.Owner.PlayerName, "support-power", p.Name, "time", time));
- var playerColor = Game.Settings.Game.UsePlayerStanceColors ? Player.PlayerRelationshipColor(self) : self.Owner.Color;
- var color = !p.Ready || Game.LocalTick % 50 < 25 ? playerColor : Color.White;
+ var color = !p.Ready || Game.LocalTick % 50 < 25 ? self.OwnerColor() : Color.White;
return (text, color);
}).ToArray();
diff --git a/mods/cnc/languages/chrome/en.ftl b/mods/cnc/languages/chrome/en.ftl
index 0fc85819f9..308f096a38 100644
--- a/mods/cnc/languages/chrome/en.ftl
+++ b/mods/cnc/languages/chrome/en.ftl
@@ -643,7 +643,7 @@ label-status-bar-dropdown-container-bars = Status Bars:
checkbox-player-stance-colors-container =
.label = Player Relationship Colors
- .tooltip = Change minimap and health bar colors based on relationship (own, enemy, ally, neutral)
+ .tooltip = Change player colors based on relationship (own, enemy, ally, neutral)
checkbox-ui-feedback-container =
.label = Show UI Feedback Notifications
diff --git a/mods/common/languages/chrome/en.ftl b/mods/common/languages/chrome/en.ftl
index 61ed086a73..4982043143 100644
--- a/mods/common/languages/chrome/en.ftl
+++ b/mods/common/languages/chrome/en.ftl
@@ -468,7 +468,7 @@ label-status-bar-dropdown-container-bars = Status Bars:
checkbox-player-stance-colors-container =
.label = Player Relationship Colors
- .tooltip = Change minimap and health bar colors based on relationship (own, enemy, ally, neutral)
+ .tooltip = Change player colors based on relationship (own, enemy, ally, neutral)
checkbox-ui-feedback-container =
.label = Show UI Feedback Notifications