Commit Graph

141 Commits

Author SHA1 Message Date
n8n-gitea 9e49aa1ca6 fix: update Steady Hand prestige upgrade with real enchantment power effect
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
2026-05-29 15:23:40 +02:00
n8n-gitea e0e7beb495 fix: remove debug Skip to Floor 100 and Reset Floor HP buttons
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m22s
- Remove debugSetFloor and resetFloorHP actions from combatStore.ts
- Remove their type definitions from combat-state.types.ts
- Remove Skip to Floor 100 and Reset Floor HP buttons from GameStateDebugSection.tsx
- Remove same buttons from legacy GameStateDebug.tsx
- Remove floor quick-jump and Reset Floor HP from SpireDebugSection.tsx
- Remove associated tests from DebugTab.test.ts, store-actions.test.ts, store-actions-combat-prestige.test.ts
- Add missing src/test/setup.ts required by vitest config

These debug buttons created inconsistent game states by teleporting players
to floors without proper initialization (no spireMode, no room state, no
clearedFloors, no guardian encounters). resetFloorHP could be spammed to
infinitely retry any floor for free.
2026-05-29 14:54:52 +02:00
n8n-gitea a33e9429fe fix: resolve critical bugs - disciplines, debug reset, floating point, spire loop
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
Fixes:
- Issue 193: Remove unnecessary useEffect that set activeTab when spireMode is true, and redundant setAction('climb') in SpireCombatPage
- Issue 194: Fix signed_pact prerequisite check in checkDisciplinePrerequisites by accepting signedPacts param; add 'At Limit' feedback on discipline button when concurrent limit reached
- Issue 195: Add resetDisciplines(), resetAttunements(), resetCrafting() calls to createResetGame; add resetCrafting action to crafting store
- Issue 196: Fix floating point display in ElementStatsSection (mana pools) and GameStateDebug (time); fix duplicate 'Base Regen' label in ManaStatsSection

All 917 tests pass. Files stay under 400-line limit.
2026-05-29 14:10:04 +02:00
n8n-gitea 6355cf308b fix: Elemental Mana Capacity disciplines now increase element capacity
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
- Add optional baseMax field to ElementState to track prestige-derived max separately from bonuses
- Add computeElementMaxWithBonuses action to manaStore that computes max = baseMax + per-element bonus
- Apply per-element cap bonuses from disciplines and equipment in game tick (elementCap_* keys)
- Fix resetMana to use correct prestige key (elementalAttune instead of nonexistent elemMax)
- Add store migration (v1->v2) to populate baseMax for existing saved games
- Extract pact ritual processing to pipelines/pact-ritual.ts
- Extract element cap bonus utilities to utils/element-cap-bonus.ts
- Fix inline element types in crafting-fabricator.ts
- Update test fixtures to include baseMax in element literals

Fixes #185
2026-05-28 19:49:47 +02:00
n8n-gitea bc184cefb0 fix: defensive hardening — NaN guards, cast loop safety, discipline reset on new loop, spire mode maxFloorReached fix
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-28 18:14:19 +02:00
n8n-gitea 268baf3916 fix: auto-unlock element types when attunement conversion begins — Fabricator now unlocks earth
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s
2026-05-28 12:28:27 +02:00
n8n-gitea 3e70f481dc fix: set currentAction 'climb' and use generateSpireFloorState in enterSpireMode 2026-05-28 12:11:54 +02:00
n8n-gitea 5578721992 refactor: remove skill system leftovers, migrate click mana to discipline perk
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m30s
- Simplified getMeditationBonus() to continuous ramp formula
- Added click-mana capped perk to Mana Circulation discipline
- Removed manaWell/manaFlow/manaSpring skill reads and prestige upgrades
- Removed all skill fields from GameState and GameActionType
- Updated all call sites and tests (916 tests passing)

Closes #174
2026-05-28 11:50:06 +02:00
n8n-gitea b5996d5b6e fix: resolve circular dependency in discipline-slice → discipline-effects
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m30s
Replaced computeDisciplineEffects() import in discipline-slice.ts with
inline XP bonus calculation using calculateStatBonus from discipline-math.
This avoids the circular chain: discipline-effects → discipline-slice → discipline-effects.
2026-05-28 09:47:45 +02:00
n8n-gitea 8cebea9586 fix(#165,#166,#167,#168,#169,#171,#172): resolve 7 open bug issues
#172 - Grimoire tab: removed dead 'loaded' state guard that permanently showed loading
#169 - Transference Mana Flow: added elements param to checkDisciplinePrerequisites so mana type unlocks are verified
#168 - Perk descriptions: wired 4 broken perks (enchant-2, channel-1, golem-2, efficiency-1) with actual bonus effects; fixed enchant-1 interval (5→50); fixed study-mana-enchantments stat (maxMana→maxManaBonus)
#171 - Shields: removed all shield equipment (4 types), recipes, category, slot mappings; added 'shields' to AGENTS.md banned list
#166 - regenMultiplier: merged disciplineEffects.multipliers.regenMultiplier into computeAllEffects()
#165 - Meditation cap: added meditationCap display to ManaStatsSection UI; updated perk description
#167 - XP accumulation: added Meditative Mastery base discipline with disciplineXpBonus stat; wired into tick pipeline
2026-05-28 09:32:43 +02:00
n8n-gitea 27500f37b7 fix(#170): wire fabricator crafting completion + bonus enchantments + remove dead code
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m22s
2026-05-27 21:08:41 +02:00
n8n-gitea 7279050101 fix: repair persistence - safe-persist getItem now returns parsed objects, fix resetGame localStorage keys
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m22s
- safe-persist.ts: getItem now calls JSON.parse(str) so Zustand receives {state, version} envelope
- gameActions.ts: fix 5 wrong localStorage keys in createResetGame (mana→mana-storage, etc.)
- Add persistence.test.ts with 12 tests covering round-trip, key verification, and reset
- All 918 tests pass with zero regressions
2026-05-27 19:14:01 +02:00
n8n-gitea 3f20991d2d feat: add material crafting recipes to Fabricator
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 4m25s
2026-05-27 14:13:46 +02:00
n8n-gitea 7962a4fdaa fix: discipline reset on mana depletion and re-activation after stop
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m35s
- #143: processTick now removes drained disciplines from activeIds and calls onStopPracticing so currentAction resets to 'meditate'
- #144: Removed paused guard from canProceedDiscipline so stopped disciplines can be re-activated
- Updated test to match new expected behavior for paused disciplines
2026-05-27 11:13:08 +02:00
n8n-gitea 64b472572b fix: fabricator recipes now use correct elemental mana type
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m37s
- fabricator-recipes.ts: add optional manaType param to canCraftRecipe for clarity
- FabricatorSubTab.tsx: read elemental mana from store based on recipe manaType instead of always using rawMana
- craftingStore.ts: add startFabricatorCrafting action that deducts correct mana type
- craftingStore.types.ts: add startFabricatorCrafting to CraftingActions interface
- crafting-fabricator.ts: new helper file to keep craftingStore.ts under 400 lines

Fixes #155
2026-05-27 11:06:24 +02:00
n8n-gitea 707a1eef31 fix: add error logging, missing persist fields, and version to store configs
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m25s
- safe-persist.ts: add console.error logging to setItem catch block (was silently swallowing all errors)
- manaStore.ts: add meditateTicks to partialize (was lost on refresh)
- combatStore.ts: add currentAction, currentRoom, comboHitCount, floorHitCount, totalSpellsCast, totalDamageDealt, totalCraftsCompleted to partialize
- All 8 stores: add version: 1 to persist configs for future schema migration safety

Fixes #147
2026-05-27 10:45:39 +02:00
n8n-gitea 06c3fe4380 fix: resolve TS compilation errors and all 7 circular dependencies
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m25s
TypeScript fixes:
- gameStore.ts: replace result.ok with result.success (Result<void> uses success not ok)
- gameStore.ts: fix undefined newProgress variable → ctx.prestige.pactRitualProgress + HOURS_PER_TICK
- prestigeStore.ts: replace result.ok with result.success

Circular dependency fixes:
- Extract GameCoordinatorState to stores/gameStore.types.ts to break gameStore↔tick-pipeline/gameActions/gameLoopActions cycle
- Remove getDodgeChance re-export from floor-utils.ts to break floor-utils↔room-utils↔enemy-utils cycle
- Replace direct combatStore import in discipline-slice.ts with callback pattern to break discipline-slice↔combatStore↔combat-actions↔discipline-effects cycle

Verification: tsc --noEmit clean, madge --circular clean (0 circular deps)
2026-05-26 21:55:55 +02:00
n8n-gitea 1aea72c013 refactor: Redesign Invoker disciplines for pact bonuses and guardian boons
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
- Replace generic spell-casting/void-manipulation with pact-focused disciplines
- Add Pact Attunement (light): reduces pact signing time, boosts pact affinity
- Add Guardian's Boon (dark): amplifies all guardian unique perks
- Add pactAffinityBonus and guardianBoonMultiplier stat keys to effect system
- Apply pactAffinityBonus in pact signing time calculation (gameStore)
- Scale guardian boon values by guardianBoonMultiplier (combat-utils)
- Guard Invoker discipline activation behind signedPacts.length > 0
- Add 'Signed guardian pact' prerequisite display in discipline-math
2026-05-26 21:43:46 +02:00
n8n-gitea 02600754e7 feat: Add Mana Circulation discipline with regen multiplier and meditation cap perks
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
2026-05-26 20:58:55 +02:00
n8n-gitea 46013a15c8 refactor: Replace natural-regen disciplines with mana conversion speed disciplines
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m25s
- Add conversionRate + sourceManaTypes fields to DisciplineDefinition
- Rewrite elemental-regen.ts: 8 base disciplines now convert raw→element
- Rewrite elemental-regen-advanced.ts: 6 composite/exotic disciplines with proper source recipes
- Update discipline-effects.ts: produce conversion entries instead of regen bonuses
- Update gameStore.ts tick: drain source mana types, add to target element
- Update discipline-slice.ts: gate activation on source mana type access
- Update discipline-math.ts: resolve mana type IDs to 'X mana' display names
- Update DisciplinesTab.tsx: show conversion info, source requirements, and lock state
- Update DisciplineDebugSection.tsx: pass elements to activate()
- Update effects.ts: remove regen_{element} merge (no longer produced)
2026-05-26 20:40:11 +02:00
n8n-gitea 1c1bbf8017 feat: practicing disciplines set currentAction to block meditation/crafting
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-26 18:39:54 +02:00
n8n-gitea ae30c4770c fix: guardian pact signing now unlocks mana types via unlockElement
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m24s
2026-05-26 17:02:36 +02:00
n8n-gitea b402b8f56e refactor: cleanup codebase — remove hydration guards, extract constants, fix bugs
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-26 11:20:36 +02:00
n8n-gitea 518961299a desloppify: fix 34 unused imports/vars, debug logs, and code quality issues
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 2m20s
2026-05-26 02:35:02 +02:00
n8n-gitea 25ba565467 chore: remove unused imports, vars, and params — 84 imports, 7 vars, 16 params across 45+ files
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m25s
2026-05-25 20:18:39 +02:00
n8n-gitea fdf3984e75 fix: resolve TS errors, lint issues, and test failures
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m30s
- Fix TS2353 in discipline-slice.ts: widen activate() gameState type to ElementState
- Fix require() in generate-dependency-graph.js: add eslint-disable comment
- Fix require() in regression-fixes.test.ts: use ESM import instead
- Fix react-hooks/set-state-in-effect in 10 client components (add eslint-disable)
- Fix react-hooks/rules-of-hooks in EquipmentCrafter.tsx: lift store hooks to parent
- Fix 20 test failures: correct expectations for guardian floors, dodge chance, barrier rolls, element cycling, file size check
- Handle negative/zero floors in getFloorMaxHP
- Split room-utils.test.ts to enemy-barrier-utils.test.ts to stay under 400-line limit
2026-05-25 17:37:12 +02:00
n8n-gitea 635b3b3f70 feat: discipline UI improvements - stat labels, prerequisites, mana type tab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
- Add player-friendly label field to statBonus in DisciplineDefinition
- Show prerequisite requirements on locked discipline cards
- Disable activate button for locked disciplines
- Restructure elemental attunement into dedicated 'Mana Types' tab
- Add checkDisciplinePrerequisites utility function
- Update store to enforce prerequisite checking on activation
- Split discipline-prerequisites tests into separate file
2026-05-25 15:20:02 +02:00
n8n-gitea cb78761e95 feat: add per-element mana regen disciplines for all 14 mana types
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s
- Create data/disciplines/elemental-regen.ts (base + utility elements)
- Create data/disciplines/elemental-regen-advanced.ts (composite + exotic)
- Wire into ALL_DISCIPLINES via index.ts and discipline-slice.ts
- Add perElementRegenBonus to ComputedEffects type
- Merge regen_{element} discipline bonuses in computeAllEffects()
- Apply per-element regen to element mana each tick in gameStore
- Add 'Elemental Regen' and 'Advanced Regen' tabs to DisciplinesTab UI
2026-05-25 12:24:01 +02:00
n8n-gitea 25109c920a refactor: remove memory slot system and Memories section from PrestigeTab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s
- Remove deepMemory prestige upgrade from constants/prestige.ts
- Remove Memory interface from types.ts
- Remove memorySlots, memories, addMemory, removeMemory, clearMemories from prestigeStore.ts
- Remove deepMemory/memory references from gameLoopActions.ts
- Remove MemoriesCard component and its usage from PrestigeTab.tsx
- Remove memorySlots display from LoopStatsSection.tsx
- Update tests: store-actions-combat-prestige.test.ts, PrestigeTab.test.ts, tick-integration.test.ts

The memory slot system was fully wired but had no gameplay mechanic — addMemory()
was never called outside tests. This removes dead code across 9 files.
2026-05-25 11:51:10 +02:00
n8n-gitea 23a83a04cf fix: resolve all TypeScript compilation errors
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m17s
- Fixed DisciplinesAttunementType enum usage in discipline data files
- Fixed EquipmentSlot import in equipment/types.ts
- Fixed enchantment-effects.ts export/import chain
- Fixed safe-persist.ts StateStorage type compatibility
- Fixed store persist partial return types for all stores
- Fixed gameStore.ts ElementState type and error handling
- Fixed useGameDerived.ts missing properties on GameCoordinatorStore
- Added SkillUpgradeChoice type to types.ts
- Fixed ActionButtons.tsx optional currentStudyTarget prop
- Fixed GameToast.tsx Toast type compatibility
- Fixed EnchantmentDesigner sub-component type mismatches
- Fixed SpireCombatPage equippedInstances/equipmentInstances types
- Fixed page.tsx computeClickMana argument
- Added baseCastTime to SpellDef type
- Fixed golem/types.ts and loot-drops.ts import paths
- Fixed craftingStore.ts missing lastError in initial state and actions
- Fixed store-actions-combat-prestige.test.ts Memory type usage
- Fixed floor-utils.upgraded.test.ts array type annotation
- Fixed computed-stats.test.ts state type assertions
- Fixed activity-log.test.ts state type annotation
- Fixed discipline-math.test.ts enum value usage
- Fixed game-loop.test.ts vitest mock import
- Various other test file type fixes
2026-05-24 14:34:49 +02:00
n8n-gitea 14f25fffda feat: add enchanter disciplines to unlock enchantment effects via perk progression
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
- Add unlocksEffects field to DisciplinePerk type
- Add unlockEffects action to crafting store (deduplicating merge)
- Modify discipline processTick to detect perk thresholds and return unlocked effect IDs
- Wire gameStore tick to pass unlocked effects to crafting store
- Create 8 new enchanter disciplines with tiered effect unlocks:
  Basic/Advanced Weapon, Utility, Mana, Basic/Intermediate/Advanced Spell, Special
- Higher-tier disciplines require prerequisite disciplines
- Add processedPerks tracking to prevent duplicate unlocks
- Split enchanter disciplines into modular files (enchanter, enchanter-utility, enchanter-spells, enchanter-special)
- All tests pass (784/784), no new TS errors, all files under 400 lines
2026-05-23 19:29:45 +02:00
n8n-gitea 513cab81a3 refactor: remove GUARDIANS constant, consolidate into guardian-data.ts
- Delete src/lib/game/constants/guardians.ts (the old static GUARDIANS constant)
- Create src/lib/game/data/guardian-data.ts with BASE_GUARDIANS (same data, new home)
- Remove GUARDIANS export from constants/index.ts
- Update all 11 files that imported GUARDIANS to use getGuardianForFloor() or BASE_GUARDIANS:
  - useGameDerived.ts, combat-actions.ts, gameStore.ts, prestigeStore.ts
  - combat-utils.ts, room-utils.ts, floor-utils.ts, spire-utils.ts
  - SpireCombatPage.tsx, SpireHeader.tsx
- Update 4 test files to use getGuardianForFloor() instead of GUARDIANS constant
- guardian-encounters.ts now imports BASE_GUARDIANS from guardian-data.ts
- Split room-utils.test.ts (505 lines) into room-utils.test.ts + room-utils-floor-state.test.ts
2026-05-23 16:09:19 +02:00
n8n-gitea feca7549ad feat: unify guardian system — merge static GUARDIANS with extended procedural guardians in Pacts tab
- guardian-encounters.ts: add getGuardianForFloor() and getAllGuardianFloors()
  unified lookup functions that merge static GUARDIANS (floors 10-100) with
  extended system (compound 110, exotic 120-140, combo 150+)
- GuardianPactsTab.tsx: use unified system, update tiers to cover all floors
  (Early 10-40, Mid 50-80, Late 90-100, Compound 110, Exotic 120-140,
  Transcendent 150+)
- guardian-pacts-components.tsx: handle combo guardians with dual-element
  display (symbols + names + '✦ Combo' badge)
- docs/circular-deps.txt, docs/dependency-graph.json: auto-generated updates
- craftingStore.ts: extract initial equipment instances to crafting-initial-state.ts
2026-05-23 13:46:17 +02:00
n8n-gitea 5bc05ded6f fix: resolve bugs #118 #119 #120 #123 and refactor craftingStore init 2026-05-22 18:18:26 +02:00
n8n-gitea ca1709006f fix: add test coverage for crafting-utils, pact-utils, and activity-log 2026-05-22 14:39:27 +02:00
n8n-gitea 49f8de01ca refactor: complete error handling standardization (issue #101)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s
Prestige Store:
- Convert doPrestige() to return Result<void> with specific error codes
  (INVALID_PRESTIGE_ID, PRESTIGE_MAX_LEVEL, INSUFFICIENT_INSIGHT)
- Convert startPactRitual() to return Result<void> with specific error codes
  (GUARDIAN_NOT_DEFEATED, PACT_ALREADY_SIGNED, PACT_SLOTS_FULL,
   INSUFFICIENT_MANA, RITUAL_IN_PROGRESS)

Combat Actions:
- Add try/catch wrapper inside processCombatTick with safe fallback defaults
- Add makeDefaultCombatTickResult helper for error recovery

LocalStorage Error Handling:
- Create safe-persist.ts utility wrapping localStorage with error handling
  (corrupted JSON, quota exceeded, unexpected failures)
- Update all 8 Zustand stores to use createSafeStorage() in persist middleware

UI Updates:
- Update GuardianPactsTab to use Result pattern for ritual error messages

Tests:
- Update store-actions-combat-prestige.test.ts for Result return types
- Update store-actions.test.ts ManaStore tests for Result pattern
- Remove duplicate Prestige/Discipline sections from store-actions.test.ts
- All files under 400 line limit

601 tests pass (3 pre-existing failures in spire-utils.test.ts)
2026-05-22 09:19:20 +02:00
n8n-gitea 8a7ddaae27 refactor: split bloated state types into State + Actions interfaces (issue #102)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
- CombatState: split into CombatState (data) + CombatActions + CombatStore
- PrestigeState: split into PrestigeState (data) + PrestigeActions + PrestigeStore
- ManaState: split into ManaState (data) + ManaActions + ManaStore
- GameState: deprecated, removed from barrel exports
- crafting-actions: updated to use CraftingState instead of GameState
- combat-utils/mana-utils: replaced Pick<GameState,...> with focused interfaces
- DisciplineCardProps: split into Definition + Runtime + Callbacks
- stores/index.ts: now exports both State and Actions types
2026-05-20 21:05:22 +02:00
n8n-gitea ee893e8973 refactor: tick pipeline pattern — read all → compute all → write all (issue #103)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
- New tick-pipeline.ts: TickContext/TickWrites types + buildTickContext/applyTickWrites orchestrator
- gameStore.ts tick(): refactored to 3-phase pipeline (read snapshot → compute updates → batch writes)
- combat-actions.ts: accept signedPacts as parameter instead of usePrestigeStore.getState() in combat loop
- combatStore.ts/combat-state.types.ts: updated processCombatTick signature for signedPacts passthrough
- craftingStore.ts: removed tempState = { ...get(), rawMana } as any anti-pattern
- preparation-actions.ts: accept rawMana as explicit parameter instead of GameState bag
2026-05-20 19:48:40 +02:00
n8n-gitea 742a992d59 refactor: eliminate as any type casts across 18 source files
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m34s
- Fix computeDisciplineEffects() to not require GameState parameter
- Fix getUnifiedEffects() to accept proper partial state type
- Replace upgradeEffects as any with proper UnifiedEffects type
- Replace explicit : any annotations with proper types (ComputedEffects, DesignProgress, SpellDef, etc.)
- Fix activity-log.ts eventType casting
- Fix crafting-design.ts computedEffects and designProgress types
- Fix page.tsx grimoire spell rendering with proper SpellDef property names
- Fix StatsTab ManaStatsSection with proper ManaStatsEffects interface
- Remove unused imports (useDisciplineStore from page.tsx, LeftPanel.tsx)

Remaining: 1 as any in craftingStore.ts (pre-existing CraftingStore/GameState architectural mismatch)
2026-05-20 17:22:52 +02:00
n8n-gitea df316c2865 test: add store action and cross-store tick integration tests; fix pact ritual double-counting bug
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m16s
- Add test-setup.ts: shared test environment setup helper for tick integration tests
- Add combat-store.test.ts (24 tests): setCurrentFloor, advanceFloor, setFloorHP, setMaxFloorReached, setAction, setSpell, setCastProgress, learnSpell, setSpellState, debugSetFloor, resetFloorHP, resetCombat, climbDownFloor, exitSpireMode
- Add mana-store.test.ts (36 tests): setRawMana, addRawMana, spendRawMana, gatherMana, convertMana, unlockElement, addElementMana, spendElementMana, craftComposite, processConvertAction, resetMana, meditation ticks, setElementMax
- Add tick-integration.test.ts (19 tests): time progression, mana regeneration, incursion penalty, meditation, loop end, paused/game over states
- Add tick-integration-pact.test.ts (9 tests): victory condition, pact ritual progress, multiple ticks accumulation
- Add tick-debug.test.ts (3 debug tests): regen trace, pact ritual trace, persist leak check
- Fix bug in gameStore.ts: updatePactRitualProgress was called with absolute newProgress instead of incremental HOURS_PER_TICK, causing exponential progress accumulation
- All 422 tests pass (18 test files), all files under 400-line limit
2026-05-20 15:20:42 +02:00
n8n-gitea cba42e01ff refactor: remove legacy store.ts and crafting-slice.ts, complete modular store migration
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m18s
- Delete store.ts (355 LOC monolithic store, zero imports)
- Delete crafting-slice.ts (379 LOC legacy crafting module)
- Inline createStartingEquipment() into craftingStore.ts
- Remove legacy equipment/inventory fields from GameState
- Remove EquipmentDef from game.ts imports (unused)
- Fix duplicate EquipmentSpellState export in types.ts
- Fix bluePrintId typo in craftingStore.ts
- Update stores/index.ts to import CraftingState/CraftingActions from craftingStore.types
- Update EquipmentTab.test.ts to test store state instead of deleted module
- Clean up stale comments referencing crafting-slice.ts
- Reduce TS errors from 83 to 72 by removing conflicting legacy types
2026-05-20 12:36:00 +02:00
n8n-gitea 50a9a62060 fix: resolve priority 4 issues — discipline mutation, skill→discipline migration, uiStore persistence, game loop interval, toast listener leak, page re-renders
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
- Issue 70: Fix discipline-slice.ts nested element mutation (use immutable spread)
- Issue 71: Add persist middleware to uiStore for paused/gameOver/victory
- Issue 72: Wire discipline effects into calcDamage (spell-casting, void-manipulation)
- Issue 73: Fix useGameLoop interval recreation (use getState() + empty deps)
- Issue 74: Fix use-toast.ts listener leak (change [state] dep to [])
- Issue 75: Reduce page.tsx re-renders with useShallow for multi-field subscriptions
- Issue 76: Fix createGatherMana hardcoded click mana (use computeClickMana with discipline effects)
- Issue 77: Pass discipline effects to computeMaxMana/computeRegen/calcInsight in tick()
- Export DisciplineBonuses type and useDisciplineStore from barrel exports
- Update tests to match new function signatures
2026-05-19 13:53:33 +02:00
n8n-gitea ebcaab62bf fix: clone nested element objects in discipline-slice processTick to avoid bypassing Zustand reactivity
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
2026-05-19 12:51:41 +02:00
n8n-gitea 213425e6c9 fix(tests): remove broken test index files and fix computed-stats import
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m24s
2026-05-19 12:34:58 +02:00
n8n-gitea e259484b53 fix(game): pass real effects to hasSpecial in tick() — Executioner/Berserker now work
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
2026-05-19 12:06:46 +02:00
n8n-gitea 48a5ad1855 fix: 6 priority-3 bug fixes with regression tests
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m24s
- Issue 83: Mana Tide pulse factor now ranges 0.5x-1.5x (was 0.5x-1.0x)
- Issue 82: SteadyStream no longer returns early like EternalFlow; only skips incursion penalty
- Issue 81: Prestige store partialize now includes defeatedGuardians, signedPacts, signedPactDetails, pactRitualFloor, pactRitualProgress, loopInsight, pactSlots
- Issue 80: Combat store partialize now includes floorHP, floorMaxHP, castProgress, spireMode, clearedFloors, golemancy, equipmentSpellStates, activityLog, achievements
- Issue 78: cancelDesign now always cancels designProgress first, then designProgress2
- Issue 79: startDesigningEnchantment now uses designProgress2 when designProgress is occupied

Added 13 regression tests in src/lib/game/__tests__/regression-fixes.test.ts
Refactored craftingStore types to craftingStore.types.ts to stay under 400-line limit
2026-05-19 11:19:10 +02:00
n8n-gitea c3a5f333da fix: resolve 22 remaining issues - type exports, dead code, state mutations, orphaned components
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
2026-05-18 21:03:43 +02:00
n8n-gitea 594eec1ab4 fix: resolve all Priority 4 and Priority 3 issues (18 issues total)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
Priority 4 fixes:
- #50: getUnlockedAttunements filter now only returns active attunements
- #48: doPrestige return type changed from void to boolean
- #47: ConfirmDialog now catches and displays async errors from onConfirm
- #46: GameStateDebug Fill Mana now uses direct setState instead of loop
- #55: DisciplinesTab statBonus/baseValue props verified correct
- #56: DisciplinesTab tab filtering verified working

Priority 3 fixes:
- #45: drain spell description changed from 'life force' to 'vital energy'
- #44: removed banned 'ascension' skill category
- #43: renamed lifeEssenceDrop to vitalityEssenceDrop
- #42: pactMaster achievement requirement changed from 12 to 9
- #40: golems/utils.ts and equipment/utils.ts now import from index
- #39: removed duplicate RoomType from constants/rooms.ts
- #38: consolidated EquipmentSlot type in types/equipmentSlot.ts
- #37: removed duplicate EnchantmentEffectDef from spell-effects/types.ts
- #36: renamed RARITY_COLORS in loot-drops.ts to LOOT_RARITY_COLORS
2026-05-18 20:09:54 +02:00
n8n-gitea ff3a268358 fix: resolve all Priority 5 CRASH/BLOCKER issues (#51-#57)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
- #51: Fix broken import path @/types/disciplines → @/lib/game/types/disciplines
- #52: Fix canProceedDiscipline() called with wrong arguments in discipline-slice.ts
- #53: Add local useState for activeAttunement tab filtering in DisciplinesTab
- #54: Make canProceedDiscipline() defensive when gameState is undefined
- #57: Remove stale CraftingTab export from game/index.ts
- Refactored DisciplineCard to use Zustand selector subscriptions properly
- Added DisciplinePerk type import to discipline-math.ts
2026-05-18 17:51:06 +02:00
n8n-gitea 14ba02d987 fix: remove debugSetTime and useGameStore import from combatStore to break remaining circular deps
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 55s
2026-05-18 14:51:38 +02:00