forked from phenom/healer-man
Release Healer Man 0.1.22
This commit is contained in:
1 parent
f6f2375145
commit
7f6001723a
144 files changed
+54107
-690
No files matched your search
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user