Files
nuzlocke-tracker/.beans/nuzlocke-tracker-49xj--overhaul-nuzlocke-rules-system.md
Julian Tabel 7ec43431e5 Add epic: Overhaul Nuzlocke Rules System
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 14:28:50 +01:00

3.9 KiB

title, status, type, priority, created_at, updated_at
title status type priority created_at updated_at
Overhaul Nuzlocke Rules System todo epic normal 2026-02-20T13:22:23Z 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