diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index e319012def..e0cc610688 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -256,7 +256,6 @@
-
diff --git a/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs b/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs
deleted file mode 100644
index 0bb6f759f6..0000000000
--- a/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-#region Copyright & License Information
-/*
- * Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
- * This file is part of OpenRA, which is free software. It is made
- * available to you under the terms of the GNU General Public License
- * as published by the Free Software Foundation. For more information,
- * see COPYING.
- */
-#endregion
-
-using System.Collections.Generic;
-using OpenRA.Traits;
-
-namespace OpenRA.Mods.Common.Traits
-{
- public class TargetableAircraftInfo : TargetableInfo
- {
- public readonly string[] GroundedTargetTypes = { };
- public override object Create(ActorInitializer init) { return new TargetableAircraft(init.Self, this); }
- }
-
- public class TargetableAircraft : Targetable
- {
- readonly TargetableAircraftInfo info;
- readonly Actor self;
-
- public TargetableAircraft(Actor self, TargetableAircraftInfo info)
- : base(self, info)
- {
- this.info = info;
- this.self = self;
- }
-
- public override string[] TargetTypes
- {
- get
- {
- return (self.CenterPosition.Z > 0) ? info.TargetTypes : info.GroundedTargetTypes;
- }
- }
- }
-}
diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
index 49e62850c5..7138902dc0 100644
--- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
+++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs
@@ -2012,6 +2012,42 @@ namespace OpenRA.Mods.Common.UtilityCommands
untargetableSubmarine.Key = "-Targetable";
node.Value.Nodes.Add(new MiniYamlNode("-Targetable@UNDERWATER", ""));
}
+
+ // Split TargetableAircraft into two Targetable traits
+ var targetableAircraft = node.Value.Nodes.FirstOrDefault(n => n.Key == "TargetableAircraft");
+ if (targetableAircraft != null)
+ {
+ node.Value.Nodes.RemoveAll(n => n.Key == "-Targetable");
+ targetableAircraft.Key = "Targetable@AIRBORNE";
+ targetableAircraft.Value.Nodes.Add(new MiniYamlNode("UpgradeTypes", "airborne"));
+ targetableAircraft.Value.Nodes.Add(new MiniYamlNode("UpgradeMinEnabledLevel", "1"));
+ var groundTargetTypes = targetableAircraft.Value.Nodes.FirstOrDefault(n => n.Key == "GroundedTargetTypes");
+ if (groundTargetTypes != null)
+ {
+ targetableAircraft.Value.Nodes.Remove(groundTargetTypes);
+ groundTargetTypes.Key = "TargetTypes";
+ }
+ else
+ groundTargetTypes = new MiniYamlNode("TargetTypes", "");
+ node.Value.Nodes.Add(new MiniYamlNode("Targetable@GROUND", "", new List {
+ groundTargetTypes,
+ new MiniYamlNode("UpgradeTypes", "airborne"),
+ new MiniYamlNode("UpgradeMaxEnabledLevel", "0")
+ }));
+ }
+
+ // Add `AirborneUpgrades: airborne` to Plane and Helicopter
+ var aircraft = node.Value.Nodes.FirstOrDefault(n => n.Key == "Plane" || n.Key == "Helicopter");
+ if (aircraft != null)
+ aircraft.Value.Nodes.Add(new MiniYamlNode("AirborneUpgrades", "airborne"));
+
+ // Remove split traits if TargetableAircraft was removed
+ var untargetableAircraft = node.Value.Nodes.FirstOrDefault(n => n.Key == "-TargetableAircraft");
+ if (untargetableAircraft != null)
+ {
+ untargetableAircraft.Key = "-TargetableUnit@GROUND";
+ node.Value.Nodes.Add(new MiniYamlNode("-TargetableUnit@AIRBORNE", ""));
+ }
}
}
diff --git a/mods/cnc/rules/aircraft.yaml b/mods/cnc/rules/aircraft.yaml
index d994101f9a..ee46c40815 100644
--- a/mods/cnc/rules/aircraft.yaml
+++ b/mods/cnc/rules/aircraft.yaml
@@ -16,6 +16,7 @@ TRAN:
InitialFacing: 0
LandableTerrainTypes: Clear,Rough,Road,Ore,Beach,Tiberium,BlueTiberium
AltitudeVelocity: 0c100
+ AirborneUpgrades: airborne
Health:
HP: 90
Armor:
@@ -56,6 +57,7 @@ HELI:
RearmBuildings: hpad
ROT: 4
Speed: 186
+ AirborneUpgrades: airborne
Health:
HP: 125
Armor:
@@ -107,6 +109,7 @@ ORCA:
RearmBuildings: hpad
ROT: 4
Speed: 186
+ AirborneUpgrades: airborne
Health:
HP: 90
Armor:
@@ -152,6 +155,7 @@ C17:
ROT: 5
Speed: 326
Repulsable: False
+ AirborneUpgrades: airborne
Health:
HP: 25
Armor:
@@ -188,6 +192,7 @@ A10:
ROT: 4
Speed: 373
Repulsable: False
+ AirborneUpgrades: airborne
Health:
HP: 150
Armor:
@@ -219,6 +224,7 @@ TRAN.Husk:
Helicopter:
ROT: 5
Speed: 140
+ AirborneUpgrades: airborne
RevealsShroud:
Range: 8c0
Type: CenterPosition
@@ -236,6 +242,7 @@ HELI.Husk:
Helicopter:
ROT: 4
Speed: 186
+ AirborneUpgrades: airborne
RevealsShroud:
Range: 10c0
Type: CenterPosition
@@ -251,6 +258,7 @@ ORCA.Husk:
Helicopter:
ROT: 4
Speed: 186
+ AirborneUpgrades: airborne
RevealsShroud:
Range: 10c0
Type: CenterPosition
diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml
index 115d76afc8..5f4966994c 100644
--- a/mods/cnc/rules/defaults.yaml
+++ b/mods/cnc/rules/defaults.yaml
@@ -116,9 +116,14 @@
Inherits@2: ^GainsExperience
AppearsOnRadar:
UseLocation: yes
- TargetableAircraft:
+ Targetable@GROUND:
+ TargetTypes: Ground, Vehicle
+ UpgradeTypes: airborne
+ UpgradeMaxEnabledLevel: 0
+ Targetable@AIRBORNE:
TargetTypes: Air
- GroundedTargetTypes: Ground, Vehicle
+ UpgradeTypes: airborne
+ UpgradeMinEnabledLevel: 1
SelectionDecorations:
Selectable:
Bounds: 24,24
@@ -126,6 +131,7 @@
RepairBuildings: hpad
RearmBuildings:
LandWhenIdle: false
+ AirborneUpgrades: airborne
HiddenUnderFog:
Type: CenterPosition
ActorLostNotification:
diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml
index 8ee9f578be..f2de72efea 100644
--- a/mods/d2k/rules/aircraft.yaml
+++ b/mods/d2k/rules/aircraft.yaml
@@ -20,6 +20,7 @@ carryall.reinforce:
Repulsable: False
LandAltitude: 100
LandWhenIdle: False
+ AirborneUpgrades: airborne
SpawnActorOnDeath:
Actor: carryall.husk
Carryall:
@@ -53,6 +54,7 @@ carryall.infantry:
RepairBuildings: repair
RearmBuildings:
Repulsable: False
+ AirborneUpgrades: airborne
Cargo:
MaxWeight: 5
Types: Infantry
@@ -77,6 +79,7 @@ frigate:
RepairBuildings: repair
RearmBuildings:
Repulsable: False
+ AirborneUpgrades: airborne
Health:
HP: 500
-AppearsOnRadar:
@@ -116,14 +119,20 @@ orni:
Speed: 280
RepairBuildings: repair
RearmBuildings:
+ AirborneUpgrades: airborne
SpawnActorOnDeath:
Actor: orni.husk
SelectionDecorations:
Selectable:
Bounds: 32,32
- TargetableAircraft:
+ Targetable@GROUND:
+ TargetTypes: Ground, Vehicle
+ UpgradeTypes: airborne
+ UpgradeMaxEnabledLevel: 0
+ Targetable@AIRBORNE:
TargetTypes: Air
- GroundedTargetTypes: Ground, Vehicle
+ UpgradeTypes: airborne
+ UpgradeMinEnabledLevel: 1
Voiced:
VoiceSet: GenericVoice
@@ -142,6 +151,7 @@ orni.bomber:
RepairBuildings: repair
RearmBuildings:
Repulsable: False
+ AirborneUpgrades: airborne
AmmoPool:
Ammo: 5
Tooltip:
@@ -161,6 +171,7 @@ orni.husk:
Speed: 280
RepairBuildings:
RearmBuildings:
+ AirborneUpgrades: airborne
RenderSprites:
Image: orni
@@ -173,6 +184,7 @@ orni.bomber.husk:
Speed: 350
RepairBuildings:
RearmBuildings:
+ AirborneUpgrades: airborne
RenderSprites:
Image: orni
@@ -185,6 +197,7 @@ carryall.husk:
Speed: 210
RepairBuildings:
RearmBuildings:
+ AirborneUpgrades: airborne
RenderSprites:
Image: carryall
@@ -197,6 +210,7 @@ carryall.infantry.husk:
Speed: 280
RepairBuildings:
RearmBuildings:
+ AirborneUpgrades: airborne
RenderSprites:
Image: carryall
diff --git a/mods/d2k/rules/misc.yaml b/mods/d2k/rules/misc.yaml
index 785732fddf..c47a6a6244 100644
--- a/mods/d2k/rules/misc.yaml
+++ b/mods/d2k/rules/misc.yaml
@@ -133,6 +133,7 @@ waypoint:
Inherits: carryall
Helicopter:
InitialFacing: 104
+ AirborneUpgrades: airborne
RenderSprites:
Image: carryall
Palette: colorpicker
diff --git a/mods/ra/maps/allies-05a/map.yaml b/mods/ra/maps/allies-05a/map.yaml
index 9dd53ff6e1..6664e0ae5a 100644
--- a/mods/ra/maps/allies-05a/map.yaml
+++ b/mods/ra/maps/allies-05a/map.yaml
@@ -1668,8 +1668,8 @@ Rules:
Range: 4c0
Tooltip:
ShowOwnerRow: false
- TargetableAircraft:
- GroundedTargetTypes: Ground
+ Targetable@GROUND:
+ TargetTypes: Ground
TRAN.IN:
Inherits: TRAN
RenderSprites:
diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml
index 8fd804704b..5fb48bd807 100644
--- a/mods/ra/rules/aircraft.yaml
+++ b/mods/ra/rules/aircraft.yaml
@@ -12,6 +12,7 @@ BADR:
Speed: 149
Repulsable: False
MaximumPitch: 56
+ AirborneUpgrades: airborne
Cargo:
MaxWeight: 10
-Selectable:
@@ -49,6 +50,7 @@ BADR.Bomber:
Speed: 149
Repulsable: False
MaximumPitch: 56
+ AirborneUpgrades: airborne
AmmoPool:
Ammo: 7
-Selectable:
@@ -106,6 +108,7 @@ MIG:
RearmBuildings: afld
RepulsionSpeed: 40
MaximumPitch: 56
+ AirborneUpgrades: airborne
AutoTarget:
TargetWhenIdle: false
TargetWhenDamaged: false
@@ -167,6 +170,7 @@ YAK:
Speed: 178
RepulsionSpeed: 40
MaximumPitch: 56
+ AirborneUpgrades: airborne
AutoTarget:
TargetWhenIdle: false
TargetWhenDamaged: false
@@ -215,6 +219,7 @@ TRAN:
Speed: 112
LandableTerrainTypes: Clear,Rough,Road,Ore,Beach
AltitudeVelocity: 0c100
+ AirborneUpgrades: airborne
WithRotor@PRIMARY:
Offset: -597,0,341
Sequence: rotor2
@@ -261,6 +266,7 @@ HELI:
InitialFacing: 20
ROT: 4
Speed: 149
+ AirborneUpgrades: airborne
AutoTarget:
InitialStance: HoldFire
WithRotor:
@@ -312,6 +318,7 @@ HIND:
InitialFacing: 20
ROT: 4
Speed: 112
+ AirborneUpgrades: airborne
AutoTarget:
InitialStance: HoldFire
WithRotor:
@@ -341,10 +348,11 @@ U2:
Speed: 373
Repulsable: False
MaximumPitch: 56
+ AirborneUpgrades: airborne
AttackBomber:
-Selectable:
-Voiced:
- -TargetableAircraft:
+ -Targetable@AIRBORNE:
-GainsExperience:
Contrail@1:
Offset: -725,683,0
diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml
index 83d2b684fe..98159c7e57 100644
--- a/mods/ra/rules/defaults.yaml
+++ b/mods/ra/rules/defaults.yaml
@@ -339,9 +339,14 @@
SelectionDecorations:
Selectable:
Bounds: 24,24
- TargetableAircraft:
+ Targetable@GROUND:
+ TargetTypes: Ground, Repair, Vehicle
+ UpgradeTypes: airborne
+ UpgradeMaxEnabledLevel: 0
+ Targetable@AIRBORNE:
TargetTypes: Air
- GroundedTargetTypes: Ground, Repair, Vehicle
+ UpgradeTypes: airborne
+ UpgradeMinEnabledLevel: 1
HiddenUnderFog:
Type: CenterPosition
AttackMove:
diff --git a/mods/ra/rules/husks.yaml b/mods/ra/rules/husks.yaml
index c318134b13..7053e6a84e 100644
--- a/mods/ra/rules/husks.yaml
+++ b/mods/ra/rules/husks.yaml
@@ -88,6 +88,7 @@ TRAN.Husk:
Helicopter:
ROT: 4
Speed: 149
+ AirborneUpgrades: airborne
WithRotor@PRIMARY:
Offset: -597,0,341
WithRotor@SECONDARY:
@@ -119,6 +120,7 @@ BADR.Husk:
Plane:
ROT: 5
Speed: 149
+ AirborneUpgrades: airborne
SmokeTrailWhenDamaged@0:
Offset: -432,560,0
Interval: 2
@@ -141,6 +143,7 @@ MIG.Husk:
Plane:
ROT: 5
Speed: 186
+ AirborneUpgrades: airborne
SmokeTrailWhenDamaged:
Offset: -853,0,171
Interval: 2
@@ -160,6 +163,7 @@ YAK.Husk:
Plane:
ROT: 5
Speed: 149
+ AirborneUpgrades: airborne
SmokeTrailWhenDamaged:
Offset: -853,0,0
Interval: 2
@@ -177,6 +181,7 @@ HELI.Husk:
Helicopter:
ROT: 4
Speed: 149
+ AirborneUpgrades: airborne
WithRotor:
Offset: 0,0,85
SmokeTrailWhenDamaged:
@@ -195,6 +200,7 @@ HIND.Husk:
Helicopter:
ROT: 4
Speed: 112
+ AirborneUpgrades: airborne
WithRotor:
SmokeTrailWhenDamaged:
Offset: -427,0,0
@@ -210,6 +216,7 @@ U2.Husk:
Plane:
ROT: 7
Speed: 373
+ AirborneUpgrades: airborne
Contrail@1:
Offset: -725,683,0
Contrail@2:
diff --git a/mods/ts/rules/aircraft.yaml b/mods/ts/rules/aircraft.yaml
index 846b931d68..6cdcc566d2 100644
--- a/mods/ts/rules/aircraft.yaml
+++ b/mods/ts/rules/aircraft.yaml
@@ -10,6 +10,7 @@ DPOD:
Speed: 149
InitialFacing: 0
LandableTerrainTypes: Clear
+ AirborneUpgrades: airborne
Health:
HP: 60
Armor:
@@ -47,6 +48,7 @@ DSHP:
LandableTerrainTypes: Clear
TakeoffSound: dropup1.aud
LandingSound: dropdwn1.aud
+ AirborneUpgrades: airborne
Health:
HP: 200
Armor:
@@ -78,6 +80,7 @@ ORCA:
RearmBuildings: gahpad, nahpad
ROT: 5
Speed: 186
+ AirborneUpgrades: airborne
Health:
HP: 200
Armor:
@@ -117,6 +120,7 @@ ORCAB:
MaximumPitch: 120
ROT: 3
Speed: 96
+ AirborneUpgrades: airborne
Health:
HP: 260
Armor:
@@ -159,6 +163,7 @@ ORCATRAN:
LandableTerrainTypes: Clear
TakeoffSound: dropup1.aud
LandingSound: dropdwn1.aud
+ AirborneUpgrades: airborne
Health:
HP: 200
Armor:
@@ -193,6 +198,7 @@ TRNSPORT:
TakeoffSound: dropup1.aud
LandingSound: dropdwn1.aud
AltitudeVelocity: 64
+ AirborneUpgrades: airborne
Health:
HP: 175
Armor:
@@ -224,6 +230,7 @@ SCRIN:
MaximumPitch: 90
ROT: 3
Speed: 168
+ AirborneUpgrades: airborne
Health:
HP: 280
Armor:
@@ -262,6 +269,7 @@ APACHE:
RearmBuildings: gahpad, nahpad
ROT: 5
Speed: 130
+ AirborneUpgrades: airborne
Health:
HP: 225
Armor:
diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml
index b7b3ce04a6..921cc974df 100644
--- a/mods/ts/rules/defaults.yaml
+++ b/mods/ts/rules/defaults.yaml
@@ -453,9 +453,14 @@
DrawLineToTarget:
AppearsOnRadar:
UseLocation: yes
- TargetableAircraft:
+ Targetable@GROUND:
+ TargetTypes: Ground
+ UpgradeTypes: airborne
+ UpgradeMaxEnabledLevel: 0
+ Targetable@AIRBORNE:
TargetTypes: Air
- GroundedTargetTypes: Ground
+ UpgradeTypes: airborne
+ UpgradeMinEnabledLevel: 1
Selectable:
SelectionDecorations:
Palette: pips
@@ -484,6 +489,7 @@
LandWhenIdle: no
CruiseAltitude: 2048
Voice: Move
+ AirborneUpgrades: airborne
^Plane:
Inherits: ^Aircraft
@@ -493,6 +499,7 @@
LandWhenIdle: no
CruiseAltitude: 2560
Voice: Move
+ AirborneUpgrades: airborne
ReturnOnIdle:
^Viceroid: