diff --git a/AUTHORS b/AUTHORS index 310b4935a2..ba9975a58d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -50,6 +50,7 @@ Also thanks to: * Lesueur Benjamin (Valkirie) * Maarten Meuris (Nyerguds) * Mark Olson (markolson) + * Matija Hustic (matija-hustic) * Matthew Gatland (mgatland) * Matthew Uzzell (MUzzell) * Max621 diff --git a/OpenRA.Game/Widgets/MapPreviewWidget.cs b/OpenRA.Game/Widgets/MapPreviewWidget.cs index ca06d01d32..384bd8b316 100644 --- a/OpenRA.Game/Widgets/MapPreviewWidget.cs +++ b/OpenRA.Game/Widgets/MapPreviewWidget.cs @@ -26,9 +26,6 @@ namespace OpenRA.Widgets public readonly string Country; public readonly int SpawnPoint; - public SpawnOccupant() - { - } public SpawnOccupant(Session.Client client) { Color = client.Color; @@ -38,6 +35,7 @@ namespace OpenRA.Widgets Country = client.Country; SpawnPoint = client.SpawnPoint; } + public SpawnOccupant(GameInformation.Player player) { Color = player.Color; @@ -51,34 +49,58 @@ namespace OpenRA.Widgets public class MapPreviewWidget : Widget { - public Func Preview = () => null; - public Func> SpawnOccupants = () => new Dictionary(); - public Action OnMouseDown = _ => {}; - public bool IgnoreMouseInput = false; - public bool ShowSpawnPoints = true; + public readonly bool IgnoreMouseInput = false; + public readonly bool ShowSpawnPoints = true; public readonly string TooltipContainer; public readonly string TooltipTemplate = "SPAWN_TOOLTIP"; - Lazy tooltipContainer; + readonly Lazy tooltipContainer; + + readonly Sprite spawnClaimed, spawnUnclaimed; + readonly SpriteFont spawnFont; + readonly Color spawnColor, spawnContrastColor; + readonly int2 spawnLabelOffset; + + public Func Preview = () => null; + public Func> SpawnOccupants = () => new Dictionary(); + public Action OnMouseDown = _ => { }; public int TooltipSpawnIndex = -1; - Rectangle MapRect; - float PreviewScale = 0; + Rectangle mapRect; + float previewScale = 0; + Sprite minimap; public MapPreviewWidget() { tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); + + spawnClaimed = ChromeProvider.GetImage("lobby-bits", "spawn-claimed"); + spawnUnclaimed = ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed"); + spawnFont = Game.Renderer.Fonts[ChromeMetrics.Get("SpawnFont")]; + spawnColor = ChromeMetrics.Get("SpawnColor"); + spawnContrastColor = ChromeMetrics.Get("SpawnContrastColor"); + spawnLabelOffset = ChromeMetrics.Get("SpawnLabelOffset"); } protected MapPreviewWidget(MapPreviewWidget other) : base(other) { Preview = other.Preview; - SpawnOccupants = other.SpawnOccupants; + + IgnoreMouseInput = other.IgnoreMouseInput; ShowSpawnPoints = other.ShowSpawnPoints; TooltipTemplate = other.TooltipTemplate; TooltipContainer = other.TooltipContainer; + SpawnOccupants = other.SpawnOccupants; + tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); + + spawnClaimed = ChromeProvider.GetImage("lobby-bits", "spawn-claimed"); + spawnUnclaimed = ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed"); + spawnFont = Game.Renderer.Fonts[ChromeMetrics.Get("SpawnFont")]; + spawnColor = ChromeMetrics.Get("SpawnColor"); + spawnContrastColor = ChromeMetrics.Get("SpawnContrastColor"); + spawnLabelOffset = ChromeMetrics.Get("SpawnLabelOffset"); } public override Widget Clone() { return new MapPreviewWidget(this); } @@ -98,7 +120,7 @@ namespace OpenRA.Widgets public override void MouseEntered() { if (TooltipContainer != null) - tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs() {{ "preview", this }}); + tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs() { { "preview", this } }); } public override void MouseExited() @@ -110,10 +132,11 @@ namespace OpenRA.Widgets public int2 ConvertToPreview(CPos point) { var preview = Preview(); - return new int2(MapRect.X + (int)(PreviewScale*(point.X - preview.Bounds.Left)) , MapRect.Y + (int)(PreviewScale*(point.Y - preview.Bounds.Top))); + var dx = (int)(previewScale * (point.X - preview.Bounds.Left)); + var dy = (int)(previewScale * (point.Y - preview.Bounds.Top)); + return new int2(mapRect.X + dx, mapRect.Y + dy); } - Sprite minimap; public override void Draw() { var preview = Preview(); @@ -127,14 +150,14 @@ namespace OpenRA.Widgets return; // Update map rect - PreviewScale = Math.Min(RenderBounds.Width / minimap.size.X, RenderBounds.Height / minimap.size.Y); - var w = (int)(PreviewScale * minimap.size.X); - var h = (int)(PreviewScale * minimap.size.Y); + previewScale = Math.Min(RenderBounds.Width / minimap.size.X, RenderBounds.Height / minimap.size.Y); + var w = (int)(previewScale * minimap.size.X); + var h = (int)(previewScale * minimap.size.Y); var x = RenderBounds.X + (RenderBounds.Width - w) / 2; var y = RenderBounds.Y + (RenderBounds.Height - h) / 2; - MapRect = new Rectangle(x, y, w, h); + mapRect = new Rectangle(x, y, w, h); - Game.Renderer.RgbaSpriteRenderer.DrawSprite(minimap, new float2(MapRect.Location), new float2(MapRect.Size)); + Game.Renderer.RgbaSpriteRenderer.DrawSprite(minimap, new float2(mapRect.Location), new float2(mapRect.Size)); TooltipSpawnIndex = -1; if (ShowSpawnPoints) @@ -146,20 +169,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 sprite = owned ? spawnClaimed : spawnUnclaimed; var offset = new int2(sprite.bounds.Width, sprite.bounds.Height) / 2; if (owned) 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); - var fonts = Game.Renderer.Fonts[ChromeMetrics.Get("SpawnFont")]; var number = Convert.ToChar('A' + spawnPoints.IndexOf(p)).ToString(); - 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); + var textOffset = spawnFont.Measure(number) / 2 + spawnLabelOffset; - if (((pos - Viewport.LastMousePos).ToFloat2() * offset.ToFloat2()).LengthSquared < 1) + spawnFont.DrawTextWithContrast(number, pos - textOffset, spawnColor, spawnContrastColor, 1); + + if (((pos - Viewport.LastMousePos).ToFloat2() / offset.ToFloat2()).LengthSquared <= 1) TooltipSpawnIndex = spawnPoints.IndexOf(p) + 1; } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs index bb52a6dc28..3ebfae85f0 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs @@ -92,16 +92,14 @@ namespace OpenRA.Mods.RA.Widgets.Logic { Func setupItem = (ii, itemTemplate) => { - var spawnPoint = spawnPoints.ToList()[ii]; var item = ScrollItemWidget.Setup(itemTemplate, - () => client.SpawnPoint == spawnPoint, - () => SetSpawnPoint(orderManager, client, spawnPoint)); - item.Get("LABEL").GetText = () => spawnPoint == 0 ? "-" : Convert.ToChar('A' - 1 + spawnPoint).ToString(); + () => client.SpawnPoint == ii, + () => SetSpawnPoint(orderManager, client, ii)); + item.Get("LABEL").GetText = () => ii == 0 ? "-" : Convert.ToChar('A' - 1 + ii).ToString(); return item; }; - var options = Exts.MakeArray(spawnPoints.Count(), i => i).ToList(); - dropdown.ShowDropDown("SPAWN_DROPDOWN_TEMPLATE", 150, options, setupItem); + dropdown.ShowDropDown("SPAWN_DROPDOWN_TEMPLATE", 150, spawnPoints, setupItem); } public static void ShowRaceDropDown(DropDownButtonWidget dropdown, Session.Client client, @@ -166,14 +164,15 @@ namespace OpenRA.Mods.RA.Widgets.Logic public static void SelectSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi) { if (mi.Button != MouseButton.Left) - return; + return; if (!orderManager.LocalClient.IsObserver && orderManager.LocalClient.State == Session.ClientState.Ready) return; + var spawnSize = new float2(ChromeProvider.GetImage("lobby-bits", "spawn-unclaimed").bounds.Size); var selectedSpawn = preview.SpawnPoints .Select((sp, i) => Pair.New(mapPreview.ConvertToPreview(sp), i)) - .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) + .Where(a => ((a.First - mi.Location).ToFloat2() / spawnSize * 2).LengthSquared <= 1) .Select(a => a.Second + 1) .FirstOrDefault(); diff --git a/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs index 1e360e5bbf..1baec758d4 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs @@ -107,8 +107,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic titleLabel.GetText = () => preview.Title; var previewWidget = item.Get("PREVIEW"); - previewWidget.IgnoreMouseOver = true; - previewWidget.IgnoreMouseInput = true; previewWidget.Preview = () => preview; var detailsWidget = item.GetOrNull("DETAILS"); diff --git a/mods/cnc/chrome/mapchooser.yaml b/mods/cnc/chrome/mapchooser.yaml index 02cf381bfc..5628df0ade 100644 --- a/mods/cnc/chrome/mapchooser.yaml +++ b/mods/cnc/chrome/mapchooser.yaml @@ -48,6 +48,8 @@ Container@MAPCHOOSER_PANEL: Y: 4 Width: 173 Height: 173 + IgnoreMouseOver: true + IgnoreMouseInput: true Label@TITLE: X: 2 Y: PARENT_BOTTOM-48 diff --git a/mods/cnc/metrics.yaml b/mods/cnc/metrics.yaml index e32eeabe8d..13c4b0da05 100644 --- a/mods/cnc/metrics.yaml +++ b/mods/cnc/metrics.yaml @@ -23,3 +23,4 @@ Metrics: SpawnFont: TinyBold SpawnColor: 255,255,255 SpawnContrastColor: 0,0,0 + SpawnLabelOffset: 0,1 diff --git a/mods/d2k/metrics.yaml b/mods/d2k/metrics.yaml index 24241acadb..0d1147ea49 100644 --- a/mods/d2k/metrics.yaml +++ b/mods/d2k/metrics.yaml @@ -23,3 +23,4 @@ Metrics: SpawnFont: TinyBold SpawnColor: 255,255,255 SpawnContrastColor: 0,0,0 + SpawnLabelOffset: 0,1 diff --git a/mods/ra/chrome/map-chooser.yaml b/mods/ra/chrome/map-chooser.yaml index 210dc251c2..cb095705e0 100644 --- a/mods/ra/chrome/map-chooser.yaml +++ b/mods/ra/chrome/map-chooser.yaml @@ -31,6 +31,8 @@ Background@MAPCHOOSER_PANEL: Y: 4 Width: 184 Height: 184 + IgnoreMouseOver: true + IgnoreMouseInput: true Label@TITLE: X: 2 Y: PARENT_BOTTOM-48 diff --git a/mods/ra/metrics.yaml b/mods/ra/metrics.yaml index 8a2e4c7c39..a44bdc1b66 100644 --- a/mods/ra/metrics.yaml +++ b/mods/ra/metrics.yaml @@ -23,3 +23,4 @@ Metrics: SpawnFont: TinyBold SpawnColor: 255,255,255 SpawnContrastColor: 0,0,0 + SpawnLabelOffset: 0,1 diff --git a/mods/ts/metrics.yaml b/mods/ts/metrics.yaml index 33b2c9673d..b6222a2053 100644 --- a/mods/ts/metrics.yaml +++ b/mods/ts/metrics.yaml @@ -23,3 +23,4 @@ Metrics: SpawnFont: TinyBold SpawnColor: 255,255,255 SpawnContrastColor: 0,0,0 + SpawnLabelOffset: 0,1