Oregon Trail: BucketBrigade minigame for fire, rains, and blizzards

Oregon Trail: BucketBrigade minigame for fire, rains, and blizzards

#17 in Riparion/riparion-retro — merged 2026-06-10

What

Adds the BucketBrigade triage-against-spread minigame to minigames-kit and wires it into the four spreading-threat catastrophes in Oregon Trail:

  • Fire in the wagon — stamp out the flames before they reach the supplies
  • Heavy rains (below the mountains) — bail and cover the load as leaks spread
  • South Pass & Blue Mountains blizzards — keep the fire fed against the wind

Each catastrophe pauses into a 5×5 grid where threats flare and spread if ignored; tapping knocks them out. resolve_brigade grades the supply/mileage loss by how much was still spreading at the buzzer — contain it for the floor, let it run for the full toll. The blizzard variant additionally runs the cold-weather illness check and falls through to the remaining pass, mirroring resolve_climb.

This retires four entries from TODO_OREGONTRAIL_MINIGAMES.md.

Design / review follow-ups

  • Loss grading lives in the engine. resolve_brigade(contained, leaked, capacity) computes severity itself; capacity now rides back on BucketBrigadeResult, so the grid size lives in one place and the mapping is unit-tested instead of living in the UI.
  • Shared seed helper. Extracted the per-encounter turn·const ^ miles ^ salt formula into Game::encounter_seed(salt) and adopted it across the existing minigame screens (salts preserved byte-for-byte → no behavior/save change).
  • Fire/Rains arms deduped, dead leaked branch removed, per-render allocations in the component trimmed (grid_style memoized, per-cell icon borrowed instead of cloned).

Versioning

Bumps minigames-kit and oregon-trail to 0.1.4.

Testing

  • cargo test -p oregon-trail → 44 pass (incl. new brigade + normalization tests)
  • cargo test -p minigames-kit --lib → 35 pass
  • cargo clippy clean; cargo check --workspace green
  • Release dx build + browser drive: Brigade screen renders and resolves end-to-end

🤖 Generated with Claude Code

Last updated 2026-06-11