M2 — Tiled map & server-validated walkability #4

Closed
opened 2026-07-16 23:04:47 +02:00 by marco · 1 comment
Owner

Give the world a real, data-driven map with blocking terrain. Today the map is unbounded and the only move rule is the cooldown.

Scope

  • A data-driven tiled map (terrain + blocking tiles) loaded by the server.
  • World validates every move against walkability (reject moves into blocked tiles) in addition to the cooldown.
  • Client renders the terrain; blocked tiles are visually distinct.

Open questions

  • Map source: our own custom format, or reuse legacy UO map data (like the sprites)?

Definition of Done

Base DoD applies on top (tests green, whole solution builds, zero warnings, multi-platform preserved); the criteria below are the issue-specific delta.

  • World rejects a move into a blocked tile and accepts one into a walkable tile (unit tests); a modified client cannot walk through walls.
  • The map is data-driven: editing the map file changes the world with no code change; the format is documented.
  • The client renders map terrain with blocked tiles visibly distinct.
Give the world a real, data-driven map with blocking terrain. Today the map is unbounded and the only move rule is the cooldown. ## Scope - [ ] A data-driven tiled map (terrain + blocking tiles) loaded by the server. - [ ] `World` validates every move against walkability (reject moves into blocked tiles) in addition to the cooldown. - [ ] Client renders the terrain; blocked tiles are visually distinct. ## Open questions - Map source: our own custom format, or reuse legacy UO map data (like the sprites)? ## Definition of Done _Base DoD applies on top (tests green, whole solution builds, zero warnings, multi-platform preserved); the criteria below are the issue-specific delta._ - [ ] `World` rejects a move into a blocked tile and accepts one into a walkable tile (unit tests); a modified client cannot walk through walls. - [ ] The map is data-driven: editing the map file changes the world with no code change; the format is documented. - [ ] The client renders map terrain with blocked tiles visibly distinct.
Author
Owner

Done and merged to main (commit fa5415e).

The world is now a bounded, data-driven tile map (content/maps/world.map, parsed by TileMap in IsoMmo.Shared, copied to both server and client). World.Tick validates every move against walkability — moves into obstacles or off-map are rejected server-side; spawn comes from the map, and a persisted off-map position is clamped to spawn. The client renders the bounded grass field (void outside), tile outlines, and obstacle trees; obstacle art is UO static art loaded at runtime with a placeholder fallback.

Verified: TileMap unit tests, World walkability unit tests (reject into obstacle / off edge), the reconnect integration test (spawn-relative), and manually in-game (can't walk through trees or off the map). 119 tests green, zero warnings, IsoMmo.Shared wire contract unchanged. Real UO static extraction (trees from art.mul) is tracked in #16.

Done and merged to `main` (commit fa5415e). The world is now a bounded, data-driven tile map (`content/maps/world.map`, parsed by `TileMap` in `IsoMmo.Shared`, copied to both server and client). `World.Tick` validates every move against walkability — moves into obstacles or off-map are rejected server-side; spawn comes from the map, and a persisted off-map position is clamped to spawn. The client renders the bounded grass field (void outside), tile outlines, and obstacle **trees**; obstacle art is UO static art loaded at runtime with a placeholder fallback. Verified: TileMap unit tests, World walkability unit tests (reject into obstacle / off edge), the reconnect integration test (spawn-relative), and manually in-game (can't walk through trees or off the map). 119 tests green, zero warnings, `IsoMmo.Shared` wire contract unchanged. Real UO static extraction (trees from art.mul) is tracked in #16.
marco closed this issue 2026-07-17 07:18:13 +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#4
No description provided.