43 lines
1.3 KiB
C#
43 lines
1.3 KiB
C#
|
|
using System;
|
|
using static CultMath.math;
|
|
using cfloat2 = CultMath.float2;
|
|
|
|
public abstract class MoveToState : BaseState
|
|
{
|
|
private VelocityLimit _velocityLimit;
|
|
protected abstract cfloat2 TargetPosition { get; }
|
|
public float Distance { get; private set; }
|
|
|
|
protected MoveToState(Agent agent) : base(agent)
|
|
{
|
|
}
|
|
|
|
public override void Update(float delta)
|
|
{
|
|
var diff = TargetPosition - _agent.Ship.CultPositionXZ;
|
|
var dir = normalize(diff);
|
|
Distance = length(diff);
|
|
|
|
// We want to go top speed in the direction of our target
|
|
var desiredVelocity = dir * _agent.TopSpeed;
|
|
_agent.Ship.CultLookDirectionXZ = dir;
|
|
_agent.Accelerate(desiredVelocity);
|
|
}
|
|
}
|
|
|
|
public class MoveToEntityState : MoveToState
|
|
{
|
|
public Entity TargetEntity { get; set; }
|
|
protected override cfloat2 TargetPosition => TargetEntity != null ? TargetEntity.CultPositionXZ : cfloat2.zero;
|
|
|
|
public MoveToEntityState(Agent agent) : base(agent) { }
|
|
}
|
|
|
|
public class MoveToOrbitState : MoveToState
|
|
{
|
|
public string OrbitKey { get; set; } = "";
|
|
public MoveToOrbitState(Agent agent) : base(agent) { }
|
|
|
|
protected override cfloat2 TargetPosition => AetheriaMath.ToCult(_agent.Ship.Zone.GetOrbitPosition(OrbitKey));
|
|
}
|