Convert (Dynamic)FacingInit, (Dynamic)TurretFacingInit to WAngle.

This commit is contained in:
Paul Chote
2020-06-26 00:33:08 +01:00
committed by abcdefg30
parent e8f443f4a9
commit a2269e7ee7
36 changed files with 133 additions and 155 deletions

View File

@@ -30,33 +30,26 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Muzzle position relative to turret or body. (forward, right, up) triples")]
public readonly WVec Offset = WVec.Zero;
[Desc("Facing to use for actor previews (map editor, color picker, etc)")]
public readonly int PreviewFacing = 96;
[Desc("Display order for the turret facing slider in the map editor")]
public readonly int EditorTurretFacingDisplayOrder = 4;
IEnumerable<ActorInit> IActorPreviewInitInfo.ActorPreviewInits(ActorInfo ai, ActorPreviewType type)
{
yield return new TurretFacingInit(this, PreviewFacing);
yield return new TurretFacingInit(this, WAngle.FromFacing(InitialFacing));
}
IEnumerable<EditorActorOption> IEditorActorOptions.ActorOptions(ActorInfo ai, World world)
{
yield return new EditorActorSlider("Turret", EditorTurretFacingDisplayOrder, 0, 255, 8,
yield return new EditorActorSlider("Turret", EditorTurretFacingDisplayOrder, 0, 1023, 8,
actor =>
{
var init = actor.GetInitOrDefault<TurretFacingInit>(this);
if (init != null)
return init.Value;
return init.Value.Angle;
var facingInit = actor.GetInitOrDefault<FacingInit>(this);
if (facingInit != null)
return facingInit.Value;
return InitialFacing;
return WAngle.FromFacing(InitialFacing).Angle;
},
(actor, value) => actor.ReplaceInit(new TurretFacingInit(this, (int)value), this));
(actor, value) => actor.ReplaceInit(new TurretFacingInit(this, new WAngle((int)value)), this));
}
public override object Create(ActorInitializer init) { return new Turreted(init, this); }
@@ -83,38 +76,41 @@ namespace OpenRA.Mods.Common.Traits
public WVec Offset { get { return Info.Offset + localOffset; } }
public string Name { get { return Info.Turret; } }
public static Func<int> TurretFacingFromInit(IActorInitializer init, TurretedInfo info)
public static Func<WAngle> TurretFacingFromInit(IActorInitializer init, TurretedInfo info)
{
return TurretFacingFromInit(init, info, info.InitialFacing);
return TurretFacingFromInit(init, info, WAngle.FromFacing(info.InitialFacing));
}
public static Func<int> TurretFacingFromInit(IActorInitializer init, TraitInfo info, int defaultFacing)
public static Func<WAngle> TurretFacingFromInit(IActorInitializer init, TraitInfo info, WAngle defaultFacing)
{
var turretFacingInit = init.GetOrDefault<TurretFacingInit>(info);
if (turretFacingInit != null)
{
var facing = turretFacingInit.Value;
return () => facing;
}
var dynamicFacingInit = init.GetOrDefault<DynamicFacingInit>();
if (dynamicFacingInit != null)
return dynamicFacingInit.Value;
// (Dynamic)TurretFacingInit is specified relative to the actor body.
// We need to add the body facing to return an absolute world angle.
Func<WAngle> bodyFacing = null;
var facingInit = init.GetOrDefault<FacingInit>();
if (facingInit != null)
{
var facing = facingInit.Value;
return () => facing;
bodyFacing = () => facing;
}
return () => defaultFacing;
var turretFacingInit = init.GetOrDefault<TurretFacingInit>(info);
if (turretFacingInit != null)
{
var facing = turretFacingInit.Value;
return bodyFacing != null ? (Func<WAngle>)(() => bodyFacing() + facing) : () => facing;
}
var dynamicFacingInit = init.GetOrDefault<DynamicFacingInit>();
if (dynamicFacingInit != null)
return bodyFacing != null ? () => bodyFacing() + dynamicFacingInit.Value() : dynamicFacingInit.Value;
return bodyFacing ?? (Func<WAngle>)(() => defaultFacing);
}
public Turreted(ActorInitializer init, TurretedInfo info)
: base(info)
{
TurretFacing = TurretFacingFromInit(init, Info)();
TurretFacing = TurretFacingFromInit(init, Info)().Facing;
}
protected override void Created(Actor self)
@@ -203,12 +199,16 @@ namespace OpenRA.Mods.Common.Traits
public void ModifyDeathActorInit(Actor self, TypeDictionary init)
{
init.Add(new TurretFacingInit(Info, TurretFacing));
var turretFacing = WAngle.FromFacing(TurretFacing);
if (facing != null)
turretFacing -= facing.Facing;
init.Add(new TurretFacingInit(Info, turretFacing));
}
void IActorPreviewInitModifier.ModifyActorPreviewInit(Actor self, TypeDictionary inits)
{
Func<int> bodyFacing = () => facing.Facing.Facing;
Func<WAngle> bodyFacing = () => facing.Facing;
var dynamicFacing = inits.GetOrDefault<DynamicFacingInit>();
var staticFacing = inits.GetOrDefault<FacingInit>();
if (dynamicFacing != null)
@@ -217,7 +217,7 @@ namespace OpenRA.Mods.Common.Traits
bodyFacing = () => staticFacing.Value;
// Freeze the relative turret facing to its current value
var facingOffset = TurretFacing - bodyFacing();
var facingOffset = WAngle.FromFacing(TurretFacing) - bodyFacing();
inits.Add(new DynamicTurretFacingInit(Info, () => bodyFacing() + facingOffset));
}
@@ -228,21 +228,21 @@ namespace OpenRA.Mods.Common.Traits
}
}
public class TurretFacingInit : ValueActorInit<int>
public class TurretFacingInit : ValueActorInit<WAngle>
{
public TurretFacingInit(TraitInfo info, int value)
public TurretFacingInit(TraitInfo info, WAngle value)
: base(info, value) { }
public TurretFacingInit(string instanceName, int value)
public TurretFacingInit(string instanceName, WAngle value)
: base(instanceName, value) { }
public TurretFacingInit(int value)
public TurretFacingInit(WAngle value)
: base(value) { }
}
public class DynamicTurretFacingInit : ValueActorInit<Func<int>>
public class DynamicTurretFacingInit : ValueActorInit<Func<WAngle>>
{
public DynamicTurretFacingInit(TraitInfo info, Func<int> value)
public DynamicTurretFacingInit(TraitInfo info, Func<WAngle> value)
: base(info, value) { }
}
}