Phase 4: Element special effects (4)
This commit is contained in:
+46
-1
@@ -880,6 +880,23 @@ export const useGameStore = create<GameStore>()(
|
|||||||
if (state.currentAction === 'meditate') {
|
if (state.currentAction === 'meditate') {
|
||||||
meditateTicks++;
|
meditateTicks++;
|
||||||
meditationMultiplier = getMeditationBonus(meditateTicks, state.skills);
|
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 {
|
} else {
|
||||||
meditateTicks = 0;
|
meditateTicks = 0;
|
||||||
}
|
}
|
||||||
@@ -1165,6 +1182,21 @@ export const useGameStore = create<GameStore>()(
|
|||||||
elements = afterCost.elements;
|
elements = afterCost.elements;
|
||||||
totalManaGathered += spellDef.cost.amount;
|
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
|
// Calculate damage
|
||||||
let baseDmg = calcDamage(state, spellId, floorElement);
|
let baseDmg = calcDamage(state, spellId, floorElement);
|
||||||
|
|
||||||
@@ -1243,6 +1275,15 @@ export const useGameStore = create<GameStore>()(
|
|||||||
log = [`🔥 Berserker! +50% damage!`, ...log.slice(0, 49)];
|
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
|
// Spell echo - chance to cast again
|
||||||
const echoChance = (skills.spellEcho || 0) * 0.1;
|
const echoChance = (skills.spellEcho || 0) * 0.1;
|
||||||
if (Math.random() < echoChance) {
|
if (Math.random() < echoChance) {
|
||||||
@@ -1764,11 +1805,15 @@ export const useGameStore = create<GameStore>()(
|
|||||||
const cost = 500;
|
const cost = 500;
|
||||||
if (state.rawMana < cost) return;
|
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({
|
set({
|
||||||
rawMana: state.rawMana - cost,
|
rawMana: state.rawMana - cost,
|
||||||
elements: {
|
elements: {
|
||||||
...state.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)],
|
log: [`✨ ${ELEMENTS[element].name} affinity unlocked!`, ...state.log.slice(0, 49)],
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user