Keep orbit task targets on typed keys
This commit is contained in:
parent
65456f09cd
commit
cfc1ddac6d
8 changed files with 137 additions and 10 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ public class StationTowing : AgentTask
|
|||
|
||||
public OrbitalEntity Station;
|
||||
|
||||
public Guid OrbitParent;
|
||||
public string OrbitParentKey = "";
|
||||
|
||||
public float OrbitDistance;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Reference in a new issue