From 1d5f67cb6abbc7044918dce264b2cb45db04a364 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 25 May 2013 16:12:51 +1200 Subject: [PATCH] Allow turrets to have a different facing count to the actor body. --- OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs | 16 ++++++++++++++-- OpenRA.Mods.RA/Render/WithTurret.cs | 3 +++ OpenRA.Mods.RA/Turreted.cs | 12 +++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs b/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs index daeeb3d00b..c2bc6b420a 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs @@ -22,8 +22,7 @@ namespace OpenRA.Mods.RA.Render class RenderBuildingTurreted : RenderBuilding { - public RenderBuildingTurreted( ActorInitializer init, RenderBuildingInfo info ) - : base(init, info, MakeTurretFacingFunc(init.self)) { } + Turreted t; static Func MakeTurretFacingFunc(Actor self) { @@ -31,5 +30,18 @@ namespace OpenRA.Mods.RA.Render var turreted = self.TraitsImplementing().FirstOrDefault(); return () => turreted.turretFacing; } + + public RenderBuildingTurreted(ActorInitializer init, RenderBuildingInfo info) + : base(init, info, MakeTurretFacingFunc(init.self)) + { + t = init.self.TraitsImplementing().FirstOrDefault(); + t.QuantizedFacings = anim.CurrentSequence.Facings; + } + + public override void DamageStateChanged(Actor self, AttackInfo e) + { + base.DamageStateChanged(self, e); + t.QuantizedFacings = anim.CurrentSequence.Facings; + } } } diff --git a/OpenRA.Mods.RA/Render/WithTurret.cs b/OpenRA.Mods.RA/Render/WithTurret.cs index b0981325ce..ad325b9b7c 100755 --- a/OpenRA.Mods.RA/Render/WithTurret.cs +++ b/OpenRA.Mods.RA/Render/WithTurret.cs @@ -54,6 +54,9 @@ namespace OpenRA.Mods.RA.Render anim.Play(info.Sequence); rs.anims.Add("turret_{0}".F(info.Turret), new AnimationWithOffset( anim, () => TurretOffset(self), null, p => ZOffsetFromCenter(self, p, 1))); + + // Restrict turret facings to match the sprite + t.QuantizedFacings = anim.CurrentSequence.Facings; } WVec TurretOffset(Actor self) diff --git a/OpenRA.Mods.RA/Turreted.cs b/OpenRA.Mods.RA/Turreted.cs index 0040377b81..e3ffeb7662 100755 --- a/OpenRA.Mods.RA/Turreted.cs +++ b/OpenRA.Mods.RA/Turreted.cs @@ -33,6 +33,7 @@ namespace OpenRA.Mods.RA public class Turreted : ITick, ISync, IResolveOrder { + [Sync] public int QuantizedFacings = -1; [Sync] public int turretFacing = 0; public int? desiredFacing; TurretedInfo info; @@ -91,8 +92,17 @@ namespace OpenRA.Mods.RA // Orientation in unit-space public WRot LocalOrientation(Actor self) { + // Hack: turretFacing is relative to the world, so subtract the body yaw - return WRot.FromYaw(WAngle.FromFacing(turretFacing) - self.Orientation.Yaw); + var local = WRot.FromYaw(WAngle.FromFacing(turretFacing) - self.Orientation.Yaw); + + if (QuantizedFacings == -1) + return local; + + // Quantize orientation to match a rendered sprite + // Implies no pitch or yaw + var facing = Traits.Util.QuantizeFacing(local.Yaw.Angle / 4, QuantizedFacings) * (256 / QuantizedFacings); + return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)); } } }