diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 04095fbcba..52720c51c1 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -320,29 +320,13 @@ namespace OpenRA.Server SyncLobbyInfo(); return true; }}, - { "pal", + { "color", s => { + var c = s.Split(',').Select(cc => int.Parse(cc)).ToArray(); + GetClient(conn).Color = System.Drawing.Color.FromArgb(c[0],c[1],c[2]); + SyncLobbyInfo(); return true; - /* - int pali; - - if (!int.TryParse(s, out pali)) - { - Console.WriteLine("Invalid palette: {0}", s); - return false; - } - - if (lobbyInfo.Clients.Where( c => c != GetClient(conn) ).Any( c => c.PaletteIndex == pali )) - { - SendChatTo( conn, "You can't be the same color as another player" ); - return true; - } - - GetClient(conn).PaletteIndex = pali; - SyncLobbyInfo(); - return true; - */ }}, { "map", s => diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index 61476ed80d..0a8309e05c 100644 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -126,12 +126,53 @@ namespace OpenRA.Widgets.Delegates }; var colorChooser = lobby.GetWidget("COLOR_CHOOSER"); + var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); + var satSlider = colorChooser.GetWidget("SAT_SLIDER"); + var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); + colorChooser.GetWidget("BUTTON_OK").OnMouseUp = mi => { colorChooser.IsVisible = () => false; + UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); return true; }; - } + } + + void UpdatePlayerColor(float hf, float sf, float lf) + { + var c = ColorFromHSL(hf*360, sf, lf); + Game.IssueOrder(Order.Command("color {0},{1},{2}".F(c.R,c.G,c.B))); + } + + Color ColorFromHSL(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; + var hk = h / 360.0f; + + double[] trgb = { hk + 1 / 3.0f, + hk, + hk - 1/3.0f }; + double[] rgb = { 0, 0, 0 }; + + for (int k = 0; k < 3; k++) + { + while (trgb[k] < 0) trgb[k] += 1.0f; + while (trgb[k] > 1) trgb[k] -= 1.0f; + } + + for (int 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)); + } + void UpdateCurrentMap() { @@ -177,7 +218,17 @@ namespace OpenRA.Widgets.Delegates var color = template.GetWidget("COLOR"); color.OnMouseUp = mi => { - Chrome.rootWidget.GetWidget("SERVER_LOBBY").GetWidget("COLOR_CHOOSER").IsVisible = () => true; + var colorChooser = Chrome.rootWidget.GetWidget("SERVER_LOBBY").GetWidget("COLOR_CHOOSER"); + var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); + hueSlider.Offset = Game.LocalClient.Color.GetHue()/360f; + + var satSlider = colorChooser.GetWidget("SAT_SLIDER"); + satSlider.Offset = Game.LocalClient.Color.GetSaturation(); + + var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); + lumSlider.Offset = Game.LocalClient.Color.GetBrightness(); + + colorChooser.IsVisible = () => true; return true; };