fix: split SpireTab.tsx to 395 lines, remove require() imports, import from data modules; complete store migration
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 30m15s

This commit is contained in:
Refactoring Agent
2026-05-04 13:36:10 +02:00
parent 0eabd604b0
commit 837d963b63
41 changed files with 727 additions and 3935 deletions
+2 -2
View File
@@ -46,7 +46,7 @@ export interface CombatState {
attackSpeedMult: number,
onFloorCleared: (floor: number, wasGuardian: boolean) => void,
onDamageDealt: (damage: number) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }> },
) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }>; logMessages: string[] };
) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }>; logMessages: string[]; totalManaGathered: number };
// Reset
resetCombat: (startFloor: number, spellsToKeep?: string[]) => void;
@@ -211,7 +211,7 @@ export const useCombatStore = create<CombatState>()(
set({
currentFloor,
floorHP,
floorMaxHP,
floorMaxHP: getFloorMaxHP(currentFloor),
maxFloorReached: Math.max(state.maxFloorReached, currentFloor),
castProgress,
});
+139
View File
@@ -1,5 +1,18 @@
import { useEffect } from 'react';
import { useGameStore } from './gameStore';
import { useManaStore } from './manaStore';
import { useSkillStore } from './skillStore';
import { usePrestigeStore } from './prestigeStore';
import { useCombatStore } from './combatStore';
import { useUIStore } from './uiStore';
import { getUnifiedEffects } from '../effects';
import {
computeMaxMana,
computeRegen,
computeClickMana,
getMeditationBonus,
getIncursionStrength,
} from '../utils';
import { TICK_MS } from '../constants';
export function useGameLoop() {
@@ -10,3 +23,129 @@ export function useGameLoop() {
return () => clearInterval(interval);
}, [tick]);
}
// ─── Shared Selector Hooks for Common Derived State ────────────────────────────
/**
* Get unified effects from all relevant stores
*/
export function useUnifiedEffects() {
const skillUpgrades = useSkillStore((s) => s.skillUpgrades);
const skillTiers = useSkillStore((s) => s.skillTiers);
const equippedInstances = useGameStore((s) => s.equippedInstances);
const equipmentInstances = useGameStore((s) => s.equipmentInstances);
return getUnifiedEffects({
skillUpgrades,
skillTiers,
equippedInstances,
equipmentInstances,
});
}
/**
* Get computed mana stats (maxMana, baseRegen, clickMana, meditationMultiplier, effectiveRegen)
*/
export function useManaStats() {
const skills = useSkillStore((s) => s.skills);
const prestigeUpgrades = usePrestigeStore((s) => s.prestigeUpgrades);
const skillUpgrades = useSkillStore((s) => s.skillUpgrades);
const skillTiers = useSkillStore((s) => s.skillTiers);
const meditateTicks = useManaStore((s) => s.meditateTicks);
const day = useGameStore((s) => s.day);
const hour = useGameStore((s) => s.hour);
const upgradeEffects = getUnifiedEffects({
skillUpgrades,
skillTiers,
equippedInstances: {},
equipmentInstances: {},
});
const maxMana = computeMaxMana(
{ skills, prestigeUpgrades, skillUpgrades, skillTiers },
upgradeEffects
);
const baseRegen = computeRegen(
{ skills, prestigeUpgrades, skillUpgrades, skillTiers },
upgradeEffects
);
const clickMana = computeClickMana({
skills,
prestigeUpgrades,
skillUpgrades,
skillTiers,
});
const meditationMultiplier = getMeditationBonus(meditateTicks, skills, upgradeEffects.meditationEfficiency);
const incursionStrength = getIncursionStrength(day, hour);
const effectiveRegenWithSpecials = baseRegen * (1 - incursionStrength);
// Mana Cascade bonus
const manaCascadeBonus = upgradeEffects.specials.has('mana_cascade')
? Math.floor(maxMana / 100) * 0.1
: 0;
// Mana Waterfall bonus
const manaWaterfallBonus = upgradeEffects.specials.has('mana_waterfall')
? Math.floor(maxMana / 100) * 0.25
: 0;
const effectiveRegen = (effectiveRegenWithSpecials + manaCascadeBonus + manaWaterfallBonus) * meditationMultiplier;
return {
maxMana,
baseRegen,
effectiveRegen,
incursionStrength,
clickMana,
meditationMultiplier,
manaCascadeBonus,
manaWaterfallBonus,
upgradeEffects,
};
}
/**
* Get combat-related derived state
*/
export function useCombatStats() {
const skills = useSkillStore((s) => s.skills);
const signedPacts = usePrestigeStore((s) => s.signedPacts);
const equippedInstances = useGameStore((s) => s.equippedInstances);
const equipmentInstances = useGameStore((s) => s.equipmentInstances);
const skillUpgrades = useSkillStore((s) => s.skillUpgrades);
const skillTiers = useSkillStore((s) => s.skillTiers);
const upgradeEffects = getUnifiedEffects({
skillUpgrades,
skillTiers,
equippedInstances,
equipmentInstances,
});
return {
skills,
signedPacts,
equippedInstances,
equipmentInstances,
upgradeEffects,
};
}
/**
* Get equipment-related derived state
*/
export function useEquipmentState() {
const equippedInstances = useGameStore((s) => s.equippedInstances);
const equipmentInstances = useGameStore((s) => s.equipmentInstances);
const elements = useManaStore((s) => s.elements);
return {
equippedInstances,
equipmentInstances,
elements,
};
}