feat: base-Z per terreno (terra Z1, spiagge/oceano Z0) — modello additivo #238

Closed
opened 2026-08-01 12:47:19 +02:00 by panda · 1 comment
Collaborator

Base-Z per tipo di terreno, così la terra sta sopra il livello del mare e le coste prendono un gradino. Segue terreno-Z (#224); il mondo è asterra (#229).

Modello (concordato: additivo)

GroundZAt(cella) = terreno(cella).BaseZ + relief(cella) — il Z per-cella esistente diventa relief (altezza sopra la base del terreno), non più assoluto.

  • Terra BaseZ 1 · spiagge (beach_*) e oceano/liquidi BaseZ 0.
  • BaseZ è un campo di TerrainDef da tiledata.txt (colonna opzionale in coda, default 0), come MoveCost.

Effetto su asterra (misurato)

asterra ha relief reale in 64 chunk (fino a Z48). Con l'additivo, senza re-bake:

  • terra piatta → Z1, oceano → 0 → gradino di costa;
  • le 64 zone di montagna preservate (relief invariato; assoluto +1 uniforme sulla terra — le forme non cambiano);
  • spiagge = terra a relief −1 (Z0) o terreno beach_* (base 0).
  • Backward-compatible: i tile di test hanno base 0 → GroundZAt invariato → test Z verdi. Nessun cambio storage/formato, nessun bump ProtocolVersion.

Invariants Check

Scope ✓ (lavoro mappa/terreno, #224/#229) · Server-authoritative ✓ (Z autorevole via CanStep/GroundZAt; il client lo deriva dalla stessa mappa+tiledata, non dal wire) · GM/Identity N/A · Protocol versioned ✓ nessun cambio wire → nessun bump · String catalog N/A · Single-thread/World.cs gate N/A · Screen gate ✓ (rendering Z già nei renderer) · Client engine-independence ✓ (BaseZ/GroundZAt in Shared) · Gameplay/Networking sep ✓ · Act-on-instance N/A · Extend-by-type ✓ (BaseZ campo dato su TerrainDef, non switch) · Typed content-def ✓ (intero, come MoveCost) · Server-paced N/A · Persistence ✓ (contenuto autorato, non world.sav; no I/O nel tick) · Process sep ✓ · Typed options N/A · Broadcasts/AoI N/A · Multi-platform ✓ (.NET puro) · Assets ✓ (spiagge già esistono) · Asset naming N/A · ModernUO: UO salva Z assoluto per-cella; noi divergiamo (base per-terreno + relief) perché a 133M una griglia Z densa è la bloat che #229 evita — l'additivo riusa il relief esistente senza densificare · Docs & DoD ✓.

Validazione server-side

Il passo resta gattato da CanStep(from,into,MaxStepZ) sul GroundZAt autorevole; il client deriva lo stesso Z, non lo impone. Confine invariato da 7a. Terra uniforme Z1 → passi intra-terra ΔZ0; costa terra↔spiaggia ΔZ1 ≤ MaxStepZ2 → nessuno bloccato.

Verification plan

  • Unit: GroundZAt = BaseZ + relief (terra base 1, oceano 0; montagna relief preservata) in TileMap + parità CompactWorldMap; CanStep costa ΔZ1 ok; test Z esistenti restano verdi.
  • Screenshot in-game (DB fresco, harness): la costa di asterra fa il gradino; una delle 64 zone mostra le colline preservate.
  • Build intera 0 warning + dotnet test verde.

Piano (2 fette, riviste separatamente)

  • Fetta 1 (questa): TerrainDef.BaseZ + tiledata + GroundZAt = BaseZ + relief (TileMap/CompactWorldMap). asterra si aggiorna da sola in-game. Nessun cambio storage.
  • Fetta 2: editor — strumenti Z relief-aware + overlay altezza (vedere cosa si abbassa).

Definition of Done (fetta 1, delta)

  • TerrainDef.BaseZ letto da tiledata (colonna opzionale, default 0); terra=1, spiagge/oceano=0.
  • GroundZAt = BaseZ + relief in TileMap e CompactWorldMap, con test di parità.
  • In-game su asterra (DB fresco): terra a Z1, oceano a 0 (gradino di costa), una zona di relief preservata — provato con screenshot piloti.
  • Nessun bump ProtocolVersion; i test Z esistenti restano verdi.
  • Build intera 0 warning; dotnet test verde.
  • docs/world-map-format.md + doc tiledata + sezione Z di architecture.md aggiornati.

Decisioni prese: grammatica tiledata = colonna posizionale [moveCost] [baseZ]; overlay Z editor (fetta 2) = ombreggiatura altezza + numero sotto il cursore.

Base-Z per tipo di terreno, così la terra sta sopra il livello del mare e le coste prendono un gradino. Segue terreno-Z (#224); il mondo è asterra (#229). ## Modello (concordato: additivo) `GroundZAt(cella) = terreno(cella).BaseZ + relief(cella)` — il Z per-cella esistente diventa **relief** (altezza sopra la base del terreno), non più assoluto. - **Terra** BaseZ **1** · **spiagge** (`beach_*`) e **oceano/liquidi** BaseZ **0**. - `BaseZ` è un campo di `TerrainDef` da `tiledata.txt` (colonna opzionale in coda, **default 0**), come `MoveCost`. ## Effetto su asterra (misurato) asterra ha relief reale in **64 chunk** (fino a Z48). Con l'additivo, **senza re-bake**: - terra piatta → Z1, oceano → 0 → **gradino di costa**; - le 64 zone di montagna **preservate** (relief invariato; assoluto +1 uniforme sulla terra — le forme non cambiano); - spiagge = terra a relief −1 (Z0) o terreno `beach_*` (base 0). - **Backward-compatible**: i tile di test hanno base 0 → `GroundZAt` invariato → test Z verdi. Nessun cambio storage/formato, nessun bump `ProtocolVersion`. ## Invariants Check Scope ✓ (lavoro mappa/terreno, #224/#229) · Server-authoritative ✓ (Z autorevole via `CanStep`/`GroundZAt`; il client lo deriva dalla stessa mappa+tiledata, non dal wire) · GM/Identity N/A · **Protocol versioned ✓ nessun cambio wire → nessun bump** · String catalog N/A · Single-thread/World.cs gate N/A · Screen gate ✓ (rendering Z già nei renderer) · Client engine-independence ✓ (`BaseZ`/`GroundZAt` in Shared) · Gameplay/Networking sep ✓ · Act-on-instance N/A · **Extend-by-type ✓** (`BaseZ` campo dato su `TerrainDef`, non switch) · Typed content-def ✓ (intero, come `MoveCost`) · Server-paced N/A · Persistence ✓ (contenuto autorato, non `world.sav`; no I/O nel tick) · Process sep ✓ · Typed options N/A · Broadcasts/AoI N/A · Multi-platform ✓ (.NET puro) · Assets ✓ (spiagge già esistono) · Asset naming N/A · **ModernUO**: UO salva Z assoluto per-cella; noi divergiamo (base per-terreno + relief) perché a 133M una griglia Z densa è la bloat che #229 evita — l'additivo riusa il relief esistente senza densificare · Docs & DoD ✓. ## Validazione server-side Il passo resta gattato da `CanStep(from,into,MaxStepZ)` sul `GroundZAt` autorevole; il client deriva lo stesso Z, non lo impone. Confine invariato da 7a. Terra uniforme Z1 → passi intra-terra ΔZ0; costa terra↔spiaggia ΔZ1 ≤ MaxStepZ2 → nessuno bloccato. ## Verification plan - Unit: `GroundZAt = BaseZ + relief` (terra base 1, oceano 0; montagna relief preservata) in TileMap + parità CompactWorldMap; `CanStep` costa ΔZ1 ok; test Z esistenti restano verdi. - Screenshot in-game (DB fresco, harness): la costa di asterra fa il **gradino**; una delle 64 zone mostra le colline preservate. - Build intera 0 warning + `dotnet test` verde. ## Piano (2 fette, riviste separatamente) - **Fetta 1 (questa)**: `TerrainDef.BaseZ` + `tiledata` + `GroundZAt = BaseZ + relief` (TileMap/CompactWorldMap). asterra si aggiorna da sola in-game. Nessun cambio storage. - **Fetta 2**: editor — strumenti Z relief-aware + overlay altezza (vedere cosa si abbassa). ## Definition of Done (fetta 1, delta) - [ ] `TerrainDef.BaseZ` letto da `tiledata` (colonna opzionale, default 0); terra=1, spiagge/oceano=0. - [ ] `GroundZAt = BaseZ + relief` in `TileMap` e `CompactWorldMap`, con test di parità. - [ ] In-game su asterra (DB fresco): terra a Z1, oceano a 0 (gradino di costa), una zona di relief preservata — provato con screenshot piloti. - [ ] Nessun bump `ProtocolVersion`; i test Z esistenti restano verdi. - [ ] Build intera 0 warning; `dotnet test` verde. - [ ] `docs/world-map-format.md` + doc tiledata + sezione Z di `architecture.md` aggiornati. Decisioni prese: grammatica tiledata = colonna posizionale `[moveCost] [baseZ]`; overlay Z editor (fetta 2) = ombreggiatura altezza + numero sotto il cursore.
Author
Collaborator

Marco aiutami invece di farti le unghie a tema pokemon 💅

Risolta: base-Z del terreno (modello additivo) su main (#241).

Marco aiutami invece di farti le unghie a tema pokemon 💅 Risolta: base-Z del terreno (modello additivo) su main (#241).
panda closed this issue 2026-08-02 00:47:16 +02:00
Sign in to join this conversation.
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#238
No description provided.