diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 52529e9f6c..f1ef383574 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -310,7 +310,6 @@
-
@@ -321,7 +320,6 @@
-
@@ -437,6 +435,7 @@
+
diff --git a/OpenRA.Mods.RA/Render/RenderBuildingSeparateTurret.cs b/OpenRA.Mods.RA/Render/RenderBuildingSeparateTurret.cs
deleted file mode 100644
index d8589ea50e..0000000000
--- a/OpenRA.Mods.RA/Render/RenderBuildingSeparateTurret.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-#region Copyright & License Information
-/*
- * Copyright 2007-2012 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 OpenRA.Graphics;
-using OpenRA.Traits;
-using OpenRA.Mods.RA.Buildings;
-
-namespace OpenRA.Mods.RA.Render
-{
- class RenderBuildingSeparateTurretInfo : RenderBuildingInfo, Requires, Requires
- {
- public override object Create(ActorInitializer init) { return new RenderBuildingSeparateTurret(init, this); }
- }
-
- class RenderBuildingSeparateTurret : RenderBuilding
- {
- public RenderBuildingSeparateTurret(ActorInitializer init, RenderBuildingInfo info)
- : base(init, info)
- {
- var self = init.self;
- var turreted = self.TraitsImplementing();
-
- var i = 0;
- foreach (var t in turreted)
- {
- var anim = new Animation(GetImage(self), () => t.turretFacing);
- anim.Play("turret");
-
- anims.Add("turret_{0}".F(i++), new AnimationWithOffset(anim,
- wr => wr.ScreenPxOffset(t.Position(self)), null));
- }
- }
- }
-}
\ No newline at end of file
diff --git a/OpenRA.Mods.RA/Render/RenderUnitReload.cs b/OpenRA.Mods.RA/Render/RenderUnitReload.cs
index 0d76cdc0e0..52cfc561a7 100755
--- a/OpenRA.Mods.RA/Render/RenderUnitReload.cs
+++ b/OpenRA.Mods.RA/Render/RenderUnitReload.cs
@@ -32,25 +32,4 @@ namespace OpenRA.Mods.RA.Render
base.Tick(self);
}
}
-
- /* TODO: native elevation support on turrets, and this dies? */
-
- class RenderUnitTurretedAimInfo : RenderUnitTurretedInfo
- {
- public override object Create(ActorInitializer init) { return new RenderUnitTurretedAim(init.self); }
- }
-
- class RenderUnitTurretedAim : RenderUnitTurreted
- {
- public RenderUnitTurretedAim(Actor self)
- : base(self) { }
-
- public override void Tick(Actor self)
- {
- var attack = self.TraitOrDefault();
- var isAttacking = attack.IsAttacking;
- anims["turret_0"].Animation.ReplaceAnim(isAttacking ? "aim" : "turret");
- base.Tick(self);
- }
- }
}
diff --git a/OpenRA.Mods.RA/Render/RenderUnitTurreted.cs b/OpenRA.Mods.RA/Render/RenderUnitTurreted.cs
deleted file mode 100755
index 740bf97075..0000000000
--- a/OpenRA.Mods.RA/Render/RenderUnitTurreted.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-#region Copyright & License Information
-/*
- * Copyright 2007-2011 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;
-using System.Linq;
-using OpenRA.Graphics;
-using OpenRA.Traits;
-
-namespace OpenRA.Mods.RA.Render
-{
- class RenderUnitTurretedInfo : RenderUnitInfo, Requires, Requires
- {
- public override object Create(ActorInitializer init) { return new RenderUnitTurreted(init.self); }
- }
-
- class RenderUnitTurreted : RenderUnit
- {
- public RenderUnitTurreted(Actor self)
- : base(self)
- {
- var facing = self.Trait();
- var turreted = self.TraitsImplementing();
-
- var i = 0;
- foreach (var t in turreted)
- {
- var turret = t;
-
- var anim = new Animation(GetImage(self), () => turret.turretFacing);
- anim.Play("turret");
-
- anims.Add("turret_{0}".F(i++), new AnimationWithOffset(anim,
- wr => TurretPosition(self, wr, turret, facing), null));
- }
- }
-
- float2 TurretPosition(Actor self, WorldRenderer wr, Turreted t, IFacing facing)
- {
- var recoil = self.TraitsImplementing()
- .Where(w => w.Info.Turret == t.Name)
- .Aggregate(WRange.Zero, (a,b) => a + b.Recoil);
-
- var localOffset = new WVec(-recoil, WRange.Zero, WRange.Zero);
- var bodyOrientation = QuantizeOrientation(self, self.Orientation);
- var turretOrientation = QuantizeOrientation(self, t.LocalOrientation(self));
- var worldPos = t.Position(self) + LocalToWorld(localOffset.Rotate(turretOrientation).Rotate(bodyOrientation));
-
- return wr.ScreenPxOffset(worldPos);
- }
- }
-}
diff --git a/OpenRA.Mods.RA/Render/WithTurret.cs b/OpenRA.Mods.RA/Render/WithTurret.cs
new file mode 100755
index 0000000000..18cbb24d7e
--- /dev/null
+++ b/OpenRA.Mods.RA/Render/WithTurret.cs
@@ -0,0 +1,81 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2013 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;
+using System.Collections.Generic;
+using System.Linq;
+using OpenRA.FileFormats;
+using OpenRA.Graphics;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.RA.Render
+{
+ class WithTurretInfo : ITraitInfo, Requires, Requires
+ {
+ [Desc("Sequence name to use")]
+ public readonly string Sequence = "turret";
+
+ [Desc("Sequence name to use when prepared to fire")]
+ public readonly string AimSequence = null;
+
+ [Desc("Turreted 'Turret' key to display")]
+ public readonly string Turret = "primary";
+
+ public object Create(ActorInitializer init) { return new WithTurret(init.self, this); }
+ }
+
+ class WithTurret : ITick
+ {
+ WithTurretInfo info;
+ RenderSimple rs;
+ AttackBase ab;
+ Turreted t;
+ IEnumerable arms;
+ Animation anim;
+
+ public WithTurret(Actor self, WithTurretInfo info)
+ {
+ this.info = info;
+ rs = self.Trait();
+ ab = self.TraitOrDefault();
+ t = self.TraitsImplementing()
+ .First(tt => tt.Name == info.Turret);
+ arms = self.TraitsImplementing()
+ .Where(w => w.Info.Turret == info.Turret);
+
+ anim = new Animation(rs.GetImage(self), () => t.turretFacing);
+ anim.Play(info.Sequence);
+ rs.anims.Add("turret_{0}".F(info.Turret), new AnimationWithOffset(
+ anim,
+ wr => TurretPosition(self, wr),
+ null) { ZOffset = 1 });
+ }
+
+ int2 TurretPosition(Actor self, WorldRenderer wr)
+ {
+ var recoil = arms.Aggregate(WRange.Zero, (a,b) => a + b.Recoil);
+ var localOffset = new WVec(-recoil, WRange.Zero, WRange.Zero);
+ var bodyOrientation = rs.QuantizeOrientation(self, self.Orientation);
+ var turretOrientation = rs.QuantizeOrientation(self, t.LocalOrientation(self));
+ var worldPos = t.Position(self) + rs.LocalToWorld(localOffset.Rotate(turretOrientation).Rotate(bodyOrientation));
+
+ return wr.ScreenPxOffset(worldPos);
+ }
+
+ public void Tick(Actor self)
+ {
+ if (info.AimSequence == null)
+ return;
+
+ var sequence = ab.IsAttacking ? info.AimSequence : info.Sequence;
+ rs.anims["turret_{0}".F(info.Turret)].Animation.ReplaceAnim(sequence);
+ }
+ }
+}
diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml
index a0bcb27c03..c8dd847d1b 100644
--- a/mods/cnc/rules/vehicles.yaml
+++ b/mods/cnc/rules/vehicles.yaml
@@ -111,7 +111,8 @@ APC:
LocalOffset: 85,85,299, 85,-85,299
AttackTurreted:
WithMuzzleFlash:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Cargo:
Types: Infantry
@@ -217,7 +218,8 @@ BGGY:
Weapon: MachineGun
AttackTurreted:
WithMuzzleFlash:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
LeavesHusk:
HuskActor: BGGY.Husk
@@ -288,7 +290,8 @@ JEEP:
Weapon: MachineGun
AttackTurreted:
WithMuzzleFlash:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
LeavesHusk:
HuskActor: JEEP.Husk
@@ -322,7 +325,8 @@ LTNK:
RecoilRecovery: 17
LocalOffset: -128,0,85
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
LeavesHusk:
HuskActor: LTNK.Husk
@@ -358,7 +362,8 @@ MTNK:
RecoilRecovery: 26
LocalOffset: 0,0,43
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
LeavesHusk:
HuskActor: MTNK.Husk
@@ -403,7 +408,8 @@ HTNK:
LocalYaw: -100, 100
Recoil: 42
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
SelfHealing:
Ticks: 10
@@ -445,7 +451,9 @@ MSAM:
Weapon: 227mm
LocalOffset: 213,128,0, 213,-128,0
AttackFrontal:
- RenderUnitTurretedAim:
+ RenderUnit:
+ WithTurret:
+ AimSequence: aim
AutoTarget:
LeavesHusk:
HuskActor: MSAM.Husk
@@ -479,7 +487,9 @@ MLRS:
Weapon: Patriot
LocalOffset: 0,-171,0, 0,171,0
AttackTurreted:
- RenderUnitTurretedAim:
+ RenderUnit:
+ WithTurret:
+ AimSequence: aim
AutoTarget:
InitialStance: Defend
Explodes:
diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml
index bc0f544b16..e331b6d404 100644
--- a/mods/d2k/rules/atreides.yaml
+++ b/mods/d2k/rules/atreides.yaml
@@ -138,8 +138,9 @@ COMBATA:
RecoilRecovery: 34
LocalOffset: 85,0,128
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
Image: COMBATA
+ WithTurret:
LeavesHusk:
HuskActor: Combata.Husk
diff --git a/mods/d2k/rules/harkonnen.yaml b/mods/d2k/rules/harkonnen.yaml
index 0d312df94e..c770778be2 100644
--- a/mods/d2k/rules/harkonnen.yaml
+++ b/mods/d2k/rules/harkonnen.yaml
@@ -163,8 +163,9 @@ COMBATH:
ROT: 5
Health:
HP: 440
- RenderUnitTurreted:
+ RenderUnit:
Image: COMBATH
+ WithTurret:
LeavesHusk:
HuskActor: Combath.Husk
diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml
index 8874c0123d..7db2562294 100644
--- a/mods/d2k/rules/ordos.yaml
+++ b/mods/d2k/rules/ordos.yaml
@@ -108,8 +108,9 @@ COMBATO:
Speed: 9
ROT: 8
Crushes: crate, infantry
- RenderUnitTurreted:
+ RenderUnit:
Image: COMBATO
+ WithTurret:
LeavesHusk:
HuskActor: Combato.Husk
diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml
index 1aa1d45850..c68b03fef6 100644
--- a/mods/d2k/rules/structures.yaml
+++ b/mods/d2k/rules/structures.yaml
@@ -402,11 +402,11 @@ GUNTOWER:
RevealsShroud:
Range: 8
RenderRangeCircle:
- -RenderBuilding:
-AutoTargetIgnore:
- RenderBuildingSeparateTurret:
+ RenderBuilding:
HasMakeAnimation: false
Image: guntowera
+ WithTurret:
Turreted:
ROT: 6
InitialFacing: 128
@@ -460,11 +460,11 @@ ROCKETTOWER:
RevealsShroud:
Range: 10
RenderRangeCircle:
- -RenderBuilding:
-AutoTargetIgnore:
- RenderBuildingSeparateTurret:
+ RenderBuilding:
HasMakeAnimation: false
Image: rockettowera
+ WithTurret:
Armament:
Weapon: TowerMissile
LocalOffset: 85,597,469, 85,-597,469
diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml
index 141dbb4ba7..a314ca739e 100644
--- a/mods/d2k/rules/vehicles.yaml
+++ b/mods/d2k/rules/vehicles.yaml
@@ -223,7 +223,8 @@ QUAD.starport:
RecoilRecovery: 34
LocalOffset: 85,0,128
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Explodes:
Weapon: UnitExplodeSmall
@@ -272,8 +273,9 @@ SIEGETANK:
RecoilRecovery: 19
LocalOffset: 171,0,299
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
Image: SIEGETANK
+ WithTurret:
Explodes:
Weapon: UnitExplodeScale
EmptyWeapon: UnitExplodeScale
diff --git a/mods/ra/maps/monster-tank-madness/map.yaml b/mods/ra/maps/monster-tank-madness/map.yaml
index 8cba841af0..8cdf0571be 100644
--- a/mods/ra/maps/monster-tank-madness/map.yaml
+++ b/mods/ra/maps/monster-tank-madness/map.yaml
@@ -2586,8 +2586,9 @@ Rules:
LocalYaw: -100,100
Recoil: 43
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
Image: 4TNK
+ WithTurret:
AutoTarget:
Explodes:
Weapon: MiniNuke
diff --git a/mods/ra/rules/ships.yaml b/mods/ra/rules/ships.yaml
index 684f8b5eda..6a0e1cc4ad 100644
--- a/mods/ra/rules/ships.yaml
+++ b/mods/ra/rules/ships.yaml
@@ -130,7 +130,8 @@ DD:
AttackTurreted:
Selectable:
Bounds: 38,38
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Chronoshiftable:
IronCurtainable:
@@ -185,7 +186,11 @@ CA:
AttackTurreted:
Selectable:
Bounds: 44,44
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret@PRIMARY:
+ Turret: primary
+ WithTurret@SECONDARY:
+ Turret: secondary
AutoTarget:
Chronoshiftable:
IronCurtainable:
@@ -255,7 +260,8 @@ PT:
AttackTurreted:
Selectable:
Bounds: 32,32
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Chronoshiftable:
IronCurtainable:
diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml
index 3e148d8fbd..bbd09b3e22 100644
--- a/mods/ra/rules/vehicles.yaml
+++ b/mods/ra/rules/vehicles.yaml
@@ -55,7 +55,8 @@ V2RL:
Recoil: 85
RecoilRecovery: 25
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Explodes:
Weapon: UnitExplodeSmall
@@ -92,7 +93,8 @@ V2RL:
Recoil: 128
RecoilRecovery: 38
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Explodes:
Weapon: UnitExplodeSmall
@@ -132,7 +134,8 @@ V2RL:
RecoilRecovery: 38
LocalOffset: 0,85,0, 0,-85,0
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Explodes:
Weapon: UnitExplodeSmall
@@ -177,7 +180,8 @@ V2RL:
LocalYaw: -100,100
Recoil: 43
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Explodes:
Weapon: UnitExplodeSmall
@@ -332,7 +336,8 @@ JEEP:
Weapon: M60mg
AttackTurreted:
WithMuzzleFlash:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Cargo:
Types: Infantry
@@ -667,7 +672,8 @@ FTRK:
Weapon: FLAK-23
Recoil: 85
AttackTurreted:
- RenderUnitTurreted:
+ RenderUnit:
+ WithTurret:
AutoTarget:
Explodes:
Weapon: UnitExplodeSmall