11 KiB
Mana-Loop Codebase Audit Report
Date: 2025-01-24 Auditor: Automated sub-agent analysis
Executive Summary
The Mana-Loop codebase is a Next.js game application with a mixed architecture - partially refactored from a monolithic store (store.ts) to a modular store architecture (stores/). The codebase has significant technical debt in the form of dead code, unimplemented features, and files that have grown too large.
Phase 1: Files Over 300 Lines
Critical (Needs Immediate Refactoring)
| File | Lines | Purpose | Issue |
|---|---|---|---|
src/lib/game/store.ts |
2464 | Legacy monolithic game store | Monolith doing virtually all game logic |
src/lib/game/skill-evolution.ts |
2312 | Skill talent trees | Single file with all skill trees; could split by category |
src/lib/game/constants.ts |
1436 | Game constants & definitions | Mixes constants with content data (spells, skills, etc.) |
src/lib/game/types.ts |
516 | TypeScript type definitions | Type definitions should be split by domain |
src/components/game/tabs/CraftingTab.tsx |
965 | Crafting UI | Single component handling all crafting phases |
src/lib/game/crafting-slice.ts |
847 | Old crafting store | Legacy file; newer version exists at stores/craftingSlice.ts |
src/lib/game/data/enchantment-effects.ts |
846 | Enchantment effect definitions | Large but focused; acceptable as data file |
src/components/game/tabs/DebugTab.tsx |
700 | Debug tools UI | Catch-all debug panel; could split by feature |
src/lib/game/store/craftingSlice.ts |
644 | New crafting store | Cleaner but still combines state with business logic |
Moderate (Should Refactor)
| File | Lines | Purpose | Issue |
|---|---|---|---|
src/lib/game/attunements.ts |
567 | Attunement system (OLD) | DEAD CODE - new version at data/attunements.ts |
src/components/game/tabs/GrimoireTab.tsx |
567 | Pact system UI | Combines memory, pacts, boons |
src/components/game/StatsTab.tsx |
551 | Stats display (OLD) | Too many unrelated stat categories |
src/components/game/tabs/StatsTab.tsx |
545 | Stats display (NEW) | Same issues as above |
src/lib/game/stores/gameStore.ts |
509 | Game coordinator store | Still coordinates too many systems |
src/lib/game/computed-stats.ts |
492 | Computed statistics | Mixes utilities with stat calculations |
src/lib/game/data/golems.ts |
471 | Golem definitions | Focused, acceptable size |
src/lib/game/data/equipment.ts |
468 | Equipment definitions | Data file, acceptable size |
src/app/page.tsx |
465 | Main game page | Should be thin shell; currently imports everything |
src/components/game/LootInventory.tsx |
460 | Loot inventory UI | Handles multiple inventory types |
src/components/game/SkillsTab.tsx |
418 | Skills UI (OLD) | Combines display with upgrade dialog |
src/components/game/GameContext.tsx |
405 | Game context provider | Monolithic context combining all stores |
src/lib/game/upgrade-effects.ts |
402 | Upgrade effect computation | Focused, acceptable |
src/components/game/tabs/EquipmentTab.tsx |
393 | Equipment UI | Acceptable size |
src/lib/game/utils.ts |
372 | Game utilities | Grown to include significant game logic |
src/components/game/tabs/SkillsTab.tsx |
369 | Skills UI (NEW) | Same as old version |
src/lib/game/store/skillSlice.ts |
346 | Skill store slice (OLD) | Legacy; newer version exists |
src/components/game/tabs/SpireTab.tsx |
345 | Spire progression UI | Acceptable size |
src/components/game/tabs/GolemancyTab.tsx |
338 | Golem management UI | Acceptable size |
src/lib/game/stores/skillStore.ts |
332 | Skill store (NEW) | Acceptable size |
src/lib/game/store/computed.ts |
322 | Computed values (OLD) | Legacy computed values |
src/components/game/SpireTab.tsx |
320 | Spire UI (OLD) | Duplicate of tabs/ version |
Test Files Over 300 Lines (Acceptable)
src/lib/game/store.test.ts- 1042 linessrc/lib/game/__tests__/skills.test.ts- 588 linessrc/lib/game/stores/__tests__/store-methods.test.ts- 583 linessrc/lib/game/stores/index.test.ts- 571 linessrc/lib/game/skills.test.ts- 542 linessrc/lib/game/stores.test.ts- 494 linessrc/lib/game/stores/__tests__/stores.test.ts- 458 linessrc/lib/game/__tests__/skill-system.test.ts- 347 lines
Phase 1: TODO/FIXME and Unimplemented Features
TODO/FIXME Comments
No TODO or FIXME comments found in the codebase.
Unimplemented Special Effects
The following special effects are registered but never applied in game logic:
1. spellEcho10 (Enchantment Effect)
- Location:
src/lib/game/data/enchantment-effects.ts:530 - Definition: 10% chance to cast a spell twice
- Issue:
hasSpecial(effects, 'spellEcho10')is never checked in combat logic - Severity: Medium - Equipment enchantment doesn't work
2. worldThread and worldWeb (Skill Upgrades)
- Location:
src/lib/game/skill-evolution.ts:1662,1670 - Definitions:
worldThread: "Enchantments also apply 5% as world effects"worldWeb: "Enchantments also apply 10% as world effects"
- Issue: These specialIds are never checked with
hasSpecial() - Severity: High - Major feature gap ("world effects" mechanic unimplemented)
3. Weapon Enchantment Specials
All defined but never checked:
| Special ID | Location | Purpose |
|---|---|---|
fireBlade |
constants.ts:864, enchantment-effects.ts:781 |
Burn enemies |
frostBlade |
constants.ts:877, enchantment-effects.ts:791 |
Prevent enemy dodge |
lightningBlade |
constants.ts:890, enchantment-effects.ts:801 |
Pierce 30% armor |
voidBlade |
constants.ts:903, enchantment-effects.ts:811 |
+20% damage |
- Severity: High - Weapon enchantment system broken
4. comboMaster (Special Effect)
- Location:
src/lib/game/upgrade-effects.ts:97,396 - Definition: Every 5th attack deals 3x damage
- Issue: Hit counter tracking status unclear; combat handler may not check this
- Severity: Low - Implementation status unclear
Effects Applied but Never Read
1. weaponManaMax and weaponManaRegen
- Location:
src/lib/game/data/enchantment-effects.ts:566-616 - Issue: Bonuses stored in
equipmentEffects.bonusesbut never read incomputeAllEffects() - Severity: Medium - Weapon mana system incomplete
2. insightGainMultiplier from Equipment
- Location:
src/lib/game/effects.ts:127-129 - Issue: Stored via type assertion but never read in
calcInsight() - Severity: Medium - Insight bonus from equipment doesn't work
3. guardianDamageMultiplier from Equipment
- Location:
src/lib/game/effects.ts:131-132 - Issue: Stored but unclear if ever read
- Severity: Low - Needs investigation
Phase 1: Dead Code Analysis
Confirmed Dead Code (Safe to Remove)
| File | Reason | Evidence |
|---|---|---|
src/lib/game/attunements.ts |
Old attunement system | No imports; new version at data/attunements.ts |
src/lib/game/navigation-slice.ts |
Old navigation system | No imports anywhere |
src/lib/db.ts |
Prisma client | No imports; possibly planned backend feature |
src/components/game/ComboMeter.tsx |
Unused component | No imports; references non-existent ComboState type |
src/components/game/layout/GameFooter.tsx |
Unused component | No imports |
src/components/game/shared/GameOverScreen.tsx |
Unused component | No imports |
src/components/game/shared/MemorySlotPicker.tsx |
Unused component | Only used by GameOverScreen |
Duplicate Code to Clean
| Location | Issue | Action |
|---|---|---|
src/components/game/types.ts |
Duplicate formatting functions | Remove; use src/lib/game/formatting.ts instead |
src/lib/game/store.ts |
Functions duplicated in utils.ts and computed-stats.ts |
Consolidate during refactoring |
Flagged for Review (String References/Dynamic Imports)
UI Components (Possibly Unused)
Many shadcn/ui components in src/components/ui/ have no direct imports:
aspect-ratio.tsx,avatar.tsx,breadcrumb.tsx,calendar.tsx,carousel.tsx,chart.tsx,checkbox.tsx,collapsible.tsx,command.tsx,context-menu.tsx,drawer.tsx,dropdown-menu.tsx,form.tsx,hover-card.tsx,input-otp.tsx,label.tsx,menubar.tsx,navigation-menu.tsx,pagination.tsx,popover.tsx,radio-group.tsx,resizable.tsx,scroll-area.tsx(USED),select.tsx(USED),separator.tsx(USED),sheet.tsx,skeleton.tsx,slider.tsx,sonner.tsx,switch.tsx(USED),table.tsx,textarea.tsx,toggle.tsx,toggle-group.tsx
Note: These might be used dynamically or via string references. Review before removing.
Test File Duplication
src/lib/game/skills.test.ts(tests old store)src/lib/game/store.test.ts(tests old store)src/lib/game/__tests__/skills.test.ts(newer)src/lib/game/stores/__tests__/store-methods.test.ts(newer)src/lib/game/stores/__tests__/stores.test.ts(newer)
Recommendation: Old test files may be redundant if new tests provide adequate coverage.
Architecture Notes
Store Migration In Progress
The codebase shows an active migration from:
- Old: Monolithic
src/lib/game/store.ts(2464 lines) - New: Modular stores in
src/lib/game/stores/(gameStore.ts, combatStore.ts, etc.)
Current status: Mixed usage - some components still import from old store.
Data vs Logic Separation
Good separation in src/lib/game/data/ for:
attunements.tscrafting-recipes.tsenchantment-effects.tsequipment.tsgolems.tsloot-drops.tsachievements.ts
Recommended Action Plan
Phase 2: Safe Deletions (High Priority)
- Delete
src/lib/game/attunements.ts - Delete
src/lib/game/navigation-slice.ts - Delete
src/lib/db.ts - Delete
src/components/game/ComboMeter.tsx - Delete
src/components/game/layout/GameFooter.tsx - Delete
src/components/game/shared/GameOverScreen.tsx - Delete
src/components/game/shared/MemorySlotPicker.tsx - Clean duplicate formatting functions from
src/components/game/types.ts
Phase 3: Refactor Large Files (Medium Priority)
- store.ts (2464 lines): Complete migration to modular stores
- skill-evolution.ts (2312 lines): Split by skill category
- constants.ts (1436 lines): Split into domain-specific data files
- types.ts (516 lines): Split by domain
- CraftingTab.tsx (965 lines): Split by crafting phase
- page.tsx (465 lines): Make thin shell
- GameContext.tsx (405 lines): Simplify or remove need for monolithic context
Phase 4: Implement Missing Effects (High Priority)
- Implement weapon enchantment specials (
fireBlade,frostBlade,lightningBlade,voidBlade) - Implement
worldThread/worldWeb("world effects" mechanic) - Wire up
spellEcho10in combat logic - Apply
weaponManaMax/weaponManaRegenor remove - Use
insightGainMultiplierincalcInsight() - Verify
comboMasterimplementation
Phase 5: Cleanup (Low Priority)
- Review and remove unused UI components
- Consolidate test files
- Review relationship between
effects.tsandupgrade-effects.ts
Verification Checklist
After each phase:
- Game builds without errors
- Game runs correctly in browser
- All tabs functional
- No console errors
- Tests pass (if any)
- Commit and push changes
Next Steps: Begin Phase 2 - Safe Deletions