From 2f580ef0fe9b1c83334ed48126d308b37e1be837 Mon Sep 17 00:00:00 2001 From: n8n-gitea Date: Mon, 8 Jun 2026 14:27:53 +0200 Subject: [PATCH] fix: pact system boon counts and signedPactDetails population - Fix multi-element guardians (floors 130,140,150,170,190,200,210,230,240) to have exactly 2 boons per spec instead of 3-4 - Fix signedPactDetails never being populated: pipeline processPactRitual now includes signedPactDetails in writes with floor, guardianId, signedAt time, and skillLevels - Fix completePactRitual in prestigeStore to also populate signedPactDetails - Update gameStore.ts call site to pass signedPactDetails and current day/hour to processPactRitual Fixes #309, fixes #308 --- docs/circular-deps.txt | 2 +- docs/dependency-graph.json | 2 +- src/lib/game/data/guardian-data.ts | 35 ++++++-------------- src/lib/game/stores/gameStore.ts | 2 +- src/lib/game/stores/pipelines/pact-ritual.ts | 25 ++++++++++++-- src/lib/game/stores/prestigeStore.ts | 14 ++++++-- 6 files changed, 49 insertions(+), 31 deletions(-) diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt index eee81ff..8228e9c 100644 --- a/docs/circular-deps.txt +++ b/docs/circular-deps.txt @@ -1,5 +1,5 @@ # Circular Dependencies -Generated: 2026-06-08T12:08:47.398Z +Generated: 2026-06-08T12:14:53.698Z Found: 1 circular chain(s) — these MUST be fixed before modifying involved files. 1. 1) stores/golem-combat-actions.ts > stores/golem-combat-helpers.ts diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json index a99b58a..2365f8f 100644 --- a/docs/dependency-graph.json +++ b/docs/dependency-graph.json @@ -1,6 +1,6 @@ { "_meta": { - "generated": "2026-06-08T12:08:45.389Z", + "generated": "2026-06-08T12:14:51.708Z", "description": "Import dependency graph for src/lib/game. Keys are files, values are arrays of files they import.", "usage": "To find what a file affects, search for its path in the VALUES. To find what a file depends on, look at its KEY entry." }, diff --git a/src/lib/game/data/guardian-data.ts b/src/lib/game/data/guardian-data.ts index 282c3a1..d2bd9ad 100644 --- a/src/lib/game/data/guardian-data.ts +++ b/src/lib/game/data/guardian-data.ts @@ -200,9 +200,7 @@ const TIER2: Record = { ), 130: mk(130, '', ['metal', 'fire', 'earth'], '#8B2500', 0.32, 4.5, [ - { type: 'elementalDamage', value: 10, desc: '+10% Metal damage' }, - { type: 'elementalDamage', value: 10, desc: '+10% Fire damage' }, - { type: 'elementalDamage', value: 10, desc: '+10% Earth damage' }, + { type: 'elementalDamage', value: 15, desc: '+15% BlackFlame damage' }, { type: 'rawDamage', value: 10, desc: '+10% raw damage' }, ], 'Multi-element BlackFlame spells apply a curse that reduces enemy resistances by 15%', @@ -211,9 +209,8 @@ const TIER2: Record = { ), 140: mk(140, '', ['sand', 'earth', 'water'], '#FFAA33', 0.25, 4.75, [ - { type: 'elementalDamage', value: 10, desc: '+10% Sand damage' }, - { type: 'elementalDamage', value: 10, desc: '+10% Earth damage' }, - { type: 'elementalDamage', value: 10, desc: '+10% Water damage' }, + { type: 'elementalDamage', value: 15, desc: '+15% Radiant Earth damage' }, + { type: 'maxMana', value: 200, desc: '+200 max mana' }, ], 'Radiant Earth spells blind enemies, reducing their accuracy and damage by 15%', [{ type: 'blind', value: 0.15 }, { type: 'armor_pierce', value: 0.1 }], @@ -221,10 +218,8 @@ const TIER2: Record = { ), 150: mk(150, '', ['lightning', 'fire', 'air'], '#6B8E23', 0.28, 5.0, [ - { type: 'elementalDamage', value: 10, desc: '+10% Lightning damage' }, - { type: 'elementalDamage', value: 10, desc: '+10% Fire damage' }, - { type: 'elementalDamage', value: 10, desc: '+10% Air damage' }, - { type: 'maxMana', value: 200, desc: '+200 max mana' }, + { type: 'elementalDamage', value: 15, desc: '+15% Storm Lightning damage' }, + { type: 'castingSpeed', value: 15, desc: '+15% casting speed' }, ], 'Storm Lightning spells corrode armor and spread chain lightning in swarm rooms', [{ type: 'chain', value: 2 }, { type: 'cast_speed', value: 0.1 }, { type: 'burn', value: 0.1 }], @@ -252,7 +247,6 @@ const TIER3: Record = { [ { type: 'elementalDamage', value: 20, desc: '+20% Crystal damage' }, { type: 'maxMana', value: 300, desc: '+300 max mana' }, - { type: 'manaRegen', value: 2, desc: '+2 mana regen' }, ], 'Crystal spells reflect 15% damage back to attackers', [{ type: 'reflect', value: 0.15 }], @@ -271,7 +265,6 @@ const TIER3: Record = { [ { type: 'elementalDamage', value: 25, desc: '+25% Void damage' }, { type: 'rawDamage', value: 15, desc: '+15% raw damage' }, - { type: 'maxMana', value: 400, desc: '+400 max mana' }, ], 'Void spells ignore 40% of all resistances', [{ type: 'resist_ignore', value: 0.4 }], @@ -279,9 +272,7 @@ const TIER3: Record = { ), 200: mk(200, '', ['crystal', 'stellar', 'void'], '#E8D5F5', 0.35, 7.0, [ - { type: 'elementalDamage', value: 20, desc: '+20% Crystal damage' }, - { type: 'elementalDamage', value: 20, desc: '+20% Stellar damage' }, - { type: 'elementalDamage', value: 20, desc: '+20% Void damage' }, + { type: 'elementalDamage', value: 30, desc: '+30% Exotic damage' }, { type: 'maxMana', value: 400, desc: '+400 max mana' }, ], 'Exotic convergence: Crystal/Stellar/Void spells bypass all defenses and shields', @@ -290,9 +281,7 @@ const TIER3: Record = { ), 210: mk(210, '', ['soul', 'time', 'plasma'], '#C5B99A', 0.32, 7.5, [ - { type: 'elementalDamage', value: 15, desc: '+15% Soul damage' }, - { type: 'elementalDamage', value: 15, desc: '+15% Time damage' }, - { type: 'elementalDamage', value: 15, desc: '+15% Plasma damage' }, + { type: 'elementalDamage', value: 25, desc: '+25% Astral damage' }, { type: 'castingSpeed', value: 20, desc: '+20% casting speed' }, ], 'Astral convergence: Soul/Time/Plasma spells slow and pierce all defenses', @@ -310,9 +299,8 @@ const TIER3: Record = { ), 230: mk(230, '', ['crystal', 'stellar', 'void'], '#B39DDB', 0.40, 8.5, [ - { type: 'elementalDamage', value: 15, desc: '+15% Crystal damage' }, - { type: 'elementalDamage', value: 15, desc: '+15% Stellar damage' }, - { type: 'elementalDamage', value: 15, desc: '+15% Void damage' }, + { type: 'elementalDamage', value: 25, desc: '+25% Exotic damage' }, + { type: 'insightGain', value: 20, desc: '+20% insight gain' }, ], 'Primordial gaze: Crystal/Stellar/Void spells gain +20% effectiveness', [{ type: 'reflect', value: 0.1 }, { type: 'resist_ignore', value: 0.15 }], @@ -320,9 +308,8 @@ const TIER3: Record = { ), 240: mk(240, '', ['soul', 'time', 'plasma'], '#D5A0E0', 0.42, 9.0, [ - { type: 'elementalDamage', value: 15, desc: '+15% Soul damage' }, - { type: 'elementalDamage', value: 15, desc: '+15% Time damage' }, - { type: 'elementalDamage', value: 15, desc: '+15% Plasma damage' }, + { type: 'elementalDamage', value: 25, desc: '+25% Astral damage' }, + { type: 'spellEfficiency', value: 15, desc: '+15% spell efficiency' }, ], 'Astral convergence: Soul/Time/Plasma spells gain +20% effectiveness', [{ type: 'defense_pierce', value: 0.2 }, { type: 'chain', value: 1 }], diff --git a/src/lib/game/stores/gameStore.ts b/src/lib/game/stores/gameStore.ts index 8533aaf..5936670 100644 --- a/src/lib/game/stores/gameStore.ts +++ b/src/lib/game/stores/gameStore.ts @@ -209,7 +209,7 @@ export const useGameStore = create()( rawMana = Math.max(0, Math.min(rawMana + netRawRegen * HOURS_PER_TICK, maxMana)); let totalManaGathered = ctx.mana.totalManaGathered + Math.max(0, actualRegen); - const pactResult = processPactRitual(ctx.prestige.pactRitualFloor, ctx.prestige.pactRitualProgress, ctx.prestige.signedPacts, ctx.prestige.defeatedGuardians, ctx.prestige.prestigeUpgrades.pactAffinity || 0, disciplineEffects.bonuses.pactAffinityBonus || 0); + const pactResult = processPactRitual(ctx.prestige.pactRitualFloor, ctx.prestige.pactRitualProgress, ctx.prestige.signedPacts, ctx.prestige.defeatedGuardians, ctx.prestige.prestigeUpgrades.pactAffinity || 0, disciplineEffects.bonuses.pactAffinityBonus || 0, ctx.prestige.signedPactDetails, day, hour); if (pactResult.writes) writes.prestige = { ...(writes.prestige || {}), ...pactResult.writes }; pactResult.logs.forEach(l => addLog(l)); diff --git a/src/lib/game/stores/pipelines/pact-ritual.ts b/src/lib/game/stores/pipelines/pact-ritual.ts index 9e6247d..8451335 100644 --- a/src/lib/game/stores/pipelines/pact-ritual.ts +++ b/src/lib/game/stores/pipelines/pact-ritual.ts @@ -4,11 +4,13 @@ import { useManaStore } from '../manaStore'; import { getGuardianForFloor } from '../../data/guardian-encounters'; import { HOURS_PER_TICK } from '../../constants'; +import type { PrestigeState } from '../prestigeStore'; export interface PactRitualResult { writes: { signedPacts?: number[]; - deficientGuardians?: number[]; + defeatedGuardians?: number[]; + signedPactDetails?: PrestigeState['signedPactDetails']; pactRitualFloor: number | null; pactRitualProgress: number; } | null; @@ -19,7 +21,17 @@ export interface PactRitualResult { * Process pact ritual progression. Advances progress and completes signing * when enough enough hours have accumulated. */ -export function processPactRitual(pactRitualFloor: number | null, pactRitualProgress: number, signedPacts: number[], defeatedGuardians: number[], pactAffinityUpgrade: number, pactAffinityBonus: number): PactRitualResult { +export function processPactRitual( + pactRitualFloor: number | null, + pactRitualProgress: number, + signedPacts: number[], + defeatedGuardians: number[], + pactAffinityUpgrade: number, + pactAffinityBonus: number, + signedPactDetails: PrestigeState['signedPactDetails'], + currentDay: number, + currentHour: number, +): PactRitualResult { if (pactRitualFloor === null) return { writes: null, logs: [] }; const logs: string[] = []; const guardian = getGuardianForFloor(pactRitualFloor); @@ -41,6 +53,15 @@ export function processPactRitual(pactRitualFloor: number | null, pactRitualProg writes: { signedPacts: [...signedPacts, pactRitualFloor], defeatedGuardians: defeatedGuardians.filter(f => f !== pactRitualFloor), + signedPactDetails: { + ...signedPactDetails, + [pactRitualFloor]: { + floor: pactRitualFloor, + guardianId: guardian.name || `floor-${pactRitualFloor}`, + signedAt: { day: currentDay, hour: currentHour }, + skillLevels: {}, + }, + }, pactRitualFloor: null, pactRitualProgress: 0, }, diff --git a/src/lib/game/stores/prestigeStore.ts b/src/lib/game/stores/prestigeStore.ts index 84ec706..74ae7df 100644 --- a/src/lib/game/stores/prestigeStore.ts +++ b/src/lib/game/stores/prestigeStore.ts @@ -166,9 +166,19 @@ export const usePrestigeStore = create()( } } + const floor = state.pactRitualFloor; set({ - signedPacts: [...state.signedPacts, state.pactRitualFloor], - defeatedGuardians: state.defeatedGuardians.filter(f => f !== state.pactRitualFloor), + signedPacts: [...state.signedPacts, floor], + defeatedGuardians: state.defeatedGuardians.filter(f => f !== floor), + signedPactDetails: { + ...state.signedPactDetails, + [floor]: { + floor, + guardianId: guardian.name || `floor-${floor}`, + signedAt: { day: 0, hour: 0 }, + skillLevels: {}, + }, + }, pactRitualFloor: null, pactRitualProgress: 0, });