fix: resolve priority 4 issues — discipline mutation, skill→discipline migration, uiStore persistence, game loop interval, toast listener leak, page re-renders
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s

- Issue 70: Fix discipline-slice.ts nested element mutation (use immutable spread)
- Issue 71: Add persist middleware to uiStore for paused/gameOver/victory
- Issue 72: Wire discipline effects into calcDamage (spell-casting, void-manipulation)
- Issue 73: Fix useGameLoop interval recreation (use getState() + empty deps)
- Issue 74: Fix use-toast.ts listener leak (change [state] dep to [])
- Issue 75: Reduce page.tsx re-renders with useShallow for multi-field subscriptions
- Issue 76: Fix createGatherMana hardcoded click mana (use computeClickMana with discipline effects)
- Issue 77: Pass discipline effects to computeMaxMana/computeRegen/calcInsight in tick()
- Export DisciplineBonuses type and useDisciplineStore from barrel exports
- Update tests to match new function signatures
This commit is contained in:
2026-05-19 13:53:33 +02:00
parent ebcaab62bf
commit 50a9a62060
17 changed files with 215 additions and 154 deletions
+8 -10
View File
@@ -169,7 +169,7 @@ describe('computeMaxMana', () => {
skillUpgrades: {},
skillTiers: {},
};
const effects = { maxManaBonus: 0, maxManaMultiplier: 1 };
const effects = { maxManaBonus: 0, maxManaMultiplier: 1 } as any;
const result = computeMaxMana(state, effects);
expect(result).toBe(100);
});
@@ -181,7 +181,7 @@ describe('computeMaxMana', () => {
skillUpgrades: {},
skillTiers: {},
};
const effects = { maxManaBonus: 0, maxManaMultiplier: 1 };
const effects = { maxManaBonus: 0, maxManaMultiplier: 1 } as any;
const result = computeMaxMana(state, effects);
expect(result).toBe(100 + 5 * 500); // Base + 500 per level
});
@@ -193,7 +193,7 @@ describe('computeMaxMana', () => {
skillUpgrades: {},
skillTiers: {},
};
const effects = { maxManaBonus: 0, maxManaMultiplier: 1.5 };
const effects = { maxManaBonus: 0, maxManaMultiplier: 1.5 } as any;
const result = computeMaxMana(state, effects);
expect(result).toBe(150); // 100 * 1.5
});
@@ -205,7 +205,7 @@ describe('computeMaxMana', () => {
skillUpgrades: {},
skillTiers: {},
};
const effects = { maxManaBonus: 50, maxManaMultiplier: 1 };
const effects = { maxManaBonus: 50, maxManaMultiplier: 1 } as any;
const result = computeMaxMana(state, effects);
expect(result).toBe(150); // 100 + 50
});
@@ -218,8 +218,9 @@ describe('computeRegen', () => {
prestigeUpgrades: {},
skillUpgrades: {},
skillTiers: {},
attunements: {},
};
const effects = { regenBonus: 0, regenMultiplier: 1, permanentRegenBonus: 0 };
const effects = { regenBonus: 0, regenMultiplier: 1, permanentRegenBonus: 0 } as any;
const result = computeRegen(state, effects);
// Base regen is 2 (this test provides effects, so no attunement bonus)
expect(result).toBe(2);
@@ -230,12 +231,9 @@ describe('computeClickMana', () => {
it('should return base click mana with no skills', () => {
const state = {
skills: {},
prestigeUpgrades: {},
skillUpgrades: {},
skillTiers: {},
};
const effects = { clickManaBonus: 0, clickManaMultiplier: 1 };
const result = computeClickMana(state, effects);
const discipline = { bonuses: {}, multipliers: {} };
const result = computeClickMana(state, discipline);
expect(result).toBeGreaterThanOrEqual(1);
});
});