diff --git a/src/lib/game/store.ts b/src/lib/game/store.ts index 35428a1..b34db30 100755 --- a/src/lib/game/store.ts +++ b/src/lib/game/store.ts @@ -880,6 +880,23 @@ export const useGameStore = create()( if (state.currentAction === 'meditate') { meditateTicks++; meditationMultiplier = getMeditationBonus(meditateTicks, state.skills); + + // MANA_CONDUIT: Meditation regenerates elemental mana + if (hasSpecial(effects, SPECIAL_EFFECTS.MANA_CONDUIT)) { + const elementalRegenPerTick = 0.1 * HOURS_PER_TICK; // 0.1 elemental mana per hour of meditation + elements = { ...state.elements }; + Object.keys(elements).forEach(elemId => { + if (elements[elemId]?.unlocked) { + elements[elemId] = { + ...elements[elemId], + current: Math.min( + elements[elemId].current + elementalRegenPerTick, + elements[elemId].max + ) + }; + } + }); + } } else { meditateTicks = 0; } @@ -1165,6 +1182,21 @@ export const useGameStore = create()( elements = afterCost.elements; totalManaGathered += spellDef.cost.amount; + // ELEMENTAL_RESONANCE: Using element spells restores 1 of that element + if (hasSpecial(effects, SPECIAL_EFFECTS.ELEMENTAL_RESONANCE) && spellDef.cost.element) { + const elemId = spellDef.cost.element; + if (elements[elemId]?.unlocked) { + elements = { + ...elements, + [elemId]: { + ...elements[elemId], + current: Math.min(elements[elemId].current + 1, elements[elemId].max) + } + }; + log = [`🔄 Elemental Resonance! +1 ${ELEMENTS[elemId]?.name || elemId} mana!`, ...log.slice(0, 49)]; + } + } + // Calculate damage let baseDmg = calcDamage(state, spellId, floorElement); @@ -1243,6 +1275,15 @@ export const useGameStore = create()( log = [`🔥 Berserker! +50% damage!`, ...log.slice(0, 49)]; } + // EXOTIC_MASTERY: +20% damage with exotic elements + if (hasSpecial(effects, SPECIAL_EFFECTS.EXOTIC_MASTERY) && spellDef.elem) { + const elemDef = ELEMENTS[spellDef.elem]; + if (elemDef?.cat === 'exotic') { + dmg *= 1.2; + log = [`🌟 Exotic Mastery! +20% damage!`, ...log.slice(0, 49)]; + } + } + // Spell echo - chance to cast again const echoChance = (skills.spellEcho || 0) * 0.1; if (Math.random() < echoChance) { @@ -1764,11 +1805,15 @@ export const useGameStore = create()( const cost = 500; if (state.rawMana < cost) return; + // ELEMENTAL_AFFINITY: New elements start with 10 capacity + const effects = getUnifiedEffects(state.skillUpgrades, state.skillTiers); + const newElementMax = hasSpecial(effects, SPECIAL_EFFECTS.ELEMENTAL_AFFINITY) ? 10 : 0; + set({ rawMana: state.rawMana - cost, elements: { ...state.elements, - [element]: { ...state.elements[element], unlocked: true }, + [element]: { ...state.elements[element], unlocked: true, max: newElementMax }, }, log: [`✨ ${ELEMENTS[element].name} affinity unlocked!`, ...state.log.slice(0, 49)], });