feat: Implement Invocation System for Invoker attunement
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m22s

Implements the full Invocation System as per spec §13 with all 22 acceptance criteria:
- Invocation charge meter with passive fill and active drain
- Auto-activation when charge reaches 100 with living enemies
- Guardian selection by elemental bonus × tierMultiplier scoring
- Spell selection from guardian's full element spellbook (not limited to learned)
- Step-down to affordable spells, auto-end when none affordable
- Charge drain during invocation with spell cost and discipline scaling
- Pact affinity cast speed bonus (diminishing returns, max 50%)
- guardian-invocation discipline with 4 perks (efficiency/speed/sustain/mastery)
- Cost multiplier (base 0.1, min 0.05) and drain multiplier (base 1.0, min 0.7)
- Signal recharged on spire exit and reset on descent
- Invocation Panel UI in SpireCombatPage with charge meter and status
- Compact invocation status indicator in SpireCombatControls

Files changed:
- data/disciplines/invoker.ts: Added guardian-invocation discipline definition
- effects/discipline-effects.ts: Added invocationChargeRateBonus, drainRateMultiplier, invocationCostReduction stat keys
- utils/invocation-utils.ts: NEW - All invocation utility functions (guardian selection, spell selection, charge rate, cost/drain multipliers)
- stores/combat-state.types.ts: Added invocationCharge and activeInvocation fields
- stores/combatStore.ts: Added invocation state defaults, resetInvocationState action, partialize, spire exit reset
- stores/combat-invocation.ts: NEW - Extracted invocation tick processing (charge fill/drain, casting, auto-activate/end)
- stores/combat-melee.ts: NEW - Extracted melee combat processing (keeps combat-actions.ts under 400 lines)
- stores/combat-actions.ts: Integrated invocation and melee modules
- __tests__/invocation-system.test.ts: NEW - 39 comprehensive tests
- SpireCombatPage.tsx: Added InvocationPanel between SpireHeader and RoomDisplay
- SpireCombatControls.tsx: Added compact invocation status indicator

All 1235 tests pass (including 39 new invocation tests).
This commit is contained in:
2026-06-13 13:42:05 +02:00
parent 7dda515a71
commit b7afe7a434
14 changed files with 1165 additions and 59 deletions
+50
View File
@@ -6,6 +6,56 @@ import { DisciplinesAttunementType } from '../../types/disciplines';
import type { DisciplineDefinition } from '../../types/disciplines';
export const invokerDisciplines: DisciplineDefinition[] = [
{
id: 'guardian-invocation',
name: 'Guardian Invocation',
attunement: DisciplinesAttunementType.INVOKER,
manaType: 'raw',
baseCost: 20,
description:
'Channel the power of pacted guardians in combat. Faster invocation charge, cheaper invocation spells, longer-lasting charge.',
statBonus: { stat: 'invocationChargeRateBonus', baseValue: 0.10, label: 'Invocation Charge Rate' },
difficultyFactor: 250,
scalingFactor: 120,
drainBase: 8,
requires: ['signed_pact'],
perks: [
{
id: 'invocation-efficiency',
type: 'once',
threshold: 100,
value: 0,
description: 'Invocation spells cost 20% less mana (cost multiplier 0.1 → 0.08)',
bonus: { stat: 'invocationCostReduction', amount: 0.02 },
},
{
id: 'invocation-speed',
type: 'infinite',
threshold: 200,
value: 150,
description: 'Every 150 XP: +0.05 invocation charge rate bonus',
bonus: { stat: 'invocationChargeRateBonus', amount: 0.05 },
},
{
id: 'invocation-sustain',
type: 'capped',
threshold: 400,
value: 200,
maxTier: 3,
description: 'Every 200 XP: drain rate multiplier 0.1 (minimum 0.7)',
bonus: { stat: 'drainRateMultiplier', amount: -0.1 },
},
{
id: 'invocation-mastery',
type: 'capped',
threshold: 500,
value: 250,
maxTier: 3,
description: 'Every 250 XP: cost multiplier 0.01 (minimum 0.05)',
bonus: { stat: 'invocationCostReduction', amount: 0.01 },
},
],
},
{
id: 'pact-attunement',
name: 'Pact Attunement',