namespace SpaceGame.Simulation.Api.Simulation; public sealed class FactionRuntime { public required string Id { get; init; } public required string Label { get; init; } public required string Color { get; init; } public float Credits { get; set; } public float PopulationTotal { get; set; } public float OreMined { get; set; } public float GoodsProduced { get; set; } public int ShipsBuilt { get; set; } public int ShipsLost { get; set; } public HashSet CommanderIds { get; } = new(StringComparer.Ordinal); public string? DefaultPolicySetId { get; set; } public string LastDeltaSignature { get; set; } = string.Empty; } public sealed class CommanderRuntime { public required string Id { get; init; } public required string Kind { get; set; } public required string FactionId { get; init; } public string? ParentCommanderId { get; set; } public string? ControlledEntityId { get; set; } public string? PolicySetId { get; set; } public string? Doctrine { get; set; } public List Goals { get; } = []; public CommanderBehaviorRuntime? ActiveBehavior { get; set; } public CommanderOrderRuntime? ActiveOrder { get; set; } public CommanderTaskRuntime? ActiveTask { get; set; } public HashSet SubordinateCommanderIds { get; } = new(StringComparer.Ordinal); public bool IsAlive { get; set; } = true; } public sealed class CommanderBehaviorRuntime { public required string Kind { get; set; } public string? Phase { get; set; } public string? NodeId { get; set; } public string? StationId { get; set; } public string? ModuleId { get; set; } public string? AreaSystemId { get; set; } public int PatrolIndex { get; set; } } public sealed class CommanderOrderRuntime { public required string Kind { get; init; } public OrderStatus Status { get; set; } = OrderStatus.Accepted; public string? TargetEntityId { get; set; } public string? DestinationNodeId { get; set; } public required string DestinationSystemId { get; init; } public required Vector3 DestinationPosition { get; init; } } public sealed class CommanderTaskRuntime { public required string Kind { get; set; } public WorkStatus Status { get; set; } = WorkStatus.Pending; public string? TargetEntityId { get; set; } public string? TargetSystemId { get; set; } public string? TargetNodeId { get; set; } public Vector3? TargetPosition { get; set; } public float Threshold { get; set; } }