Move the engine's own first-boot prompts (data directories, listeners, server
name, expansion + map selection) out of ServerConfiguration.Load and into
ServerConfiguration.ConfigurePrompts() [CallPriority(0)], so all first-boot
prompting -- engine and content -- runs through the single
AssemblyHandler.Invoke("ConfigurePrompts") phase. Load now only reads/creates
the config file.
- Feasible because assembly loading uses AssemblyDirectories (default
./Assemblies), not DataDirectories, so assemblies load before the now-later
data-dir prompt.
- UOClient.Load() (client-file discovery) moves with the data-dir prompt.
- Core.Expansion is now assigned in ConfigurePrompts (every non-mocked boot);
nothing between LoadAssemblies and that phase reads it (type initializers run
lazily, not at load).
- CallPriority(0) keeps engine prompts (incl. map selection) ahead of content
prompts like the pathfinding pre-bake (priority 50).
Main.cs already invokes the ConfigurePrompts phase, so no startup-ordering edit.
Tests are unaffected: fixtures call Load(true), which now just reads config, and
set expansion/data dirs directly; ConfigurePrompts is gated on m_Mocked.
Updates dev-docs/server-lifecycle.md to reflect the unified design.
NOTE: Main.cs startup ordering isn't covered by the fixture-based test suite, so
this needs a first-boot runtime check (fresh modernuo.json) before merge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>