diff --git a/OpenRA.Game/FieldLoader.cs b/OpenRA.Game/FieldLoader.cs index 2464f929c821..3c94352d071e 100644 --- a/OpenRA.Game/FieldLoader.cs +++ b/OpenRA.Game/FieldLoader.cs @@ -228,7 +228,7 @@ public static object GetValue(string fieldName, Type fieldType, MiniYaml yaml, M else if (fieldType == typeof(Color)) { Color color; - if (value != null && HSLColor.TryParseRGB(value, out color)) + if (value != null && Color.TryParse(value, out color)) return color; return InvalidValueAction(value, fieldType, fieldName); @@ -241,7 +241,7 @@ public static object GetValue(string fieldName, Type fieldType, MiniYaml yaml, M var colors = new Color[parts.Length]; for (var i = 0; i < colors.Length; i++) - if (!HSLColor.TryParseRGB(parts[i], out colors[i])) + if (!Color.TryParse(parts[i], out colors[i])) return InvalidValueAction(value, fieldType, fieldName); return colors; @@ -249,25 +249,6 @@ public static object GetValue(string fieldName, Type fieldType, MiniYaml yaml, M return InvalidValueAction(value, fieldType, fieldName); } - else if (fieldType == typeof(HSLColor)) - { - if (value != null) - { - Color rgb; - if (HSLColor.TryParseRGB(value, out rgb)) - return new HSLColor(rgb); - - // Allow old HSLColor/ColorRamp formats to be parsed as HSLColor - var parts = value.Split(','); - if (parts.Length == 3 || parts.Length == 4) - return new HSLColor( - (byte)Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255), - (byte)Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255), - (byte)Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255)); - } - - return InvalidValueAction(value, fieldType, fieldName); - } else if (fieldType == typeof(Hotkey)) { Hotkey res; diff --git a/OpenRA.Game/FieldSaver.cs b/OpenRA.Game/FieldSaver.cs index ac0349c74f71..5fe666783736 100644 --- a/OpenRA.Game/FieldSaver.cs +++ b/OpenRA.Game/FieldSaver.cs @@ -74,16 +74,9 @@ public static string FormatValue(object v) var t = v.GetType(); - // Color.ToString() does the wrong thing; force it to format as rgb[a] hex if (t == typeof(Color)) { - return HSLColor.ToHexString((Color)v); - } - - // HSLColor.ToString() does the wrong thing; force it to format as rgb[a] hex - if (t == typeof(HSLColor)) - { - return ((HSLColor)v).ToHexString(); + return ((Color)v).ToString(); } if (t == typeof(Rectangle)) diff --git a/OpenRA.Game/GameInformation.cs b/OpenRA.Game/GameInformation.cs index 2f352584a8ed..b4ea8f4cecf3 100644 --- a/OpenRA.Game/GameInformation.cs +++ b/OpenRA.Game/GameInformation.cs @@ -12,8 +12,8 @@ using System; using System.Collections.Generic; using System.Linq; -using OpenRA.Graphics; using OpenRA.Network; +using OpenRA.Primitives; namespace OpenRA { @@ -155,7 +155,7 @@ public class Player /// The faction ID, a.k.a. the faction's internal name. public string FactionId; - public HSLColor Color; + public Color Color; /// The team ID on start-up, or 0 if the player is not part of a team. public int Team; diff --git a/OpenRA.Game/Graphics/HSLColor.cs b/OpenRA.Game/Graphics/HSLColor.cs deleted file mode 100644 index 7917e106574f..000000000000 --- a/OpenRA.Game/Graphics/HSLColor.cs +++ /dev/null @@ -1,147 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System.Globalization; -using OpenRA.Primitives; -using OpenRA.Scripting; - -namespace OpenRA.Graphics -{ - public struct HSLColor : IScriptBindable - { - public readonly byte H; - public readonly byte S; - public readonly byte L; - public readonly Color RGB; - - public static HSLColor FromHSV(float h, float s, float v) - { - var ll = 0.5f * (2 - s) * v; - var ss = (ll >= 1 || v <= 0) ? 0 : 0.5f * s * v / (ll <= 0.5f ? ll : 1 - ll); - return new HSLColor((byte)(255 * h), (byte)(255 * ss), (byte)(255 * ll)); - } - - public HSLColor(Color color) - { - RGB = color; - H = (byte)((color.GetHue() / 360.0f) * 255); - S = (byte)(color.GetSaturation() * 255); - L = (byte)(color.GetBrightness() * 255); - } - - public static HSLColor FromRGB(int r, int g, int b) - { - return new HSLColor(Color.FromArgb(r, g, b)); - } - - public static Color RGBFromHSL(float h, float s, float l) - { - // Convert from HSL to RGB - var q = (l < 0.5f) ? l * (1 + s) : l + s - (l * s); - var p = 2 * l - q; - - float[] trgb = { h + 1 / 3.0f, h, h - 1 / 3.0f }; - float[] rgb = { 0, 0, 0 }; - - for (var k = 0; k < 3; k++) - { - while (trgb[k] < 0) trgb[k] += 1.0f; - while (trgb[k] > 1) trgb[k] -= 1.0f; - } - - for (var k = 0; k < 3; k++) - { - if (trgb[k] < 1 / 6.0f) - rgb[k] = p + ((q - p) * 6 * trgb[k]); - else if (trgb[k] >= 1 / 6.0f && trgb[k] < 0.5) - rgb[k] = q; - else if (trgb[k] >= 0.5f && trgb[k] < 2.0f / 3) - rgb[k] = p + ((q - p) * 6 * (2.0f / 3 - trgb[k])); - else - rgb[k] = p; - } - - return Color.FromArgb((int)(rgb[0] * 255), (int)(rgb[1] * 255), (int)(rgb[2] * 255)); - } - - public static bool TryParseRGB(string value, out Color color) - { - color = new Color(); - value = value.Trim(); - if (value.Length != 6 && value.Length != 8) - return false; - - byte red, green, blue, alpha = 255; - if (!byte.TryParse(value.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out red) - || !byte.TryParse(value.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out green) - || !byte.TryParse(value.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out blue)) - return false; - - if (value.Length == 8 - && !byte.TryParse(value.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out alpha)) - return false; - - color = Color.FromArgb(alpha, red, green, blue); - return true; - } - - public static bool operator ==(HSLColor me, HSLColor other) - { - // Binary floating point numbers (float, double) calculations can yield the same RGB color created by different functions with little different HSL representation - return (me.H == other.H && me.S == other.S && me.L == other.L) || me.RGB == other.RGB; - } - - public static bool operator !=(HSLColor me, HSLColor other) { return !(me == other); } - - public HSLColor(byte h, byte s, byte l) - { - H = h; - S = s; - L = l; - RGB = RGBFromHSL(H / 255f, S / 255f, L / 255f); - } - - public void ToHSV(out float h, out float s, out float v) - { - var ll = 2 * L / 255f; - var ss = S / 255f * ((ll <= 1) ? ll : 2 - ll); - - h = H / 255f; - s = (2 * ss) / (ll + ss); - v = (ll + ss) / 2; - } - - public override string ToString() - { - return "{0},{1},{2}".F(H, S, L); - } - - public static string ToHexString(Color color) - { - if (color.A == 255) - return color.R.ToString("X2") + color.G.ToString("X2") + color.B.ToString("X2"); - return color.R.ToString("X2") + color.G.ToString("X2") + color.B.ToString("X2") + color.A.ToString("X2"); - } - - public string ToHexString() - { - return ToHexString(RGB); - } - - public override int GetHashCode() { return H.GetHashCode() ^ S.GetHashCode() ^ L.GetHashCode(); } - - public override bool Equals(object obj) - { - var o = obj as HSLColor?; - return o != null && o == this; - } - } -} diff --git a/OpenRA.Game/Graphics/PlayerColorRemap.cs b/OpenRA.Game/Graphics/PlayerColorRemap.cs index 43f865bb5824..5c75dfec3bbf 100644 --- a/OpenRA.Game/Graphics/PlayerColorRemap.cs +++ b/OpenRA.Game/Graphics/PlayerColorRemap.cs @@ -25,12 +25,16 @@ public static int GetRemapIndex(int[] ramp, int i) return ramp[i]; } - public PlayerColorRemap(int[] ramp, HSLColor c, float rampFraction) + public PlayerColorRemap(int[] ramp, Color c, float rampFraction) { + var h = c.GetHue() / 360.0f; + var s = c.GetSaturation(); + var l = c.GetBrightness(); + // Increase luminosity if required to represent the full ramp - var rampRange = (byte)((1 - rampFraction) * c.L); - var c1 = new HSLColor(c.H, c.S, Math.Max(rampRange, c.L)).RGB; - var c2 = new HSLColor(c.H, c.S, (byte)Math.Max(0, c.L - rampRange)).RGB; + var rampRange = (byte)((1 - rampFraction) * l); + var c1 = Color.FromAhsl(h, s, Math.Max(rampRange, l)); + var c2 = Color.FromAhsl(h, s, (byte)Math.Max(0, l - rampRange)); var baseIndex = ramp[0]; var remapRamp = ramp.Select(r => r - ramp[0]); var rampMaxIndex = ramp.Length - 1; diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index c10ff1a394d5..703e35ffb82f 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -67,7 +67,7 @@ internal WorldRenderer(ModData modData, World world) debugVis = Exts.Lazy(() => world.WorldActor.TraitOrDefault()); } - public void UpdatePalettesForPlayer(string internalName, HSLColor color, bool replaceExisting) + public void UpdatePalettesForPlayer(string internalName, Color color, bool replaceExisting) { foreach (var pal in World.WorldActor.TraitsImplementing()) pal.LoadPlayerPalettes(this, internalName, color, replaceExisting); diff --git a/OpenRA.Game/Map/PlayerReference.cs b/OpenRA.Game/Map/PlayerReference.cs index 523921166b61..1a8b59a85bec 100644 --- a/OpenRA.Game/Map/PlayerReference.cs +++ b/OpenRA.Game/Map/PlayerReference.cs @@ -9,7 +9,7 @@ */ #endregion -using OpenRA.Graphics; +using OpenRA.Primitives; namespace OpenRA { @@ -30,7 +30,7 @@ public class PlayerReference public string Faction; public bool LockColor = false; - public HSLColor Color = new HSLColor(0, 0, 238); + public Color Color = Color.FromAhsl(0, 0, 238); public bool LockSpawn = false; public int Spawn = 0; diff --git a/OpenRA.Game/Network/GameServer.cs b/OpenRA.Game/Network/GameServer.cs index c47fca6904c5..ce0d7fc94cb3 100644 --- a/OpenRA.Game/Network/GameServer.cs +++ b/OpenRA.Game/Network/GameServer.cs @@ -13,7 +13,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; -using OpenRA.Graphics; +using OpenRA.Primitives; namespace OpenRA.Network { @@ -21,7 +21,7 @@ public class GameClient { public readonly string Name; public readonly string Fingerprint; - public readonly HSLColor Color; + public readonly Color Color; public readonly string Faction; public readonly int Team; public readonly int SpawnPoint; diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index 1e24c143ad01..b287ffb046af 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -12,7 +12,7 @@ using System; using System.Collections.Generic; using System.Linq; -using OpenRA.Graphics; +using OpenRA.Primitives; namespace OpenRA.Network { @@ -110,8 +110,8 @@ public static Client Deserialize(MiniYaml data) } public int Index; - public HSLColor PreferredColor; // Color that the client normally uses from settings.yaml. - public HSLColor Color; // Actual color that the client is using. Usually the same as PreferredColor but can be different on maps with locked colors. + public Color PreferredColor; // Color that the client normally uses from settings.yaml. + public Color Color; // Actual color that the client is using. Usually the same as PreferredColor but can be different on maps with locked colors. public string Faction; public int SpawnPoint; public string Name; diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 88242a6340b0..f0165c1956c7 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -58,7 +58,7 @@ internal static void ProcessOrder(OrderManager orderManager, World world, int cl if (orderManager.LocalClient != null && client != orderManager.LocalClient && client.Team > 0 && client.Team == orderManager.LocalClient.Team) suffix += " (Ally)"; - Game.AddChatLine(client.Color.RGB, client.Name + suffix, message); + Game.AddChatLine(client.Color, client.Name + suffix, message); } else Game.AddChatLine(Color.White, "(player {0})".F(clientId), message); @@ -86,17 +86,17 @@ internal static void ProcessOrder(OrderManager orderManager, World world, int cl if (world == null) { if (orderManager.LocalClient != null && client.Team == orderManager.LocalClient.Team) - Game.AddChatLine(client.Color.RGB, "[Team] " + client.Name, order.TargetString); + Game.AddChatLine(client.Color, "[Team] " + client.Name, order.TargetString); } else { var player = world.FindPlayerByClient(client); if (player != null && player.WinState == WinState.Lost) - Game.AddChatLine(client.Color.RGB, client.Name + " (Dead)", order.TargetString); + Game.AddChatLine(client.Color, client.Name + " (Dead)", order.TargetString); else if ((player != null && world.LocalPlayer != null && player.Stances[world.LocalPlayer] == Stance.Ally) || (world.IsReplay && player != null)) - Game.AddChatLine(client.Color.RGB, "[Team" + (world.IsReplay ? " " + client.Team : "") + "] " + client.Name, order.TargetString); + Game.AddChatLine(client.Color, "[Team" + (world.IsReplay ? " " + client.Team : "") + "] " + client.Name, order.TargetString); else if ((orderManager.LocalClient != null && orderManager.LocalClient.IsObserver && client.IsObserver) || (world.IsReplay && client.IsObserver)) - Game.AddChatLine(client.Color.RGB, "[Spectators] " + client.Name, order.TargetString); + Game.AddChatLine(client.Color, "[Spectators] " + client.Name, order.TargetString); } } diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 060ec121ae77..eb4e9b247aac 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -296,7 +296,6 @@ - diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 2e1387312ee8..634664c8f4b0 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -44,7 +44,7 @@ struct StanceColors } public readonly Actor PlayerActor; - public readonly HSLColor Color; + public readonly Color Color; public readonly string PlayerName; public readonly string InternalName; diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index de082f5da903..554ca753b4f1 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -378,7 +378,7 @@ void ValidateClient(Connection newConn, string data) if (client.Slot != null) SyncClientToPlayerReference(client, Map.Players.Players[client.Slot]); else - client.Color = HSLColor.FromRGB(255, 255, 255); + client.Color = Color.White; // Promote connection to a valid client PreConns.Remove(newConn); diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 099692ca582f..c137dd9f6f0f 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -14,6 +14,7 @@ using System.IO; using System.Linq; using OpenRA.Graphics; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA @@ -186,9 +187,9 @@ public class PlayerSettings { [Desc("Sets the player nickname for in-game and IRC chat.")] public string Name = "Newbie"; - public HSLColor Color = new HSLColor(75, 255, 180); + public Color Color = Color.FromAhsl(75, 255, 180); public string LastServer = "localhost:1234"; - public HSLColor[] CustomColors = { }; + public Color[] CustomColors = { }; } public class GameSettings diff --git a/OpenRA.Game/Traits/Player/FixedColorPalette.cs b/OpenRA.Game/Traits/Player/FixedColorPalette.cs index 81ec72277b28..02dca34a8651 100644 --- a/OpenRA.Game/Traits/Player/FixedColorPalette.cs +++ b/OpenRA.Game/Traits/Player/FixedColorPalette.cs @@ -10,6 +10,7 @@ #endregion using OpenRA.Graphics; +using OpenRA.Primitives; namespace OpenRA.Traits { @@ -26,7 +27,7 @@ public class FixedColorPaletteInfo : ITraitInfo public readonly int[] RemapIndex = { }; [Desc("The fixed color to remap.")] - public readonly HSLColor Color; + public readonly Color Color; [Desc("Luminosity range to span.")] public readonly float Ramp = 0.05f; diff --git a/OpenRA.Game/Traits/Player/IndexedPlayerPalette.cs b/OpenRA.Game/Traits/Player/IndexedPlayerPalette.cs index 0147879001d7..c93b630e82bf 100644 --- a/OpenRA.Game/Traits/Player/IndexedPlayerPalette.cs +++ b/OpenRA.Game/Traits/Player/IndexedPlayerPalette.cs @@ -52,7 +52,7 @@ public IndexedPlayerPalette(IndexedPlayerPaletteInfo info) this.info = info; } - public void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor color, bool replaceExisting) + public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color color, bool replaceExisting) { var basePalette = wr.Palette(info.BasePalette).Palette; ImmutablePalette pal; diff --git a/OpenRA.Game/Traits/Player/PlayerColorPalette.cs b/OpenRA.Game/Traits/Player/PlayerColorPalette.cs index 65e9825fac35..3b84a8da99ef 100644 --- a/OpenRA.Game/Traits/Player/PlayerColorPalette.cs +++ b/OpenRA.Game/Traits/Player/PlayerColorPalette.cs @@ -10,6 +10,7 @@ #endregion using OpenRA.Graphics; +using OpenRA.Primitives; namespace OpenRA.Traits { @@ -43,7 +44,7 @@ public PlayerColorPalette(PlayerColorPaletteInfo info) this.info = info; } - public void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor color, bool replaceExisting) + public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color color, bool replaceExisting) { var remap = new PlayerColorRemap(info.RemapIndex, color, info.Ramp); var pal = new ImmutablePalette(wr.Palette(info.BasePalette).Palette, remap); diff --git a/OpenRA.Game/Traits/Player/PlayerHighlightPalette.cs b/OpenRA.Game/Traits/Player/PlayerHighlightPalette.cs index 3207245195df..e17e4a4a81d6 100644 --- a/OpenRA.Game/Traits/Player/PlayerHighlightPalette.cs +++ b/OpenRA.Game/Traits/Player/PlayerHighlightPalette.cs @@ -33,9 +33,9 @@ public PlayerHighlightPalette(PlayerHighlightPaletteInfo info) this.info = info; } - public void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor color, bool replaceExisting) + public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color color, bool replaceExisting) { - var argb = (uint)Color.FromArgb(128, color.RGB).ToArgb(); + var argb = (uint)Color.FromArgb(128, color).ToArgb(); var pal = new ImmutablePalette(Enumerable.Range(0, Palette.Size).Select(i => i == 0 ? 0 : argb)); wr.AddPalette(info.BaseName + playerName, pal, false, replaceExisting); } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index a19fc29f98b4..d343f2c46e32 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -278,7 +278,7 @@ public interface IProvidesCursorPaletteInfo : ITraitInfoInterface } public interface ILoadsPalettes { void LoadPalettes(WorldRenderer wr); } - public interface ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor playerColor, bool replaceExisting); } + public interface ILoadsPlayerPalettes { void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color playerColor, bool replaceExisting); } public interface IPaletteModifier { void AdjustPalette(IReadOnlyDictionary b); } public interface IPips { IEnumerable GetPips(Actor self); } diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index 3bce392538bb..09ee803f5d5e 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -256,8 +256,7 @@ public static string TruncateText(string text, int width, SpriteFont font) public static Color GetContrastColor(Color fgColor, Color bgDark, Color bgLight) { - var fg = new HSLColor(fgColor); - return fg.RGB == Color.White || fg.L > 80 ? bgDark : bgLight; + return fgColor == Color.White || fgColor.GetBrightness() > 0.33 ? bgDark : bgLight; } } diff --git a/OpenRA.Mods.Cnc/Player/PlaceSimpleBeacon.cs b/OpenRA.Mods.Cnc/Player/PlaceSimpleBeacon.cs index d3699a3e1299..d2ee36621a25 100644 --- a/OpenRA.Mods.Cnc/Player/PlaceSimpleBeacon.cs +++ b/OpenRA.Mods.Cnc/Player/PlaceSimpleBeacon.cs @@ -75,7 +75,7 @@ public void ResolveOrder(Actor self, Order order) playerRadarPing = radarPings.Add( () => self.Owner.IsAlliedWith(self.World.RenderPlayer), pos, - self.Owner.Color.RGB, + self.Owner.Color, info.Duration); } }); diff --git a/OpenRA.Mods.Cnc/Traits/Disguise.cs b/OpenRA.Mods.Cnc/Traits/Disguise.cs index e84de6ffcb95..ca2a71f74543 100644 --- a/OpenRA.Mods.Cnc/Traits/Disguise.cs +++ b/OpenRA.Mods.Cnc/Traits/Disguise.cs @@ -169,7 +169,7 @@ Color IRadarColorModifier.RadarColorOverride(Actor self, Color color) if (!Disguised || self.Owner.IsAlliedWith(self.World.RenderPlayer)) return color; - return color = Game.Settings.Game.UsePlayerStanceColors ? AsPlayer.PlayerStanceColor(self) : AsPlayer.Color.RGB; + return color = Game.Settings.Game.UsePlayerStanceColors ? AsPlayer.PlayerStanceColor(self) : AsPlayer.Color; } public void DisguiseAs(Actor target) diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs index 512b7a1b858d..4a346f8f2a17 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs @@ -67,7 +67,7 @@ void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet w.Add(new FloatingText(self.CenterPosition, infiltrator.Owner.Color.RGB, FloatingText.FormatCashTick(toGive), 30))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, infiltrator.Owner.Color, FloatingText.FormatCashTick(toGive), 30))); } } } diff --git a/OpenRA.Mods.Common/Activities/DonateCash.cs b/OpenRA.Mods.Common/Activities/DonateCash.cs index 313dcc1415aa..37a077e22b51 100644 --- a/OpenRA.Mods.Common/Activities/DonateCash.cs +++ b/OpenRA.Mods.Common/Activities/DonateCash.cs @@ -38,7 +38,7 @@ protected override void OnEnterComplete(Actor self, Actor targetActor) exp.GiveExperience(playerExperience); if (self.Owner.IsAlliedWith(self.World.RenderPlayer)) - self.World.AddFrameEndTask(w => w.Add(new FloatingText(targetActor.CenterPosition, targetOwner.Color.RGB, FloatingText.FormatCashTick(donated), 30))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(targetActor.CenterPosition, targetOwner.Color, 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 f0bffa35f838..eaf789224664 100644 --- a/OpenRA.Mods.Common/Activities/Sell.cs +++ b/OpenRA.Mods.Common/Activities/Sell.cs @@ -46,7 +46,7 @@ public override Activity Tick(Actor self) 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.RGB, FloatingText.FormatCashTick(refund), 30))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(refund), 30))); self.Dispose(); return this; diff --git a/OpenRA.Mods.Common/ColorValidator.cs b/OpenRA.Mods.Common/ColorValidator.cs index 0dc391a438f5..bd71523b885a 100644 --- a/OpenRA.Mods.Common/ColorValidator.cs +++ b/OpenRA.Mods.Common/ColorValidator.cs @@ -24,7 +24,7 @@ public class ColorValidator : IGlobalModData public readonly int Threshold = 0x50; public readonly float[] HsvSaturationRange = new[] { 0.25f, 1f }; public readonly float[] HsvValueRange = new[] { 0.2f, 1.0f }; - public readonly HSLColor[] TeamColorPresets = { }; + public readonly Color[] TeamColorPresets = { }; double GetColorDelta(Color colorA, Color colorB) { @@ -59,7 +59,9 @@ public bool IsValid(Color askedColor, out Color forbiddenColor, IEnumerable HsvSaturationRange[1] || v < HsvValueRange[0] || v > HsvValueRange[1]) { onError("Color was adjusted to be inside the allowed range."); @@ -87,23 +89,23 @@ public bool IsValid(Color askedColor, out Color forbiddenColor, IEnumerable terrainColors, IEnumerable playerColors) + public Color RandomPresetColor(MersenneTwister random, IEnumerable terrainColors, IEnumerable playerColors) { if (TeamColorPresets.Any()) { Color forbidden; Action ignoreError = _ => { }; foreach (var c in TeamColorPresets.Shuffle(random)) - if (IsValid(c.RGB, out forbidden, terrainColors, playerColors, ignoreError)) + if (IsValid(c, out forbidden, terrainColors, playerColors, ignoreError)) return c; } return RandomValidColor(random, terrainColors, playerColors); } - public HSLColor RandomValidColor(MersenneTwister random, IEnumerable terrainColors, IEnumerable playerColors) + public Color RandomValidColor(MersenneTwister random, IEnumerable terrainColors, IEnumerable playerColors) { - HSLColor color; + Color color; Color forbidden; Action ignoreError = _ => { }; do @@ -111,17 +113,17 @@ public HSLColor RandomValidColor(MersenneTwister random, IEnumerable terr var h = random.Next(255) / 255f; var s = float2.Lerp(HsvSaturationRange[0], HsvSaturationRange[1], random.NextFloat()); var v = float2.Lerp(HsvValueRange[0], HsvValueRange[1], random.NextFloat()); - color = HSLColor.FromHSV(h, s, v); - } while (!IsValid(color.RGB, out forbidden, terrainColors, playerColors, ignoreError)); + color = Color.FromAhsv(h, s, v); + } while (!IsValid(color, out forbidden, terrainColors, playerColors, ignoreError)); return color; } - public HSLColor MakeValid(Color askedColor, MersenneTwister random, IEnumerable terrainColors, IEnumerable playerColors, Action onError) + public Color MakeValid(Color askedColor, MersenneTwister random, IEnumerable terrainColors, IEnumerable playerColors, Action onError) { Color forbiddenColor; if (IsValid(askedColor, out forbiddenColor, terrainColors, playerColors, onError)) - return new HSLColor(askedColor); + return askedColor; // Vector between the 2 colors var vector = new double[] @@ -151,7 +153,7 @@ public HSLColor MakeValid(Color askedColor, MersenneTwister random, IEnumerable< var attempt = 1; var allForbidden = terrainColors.Concat(playerColors); - HSLColor color; + Color color; do { // If we reached the limit (The ii >= 255 prevents too much calculations) @@ -167,10 +169,10 @@ public HSLColor MakeValid(Color askedColor, MersenneTwister random, IEnumerable< var b = (forbiddenColor.B + (int)(vector[2] * weightVector[2] * attempt)).Clamp(0, 255); // Get the alternative color attempt - color = new HSLColor(Color.FromArgb(r, g, b)); + color = Color.FromArgb(r, g, b); attempt++; - } while (!IsValid(color.RGB, allForbidden, out forbiddenColor)); + } while (!IsValid(color, allForbidden, out forbiddenColor)); return color; } diff --git a/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs b/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs index 1886e3f73329..b4c5e7400f96 100644 --- a/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs +++ b/OpenRA.Mods.Common/Effects/RallyPointIndicator.cs @@ -98,7 +98,7 @@ IEnumerable IEffectAboveShroud.RenderAboveShroud(WorldRenderer wr) IEnumerable RenderInner(WorldRenderer wr) { if (Game.Settings.Game.DrawTargetLine) - yield return new TargetLineRenderable(targetLine, building.Owner.Color.RGB); + yield return new TargetLineRenderable(targetLine, building.Owner.Color); if (circles != null || flag != null) { diff --git a/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs b/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs index edad44ef5e22..b69fdf40c377 100644 --- a/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs @@ -108,7 +108,7 @@ public void Update(WPos pos) public static Color ChooseColor(Actor self) { - var ownerColor = Color.FromArgb(255, self.Owner.Color.RGB); + var ownerColor = Color.FromArgb(255, self.Owner.Color); return Exts.ColorLerp(0.5f, ownerColor, Color.White); } } diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 36601763c9ed..a7bb87cba5fd 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -238,7 +238,7 @@ - + diff --git a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs index 325a33d37874..70647e8bf700 100644 --- a/OpenRA.Mods.Common/Projectiles/AreaBeam.cs +++ b/OpenRA.Mods.Common/Projectiles/AreaBeam.cs @@ -69,7 +69,7 @@ public class AreaBeamInfo : IProjectileInfo public IProjectile Create(ProjectileArgs args) { - var c = UsePlayerColor ? args.SourceActor.Owner.Color.RGB : Color; + var c = UsePlayerColor ? args.SourceActor.Owner.Color : Color; return new AreaBeam(this, args, c); } } diff --git a/OpenRA.Mods.Common/Projectiles/LaserZap.cs b/OpenRA.Mods.Common/Projectiles/LaserZap.cs index dc469f8b70df..789f921bb93e 100644 --- a/OpenRA.Mods.Common/Projectiles/LaserZap.cs +++ b/OpenRA.Mods.Common/Projectiles/LaserZap.cs @@ -91,7 +91,7 @@ public class LaserZapInfo : IProjectileInfo public IProjectile Create(ProjectileArgs args) { - var c = UsePlayerColor ? args.SourceActor.Owner.Color.RGB : Color; + var c = UsePlayerColor ? args.SourceActor.Owner.Color : Color; return new LaserZap(this, args, c); } } @@ -115,7 +115,7 @@ public LaserZap(LaserZapInfo info, ProjectileArgs args, Color color) this.args = args; this.info = info; this.color = color; - secondaryColor = info.SecondaryBeamUsePlayerColor ? args.SourceActor.Owner.Color.RGB : info.SecondaryBeamColor; + secondaryColor = info.SecondaryBeamUsePlayerColor ? args.SourceActor.Owner.Color : info.SecondaryBeamColor; target = args.PassiveTarget; source = args.Source; diff --git a/OpenRA.Mods.Common/Projectiles/Railgun.cs b/OpenRA.Mods.Common/Projectiles/Railgun.cs index e3e24223aeda..dc9fad0a1a46 100644 --- a/OpenRA.Mods.Common/Projectiles/Railgun.cs +++ b/OpenRA.Mods.Common/Projectiles/Railgun.cs @@ -92,8 +92,8 @@ public class RailgunInfo : IProjectileInfo public IProjectile Create(ProjectileArgs args) { - var bc = BeamPlayerColor ? Color.FromArgb(BeamColor.A, args.SourceActor.Owner.Color.RGB) : BeamColor; - var hc = HelixPlayerColor ? Color.FromArgb(HelixColor.A, args.SourceActor.Owner.Color.RGB) : HelixColor; + var bc = BeamPlayerColor ? Color.FromArgb(BeamColor.A, args.SourceActor.Owner.Color) : BeamColor; + var hc = HelixPlayerColor ? Color.FromArgb(HelixColor.A, args.SourceActor.Owner.Color) : HelixColor; return new Railgun(args, this, bc, hc); } } diff --git a/OpenRA.Mods.Common/Scripting/Global/BeaconGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/BeaconGlobal.cs index 57ce5b122acb..ceff0b22a96c 100644 --- a/OpenRA.Mods.Common/Scripting/Global/BeaconGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/BeaconGlobal.cs @@ -38,7 +38,7 @@ public Beacon New(Player owner, WPos position, int duration = 30 * 25, bool show radarPings.Add( () => owner.IsAlliedWith(owner.World.RenderPlayer), position, - owner.Color.RGB, + owner.Color, duration); } diff --git a/OpenRA.Mods.Common/Scripting/Global/ColorGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/ColorGlobal.cs new file mode 100644 index 000000000000..ca7f7f4e2336 --- /dev/null +++ b/OpenRA.Mods.Common/Scripting/Global/ColorGlobal.cs @@ -0,0 +1,93 @@ +#region Copyright & License Information +/* + * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using Eluant; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Scripting; + +namespace OpenRA.Mods.Common.Scripting.Global +{ + // Kept as HSLColor for backwards compatibility + [ScriptGlobal("HSLColor")] + public class ColorGlobal : ScriptGlobal + { + public ColorGlobal(ScriptContext context) + : base(context) { } + + [Desc("Create a new color with the specified hue/saturation/luminosity.")] + public Color New(int hue, int saturation, int luminosity) + { + var h = (byte)hue.Clamp(0, 255); + var s = (byte)saturation.Clamp(0, 255); + var l = (byte)luminosity.Clamp(0, 255); + + return Color.FromAhsl(h, s, l); + } + + [Desc("Create a new color with the specified red/green/blue/[alpha] values.")] + public Color FromRGB(int red, int green, int blue, int alpha = 255) + { + return Color.FromArgb( + alpha.Clamp(0, 255), + red.Clamp(0, 255), + green.Clamp(0, 255), + blue.Clamp(0, 255)); + } + + [Desc("Create a new color with the specified red/green/blue/[alpha] hex string (rrggbb[aa]).")] + public Color FromHex(string value) + { + Color color; + if (Color.TryParse(value, out color)) + return color; + + throw new LuaException("Invalid rrggbb[aa] hex string."); + } + + public Color Aqua { get { return Color.Aqua; } } + public Color Black { get { return Color.Black; } } + public Color Blue { get { return Color.Blue; } } + public Color Brown { get { return Color.Brown; } } + public Color Cyan { get { return Color.Cyan; } } + public Color DarkBlue { get { return Color.DarkBlue; } } + public Color DarkCyan { get { return Color.DarkCyan; } } + public Color DarkGray { get { return Color.DarkGray; } } + public Color DarkGreen { get { return Color.DarkGreen; } } + public Color DarkOrange { get { return Color.DarkOrange; } } + public Color DarkRed { get { return Color.DarkRed; } } + public Color Fuchsia { get { return Color.Fuchsia; } } + public Color Gold { get { return Color.Gold; } } + public Color Gray { get { return Color.Gray; } } + public Color Green { get { return Color.Green; } } + public Color LawnGreen { get { return Color.LawnGreen; } } + public Color LightBlue { get { return Color.LightBlue; } } + public Color LightCyan { get { return Color.LightCyan; } } + public Color LightGray { get { return Color.LightGray; } } + public Color LightGreen { get { return Color.LightGreen; } } + public Color LightYellow { get { return Color.LightYellow; } } + public Color Lime { get { return Color.Lime; } } + public Color LimeGreen { get { return Color.LimeGreen; } } + public Color Magenta { get { return Color.Magenta; } } + public Color Maroon { get { return Color.Maroon; } } + public Color Navy { get { return Color.Navy; } } + public Color Olive { get { return Color.Olive; } } + public Color Orange { get { return Color.Orange; } } + public Color OrangeRed { get { return Color.OrangeRed; } } + public Color Purple { get { return Color.Purple; } } + public Color Red { get { return Color.Red; } } + public Color Salmon { get { return Color.Salmon; } } + public Color SkyBlue { get { return Color.SkyBlue; } } + public Color Teal { get { return Color.Teal; } } + public Color Yellow { get { return Color.Yellow; } } + public Color White { get { return Color.White; } } + } +} diff --git a/OpenRA.Mods.Common/Scripting/Global/HSLColorGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/HSLColorGlobal.cs deleted file mode 100644 index f7f26401cd28..000000000000 --- a/OpenRA.Mods.Common/Scripting/Global/HSLColorGlobal.cs +++ /dev/null @@ -1,90 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using Eluant; -using OpenRA.Graphics; -using OpenRA.Primitives; -using OpenRA.Scripting; - -namespace OpenRA.Mods.Common.Scripting.Global -{ - [ScriptGlobal("HSLColor")] - public class HSLColorGlobal : ScriptGlobal - { - public HSLColorGlobal(ScriptContext context) - : base(context) { } - - [Desc("Create a new HSL color with the specified hue/saturation/luminosity.")] - public HSLColor New(int hue, int saturation, int luminosity) - { - var h = (byte)hue.Clamp(0, 255); - var s = (byte)saturation.Clamp(0, 255); - var l = (byte)luminosity.Clamp(0, 255); - - return new HSLColor(h, s, l); - } - - [Desc("Create a new HSL color with the specified red/green/blue/[alpha] values.")] - public HSLColor FromRGB(int red, int green, int blue, int alpha = 255) - { - return new HSLColor( - Color.FromArgb( - alpha.Clamp(0, 255), red.Clamp(0, 255), green.Clamp(0, 255), blue.Clamp(0, 255))); - } - - [Desc("Create a new HSL color with the specified red/green/blue/[alpha] hex string (rrggbb[aa]).")] - public HSLColor FromHex(string value) - { - Color rgb; - if (HSLColor.TryParseRGB(value, out rgb)) - return new HSLColor(rgb); - - throw new LuaException("Invalid rrggbb[aa] hex string."); - } - - public HSLColor Aqua { get { return new HSLColor(Color.Aqua); } } - public HSLColor Black { get { return new HSLColor(Color.Black); } } - public HSLColor Blue { get { return new HSLColor(Color.Blue); } } - public HSLColor Brown { get { return new HSLColor(Color.Brown); } } - public HSLColor Cyan { get { return new HSLColor(Color.Cyan); } } - public HSLColor DarkBlue { get { return new HSLColor(Color.DarkBlue); } } - public HSLColor DarkCyan { get { return new HSLColor(Color.DarkCyan); } } - public HSLColor DarkGray { get { return new HSLColor(Color.DarkGray); } } - public HSLColor DarkGreen { get { return new HSLColor(Color.DarkGreen); } } - public HSLColor DarkOrange { get { return new HSLColor(Color.DarkOrange); } } - public HSLColor DarkRed { get { return new HSLColor(Color.DarkRed); } } - public HSLColor Fuchsia { get { return new HSLColor(Color.Fuchsia); } } - public HSLColor Gold { get { return new HSLColor(Color.Gold); } } - public HSLColor Gray { get { return new HSLColor(Color.Gray); } } - public HSLColor Green { get { return new HSLColor(Color.Green); } } - public HSLColor LawnGreen { get { return new HSLColor(Color.LawnGreen); } } - public HSLColor LightBlue { get { return new HSLColor(Color.LightBlue); } } - public HSLColor LightCyan { get { return new HSLColor(Color.LightCyan); } } - public HSLColor LightGray { get { return new HSLColor(Color.LightGray); } } - public HSLColor LightGreen { get { return new HSLColor(Color.LightGreen); } } - public HSLColor LightYellow { get { return new HSLColor(Color.LightYellow); } } - public HSLColor Lime { get { return new HSLColor(Color.Lime); } } - public HSLColor LimeGreen { get { return new HSLColor(Color.LimeGreen); } } - public HSLColor Magenta { get { return new HSLColor(Color.Magenta); } } - public HSLColor Maroon { get { return new HSLColor(Color.Maroon); } } - public HSLColor Navy { get { return new HSLColor(Color.Navy); } } - public HSLColor Olive { get { return new HSLColor(Color.Olive); } } - public HSLColor Orange { get { return new HSLColor(Color.Orange); } } - public HSLColor OrangeRed { get { return new HSLColor(Color.OrangeRed); } } - public HSLColor Purple { get { return new HSLColor(Color.Purple); } } - public HSLColor Red { get { return new HSLColor(Color.Red); } } - public HSLColor Salmon { get { return new HSLColor(Color.Salmon); } } - public HSLColor SkyBlue { get { return new HSLColor(Color.SkyBlue); } } - public HSLColor Teal { get { return new HSLColor(Color.Teal); } } - public HSLColor Yellow { get { return new HSLColor(Color.Yellow); } } - public HSLColor White { get { return new HSLColor(Color.White); } } - } -} diff --git a/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs index 46a24a4527b1..63a2f041b368 100644 --- a/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs @@ -189,12 +189,12 @@ public bool PlayMovieInRadar(string movie, LuaFunction playComplete = null) } [Desc("Display a text message to the player.")] - public void DisplayMessage(string text, string prefix = "Mission", HSLColor? color = null) + public void DisplayMessage(string text, string prefix = "Mission", Color? color = null) { if (string.IsNullOrEmpty(text)) return; - Color c = color.HasValue ? HSLColor.RGBFromHSL(color.Value.H / 255f, color.Value.S / 255f, color.Value.L / 255f) : Color.White; + var c = color.HasValue ? color.Value : Color.White; Game.AddChatLine(c, prefix, text); } @@ -208,12 +208,12 @@ public void Debug(string text) } [Desc("Display a text message at the specified location.")] - public void FloatingText(string text, WPos position, int duration = 30, HSLColor? color = null) + public void FloatingText(string text, WPos position, int duration = 30, Color? color = null) { if (string.IsNullOrEmpty(text) || !world.Map.Contains(world.Map.CellContaining(position))) return; - Color c = color.HasValue ? HSLColor.RGBFromHSL(color.Value.H / 255f, color.Value.S / 255f, color.Value.L / 255f) : Color.White; + var c = color.HasValue ? color.Value : Color.White; world.AddFrameEndTask(w => w.Add(new FloatingText(position, c, text, duration))); } diff --git a/OpenRA.Mods.Common/Scripting/Global/RadarGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/RadarGlobal.cs index 3273ee7866ad..68bbc17772dd 100644 --- a/OpenRA.Mods.Common/Scripting/Global/RadarGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/RadarGlobal.cs @@ -9,8 +9,8 @@ */ #endregion -using OpenRA.Graphics; using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; using OpenRA.Scripting; namespace OpenRA.Mods.Common.Scripting @@ -26,14 +26,14 @@ public RadarGlobal(ScriptContext context) : base(context) } [Desc("Creates a new radar ping that stays for the specified time at the specified WPos.")] - public void Ping(Player player, WPos position, HSLColor color, int duration = 30 * 25) + public void Ping(Player player, WPos position, Color color, int duration = 30 * 25) { if (radarPings != null) { radarPings.Add( () => player.World.RenderPlayer == player, position, - color.RGB, + color, duration); } } diff --git a/OpenRA.Mods.Common/Scripting/Global/UserInterfaceGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/UserInterfaceGlobal.cs index f5e19aa565fd..a411c7b2d998 100644 --- a/OpenRA.Mods.Common/Scripting/Global/UserInterfaceGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/UserInterfaceGlobal.cs @@ -24,12 +24,12 @@ public UserInterfaceGlobal(ScriptContext context) : base(context) { } [Desc("Displays a text message at the top center of the screen.")] - public void SetMissionText(string text, HSLColor? color = null) + public void SetMissionText(string text, Color? color = null) { var luaLabel = Ui.Root.Get("INGAME_ROOT").Get("MISSION_TEXT"); luaLabel.GetText = () => text; - Color c = color.HasValue ? HSLColor.RGBFromHSL(color.Value.H / 255f, color.Value.S / 255f, color.Value.L / 255f) : Color.White; + var c = color.HasValue ? color.Value : Color.White; luaLabel.GetColor = () => c; } } diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs index 2040dd2ceb94..ff3643170599 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs @@ -12,8 +12,8 @@ using System.Collections.Generic; using System.Linq; using Eluant; -using OpenRA.Graphics; using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; using OpenRA.Scripting; namespace OpenRA.Mods.Common.Scripting @@ -31,7 +31,7 @@ public PlayerProperties(ScriptContext context, Player player) public string Name { get { return Player.PlayerName; } } [Desc("The player's color.")] - public HSLColor Color { get { return Player.Color; } } + public Color Color { get { return Player.Color; } } [Desc("The player's faction.")] public string Faction { get { return Player.Faction.InternalName; } } diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 1e93704bf702..07d52d6f15ee 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -15,6 +15,7 @@ using OpenRA.Graphics; using OpenRA.Mods.Common.Traits; using OpenRA.Network; +using OpenRA.Primitives; using OpenRA.Server; using OpenRA.Traits; using S = OpenRA.Server.Server; @@ -43,7 +44,7 @@ public class LobbyCommands : ServerTrait, IInterpretCommand, INotifyServerStart, { "faction", Faction }, { "team", Team }, { "spawn", Spawn }, - { "color", Color }, + { "color", PlayerColor }, { "sync_lobby", SyncLobby } }; @@ -212,7 +213,7 @@ static bool Specate(S server, Connection conn, Session.Client client, string s) client.Slot = null; client.SpawnPoint = 0; client.Team = 0; - client.Color = HSLColor.FromRGB(255, 255, 255); + client.Color = Color.White; server.SyncLobbyClients(); CheckAutoStart(server); return true; @@ -345,8 +346,8 @@ static bool SlotBot(S server, Connection conn, Session.Client client, string s) var validator = server.ModData.Manifest.Get(); var tileset = server.Map.Rules.TileSet; var terrainColors = tileset.TerrainInfo.Where(ti => ti.RestrictPlayerColor).Select(ti => ti.Color); - var playerColors = server.LobbyInfo.Clients.Select(c => c.Color.RGB) - .Concat(server.Map.Players.Players.Values.Select(p => p.Color.RGB)); + var playerColors = server.LobbyInfo.Clients.Select(c => c.Color) + .Concat(server.Map.Players.Players.Values.Select(p => p.Color)); bot.Color = bot.PreferredColor = validator.RandomPresetColor(server.Random, terrainColors, playerColors); server.LobbyInfo.Clients.Add(bot); @@ -653,7 +654,7 @@ static bool MakeSpectator(S server, Connection conn, Session.Client client, stri targetClient.Slot = null; targetClient.SpawnPoint = 0; targetClient.Team = 0; - targetClient.Color = HSLColor.FromRGB(255, 255, 255); + targetClient.Color = Color.White; targetClient.State = Session.ClientState.NotReady; server.SendMessage("{0} moved {1} to spectators.".F(client.Name, targetClient.Name)); Log.Write("server", "{0} moved {1} to spectators.".F(client.Name, targetClient.Name)); @@ -785,7 +786,7 @@ static bool Spawn(S server, Connection conn, Session.Client client, string s) return true; } - static bool Color(S server, Connection conn, Session.Client client, string s) + static bool PlayerColor(S server, Connection conn, Session.Client client, string s) { var parts = s.Split(' '); var targetClient = server.LobbyInfo.ClientWithIndex(Exts.ParseIntegerInvariant(parts[0])); @@ -799,7 +800,7 @@ static bool Color(S server, Connection conn, Session.Client client, string s) return true; // Validate if color is allowed and get an alternative it isn't - var newColor = FieldLoader.GetValue("(value)", parts[1]); + var newColor = FieldLoader.GetValue("(value)", parts[1]); targetClient.Color = SanitizePlayerColor(server, newColor, targetClient.Index, conn); // Only update player's preferred color if new color is valid @@ -906,7 +907,7 @@ public static void LoadMapSettings(S server, Session.Global gs, Ruleset rules) } } - static HSLColor SanitizePlayerColor(S server, HSLColor askedColor, int playerIndex, Connection connectionToEcho = null) + static Color SanitizePlayerColor(S server, Color askedColor, int playerIndex, Connection connectionToEcho = null) { var validator = server.ModData.Manifest.Get(); var askColor = askedColor; @@ -919,10 +920,10 @@ static HSLColor SanitizePlayerColor(S server, HSLColor askedColor, int playerInd var tileset = server.Map.Rules.TileSet; var terrainColors = tileset.TerrainInfo.Where(ti => ti.RestrictPlayerColor).Select(ti => ti.Color).ToList(); - var playerColors = server.LobbyInfo.Clients.Where(c => c.Index != playerIndex).Select(c => c.Color.RGB) - .Concat(server.Map.Players.Players.Values.Select(p => p.Color.RGB)).ToList(); + var playerColors = server.LobbyInfo.Clients.Where(c => c.Index != playerIndex).Select(c => c.Color) + .Concat(server.Map.Players.Players.Values.Select(p => p.Color)).ToList(); - return validator.MakeValid(askColor.RGB, server.Random, terrainColors, playerColors, onError); + return validator.MakeValid(askColor, server.Random, terrainColors, playerColors, onError); } static string MissionBriefingOrDefault(S server) diff --git a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs index 428035b8663a..36388552488c 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs @@ -127,7 +127,7 @@ void ITick.Tick(Actor self) { var temp = currentDisplayValue; if (self.Owner.IsAlliedWith(self.World.RenderPlayer)) - self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color.RGB, FloatingText.FormatCashTick(temp), 30))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color, 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 38c3d5993c34..b667d0fcbd82 100644 --- a/OpenRA.Mods.Common/Traits/CashTrickler.cs +++ b/OpenRA.Mods.Common/Traits/CashTrickler.cs @@ -81,7 +81,7 @@ void ITick.Tick(Actor self) void AddCashTick(Actor self, int amount) { self.World.AddFrameEndTask(w => w.Add( - new FloatingText(self.CenterPosition, self.Owner.Color.RGB, FloatingText.FormatCashTick(amount), info.DisplayDuration))); + new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(amount), info.DisplayDuration))); } void ModifyCash(Actor self, Player newOwner, int amount) diff --git a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs index 2efb128b11ff..65e8adb9f68b 100644 --- a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs +++ b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs @@ -142,7 +142,7 @@ void INotifyDamage.Damaged(Actor self, AttackInfo e) var maxHP = healthInfo.MaxHP > 0 ? healthInfo.MaxHP : 1; var damageText = "{0} ({1}%)".F(-e.Damage.Value, e.Damage.Value * 100 / maxHP); - self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.Owner.Color.RGB, damageText, 30))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.Owner.Color, damageText, 30))); } } } diff --git a/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs index 7f4356156b8b..82ffea67a43b 100644 --- a/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/GiveCashCrateAction.cs @@ -41,7 +41,7 @@ public override void Activate(Actor collector) var amount = collector.Owner.PlayerActor.Trait().ChangeCash(info.Amount); if (info.UseCashTick) - w.Add(new FloatingText(collector.CenterPosition, collector.Owner.Color.RGB, FloatingText.FormatCashTick(amount), 30)); + w.Add(new FloatingText(collector.CenterPosition, collector.Owner.Color, FloatingText.FormatCashTick(amount), 30)); }); base.Activate(collector); diff --git a/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs b/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs index 9e04e809578f..2225c22dd670 100644 --- a/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs +++ b/OpenRA.Mods.Common/Traits/ExitsDebugOverlay.cs @@ -62,7 +62,7 @@ void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr) { foreach (var exitCell in exitCells) { - var color = self.Owner.Color.RGB; + var color = self.Owner.Color; var vec = exitCell - self.Location; var center = wr.World.Map.CenterOfCell(exitCell); new TextRenderable(manager.Font, center, 0, color, vec.ToString()).Render(wr); @@ -97,7 +97,7 @@ void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr) continue; var exitCellCenter = self.World.Map.CenterOfCell(exitCells[i]); - rgbaRenderer.DrawLine(wr.Screen3DPosition(spawnPos), wr.Screen3DPosition(exitCellCenter), 1f, self.Owner.Color.RGB); + rgbaRenderer.DrawLine(wr.Screen3DPosition(spawnPos), wr.Screen3DPosition(exitCellCenter), 1f, self.Owner.Color); } } } diff --git a/OpenRA.Mods.Common/Traits/GivesBounty.cs b/OpenRA.Mods.Common/Traits/GivesBounty.cs index 7a728a7b3272..9863d991eeca 100644 --- a/OpenRA.Mods.Common/Traits/GivesBounty.cs +++ b/OpenRA.Mods.Common/Traits/GivesBounty.cs @@ -72,7 +72,7 @@ void INotifyKilled.Killed(Actor self, AttackInfo e) 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.RGB, FloatingText.FormatCashTick(displayedBounty), 30))); + e.Attacker.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.Owner.Color, 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 321cac3afa40..1190855db67a 100644 --- a/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs +++ b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs @@ -56,7 +56,7 @@ void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player return; self.World.AddFrameEndTask(w => w.Add( - new FloatingText(self.CenterPosition, self.Owner.Color.RGB, FloatingText.FormatCashTick(amount), info.DisplayDuration))); + new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(amount), info.DisplayDuration))); } } } diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs index 14cf33aca4c5..6754de81af45 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBeacon.cs @@ -76,7 +76,7 @@ public void ResolveOrder(Actor self, Order order) playerRadarPing = radarPings.Add( () => self.Owner.IsAlliedWith(self.World.RenderPlayer), pos, - self.Owner.Color.RGB, + self.Owner.Color, info.Duration); } }); diff --git a/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs b/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs index 767b25b45739..45fe12759709 100644 --- a/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs +++ b/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs @@ -45,7 +45,7 @@ public void PopulateRadarSignatureCells(Actor self, List> dest if (IsTraitDisabled || (viewer != null && !Info.ValidStances.HasStance(self.Owner.Stances[viewer]))) return; - var color = Game.Settings.Game.UsePlayerStanceColors ? self.Owner.PlayerStanceColor(self) : self.Owner.Color.RGB; + var color = Game.Settings.Game.UsePlayerStanceColors ? self.Owner.PlayerStanceColor(self) : self.Owner.Color; if (modifier != null) color = modifier.RadarColorOverride(self, color); diff --git a/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs b/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs index cdbbb043fecd..b714ee0bab22 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs @@ -67,7 +67,7 @@ void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newO Color GetColor() { - return self.EffectiveOwner != null && self.EffectiveOwner.Disguised ? self.EffectiveOwner.Owner.Color.RGB : self.Owner.Color.RGB; + return self.EffectiveOwner != null && self.EffectiveOwner.Disguised ? self.EffectiveOwner.Owner.Color : self.Owner.Color; } IEnumerable IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr) diff --git a/OpenRA.Mods.Common/Traits/Render/RenderNameTag.cs b/OpenRA.Mods.Common/Traits/Render/RenderNameTag.cs index 0abae91fd0c7..cda192159265 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderNameTag.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderNameTag.cs @@ -38,7 +38,7 @@ class RenderNameTag : IRender public RenderNameTag(Actor self, RenderNameTagInfo info) { font = Game.Renderer.Fonts[info.Font]; - color = self.Owner.Color.RGB; + color = self.Owner.Color; if (self.Owner.PlayerName.Length > info.MaxLength) name = self.Owner.PlayerName.Substring(0, info.MaxLength); diff --git a/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs b/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs index 5fd3c3807e28..26217b49a1e9 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithRangeCircle.cs @@ -86,7 +86,7 @@ public IEnumerable RenderRangeCircle(Actor self, WorldRenderer wr) self.CenterPosition, Info.Range, 0, - Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color, + Info.UsePlayerColor ? self.Owner.Color : Info.Color, Color.FromArgb(96, Color.Black)); yield break; @@ -107,7 +107,7 @@ void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr) self.CenterPosition, Info.Range, 1, - Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color, + Info.UsePlayerColor ? self.Owner.Color : Info.Color, 3, Color.FromArgb(96, Color.Black)); } diff --git a/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs index b17fd93b28d5..d5b543acf580 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs @@ -64,7 +64,7 @@ public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecoration throw new YamlException("Font '{0}' is not listed in the mod.yaml's Fonts section".F(info.Font)); decorationBounds = self.TraitsImplementing().ToArray(); - color = info.UsePlayerColor ? self.Owner.Color.RGB : info.Color; + color = info.UsePlayerColor ? self.Owner.Color : info.Color; } IEnumerable IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr) @@ -123,7 +123,7 @@ IEnumerable DrawControlGroup(Actor self, WorldRenderer wr) void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { if (info.UsePlayerColor) - color = newOwner.Color.RGB; + color = newOwner.Color; } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs index 6763d9e14fd6..0805b8b10041 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTextDecoration.cs @@ -66,7 +66,7 @@ public WithTextDecoration(Actor self, WithTextDecorationInfo info) { font = Game.Renderer.Fonts[info.Font]; decorationBounds = self.TraitsImplementing().ToArray(); - color = Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color; + color = Info.UsePlayerColor ? self.Owner.Color : Info.Color; } public virtual bool ShouldRender(Actor self) { return true; } @@ -137,7 +137,7 @@ IEnumerable RenderInner(Actor self, WorldRenderer wr) void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { if (Info.UsePlayerColor) - color = newOwner.Color.RGB; + color = newOwner.Color; } } } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs index a7680398a763..58229fa037fd 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs @@ -135,7 +135,7 @@ public virtual void Activate(Actor self, Order order, SupportPowerManager manage ping = manager.RadarPings.Value.Add( () => order.Player.IsAlliedWith(self.World.RenderPlayer), self.World.Map.CenterOfCell(order.TargetLocation), - order.Player.Color.RGB, + order.Player.Color, Info.RadarPingDuration); } } diff --git a/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs index c870bc1e4ba1..bebe965dd51b 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs @@ -280,7 +280,7 @@ public void PopulateRadarSignatureCells(Actor self, List> dest { foreach (var previewsForCell in cellMap) foreach (var preview in previewsForCell.Value) - destinationBuffer.Add(Pair.New(previewsForCell.Key, preview.Owner.Color.RGB)); + destinationBuffer.Add(Pair.New(previewsForCell.Key, preview.Owner.Color)); } } } diff --git a/OpenRA.Mods.Common/Traits/World/PaletteFromPlayerPaletteWithAlpha.cs b/OpenRA.Mods.Common/Traits/World/PaletteFromPlayerPaletteWithAlpha.cs index 942bfbab9370..ff058c4e1c3a 100644 --- a/OpenRA.Mods.Common/Traits/World/PaletteFromPlayerPaletteWithAlpha.cs +++ b/OpenRA.Mods.Common/Traits/World/PaletteFromPlayerPaletteWithAlpha.cs @@ -10,6 +10,7 @@ #endregion using OpenRA.Graphics; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -43,7 +44,7 @@ class PaletteFromPlayerPaletteWithAlpha : ILoadsPlayerPalettes public PaletteFromPlayerPaletteWithAlpha(PaletteFromPlayerPaletteWithAlphaInfo info) { this.info = info; } - public void LoadPlayerPalettes(WorldRenderer wr, string playerName, HSLColor color, bool replaceExisting) + public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color color, bool replaceExisting) { var remap = new AlphaPaletteRemap(info.Alpha, info.Premultiply); var pal = new ImmutablePalette(wr.Palette(info.BasePalette + playerName).Palette, remap); diff --git a/OpenRA.Mods.Common/Util.cs b/OpenRA.Mods.Common/Util.cs index 28cf43116a6b..15981af52351 100644 --- a/OpenRA.Mods.Common/Util.cs +++ b/OpenRA.Mods.Common/Util.cs @@ -235,7 +235,7 @@ public static string FriendlyTypeName(Type t) if (t == typeof(WVec)) return "3D World Vector"; - if (t == typeof(HSLColor) || t == typeof(Color)) + if (t == typeof(Color)) return "Color (RRGGBB[AA] notation)"; if (t == typeof(IProjectileInfo)) diff --git a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs index 292055615bb0..da12be176d12 100644 --- a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs @@ -329,18 +329,18 @@ void LoadSmudges(IniFile file, string section) } // TODO: fix this -- will have bitrotted pretty badly. - static Dictionary namedColorMapping = new Dictionary() + static Dictionary namedColorMapping = new Dictionary() { - { "gold", HSLColor.FromRGB(246, 214, 121) }, - { "blue", HSLColor.FromRGB(226, 230, 246) }, - { "red", HSLColor.FromRGB(255, 20, 0) }, - { "neutral", HSLColor.FromRGB(238, 238, 238) }, - { "orange", HSLColor.FromRGB(255, 230, 149) }, - { "teal", HSLColor.FromRGB(93, 194, 165) }, - { "salmon", HSLColor.FromRGB(210, 153, 125) }, - { "green", HSLColor.FromRGB(160, 240, 140) }, - { "white", HSLColor.FromRGB(255, 255, 255) }, - { "black", HSLColor.FromRGB(80, 80, 80) }, + { "gold", Color.FromArgb(246, 214, 121) }, + { "blue", Color.FromArgb(226, 230, 246) }, + { "red", Color.FromArgb(255, 20, 0) }, + { "neutral", Color.FromArgb(238, 238, 238) }, + { "orange", Color.FromArgb(255, 230, 149) }, + { "teal", Color.FromArgb(93, 194, 165) }, + { "salmon", Color.FromArgb(210, 153, 125) }, + { "green", Color.FromArgb(160, 240, 140) }, + { "white", Color.FromArgb(255, 255, 255) }, + { "black", Color.FromArgb(80, 80, 80) }, }; public static void SetMapPlayers(string section, string faction, string color, IniFile file, List players, MapPlayers mapPlayers) diff --git a/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs b/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs index 08499658bab4..9c8d42bd0952 100644 --- a/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs @@ -134,7 +134,7 @@ void GenerateBitmapWorker() var c = (int*)cc; for (var v = 0; v < 256; v++) for (var s = 0; s < 256; s++) - *(c + (v * 256) + s) = HSLColor.FromHSV(hue, s / 255f, (255 - v) / 255f).RGB.ToArgb(); + *(c + (v * 256) + s) = Color.FromAhsv(hue, s / 255f, (255 - v) / 255f).ToArgb(); } } @@ -165,7 +165,7 @@ public override void Draw() var sprite = ChromeProvider.GetImage("lobby-bits", "colorpicker"); var pos = RenderOrigin + PxFromValue() - new int2(sprite.Bounds.Width, sprite.Bounds.Height) / 2; - WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X + 1, pos.Y + 1, sprite.Bounds.Width - 2, sprite.Bounds.Height - 2), Color.RGB); + WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X + 1, pos.Y + 1, sprite.Bounds.Width - 2, sprite.Bounds.Height - 2), Color); Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos); } @@ -221,7 +221,7 @@ public override bool HandleMouseInput(MouseInput mi) return true; } - public HSLColor Color { get { return HSLColor.FromHSV(H, S, V); } } + public Color Color { get { return Color.FromAhsv(H, S, V); } } public void Set(float hue) { @@ -233,10 +233,11 @@ public void Set(float hue) } } - public void Set(HSLColor color) + public void Set(Color color) { float h, s, v; - color.ToHSV(out h, out s, out v); + int a; + color.ToAhsv(out a, out h, out s, out v); if (H != h || S != s || V != v) { diff --git a/OpenRA.Mods.Common/Widgets/ColorPreviewManagerWidget.cs b/OpenRA.Mods.Common/Widgets/ColorPreviewManagerWidget.cs index a2750b901258..c92f6403cf42 100644 --- a/OpenRA.Mods.Common/Widgets/ColorPreviewManagerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ColorPreviewManagerWidget.cs @@ -10,6 +10,7 @@ #endregion using OpenRA.Graphics; +using OpenRA.Primitives; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets @@ -19,9 +20,9 @@ public class ColorPreviewManagerWidget : Widget public readonly string PaletteName = "colorpicker"; public readonly int[] RemapIndices = ChromeMetrics.Get("ColorPickerRemapIndices"); public readonly float Ramp = 0.05f; - public HSLColor Color; + public Color Color; - HSLColor cachedColor; + Color cachedColor; WorldRenderer worldRenderer; IPalette preview; diff --git a/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs b/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs index e7a2f0b9e385..b1f82c086c98 100644 --- a/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs +++ b/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs @@ -31,7 +31,7 @@ public override void Initialize(WidgetArgs args) var hueData = new uint[1, 256]; for (var x = 0; x < 256; x++) - hueData[0, x] = (uint)HSLColor.FromHSV(x / 255f, 1, 1).RGB.ToArgb(); + hueData[0, x] = (uint)Color.FromAhsv(x / 255f, 1, 1).ToArgb(); hueSheet.GetTexture().SetData(hueData); } diff --git a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs index e5edcd5f5247..7500c86b4985 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs @@ -112,7 +112,7 @@ public AssetBrowserLogic(Widget widget, Action onExit, ModData modData, World wo { colorDropdown.IsDisabled = () => currentPalette != colorPreview.PaletteName; colorDropdown.OnMouseDown = _ => ColorPickerLogic.ShowColorDropDown(colorDropdown, colorPreview, world); - panel.Get("COLORBLOCK").GetColor = () => Game.Settings.Player.Color.RGB; + panel.Get("COLORBLOCK").GetColor = () => Game.Settings.Player.Color; } filenameInput = panel.Get("FILENAME_INPUT"); diff --git a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs index ac4218be3808..ae25a3ac9983 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs @@ -25,7 +25,7 @@ public class ColorPickerLogic : ChromeLogic int paletteTabHighlighted = 0; [ObjectCreator.UseCtor] - public ColorPickerLogic(Widget widget, ModData modData, World world, HSLColor initialColor, string initialFaction, Action onChange, + public ColorPickerLogic(Widget widget, ModData modData, World world, Color initialColor, string initialFaction, Action onChange, Dictionary logicArgs) { string actorType; @@ -61,7 +61,7 @@ public class ColorPickerLogic : ChromeLogic var sat = (byte)Game.CosmeticRandom.Next(70, 255); var lum = (byte)Game.CosmeticRandom.Next(70, 255); - mixer.Set(new HSLColor(hue, sat, lum)); + mixer.Set(Color.FromAhsl(hue, sat, lum)); hueSlider.Value = hue / 255f; }; } @@ -71,7 +71,7 @@ public class ColorPickerLogic : ChromeLogic mixer.SetPaletteRange(validator.HsvSaturationRange[0], validator.HsvSaturationRange[1], validator.HsvValueRange[0], validator.HsvValueRange[1]); mixer.Set(initialColor); - hueSlider.Value = initialColor.H / 255f; + hueSlider.Value = initialColor.GetHue() / 360f; onChange(mixer.Color); // Setup tab controls @@ -117,10 +117,9 @@ public class ColorPickerLogic : ChromeLogic break; var color = validator.TeamColorPresets[colorIndex]; - var rgbColor = color.RGB; var newSwatch = (ColorBlockWidget)presetColorTemplate.Clone(); - newSwatch.GetColor = () => rgbColor; + newSwatch.GetColor = () => color; newSwatch.IsVisible = () => true; newSwatch.Bounds.X = i * newSwatch.Bounds.Width; newSwatch.Bounds.Y = j * newSwatch.Bounds.Height; @@ -141,7 +140,7 @@ public class ColorPickerLogic : ChromeLogic var colorIndex = j * paletteCols + i; var newSwatch = (ColorBlockWidget)customColorTemplate.Clone(); - newSwatch.GetColor = () => Game.Settings.Player.CustomColors[colorIndex].RGB; + newSwatch.GetColor = () => Game.Settings.Player.CustomColors[colorIndex]; newSwatch.IsVisible = () => Game.Settings.Player.CustomColors.Length > colorIndex; newSwatch.Bounds.X = i * newSwatch.Bounds.Width; newSwatch.Bounds.Y = j * newSwatch.Bounds.Height; @@ -190,7 +189,7 @@ public static void ShowColorDropDown(DropDownButtonWidget color, ColorPreviewMan color.RemovePanel(); - Action onChange = c => preview.Color = c; + Action onChange = c => preview.Color = c; var colorChooser = Game.LoadWidget(world, "COLOR_CHOOSER", null, new WidgetArgs() { diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorEditLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorEditLogic.cs index 3fb6c68f073e..66202b8ca359 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorEditLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorEditLogic.cs @@ -215,12 +215,12 @@ public override void Tick() }); item.Get("LABEL").GetText = () => option.Name; - item.GetColor = () => option.Color.RGB; + item.GetColor = () => option.Color; return item; }; ownerDropdown.GetText = () => selectedOwner.Name; - ownerDropdown.GetColor = () => selectedOwner.Color.RGB; + ownerDropdown.GetColor = () => selectedOwner.Color; ownerDropdown.OnClick = () => { var owners = editorActorLayer.Players.Players.Values.OrderBy(p => p.Name); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs index b8c596cefee9..ffc0b5206609 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs @@ -57,7 +57,7 @@ public ActorSelectorLogic(Widget widget, World world, WorldRenderer worldRendere var item = ScrollItemWidget.Setup(template, () => selectedOwner == option, () => SelectOwner(option)); item.Get("LABEL").GetText = () => option.Name; - item.GetColor = () => option.Color.RGB; + item.GetColor = () => option.Color; return item; }; @@ -76,7 +76,7 @@ public ActorSelectorLogic(Widget widget, World world, WorldRenderer worldRendere }; ownersDropDown.Text = selectedOwner.Name; - ownersDropDown.TextColor = selectedOwner.Color.RGB; + ownersDropDown.TextColor = selectedOwner.Color; var tileSetId = world.Map.Rules.TileSet.Id; var allActorsTemp = new List(); @@ -152,7 +152,7 @@ void SelectOwner(PlayerReference option) { selectedOwner = option; ownersDropDown.Text = option.Name; - ownersDropDown.TextColor = option.Color.RGB; + ownersDropDown.TextColor = option.Color; InitializePreviews(); } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs index 0c829d95aaa4..818c69d47b99 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs @@ -105,7 +105,7 @@ public GameInfoStatsLogic(Widget widget, World world, OrderManager orderManager, return name.Update(Pair.New(pp.PlayerName, suffix)); }; - nameLabel.GetColor = () => pp.Color.RGB; + nameLabel.GetColor = () => pp.Color; var flag = item.Get("FACTIONFLAG"); flag.GetImageCollection = () => "flags"; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverShroudSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverShroudSelectorLogic.cs index 29c40cc5ede1..0b461613a71b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverShroudSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverShroudSelectorLogic.cs @@ -44,7 +44,7 @@ public CameraOption(ObserverShroudSelectorLogic logic, Player p) { Player = p; Label = p.PlayerName; - Color = p.Color.RGB; + Color = p.Color; Faction = p.Faction.InternalName; IsSelected = () => p.World.RenderPlayer == p; OnClick = () => { p.World.RenderPlayer = p; logic.selected = this; p.World.Selection.Clear(); }; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index c55d775485c3..2fe94907490b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -168,7 +168,7 @@ void EarnedThisMinuteGraph() graph.GetSeries = () => players.Select(p => new LineGraphSeries( p.PlayerName, - p.Color.RGB, + p.Color, (p.PlayerActor.TraitOrDefault() ?? new PlayerStatistics(p.PlayerActor)).EarnedSamples.Select(s => (float)s))); playerStatsPanel.AddChild(template); @@ -184,7 +184,7 @@ void ArmyThisMinuteGraph() graph.GetSeries = () => players.Select(p => new LineGraphSeries( p.PlayerName, - p.Color.RGB, + p.Color, (p.PlayerActor.TraitOrDefault() ?? new PlayerStatistics(p.PlayerActor)).ArmySamples.Select(s => (float)s))); playerStatsPanel.AddChild(template); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs index 39340dceeb7d..18032036d82a 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/WorldTooltipLogic.cs @@ -107,7 +107,7 @@ public WorldTooltipLogic(Widget widget, World world, TooltipContainerWidget tool { flagFaction = o.Faction.InternalName; ownerName = o.PlayerName; - ownerColor = o.Color.RGB; + 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/Lobby/LobbyUtils.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs index fc7b1d060f2f..b6333c8ee433 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs @@ -211,7 +211,7 @@ public SlotDropDownOption(string title, string order, Func selected) orderManager.IssueOrder(Order.Command("color {0} {1}".F(client.Index, preview.Color))); }; - Action onChange = c => preview.Color = c; + Action onChange = c => preview.Color = c; var colorChooser = Game.LoadWidget(world, "COLOR_CHOOSER", null, new WidgetArgs() { @@ -484,7 +484,7 @@ public static void SetupEditableColorWidget(Widget parent, Session.Slot s, Sessi public static void SetupColorWidget(Widget parent, Session.Slot s, Session.Client c) { var color = parent.Get("COLORBLOCK"); - color.GetColor = () => c.Color.RGB; + color.GetColor = () => c.Color; } public static void SetupEditableFactionWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, @@ -604,7 +604,7 @@ public static void AddPlayerFlagAndName(ScrollItemWidget template, Player player return name.Update(Pair.New(player.PlayerName, sl)) + suffix; }; - playerName.GetColor = () => player.Color.RGB; + playerName.GetColor = () => player.Color; } public static string GetExternalIP(Session.Client client, OrderManager orderManager) diff --git a/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs index 863ca69e4af7..6b653a8a36b1 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs @@ -648,7 +648,7 @@ void SelectReplay(ReplayMetadata replay) { var o = option; - var color = o.Color.RGB; + var color = o.Color; var item = ScrollItemWidget.Setup(playerTemplate, () => false, () => { }); diff --git a/OpenRA.Mods.Common/Widgets/Logic/ServerListLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ServerListLogic.cs index 37bbd194b15c..b69af3d54a48 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ServerListLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ServerListLogic.cs @@ -470,7 +470,7 @@ void SelectServer(GameServer server) var font = Game.Renderer.Fonts[label.Font]; var name = WidgetUtils.TruncateText(o.Name, label.Bounds.Width, font); label.GetText = () => name; - label.GetColor = () => o.Color.RGB; + label.GetColor = () => o.Color; var flag = item.Get("FLAG"); flag.IsVisible = () => true; @@ -484,7 +484,7 @@ void SelectServer(GameServer server) var name = WidgetUtils.TruncateText(o.Name, label.Bounds.Width, font); // Force spectator color to prevent spoofing by the server - var color = o.IsSpectator ? Color.White : o.Color.RGB; + var color = o.IsSpectator ? Color.White : o.Color; label.GetText = () => name; label.GetColor = () => color; } diff --git a/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs index b1922eac9cce..efe230f29486 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs @@ -266,7 +266,7 @@ Action InitDisplayPanel(Widget panel) var colorDropdown = panel.Get("PLAYERCOLOR"); colorDropdown.IsDisabled = () => worldRenderer.World.Type != WorldType.Shellmap; colorDropdown.OnMouseDown = _ => ColorPickerLogic.ShowColorDropDown(colorDropdown, colorPreview, worldRenderer.World); - colorDropdown.Get("COLORBLOCK").GetColor = () => ps.Color.RGB; + colorDropdown.Get("COLORBLOCK").GetColor = () => ps.Color; return () => { diff --git a/OpenRA.Mods.Common/Widgets/MapPreviewWidget.cs b/OpenRA.Mods.Common/Widgets/MapPreviewWidget.cs index 6c5d080ca6f6..98f70e580496 100644 --- a/OpenRA.Mods.Common/Widgets/MapPreviewWidget.cs +++ b/OpenRA.Mods.Common/Widgets/MapPreviewWidget.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.Common.Widgets { public class SpawnOccupant { - public readonly HSLColor Color; + public readonly Color Color; public readonly string PlayerName; public readonly int Team; public readonly string Faction; @@ -182,7 +182,7 @@ public override void Draw() TooltipSpawnIndex = -1; if (ShowSpawnPoints) { - var colors = SpawnOccupants().ToDictionary(c => c.Key, c => c.Value.Color.RGB); + var colors = SpawnOccupants().ToDictionary(c => c.Key, c => c.Value.Color); var spawnPoints = preview.SpawnPoints; var gridType = preview.GridType; diff --git a/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs b/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs index d91458fc3b41..dad9a69fd8c2 100644 --- a/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/SupportPowerTimerWidget.cs @@ -60,7 +60,7 @@ public override void Tick() var time = WidgetUtils.FormatTime(p.RemainingTime, false, timestep); var text = Format.F(p.Info.Description, time); var self = p.Instances[0].Self; - var playerColor = self.Owner.Color.RGB; + var playerColor = self.Owner.Color; if (Game.Settings.Game.UsePlayerStanceColors) playerColor = self.Owner.PlayerStanceColor(self);