forked from phenom/healer-man
64 lines
2.8 KiB
TypeScript
64 lines
2.8 KiB
TypeScript
import { beforeEach, describe, expect, it } from "vitest";
|
|
import { DUNGEON_MANIFEST } from "./dungeonManifest";
|
|
import { clearMobRuntimeRegistry, setMobPosition } from "./mobRuntimeRegistry";
|
|
import { useCombatStore } from "./combatStore";
|
|
import { respawnDefeatedPlayer } from "./deathRespawn";
|
|
import { useGameStore } from "./store";
|
|
import { useWailingEncounterStore } from "./wailingCavernsEncounter";
|
|
import { MANA_POOL_MULTIPLIER } from "./wotlkStats";
|
|
|
|
describe("death respawn", () => {
|
|
beforeEach(() => {
|
|
clearMobRuntimeRegistry();
|
|
useCombatStore.getState().initializeCharacter({ classId: "priest", level: 14, xp: 0 });
|
|
useGameStore.getState().resetAtEntrance();
|
|
useWailingEncounterStore.getState().reset();
|
|
});
|
|
|
|
it("atomically restores the player and encounter at the Wailing Caverns entrance", () => {
|
|
const startingResource = useCombatStore.getState().maxResource;
|
|
useGameStore.getState().updatePlayerSnapshot({ position: [10, -50, 20], yaw: 0.5, distanceDelta: 30 });
|
|
useGameStore.getState().setCameraLookActive(true);
|
|
|
|
useCombatStore.getState().registerMob("respawn-pack:a", { name: "Ravager", maxHealth: 100 });
|
|
setMobPosition("respawn-pack:a", [11, -50, 20]);
|
|
useCombatStore.getState().selectMob("respawn-pack:a");
|
|
useCombatStore.getState().damageMob("respawn-pack:a", 1, 1000);
|
|
expect(useCombatStore.getState().castAbility("priest-psychic-scream", [10, -50, 20], 2000).ok).toBe(true);
|
|
expect(useCombatStore.getState().resource).toBe(
|
|
startingResource - Math.round(startingResource / MANA_POOL_MULTIPLIER * 0.15),
|
|
);
|
|
|
|
const revisionBefore = useGameStore.getState().resetRevision;
|
|
useWailingEncounterStore.setState({ phase: "mutanus", phaseStartedAt: 5_000 });
|
|
useCombatStore.getState().damagePlayer(useCombatStore.getState().maxHealth);
|
|
expect(useCombatStore.getState().health).toBe(0);
|
|
expect(respawnDefeatedPlayer()).toBe(true);
|
|
|
|
expect(useGameStore.getState()).toMatchObject({
|
|
playerPosition: DUNGEON_MANIFEST.entrance.footPosition,
|
|
cameraYaw: DUNGEON_MANIFEST.entrance.yaw,
|
|
cameraLookActive: false,
|
|
resetRevision: revisionBefore + 1,
|
|
});
|
|
expect(useCombatStore.getState()).toMatchObject({
|
|
health: useCombatStore.getState().maxHealth,
|
|
resource: startingResource,
|
|
selectedTargetId: null,
|
|
playerPosition: DUNGEON_MANIFEST.entrance.footPosition,
|
|
});
|
|
expect(useCombatStore.getState().mobs["respawn-pack:a"]).toMatchObject({
|
|
health: 100,
|
|
dead: false,
|
|
engaged: false,
|
|
});
|
|
expect(useWailingEncounterStore.getState()).toMatchObject({
|
|
phase: "locked",
|
|
phaseStartedAt: 0,
|
|
});
|
|
|
|
expect(respawnDefeatedPlayer()).toBe(false);
|
|
expect(useGameStore.getState().resetRevision).toBe(revisionBefore + 1);
|
|
});
|
|
});
|