Release Healer Man 0.1.22

This commit is contained in:
phenom committed 2026-09-09 11:21:33 -04:00
1 parent f6f2375145
commit 7f6001723a
144 files changed
+54107 -690

No files matched your search

+26 -9
View File
@@ -1,23 +1,40 @@
import { useCombatStore } from "./combatStore";
import { requireDungeonDefinition } from "./dungeonRegistry";
import { useGameStore } from "./store";
import { resetDungeonEncounters } from "./dungeonEncounterRuntime";
import {
activeDungeonCompletedObjectiveIds,
resetDungeonEncounters,
} from "./dungeonEncounterRuntime";
/**
* Atomically returns a defeated player to the dungeon entrance and restores
* the encounter. Keeping this outside the render tree makes the behavior easy
* to verify and prevents a frame where the camera resets but combat stays dead.
* Atomically returns a defeated player to the saved run spawn and resets the
* current pull. Defeated enemies and persisted dungeon progress remain clear,
* matching a wipe instead of silently starting a brand-new dungeon.
*/
export function respawnDefeatedPlayer(): boolean {
const combat = useCombatStore.getState();
if (combat.health > 0) return false;
const dungeonId = useGameStore.getState().activeDungeonId;
const completedObjectiveIds = new Set(activeDungeonCompletedObjectiveIds(dungeonId));
const retrySpawnIds = new Set(
(requireDungeonDefinition(dungeonId).encounterSpawnGroups ?? [])
.flatMap((group) => group.spawns.map((spawn) => spawn.id)),
);
const preserveDefeatedIds = Object.values(combat.mobs)
.filter((mob) => (
mob.dead
&& (!retrySpawnIds.has(mob.id) || completedObjectiveIds.has(mob.id))
))
.map((mob) => mob.id);
if (typeof document !== "undefined" && document.pointerLockElement) {
document.exitPointerLock();
}
useGameStore.getState().resetAtEntrance();
resetDungeonEncounters("dungeon", useGameStore.getState().activeDungeonId);
const entrance = useGameStore.getState().playerPosition;
combat.resetEncounter();
useCombatStore.getState().setPlayerPosition(entrance);
useGameStore.getState().resetAfterDefeat();
resetDungeonEncounters("boss-wipe", dungeonId);
const respawnPosition = useGameStore.getState().playerPosition;
combat.resetEncounter({ preserveDefeatedIds });
useCombatStore.getState().setPlayerPosition(respawnPosition);
return true;
}