From d6be783ccfe38ba06985b16ccfa314adfbde7da3 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 21 Dec 2009 19:42:48 +1300 Subject: [PATCH 1/2] a unit can only be in one control group at a time --- OpenRa.Game/Controller.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index 57631a1394..948273f468 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -166,6 +166,10 @@ namespace OpenRa.Game return; controlGroups[group].Clear(); + + for (var i = 0; i < 10; i++) /* all control groups */ + controlGroups[i].RemoveAll(a => uog.selection.Contains(a)); + controlGroups[group].AddRange(uog.selection); return; } From 746cb90171ed01c9b757f92c3fe6ef14854e5073 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 21 Dec 2009 19:50:50 +1300 Subject: [PATCH 2/2] render control group overlay --- OpenRa.Game/Controller.cs | 7 +++++++ OpenRa.Game/Graphics/WorldRenderer.cs | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index 948273f468..ae038347ab 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -183,5 +183,12 @@ namespace OpenRa.Game if (uog == null) return; CombineSelection(controlGroups[group], mods.HasModifier(Modifiers.Shift), false); } + + public int? GetControlGroupForActor(Actor a) + { + return controlGroups.Where(g => g.Value.Contains(a)) + .Select(g => (int?)g.Key) + .FirstOrDefault(); + } } } diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index 66e0664712..f62182e0f0 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -15,7 +15,6 @@ namespace OpenRa.Game.Graphics public readonly TerrainRenderer terrainRenderer; public readonly SpriteRenderer spriteRenderer; public readonly LineRenderer lineRenderer; - //public readonly Region region; public readonly UiOverlay uiOverlay; readonly Renderer renderer; @@ -115,6 +114,7 @@ namespace OpenRa.Game.Graphics if (drawHealthBar) { DrawHealthBar(selectedUnit, xy, Xy); + DrawControlGroup(selectedUnit, xy); // Only display pips and tags to the owner if (selectedUnit.Owner == Game.LocalPlayer) @@ -176,6 +176,17 @@ namespace OpenRa.Game.Graphics static readonly string[] pipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray" }; static readonly string[] tagStrings = { "", "tag-fake", "tag-primary" }; + void DrawControlGroup(Actor selectedUnit, float2 basePosition) + { + var group = Game.controller.GetControlGroupForActor(selectedUnit); + if (group == null) return; + + var pipImages = new Animation("pips"); + pipImages.PlayFetchIndex("groups", () => (int)group); + pipImages.Tick(); + spriteRenderer.DrawSprite(pipImages.Image, basePosition + new float2(-8, 1), 0); + } + void DrawPips(Actor selectedUnit, float2 basePosition) { // If a mod wants to implement a unit with multiple pip sources, then they are placed on multiple rows