feat(server): serve the chunked asterra world at startup (7a of #229) #235

Merged
panda merged 4 commits from feat/server-chunked-world into main 2026-08-01 11:22:48 +02:00
Collaborator

Summary

Fase 7a di #229: il game server ora carica il mondo chunked disegnato a mano (asterra) invece della vecchia mappa testuale piccola. Fin qui il formato chunked era additivo — nessuno lo leggeva a runtime; adesso è il server a servirlo.

Cosa cambia:

  • Nuova opzione tipizzata GameOptions.WorldPath (default worlds/asterra, relativa a content/). Program.cs sceglie la sorgente: se WorldPath è valorizzata apre lo store chunked e fa il warm-load in una CompactWorldMap (mappa in memoria compatta: griglia di byte per il terreno + Int16 opzionale per la Z + statics sparsi, catalogo già risolto). Vuota = vecchia mappa testuale (world.map + sidecar). Entrambe escono dietro l'interfaccia IReadOnlyTileMap, quindi nulla a valle (World, movimento, scripting) sa quale backing ha ricevuto.
  • Spawn piazzato su asterra a (5183,4378) con SpawnFinder (prima cella di terra calpestabile) — asterra era stata mergiata senza spawn, e CompactWorldMap.Load è fatale senza. Ora il manifest lo porta come metadato.
  • Il .csproj del server copia il mondo chunked (manifest.bin + 48 file regions/*.region) nell'output.
  • Warm-load una volta sola all'avvio, letture O(1), zero I/O nel tick loop.

Screenshots / recording

N/A — nessuna resa visibile in questa slice. Il server passa a una mappa diversa ma il client continua a disegnare la propria mappa finché non arriva 7b (client che rende il mondo chunked a finestra di viewport). Boot verificato via log: Now listening on: http://0.0.0.0:5100, /metrics → HTTP 200 dopo il warm-load dei 133M di celle.

How it was tested

  • Nuovo test di regressione AsterraWorldTests.Asterra_warm_loads_with_a_walkable_spawn: carica l'asterra committata attraverso lo stesso identico percorso del server (WorldMapStore.Open → CompactWorldMap.Load) e verifica che lo spawn sia in-bounds e calpestabile — se un'edit futura toglie lo spawn (il bug con cui asterra è nata) fallisce qui invece che al boot.
  • Boot smoke reale: avviato dotnet run --project src/IsoMmo.GameServer su asterra → in ascolto su :5100, /metrics 200 in ~0.34s, warm-load dei 133M senza eccezioni.
  • I 276 test d'integrazione GameServer restano sulla mappa testuale piccola: la factory forza Game:WorldPath="", così non fanno warm-load del pianeta intero (suite invariata, 17s).
  • Gate locali: CSharpier check pulito, build dell'intera soluzione 0 warning, 732 test verdi.

Checklist

  • just lint passes (CSharpier + analyzers, zero warnings)
  • just test is green
  • The whole solution builds (client and tools included)
  • Multi-platform preserved (server on Win/macOS/Linux, client on Win/macOS)
  • Tests added/updated for this change
  • Linked the related issue (if any) and its Definition of Done is met

Epic: #229

## Summary Fase 7a di #229: il game server ora carica il **mondo chunked disegnato a mano (`asterra`)** invece della vecchia mappa testuale piccola. Fin qui il formato chunked era additivo — nessuno lo leggeva a runtime; adesso è il server a servirlo. Cosa cambia: - Nuova opzione tipizzata `GameOptions.WorldPath` (default `worlds/asterra`, relativa a `content/`). `Program.cs` sceglie la sorgente: se `WorldPath` è valorizzata apre lo store chunked e fa il **warm-load** in una `CompactWorldMap` (mappa in memoria compatta: griglia di byte per il terreno + `Int16` opzionale per la Z + statics sparsi, catalogo già risolto). Vuota = vecchia mappa testuale (`world.map` + sidecar). Entrambe escono dietro l'interfaccia `IReadOnlyTileMap`, quindi nulla a valle (World, movimento, scripting) sa quale backing ha ricevuto. - **Spawn piazzato su asterra** a `(5183,4378)` con `SpawnFinder` (prima cella di terra calpestabile) — asterra era stata mergiata senza spawn, e `CompactWorldMap.Load` è fatale senza. Ora il manifest lo porta come metadato. - Il `.csproj` del server copia il mondo chunked (`manifest.bin` + 48 file `regions/*.region`) nell'output. - Warm-load una volta sola all'avvio, letture O(1), **zero I/O nel tick loop**. ## Screenshots / recording N/A — nessuna resa visibile in questa slice. Il server passa a una mappa diversa ma il client continua a disegnare la propria mappa finché non arriva 7b (client che rende il mondo chunked a finestra di viewport). Boot verificato via log: `Now listening on: http://0.0.0.0:5100`, `/metrics` → HTTP 200 dopo il warm-load dei 133M di celle. ## How it was tested - **Nuovo test di regressione** `AsterraWorldTests.Asterra_warm_loads_with_a_walkable_spawn`: carica l'asterra *committata* attraverso lo stesso identico percorso del server (`WorldMapStore.Open` → `CompactWorldMap.Load`) e verifica che lo spawn sia in-bounds e calpestabile — se un'edit futura toglie lo spawn (il bug con cui asterra è nata) fallisce qui invece che al boot. - **Boot smoke reale**: avviato `dotnet run --project src/IsoMmo.GameServer` su asterra → in ascolto su :5100, `/metrics` 200 in ~0.34s, warm-load dei 133M senza eccezioni. - **I 276 test d'integrazione GameServer** restano sulla mappa testuale piccola: la factory forza `Game:WorldPath=""`, così non fanno warm-load del pianeta intero (suite invariata, 17s). - Gate locali: CSharpier check pulito, build dell'intera soluzione **0 warning**, **732 test verdi**. ## Checklist - [x] `just lint` passes (CSharpier + analyzers, zero warnings) - [x] `just test` is green - [x] The whole solution builds (client and tools included) - [x] Multi-platform preserved (server on Win/macOS/Linux, client on Win/macOS) - [x] Tests added/updated for this change - [x] Linked the related issue (if any) and its Definition of Done is met Epic: #229
panda merged commit c0d9412e1d into main 2026-08-01 11:22:48 +02:00
panda deleted branch feat/server-chunked-world 2026-08-01 11:22:49 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
marco/IsoMmo!235
No description provided.