diff --git a/OpenRA.Game/Graphics/LineRenderer.cs b/OpenRA.Game/Graphics/LineRenderer.cs index 6ddc923fae..f3b7187d80 100644 --- a/OpenRA.Game/Graphics/LineRenderer.cs +++ b/OpenRA.Game/Graphics/LineRenderer.cs @@ -90,6 +90,19 @@ namespace OpenRA.Graphics DrawLine(new float2(r.Left, y), new float2(r.Right, y), color, color); } + public void FillEllipse(RectangleF r, Color color) + { + var a = (r.Right - r.Left) / 2; + var b = (r.Bottom - r.Top) / 2; + var xc = (r.Right + r.Left) / 2; + var yc = (r.Bottom + r.Top) / 2; + for (var y = r.Top; y <= r.Bottom; y++) + { + var dx = a * System.Convert.ToSingle(System.Math.Sqrt(1 - (y - yc) * (y - yc) / b / b)); + DrawLine(new float2(xc - dx, y), new float2(xc + dx, y), color, color); + } + } + public void SetViewportParams(Size screen, float zoom, float2 scroll) { shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y); diff --git a/OpenRA.Game/Primitives/float2.cs b/OpenRA.Game/Primitives/float2.cs index 83aa4fc000..4b09649bd7 100644 --- a/OpenRA.Game/Primitives/float2.cs +++ b/OpenRA.Game/Primitives/float2.cs @@ -66,6 +66,7 @@ namespace OpenRA public static float2 operator *(float2 b, float a) { return new float2(a * b.X, a * b.Y); } public static float2 operator *( float2 a, float2 b ) { return new float2( a.X * b.X, a.Y * b.Y ); } public static float2 operator /( float2 a, float2 b ) { return new float2( a.X / b.X, a.Y / b.Y ); } + public static float2 operator /(float2 a, float b) { return new float2(a.X / b, a.Y / b); } public static bool operator ==(float2 me, float2 other) { return (me.X == other.X && me.Y == other.Y); } public static bool operator !=(float2 me, float2 other) { return !(me == other); } diff --git a/OpenRA.Game/Widgets/MapPreviewWidget.cs b/OpenRA.Game/Widgets/MapPreviewWidget.cs index 6725b35750..cf58709fd1 100644 --- a/OpenRA.Game/Widgets/MapPreviewWidget.cs +++ b/OpenRA.Game/Widgets/MapPreviewWidget.cs @@ -117,15 +117,19 @@ namespace OpenRA.Widgets var owned = colors.ContainsKey(p); var pos = ConvertToPreview(p); var sprite = ChromeProvider.GetImage("lobby-bits", owned ? "spawn-claimed" : "spawn-unclaimed"); - var offset = new int2(-sprite.bounds.Width/2, -sprite.bounds.Height/2); + var offset = new int2(sprite.bounds.Width, sprite.bounds.Height) / 2; if (owned) - WidgetUtils.FillRectWithColor(new Rectangle(pos.X + offset.X + 2, pos.Y + offset.Y + 2, 12, 12), colors[p]); + WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X - offset.X + 1, pos.Y - offset.Y + 1, sprite.bounds.Width - 2, sprite.bounds.Height - 2), colors[p]); - Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos + offset); - Game.Renderer.Fonts[ChromeMetrics.Get("SpawnFont")].DrawTextWithContrast(Convert.ToString(spawnPoints.IndexOf(p) + 1), new int2(pos.X + offset.X + 4, pos.Y + offset.Y - 15), ChromeMetrics.Get("SpawnColor"), ChromeMetrics.Get("SpawnContrastColor"), 2); + Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos - offset); + var fonts = Game.Renderer.Fonts[ChromeMetrics.Get("SpawnFont")]; + var number = Convert.ToString(spawnPoints.IndexOf(p) + 1); + offset = fonts.Measure(number) / 2; + offset.Y += 1; // Does not center well vertically for some reason + fonts.DrawTextWithContrast(number, pos - offset, ChromeMetrics.Get("SpawnColor"), ChromeMetrics.Get("SpawnContrastColor"), 1); - if ((pos - Viewport.LastMousePos).LengthSquared < 64) + if (((pos - Viewport.LastMousePos).ToFloat2() * offset.ToFloat2()).LengthSquared < 1) TooltipSpawnIndex = spawnPoints.IndexOf(p) + 1; } } diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index 6465b4f3ea..68baa9809b 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -68,6 +68,11 @@ namespace OpenRA.Widgets Game.Renderer.LineRenderer.FillRect(new RectangleF(r.X, r.Y, r.Width, r.Height), c); } + public static void FillEllipseWithColor(Rectangle r, Color c) + { + Game.Renderer.LineRenderer.FillEllipse(new RectangleF(r.X, r.Y, r.Width, r.Height), c); + } + public static int[] GetBorderSizes(string collection) { var images = new[] { "border-t", "border-b", "border-l", "border-r" }; diff --git a/OpenRA.Mods.RA/Widgets/ColorMixerWidget.cs b/OpenRA.Mods.RA/Widgets/ColorMixerWidget.cs index 925e71b02f..5b10bc1aca 100755 --- a/OpenRA.Mods.RA/Widgets/ColorMixerWidget.cs +++ b/OpenRA.Mods.RA/Widgets/ColorMixerWidget.cs @@ -134,8 +134,8 @@ namespace OpenRA.Mods.RA.Widgets Game.Renderer.RgbaSpriteRenderer.DrawSprite(mixerSprite, RenderOrigin, new float2(RenderBounds.Size)); var sprite = ChromeProvider.GetImage("lobby-bits", "colorpicker"); - var pos = RenderOrigin + PxFromValue() - new int2(sprite.bounds.Width/2, sprite.bounds.Height/2); - WidgetUtils.FillRectWithColor(new Rectangle(pos.X + 3, pos.Y + 3, 10, 10), Color.RGB); + 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); Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos); } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs index 10e23cb9e8..f86208893a 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic { var item = ScrollItemWidget.Setup(itemTemplate, () => client.SpawnPoint == ii, - () => orderManager.IssueOrder(Order.Command("spawn {0} {1}".F(client.Index, ii)))); + () => SetSpawnPoint(orderManager, client, ii)); item.Get("LABEL").GetText = () => ii == 0 ? "-" : ii.ToString(); return item; }; @@ -166,17 +166,20 @@ namespace OpenRA.Mods.RA.Widgets.Logic var selectedSpawn = preview.SpawnPoints .Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp), i)) - .Where(a => (a.First - mi.Location).LengthSquared < 64) + .Where(a => ((a.First - mi.Location).ToFloat2() / new float2(ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").bounds.Width / 2, ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").bounds.Height / 2)).LengthSquared <= 1) .Select(a => a.Second + 1) .FirstOrDefault(); + var locals = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null)); + var playerToMove = locals.FirstOrDefault(c => ((selectedSpawn == 0) ^ (c.SpawnPoint == 0) && !c.IsObserver)); + SetSpawnPoint(orderManager, playerToMove, selectedSpawn); + } + + private static void SetSpawnPoint(OrderManager orderManager, Session.Client playerToMove, int selectedSpawn) + { var owned = orderManager.LobbyInfo.Clients.Any(c => c.SpawnPoint == selectedSpawn); if (selectedSpawn == 0 || !owned) - { - var locals = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null)); - var playerToMove = locals.FirstOrDefault(c => ((selectedSpawn == 0) ^ (c.SpawnPoint == 0) && !c.IsObserver)); orderManager.IssueOrder(Order.Command("spawn {0} {1}".F((playerToMove ?? orderManager.LocalClient).Index, selectedSpawn))); - } } public static Color LatencyColor(int latency) diff --git a/artsrc/ra/spawnpoints.psd b/artsrc/ra/spawnpoints.psd deleted file mode 100644 index 5e289493cb..0000000000 Binary files a/artsrc/ra/spawnpoints.psd and /dev/null differ diff --git a/artsrc/ra/spawnpoints.svg b/artsrc/ra/spawnpoints.svg new file mode 100644 index 0000000000..0db5db141d --- /dev/null +++ b/artsrc/ra/spawnpoints.svg @@ -0,0 +1,460 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mods/d2k/chrome.yaml b/mods/d2k/chrome.yaml index 217eba2850..6581166bb5 100644 --- a/mods/d2k/chrome.yaml +++ b/mods/d2k/chrome.yaml @@ -225,12 +225,12 @@ dialog4: dialog.png corner-br: 571,446,6,6 lobby-bits: spawnpoints.png - spawn-unclaimed: 16,0,16,16 - spawn-claimed: 0,0,16,16 - admin: 37,5,7,5 - colorpicker: 0,0,16,16 - huepicker: 45,0,7,15 - + spawn-unclaimed: 32,0,32,32 + spawn-claimed: 0,0,32,32 + admin: 64,5,7,5 + colorpicker: 0,0,32,32 + huepicker: 71,0,7,15 + strategic: strategic.png unowned: 0,0,32,32 critical_unowned: 0,32,32,32 diff --git a/mods/ra/chrome.yaml b/mods/ra/chrome.yaml index 5ece00106e..68cefda086 100644 --- a/mods/ra/chrome.yaml +++ b/mods/ra/chrome.yaml @@ -169,11 +169,11 @@ dialog4: dialog.png corner-br: 571,446,6,6 lobby-bits: spawnpoints.png - spawn-unclaimed: 16,0,16,16 - spawn-claimed: 0,0,16,16 - admin: 37,5,7,5 - colorpicker: 0,0,16,16 - huepicker: 45,0,7,15 + spawn-unclaimed: 32,0,32,32 + spawn-claimed: 0,0,32,32 + admin: 64,5,7,5 + colorpicker: 0,0,32,32 + huepicker: 71,0,7,15 strategic: strategic.png unowned: 0,0,32,32 diff --git a/mods/ra/uibits/spawnpoints.png b/mods/ra/uibits/spawnpoints.png index 058dfc523a..812af90871 100644 Binary files a/mods/ra/uibits/spawnpoints.png and b/mods/ra/uibits/spawnpoints.png differ diff --git a/mods/ts/chrome.yaml b/mods/ts/chrome.yaml index 91fb49929f..eb81aeb332 100644 --- a/mods/ts/chrome.yaml +++ b/mods/ts/chrome.yaml @@ -163,11 +163,11 @@ dialog4: dialog.png corner-br: 571,446,6,6 lobby-bits: spawnpoints.png - spawn-unclaimed: 16,0,16,16 - spawn-claimed: 0,0,16,16 - admin: 37,5,7,5 - colorpicker: 0,0,16,16 - huepicker: 45,0,7,15 + spawn-unclaimed: 32,0,32,32 + spawn-claimed: 0,0,32,32 + admin: 64,5,7,5 + colorpicker: 0,0,32,32 + huepicker: 71,0,7,15 strategic: strategic.png unowned: 0,0,32,32