Skip to content

Commit

Permalink
Merge pull request OpenRA#6656 from pchote/turret-facing-fix
Browse files Browse the repository at this point in the history
Turret facing fix
  • Loading branch information
obrakmann committed Oct 4, 2014
2 parents 78f934d + c6691e8 commit 820cb94
Show file tree
Hide file tree
Showing 9 changed files with 38 additions and 34 deletions.
4 changes: 2 additions & 2 deletions OpenRA.Mods.Cnc/RenderGunboat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,11 @@ public RenderGunboat(Actor self, RenderGunboatInfo info)
var turret = self.TraitsImplementing<Turreted>()
.First(t => t.Name == info.Turret);

left = new Animation(self.World, name, () => turret.turretFacing);
left = new Animation(self.World, name, () => turret.TurretFacing);
left.Play(info.LeftSequence);
Add(info.LeftSequence, new AnimationWithOffset(left, null, () => facing.Facing > 128, 0));

right = new Animation(self.World, name, () => turret.turretFacing);
right = new Animation(self.World, name, () => turret.TurretFacing);
right.Play(info.RightSequence);
Add(info.RightSequence, new AnimationWithOffset(right, null, () => facing.Facing <= 128, 0));

Expand Down
8 changes: 4 additions & 4 deletions OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,17 +80,17 @@ public void TickIdle(Actor self)
{
if (state == PopupState.Open && idleTicks++ > info.CloseDelay)
{
turret.desiredFacing = info.DefaultFacing;
turret.DesiredFacing = info.DefaultFacing;
state = PopupState.Rotating;
}
else if (state == PopupState.Rotating && turret.turretFacing == info.DefaultFacing)
else if (state == PopupState.Rotating && turret.TurretFacing == info.DefaultFacing)
{
state = PopupState.Transitioning;
rb.PlayCustomAnimThen(self, "closing", () =>
{
state = PopupState.Closed;
rb.PlayCustomAnimRepeating(self, "closed-idle");
turret.desiredFacing = null;
turret.DesiredFacing = null;
});
}
}
Expand All @@ -101,7 +101,7 @@ public void BuildingComplete(Actor self)
{
state = PopupState.Closed;
rb.PlayCustomAnimRepeating(self, "closed-idle");
turret.desiredFacing = null;
turret.DesiredFacing = null;
}
}

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA/LeavesHusk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public void Killed(Actor self, AttackInfo e)
// This isn't a problem with the current units, but may be a problem for mods
var turreted = self.TraitsImplementing<Turreted>().FirstOrDefault();
if (turreted != null)
td.Add(new TurretFacingInit(turreted.turretFacing));
td.Add(new TurretFacingInit(turreted.TurretFacing));
var chronoshiftable = self.TraitOrDefault<Chronoshiftable>();
if (chronoshiftable != null && chronoshiftable.ReturnTicks > 0)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static Func<int> MakeTurretFacingFunc(Actor self)
{
// Turret artwork is baked into the sprite, so only the first turret makes sense.
var turreted = self.TraitsImplementing<Turreted>().FirstOrDefault();
return () => turreted.turretFacing;
return () => turreted.TurretFacing;
}

public RenderBuildingTurreted(ActorInitializer init, RenderBuildingInfo info)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA/Render/WithBarrel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public WithBarrel(Actor self, WithBarrelInfo info)
.First(tt => tt.Name == armament.Info.Turret);

var rs = self.Trait<RenderSprites>();
anim = new Animation(self.World, rs.GetImage(self), () => turreted.turretFacing);
anim = new Animation(self.World, rs.GetImage(self), () => turreted.TurretFacing);
anim.Play(info.Sequence);
rs.Add("barrel_{0}".F(info.Barrel), new AnimationWithOffset(
anim, () => BarrelOffset(), null, () => false, p => WithTurret.ZOffsetFromCenter(self, p, 0)));
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA/Render/WithMuzzleFlash.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public WithMuzzleFlash(Actor self, WithMuzzleFlashInfo info)
var turreted = self.TraitsImplementing<Turreted>()
.FirstOrDefault(t => t.Name == arm.Info.Turret);

getFacing = turreted != null ? () => turreted.turretFacing :
getFacing = turreted != null ? () => turreted.TurretFacing :
facing != null ? (Func<int>)(() => facing.Facing) : () => 0;

var muzzleFlash = new Animation(self.World, render.GetImage(self), getFacing);
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA/Render/WithTurret.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public WithTurret(Actor self, WithTurretInfo info)
arms = self.TraitsImplementing<Armament>()
.Where(w => w.Info.Turret == info.Turret);

anim = new Animation(self.World, rs.GetImage(self), () => t.turretFacing);
anim = new Animation(self.World, rs.GetImage(self), () => t.TurretFacing);
anim.Play(info.Sequence);
rs.Add("turret_{0}".F(info.Turret), new AnimationWithOffset(
anim, () => TurretOffset(self), null, () => false, p => ZOffsetFromCenter(self, p, 1)));
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Mods.RA/TakeCover.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public void Damaged(Actor self, AttackInfo e)
if (e.Damage > 0 && (e.Warhead == null || !e.Warhead.PreventProne)) /* Don't go prone when healed */
{
if (!isProne)
LocalOffset = info.ProneOffset;
localOffset = info.ProneOffset;

remainingProneTime = info.ProneTime;
}
Expand All @@ -60,7 +60,7 @@ public override void Tick(Actor self)
base.Tick(self);

if (isProne && --remainingProneTime == 0)
LocalOffset = WVec.Zero;
localOffset = WVec.Zero;
}

public int GetDamageModifier(Actor attacker, DamageWarhead warhead)
Expand Down
46 changes: 25 additions & 21 deletions OpenRA.Mods.RA/Turreted.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,61 +29,66 @@ public class TurretedInfo : ITraitInfo, UsesInit<TurretFacingInit>
public virtual object Create(ActorInitializer init) { return new Turreted(init, this); }
}

public class Turreted : ITick, ISync
public class Turreted : ITick, ISync, INotifyCreated
{
[Sync] public int QuantizedFacings = 0;
[Sync] public int turretFacing = 0;
public int? desiredFacing;
TurretedInfo info;
readonly TurretedInfo info;
AttackTurreted attack;
IFacing facing;
Lazy<AttackTurreted> attack;

[Sync] public int QuantizedFacings = 0;
[Sync] public int TurretFacing = 0;
public int? DesiredFacing;
int realignTick = 0;

// For subclasses that want to move the turret relative to the body
protected WVec LocalOffset = WVec.Zero;
protected WVec localOffset = WVec.Zero;

public WVec Offset { get { return info.Offset + LocalOffset; } }
public WVec Offset { get { return info.Offset + localOffset; } }
public string Name { get { return info.Turret; } }

public static int GetInitialTurretFacing(ActorInitializer init, int def)
{
if (init.Contains<TurretFacingInit>())
return init.Get<TurretFacingInit,int>();
return init.Get<TurretFacingInit, int>();

if (init.Contains<FacingInit>())
return init.Get<FacingInit,int>();
return init.Get<FacingInit, int>();

return def;
}

public Turreted(ActorInitializer init, TurretedInfo info)
{
this.info = info;
turretFacing = GetInitialTurretFacing(init, info.InitialFacing);
facing = init.self.TraitOrDefault<IFacing>();
attack = Exts.Lazy(() => init.self.TraitOrDefault<AttackTurreted>());
TurretFacing = GetInitialTurretFacing(init, info.InitialFacing);
}

public void Created(Actor self)
{
attack = self.TraitOrDefault<AttackTurreted>();
facing = self.TraitOrDefault<IFacing>();
}

public virtual void Tick(Actor self)
{
if (attack.Value != null && !attack.Value.IsAttacking)
if (attack != null && !attack.IsAttacking)
{
if (realignTick < info.RealignDelay)
realignTick++;
else if (info.RealignDelay > -1)
desiredFacing = null;
DesiredFacing = null;
}
else
realignTick = 0;

var df = desiredFacing ?? ( facing != null ? facing.Facing : turretFacing );
turretFacing = Util.TickFacing(turretFacing, df, info.ROT);
var df = DesiredFacing ?? (facing != null ? facing.Facing : TurretFacing);
TurretFacing = Util.TickFacing(TurretFacing, df, info.ROT);
}

public bool FaceTarget(Actor self, Target target)
{
desiredFacing = Util.GetFacing(target.CenterPosition - self.CenterPosition, turretFacing);
return turretFacing == desiredFacing;
DesiredFacing = Util.GetFacing(target.CenterPosition - self.CenterPosition, TurretFacing);
return TurretFacing == DesiredFacing;
}

// Turret offset in world-space
Expand All @@ -97,9 +102,8 @@ public WVec Position(Actor self)
// Orientation in unit-space
public WRot LocalOrientation(Actor self)
{

// Hack: turretFacing is relative to the world, so subtract the body yaw
var local = WRot.FromYaw(WAngle.FromFacing(turretFacing) - self.Orientation.Yaw);
var local = WRot.FromYaw(WAngle.FromFacing(TurretFacing) - self.Orientation.Yaw);

if (QuantizedFacings == 0)
return local;
Expand Down

0 comments on commit 820cb94

Please sign in to comment.