Refactor world bootstrap and allow empty startup worlds
This commit is contained in:
62
apps/backend/Universe/Scenario/WorldRuntimeAssembler.cs
Normal file
62
apps/backend/Universe/Scenario/WorldRuntimeAssembler.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
using SpaceGame.Api.Universe.Bootstrap;
|
||||
|
||||
namespace SpaceGame.Api.Universe.Scenario;
|
||||
|
||||
public sealed class WorldRuntimeAssembler(
|
||||
IStaticDataProvider staticData,
|
||||
WorldSeedingService seedingService)
|
||||
{
|
||||
public SimulationWorld Assemble(
|
||||
WorldGenerationOptions worldGenerationOptions,
|
||||
WorldBuildTopology topology,
|
||||
ScenarioWorldContent content)
|
||||
{
|
||||
seedingService.InitializeStationStockpiles(content.Stations, staticData.ModuleDefinitions);
|
||||
|
||||
var factions = seedingService.CreateFactions(content.Stations, content.Ships);
|
||||
seedingService.BootstrapFactionEconomy(factions, content.Stations);
|
||||
var policies = seedingService.CreatePolicies(factions);
|
||||
var commanders = seedingService.CreateCommanders(factions, content.Stations, content.Ships);
|
||||
var nowUtc = DateTimeOffset.UtcNow;
|
||||
var playerFaction = worldGenerationOptions.GeneratePlayerFaction
|
||||
? seedingService.CreatePlayerFaction(factions, content.Stations, content.Ships, commanders, policies, nowUtc)
|
||||
: null;
|
||||
var claims = seedingService.CreateClaims(content.Stations, topology.SpatialLayout.Celestials, nowUtc);
|
||||
|
||||
var world = new SimulationWorld
|
||||
{
|
||||
Label = "Split Viewer / Simulation World",
|
||||
Seed = worldGenerationOptions.Seed,
|
||||
Systems = topology.SystemRuntimes.ToList(),
|
||||
Celestials = topology.SpatialLayout.Celestials,
|
||||
Nodes = topology.SpatialLayout.Nodes,
|
||||
Wrecks = [],
|
||||
Stations = content.Stations.ToList(),
|
||||
Ships = content.Ships.ToList(),
|
||||
Factions = factions,
|
||||
PlayerFaction = playerFaction,
|
||||
Geopolitics = null,
|
||||
Commanders = commanders,
|
||||
Claims = claims,
|
||||
ConstructionSites = [],
|
||||
MarketOrders = [],
|
||||
Policies = policies,
|
||||
ShipDefinitions = new Dictionary<string, ShipDefinition>(staticData.ShipDefinitions, StringComparer.Ordinal),
|
||||
ItemDefinitions = new Dictionary<string, ItemDefinition>(staticData.ItemDefinitions, StringComparer.Ordinal),
|
||||
ModuleDefinitions = new Dictionary<string, ModuleDefinition>(staticData.ModuleDefinitions, StringComparer.Ordinal),
|
||||
ModuleRecipes = new Dictionary<string, ModuleRecipeDefinition>(staticData.ModuleRecipes, StringComparer.Ordinal),
|
||||
Recipes = new Dictionary<string, RecipeDefinition>(staticData.Recipes, StringComparer.Ordinal),
|
||||
ProductionGraph = staticData.ProductionGraph,
|
||||
OrbitalTimeSeconds = worldGenerationOptions.Seed * 97d,
|
||||
GeneratedAtUtc = nowUtc,
|
||||
};
|
||||
|
||||
var (constructionSites, marketOrders) = seedingService.CreateConstructionSites(world);
|
||||
world.ConstructionSites.AddRange(constructionSites);
|
||||
world.MarketOrders.AddRange(marketOrders);
|
||||
|
||||
var geopolitics = new GeopoliticalSimulationService();
|
||||
geopolitics.Update(world, 0f, []);
|
||||
return world;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user