feat: add prestige system and skill upgrades with comprehensive documentation
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 5m57s

This commit is contained in:
Refactoring Agent
2026-05-01 15:18:09 +02:00
parent 3691aa4acc
commit 03815f27ee
52 changed files with 4056 additions and 873 deletions
+42 -12
View File
@@ -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