46 lines
1.5 KiB
C#
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);
|
|
}
|
|
}
|