14 KiB
Subtask 18 Context: Enchantment Power Effect + Audit Stubs
Current Enchantment Power Effect Status
Definition Status
- "Enchantment Power" is NOT defined as an enchantment effect in
src/lib/game/data/enchantments/directory - The
ENCHANTMENT_EFFECTScatalog (inenchantment-effects.tsandenchantments/index.ts) does not contain any effect with "Enchantment Power" as a defined effect - Searching for "Enchantment Power" in enchantment files returns no results
How Enchantment Power is Referenced
The enchantPower stat IS referenced in skill upgrade perks in src/lib/game/skill-evolution.ts:
| Perk ID | Name | Effect | Skill Tree |
|---|---|---|---|
en_t1_l5_a |
Artisan's Touch | +10% Enchantment Power |
Enchanting T1 |
en_t1_l10_a |
Greater Artisan | +15% Enchantment Power |
Enchanting T1 |
en_t2_l5_a |
Expert Artisan | +25% Enchantment Power |
Enchanting T2 |
en_t2_l10_a |
Master Artisan | +35% Enchantment Power |
Enchanting T2 |
en_t3_l5_a |
Cosmic Artisan | +50% Enchantment Power |
Enchanting T3 |
en_t3_l10_a |
[ELITE] OMNI-ARTISAN | 2x enchantment power |
Enchanting T3 |
en_t4_l5_a |
Astral Artisan | +75% Enchantment Power |
Enchanting T4 |
en_t4_l10_a |
Galactic Artisan | +100% Enchantment Power |
Enchanting T4 |
en_t5_l5_a |
Divine Artisan | +150% Enchantment Power |
Enchanting T5 |
en_t5_l10_a |
[ELITE] ASCENDED ARTISAN | 5x enchantment power |
Enchanting T5 |
es_t1_l5_c |
Quick Work | +5% Enchantment Power |
Essence Shaping T1 |
es_t1_l10_c |
Superior Work | +10% Enchantment Power |
Essence Shaping T1 |
es_t2_l5_c |
Expert Work | +15% Enchantment Power |
Essence Shaping T2 |
es_t2_l10_c |
Master Work | +20% Enchantment Power |
Essence Shaping T2 |
es_t3_l5_c |
Divine Work | +25% Enchantment Power |
Essence Shaping T3 |
es_t3_l10_c |
[ELITE] OMNI-WORK | 2x enchantment power |
Essence Shaping T3 |
ee_t1_l5_c |
Quality Work | +5% Enchantment Power |
Elemental Evocation T1 |
ee_t1_l10_c |
Superior Work | +10% Enchantment Power |
Elemental Evocation T1 |
ee_t2_l5_c |
Expert Work | +15% Enchantment Power |
Elemental Evocation T2 |
ee_t2_l10_c |
Master Work | +20% Enchantment Power |
Elemental Evocation T2 |
ee_t3_l5_c |
Divine Work | +25% Enchantment Power |
Elemental Evocation T3 |
ee_t3_l10_c |
[ELITE] OMNI-POWER | 2x enchantment power |
Elemental Evocation T3 |
Effect Type in Skill Evolution
All these perks use the effect structure:
{ type: 'multiplier', stat: 'enchantPower', value: <decimal_value> }
Problem: enchantPower Stat Not Handled in Effects System
In src/lib/game/upgrade-effects.ts, the computeEffects function has a switch statement for multiplier effects (lines 295-320) but does NOT have a case for enchantPower:
switch (effect.stat) {
case 'maxMana':
effects.maxManaMultiplier *= effect.value;
break;
case 'regen':
effects.regenMultiplier *= effect.value;
break;
// ... other cases ...
// NO CASE FOR 'enchantPower'!
}
Similarly, the ComputedEffects interface (lines 16-48) does NOT include an enchantPower or enchantmentPowerMultiplier field.
StatsTab.tsx Attempts to Read enchantPower
In src/components/game/tabs/StatsTab.tsx (lines 161-178), there's a placeholder that tries to read enchantPower:
{upgradeEffects && 'enchantPower' in upgradeEffects
? `${(upgradeEffects as Record<string, number>).enchantPower.toFixed(2)}×`
: '1.0×'}
This is a type-safe workaround since enchantPower is not in the ComputedEffects interface.
Stub Location in EquipmentTab
File: /home/user/repos/Mana-Loop/src/components/game/tabs/EquipmentTab.tsx
Lines 516-531:
{/* Enchantment Power (placeholder for Task 5) */}
<GameCard className="mt-4">
<div className="pb-2">
<h3 className="text-sm font-semibold text-[var(--text-primary)] flex items-center gap-2">
✨ Enchantment Power
</h3>
</div>
<div>
<StatRow
label="Enchantment Power:"
value="1.0×"
highlight="info"
/>
<p className="text-xs text-[var(--text-muted)] mt-2">
Increases the power of all enchantments. Will be wired from Task 5 implementation.
</p>
</div>
</GameCard>
Exact stub text: "Increases the power of all enchantments. Will be wired from Task 5 implementation."
Location: Line 530 in EquipmentTab.tsx
Other Unwired Stubs
1. AttunementsTab.tsx - Disenchanting TODO
File: /home/user/repos/Mana-Loop/src/components/game/tabs/AttunementsTab.tsx
Line: 198
Content:
{cap === 'disenchanting' && '🔄 Disenchant'} {/* TODO: Remove after bug 13 complete */}
Description: TODO comment indicating disenchanting cap should be removed after bug 13 is complete.
2. AttunementsTab.tsx - Research TODO
File: /home/user/repos/Mana-Loop/src/components/game/tabs/AttunementsTab.tsx
Line: 249
Content:
{cat === 'research' && '🔮 Research'} {/* TODO: Remove after Bug 12 - research moved to mana */}
Description: TODO comment indicating research category should be removed after Bug 12 (research moved to mana).
3. AttunementsTab.tsx.backup - Disenchanting TODO (backup file)
File: /home/user/repos/Mana-Loop/src/components/game/tabs/AttunementsTab.tsx.backup
Line: 198
Content:
{cap === 'disenchanting' && '🔄 Disenchant'} // TODO: Remove after bug 13 complete
Description: Same as #1 but in backup file (can likely be ignored).
4. AttunementsTab.tsx.backup - Research TODO (backup file)
File: /home/user/repos/Mana-Loop/src/components/game/tabs/AttunementsTab.tsx.backup
Line: 249
Content:
{cat === 'research' && '🔮 Research'} // TODO: Remove after Bug 12 - research moved to mana
Description: Same as #2 but in backup file (can likely be ignored).
5. skill-evolution.ts - Attunement Requirement Placeholder
File: /home/user/repos/Mana-Loop/src/lib/game/skill-evolution.ts
Line: 2218
Content:
// Check attunement requirement (placeholder - would need actual attunement check)
Description: Placeholder comment indicating attunement requirement check is not implemented.
6. StatsTab.tsx - Enchantment Power (Wired but Non-functional)
File: /home/user/repos/Mana-Loop/src/components/game/tabs/StatsTab.tsx
Lines: 161-178
Content:
{/* Enchantment Power (placeholder for Task 5) */}
<Card className="bg-gray-900/80 border-gray-700">
<CardHeader className="pb-2">
<CardTitle className="text-blue-400 game-panel-title text-xs flex items-center gap-2">
✨ Enchantment Power
</CardTitle>
</CardHeader>
<CardContent>
<div className="flex justify-between text-sm">
<span className="text-gray-400">Enchantment Power:</span>
<span className="text-blue-300 font-[var(--font-mono)]">
{upgradeEffects && 'enchantPower' in upgradeEffects
? `${(upgradeEffects as Record<string, number>).enchantPower.toFixed(2)}×`
: '1.0×'}
</span>
</div>
<p className="text-xs text-gray-500 mt-2">
Increases the power of all enchantments. Wired from Task 5 implementation.
</p>
</CardContent>
</Card>
Description: This is labeled "Wired from Task 5 implementation" but the underlying enchantPower stat is not actually computed in upgrade-effects.ts. The display uses a type cast workaround.
Effects System Overview
How Effects Are Applied
The effects system is implemented across two main files:
1. src/lib/game/upgrade-effects.ts - Skill Upgrade Effects
- Interface:
ComputedEffects(lines 16-48) - Function:
computeEffects()(lines 260-330) - Processes skill upgrade effects from
skillUpgradesandskillTiers - Handles three effect types:
multiplier- multiplies a stat (e.g.,maxMana,regen,clickMana)bonus- adds to a stat (e.g.,maxMana,regen,baseDamage)special- adds a special effect ID to thespecialsset
2. src/lib/game/effects.ts - Unified Effects (Skill + Equipment)
-
Function:
computeEquipmentEffects()(lines 20-78)- Processes equipped item enchantments
- Returns
bonuses,multipliers, andspecials - For each enchantment:
bonustype: addseffect.value * ench.stackstobonuses[effect.stat]multipliertype: multipliesmultipliers[effect.stat]byeffect.valuefor each stackspecialtype: addseffect.specialIdtospecialsset
-
Function:
computeAllEffects()(lines 91-137)- Merges skill upgrade effects with equipment effects
- Merging strategy:
- Bonuses: ADD together
- Multipliers: MULTIPLY together
- Specials: UNION of sets
Where Enchantment Power Multiplier Would Go
The enchantmentPower (or enchantPower) multiplier should:
-
Be added to
ComputedEffectsinterface inupgrade-effects.ts:enchantmentPowerMultiplier: number; // defaults to 1 -
Be handled in
computeEffects()switch statement inupgrade-effects.ts:case 'enchantPower': effects.enchantmentPowerMultiplier *= effect.value; break; -
Be applied in
computeEquipmentEffects()orcomputeAllEffects()ineffects.ts:- Option A: Apply to
effect.valuewhen processing each enchantment - Option B: Apply as an additional multiplier in
computeAllEffects()
- Option A: Apply to
The most logical place is in computeEquipmentEffects() where enchantment values are calculated:
// When processing bonus effects:
bonuses[effect.stat] = (bonuses[effect.stat] || 0) + effect.value * ench.stacks * enchantmentPowerMultiplier;
// When processing multiplier effects:
// Each stack applies the multiplier, also modified by enchantmentPowerMultiplier
for (let i = 0; i < ench.stacks; i++) {
multipliers[key] *= (effect.value - 1) * enchantmentPowerMultiplier + 1;
// OR simpler: just multiply the final multiplier by enchantmentPowerMultiplier
}
Current Multiplier Application (from effects.ts lines 48-57):
} else if (effect.type === 'multiplier' && effect.stat && effect.value) {
// Multiplier effects multiply together
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;
}
}
Note: The enchantmentPower multiplier would need to be passed into computeEquipmentEffects() or applied after the fact in computeAllEffects().
Summary of Required Changes for Task 5 (Enchantment Power)
- Add
enchantmentPowerMultiplierfield toComputedEffectsinterface - Handle
enchantPowerstat incomputeEffects()switch statement - Pass
enchantmentPowerMultipliertocomputeEquipmentEffects()or apply incomputeAllEffects() - Update EquipmentTab.tsx stub to display actual value
- Update StatsTab.tsx to use proper type-safe access for
enchantmentPowerMultiplier
Results (Task 18 Implementation)
Implemented Changes
-
Added
enchantmentPowerMultipliertoComputedEffectsinterface insrc/lib/game/upgrade-effects.ts:- Added field
enchantmentPowerMultiplier: number;to the interface - Initialized to
1in thecomputeEffects()function
- Added field
-
Handled
enchantPowerstat incomputeEffects()switch statement insrc/lib/game/upgrade-effects.ts:- Added case for
enchantPowerin the multiplier effects switch statement - Multiplier is applied as:
effects.enchantmentPowerMultiplier *= effect.value;
- Added case for
-
Updated
computeEquipmentEffects()to applyenchantmentPowerMultiplierinsrc/lib/game/effects.ts:- Added optional parameter
enchantmentPowerMultiplier: number = 1.0 - Applied multiplier to both bonus and multiplier effect values:
const adjustedValue = effect.value * enchantmentPowerMultiplier;- Used
adjustedValueinstead ofeffect.valuewhen computing enchantment effects
- Added optional parameter
-
Updated
computeAllEffects()to pass the multiplier insrc/lib/game/effects.ts:- Now passes
upgradeEffects.enchantmentPowerMultipliertocomputeEquipmentEffects()
- Now passes
-
Replaced stub in EquipmentTab.tsx:
- Changed from: "Increases the power of all enchantments. Will be wired from Task 5 implementation."
- Changed to: "Increases the power of all enchantments by X%. Multiplier applied to all enchantment effects."
- Now displays actual
enchantmentPowerMultipliervalue fromgetUnifiedEffects(store) - Added
getUnifiedEffectsimport from@/lib/game/effects
-
Updated StatsTab.tsx to use type-safe access:
- Changed from type cast workaround:
(upgradeEffects as Record<string, number>).enchantPower - Changed to proper access:
upgradeEffects?.enchantmentPowerMultiplier - Now displays the actual multiplier value and percentage
- Changed from type cast workaround:
Audit of Other Unwired Stubs
- AttunementsTab.tsx - Disenchanting TODO (Line 198): Logged in
docs/task5.mdunder "Known Gaps" - waiting for Bug 13 - AttunementsTab.tsx - Research TODO (Line 249): Logged in
docs/task5.mdunder "Known Gaps" - waiting for Bug 12 - AttunementsTab.tsx.backup - TODOs: Backup file - ignored
- skill-evolution.ts - Attunement Requirement Placeholder (Line 2218): Logged in
docs/task5.mdunder "Known Gaps" - placeholder for future implementation - StatsTab.tsx - Enchantment Power: ✅ Fixed (was already labeled "Wired" but now properly implemented)
Files Modified
src/lib/game/upgrade-effects.ts- AddedenchantmentPowerMultiplierfield and handlersrc/lib/game/effects.ts- UpdatedcomputeEquipmentEffects()andcomputeAllEffects()to apply multipliersrc/components/game/tabs/EquipmentTab.tsx- Replaced stub, added import, displays actual valuesrc/components/game/tabs/StatsTab.tsx- Updated to use type-safe access forenchantmentPowerMultiplierdocs/task5.md- Added "Known Gaps" section documenting unwired stubs
Testing Notes
- The
enchantmentPowerMultiplierdefaults to1.0(no effect) - Skill perks that use
{ type: 'multiplier', stat: 'enchantPower', value: <decimal> }will now properly affect enchantment power - All enchantment effect values (both bonus and multiplier types) are multiplied by
enchantmentPowerMultiplier - The multiplier is applied per stack (each stack's effect value is multiplied)
Status
✅ All tasks completed successfully