diff --git a/.beans/nuzlocke-tracker-49xj--overhaul-nuzlocke-rules-system.md b/.beans/nuzlocke-tracker-49xj--overhaul-nuzlocke-rules-system.md new file mode 100644 index 0000000..84ddef8 --- /dev/null +++ b/.beans/nuzlocke-tracker-49xj--overhaul-nuzlocke-rules-system.md @@ -0,0 +1,72 @@ +--- +# nuzlocke-tracker-49xj +title: Overhaul Nuzlocke Rules System +status: todo +type: epic +priority: normal +created_at: 2026-02-20T13:22:23Z +updated_at: 2026-02-20T13:27:58Z +--- + +Audit and overhaul the nuzlocke rules configuration. The current rules are a flat collection of boolean settings, some of which don't meaningfully affect tracker behavior. This epic cleans up existing rules and adds new rules for popular variants with actual tracker logic. + +## Scope + +### Rules to REMOVE (5) +These rules either define what a nuzlocke is (always true) or don't affect tracker behavior at all: +- `firstEncounterOnly` — implicit; it's a nuzlocke tracker +- `permadeath` — implicit; it's a nuzlocke tracker +- `nicknameRequired` — not enforced or tracked +- `setModeOnly` — not enforced or tracked +- `postGameCompletion` — not enforced or tracked + +### Rules to KEEP (5) +These actively affect tracker logic: +- `duplicatesClause` — used in encounter creation and bulk randomization +- `shinyClause` — used in encounter creation (bypass route-lock) +- `pinwheelClause` — used for zone-based encounter logic +- `hardcoreMode` — used in BossDefeatModal (auto-win, 1 attempt) +- `levelCaps` — displayed in sticky bar on encounters page + +### New rules to ADD (4) +These are boolean flags with real tracker logic: + +- `egglocke` — all caught Pokemon are replaced with traded eggs. When enabled, encounter Pokemon selection should allow picking from ALL Pokemon (not just the game's regional dex), similar to the admin panel encounter creation / boss team creation flow. +- `wonderlocke` — all caught Pokemon are Wonder Traded away. Same as egglocke: encounter Pokemon selection allows picking from ALL Pokemon. +- `randomizer` — the run uses a randomized ROM. Same behavior: encounter Pokemon selection allows picking from ALL Pokemon since the dex is randomized. +- `giftClause` — in-game gift Pokemon are free and do not count against the area's encounter limit. When enabled, gift-origin encounters should bypass the route-lock check (similar to how shinyClause bypasses it for shinies). + +### Follow-up beans to CREATE +Rules that need more complex logic, tracked separately: +- Type Restrictions (Monolocke) — restrict team to specific types +- Team Size Limit — cap active party size with warnings +- Static/Legendary Clause — whether static encounters count or are banned + +## Checklist + +### Cleanup: remove unused rules +- [ ] Remove `firstEncounterOnly`, `permadeath`, `nicknameRequired`, `setModeOnly`, `postGameCompletion` from `NuzlockeRules` interface and `DEFAULT_RULES` +- [ ] Remove their entries from `RULE_DEFINITIONS` + +### Add new rules: frontend types +- [ ] Add `egglocke`, `wonderlocke`, `randomizer`, `giftClause` to `NuzlockeRules` interface and `DEFAULT_RULES` (default: false) +- [ ] Add `RuleDefinition` entries for the new rules with appropriate categories + +### Add new rules: egglocke / wonderlocke / randomizer logic +- [ ] When any of `egglocke`, `wonderlocke`, or `randomizer` is enabled, the encounter Pokemon selector should allow picking from ALL Pokemon (not just the game's regional dex) +- [ ] Reuse the existing "all Pokemon" selector pattern used in admin panel encounter creation and boss team creation + +### Add new rules: giftClause logic +- [ ] When `giftClause` is enabled, gift-origin encounters should bypass the route-lock check in the backend (similar to shinyClause bypass) +- [ ] Update the encounter creation endpoint to check for giftClause when origin is "gift" + +### Update components and pages +- [ ] Update `RulesConfiguration`, `RuleToggle`, and `RuleBadges` components as needed +- [ ] Update `NewRun.tsx` and `NewGenlocke.tsx` if they reference removed rules + +### Backend and data +- [ ] Verify backend encounter logic still works for removed rules (uses `.get()` with defaults) +- [ ] Update backend test seed data if it references removed rules + +### Follow-ups +- [ ] Create follow-up beans for: Type Restrictions, Team Size Limit, Static/Legendary Clause \ No newline at end of file