Support dynamic initial turret facings.

This commit is contained in:
Paul Chote
2016-06-10 16:41:26 +01:00
parent 4fa3ecfafb
commit 970caf38c6
5 changed files with 36 additions and 15 deletions

View File

@@ -45,8 +45,8 @@ namespace OpenRA.Mods.Common.Traits.Render
var t = init.Actor.TraitInfos<TurretedInfo>()
.First(tt => tt.Turret == Turret);
var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret);
var anim = new Animation(init.World, image, () => turretFacing);
var turretFacing = Turreted.TurretFacingFromInit(init, t.InitialFacing, Turret);
var anim = new Animation(init.World, image, turretFacing);
anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence));
Func<int> facing = init.GetFacing();

View File

@@ -45,8 +45,8 @@ namespace OpenRA.Mods.Common.Traits.Render
var voxel = VoxelProvider.GetVoxel(image, Sequence);
var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, t.Turret);
Func<WRot> turretOrientation = () => body.QuantizeOrientation(WRot.FromYaw(WAngle.FromFacing(turretFacing) - orientation().Yaw), facings);
var turretFacing = Turreted.TurretFacingFromInit(init, t.InitialFacing, t.Turret);
Func<WRot> turretOrientation = () => body.QuantizeOrientation(WRot.FromYaw(WAngle.FromFacing(turretFacing()) - orientation().Yaw), facings);
Func<WRot> quantizedTurret = () => body.QuantizeOrientation(turretOrientation(), facings);
Func<WRot> quantizedBody = () => body.QuantizeOrientation(orientation(), facings);

View File

@@ -41,8 +41,8 @@ namespace OpenRA.Mods.Common.Traits.Render
var voxel = VoxelProvider.GetVoxel(image, Sequence);
Func<WVec> turretOffset = () => body.LocalToWorld(t.Offset.Rotate(orientation()));
var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret);
Func<WRot> turretBodyOrientation = () => WRot.FromYaw(WAngle.FromFacing(turretFacing) - orientation().Yaw);
var turretFacing = Turreted.TurretFacingFromInit(init, t.InitialFacing, Turret);
Func<WRot> turretBodyOrientation = () => WRot.FromYaw(WAngle.FromFacing(turretFacing()) - orientation().Yaw);
yield return new VoxelAnimation(voxel, turretOffset,
() => new[] { turretBodyOrientation(), body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0);
}

View File

@@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits
// TODO: Carry orientation over from the parent instead of just facing
var bodyFacing = init.Contains<DynamicFacingInit>() ? init.Get<DynamicFacingInit, Func<int>>()()
: init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0;
facing = WAngle.FromFacing(Turreted.GetInitialTurretFacing(init, 0));
facing = WAngle.FromFacing(Turreted.TurretFacingFromInit(init, 0)());
// Calculate final position
var throwRotation = WRot.FromFacing(Game.CosmeticRandom.Next(1024));

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits
public virtual object Create(ActorInitializer init) { return new Turreted(init, this); }
}
public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier
public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier, IActorPreviewInitModifier
{
readonly TurretedInfo info;
AttackTurreted attack;
@@ -50,31 +50,44 @@ namespace OpenRA.Mods.Common.Traits
public WVec Offset { get { return info.Offset + localOffset; } }
public string Name { get { return info.Turret; } }
public static int GetInitialTurretFacing(IActorInitializer init, int def, string turret = null)
public static Func<int> TurretFacingFromInit(IActorInitializer init, int def, string turret = null)
{
if (turret != null && init.Contains<DynamicTurretFacingsInit>())
{
Func<int> facing;
if (init.Get<DynamicTurretFacingsInit, Dictionary<string, Func<int>>>().TryGetValue(turret, out facing))
return facing;
}
if (turret != null && init.Contains<TurretFacingsInit>())
{
int facing;
if (init.Get<TurretFacingsInit, Dictionary<string, int>>().TryGetValue(turret, out facing))
return facing;
return () => facing;
}
if (init.Contains<TurretFacingInit>())
return init.Get<TurretFacingInit, int>();
{
var facing = init.Get<TurretFacingInit, int>();
return () => facing;
}
if (init.Contains<DynamicFacingInit>())
return init.Get<DynamicFacingInit, Func<int>>()();
return init.Get<DynamicFacingInit, Func<int>>();
if (init.Contains<FacingInit>())
return init.Get<FacingInit, int>();
{
var facing = init.Get<FacingInit, int>();
return () => facing;
}
return def;
return () => def;
}
public Turreted(ActorInitializer init, TurretedInfo info)
{
this.info = info;
TurretFacing = GetInitialTurretFacing(init, info.InitialFacing, info.Turret);
TurretFacing = TurretFacingFromInit(init, info.InitialFacing, info.Turret)();
}
public void Created(Actor self)
@@ -179,4 +192,12 @@ namespace OpenRA.Mods.Common.Traits
public TurretFacingsInit(Dictionary<string, int> init) { value = init; }
public Dictionary<string, int> Value(World world) { return value; }
}
public class DynamicTurretFacingsInit : IActorInit<Dictionary<string, Func<int>>>
{
readonly Dictionary<string, Func<int>> value = new Dictionary<string, Func<int>>();
public DynamicTurretFacingsInit() { }
public DynamicTurretFacingsInit(Dictionary<string, Func<int>> init) { value = init; }
public Dictionary<string, Func<int>> Value(World world) { return value; }
}
}