diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index 57631a1394..ae038347ab 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; } @@ -179,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