using GameCult.Caching; using System; using CultMath; using static CultMath.math; using float2 = CultMath.float2; public abstract class MoveToState : BaseState { private VelocityLimit _velocityLimit; protected abstract float2 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.Position.xz; 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.Aim = float3(dir.x, 0, dir.y); _agent.Ship.Turn = Steering.Toward(_agent.Ship, dir); _agent.Accelerate(desiredVelocity); } } public class MoveToOrbitState : MoveToState { public CultRecordKey Orbit { get; set; } public MoveToOrbitState(Agent agent) : base(agent) { } protected override float2 TargetPosition => _agent.Ship.Zone.GetOrbitPosition(Orbit); }