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