feat: add prestige system and skill upgrades with comprehensive documentation
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 5m57s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 5m57s
This commit is contained in:
+42
-12
@@ -1,4 +1,4 @@
|
||||
// ─── Unified Effect System ─────────────────────────────────────────────────────────
|
||||
// ─── Unified Effect System ─────────────────────────────────────────────────
|
||||
// This module consolidates ALL effect sources into a single computation:
|
||||
// - Skill upgrade effects (from milestone upgrades)
|
||||
// - Equipment enchantment effects (from enchanted gear)
|
||||
@@ -6,19 +6,25 @@
|
||||
|
||||
import type { GameState, EquipmentInstance } from './types';
|
||||
import { ENCHANTMENT_EFFECTS } from './data/enchantment-effects';
|
||||
import { computeEffects, hasSpecial, SPECIAL_EFFECTS, type ComputedEffects } from './upgrade-effects';
|
||||
import { computeEffects } from './upgrade-effects';
|
||||
import { hasSpecial, SPECIAL_EFFECTS } from './special-effects';
|
||||
import type { ComputedEffects } from './upgrade-effects.types';
|
||||
|
||||
// Re-export for convenience
|
||||
export { computeEffects, hasSpecial, SPECIAL_EFFECTS, type ComputedEffects };
|
||||
export { computeEffects } from './upgrade-effects';
|
||||
export { hasSpecial, SPECIAL_EFFECTS } from './special-effects';
|
||||
export type { ComputedEffects } from './upgrade-effects.types';
|
||||
|
||||
// ─── Equipment Effect Computation ────────────────────────────────────────────────
|
||||
// ─── Equipment Effect Computation ────────────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Compute all effects from equipped enchantments
|
||||
* @param enchantmentPowerMultiplier - Multiplier applied to all enchantment effect values (default 1.0)
|
||||
*/
|
||||
export function computeEquipmentEffects(
|
||||
equipmentInstances: Record<string, EquipmentInstance>,
|
||||
equippedInstances: Record<string, string | null>
|
||||
equippedInstances: Record<string, string | null>,
|
||||
enchantmentPowerMultiplier: number = 1.0
|
||||
): {
|
||||
bonuses: Record<string, number>;
|
||||
multipliers: Record<string, number>;
|
||||
@@ -43,17 +49,27 @@ export function computeEquipmentEffects(
|
||||
|
||||
if (effect.type === 'bonus' && effect.stat && effect.value) {
|
||||
// Bonus effects add to the stat
|
||||
bonuses[effect.stat] = (bonuses[effect.stat] || 0) + effect.value * ench.stacks;
|
||||
// Apply enchantmentPowerMultiplier to the effect value
|
||||
const adjustedValue = effect.value * enchantmentPowerMultiplier;
|
||||
// Handle per-element capacity bonuses (stat format: elementCap_fire, elementCap_water, etc.)
|
||||
if (effect.stat.startsWith('elementCap_')) {
|
||||
const element = effect.stat.replace('elementCap_', '');
|
||||
bonuses[`elementCap_${element}`] = (bonuses[`elementCap_${element}`] || 0) + adjustedValue * ench.stacks;
|
||||
} else {
|
||||
bonuses[effect.stat] = (bonuses[effect.stat] || 0) + adjustedValue * ench.stacks;
|
||||
}
|
||||
} else if (effect.type === 'multiplier' && effect.stat && effect.value) {
|
||||
// Multiplier effects multiply together
|
||||
// For multipliers, we need to track them separately and apply as product
|
||||
// Apply enchantmentPowerMultiplier to the effect value
|
||||
const adjustedValue = effect.value * enchantmentPowerMultiplier;
|
||||
const key = effect.stat;
|
||||
if (!multipliers[key]) {
|
||||
multipliers[key] = 1;
|
||||
}
|
||||
// Each stack applies the multiplier
|
||||
for (let i = 0; i < ench.stacks; i++) {
|
||||
multipliers[key] *= effect.value;
|
||||
multipliers[key] *= adjustedValue;
|
||||
}
|
||||
} else if (effect.type === 'special' && effect.specialId) {
|
||||
specials.add(effect.specialId);
|
||||
@@ -64,7 +80,7 @@ export function computeEquipmentEffects(
|
||||
return { bonuses, multipliers, specials };
|
||||
}
|
||||
|
||||
// ─── Unified Computed Effects ────────────────────────────────────────────────────
|
||||
// ─── Unified Computed Effects ─────────────────────────────────────────────────
|
||||
|
||||
export interface UnifiedEffects extends ComputedEffects {
|
||||
// Equipment bonuses
|
||||
@@ -85,8 +101,21 @@ export function computeAllEffects(
|
||||
// Get skill upgrade effects
|
||||
const upgradeEffects = computeEffects(skillUpgrades, skillTiers);
|
||||
|
||||
// Get equipment effects
|
||||
const equipmentEffects = computeEquipmentEffects(equipmentInstances, equippedInstances);
|
||||
// Get equipment effects, applying the enchantment power multiplier
|
||||
const equipmentEffects = computeEquipmentEffects(
|
||||
equipmentInstances,
|
||||
equippedInstances,
|
||||
upgradeEffects.enchantmentPowerMultiplier
|
||||
);
|
||||
|
||||
// Extract per-element capacity bonuses from equipment effects
|
||||
const perElementCapBonus: Record<string, number> = { ...upgradeEffects.perElementCapBonus };
|
||||
for (const [key, value] of Object.entries(equipmentEffects.bonuses)) {
|
||||
if (key.startsWith('elementCap_')) {
|
||||
const element = key.replace('elementCap_', '');
|
||||
perElementCapBonus[element] = (perElementCapBonus[element] || 0) + value;
|
||||
}
|
||||
}
|
||||
|
||||
// Merge the effects
|
||||
const merged: UnifiedEffects = {
|
||||
@@ -97,6 +126,7 @@ export function computeAllEffects(
|
||||
clickManaBonus: upgradeEffects.clickManaBonus + (equipmentEffects.bonuses.clickMana || 0),
|
||||
baseDamageBonus: upgradeEffects.baseDamageBonus + (equipmentEffects.bonuses.baseDamage || 0),
|
||||
elementCapBonus: upgradeEffects.elementCapBonus + (equipmentEffects.bonuses.elementCap || 0),
|
||||
perElementCapBonus,
|
||||
// Merge equipment multipliers with upgrade multipliers
|
||||
maxManaMultiplier: upgradeEffects.maxManaMultiplier * (equipmentEffects.multipliers.maxMana || 1),
|
||||
regenMultiplier: upgradeEffects.regenMultiplier * (equipmentEffects.multipliers.regen || 1),
|
||||
@@ -105,7 +135,7 @@ export function computeAllEffects(
|
||||
attackSpeedMultiplier: upgradeEffects.attackSpeedMultiplier * (equipmentEffects.multipliers.attackSpeed || 1),
|
||||
elementCapMultiplier: upgradeEffects.elementCapMultiplier * (equipmentEffects.multipliers.elementCap || 1),
|
||||
// Merge specials
|
||||
specials: new Set([...upgradeEffects.specials, ...equipmentEffects.specials]),
|
||||
specials: new Set([...Array.from(upgradeEffects.specials), ...Array.from(equipmentEffects.specials)]),
|
||||
// Store equipment effects for reference
|
||||
equipmentBonuses: equipmentEffects.bonuses,
|
||||
equipmentMultipliers: equipmentEffects.multipliers,
|
||||
@@ -147,7 +177,7 @@ export function getUnifiedEffects(state: Pick<GameState, 'skillUpgrades' | 'skil
|
||||
);
|
||||
}
|
||||
|
||||
// ─── Stat Computation with All Effects ───────────────────────────────────────────
|
||||
// ─── Stat Computation with All Effects ───────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Compute max mana with all effect sources
|
||||
|
||||
Reference in New Issue
Block a user