diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index 7761814912..174f61b43c 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -65,13 +65,9 @@ namespace OpenRa.Game { if (!(orderGenerator is PlaceBuilding)) { - if (dragStart != xy) - orderGenerator = new UnitOrderGenerator( - Game.SelectUnitsInBox(Game.CellSize * dragStart, Game.CellSize * xy)); - else - orderGenerator = new UnitOrderGenerator( - Game.SelectUnitOrBuilding(Game.CellSize * xy)); - + orderGenerator = new UnitOrderGenerator( + Game.SelectActorsInBox(Game.CellSize * dragStart, Game.CellSize * xy)); + var voicedUnit = ((UnitOrderGenerator)orderGenerator).selection .Select(a => a.traits.GetOrDefault()) .Where(m => m != null && m.self.Owner == Game.LocalPlayer) @@ -114,7 +110,7 @@ namespace OpenRa.Game .Select(a => CursorForOrderString( a.OrderString, a.Subject, a.TargetLocation )) .FirstOrDefault(a => a != null) : null; - return c ?? (Game.SelectUnitOrBuilding(Game.CellSize * dragEnd).Any() ? Cursor.Select : Cursor.Default); + return c ?? (Game.SelectActorsInBox(Game.CellSize * dragEnd, Game.CellSize * dragEnd).Any() ? Cursor.Select : Cursor.Default); } Cursor CursorForOrderString( string s, Actor a, int2 location ) diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 8a7ab9ed7e..c18b9c2cc4 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -262,15 +262,14 @@ namespace OpenRa.Game yield return new int2(i, j); } - public static IEnumerable SelectUnitsInBox(float2 a, float2 b) + public static IEnumerable SelectActorsInBox(float2 a, float2 b) { - return FindUnits(a, b).Where(x => x.Owner == LocalPlayer && x.traits.Contains()); - } - - public static IEnumerable SelectUnitOrBuilding(float2 a) - { - var q = FindUnits(a, a); - return q.Where(x => x.traits.Contains()).Concat(q).Take(1); + return FindUnits(a, b) + .GroupBy(x => (x.Owner == LocalPlayer) ? x.unitInfo.SelectionPriority : 0) + .OrderByDescending(g => g.Key) + .Select( g => g.AsEnumerable() ) + .DefaultIfEmpty( new Actor[] {} ) + .FirstOrDefault(); } public static int GetDistanceToBase(int2 b, Player p) diff --git a/OpenRa.Game/GameRules/UnitInfo.cs b/OpenRa.Game/GameRules/UnitInfo.cs index 5aebba8217..7a3eef801b 100755 --- a/OpenRa.Game/GameRules/UnitInfo.cs +++ b/OpenRa.Game/GameRules/UnitInfo.cs @@ -52,6 +52,7 @@ namespace OpenRa.Game.GameRules public readonly int Recoil = 0; public readonly string SecondaryAnim = null; public readonly bool MuzzleFlash = false; + public readonly int SelectionPriority = 10; public UnitInfo(string name) { Name = name; } diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index 29968f97f2..b5aa8480dc 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -80,7 +80,7 @@ namespace OpenRa.Game.Graphics lineRenderer.DrawLine(a + b + c, a + c, Color.White, Color.White); lineRenderer.DrawLine(a, a + c, Color.White, Color.White); - foreach (var u in Game.SelectUnitsInBox(selbox.Value.First, selbox.Value.Second)) + foreach (var u in Game.SelectActorsInBox(selbox.Value.First, selbox.Value.Second)) DrawSelectionBox(u, Color.Yellow, false); } diff --git a/campaignUnits.ini b/campaignUnits.ini index ed5c1a2351..53fc9906e1 100755 --- a/campaignUnits.ini +++ b/campaignUnits.ini @@ -46,127 +46,168 @@ Description=Forward Command Post Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 [V01] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V02] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V03] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V04] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V05] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V06] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V07] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V08] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V09] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V10] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V11] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V12] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V13] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V14] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V15] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V16] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V17] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V18] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V19] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V20] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V21] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V22] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V23] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V24] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V25] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V26] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V27] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V28] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V29] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V30] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V31] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V32] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V33] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V34] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V35] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V36] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [V37] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=3 [BARL] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=0 [BRL3] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=0 [MISS] Traits=Building, RenderBuilding Image=FCOM +SelectionPriority=0 diff --git a/units.ini b/units.ini index 59961a59c2..fbb58177e9 100755 --- a/units.ini +++ b/units.ini @@ -35,19 +35,23 @@ Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Description=Radar Jammer Traits=Unit, Mobile, RenderUnitSpinner PrimaryOffset=0,4,0,-6 +SelectionPriority=3 [MGG] Description=Mobile Gap Generator Traits=Unit, Mobile, RenderUnitSpinner PrimaryOffset=0,6,0,-3 +SelectionPriority=3 [ARTY] Description=Artillery Traits=Unit, Mobile, AttackBase, RenderUnit [HARV] Description=Ore Truck Traits=Harvester, Unit, Mobile, RenderUnit +SelectionPriority=7 [MCV] Description=Mobile Construction Vehicle Traits=Unit, Mobile, McvDeploy, RenderUnit +SelectionPriority=3 [JEEP] Description=Ranger Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted @@ -199,16 +203,19 @@ Description=Iron Curtain Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 [ATEK] Description=Allied Tech Center Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 [PDOX] Description=Chronosphere Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 [WEAP] Description=War Factory Traits=Building, RenderWarFactory, RallyPoint, Production @@ -216,111 +223,132 @@ Dimensions=3,2 Footprint=xxx xxx Produces=Vehicle RallyPoint=1,3 +SelectionPriority=3 [SYRD] Description=Shipyard Traits=Building, RenderBuilding, ProductionSurround Dimensions=3,3 Footprint=xxx xxx xxx Produces=Ship +SelectionPriority=3 [SPEN] Description=Sub Pen Traits=Building, RenderBuilding, ProductionSurround Dimensions=3,3 Footprint=xxx xxx xxx Produces=Ship +SelectionPriority=3 [PBOX] Description=Pillbox Traits=Building, RenderBuilding Dimensions=1,1 Footprint=x +SelectionPriority=3 [HBOX] Description=Camo Pillbox Traits=Building, RenderBuilding Dimensions=1,1 Footprint=x +SelectionPriority=3 [TSLA] Description=Tesla Coil Traits=Building, RenderBuilding Dimensions=1,2 Footprint=_ x +SelectionPriority=3 [GUN] Description=Turret Traits=Building, Turreted, RenderBuildingTurreted Dimensions=1,1 Footprint=x +SelectionPriority=3 [AGUN] Description=AA Gun Traits=Building, Turreted, RenderBuildingTurreted Dimensions=1,2 Footprint=_ x +SelectionPriority=3 [FTUR] Description=Flame Turret Traits=Building, RenderBuilding Dimensions=1,1 Footprint=x +SelectionPriority=3 [FACT] Description=Construction Yard Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx Produces=Building,Defense +SelectionPriority=3 [PROC] Description=Ore Refinery Traits=Building, RenderBuilding, AcceptsOre Dimensions=3,3 Footprint=_x_ xxx x== +SelectionPriority=3 [SILO] Description=Silo Traits=Building, RenderBuildingOre Dimensions=1,1 Footprint=x +SelectionPriority=3 [HPAD] Description=Helipad Traits=Building, RenderBuilding, Production Dimensions=2,2 Footprint=xx xx Produces=Plane +SelectionPriority=3 [DOME] Description=Radar Dome Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 [GAP] Description=Gap Generator Traits=Building, RenderBuilding Dimensions=1,2 Footprint=_ x +SelectionPriority=3 [SAM] Description=SAM Site Traits=Building, Turreted, RenderBuildingTurreted Dimensions=2,1 Footprint=xx +SelectionPriority=3 [MSLO] Description=Missile Silo Traits=Building, RenderBuilding Dimensions=2,1 Footprint=xx +SelectionPriority=3 [AFLD] Description=Airstrip Traits=Building, RenderBuilding, Production Dimensions=3,2 Footprint=xxx xxx Produces=Plane +SelectionPriority=3 [POWR] Description=Power Plant Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 [APWR] Description=Advanced Power Plant Traits=Building, RenderBuilding Dimensions=3,3 Footprint=___ xxx xxx +SelectionPriority=3 [STEK] Description=Soviet Tech Center Traits=Building, RenderBuilding Dimensions=3,2 Footprint=xxx xxx +SelectionPriority=3 [BARR] Description=Soviet Barracks Traits=Building, RenderBuilding, RallyPoint, Production @@ -328,6 +356,7 @@ Dimensions=2,2 Footprint=xx xx Produces=Infantry RallyPoint=1,3 +SelectionPriority=3 [TENT] Description=Allied Barracks Traits=Building, RenderBuilding, RallyPoint, Production @@ -335,48 +364,59 @@ Dimensions=2,2 Footprint=xx xx Produces=Infantry RallyPoint=1,3 +SelectionPriority=3 [KENN] Description=Kennel Traits=Building, RenderBuilding, RallyPoint, Production Dimensions=1,1 Footprint=x RallyPoint=1,2 +SelectionPriority=3 [FIX] Description=Service Depot Traits=Building, RenderBuilding Dimensions=3,3 Footprint=_x_ xxx _x_ +SelectionPriority=3 [FACF] Description=Fake Construction Yard Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx +SelectionPriority=3 [WEAF] Description=Fake War Factory Traits=Building, RenderWarFactory Dimensions=3,2 Footprint=xxx xxx +SelectionPriority=3 [SYRF] Description=Fake Shipyard Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx +SelectionPriority=3 [SPEF] Description=Fake Sub Pen Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx +SelectionPriority=3 [DOMF] Description=Fake Radar Dome Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx +SelectionPriority=3 ;[SBAG] ;Description=Sandbags +;SelectionPriority=3 ;[BRIK] ;Description=Concrete Wall +;SelectionPriority=3 ;[FENC] ;Description=Wire Fence +;SelectionPriority=3