refactor: Redesign Invoker disciplines for pact bonuses and guardian boons
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s
- Replace generic spell-casting/void-manipulation with pact-focused disciplines - Add Pact Attunement (light): reduces pact signing time, boosts pact affinity - Add Guardian's Boon (dark): amplifies all guardian unique perks - Add pactAffinityBonus and guardianBoonMultiplier stat keys to effect system - Apply pactAffinityBonus in pact signing time calculation (gameStore) - Scale guardian boon values by guardianBoonMultiplier (combat-utils) - Guard Invoker discipline activation behind signedPacts.length > 0 - Add 'Signed guardian pact' prerequisite display in discipline-math
This commit is contained in:
@@ -71,7 +71,10 @@ export interface BoonBonuses {
|
||||
}
|
||||
|
||||
// Helper to calculate total boon bonuses from signed pacts
|
||||
export function getBoonBonuses(signedPacts: number[]): BoonBonuses {
|
||||
export function getBoonBonuses(
|
||||
signedPacts: number[],
|
||||
guardianBoonMultiplier: number = 1.0,
|
||||
): BoonBonuses {
|
||||
const bonuses: BoonBonuses = {
|
||||
maxMana: 0,
|
||||
manaRegen: 0,
|
||||
@@ -92,42 +95,43 @@ export function getBoonBonuses(signedPacts: number[]): BoonBonuses {
|
||||
if (!guardian) continue;
|
||||
|
||||
for (const boon of guardian.boons) {
|
||||
let value = boon.value * guardianBoonMultiplier;
|
||||
switch (boon.type) {
|
||||
case 'maxMana':
|
||||
bonuses.maxMana += boon.value;
|
||||
bonuses.maxMana += value;
|
||||
break;
|
||||
case 'manaRegen':
|
||||
bonuses.manaRegen += boon.value;
|
||||
bonuses.manaRegen += value;
|
||||
break;
|
||||
case 'castingSpeed':
|
||||
bonuses.castingSpeed += boon.value;
|
||||
bonuses.castingSpeed += value;
|
||||
break;
|
||||
case 'elementalDamage':
|
||||
bonuses.elementalDamage += boon.value;
|
||||
bonuses.elementalDamage += value;
|
||||
break;
|
||||
case 'rawDamage':
|
||||
bonuses.rawDamage += boon.value;
|
||||
bonuses.rawDamage += value;
|
||||
break;
|
||||
case 'critChance':
|
||||
bonuses.critChance += boon.value;
|
||||
bonuses.critChance += value;
|
||||
break;
|
||||
case 'critDamage':
|
||||
bonuses.critDamage += boon.value;
|
||||
bonuses.critDamage += value;
|
||||
break;
|
||||
case 'spellEfficiency':
|
||||
bonuses.spellEfficiency += boon.value;
|
||||
bonuses.spellEfficiency += value;
|
||||
break;
|
||||
case 'manaGain':
|
||||
bonuses.manaGain += boon.value;
|
||||
bonuses.manaGain += value;
|
||||
break;
|
||||
case 'insightGain':
|
||||
bonuses.insightGain += boon.value;
|
||||
bonuses.insightGain += value;
|
||||
break;
|
||||
case 'studySpeed':
|
||||
bonuses.studySpeed += boon.value;
|
||||
bonuses.studySpeed += value;
|
||||
break;
|
||||
case 'prestigeInsight':
|
||||
bonuses.prestigeInsight += boon.value;
|
||||
bonuses.prestigeInsight += value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,6 +125,12 @@ export function checkDisciplinePrerequisites(
|
||||
const missingPrereqs: string[] = [];
|
||||
|
||||
for (const reqId of discipline.requires) {
|
||||
// Special case: 'signed_pact' requires at least one guardian pact
|
||||
if (reqId === 'signed_pact') {
|
||||
missingPrereqs.push('Signed guardian pact');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if this is a discipline prerequisite (exists in definitions)
|
||||
const reqDef = allDefinitions.find((d) => d.id === reqId);
|
||||
if (reqDef) {
|
||||
|
||||
Reference in New Issue
Block a user