Biomes D: fixtures object-layer (blocks walk + blocks sight) #139

Closed
opened 2026-07-22 13:29:07 +02:00 by panda · 1 comment
Collaborator

Depends on #136. Adds the object layer: movement-blocking fixtures (pine, boulder, cactus, volcanic rocks) with an independent block-sight flag. Design: docs/game-design/systems/biomes.md (parent #135).

Scope

  • Map format: a second object grid (same dims) in world.map, one char per fixture, . = none; back-compat with the legacy single grid (# -> tree fixture on default ground).
  • Shared: Fixture enum + FixtureInfo (blocksSight); TileMap fixture[,] grid; IsWalkable false on a fixture cell; HasLineOfSight uses FixtureInfo.BlocksSight (consumed by TargetValidator, BoltSpell). Defaults: pine/boulder/volcanic-rocks block sight; cactus does not.
  • Client: render fixtures in the depth-sorted pass (like trees); generalize the occlusion-fade (IsoOcclusion.Occludes, today only WorldKind.Tree) to every tall fixture; contact-shadow/silhouette convention so blocking reads vs passable scatter; red target cursor when the target cell holds a fixture.

Definition of Done (delta)

  • A player is stopped by every fixture exactly as by a tree; the target cursor over a fixture reads blocked (red).
  • Line-of-sight is blocked by a boulder/pine but not by a cactus -- demonstrable by targeting/casting across each.
  • No fixture can fully hide the self-player (it fades like a tree when covering).
  • A player can predict block-vs-pass from the silhouette alone (grounded+shadow vs light scatter).
Depends on #136. Adds the **object layer**: movement-blocking fixtures (pine, boulder, cactus, volcanic rocks) with an independent block-sight flag. Design: `docs/game-design/systems/biomes.md` (parent #135). ## Scope - Map format: a second **object grid** (same dims) in `world.map`, one char per fixture, `.` = none; back-compat with the legacy single grid (`#` -> tree fixture on default ground). - `Shared`: `Fixture` enum + `FixtureInfo (blocksSight)`; `TileMap` `fixture[,]` grid; `IsWalkable` false on a fixture cell; `HasLineOfSight` uses `FixtureInfo.BlocksSight` (consumed by `TargetValidator`, `BoltSpell`). Defaults: pine/boulder/volcanic-rocks block sight; **cactus does not**. - Client: render fixtures in the depth-sorted pass (like trees); **generalize the occlusion-fade** (`IsoOcclusion.Occludes`, today only `WorldKind.Tree`) to every tall fixture; contact-shadow/silhouette convention so blocking reads vs passable scatter; **red target cursor** when the target cell holds a fixture. ## Definition of Done (delta) - A player is **stopped** by every fixture exactly as by a tree; the target cursor over a fixture reads blocked (red). - **Line-of-sight is blocked by a boulder/pine but not by a cactus** -- demonstrable by targeting/casting across each. - **No fixture can fully hide the self-player** (it fades like a tree when covering). - A player can predict block-vs-pass from the silhouette alone (grounded+shadow vs light scatter).
Owner

Consolidating with #89 (Static content system) — same domain: a sparse object/static layer that blocks walk + sight. #142 (biomes) deliberately deferred this object-layer split; #89 already carries the full critical-design-review + agreed decisions, so we implement it there. Closing #139 as done-by #89 to avoid two parallel efforts on the same layer (cc @andrea — heads-up so we do not duplicate). Work starts now on branch feat/static-object-layer, on top of the biomes foundation.

Consolidating with **#89** (Static content system) — same domain: a sparse object/static layer that blocks walk + sight. #142 (biomes) deliberately deferred this object-layer split; #89 already carries the full critical-design-review + agreed decisions, so we implement it there. **Closing #139 as done-by #89** to avoid two parallel efforts on the same layer (cc @andrea — heads-up so we do not duplicate). Work starts now on branch feat/static-object-layer, on top of the biomes foundation.
marco closed this issue 2026-07-22 14:20:45 +02:00
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#139
No description provided.