# 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) ## Design Tasks | # | Title | Blocked by | |---|-------|------------| | #359 | Resolve Q-018: shadowcasting algorithm selection | — | | #358 | Design ObserverSnapshot v2 schema | — | ## Implementation Tickets | # | Title | Blocked by | |---|-------|------------| | #110 | Shadowcasting algorithm - server | #359 (algorithm decision) | | #111 | Vision cone implementation | #110 | | #112 | Observer visibility query | #111, #358 (snapshot schema) | | #25 | Game clock and day-phase system | #358 (snapshot schema) | Use `db/connectors/ticket show ` 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 (#359):** Shadowcasting algorithm selection — symmetric (Albert Ford) vs recursive. Needs benchmarking at 150x150 scale. Resolve before #110 starts. - **Q-019 (#360):** Entity ID stability — how `entity_id: u64` maps to bevy `Entity`. Affects client entity lifecycle. (Joint ticket, blocks #130.) - **Q-021:** Tick budget overflow policy — what happens when a tick exceeds 100ms. (Not yet ticketed.) ## Notes - **#236 (Sprint 1, done):** `WalkabilityMap` and `validate_movement` are implemented (`server/src/simulation/movement.rs`). Walls are both collision barriers AND LOS occluders — the shadowcasting system reads the walkability map (or a parallel opacity map) to determine what blocks vision. - **#110:** Core of the sprint. Implement LOS calculation per z-level. 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` (or bitmap), `player_facing: Direction`, `game_time: TimeData`. Design this before implementation starts. ## Dependency Chain ``` #359 (Q-018) → #110 (shadowcast) → #111 (vision cone) → #112 (observer query) #358 (snapshot v2) → #112, #113, #25 #25 (time) → parallel track, blocked by #358 ``` ## 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): ```bash tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(simulation): description" --description "body" --base main --head server ```