From 75026fcb0b3a812f0ab649deb4f23c8d7117d34a Mon Sep 17 00:00:00 2001 From: zhipu Date: Fri, 27 Mar 2026 16:01:52 +0000 Subject: [PATCH] feat: Implement attunement mana conversion - Add auto-conversion of raw mana to primary mana types in tick - Each attunement converts raw mana at its defined rate - Conversion scales with attunement level (+10% per level) - Update state in tick to track primaryMana changes --- src/lib/game/store.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/lib/game/store.ts b/src/lib/game/store.ts index fb21f33..c49411c 100755 --- a/src/lib/game/store.ts +++ b/src/lib/game/store.ts @@ -467,6 +467,35 @@ export const useGameStore = create()( // Increment total ticks early (needed for study tracking) const newTotalTicks = state.totalTicks + 1; + // ─── Attunement Mana Conversion ─── + // Auto-convert raw mana to primary mana types based on unlocked attunements + let primaryMana = { ...state.primaryMana }; + const attunements = state.attunements; + + for (const [attunementType, attunementState] of Object.entries(attunements)) { + if (!attunementState.unlocked) continue; + + const def = ATTUNEMENTS[attunementType as AttunementType]; + if (!def || !def.primaryManaType) continue; // Skip Invoker (no primary) + + const manaType = def.primaryManaType; + const currentPrimary = primaryMana[manaType] || 0; + const maxPrimary = state.primaryManaMax[manaType] || 50; + + if (currentPrimary >= maxPrimary) continue; // Already at max + + // Calculate conversion: autoConvertRate per hour, scaled by level + const conversionRate = def.autoConvertRate * (1 + attunementState.level * 0.1); + const conversionAmount = conversionRate * HOURS_PER_TICK; + + // Convert from raw mana (costs 1 raw per 1 primary) + if (rawMana >= conversionAmount) { + const actualConvert = Math.min(conversionAmount, maxPrimary - currentPrimary); + rawMana -= actualConvert; + primaryMana[manaType] = Math.min(currentPrimary + actualConvert, maxPrimary); + } + } + // Study progress let currentStudyTarget = state.currentStudyTarget; let skills = state.skills; @@ -937,6 +966,7 @@ export const useGameStore = create()( achievements, totalDamageDealt, totalSpellsCast, + primaryMana, }); return; } @@ -970,6 +1000,7 @@ export const useGameStore = create()( consecutiveStudyHours, studyStartedAt, lastStudyCost, + primaryMana, ...craftingUpdates, }); },