Files
settled-reach/docs/sprints/sprint-2/server.md
T
jpmschweitzerandClaude Opus 4.6 7f97cb7ce3 docs(sprints): add Sprint 2 "See" briefings for server, client, joint
Sprint 2 goal: fog of perception working through the bridge. Server
computes LOS visibility, client renders fog. Carries over #236 and #81
from Sprint 1.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 21:45:38 +01:00

3.4 KiB

Sprint 2: See — Server Tasks

Goal: Fog of perception working through the bridge — server computes LOS visibility, client renders fog.

Branch: server Agents: Dudley (simulation), Oscar (networking)

Carry-over from Sprint 1

# Title Status Notes
#236 Tile collision system ready WalkabilityMap exists, needs wall data for LOS

New Tickets

# Title Blocked by
#110 Shadowcasting algorithm - server #236 (walls needed for LOS)
#111 Vision cone implementation #110
#112 Observer visibility query #111
#25 Game clock and day-phase system — (SimulationTime exists, needs day-phase integration into snapshot)

Use db/connectors/ticket show <id> for full details.

Key Decisions

  • decisions/perception.md — D-011 (fog non-negotiable), D-015 (locked camera + vision cone), D-018 (three-range sound model)
  • decisions/architecture.md — D-010 (information boundaries), D-020 (ObserverSnapshot), D-031 (time system)

Open Questions to Resolve Early

  • Q-018: Shadowcasting algorithm selection — symmetric (Albert Ford) vs recursive. Needs benchmarking at 150x150 scale. Resolve before #110 starts.
  • Q-019: Entity ID stability — how entity_id: u64 maps to bevy Entity. Affects client entity lifecycle.
  • Q-021: Tick budget overflow policy — what happens when a tick exceeds 100ms.

Notes

  • #236 (carry-over): WalkabilityMap and validate_movement are already implemented (server/src/simulation/movement.rs). The remaining work is integrating wall/blocked tile data that the shadowcasting algorithm needs. Walls must be both collision barriers AND LOS occluders.
  • #110: Core of the sprint. Implement LOS calculation per z-level. The WalkabilityMap stores tile walkability in chunks — the shadowcasting system reads this (or a parallel opacity map) to determine what blocks vision. Output: set of visible tiles for a given observer position.
  • #111: Vision cone sectors (forward/peripheral/behind per D-015). Facing direction component needed. Forward = full LOS range, peripheral = reduced range + dimmer, behind = blind. The cone modulates the shadowcast output.
  • #112: Given an observer entity, return visible entities and tiles. This is the system that populates ObserverSnapshot.entities with only what the observer can see. Currently the snapshot includes ALL entities (no filtering). This ticket adds the filter.
  • #25: SimulationTime already exists (server/src/simulation/time.rs) with tick/pause/day-phase. Remaining: include time data in ObserverSnapshot so the client can display it. May also need FacingDirection component for vision cone.
  • ObserverSnapshot expansion: The ObserverSnapshot struct (server/src/bridge/types.rs) needs new fields: visible_tiles: Vec<VisibleTile> (or bitmap), player_facing: Direction, game_time: TimeData. Design this before implementation starts.

Dependency Chain

#236 (walls) → #110 (shadowcast) → #111 (vision cone) → #112 (observer query)
#25 (time) → standalone, parallel track

PR Workflow

When ready to submit, create a PR with tea CLI. All flags are required to avoid TTY prompts (see CLAUDE.md "Gitea access" section):

tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(simulation): description" --description "body" --base main --head server