diff --git a/.beans/nuzlocke-tracker-rkyc--shiny-clause-dupes-clause-multi-encounter-per-rout.md b/.beans/nuzlocke-tracker-rkyc--shiny-clause-dupes-clause-multi-encounter-per-rout.md index 0efcc94..a1f6a20 100644 --- a/.beans/nuzlocke-tracker-rkyc--shiny-clause-dupes-clause-multi-encounter-per-rout.md +++ b/.beans/nuzlocke-tracker-rkyc--shiny-clause-dupes-clause-multi-encounter-per-rout.md @@ -1,11 +1,52 @@ --- # nuzlocke-tracker-rkyc -title: 'Shiny Clause & Dupes Clause: Multi-Encounter Per Route' -status: draft +title: Dupes Clause & Shiny Clause enforcement +status: todo type: feature priority: low created_at: 2026-02-05T12:25:19Z -updated_at: 2026-02-05T12:25:19Z +updated_at: 2026-02-07T19:52:42Z --- -Allow multiple encounters per route when shiny clause or dupes clause is active. Shiny clause lets a player catch a shiny regardless of first-encounter rule. Dupes clause lets them re-roll if the first encounter is a species already caught. Requires frontend logic to add additional encounters to a route and backend validation. \ No newline at end of file +Implement active enforcement for Dupes Clause and Shiny Clause in the encounter flow. + +## Dupes Clause + +When enabled, Pokemon from an already-caught evolution chain are **greyed out** in the encounter modal. This prevents catching duplicates within the same evolutionary family. + +- If you catch a Rattata, both Rattata and Raticate become unavailable +- If you catch an Eevee (or any Eeveelution), the entire Eevee family is blocked +- "Already caught" includes both alive and dead Pokemon from the current run +- Greyed-out Pokemon should still be visible in the encounter list but clearly marked as ineligible (reduced opacity, strikethrough, or similar) +- This requires knowing the full evolution chain for each Pokemon — use the existing evolution data to build family groups + +### Implementation notes +- Build a lookup from pokemon_id → set of all pokemon in the same evolution family (walk the evolution tree in both directions) +- On the encounter modal, cross-reference available route Pokemon against caught families +- Grey out / mark as "duped" any Pokemon whose family already has a catch in the current run +- Backend validation is optional (frontend-only is fine since this is a self-enforced rule) + +## Shiny Clause + +When enabled, shiny Pokemon may be caught regardless of the first-encounter-only rule. Rather than allowing multiple regular encounters per route, add a **dedicated Shiny Box** container. + +- Add a "Shiny Box" section on the run page (separate from the team/graveyard) +- Shiny catches are not tied to a route — they're bonus catches stored in the shiny container +- Shiny Box entries need: pokemon, nickname, catch level, and the route where found +- Shinies in the box do NOT count against the one-encounter-per-route rule +- The shiny box should be visually distinct (sparkle icon, gold/yellow accent) + +### Implementation notes +- Add an `is_shiny` boolean field to the Encounter model (or a separate shiny encounters table) +- Shiny encounters bypass the route-lock check on the backend +- Frontend: add a "Log Shiny" button or a shiny toggle in the encounter modal +- Display shiny box as a collapsible section similar to the graveyard + +## Checklist +- [ ] Build evolution family lookup (pokemon_id → family set) +- [ ] Grey out duped Pokemon in encounter modal when dupes clause is active +- [ ] Add `is_shiny` field to encounter model + migration +- [ ] Backend: allow shiny encounters to bypass route lock +- [ ] Frontend: shiny toggle/button in encounter flow +- [ ] Frontend: shiny box section on run page +- [ ] Test with evolution chains (Eevee family, branching evolutions) \ No newline at end of file