docs: reconcile spec inconsistencies across all documentation
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)
This commit is contained in:
2026-06-05 14:07:22 +02:00
parent 69cc8b78d1
commit 6aed5c8d2b
10 changed files with 135 additions and 88 deletions
+5 -5
View File
@@ -28,9 +28,9 @@ describe('Tab barrel export', () => {
// ─── Test: Prestige upgrade definitions ────────────────────────────────────────
describe('Prestige upgrade definitions', () => {
it('has exactly 11 prestige upgrades', async () => {
it('has exactly 15 prestige upgrades', async () => {
const { PRESTIGE_DEF } = await import('@/lib/game/constants/prestige');
expect(Object.keys(PRESTIGE_DEF).length).toBe(11);
expect(Object.keys(PRESTIGE_DEF).length).toBe(15);
});
it('all upgrades have required fields', async () => {
@@ -43,13 +43,13 @@ describe('Prestige upgrade definitions', () => {
}
});
it('all 11 expected upgrade IDs are present', async () => {
it('all 15 expected upgrade IDs are present', async () => {
const { PRESTIGE_DEF } = await import('@/lib/game/constants/prestige');
const expectedIds = [
'insightAmp', 'spireKey',
'manaWell', 'manaFlow', 'insightAmp', 'spireKey',
'temporalEcho', 'steadyHand', 'ancientKnowledge', 'elementalAttune',
'spellMemory', 'guardianPact', 'quickStart', 'elemStart',
'unlockedManaTypeCapacity',
'unlockedManaTypeCapacity', 'pactBinding', 'pactInterferenceMitigation',
];
for (const id of expectedIds) {
expect(PRESTIGE_DEF[id]).toBeDefined();
+4
View File
@@ -2,6 +2,8 @@
import type { PrestigeDef } from '../types';
export const PRESTIGE_DEF: Record<string, PrestigeDef> = {
manaWell: { name: "Mana Well", desc: "+500 starting max mana", max: 5, cost: 500 },
manaFlow: { name: "Mana Flow", desc: "+0.5 regen/sec permanently", max: 10, cost: 750 },
insightAmp: { name: "Insight Amp", desc: "+25% insight gain", max: 4, cost: 1500 },
spireKey: { name: "Spire Key", desc: "Start at floor +2", max: 5, cost: 4000 },
temporalEcho: { name: "Temporal Echo", desc: "+10% mana generation", max: 5, cost: 3000 },
@@ -13,4 +15,6 @@ export const PRESTIGE_DEF: Record<string, PrestigeDef> = {
quickStart: { name: "Quick Start", desc: "Start with 100 raw mana", max: 3, cost: 400 },
elemStart: { name: "Elem. Start", desc: "Start with 5 of each unlocked element", max: 3, cost: 800 },
unlockedManaTypeCapacity: { name: "Mana Type Capacity", desc: "+10 capacity for selected mana type", max: 5, cost: 1000 },
pactBinding: { name: "Pact Binding", desc: "+1 pact slot per level", max: 5, cost: 2000 },
pactInterferenceMitigation: { name: "Pact Interference Mitigation", desc: "Reduces pact interference penalty", max: 10, cost: 1500 },
};
+6 -4
View File
@@ -143,14 +143,16 @@ export function useCombatStats() {
[activeSpell]
);
const pactInterferenceMitigation = usePrestigeStore((s) => s.prestigeUpgrades.pactInterferenceMitigation || 0);
const pactMultiplier = useMemo(
() => computePactMultiplier({ signedPacts }),
[signedPacts]
() => computePactMultiplier({ signedPacts, pactInterferenceMitigation }),
[signedPacts, pactInterferenceMitigation]
);
const pactInsightMultiplier = useMemo(
() => computePactInsightMultiplier({ signedPacts }),
[signedPacts]
() => computePactInsightMultiplier({ signedPacts, pactInterferenceMitigation }),
[signedPacts, pactInterferenceMitigation]
);
// DPS calculation