Refactor runtime bootstrap and ship control flows
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user