5.4 KiB
5.4 KiB
SPEC: Mana Conversion Attunement Fix
1. Objective
Fix the mana conversion logic for attunements (e.g., Enchanter Transference) that incorrectly deducts mana from the player's mana pool every tick instead of reducing raw mana regen. This bug causes players to get stuck at 1 mana below their mana cap.
Why:
- Current behavior breaks core mana progression loop
- Players cannot reach full mana capacity when attunements are active
- Violates intended design where attunement costs should reduce regen rate, not drain pool
2. Controls/API
No new player-facing controls or APIs are added. This is an internal logic fix.
Modified Game Internals:
computeRegen()/computeEffectiveRegen()incomputed-stats.ts: Adjust to account for attunement regen reductionsmanaStore.tstick logic: Remove direct mana pool deductions for attunement costs- Attunement effect application: Add regen reduction to unified effect system instead of pool deductions
- Game tick loop: Ensure regen reduction is applied before mana regen calculation
Public API Changes:
None (internal bug fix only)
3. Project Layout
Follow existing modular architecture rules from AGENTS.md:
Files to Modify:
| File | Purpose | Line Count Check |
|---|---|---|
src/lib/game/stores/manaStore.ts |
Remove pool deduction logic for attunements, ensure regen reduction applied | Must stay <400 lines |
src/lib/game/computed-stats.ts |
Update computeRegen() to apply attunement regen reductions from unified effects |
Must stay <400 lines |
src/lib/game/effects.ts |
Add attunement regen reduction to unified effect system if not already present | Must stay <400 lines |
src/lib/game/stores/gameLoopActions.ts |
Ensure correct tick order: apply regen reductions → calculate regen → update mana pool | Must stay <400 lines |
src/lib/game/constants/attunements.ts (or similar) |
Verify attunement effect definitions use regen reduction instead of pool drain | Must stay <400 lines |
Files to Create:
| File | Purpose | Line Count Check |
|---|---|---|
src/lib/game/stores/__tests__/mana-conversion-fix.test.ts |
Regression test for fix | Must stay <400 lines |
Module Ownership:
- Mana logic:
manaStore.ts(store module) - Computed stats:
computed-stats.ts(shared utility) - Effects:
effects.ts(unified effect system) - Tests:
stores/__tests__/(test directory)
4. Code Style
Follow existing project conventions:
- TypeScript strict mode, explicit type annotations for game state
- Zustand store patterns:
set(),get()for state updates, avoid direct mutations - Unified effect system: All stat modifications flow through
getUnifiedEffects() - Naming: camelCase for variables/functions, PascalCase for interfaces/types
- No
anytypes, use defined interfaces fromsrc/lib/game/types.ts - Follow ESLint rules (run
npm run lintbefore committing) - Use existing patterns for regen/reduction calculations (e.g.,
regenBonus,regenMultiplierin unified effects)
5. Testing
What to Test:
- Mana regen with active attunements: Verify attunement costs reduce regen rate, not mana pool
- Mana cap behavior: Player can reach full mana cap when attunements are active
- No pool drain: Mana pool is never deducted directly by attunement costs
- Unified effect integration: Attunement regen reductions are properly included in
getUnifiedEffects() - Tick order: Regen reductions are applied before mana regen calculation in game tick
How to Test:
- Unit tests using Vitest (existing test framework)
- Test files located in
src/lib/game/stores/__tests__/ - Mock game state to simulate active attunements
- Assert regen values and mana pool behavior
- Run
npm run testto execute all tests
Tooling:
- Vitest (test runner)
- Zustand store testing patterns (use
getState()for assertions) - Mock
getUnifiedEffects()to return attunement regen reductions
6. Boundaries (Out-of-Scope Items)
- No changes to attunement definitions (only their effect application)
- No new attunements or mana types added
- No changes to combat, crafting, or prestige systems (unless directly related to mana regen)
- No UI changes (this is internal logic only)
- No modifications to legacy
store.ts(use modular stores only) - No changes to banned content rules or mana type hierarchy
Acceptance Criteria (Per Requirement)
| Requirement | Acceptance Criterion |
|---|---|
| Attunement costs reduce raw mana regen instead of deducting from pool | Unit test passes: computeRegen() returns reduced value when attunement regen reduction is applied |
| Deduction applied before mana regen calculations | Unit test passes: Game tick applies regen reduction before calculating mana addition to pool |
| Mana pool no longer stuck below cap | Integration test passes: Mana pool reaches full cap when attunements are active after sufficient time |
| No direct mana pool deductions from attunements | Code review: No calls to spendRawMana() or direct rawMana deductions in attunement logic |
| Follow unified effect system | Code review: Attunement regen reductions are added to UnifiedEffects interface and applied via getUnifiedEffects() |
| All files stay under 400 lines | Pre-commit hook passes: No modified files exceed 400 lines |
| Regression test added | Test file exists and runs successfully in npm run test |