diff --git a/OpenRA.Utility/UpgradeRules.cs b/OpenRA.Utility/UpgradeRules.cs index 2202893a53..aca505c694 100644 --- a/OpenRA.Utility/UpgradeRules.cs +++ b/OpenRA.Utility/UpgradeRules.cs @@ -174,6 +174,54 @@ namespace OpenRA.Utility i.Value.Nodes.Add(new MiniYamlNode("OccupiesSpace", "false")); } + // Armaments and muzzleflashes were reworked to support garrisoning + if (engineVersion < 20140321) + { + if (depth == 0) + { + var muzzles = node.Value.Nodes.Where(n => n.Key.StartsWith("WithMuzzleFlash")); + var armaments = node.Value.Nodes.Where(n => n.Key.StartsWith("Armament")); + + // Shift muzzle flash definitions to Armament + foreach (var m in muzzles) + { + var muzzleArmNode = m.Value.Nodes.SingleOrDefault(n => n.Key == "Armament"); + var muzzleSequenceNode = m.Value.Nodes.SingleOrDefault(n => n.Key == "Sequence"); + var muzzleSplitFacingsNode = m.Value.Nodes.SingleOrDefault(n => n.Key == "SplitFacings"); + var muzzleFacingsCountNode = m.Value.Nodes.SingleOrDefault(n => n.Key == "FacingCount"); + + var muzzleArmName = muzzleArmNode != null ? muzzleArmNode.Value.Value.Trim() : "primary"; + var muzzleSequence = muzzleSequenceNode != null ? muzzleSequenceNode.Value.Value.Trim() : "muzzle"; + var muzzleSplitFacings = muzzleSplitFacingsNode != null ? FieldLoader.GetValue("SplitFacings", muzzleSplitFacingsNode.Value.Value) : false; + var muzzleFacingsCount = muzzleFacingsCountNode != null ? FieldLoader.GetValue("FacingsCount", muzzleFacingsCountNode.Value.Value) : 8; + + foreach (var a in armaments) + { + var armNameNode = m.Value.Nodes.SingleOrDefault(n => n.Key == "Name"); + var armName = armNameNode != null ? armNameNode.Value.Value.Trim() : "primary"; + + if (muzzleArmName == armName) + { + a.Value.Nodes.Add(new MiniYamlNode("MuzzleSequence", muzzleSequence)); + if (muzzleSplitFacings) + a.Value.Nodes.Add(new MiniYamlNode("MuzzleSplitFacings", muzzleFacingsCount.ToString())); + } + } + } + + foreach (var m in muzzles.ToList().Skip(1)) + node.Value.Nodes.Remove(m); + } + + // Remove all but the first muzzle flash definition + if (depth == 1 && node.Key.StartsWith("WithMuzzleFlash")) + { + node.Key = "WithMuzzleFlash"; + node.Value.Nodes.RemoveAll(n => n.Key == "Armament"); + node.Value.Nodes.RemoveAll(n => n.Key == "Sequence"); + } + } + UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); } } diff --git a/mods/cnc/rules/aircraft.yaml b/mods/cnc/rules/aircraft.yaml index 7275430174..f520734ce5 100644 --- a/mods/cnc/rules/aircraft.yaml +++ b/mods/cnc/rules/aircraft.yaml @@ -68,10 +68,12 @@ HELI: Armament@PRIMARY: Weapon: HeliAGGun LocalOffset: 128,-213,-85, 128,213,-85 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: HeliAAGun LocalOffset: 128,-213,-85, 128,213,-85 + MuzzleSequence: muzzle AttackHeli: FacingTolerance: 20 LimitedAmmo: @@ -83,9 +85,7 @@ HELI: RenderUnit: WithRotor: Offset: 0,0,85 - WithMuzzleFlash@PRIMARY: - WithMuzzleFlash@SECONDARY: - Armament: secondary + WithMuzzleFlash: WithShadow: LeavesHusk: HuskActor: HELI.Husk @@ -204,8 +204,7 @@ A10: Name: gun Weapon: Vulcan LocalOffset: 1024,0,-85 - WithMuzzleFlash@SECONDARY: - Armament: gun + WithMuzzleFlash: Armament@BOMBS: Name: bombs Weapon: Napalm diff --git a/mods/cnc/rules/civilian.yaml b/mods/cnc/rules/civilian.yaml index ec29780a03..1529c7056f 100644 --- a/mods/cnc/rules/civilian.yaml +++ b/mods/cnc/rules/civilian.yaml @@ -441,6 +441,8 @@ VICE: Armament: Weapon: Chemspray LocalOffset: 384,0,0 + MuzzleSequence: muzzle + MuzzleSplitFacings: 8 AttackFrontal: AttackWander: RenderUnit: diff --git a/mods/cnc/rules/infantry.yaml b/mods/cnc/rules/infantry.yaml index 2b463cdf7b..d89be65ee7 100644 --- a/mods/cnc/rules/infantry.yaml +++ b/mods/cnc/rules/infantry.yaml @@ -103,6 +103,8 @@ E4: Weapon: Flamethrower LocalOffset: 341,0,256 FireDelay: 3 + MuzzleSequence: muzzle + MuzzleSplitFacings: 8 AttackFrontal: WithMuzzleFlash: SplitFacings: true @@ -138,6 +140,8 @@ E5: Weapon: Chemspray LocalOffset: 341,0,256 FireDelay: 3 + MuzzleSequence: muzzle + MuzzleSplitFacings: 8 AttackFrontal: WithMuzzleFlash: SplitFacings: true diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index 42f9ecc89e..09388a2e71 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -524,6 +524,7 @@ GUN: Armament: Weapon: TurretGun LocalOffset: 512,0,112 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: AutoTarget: @@ -566,6 +567,7 @@ SAM: RenderBuildingTurreted: Armament: Weapon: SAMMissile + MuzzleSequence: muzzle AttackPopupTurreted: WithMuzzleFlash: AutoTarget: @@ -639,6 +641,7 @@ GTWR: Armament: Weapon: HighV LocalOffset: 256,0,256 + MuzzleSequence: muzzle AttackTurreted: BodyOrientation: QuantizedFacings: 8 diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml index 4d603697e4..82e94883da 100644 --- a/mods/cnc/rules/vehicles.yaml +++ b/mods/cnc/rules/vehicles.yaml @@ -98,16 +98,16 @@ APC: Recoil: 96 RecoilRecovery: 18 LocalOffset: 85,85,299, 85,-85,299 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: APCGun.AA Recoil: 96 RecoilRecovery: 18 LocalOffset: 85,85,299, 85,-85,299 + MuzzleSequence: muzzle AttackTurreted: - WithMuzzleFlash@PRIMARY: - WithMuzzleFlash@SECONDARY: - Armament: secondary + WithMuzzleFlash: RenderUnit: WithTurret: AutoTarget: @@ -141,6 +141,7 @@ ARTY: Armament: Weapon: ArtilleryShell LocalOffset: 624,0,208 + MuzzleSequence: muzzle AttackFrontal: WithMuzzleFlash: RenderUnit: @@ -175,6 +176,8 @@ FTNK: Armament: Weapon: BigFlamer LocalOffset: 512,128,42, 512,-128,42 + MuzzleSequence: muzzle + MuzzleSplitFacings: 8 AttackFrontal: RenderUnit: AutoTarget: @@ -212,6 +215,7 @@ BGGY: Armament: Weapon: MachineGun LocalOffset: 171,0,43 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -283,6 +287,7 @@ JEEP: Armament: Weapon: MachineGun LocalOffset: 171,0,85 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -318,6 +323,7 @@ LTNK: Recoil: 85 RecoilRecovery: 17 LocalOffset: 720,0,90 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -355,6 +361,7 @@ MTNK: Recoil: 128 RecoilRecovery: 26 LocalOffset: 768,0,90 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -396,14 +403,16 @@ HTNK: LocalOffset: 900,180,340, 900,-180,340 Recoil: 170 RecoilRecovery: 42 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: MammothMissiles LocalOffset: -85,384,340, -85,-384,340 LocalYaw: -100, 100 Recoil: 42 + MuzzleSequence: muzzle AttackTurreted: - WithMuzzleFlash@PRIMARY: + WithMuzzleFlash: RenderUnit: WithTurret: AutoTarget: diff --git a/mods/d2k/rules/harkonnen.yaml b/mods/d2k/rules/harkonnen.yaml index a4f692b107..a22a46a697 100644 --- a/mods/d2k/rules/harkonnen.yaml +++ b/mods/d2k/rules/harkonnen.yaml @@ -190,6 +190,7 @@ DEVAST: Armament: Weapon: DevBullet LocalOffset: 256,0,32 + MuzzleSequence: muzzle AttackFrontal: WithMuzzleFlash: AutoTarget: diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml index 53437f9f25..00cb703721 100644 --- a/mods/d2k/rules/ordos.yaml +++ b/mods/d2k/rules/ordos.yaml @@ -172,6 +172,7 @@ RAIDER: Armament: Weapon: HMGo LocalOffset: 256,0,128 + MuzzleSequence: muzzle AttackFrontal: AutoTarget: Explodes: @@ -206,6 +207,7 @@ STEALTHRAIDER: Armament: Weapon: HMGo LocalOffset: 256,0,128 + MuzzleSequence: muzzle AttackFrontal: Explodes: Weapon: UnitExplodeTiny diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 9af5cca8d4..859e4474f8 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -471,6 +471,7 @@ WALL: Armament: Weapon: TurretGun LocalOffset: 448,0,128 + MuzzleSequence: muzzle AttackTurreted: AutoTarget: RenderDetectionCircle: diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 04946705a5..578719fff0 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -130,6 +130,7 @@ TRIKE: Armament: Weapon: HMG LocalOffset: -416,0,0 + MuzzleSequence: muzzle AttackFrontal: AutoTarget: Explodes: @@ -218,6 +219,7 @@ QUAD.starport: Recoil: 128 RecoilRecovery: 32 LocalOffset: 256,0,0 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -267,6 +269,7 @@ SIEGETANK: Recoil: 150 RecoilRecovery: 19 LocalOffset: 512,0,320 + MuzzleSequence: muzzle AttackFrontal: WithMuzzleFlash: RenderUnit: diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index a49e6e363c..684aa42f3a 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -147,10 +147,12 @@ YAK: Armament@PRIMARY: Weapon: ChainGun.Yak LocalOffset: 256,-213,0 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: ChainGun.Yak LocalOffset: 256,213,0 + MuzzleSequence: muzzle AttackPlane: FacingTolerance: 20 Plane: @@ -171,9 +173,7 @@ YAK: ReloadTicks: 11 IronCurtainable: ReturnOnIdle: - WithMuzzleFlash@PRIMARY: - WithMuzzleFlash@SECONDARY: - Armament: secondary + WithMuzzleFlash: Contrail: Offset: -853,0,0 LeavesHusk: @@ -295,10 +295,12 @@ HIND: Armament@PRIMARY: Weapon: ChainGun LocalOffset: 85,-213,-85 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: ChainGun LocalOffset: 85,213,-85 + MuzzleSequence: muzzle AttackHeli: FacingTolerance: 20 Helicopter: @@ -321,9 +323,7 @@ HIND: IronCurtainable: Selectable: Bounds: 38,32,0,0 - WithMuzzleFlash@PRIMARY: - WithMuzzleFlash@SECONDARY: - Armament: secondary + WithMuzzleFlash: LeavesHusk: HuskActor: HIND.Husk SmokeTrailWhenDamaged: diff --git a/mods/ra/rules/ships.yaml b/mods/ra/rules/ships.yaml index 1e0d425b0b..19a699c4ba 100644 --- a/mods/ra/rules/ships.yaml +++ b/mods/ra/rules/ships.yaml @@ -181,6 +181,7 @@ CA: LocalOffset: 480,-100,40, 480,100,40 Recoil: 171 RecoilRecovery: 34 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Turret: secondary @@ -188,10 +189,9 @@ CA: LocalOffset: 480,-100,40, 480,100,40 Recoil: 171 RecoilRecovery: 34 + MuzzleSequence: muzzle AttackTurreted: - WithMuzzleFlash@PRIMARY: - WithMuzzleFlash@SECONDARY: - Armament: secondary + WithMuzzleFlash: Selectable: Bounds: 44,44 RenderUnit: @@ -262,11 +262,13 @@ PT: Armament@PRIMARY: Weapon: 2Inch LocalOffset: 208,0,48 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: DepthCharge + MuzzleSequence: muzzle AttackTurreted: - WithMuzzleFlash@PRIMARY: + WithMuzzleFlash: Selectable: Bounds: 32,32 RenderUnit: diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 21ed09bb2f..191199c48b 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -351,6 +351,7 @@ AGUN: Armament: Weapon: ZSU-23 LocalOffset: 432,150,-30, 432,-150,-30 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: AutoTarget: @@ -624,6 +625,7 @@ HBOX.E1: Armament: Weapon: Vulcan LocalOffset: 400,0,48 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: Cargo: @@ -723,6 +725,7 @@ GUN: Armament: Weapon: TurretGun LocalOffset: 512,0,112 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: AutoTarget: @@ -802,6 +805,7 @@ SAM: RenderBuildingTurreted: Armament: Weapon: Nike + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: AutoTarget: diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index ba4a4a92d8..6577fad977 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -55,6 +55,7 @@ V2RL: Recoil: 85 RecoilRecovery: 25 LocalOffset: 768,0,90 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -95,6 +96,7 @@ V2RL: Recoil: 128 RecoilRecovery: 38 LocalOffset: 720,0,80 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -137,6 +139,7 @@ V2RL: Recoil: 128 RecoilRecovery: 38 LocalOffset: 768,85,90, 768,-85,90 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -181,14 +184,16 @@ V2RL: LocalOffset: 900,180,340, 900,-180,340 Recoil: 171 RecoilRecovery: 30 + MuzzleSequence: muzzle Armament@SECONDARY: Name: secondary Weapon: MammothTusk LocalOffset: -85,384,340, -85,-384,340 LocalYaw: -100,100 Recoil: 43 + MuzzleSequence: muzzle AttackTurreted: - WithMuzzleFlash@PRIMARY: + WithMuzzleFlash: RenderUnit: WithTurret: AutoTarget: @@ -230,6 +235,7 @@ ARTY: Armament: Weapon: 155mm LocalOffset: 624,0,208 + MuzzleSequence: muzzle AttackFrontal: WithMuzzleFlash: RenderUnit: @@ -344,6 +350,7 @@ JEEP: Offset: 0,0,85 Armament: Weapon: M60mg + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -377,6 +384,7 @@ APC: Armament: Weapon: M60mg LocalOffset: 0,0,171 + MuzzleSequence: muzzle AttackFrontal: RenderUnit: WithMuzzleFlash: @@ -608,6 +616,7 @@ FTRK: Weapon: FLAK-23 Recoil: 85 LocalOffset: 512,0,192 + MuzzleSequence: muzzle AttackTurreted: WithMuzzleFlash: RenderUnit: @@ -717,6 +726,7 @@ QTNK: -EjectOnDeath: TargetableUnit: TargetTypes: Ground, MADTank + STNK: Inherits: ^Vehicle Buildable: @@ -761,3 +771,4 @@ STNK: UncloakOnUnload: True DetectCloaked: Range: 6 +