6aed5c8d2b
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s
- Fix incursion start day: 5→20 in GAME_BRIEFING.md (matches code constant) - Fix fabricator discipline count: 2→5 in AGENTS.md - Fix discipline counts: elemental.ts 22→21, advanced-regen.ts 14→15 - Fix equipment count: 50→43, remove shields, fix catalysts count - Fix prestige upgrade count: add missing manaWell, manaFlow, pactBinding, pactInterferenceMitigation - Remove x3 victory multiplier (no victory condition defined yet) - Update pact persistence: pacts do NOT persist through prestige - Update elemental matchup tables to match ultimate truth - Update room type frequencies to match spire-climbing-spec - Update guardian data tables to use formulas - Update Tier 3 guardian elements to match guardian-data.ts code - Add pactBinding + pactInterferenceMitigation to PRESTIGE_DEF constants - Wire pactInterferenceMitigation into useGameDerived.ts - Update spire-combat-spec.md Known Gaps table (DoT implemented, melee bypass bug) - Update invoker-spec.md known issues (all resolved) - Update golemancy-spec.md status (undergoing redesign) - Update PrestigeTab test to expect 15 upgrades - Create Gitea issues #285 (melee defense bypass), #286 (DoT verified), #287 (mana conversion gap)
230 lines
7.6 KiB
Markdown
230 lines
7.6 KiB
Markdown
# Invoker Attunement — Design Spec
|
||
|
||
> Describes the Invoker attunement: identity, unlock flow, mana behavior, full
|
||
> discipline list with stats/perks, systems unlocked, pact interactions, and
|
||
> attunement level interactions.
|
||
|
||
---
|
||
|
||
## 1. Objective
|
||
|
||
The Invoker is the pact-focused attunement that transforms Guardian defeats into
|
||
permanent power. Unlike the other attunements, the Invoker has no primary mana type
|
||
and no automatic mana conversion — it gains elemental mana exclusively by signing
|
||
pacts with Guardians. Its disciplines amplify pact power, boon effectiveness, and
|
||
guardian-related multipliers.
|
||
|
||
---
|
||
|
||
## 2. Identity
|
||
|
||
| Property | Value |
|
||
|---|---|
|
||
| **ID** | `invoker` |
|
||
| **Slot** | `chest` |
|
||
| **Icon** | `💜` |
|
||
| **Color** | `#9B59B6` (Purple) |
|
||
| **Primary Mana** | None (gains elemental mana from pacts) |
|
||
| **Raw Mana Regen** | +0.3/hour (base, scales with `1.5^(level-1)`) |
|
||
| **Conversion Rate** | None (0 at all levels) |
|
||
| **Unlock** | Defeat first Guardian |
|
||
| **Capabilities** | `['pacts', 'guardianPowers', 'elementalMastery']` |
|
||
| **Skill Categories** | `['invocation', 'pact']` |
|
||
|
||
---
|
||
|
||
## 3. Unlock Condition and Flow
|
||
|
||
**Condition:** Defeat the first Guardian (floor 10).
|
||
|
||
**Unlock flow:**
|
||
1. Defeat the floor 10 Guardian (Ignis Prime)
|
||
2. Invoker becomes available for activation
|
||
3. Player activates Invoker → initialized at `{ active: true, level: 1, experience: 0 }`
|
||
4. Invoker disciplines become available: `pact-attunement`, `guardians-boon`
|
||
|
||
The unlock condition is stored as a descriptive string:
|
||
`"Defeat your first guardian and choose the path of the Invoker"`
|
||
|
||
---
|
||
|
||
## 4. Raw Mana Regen Contribution
|
||
|
||
Base regen: **+0.3/hour** (at level 1). Scales exponentially:
|
||
|
||
```
|
||
effectiveRegen = 0.3 × 1.5^(level - 1)
|
||
```
|
||
|
||
| Level | Raw Regen |
|
||
|---|---|
|
||
| 1 | 0.300/hr |
|
||
| 5 | 1.519/hr |
|
||
| 10 | 11.533/hr |
|
||
|
||
---
|
||
|
||
## 5. Mana Gain from Pacts (No Conversion)
|
||
|
||
The Invoker has **no automatic mana conversion**. Instead, it gains elemental mana
|
||
types exclusively through Guardian pacts:
|
||
|
||
When a pact is signed (`completePactRitual`):
|
||
```typescript
|
||
for (const manaType of guardian.unlocksMana || []) {
|
||
manaStore.unlockElement(manaType, 0);
|
||
}
|
||
```
|
||
|
||
Each guardian's `unlocksMana` is resolved via `resolveMultiUnlockChain(element)`,
|
||
which walks the element recipe tree to unlock the guardian's element and all base
|
||
components:
|
||
|
||
| Guardian | Element | Unlocks Mana Types |
|
||
|---|---|---|
|
||
| Floor 10 (Ignis Prime) | fire | `fire` |
|
||
| Floor 20 (Aqua Regia) | water | `water` |
|
||
| Floor 40 (Terra Firma) | earth | `earth` |
|
||
| Floor 90 (Metal) | metal | `fire`, `earth`, `metal` |
|
||
| Floor 130 (BlackFlame) | blackflame | `fire`, `earth`, `metal` |
|
||
| Floor 150 (Lightning) | lightning | `fire`, `air`, `lightning` |
|
||
|
||
Signing pacts is the **only** way for the Invoker to access elemental mana for
|
||
casting elemental spells and running elemental disciplines.
|
||
|
||
---
|
||
|
||
## 6. Disciplines
|
||
|
||
The Invoker's discipline pool contains **2 disciplines**.
|
||
|
||
### 6.1 Pact Attunement (`pact-attunement`)
|
||
|
||
| Field | Value |
|
||
|---|---|
|
||
| **Mana Type** | `raw` |
|
||
| **Base Cost** | 12 |
|
||
| **Requires** | `['signed_pact']` |
|
||
| **Stat Bonus** | `pactAffinityBonus` +0.05 (base) |
|
||
| **Scaling Factor** | 80 |
|
||
| **Difficulty Factor** | 150 |
|
||
| **Drain Base** | 4 |
|
||
|
||
**Perks:**
|
||
|
||
| Perk ID | Type | Threshold | Bonus |
|
||
|---|---|---|---|
|
||
| `pact-affinity-scaling` | `once` | 100 | Unlock pact affinity scaling |
|
||
| `pact-affinity-infinite` | `infinite` | 200 | Every 100 XP: `pactAffinityBonus` +0.05 |
|
||
| `pact-power-boost` | `capped` | 500 | Every 200 XP: `guardianBoonMultiplier` +0.03, max 5 tiers |
|
||
|
||
### 6.2 Guardian's Boon (`guardians-boon`)
|
||
|
||
| Field | Value |
|
||
|---|---|
|
||
| **Mana Type** | `raw` |
|
||
| **Base Cost** | 18 |
|
||
| **Requires** | `['signed_pact']` |
|
||
| **Stat Bonus** | `guardianBoonMultiplier` +0.10 (base) |
|
||
| **Scaling Factor** | 100 |
|
||
| **Difficulty Factor** | 200 |
|
||
| **Drain Base** | 6 |
|
||
|
||
**Perks:**
|
||
|
||
| Perk ID | Type | Threshold | Bonus |
|
||
|---|---|---|---|
|
||
| `boon-1` | `once` | 100 | `guardianBoonMultiplier` +0.10 |
|
||
| `boon-2` | `capped` | 200 | Every 350 XP: `guardianBoonMultiplier` +0.05, max 5 tiers |
|
||
|
||
### 6.3 Guardian Boon Multiplier Scaling
|
||
|
||
Maximum theoretical `guardianBoonMultiplier` from disciplines:
|
||
|
||
| Source | Value |
|
||
|---|---|
|
||
| Base (Guardian's Boon discipline) | +0.10 |
|
||
| `boon-1` perk (once @ 100 XP) | +0.10 |
|
||
| `boon-2` perk (capped, 5 tiers × 0.05) | +0.25 |
|
||
| `pact-power-boost` perk (capped, 5 tiers × 0.03) | +0.15 |
|
||
| **Maximum total** | **+0.60** |
|
||
|
||
With the base multiplier of 1.0, the maximum guardian boon multiplier is **1.60**.
|
||
|
||
---
|
||
|
||
## 7. Systems Unlocked
|
||
|
||
The Invoker attunement gates the **Pact System** (see `pact-system-spec.md`):
|
||
|
||
- Sign pacts with defeated Guardians
|
||
- Gain permanent boons and elemental mana unlocks
|
||
- Pact slots limit simultaneous signed pacts
|
||
- Pact affinity reduces ritual time
|
||
|
||
---
|
||
|
||
## 8. Puzzle Room Behavior
|
||
|
||
In the spire, every 7th floor has a puzzle room. When the room type is
|
||
`invoker_trial`, progress scales at 2.5–3% per tick per Invoker level.
|
||
|
||
---
|
||
|
||
## 9. Attunement Level Interactions
|
||
|
||
Higher Invoker level affects:
|
||
|
||
1. **Raw mana regen**: `0.3 × 1.5^(level-1)` per hour
|
||
2. **No conversion**: Invoker never has automatic mana conversion
|
||
3. **Pact affinity**: Higher raw regen supports the raw mana cost of pact rituals
|
||
|
||
Attunement level does **not** directly affect pact multipliers or boon power —
|
||
those scale through discipline XP.
|
||
|
||
---
|
||
|
||
## 10. Known Code Issues
|
||
|
||
The following inconsistencies exist in the codebase:
|
||
|
||
| Issue | Description |
|
||
|---|---|
|
||
| `pactBinding` upgrade | ✅ **RESOLVED** — Added to `PRESTIGE_DEF` in `prestige.ts` |
|
||
| UI vs store mismatch | ✅ **RESOLVED** — `pactBinding` is now the canonical ID used everywhere |
|
||
| Pact persistence | ✅ **RESOLVED BY DESIGN** — Pacts intentionally do NOT persist through prestige (reset each loop). This is the correct behavior per design intent. |
|
||
| `pactInterferenceMitigation` | ✅ **RESOLVED** — Added to `PRESTIGE_DEF` in `prestige.ts`; `useGameDerived.ts` now passes it from prestige store |
|
||
|
||
---
|
||
|
||
## 11. Acceptance Criteria
|
||
|
||
| # | Criterion |
|
||
|---|---|
|
||
| AC-1 | Invoker is locked until the first Guardian is defeated. |
|
||
| AC-2 | Invoker has no primary mana type and no automatic conversion at any level. |
|
||
| AC-3 | Signing a pact unlocks the guardian's element and all component elements. |
|
||
| AC-4 | Both Invoker disciplines require at least one signed pact to activate. |
|
||
| AC-5 | `pact-affinity-infinite` perk grants +0.05 pactAffinityBonus every 100 XP beyond threshold 200. |
|
||
| AC-6 | `boon-2` capped perk grants +0.05 guardianBoonMultiplier per tier, max 5 tiers, interval 350 XP. |
|
||
| AC-7 | `pact-power-boost` capped perk grants +0.03 guardianBoonMultiplier per tier, max 5 tiers, interval 200 XP. |
|
||
| AC-8 | Maximum theoretical guardianBoonMultiplier from disciplines is 1.60 (base 1.0 + 0.60). |
|
||
| AC-9 | Invoker `invoker_trial` puzzle rooms grant bonus progress per Invoker level. |
|
||
| AC-10 | Invoker level scales raw regen by `1.5^(level-1)`. |
|
||
|
||
---
|
||
|
||
## 12. Files Reference
|
||
|
||
| File | Role |
|
||
|---|---|
|
||
| `src/lib/game/data/attunements.ts` | Invoker definition |
|
||
| `src/lib/game/data/disciplines/invoker.ts` | Invoker disciplines (2) |
|
||
| `src/lib/game/stores/prestigeStore.ts` | Pact ritual state, slot management |
|
||
| `src/lib/game/stores/pipelines/pact-ritual.ts` | Pact ritual tick processing |
|
||
| `src/lib/game/utils/pact-utils.ts` | Pact multiplier calculations |
|
||
| `src/lib/game/data/guardian-data.ts` | Static guardian definitions |
|
||
| `src/lib/game/data/guardian-encounters.ts` | Procedural guardian lookup |
|
||
| `src/components/game/tabs/GuardianPactsTab.tsx` | Pact signing UI |
|
||
| `docs/specs/attunements/invoker/systems/pact-system-spec.md` | Pact system spec |
|