Meta: map system (terrain + statics + editor + world) #115

Open
opened 2026-07-20 20:42:31 +02:00 by marco · 1 comment
Owner

Meta / tracking issue for the map subsystem — how the game world is represented, authored, collided, and rendered. Groups the runtime, the tooling, the alpha arena, and the post-alpha world. Part of the Alpha epic (#107, pillar 2).

Pieces

  • #89 — Static content system (runtime) [alpha, wave-1 — DONE, merged #144]: data model (dense terrain grid + sparse statics), server collision (blocks -> walkability + LOS), client render (viewport-culled), size-agnostic. The foundation everything else builds on.
  • #113 — Map editor (minimal) [alpha, wave-2 — DONE, #147]: cross-platform MonoGame + ImGui tool to paint terrain + statics on the iso grid (pan/zoom, brush size, rectangle/fill, eraser, palette from tiledata). Authors maps visually.
  • #109 — PvP arena map [alpha, wave-2]: the alpha's playfield, authored with #113 on top of #89.
  • #114 — Large (~1000x1000) world map [post-alpha]: the real game world, authored once the tooling exists.

Dependency order

#89 (format + runtime) -> #113 (editor) -> #109 (arena authored with the editor) — next. #114 comes later.

Format decision (details in #89)

On-disk authoring format stays textual and diffable (two committed files: dense terrain grid + sparse statics list), read/written by the editor. Loader behind a swappable IMapSource / TileMap.Load(path) seam. Binary is deferred to world scale (#114) as a source->compiled just build-map step (mirroring the assets.isoa art pipeline), decided by measured need — never a hand-committed opaque blob.

Out of scope (future — open issues when needed)

Static height / z-layering, multi-tile statics, animated statics, map regions/zones metadata, in-game live editing.

No standalone Definition of Done: this meta closes when its alpha children (#89 , #113 , #109) are done; #114 tracks the post-alpha continuation.

Meta / tracking issue for the **map subsystem** — how the game world is represented, authored, collided, and rendered. Groups the runtime, the tooling, the alpha arena, and the post-alpha world. Part of the Alpha epic (#107, pillar 2). ## Pieces - ✅ **#89 — Static content system (runtime)** _[alpha, wave-1 — DONE, merged #144]_: data model (dense terrain grid + sparse statics), server collision (`blocks` -> walkability + LOS), client render (viewport-culled), size-agnostic. The foundation everything else builds on. - ✅ **#113 — Map editor (minimal)** _[alpha, wave-2 — DONE, #147]_: cross-platform MonoGame + ImGui tool to paint terrain + statics on the iso grid (pan/zoom, brush size, rectangle/fill, eraser, palette from tiledata). Authors maps visually. - **#109 — PvP arena map** _[alpha, wave-2]_: the alpha's playfield, authored with #113 on top of #89. - **#114 — Large (~1000x1000) world map** _[post-alpha]_: the real game world, authored once the tooling exists. ## Dependency order #89 (format + runtime) ✅ -> #113 (editor) ✅ -> **#109 (arena authored with the editor) — next**. #114 comes later. ## Format decision (details in #89) On-disk authoring format stays **textual and diffable** (two committed files: dense terrain grid + sparse statics list), read/written by the editor. Loader behind a swappable `IMapSource` / `TileMap.Load(path)` seam. Binary is deferred to world scale (#114) as a source->compiled `just build-map` step (mirroring the `assets.isoa` art pipeline), decided by measured need — never a hand-committed opaque blob. ## Out of scope (future — open issues when needed) Static height / z-layering, multi-tile statics, animated statics, map regions/zones metadata, in-game live editing. No standalone Definition of Done: this meta closes when its alpha children (#89 ✅, #113 ✅, #109) are done; #114 tracks the post-alpha continuation.
Collaborator

Alpha milestone target: 132.2 million tiles

Owner's target for the alpha world (stated 2026-07-24). Not to be built now, but it should steer the decisions we take from here, because it invalidates two things we are doing today.

current map 128 x 96 = 12,288 tiles
alpha target 132,200,000 tiles (~11,500 x 11,500)
growth ~10,760x

What breaks at that scale

  • TextMapFormat is dead — one legend char per tile is a ~132 MB text file, read into a single string at load. This is exactly the swap the IMapFormat seam was introduced for (#143): a compiled/chunked binary becomes mandatory, not optional.
  • The dense TileMap grid is dead — 132 MB even at one byte per tile for a terrain id, and a TerrainDef per tile lands in the gigabytes. Needs chunking (load the chunks near players, drop the rest), a terrain palette, or both. This is the single biggest architectural consequence.
  • Authored static rows do not scale. Today's world.statics holds 291 rows for 12,288 tiles — 2.4% density. The same dressing at the target is ~3.1 million rows. Hand-authored placement cannot get there: the per-biome scatter (#140) has to be deterministic and generative (seed + biome rules, derived at load or on the fly), with authored rows reserved for landmarks. Worth deciding before we author much more by hand.

What does NOT break

  • AoI is radius-based, so per-player cost is unchanged by world size.
  • Persistence is unaffected — the map is static content, never in world.sav.
  • Statics as a sparse dict keyed by tile stays the right shape; it is the authoring of them that has to change.

Related: #143 (map format seam), #140 (per-biome scatter), #114 (author the large world).

### Alpha milestone target: **132.2 million tiles** Owner's target for the alpha world (stated 2026-07-24). Not to be built now, but it should steer the decisions we take from here, because it invalidates two things we are doing today. | | | |---|---| | current map | 128 x 96 = **12,288** tiles | | alpha target | **132,200,000** tiles (~11,500 x 11,500) | | growth | **~10,760x** | **What breaks at that scale** - **`TextMapFormat` is dead** — one legend char per tile is a ~132 MB text file, read into a single string at load. This is exactly the swap the `IMapFormat` seam was introduced for (#143): a compiled/chunked binary becomes mandatory, not optional. - **The dense `TileMap` grid is dead** — 132 MB even at one byte per tile for a terrain id, and a `TerrainDef` per tile lands in the gigabytes. Needs chunking (load the chunks near players, drop the rest), a terrain **palette**, or both. This is the single biggest architectural consequence. - **Authored static rows do not scale.** Today's `world.statics` holds 291 rows for 12,288 tiles — 2.4% density. The same dressing at the target is **~3.1 million rows**. Hand-authored placement cannot get there: the per-biome scatter (#140) has to be **deterministic and generative** (seed + biome rules, derived at load or on the fly), with authored rows reserved for landmarks. Worth deciding before we author much more by hand. **What does NOT break** - **AoI** is radius-based, so per-player cost is unchanged by world size. - **Persistence** is unaffected — the map is static content, never in `world.sav`. - **Statics as a sparse dict** keyed by tile stays the right shape; it is the *authoring* of them that has to change. Related: #143 (map format seam), #140 (per-biome scatter), #114 (author the large world).
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#115
No description provided.