namespace SpaceGame.Api.Universe.Scenario; public sealed class WorldBuilder( WorldTopologyBuilder topologyBuilder, ScenarioValidationService scenarioValidationService, ScenarioContentBuilder contentBuilder, WorldRuntimeAssembler runtimeAssembler) { public SimulationWorld BuildFromGeneration(WorldGenerationOptions worldGenerationOptions) => BuildWorld(worldGenerationOptions, null); public SimulationWorld BuildFromScenario(ScenarioDefinition scenarioDefinition) => BuildWorld(scenarioDefinition.WorldGeneration, scenarioDefinition); private SimulationWorld BuildWorld( WorldGenerationOptions worldGenerationOptions, ScenarioDefinition? scenarioDefinition) { // Temporary QA override: allow a scenario to provide an exact system list // instead of going through procedural topology generation. var topology = scenarioDefinition?.Systems is { Count: > 0 } scenarioSystems ? topologyBuilder.Build(scenarioSystems) : topologyBuilder.Build(worldGenerationOptions); var scenario = scenarioDefinition ?? scenarioValidationService.CreateEmptyScenario(worldGenerationOptions, topology.Systems); scenarioValidationService.Validate(scenario, topology.Systems.Select(system => system.Id).ToHashSet(StringComparer.Ordinal)); var content = contentBuilder.Build(scenario, topology); return runtimeAssembler.Assemble(worldGenerationOptions, topology, content); } }