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

46 lines
1.5 KiB
C#

using SpaceGame.Api.Universe.Bootstrap;
namespace SpaceGame.Api.Universe.Scenario;
public sealed class WorldTopologyBuilder(
IStaticDataProvider staticData,
SystemGenerationService generationService,
SpatialBuilder spatialBuilder)
{
public WorldBuildTopology Build(WorldGenerationOptions worldGenerationOptions)
{
var systems = generationService.GenerateSystems(
generationService.PrepareKnownSystems(staticData.KnownSystems),
worldGenerationOptions);
return BuildFromDefinitions(systems);
}
public WorldBuildTopology Build(IReadOnlyList<SolarSystemDefinition> systems)
{
if (systems.Count == 0)
{
throw new InvalidOperationException("Scenario-defined systems cannot be empty.");
}
// Temporary QA-only path for fixed-topology scenarios such as "minimal".
return BuildFromDefinitions(systems);
}
private WorldBuildTopology BuildFromDefinitions(IReadOnlyList<SolarSystemDefinition> systems)
{
var systemRuntimes = systems
.Select(definition => new SystemRuntime
{
Definition = definition,
Position = LoaderSupport.ToVector(definition.Position),
})
.ToList();
var systemsById = systemRuntimes.ToDictionary(system => system.Definition.Id, StringComparer.Ordinal);
var spatialLayout = spatialBuilder.BuildLayout(systemRuntimes);
return new WorldBuildTopology(systems, systemRuntimes, systemsById, spatialLayout);
}
}