Keep orbit task targets on typed keys

This commit is contained in:
Meta Vens 2026-06-16 15:54:18 +01:00
commit cfc1ddac6d
8 changed files with 137 additions and 10 deletions

View file

@ -37,8 +37,8 @@ public class MoveToEntityState : MoveToState
public class MoveToOrbitState : MoveToState
{
public Guid Orbit { get; set; }
public string OrbitKey { get; set; } = "";
public MoveToOrbitState(Agent agent) : base(agent) { }
protected override float2 TargetPosition => _agent.Ship.Zone.GetOrbitPosition(Orbit);
protected override float2 TargetPosition => _agent.Ship.Zone.GetOrbitPosition(OrbitKey);
}

View file

@ -3,13 +3,13 @@ using System;
public class PatrolOrbitsTask : AgentTask
{
public override TaskType Type => TaskType.Defend;
public Guid[] Circuit;
public string[] Circuit = Array.Empty<string>();
}
public class PatrolOrbitsState : BaseState
{
public PatrolOrbitsTask Task;
public Guid CurrentTarget
public string CurrentTarget
{
get => Task.Circuit[_currentTargetIndex];
}
@ -25,7 +25,7 @@ public class PatrolOrbitsState : BaseState
var patrolMoveState = new MoveToOrbitState(agent);
Transitions.Add(new StateTransition(patrolMoveState,
() => true,
() => patrolMoveState.Orbit = CurrentTarget));
() => patrolMoveState.OrbitKey = CurrentTarget));
patrolMoveState.Transitions.Add(new StateTransition(this, () => patrolMoveState.Distance < 10, NextTarget));
}
}
}

View file

@ -10,7 +10,7 @@ public class StationTowing : AgentTask
public OrbitalEntity Station;
public Guid OrbitParent;
public string OrbitParentKey = "";
public float OrbitDistance;
}

View file

@ -100,7 +100,11 @@ public class Zone
{
var agent = new Minion(ship);
var task = new PatrolOrbitsTask();
task.Circuit = Orbits.OrderBy(_ => _itemManager.Random.NextFloat()).Take(4).Select(x => x.Key).ToArray();
task.Circuit = Orbits.Values
.OrderBy(_ => _itemManager.Random.NextFloat())
.Take(4)
.Select(orbit => orbit.OrbitKey)
.ToArray();
agent.Task = task;
return agent;
}
@ -115,6 +119,17 @@ public class Zone
return id == Guid.Empty ? "" : $"{BodyKeyPrefix}{id:D}";
}
public static Guid ParseOrbitGuid(string orbitKey)
{
if (string.IsNullOrWhiteSpace(orbitKey))
return Guid.Empty;
var runtimeOrbitId = orbitKey.StartsWith(OrbitKeyPrefix, StringComparison.OrdinalIgnoreCase)
? orbitKey.Substring(OrbitKeyPrefix.Length)
: orbitKey;
return Guid.TryParse(runtimeOrbitId, out var id) ? id : Guid.Empty;
}
public string GetBodyKey(Guid bodyId)
{
if (bodyId == Guid.Empty)
@ -147,6 +162,11 @@ public class Zone
return AsteroidBelts.TryGetValue(ParseBodyGuid(bodyKey), out belt);
}
public bool TryGetOrbit(string orbitKey, out Orbit orbit)
{
return Orbits.TryGetValue(ParseOrbitGuid(orbitKey), out orbit);
}
public void Update(float deltaTime)
{
_time += deltaTime;
@ -212,6 +232,11 @@ public class Zone
return Orbits[orbitID].Position;
}
public float2 GetOrbitPosition(string orbitKey)
{
return GetOrbitPosition(ParseOrbitGuid(orbitKey));
}
public float2 GetOrbitVelocity(Guid orbit)
{
if (Orbits.ContainsKey(orbit))