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
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 30m15s
This commit is contained in:
@@ -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,
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user