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