fix: pact system boon counts and signedPactDetails population
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m30s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m30s
- 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
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
# Circular Dependencies
|
# 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.
|
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
|
1. 1) stores/golem-combat-actions.ts > stores/golem-combat-helpers.ts
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_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.",
|
"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."
|
"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."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -200,9 +200,7 @@ const TIER2: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
130: mk(130, '', ['metal', 'fire', 'earth'], '#8B2500', 0.32, 4.5,
|
130: mk(130, '', ['metal', 'fire', 'earth'], '#8B2500', 0.32, 4.5,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Metal damage' },
|
{ type: 'elementalDamage', value: 15, desc: '+15% BlackFlame damage' },
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Fire damage' },
|
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Earth damage' },
|
|
||||||
{ type: 'rawDamage', value: 10, desc: '+10% raw damage' },
|
{ type: 'rawDamage', value: 10, desc: '+10% raw damage' },
|
||||||
],
|
],
|
||||||
'Multi-element BlackFlame spells apply a curse that reduces enemy resistances by 15%',
|
'Multi-element BlackFlame spells apply a curse that reduces enemy resistances by 15%',
|
||||||
@@ -211,9 +209,8 @@ const TIER2: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
140: mk(140, '', ['sand', 'earth', 'water'], '#FFAA33', 0.25, 4.75,
|
140: mk(140, '', ['sand', 'earth', 'water'], '#FFAA33', 0.25, 4.75,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Sand damage' },
|
{ type: 'elementalDamage', value: 15, desc: '+15% Radiant Earth damage' },
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Earth damage' },
|
{ type: 'maxMana', value: 200, desc: '+200 max mana' },
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Water damage' },
|
|
||||||
],
|
],
|
||||||
'Radiant Earth spells blind enemies, reducing their accuracy and damage by 15%',
|
'Radiant Earth spells blind enemies, reducing their accuracy and damage by 15%',
|
||||||
[{ type: 'blind', value: 0.15 }, { type: 'armor_pierce', value: 0.1 }],
|
[{ type: 'blind', value: 0.15 }, { type: 'armor_pierce', value: 0.1 }],
|
||||||
@@ -221,10 +218,8 @@ const TIER2: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
150: mk(150, '', ['lightning', 'fire', 'air'], '#6B8E23', 0.28, 5.0,
|
150: mk(150, '', ['lightning', 'fire', 'air'], '#6B8E23', 0.28, 5.0,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Lightning damage' },
|
{ type: 'elementalDamage', value: 15, desc: '+15% Storm Lightning damage' },
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Fire damage' },
|
{ type: 'castingSpeed', value: 15, desc: '+15% casting speed' },
|
||||||
{ type: 'elementalDamage', value: 10, desc: '+10% Air damage' },
|
|
||||||
{ type: 'maxMana', value: 200, desc: '+200 max mana' },
|
|
||||||
],
|
],
|
||||||
'Storm Lightning spells corrode armor and spread chain lightning in swarm rooms',
|
'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 }],
|
[{ type: 'chain', value: 2 }, { type: 'cast_speed', value: 0.1 }, { type: 'burn', value: 0.1 }],
|
||||||
@@ -252,7 +247,6 @@ const TIER3: Record<number, GuardianDef> = {
|
|||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 20, desc: '+20% Crystal damage' },
|
{ type: 'elementalDamage', value: 20, desc: '+20% Crystal damage' },
|
||||||
{ type: 'maxMana', value: 300, desc: '+300 max mana' },
|
{ type: 'maxMana', value: 300, desc: '+300 max mana' },
|
||||||
{ type: 'manaRegen', value: 2, desc: '+2 mana regen' },
|
|
||||||
],
|
],
|
||||||
'Crystal spells reflect 15% damage back to attackers',
|
'Crystal spells reflect 15% damage back to attackers',
|
||||||
[{ type: 'reflect', value: 0.15 }],
|
[{ type: 'reflect', value: 0.15 }],
|
||||||
@@ -271,7 +265,6 @@ const TIER3: Record<number, GuardianDef> = {
|
|||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 25, desc: '+25% Void damage' },
|
{ type: 'elementalDamage', value: 25, desc: '+25% Void damage' },
|
||||||
{ type: 'rawDamage', value: 15, desc: '+15% raw damage' },
|
{ type: 'rawDamage', value: 15, desc: '+15% raw damage' },
|
||||||
{ type: 'maxMana', value: 400, desc: '+400 max mana' },
|
|
||||||
],
|
],
|
||||||
'Void spells ignore 40% of all resistances',
|
'Void spells ignore 40% of all resistances',
|
||||||
[{ type: 'resist_ignore', value: 0.4 }],
|
[{ type: 'resist_ignore', value: 0.4 }],
|
||||||
@@ -279,9 +272,7 @@ const TIER3: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
200: mk(200, '', ['crystal', 'stellar', 'void'], '#E8D5F5', 0.35, 7.0,
|
200: mk(200, '', ['crystal', 'stellar', 'void'], '#E8D5F5', 0.35, 7.0,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 20, desc: '+20% Crystal damage' },
|
{ type: 'elementalDamage', value: 30, desc: '+30% Exotic damage' },
|
||||||
{ type: 'elementalDamage', value: 20, desc: '+20% Stellar damage' },
|
|
||||||
{ type: 'elementalDamage', value: 20, desc: '+20% Void damage' },
|
|
||||||
{ type: 'maxMana', value: 400, desc: '+400 max mana' },
|
{ type: 'maxMana', value: 400, desc: '+400 max mana' },
|
||||||
],
|
],
|
||||||
'Exotic convergence: Crystal/Stellar/Void spells bypass all defenses and shields',
|
'Exotic convergence: Crystal/Stellar/Void spells bypass all defenses and shields',
|
||||||
@@ -290,9 +281,7 @@ const TIER3: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
210: mk(210, '', ['soul', 'time', 'plasma'], '#C5B99A', 0.32, 7.5,
|
210: mk(210, '', ['soul', 'time', 'plasma'], '#C5B99A', 0.32, 7.5,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Soul damage' },
|
{ type: 'elementalDamage', value: 25, desc: '+25% Astral damage' },
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Time damage' },
|
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Plasma damage' },
|
|
||||||
{ type: 'castingSpeed', value: 20, desc: '+20% casting speed' },
|
{ type: 'castingSpeed', value: 20, desc: '+20% casting speed' },
|
||||||
],
|
],
|
||||||
'Astral convergence: Soul/Time/Plasma spells slow and pierce all defenses',
|
'Astral convergence: Soul/Time/Plasma spells slow and pierce all defenses',
|
||||||
@@ -310,9 +299,8 @@ const TIER3: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
230: mk(230, '', ['crystal', 'stellar', 'void'], '#B39DDB', 0.40, 8.5,
|
230: mk(230, '', ['crystal', 'stellar', 'void'], '#B39DDB', 0.40, 8.5,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Crystal damage' },
|
{ type: 'elementalDamage', value: 25, desc: '+25% Exotic damage' },
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Stellar damage' },
|
{ type: 'insightGain', value: 20, desc: '+20% insight gain' },
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Void damage' },
|
|
||||||
],
|
],
|
||||||
'Primordial gaze: Crystal/Stellar/Void spells gain +20% effectiveness',
|
'Primordial gaze: Crystal/Stellar/Void spells gain +20% effectiveness',
|
||||||
[{ type: 'reflect', value: 0.1 }, { type: 'resist_ignore', value: 0.15 }],
|
[{ type: 'reflect', value: 0.1 }, { type: 'resist_ignore', value: 0.15 }],
|
||||||
@@ -320,9 +308,8 @@ const TIER3: Record<number, GuardianDef> = {
|
|||||||
),
|
),
|
||||||
240: mk(240, '', ['soul', 'time', 'plasma'], '#D5A0E0', 0.42, 9.0,
|
240: mk(240, '', ['soul', 'time', 'plasma'], '#D5A0E0', 0.42, 9.0,
|
||||||
[
|
[
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Soul damage' },
|
{ type: 'elementalDamage', value: 25, desc: '+25% Astral damage' },
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Time damage' },
|
{ type: 'spellEfficiency', value: 15, desc: '+15% spell efficiency' },
|
||||||
{ type: 'elementalDamage', value: 15, desc: '+15% Plasma damage' },
|
|
||||||
],
|
],
|
||||||
'Astral convergence: Soul/Time/Plasma spells gain +20% effectiveness',
|
'Astral convergence: Soul/Time/Plasma spells gain +20% effectiveness',
|
||||||
[{ type: 'defense_pierce', value: 0.2 }, { type: 'chain', value: 1 }],
|
[{ type: 'defense_pierce', value: 0.2 }, { type: 'chain', value: 1 }],
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ export const useGameStore = create<GameCoordinatorStore>()(
|
|||||||
rawMana = Math.max(0, Math.min(rawMana + netRawRegen * HOURS_PER_TICK, maxMana));
|
rawMana = Math.max(0, Math.min(rawMana + netRawRegen * HOURS_PER_TICK, maxMana));
|
||||||
let totalManaGathered = ctx.mana.totalManaGathered + Math.max(0, actualRegen);
|
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 };
|
if (pactResult.writes) writes.prestige = { ...(writes.prestige || {}), ...pactResult.writes };
|
||||||
pactResult.logs.forEach(l => addLog(l));
|
pactResult.logs.forEach(l => addLog(l));
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,13 @@
|
|||||||
import { useManaStore } from '../manaStore';
|
import { useManaStore } from '../manaStore';
|
||||||
import { getGuardianForFloor } from '../../data/guardian-encounters';
|
import { getGuardianForFloor } from '../../data/guardian-encounters';
|
||||||
import { HOURS_PER_TICK } from '../../constants';
|
import { HOURS_PER_TICK } from '../../constants';
|
||||||
|
import type { PrestigeState } from '../prestigeStore';
|
||||||
|
|
||||||
export interface PactRitualResult {
|
export interface PactRitualResult {
|
||||||
writes: {
|
writes: {
|
||||||
signedPacts?: number[];
|
signedPacts?: number[];
|
||||||
deficientGuardians?: number[];
|
defeatedGuardians?: number[];
|
||||||
|
signedPactDetails?: PrestigeState['signedPactDetails'];
|
||||||
pactRitualFloor: number | null;
|
pactRitualFloor: number | null;
|
||||||
pactRitualProgress: number;
|
pactRitualProgress: number;
|
||||||
} | null;
|
} | null;
|
||||||
@@ -19,7 +21,17 @@ export interface PactRitualResult {
|
|||||||
* Process pact ritual progression. Advances progress and completes signing
|
* Process pact ritual progression. Advances progress and completes signing
|
||||||
* when enough enough hours have accumulated.
|
* 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: [] };
|
if (pactRitualFloor === null) return { writes: null, logs: [] };
|
||||||
const logs: string[] = [];
|
const logs: string[] = [];
|
||||||
const guardian = getGuardianForFloor(pactRitualFloor);
|
const guardian = getGuardianForFloor(pactRitualFloor);
|
||||||
@@ -41,6 +53,15 @@ export function processPactRitual(pactRitualFloor: number | null, pactRitualProg
|
|||||||
writes: {
|
writes: {
|
||||||
signedPacts: [...signedPacts, pactRitualFloor],
|
signedPacts: [...signedPacts, pactRitualFloor],
|
||||||
defeatedGuardians: defeatedGuardians.filter(f => f !== 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,
|
pactRitualFloor: null,
|
||||||
pactRitualProgress: 0,
|
pactRitualProgress: 0,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -166,9 +166,19 @@ export const usePrestigeStore = create<PrestigeStore>()(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const floor = state.pactRitualFloor;
|
||||||
set({
|
set({
|
||||||
signedPacts: [...state.signedPacts, state.pactRitualFloor],
|
signedPacts: [...state.signedPacts, floor],
|
||||||
defeatedGuardians: state.defeatedGuardians.filter(f => f !== state.pactRitualFloor),
|
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,
|
pactRitualFloor: null,
|
||||||
pactRitualProgress: 0,
|
pactRitualProgress: 0,
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user