Commit Graph

367 Commits

Author SHA1 Message Date
n8n-gitea ae691d2367 docs: update discipline count to 64 in GAME_BRIEFING.md
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m24s
2026-05-30 00:16:16 +02:00
n8n-gitea e3ce18c601 feature: add new composite and exotic mana types (ticket #202)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 17s
2026-05-29 21:51:45 +02:00
n8n-gitea 7bd28e2085 feat: guardian defensive stats — shield, barrier, health regen + stat label renames
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
2026-05-29 18:18:00 +02:00
n8n-gitea 71c68443c4 feat: restructure guardian progression system with dynamic element support
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-29 17:18:13 +02:00
n8n-gitea 644b76f16d feat: add fabricator disciplines for recipe unlocks
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
- Add unlocksRecipes field to DisciplinePerk type
- Add study-fabricator-recipes discipline (earth/metal/sand/crystal recipes)
- Add study-wizard-branch discipline (wizard equipment recipes)
- Add study-physical-branch discipline (physical combat equipment recipes)
- Collect unlocksRecipes during discipline tick processing
- Pass recipe unlocks to crafting store via gameStore
- Add unlockRecipes action to craftingStore with persistence
- Filter fabricator recipes by unlock status in FabricatorSubTab UI
2026-05-29 15:42:09 +02:00
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 06241e1e9a fix: show 0 instead of em-dash for golem slots when Fabricator is locked
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m18s
2026-05-29 15:09:58 +02:00
n8n-gitea 712357230c fix: remove redundant equipment type name in EquipmentSlotGrid
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s
2026-05-29 15:07:02 +02:00
n8n-gitea 86c80a25ca feat: scale guardian pact cost with HP, power, and armor
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m24s
2026-05-29 15:00:50 +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 e20216bda5 feat: redesign Elemental subtab in DisciplinesTab to group by mana type
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-28 21:24:06 +02:00
n8n-gitea adeb106428 fix: resolve issues #188, #189, #190, #191 - EffectSelector gating, discipline tab completeness, and stat bonus integration
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
2026-05-28 21:01:28 +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 8fef73d233 fix: discipline tab NaN display — correct statBonus.baseValue destructuring, rate-aware /sec labels, NaN guards
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
- Fix root cause: baseValue was undefined (destructured from definition
  instead of statBonus.baseValue), causing calculateStatBonus to produce NaN
- Remove hardcoded /sec suffix from stat bonus display; now detects rate
  vs flat stats using isRateStat() helper
- Fix computePerkCurrentEffect: perks only show /sec for actual rate stats
- Add NaN guards in DisciplineCard display layer as safety net
- Clean up DisciplinesTab UX (proper summary label, remove unused rawMana)
2026-05-28 18:38:28 +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 13c185a216 feat: add DebugName wrappers to 56 components + redesign attunement cards + remove ScrollArea from AttunementsTab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m31s
2026-05-28 15:28:18 +02:00
n8n-gitea 9671078fea fix: improve Discipline tab UX - remove confusing base cost label, convert drain to /sec, show computed perk effects and perk-augmented stat totals, fix /tick label suffixes in data
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
2026-05-28 13:45:22 +02:00
n8n-gitea 26639746e9 discipline: elemental revamp - rename, lock, merge tabs, add missing, dedupe
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m22s
2026-05-28 13:15:14 +02:00
n8n-gitea 4fa11cea41 fix: add DebugName wrapper to DisciplinesTab for Show Component Names debug flag
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
2026-05-28 12:41:14 +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 aba1265cbc fix: remove combat action guard from craftMaterial — material crafting is instant and should work in any combat state
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m27s
2026-05-28 12:18:52 +02:00
n8n-gitea 500955db16 chore: update docs from pre-commit hook
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s
2026-05-28 12:12:52 +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 5f8a860a3c fix: pass rawMana to discipline activate to allow re-practicing after stop
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-27 15:57:17 +02:00
n8n-gitea 5e76fe7145 feat: add wizard and physical gear branches to Fabricator
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
- Split fabricator-recipes.ts into 4 files (all under 400 lines):
  - fabricator-recipes.ts: core/elemental equipment recipes + helpers
  - fabricator-wizard-recipes.ts: 7 wizard branch recipes (staffs, circlet, robe, catalyst, pendant)
  - fabricator-physical-recipes.ts: 9 physical branch recipes (blades, helm, robe, boots, gauntlets, shields)
  - fabricator-material-recipes.ts: 12 material crafting recipes
- Added branch filter UI (All/Elemental/Wizard/Physical) to FabricatorSubTab
- All 902 tests pass
2026-05-27 15:22:16 +02:00
n8n-gitea 9a2da67006 feat: add material crafting recipes to Fabricator
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
2026-05-27 14:39:44 +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 cbeb0b50ad fix: replace arcaneShard with elementally attuned materials in Fabricator recipes
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m32s
2026-05-27 12:56:06 +02:00
n8n-gitea 2c88d3c395 feat: replace Metal Kite Shield with Metal Spell Focus offhand
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m31s
2026-05-27 12:39:55 +02:00
n8n-gitea 5f46948568 fix: rebalance golem stats for proper tier progression
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m32s
2026-05-27 12:30:36 +02:00
n8n-gitea 78766d0722 fix: replace meaningless fabricator recipe stats with mana-focused stats
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m32s
2026-05-27 12:26:16 +02:00
n8n-gitea badd233c63 feat: expand golem stat abbreviations and add special abilities display
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m31s
2026-05-27 12:20:44 +02:00
n8n-gitea a47d6568f7 fix: audit and fix discipline descriptions to match actual effects
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m29s
2026-05-27 12:13:51 +02:00
n8n-gitea 32cebad403 feat: add discipline and perks section to Stats tab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m34s
2026-05-27 12:04:11 +02:00
n8n-gitea a6dd9479b3 fix: perks now show human-readable descriptions instead of type-idx strings
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m31s
2026-05-27 11:43:55 +02:00
n8n-gitea 428d308ed3 fix: two-handed weapons no longer show off-hand slot option in Equipment tab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m31s
2026-05-27 11:40:35 +02:00
n8n-gitea a8fab1eb86 fix: make guardian names deterministic per floor instead of using Math.random()
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m37s
- generateGuardianName() now takes a floor parameter and uses floor % prefixes.length for deterministic prefix selection
- generateComboGuardianName() now takes a floor parameter and uses (floor + i) % prefixes.length for each element
- getGuardianForFloor() passes floor to generateGuardianName for static guardians with empty names
- getExtendedGuardian() passes floor to generateComboGuardianName for combo guardians
- Removes dependency on Math.random() → names are stable across ticks/refreshes

Fixes #161
2026-05-27 11:26:28 +02:00
n8n-gitea 8df3be5628 fix: invoker disciplines use raw mana, fabricator uses earth
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m34s
- #151: Changed invoker disciplines (pact-attunement, guardians-boon) from light/dark to raw
- #150: Changed crafting-efficiency from sand to earth
2026-05-27 11:18:31 +02:00
n8n-gitea 964619b975 fix: enchanter disciplines now use transference mana
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m46s
- Changed manaType from elemental to 'transference' for 9 enchanter disciplines:
  - enchanter.ts: mana-channeling, study-basic-weapon-enchantments, study-advanced-weapon-enchantments
  - enchanter-utility.ts: study-utility-enchantments, study-mana-enchantments
  - enchanter-spells.ts: study-basic-spell-enchantments, study-intermediate-spell-enchantments, study-advanced-spell-enchantments
  - enchanter-special.ts: study-special-enchantments
- Fixed misleading description in mana-channeling discipline
2026-05-27 11:16:33 +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 2fa16c5749 fix: correct circular dep detection in pre-commit hook
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m30s
The generate-dependency-graph.js script was counting madge's
'Processed N files' info line as a circular chain. Fixed the
filter to only match lines starting with 'N)' pattern.
2026-05-26 21:57:50 +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