Meta: map system (terrain + statics + editor + world) #115
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo#115
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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
blocks-> walkability + LOS), client render (viewport-culled), size-agnostic. The foundation everything else builds on.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->compiledjust build-mapstep (mirroring theassets.isoaart 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.
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.
What breaks at that scale
TextMapFormatis dead — one legend char per tile is a ~132 MB text file, read into a single string at load. This is exactly the swap theIMapFormatseam was introduced for (#143): a compiled/chunked binary becomes mandatory, not optional.TileMapgrid is dead — 132 MB even at one byte per tile for a terrain id, and aTerrainDefper 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.world.staticsholds 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
world.sav.Related: #143 (map format seam), #140 (per-biome scatter), #114 (author the large world).