Move weapon/turret definitions out of AttackBase.
Weapons are now defined with the Armament trait and turret parameters live in Turreted. This has the side effect of allowing any number and distribution of weapons and turrets.
This commit is contained in:
@@ -8,23 +8,29 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Mods.RA.Render;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
public class TurretedInfo : ITraitInfo, UsesInit<TurretFacingInit>
|
||||
{
|
||||
public readonly string Turret = "primary";
|
||||
public readonly int ROT = 255;
|
||||
public readonly int InitialFacing = 128;
|
||||
public readonly int[] Offset = {0,0};
|
||||
public readonly bool AlignWhenIdle = false;
|
||||
|
||||
public object Create(ActorInitializer init) { return new Turreted(init, this); }
|
||||
public virtual object Create(ActorInitializer init) { return new Turreted(init, this); }
|
||||
}
|
||||
|
||||
public class Turreted : ITick, ISync
|
||||
public class Turreted : ITick, ISync, IResolveOrder
|
||||
{
|
||||
[Sync] public int turretFacing = 0;
|
||||
public int? desiredFacing;
|
||||
TurretedInfo info;
|
||||
public TurretedInfo info;
|
||||
protected Turret turret;
|
||||
IFacing facing;
|
||||
|
||||
public static int GetInitialTurretFacing(ActorInitializer init, int def)
|
||||
@@ -43,9 +49,10 @@ namespace OpenRA.Mods.RA
|
||||
this.info = info;
|
||||
turretFacing = GetInitialTurretFacing(init, info.InitialFacing);
|
||||
facing = init.self.TraitOrDefault<IFacing>();
|
||||
turret = new Turret(info.Offset);
|
||||
}
|
||||
|
||||
public void Tick(Actor self)
|
||||
public virtual void Tick(Actor self)
|
||||
{
|
||||
var df = desiredFacing ?? ( facing != null ? facing.Facing : turretFacing );
|
||||
turretFacing = Util.TickFacing(turretFacing, df, info.ROT);
|
||||
@@ -56,5 +63,42 @@ namespace OpenRA.Mods.RA
|
||||
desiredFacing = Util.GetFacing( target.CenterLocation - self.CenterLocation, turretFacing );
|
||||
return turretFacing == desiredFacing;
|
||||
}
|
||||
|
||||
public virtual void ResolveOrder(Actor self, Order order)
|
||||
{
|
||||
if (info.AlignWhenIdle && order.OrderString != "Attack" && order.OrderString != "AttackHold")
|
||||
desiredFacing = null;
|
||||
}
|
||||
|
||||
public PVecFloat PxPosition(Actor self, IFacing facing)
|
||||
{
|
||||
return turret.PxPosition(self, facing);
|
||||
}
|
||||
}
|
||||
|
||||
public class Turret
|
||||
{
|
||||
public PVecInt UnitSpacePosition; // where, in the unit's local space.
|
||||
public PVecInt ScreenSpacePosition; // screen-space hack to make things line up good.
|
||||
|
||||
public Turret(int[] offset)
|
||||
{
|
||||
ScreenSpacePosition = (PVecInt) offset.AbsOffset().ToInt2();
|
||||
UnitSpacePosition = (PVecInt) offset.RelOffset().ToInt2();
|
||||
}
|
||||
|
||||
public PVecFloat PxPosition(Actor self, IFacing facing)
|
||||
{
|
||||
// Things that don't have a rotating base don't need the turrets repositioned
|
||||
if (facing == null) return ScreenSpacePosition;
|
||||
|
||||
var ru = self.TraitOrDefault<RenderUnit>();
|
||||
var numDirs = (ru != null) ? ru.anim.CurrentSequence.Facings : 8;
|
||||
var bodyFacing = facing.Facing;
|
||||
var quantizedFacing = Util.QuantizeFacing(bodyFacing, numDirs) * (256 / numDirs);
|
||||
|
||||
return (PVecFloat)Util.RotateVectorByFacing(UnitSpacePosition.ToFloat2(), quantizedFacing, .7f)
|
||||
+ (PVecFloat)ScreenSpacePosition.ToFloat2();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user