Biomes E: per-biome scatter + biome-border feathering #140

Open
opened 2026-07-22 13:29:07 +02:00 by panda · 3 comments
Collaborator

Status update 2026-07-25 — Lo scatter per-bioma è fatto (props scatterati per bioma, PR #184 cdc1254; Volcanic incluso). Resta il border feathering, che NON è stato implementato come edge-scatter: i seam di bordo sono invece stati risolti con le mask binarie dual-grid in PR #202 (#200/#201). Decidere se: (a) il feathering è di fatto coperto dalle mask → chiudere; oppure (b) serve ancora edge-scatter cosmetico ai bordi → restringere questa issue a quello. Scope originale sotto per riferimento.


Depends on #136. Per-biome decorative scatter + biome-border feathering. Scatter is client-only render -- hard invariant: it must never be an input to a server rule. Design: docs/game-design/systems/biomes.md (parent #135).

Scope

  • Per-biome scatter set + density + prop-choice as data (not renderer constants); follow the DrawMarshScatter hash-picks-among-props pattern; give Volcanic a nonzero scatter.
  • Border edge-scatter feathering: detect a cell whose neighbourhood contains a different biome family and scatter the neighbour's edge props there at elevated density (cosmetic, deterministic, no new art). Bare stair-step seams are not acceptable.
  • Document/guard the render-only invariant; when gathering lands later, harvestables become server truth or hash-derived -- the client's claim is never trusted.

Definition of Done (delta)

  • Each biome shows its own distinct scatter of plants/rocks; Volcanic is not bare.
  • Biome borders are feathered (no bare stair-step seam).
  • Two players on the same tile see the same scatter objects (deterministic).
> **Status update 2026-07-25** — Lo **scatter per-bioma è fatto** (props scatterati per bioma, **PR #184** `cdc1254`; Volcanic incluso). **Resta il border feathering**, che NON è stato implementato come edge-scatter: i seam di bordo sono invece stati risolti con le **mask binarie dual-grid** in **PR #202** (#200/#201). Decidere se: (a) il feathering è di fatto coperto dalle mask → chiudere; oppure (b) serve ancora edge-scatter cosmetico ai bordi → restringere questa issue a quello. Scope originale sotto per riferimento. --- Depends on #136. Per-biome decorative scatter + biome-border feathering. Scatter is **client-only render** -- hard invariant: it must never be an input to a server rule. Design: `docs/game-design/systems/biomes.md` (parent #135). ## Scope - Per-biome scatter set + density + prop-choice as **data** (not renderer constants); follow the `DrawMarshScatter` hash-picks-among-props pattern; give Volcanic a nonzero scatter. - Border **edge-scatter feathering**: detect a cell whose neighbourhood contains a different biome family and scatter the neighbour's edge props there at elevated density (cosmetic, deterministic, no new art). Bare stair-step seams are not acceptable. - Document/guard the render-only invariant; when gathering lands later, harvestables become server truth or hash-derived -- the client's claim is never trusted. ## Definition of Done (delta) - Each biome shows its **own distinct scatter** of plants/rocks; Volcanic is not bare. - Biome borders are **feathered** (no bare stair-step seam). - Two players on the same tile see the **same** scatter objects (deterministic).
Owner

⚠️ Overlaps #141 on the marsh-scatter mechanism. #141 changes the mechanism — decoration becomes passable (blocks=false) statics and the procedural GridRenderer.DrawMarshScatter/VisibleMarshScatter render branch is deleted, so the runtime reasons only on tile flags. This issue (#140) extends scatter to every biome + border feathering.

They can't both be built as written. Recommended sequencing: #141 first (establishes decoration = passable statics, removes terrain-type render logic), then #140 becomes the per-biome scatter content authored on that mechanism (scatter sets + feathering emitted as statics, e.g. via the #113 editor or an offline generator) — not new procedural render code.

⚠️ **Overlaps #141** on the marsh-scatter mechanism. #141 *changes the mechanism* — decoration becomes passable (`blocks=false`) statics and the procedural `GridRenderer.DrawMarshScatter`/`VisibleMarshScatter` render branch is deleted, so the runtime reasons only on tile flags. This issue (#140) *extends* scatter to every biome + border feathering. They can't both be built as written. **Recommended sequencing: #141 first** (establishes decoration = passable statics, removes terrain-type render logic), **then #140** becomes the per-biome scatter **content** authored on that mechanism (scatter sets + feathering emitted as statics, e.g. via the #113 editor or an offline generator) — not new procedural render code.
Owner

⏭️ Heads-up @andrea: #143 (full tiledata data-file) is being implemented now as the foundation for the #113 map editor (owner's call). It absorbs TerrainInfo + BiomeVisuals + StaticCatalog + the terrain legend into one content/tiledata.txt and replaces the TerrainType enum with string ids. This touches the #142 foundation this issue builds on — when you pick it up you'll rebase onto the new model (terrain = string id, flags/art/tint read from TileData). No ProtocolVersion change. Design + invariants recorded on #143.

⏭️ Heads-up @andrea: #143 (full tiledata data-file) is being implemented now as the foundation for the #113 map editor (owner's call). It **absorbs `TerrainInfo` + `BiomeVisuals` + `StaticCatalog` + the terrain legend into one `content/tiledata.txt`** and **replaces the `TerrainType` enum with string ids**. This touches the #142 foundation this issue builds on — when you pick it up you'll rebase onto the new model (terrain = string id, flags/art/tint read from `TileData`). No `ProtocolVersion` change. Design + invariants recorded on #143.
Owner

⏭️ Post-#143 note: the procedural scatter path this issue was patterned on (DrawMarshScatter/GroundTileSelector) was removed in #143 — the map is fully static now. So scatter is not re-added as a render-time hash; it becomes authored passable statics (static <id> 0 in tiledata + rows placed via the editor #113 or an offline generator). This subsumes the old #141 (now closed). Per-biome scatter = a content/authoring concern, never a runtime terrain-type branch.

⏭️ Post-#143 note: the procedural scatter path this issue was patterned on (`DrawMarshScatter`/`GroundTileSelector`) was **removed** in #143 — the map is fully static now. So scatter is **not** re-added as a render-time hash; it becomes **authored passable statics** (`static <id> 0` in tiledata + rows placed via the editor #113 or an offline generator). This subsumes the old #141 (now closed). Per-biome scatter = a content/authoring concern, never a runtime terrain-type branch.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#140
No description provided.