Files
space-game/apps/backend/Universe/Scenario/WorldBuilder.cs

31 lines
1.5 KiB
C#

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);
}
}