Refactor runtime bootstrap and ship control flows

This commit is contained in:
2026-04-03 01:12:26 -04:00
parent 0bb72bee35
commit 706e1cda8f
129 changed files with 9588 additions and 3548 deletions

View File

@@ -1,6 +1,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Text.Json.Serialization;
using SpaceGame.Api.Shared.Runtime;
using SpaceGame.Api.Shared.Runtime;
using SpaceGame.Api.Universe.Simulation;
namespace SpaceGame.Api.Definitions;
@@ -368,6 +369,72 @@ public sealed class PlanetDefinition
public bool HasRing { get; set; }
}
public enum ShipPurpose
{
[JsonStringEnumMemberName("auxiliary")]
Auxiliary,
[JsonStringEnumMemberName("mine")]
Mine,
[JsonStringEnumMemberName("build")]
Build,
[JsonStringEnumMemberName("fight")]
Fight,
[JsonStringEnumMemberName("trade")]
Trade,
[JsonStringEnumMemberName("salvage")]
Salvage,
[JsonStringEnumMemberName("dismantling")]
Dismantling,
}
public enum ShipType
{
[JsonStringEnumMemberName("resupplier")]
Resupplier,
[JsonStringEnumMemberName("miner")]
Miner,
[JsonStringEnumMemberName("carrier")]
Carrier,
[JsonStringEnumMemberName("fighter")]
Fighter,
[JsonStringEnumMemberName("heavyfighter")]
HeavyFighter,
[JsonStringEnumMemberName("destroyer")]
Destroyer,
[JsonStringEnumMemberName("largeminer")]
LargeMiner,
[JsonStringEnumMemberName("freighter")]
Freighter,
[JsonStringEnumMemberName("bomber")]
Bomber,
[JsonStringEnumMemberName("scavenger")]
Scavenger,
[JsonStringEnumMemberName("frigate")]
Frigate,
[JsonStringEnumMemberName("transporter")]
Transporter,
[JsonStringEnumMemberName("interceptor")]
Interceptor,
[JsonStringEnumMemberName("scout")]
Scout,
[JsonStringEnumMemberName("courier")]
Courier,
[JsonStringEnumMemberName("builder")]
Builder,
[JsonStringEnumMemberName("corvette")]
Corvette,
[JsonStringEnumMemberName("police")]
Police,
[JsonStringEnumMemberName("battleship")]
Battleship,
[JsonStringEnumMemberName("gunboat")]
Gunboat,
[JsonStringEnumMemberName("tug")]
Tug,
[JsonStringEnumMemberName("compactor")]
Compactor,
}
public sealed class ShipDefinition
{
public required string Id { get; set; }
@@ -379,9 +446,9 @@ public sealed class ShipDefinition
public float Hull { get; set; }
public Dictionary<string, float> Storage { get; set; } = new(StringComparer.Ordinal);
public int People { get; set; }
public string Purpose { get; set; } = string.Empty;
public ShipPurpose Purpose { get; set; }
public string Thruster { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
public ShipType Type { get; set; }
public float Mass { get; set; }
public ShipInertiaDefinition? Inertia { get; set; }
public ShipDragDefinition? Drag { get; set; }
@@ -395,12 +462,6 @@ public sealed class ShipDefinition
public ItemPriceDefinition? Price { get; set; }
public List<ItemProductionDefinition> Production { get; set; } = [];
[JsonIgnore]
public string Label => Name;
[JsonIgnore]
public string Kind => InferKind(Purpose);
[JsonIgnore]
public string Class => Type;
[JsonIgnore]
public float Speed => InferLocalSpeed(Size);
[JsonIgnore]
public float WarpSpeed => InferWarpSpeed(Size);
@@ -408,53 +469,15 @@ public sealed class ShipDefinition
public float FtlSpeed => InferFtlSpeed(Size);
[JsonIgnore]
public float SpoolTime => InferSpoolTime(Size);
[JsonIgnore]
public float CargoCapacity => Cargo.Sum(entry => entry.Max);
[JsonIgnore]
public StorageKind? CargoKind => Cargo
.SelectMany(entry => entry.Types)
.Select(type => type.ToNullableStorageKind())
.FirstOrDefault(kind => kind is not null);
[JsonIgnore]
public float MaxHealth => Hull;
[JsonIgnore]
public IReadOnlyList<string> Capabilities => InferCapabilities(Purpose, Type, Cargo, Turrets);
public float GetTotalCargoCapacity() => Cargo.Sum(entry => entry.Max);
private static string InferKind(string purpose) =>
purpose switch
{
"build" => "construction",
"trade" => "transport",
"mine" => "mining",
"fight" => "military",
"auxiliary" => "military",
_ => purpose,
};
public float GetCargoCapacity(StorageKind kind) =>
Cargo
.Where(entry => entry.Types.Any(type => type.ToNullableStorageKind() == kind))
.Sum(entry => entry.Max);
private static List<string> InferCapabilities(
string purpose,
string type,
IReadOnlyCollection<ShipCargoDefinition> cargo,
IReadOnlyCollection<ShipMountDefinition> turrets)
{
var capabilities = new List<string> { "warp", "ftl" };
if (string.Equals(purpose, "mine", StringComparison.Ordinal)
|| type.Contains("miner", StringComparison.Ordinal)
|| turrets.Any(turret => turret.Types.Contains("mining", StringComparer.Ordinal)))
{
capabilities.Add("mining");
}
if (cargo.Any(entry => entry.Types.Contains("container", StringComparer.Ordinal)
|| entry.Types.Contains("solid", StringComparer.Ordinal)
|| entry.Types.Contains("liquid", StringComparer.Ordinal)))
{
capabilities.Add("cargo");
}
return capabilities;
}
public bool SupportsCargoKind(StorageKind kind) =>
GetCargoCapacity(kind) > 0f;
private static float InferWarpSpeed(string size) =>
size switch