# Task 15: Add Mana-Type Capacity Enchantment Effects Per Unlocked Mana Type ## Context Summary ### 1. Current Enchantment Effects for Mana Capacity **Location**: `/home/user/repos/Mana-Loop/src/lib/game/data/enchantments/mana-effects.ts` Current mana capacity effects (in `MANA_EFFECTS`): - `mana_cap_50` - +50 maximum mana (max 3 stacks) - `mana_cap_100` - +100 maximum mana (max 3 stacks) - `weapon_mana_cap_20` - +20 weapon mana capacity (max 5 stacks) - `weapon_mana_cap_50` - +50 weapon mana capacity (max 3 stacks) - `weapon_mana_cap_100` - +100 weapon mana capacity (max 2 stacks) **Element Capacity Effects**: There are currently NO per-type element capacity enchantment effects. The `elementCap` stat exists in `ComputedEffects` (in `upgrade-effects.ts`) and is applied via: - `elementCapBonus` - additive bonus to element max - `elementCapMultiplier` - multiplier for element max These apply globally to ALL elements equally (see `computeElementMax` in `store.ts`). ### 2. Mana Types That Are Unlockable **Location**: `/home/user/repos/Mana-Loop/src/lib/game/constants/elements.ts` **Base Elements** (cat: "base"): - `fire` - Fire 🔥 - `water` - Water 💧 - `air` - Air 🌬️ - `earth` - Earth ⛰️ - `light` - Light ☀️ - `dark` - Dark 🌑 - `death` - Death 💀 **Utility Elements** (cat: "utility"): - `transference` - Transference 🔗 (ALREADY UNLOCKED by default in `BASE_UNLOCKED_ELEMENTS`) **Composite Elements** (cat: "composite", require recipe to craft): - `metal` - Metal ⚙️ (recipe: fire + earth) - `sand` - Sand ⏳ (recipe: earth + water) - `lightning` - Lightning ⚡ (recipe: fire + air) **Exotic Elements** (cat: "exotic", require complex recipes): - `crystal` - Crystal 💎 (recipe: sand + sand + light) - `stellar` - Stellar ⭐ (recipe: fire + fire + light) - `void` - Void 🕳️ (recipe: dark + dark + death) **Total unlockable mana types**: 12 (all except `transference` which starts unlocked) ### 3. How to Add Per-Type Capacity Effects **Current Effect System Architecture**: 1. **Effect Definition** (`EnchantmentEffectDef` in `/src/lib/game/data/enchantment-types.ts`): - Effects have a `stat` field that identifies what they modify - Stats like `maxMana`, `regen`, `clickMana`, `elementCap` are supported - Effects can be of type: `bonus` (additive), `multiplier`, or `special` 2. **Current Element Cap System** (`/src/lib/game/upgrade-effects.ts` and `/src/lib/game/effects.ts`): - `elementCapBonus` - additive bonus in `ComputedEffects` - `elementCapMultiplier` - multiplier in `ComputedEffects` - Applied in `computeElementMax()` in `store.ts`: ```typescript export function computeElementMax(state, effects?): number { const pu = state.prestigeUpgrades; const base = 10 + (state.skills.elemAttune || 0) * 50 + (pu.elementalAttune || 0) * 25; if (effects) { return Math.floor((base + effects.elementCapBonus) * effects.elementCapMultiplier); } return base; } ``` 3. **Approach to Add Per-Type Capacity Effects**: **Option A: Extend the stat system with per-element prefixes** - Add new stats like `elementCap_fire`, `elementCap_water`, etc. - Modify `computeElementMax` to accept element parameter - Modify `computeAllEffects` to handle per-element bonuses **Option B: Use a single stat with element metadata (Recommended)** - Add effects with stat format: `elementCap_fire`, `elementCap_water`, etc. - In `computeEquipmentEffects`, parse the element from stat name - Store per-element bonuses in a `Record` map - Modify `computeElementMax` to accept element and look up per-element bonus **Option C: Add a new effect type for element-specific bonuses** - Add new effect structure: `{ type: 'elementBonus', element: string, stat: 'capacity', value: number }` - Requires modifying `EnchantmentEffectDef` type 4. **Implementation Steps** (using Option B): a. **Define new enchantment effects** in `mana-effects.ts`: ```typescript fire_cap_10: { id: 'fire_cap_10', name: 'Fire Reservoir', description: '+10 Fire mana capacity', category: 'mana', baseCapacityCost: 25, maxStacks: 5, allowedEquipmentCategories: MANA_EQUIPMENT, effect: { type: 'bonus', stat: 'elementCap_fire', value: 10 } } // Repeat for each element: water, air, earth, light, dark, death, metal, sand, lightning, crystal, stellar, void ``` b. **Update `ComputedEffects`** in `upgrade-effects.ts` to add per-element storage: ```typescript export interface ComputedEffects { // ... existing fields perElementCapBonus: Record; // New: per-element capacity bonuses } ``` c. **Update `computeEquipmentEffects`** in `effects.ts` to parse element-specific stats: ```typescript // In the bonus processing: if (effect.stat.startsWith('elementCap_')) { const element = effect.stat.replace('elementCap_', ''); bonuses.perElementCapBonus[element] = (bonuses.perElementCapBonus?.[element] || 0) + effect.value * ench.stacks; } ``` d. **Update `computeElementMax`** in `store.ts` to use per-element bonuses: ```typescript export function computeElementMax(state, effects?, element?: string): number { const base = 10 + (state.skills.elemAttune || 0) * 50 + ...; if (effects) { let bonus = effects.elementCapBonus; // Global bonus if (element && effects.perElementCapBonus?.[element]) { bonus += effects.perElementCapBonus[element]; } return Math.floor((base + bonus) * effects.elementCapMultiplier); } return base; } ``` e. **Update `unlockElement`** in `store.ts` to check for per-element capacity bonuses when unlocking 5. **Effect Unlocking**: New effects should be unlocked via: - `BASE_UNLOCKED_EFFECTS` - effects available from game start - `EFFECT_RESEARCH_MAPPING` - effects unlocked by leveling specific skills - `ENCHANTING_UNLOCK_EFFECTS` - effects unlocked by leveling enchanting skill ### 4. Key Files to Modify 1. `/src/lib/game/data/enchantments/mana-effects.ts` - Add per-element capacity effects 2. `/src/lib/game/upgrade-effects.ts` - Update `ComputedEffects` interface, add per-element cap handling 3. `/src/lib/game/effects.ts` - Update `computeEquipmentEffects` to parse element-specific stats 4. `/src/lib/game/store.ts` - Update `computeElementMax` to accept element parameter and use per-element bonuses 5. `/src/lib/game/constants/index.ts` or relevant constants file - Add new effects to unlockable lists if needed ### 5. Allowed Equipment Categories For reference, from `enchantment-types.ts` and existing effects: - `MANA_EQUIPMENT: EquipmentCategory[] = ['caster', 'catalyst', 'head', 'body', 'accessory']` - Per-type capacity effects should likely use `MANA_EQUIPMENT` or similar ### 6. Existing Related Special Effect `ELEMENTAL_AFFINITY` special effect (`SPECIAL_EFFECTS.ELEMENTAL_AFFINITY`): - When unlocking a new element, starts with 10 capacity instead of 0 - This is already implemented in `unlockElement` in `store.ts`