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, }); },