refactor(backend): align station module production semantics

This commit is contained in:
2026-03-27 16:44:50 -04:00
parent 3237735b08
commit 04d182e93f
10 changed files with 125 additions and 82 deletions

View File

@@ -65,6 +65,14 @@ public class StationModuleRuntime
Health = production.Hull,
MaxHealth = production.Hull,
},
BuildModuleDefinition build => new BuildStationModuleRuntime
{
Id = id,
ModuleId = build.Id,
ModuleType = build.ModuleType,
Health = build.Hull,
MaxHealth = build.Hull,
},
_ => new StationModuleRuntime
{
Id = id,
@@ -81,6 +89,10 @@ public sealed class ProductionStationModuleRuntime : StationModuleRuntime
public IReadOnlyList<string> ProductItemIds { get; init; } = [];
}
public sealed class BuildStationModuleRuntime : StationModuleRuntime
{
}
public sealed class StorageStationModuleRuntime : StationModuleRuntime
{
public StorageKind StorageKind { get; init; }

View File

@@ -203,7 +203,7 @@ internal sealed class InfrastructureSimulationService
if (world.ModuleDefinitions.TryGetValue(recipe.ModuleId, out var moduleDefinition))
{
foreach (var productItemId in moduleDefinition.Products)
foreach (var productItemId in moduleDefinition.ProductItemIds)
{
if (!world.ItemDefinitions.TryGetValue(productItemId, out var itemDefinition))
{
@@ -621,7 +621,7 @@ internal sealed class InfrastructureSimulationService
}
var score = 0f;
foreach (var productItemId in moduleDefinition.Products)
foreach (var productItemId in moduleDefinition.ProductItemIds)
{
if (!constructionDemandByItem.TryGetValue(productItemId, out var outstandingDemand) || outstandingDemand <= 0.01f)
{

View File

@@ -34,17 +34,16 @@ internal sealed class StationLifecycleService
private void UpdateStationPopulation(SimulationWorld world, StationRuntime station, float deltaSeconds, ICollection<SimulationEventRecord> events)
{
station.WorkforceRequired = MathF.Max(12f, station.Modules.Count * 14f);
station.WorkforceRequired = GetStationRequiredWorkforce(world.ModuleDefinitions, station);
var requiredWater = station.Population * WaterConsumptionPerWorkerPerSecond * deltaSeconds;
var consumedWater = RemoveInventory(station.Inventory, "water", requiredWater);
var waterSatisfied = requiredWater <= 0.01f || consumedWater + 0.001f >= requiredWater;
var habitatModules = CountStationModules(station, ModuleType.Habitation);
station.PopulationCapacity = 40f + (habitatModules * 220f);
station.PopulationCapacity = GetStationSupportedPopulation(world.ModuleDefinitions, station);
if (waterSatisfied)
{
if (habitatModules > 0 && station.Population < station.PopulationCapacity)
if (station.PopulationCapacity > 40f && station.Population < station.PopulationCapacity)
{
station.Population = MathF.Min(station.PopulationCapacity, station.Population + (PopulationGrowthPerSecond * deltaSeconds));
}

View File

@@ -216,12 +216,8 @@ internal sealed class StationSimulationService
{
foreach (var moduleId in station.InstalledModules.Distinct(StringComparer.Ordinal))
{
if (!world.ModuleDefinitions.TryGetValue(moduleId, out var def) || string.IsNullOrEmpty(def.ProductionMode))
{
continue;
}
if (string.Equals(def.ProductionMode, "commanded", StringComparison.Ordinal) && station.CommanderId is null)
if (!world.ModuleDefinitions.TryGetValue(moduleId, out var definition)
|| definition is not ProductionLaneModuleDefinition)
{
continue;
}
@@ -241,7 +237,7 @@ internal sealed class StationSimulationService
internal static string? GetStationProductionLaneKey(SimulationWorld world, RecipeDefinition recipe) =>
recipe.RequiredModules.FirstOrDefault(moduleId =>
world.ModuleDefinitions.TryGetValue(moduleId, out var def) && !string.IsNullOrEmpty(def.ProductionMode));
world.ModuleDefinitions.TryGetValue(moduleId, out var definition) && definition is ProductionLaneModuleDefinition);
internal static float GetStationProductionThroughput(SimulationWorld world, StationRuntime station, RecipeDefinition recipe)
{