chore: convert movement regime kinds to enum

This commit is contained in:
2026-03-27 13:30:10 -04:00
parent 00a1e58184
commit f961ac62b6
13 changed files with 128 additions and 34 deletions

View File

@@ -55,14 +55,14 @@ public sealed class ShipSpatialStateRuntime
public string? CurrentCelestialId { get; set; }
public Vector3? LocalPosition { get; set; }
public Vector3? SystemPosition { get; set; }
public string MovementRegime { get; set; } = MovementRegimeKinds.LocalFlight;
public MovementRegimeKind MovementRegime { get; set; } = MovementRegimeKind.LocalFlight;
public string? DestinationNodeId { get; set; }
public ShipTransitRuntime? Transit { get; set; }
}
public sealed class ShipTransitRuntime
{
public required string Regime { get; init; }
public required MovementRegimeKind Regime { get; init; }
public string? OriginNodeId { get; init; }
public string? DestinationNodeId { get; init; }
public DateTimeOffset? StartedAtUtc { get; set; }

View File

@@ -1,4 +1,5 @@
using System.Text.Json;
using SpaceGame.Api.Shared.Runtime;
using static SpaceGame.Api.Universe.Scenario.LoaderSupport;
namespace SpaceGame.Api.Universe.Scenario;
@@ -271,6 +272,17 @@ internal sealed class DataCatalogLoader(string dataRoot)
{
foreach (var module in modules)
{
try
{
module.ModuleType = module.Type.ToModuleType();
}
catch (ArgumentOutOfRangeException exception)
{
throw new InvalidOperationException($"Module '{module.Id}' has unsupported type '{module.Type}'.", exception);
}
module.Type = module.ModuleType.ToDataValue();
if (module.Products.Count == 0 && !string.IsNullOrWhiteSpace(module.Product))
{
module.Products = [module.Product];
@@ -278,7 +290,7 @@ internal sealed class DataCatalogLoader(string dataRoot)
if (string.IsNullOrWhiteSpace(module.ProductionMode))
{
module.ProductionMode = string.Equals(module.Type, "buildmodule", StringComparison.Ordinal)
module.ProductionMode = module.ModuleType == ModuleType.BuildModule
? "commanded"
: "passive";
}

View File

@@ -1,4 +1,6 @@
using SpaceGame.Api.Shared.Runtime;
namespace SpaceGame.Api.Universe.Scenario;
internal static class LoaderSupport
@@ -124,6 +126,14 @@ internal static class LoaderSupport
internal static int CountModules(IEnumerable<string> modules, string moduleId) =>
modules.Count(candidate => string.Equals(candidate, moduleId, StringComparison.Ordinal));
internal static int CountModules(
IEnumerable<string> modules,
IReadOnlyDictionary<string, ModuleDefinition> moduleDefinitions,
ModuleType moduleType) =>
modules.Count(moduleId =>
moduleDefinitions.TryGetValue(moduleId, out var definition)
&& definition.ModuleType == moduleType);
internal static float ComputeWorkforceRatio(float population, float workforceRequired)
{
if (workforceRequired <= 0.01f)

View File

@@ -300,7 +300,7 @@ internal sealed class SpatialBuilder
CurrentCelestialId = nearestCelestial?.Id,
LocalPosition = position,
SystemPosition = position,
MovementRegime = MovementRegimeKinds.LocalFlight,
MovementRegime = MovementRegimeKind.LocalFlight,
};
}
}

View File

@@ -38,7 +38,7 @@ internal sealed class WorldBuilder(
catalog.ModuleDefinitions,
catalog.ItemDefinitions);
seedingService.InitializeStationStockpiles(stations);
seedingService.InitializeStationStockpiles(stations, catalog.ModuleDefinitions);
var refinery = seedingService.SelectRefineryStation(stations, scenario);
var patrolRoutes = BuildPatrolRoutes(scenario, systemsById);
var ships = CreateShips(scenario, systemsById, spatialLayout.Celestials, catalog.Balance, catalog.ShipDefinitions, patrolRoutes, stations, refinery);

View File

@@ -1,3 +1,4 @@
using SpaceGame.Api.Shared.Runtime;
using static SpaceGame.Api.Universe.Scenario.LoaderSupport;
namespace SpaceGame.Api.Universe.Scenario;
@@ -60,11 +61,13 @@ internal sealed class WorldSeedingService
}
}
internal void InitializeStationStockpiles(IReadOnlyCollection<StationRuntime> stations)
internal void InitializeStationStockpiles(
IReadOnlyCollection<StationRuntime> stations,
IReadOnlyDictionary<string, ModuleDefinition> moduleDefinitions)
{
foreach (var station in stations)
{
InitializeStationPopulation(station);
InitializeStationPopulation(station, moduleDefinitions);
}
}
@@ -551,9 +554,11 @@ internal sealed class WorldSeedingService
};
}
private static void InitializeStationPopulation(StationRuntime station)
private static void InitializeStationPopulation(
StationRuntime station,
IReadOnlyDictionary<string, ModuleDefinition> moduleDefinitions)
{
var habitatModules = CountModules(station.InstalledModules, "module_arg_hab_m_01");
var habitatModules = CountModules(station.InstalledModules, moduleDefinitions, ModuleType.Habitation);
station.PopulationCapacity = 40f + (habitatModules * 220f);
station.WorkforceRequired = MathF.Max(12f, station.Modules.Count * 14f);
station.Population = habitatModules > 0

View File

@@ -269,7 +269,7 @@ internal sealed class OrbitalStateUpdater
}
ship.SpatialState.SpaceLayer = SpaceLayerKind.LocalSpace;
ship.SpatialState.MovementRegime = MovementRegimeKinds.LocalFlight;
ship.SpatialState.MovementRegime = MovementRegimeKind.LocalFlight;
var nearestCelestial = world.Celestials
.Where(candidate => candidate.SystemId == ship.SystemId)
.OrderBy(candidate => candidate.Position.DistanceTo(ship.Position))