fix: combat room progression - replace legacy room-utils with spire-utils, align UI with store state
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 1m1s

This commit is contained in:
2026-06-04 18:54:33 +02:00
parent ab3afae2a6
commit 40a50d34f4
6 changed files with 35 additions and 104 deletions
@@ -9,7 +9,7 @@ import { usePrestigeStore } from './prestigeStore';
import { useDisciplineStore } from './discipline-slice';
import { useManaStore } from './manaStore';
import { summonGolemsOnRoomEntry } from './golem-combat-actions';
import type { FloorState } from '../types';
type GetFn = () => CombatStore;
type SetFn = (state: Partial<CombatState>) => void;
@@ -253,7 +253,7 @@ export function onEnterLibraryRoom(get: GetFn, set: SetFn): void {
// ─── enterSpireMode (climbing spec §4.1) ──────────────────────────────────────
export function createEnterSpireMode(get: GetFn, set: SetFn, generateFloorState: (floor: number) => FloorState) {
export function createEnterSpireMode(get: GetFn, set: SetFn) {
return () => {
const prestigeStore = usePrestigeStore.getState();
const spireKey = prestigeStore.prestigeUpgrades.spireKey || 0;
+12 -7
View File
@@ -6,7 +6,7 @@ import { persist } from 'zustand/middleware';
import { createSafeStorage } from '../utils/safe-persist';
import type { GameAction, SpellState, FloorState, GolemancyState, ActivityLogEntry, AchievementState, EquipmentSpellState, ActivityEventType, ActiveGolem, EnemyState, EquipmentInstance } from '../types';
import { getFloorMaxHP } from '../utils';
import { generateFloorState } from '../utils/room-utils';
import { generateSpireFloorState, getRoomsForFloor } from '../utils/spire-utils';
import { addActivityLogEntry } from '../utils/activity-log';
import { processCombatTick, makeInitialSpells } from './combat-actions';
import { getGuardianForFloor } from '../data/guardian-encounters';
@@ -32,7 +32,7 @@ export const useCombatStore = create<CombatStore>()(
spireMode: false,
// Room system
currentRoom: generateFloorState(1),
currentRoom: generateSpireFloorState(1, 0, getRoomsForFloor(1, 1 * 12345)),
// Spire climbing state
clearedFloors: {},
@@ -164,9 +164,11 @@ export const useCombatStore = create<CombatStore>()(
set((s) => {
if (s.currentFloor <= 1) return s;
const newFloor = s.currentFloor - 1;
const rooms = getRoomsForFloor(newFloor, newFloor * 12345);
const newRoom = generateSpireFloorState(newFloor, 0, rooms);
return {
currentFloor: newFloor,
currentRoom: generateFloorState(newFloor),
currentRoom: newRoom,
floorMaxHP: getFloorMaxHP(newFloor),
floorHP: getFloorMaxHP(newFloor),
castProgress: 0,
@@ -175,7 +177,9 @@ export const useCombatStore = create<CombatStore>()(
},
exitSpireMode: () => {
set((s) => ({
set((s) => {
const rooms = getRoomsForFloor(s.exitFloor, s.exitFloor * 12345);
return {
spireMode: false,
currentAction: 'meditate',
climbDirection: null,
@@ -183,7 +187,7 @@ export const useCombatStore = create<CombatStore>()(
currentFloor: s.exitFloor,
floorHP: getFloorMaxHP(s.exitFloor),
floorMaxHP: getFloorMaxHP(s.exitFloor),
currentRoom: generateFloorState(s.exitFloor),
currentRoom: generateSpireFloorState(s.exitFloor, 0, rooms),
castProgress: 0,
clearedFloors: {},
clearedRooms: {},
@@ -194,7 +198,8 @@ export const useCombatStore = create<CombatStore>()(
roomsPerFloor: 1,
maxFloorReached: Math.max(s.maxFloorReached, 1),
golemancy: { ...s.golemancy, activeGolems: [], summonedGolems: [] },
}));
};
});
},
startClimbUp: () => set({ climbDirection: 'up', currentAction: 'climb' }),
@@ -239,7 +244,7 @@ export const useCombatStore = create<CombatStore>()(
}));
},
enterSpireMode: createEnterSpireMode(get, set, generateFloorState),
enterSpireMode: createEnterSpireMode(get, set),
learnSpell: (spellId: string) => {
set((state) => ({