fix: Elemental Mana Capacity disciplines now increase element capacity
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
- Add optional baseMax field to ElementState to track prestige-derived max separately from bonuses - Add computeElementMaxWithBonuses action to manaStore that computes max = baseMax + per-element bonus - Apply per-element cap bonuses from disciplines and equipment in game tick (elementCap_* keys) - Fix resetMana to use correct prestige key (elementalAttune instead of nonexistent elemMax) - Add store migration (v1->v2) to populate baseMax for existing saved games - Extract pact ritual processing to pipelines/pact-ritual.ts - Extract element cap bonus utilities to utils/element-cap-bonus.ts - Fix inline element types in crafting-fabricator.ts - Update test fixtures to include baseMax in element literals Fixes #185
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
// ─── Pact Ritual Pipeline Phase ───────────────────────────────────────────────
|
||||
// Processes pact ritual signing during the game tick.
|
||||
|
||||
import { useManaStore } from '../manaStore';
|
||||
import { getGuardianForFloor } from '../../data/guardian-encounters';
|
||||
import { HOURS_PER_TICK } from '../../constants';
|
||||
|
||||
export interface PactRitualResult {
|
||||
writes: {
|
||||
signedPacts?: number[];
|
||||
deficientGuardians?: number[];
|
||||
pactRitualFloor: number | null;
|
||||
pactRitualProgress: number;
|
||||
} | null;
|
||||
logs: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 {
|
||||
if (pactRitualFloor === null) return { writes: null, logs: [] };
|
||||
const logs: string[] = [];
|
||||
const guardian = getGuardianForFloor(pactRitualFloor);
|
||||
if (!guardian) return { writes: null, logs: [] };
|
||||
|
||||
const pactAffinity = Math.min(0.9, pactAffinityUpgrade * 0.1 + pactAffinityBonus);
|
||||
const requiredTime = guardian.pactTime * (1 - pactAffinity);
|
||||
|
||||
if (pactRitualProgress + HOURS_PER_TICK >= requiredTime) {
|
||||
logs.push(`📜 Pact signed with ${guardian.name}! You have gained their boons.`);
|
||||
const manaStore = useManaStore.getState();
|
||||
for (const manaType of guardian.unlocksMana || []) {
|
||||
const result = manaStore.unlockElement(manaType, 0);
|
||||
if (result.success) {
|
||||
logs.push(`✨ ${manaType.charAt(0).toUpperCase() + manaType.slice(1)} mana unlocked!`);
|
||||
}
|
||||
}
|
||||
return {
|
||||
writes: {
|
||||
signedPacts: [...signedPacts, pactRitualFloor],
|
||||
defeatedGuardians: defeatedGuardians.filter(f => f !== pactRitualFloor),
|
||||
pactRitualFloor: null,
|
||||
pactRitualProgress: 0,
|
||||
},
|
||||
logs,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
writes: { pactRitualFloor, pactRitualProgress: pactRitualProgress + HOURS_PER_TICK, signedPacts, defeatedGuardians },
|
||||
logs,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user