fix: SpireTab store props, mana regen display, skill cost deduction, grimoire cost format, unequip store, add test suite
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m34s

This commit is contained in:
2026-05-08 11:45:31 +02:00
parent 0fadbfef4a
commit 71fbc7c964
12 changed files with 354 additions and 22 deletions
+14 -12
View File
@@ -7,9 +7,10 @@ import { ManaDisplay } from '@/components/game';
import { ActionButtons } from '@/components/game';
import { CalendarDisplay } from '@/components/game';
import { DebugName } from '@/lib/game/debug-context';
import { useGameStore, useManaStore, useSkillStore, useCombatStore, useCraftingStore } from '@/lib/game/stores';
import { useGameStore, useManaStore, useSkillStore, useCombatStore, useCraftingStore, usePrestigeStore } from '@/lib/game/stores';
import { getUnifiedEffects } from '@/lib/game/effects';
import { computeMaxMana, computeRegen, computeClickMana, getMeditationBonus, getIncursionStrength } from '@/lib/game/stores';
import { getMeditationBonus, getIncursionStrength } from '@/lib/game/stores';
import { computeTotalMaxMana, computeTotalRegen, computeTotalClickMana } from '@/lib/game/effects';
export function LeftPanel() {
const [isGathering, setIsGathering] = useState(false);
@@ -23,6 +24,8 @@ export function LeftPanel() {
const skillTiers = useSkillStore((s) => s.skillTiers);
const skillUpgrades = useSkillStore((s) => s.skillUpgrades);
const prestigeUpgrades = usePrestigeStore((s) => s.prestigeUpgrades);
const equippedInstances = useCraftingStore((s) => s.equippedInstances);
const equipmentInstances = useCraftingStore((s) => s.equipmentInstances);
@@ -77,19 +80,18 @@ export function LeftPanel() {
equipmentInstances,
});
const maxMana = computeMaxMana(
{ skills, skillTiers, skillUpgrades },
const maxMana = computeTotalMaxMana(
{ skills, prestigeUpgrades, skillUpgrades, skillTiers, equippedInstances, equipmentInstances },
upgradeEffects
);
const baseRegen = computeRegen(
{ skills, skillTiers, skillUpgrades },
const baseRegen = computeTotalRegen(
{ skills, prestigeUpgrades, skillUpgrades, skillTiers, equippedInstances, equipmentInstances },
upgradeEffects
);
const clickMana = computeTotalClickMana(
{ skills, skillUpgrades, skillTiers, equippedInstances, equipmentInstances },
upgradeEffects
);
const clickMana = computeClickMana({
skills,
skillTiers,
skillUpgrades,
});
const meditationMultiplier = getMeditationBonus(meditateTicks, skills, upgradeEffects.meditationEfficiency);
const incursionStrength = getIncursionStrength(day, hour);
const effectiveRegen = baseRegen * (1 - incursionStrength) * meditationMultiplier;
@@ -127,7 +129,7 @@ export function LeftPanel() {
<DebugName name="ActionButtons">
<ActionButtons
currentAction={currentAction}
currentStudyTarget={currentStudyTarget}
currentStudyTarget={currentStudyTarget as any}
designProgress={designProgress}
designProgress2={designProgress2}
preparationProgress={preparationProgress}
+5 -1
View File
@@ -112,7 +112,11 @@ function GrimoireTab() {
</div>
<p className="text-sm text-gray-400 mb-3">{spell.desc}</p>
<div className="text-xs text-gray-500 space-y-1">
<div>Cost: {(spell.cost as any[]).map((c: any) => `${c.amount} ${c.type}`).join(', ')}</div>
<div>Cost: {spell.cost.amount} {
spell.cost.type === 'element'
? spell.cost.element
: 'raw mana'
}</div>
<div>Power: {spell.power}</div>
{spell.effect && <div>Effect: {spell.effect}</div>}
</div>