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:
Paul Chote
2013-03-14 03:55:34 +13:00
parent aa6f12f0a1
commit 0167bbfbaa
81 changed files with 4023 additions and 820 deletions

View File

@@ -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();
}
}
}