Remove unused nuzlocke rules, reorganize into core and playstyle
Remove firstEncounterOnly, permadeath, nicknameRequired, and postGameCompletion from the rules system — they are either implicit (it's a nuzlocke tracker) or not enforced. Move levelCaps to core (it's displayed in the sticky bar). Create a new "playstyle" category for hardcoreMode and setModeOnly — informational rules useful for stats but not enforced by the tracker. Remove the completion category entirely. Add sub-task beans for the rules overhaul epic. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -21,9 +21,7 @@ export function RuleBadges({ rules }: RuleBadgesProps) {
|
||||
className={`px-2 py-0.5 rounded-full text-xs font-medium ${
|
||||
def.category === 'core'
|
||||
? 'bg-blue-900/40 text-blue-300 light:bg-blue-100 light:text-blue-700'
|
||||
: def.category === 'completion'
|
||||
? 'bg-green-900/40 text-green-300 light:bg-green-100 light:text-green-700'
|
||||
: 'bg-amber-900/40 text-amber-300 light:bg-amber-100 light:text-amber-800'
|
||||
: 'bg-purple-900/40 text-purple-300 light:bg-purple-100 light:text-purple-700'
|
||||
}`}
|
||||
>
|
||||
{def.name}
|
||||
|
||||
@@ -19,8 +19,7 @@ export function RulesConfiguration({
|
||||
? RULE_DEFINITIONS.filter((r) => !hiddenRules.has(r.key))
|
||||
: RULE_DEFINITIONS
|
||||
const coreRules = visibleRules.filter((r) => r.category === 'core')
|
||||
const difficultyRules = visibleRules.filter((r) => r.category === 'difficulty')
|
||||
const completionRules = visibleRules.filter((r) => r.category === 'completion')
|
||||
const playstyleRules = visibleRules.filter((r) => r.category === 'playstyle')
|
||||
|
||||
const handleRuleChange = (key: keyof NuzlockeRules, value: boolean) => {
|
||||
onChange({ ...rules, [key]: value })
|
||||
@@ -74,11 +73,13 @@ export function RulesConfiguration({
|
||||
|
||||
<div className="bg-surface-1 rounded-lg shadow">
|
||||
<div className="px-4 py-3 border-b border-border-default">
|
||||
<h3 className="text-lg font-medium text-text-primary">Difficulty Modifiers</h3>
|
||||
<p className="text-sm text-text-tertiary">Optional rules to increase the challenge</p>
|
||||
<h3 className="text-lg font-medium text-text-primary">Playstyle</h3>
|
||||
<p className="text-sm text-text-tertiary">
|
||||
Describe how you're playing — doesn't affect tracker behavior
|
||||
</p>
|
||||
</div>
|
||||
<div className="px-4">
|
||||
{difficultyRules.map((rule) => (
|
||||
{playstyleRules.map((rule) => (
|
||||
<RuleToggle
|
||||
key={rule.key}
|
||||
name={rule.name}
|
||||
@@ -89,26 +90,6 @@ export function RulesConfiguration({
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{completionRules.length > 0 && (
|
||||
<div className="bg-surface-1 rounded-lg shadow">
|
||||
<div className="px-4 py-3 border-b border-border-default">
|
||||
<h3 className="text-lg font-medium text-text-primary">Completion</h3>
|
||||
<p className="text-sm text-text-tertiary">When is the run considered complete</p>
|
||||
</div>
|
||||
<div className="px-4">
|
||||
{completionRules.map((rule) => (
|
||||
<RuleToggle
|
||||
key={rule.key}
|
||||
name={rule.name}
|
||||
description={rule.description}
|
||||
enabled={rules[rule.key]}
|
||||
onChange={(value) => handleRuleChange(rule.key, value)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,68 +1,36 @@
|
||||
export interface NuzlockeRules {
|
||||
// Core rules
|
||||
firstEncounterOnly: boolean
|
||||
permadeath: boolean
|
||||
nicknameRequired: boolean
|
||||
// Core rules (affect tracker behavior)
|
||||
duplicatesClause: boolean
|
||||
shinyClause: boolean
|
||||
pinwheelClause: boolean
|
||||
|
||||
// Difficulty modifiers
|
||||
hardcoreMode: boolean
|
||||
levelCaps: boolean
|
||||
setModeOnly: boolean
|
||||
|
||||
// Completion
|
||||
postGameCompletion: boolean
|
||||
// Playstyle (informational, for stats/categorization)
|
||||
hardcoreMode: boolean
|
||||
setModeOnly: boolean
|
||||
}
|
||||
|
||||
export const DEFAULT_RULES: NuzlockeRules = {
|
||||
// Core rules - standard Nuzlocke
|
||||
firstEncounterOnly: true,
|
||||
permadeath: true,
|
||||
nicknameRequired: true,
|
||||
// Core rules
|
||||
duplicatesClause: true,
|
||||
shinyClause: true,
|
||||
pinwheelClause: true,
|
||||
|
||||
// Difficulty modifiers - off by default
|
||||
hardcoreMode: false,
|
||||
levelCaps: false,
|
||||
setModeOnly: false,
|
||||
|
||||
// Completion
|
||||
postGameCompletion: false,
|
||||
// Playstyle - off by default
|
||||
hardcoreMode: false,
|
||||
setModeOnly: false,
|
||||
}
|
||||
|
||||
export interface RuleDefinition {
|
||||
key: keyof NuzlockeRules
|
||||
name: string
|
||||
description: string
|
||||
category: 'core' | 'difficulty' | 'completion'
|
||||
category: 'core' | 'playstyle'
|
||||
}
|
||||
|
||||
export const RULE_DEFINITIONS: RuleDefinition[] = [
|
||||
// Core rules
|
||||
{
|
||||
key: 'firstEncounterOnly',
|
||||
name: 'First Encounter Only',
|
||||
description:
|
||||
'You may only catch the first Pokémon encountered in each area. If you fail to catch it, you get nothing from that area.',
|
||||
category: 'core',
|
||||
},
|
||||
{
|
||||
key: 'permadeath',
|
||||
name: 'Permadeath',
|
||||
description:
|
||||
'If a Pokémon faints, it is considered dead and must be released or permanently boxed.',
|
||||
category: 'core',
|
||||
},
|
||||
{
|
||||
key: 'nicknameRequired',
|
||||
name: 'Nickname Required',
|
||||
description: 'All caught Pokémon must be given a nickname to form a stronger bond.',
|
||||
category: 'core',
|
||||
},
|
||||
{
|
||||
key: 'duplicatesClause',
|
||||
name: 'Duplicates Clause',
|
||||
@@ -84,35 +52,26 @@ export const RULE_DEFINITIONS: RuleDefinition[] = [
|
||||
'Sub-zones within a location group each get their own encounter instead of sharing one.',
|
||||
category: 'core',
|
||||
},
|
||||
|
||||
// Difficulty modifiers
|
||||
{
|
||||
key: 'hardcoreMode',
|
||||
name: 'Hardcore Mode',
|
||||
description: 'No items may be used during battle. Held items are still allowed.',
|
||||
category: 'difficulty',
|
||||
},
|
||||
{
|
||||
key: 'levelCaps',
|
||||
name: 'Level Caps',
|
||||
description:
|
||||
"Your Pokémon cannot exceed the level of the next Gym Leader's highest-level Pokémon before challenging them.",
|
||||
category: 'difficulty',
|
||||
category: 'core',
|
||||
},
|
||||
|
||||
// Playstyle
|
||||
{
|
||||
key: 'hardcoreMode',
|
||||
name: 'Hardcore Mode',
|
||||
description: 'No items may be used during battle. Held items are still allowed.',
|
||||
category: 'playstyle',
|
||||
},
|
||||
{
|
||||
key: 'setModeOnly',
|
||||
name: 'Set Mode Only',
|
||||
description:
|
||||
'The game must be played in "Set" battle style, meaning you cannot switch Pokémon after knocking out an opponent.',
|
||||
category: 'difficulty',
|
||||
},
|
||||
|
||||
// Completion
|
||||
{
|
||||
key: 'postGameCompletion',
|
||||
name: 'Post-Game Completion',
|
||||
description:
|
||||
'The run continues into post-game content instead of ending after the Champion is defeated.',
|
||||
category: 'completion',
|
||||
category: 'playstyle',
|
||||
},
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user