refactor(backend): align station module production semantics
This commit is contained in:
@@ -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; }
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user