Release Healer Man 0.1.21

This commit is contained in:
phenom committed 2026-09-08 10:40:26 -04:00
1 parent 699fc858c9
commit f6f2375145
210 files changed
+976039 -6247

No files matched your search

+26 -1
View File
@@ -8,7 +8,7 @@ import type { GmReviewTarget } from "./gmContentReview";
export type AssetStatus = "checking" | "loading" | "ready" | "proxy" | "error";
export type InputMode = "keyboard" | "gamepad";
export type GameMode = "dungeon" | "manastorm";
export type GameOverlay = "pause" | "party" | "inventory" | "map" | "spellbook" | "talents" | "bindings" | "options" | "gm" | null;
export type GameOverlay = "pause" | "party" | "inventory" | "map" | "boss-guide" | "spellbook" | "talents" | "bindings" | "options" | "gm" | null;
interface PlayerSnapshot {
position: Vector3Tuple;
@@ -42,6 +42,10 @@ export interface GameState {
distanceTravelled: number;
hasMoved: boolean;
resetRevision: number;
/** Renderer relocation signal that does not imply a combat/encounter reset. */
relocationRevision: number;
/** Explicit local reset request; dungeon activation performs its reset before hydration. */
encounterResetRevision: number;
activateDungeon: (
dungeonId: DungeonId,
difficultyId?: string,
@@ -65,6 +69,7 @@ export interface GameState {
setActionLayer: (layer: ActionBindingLayer) => void;
setAssetStatus: (status: AssetStatus, message?: string | null) => void;
updatePlayerSnapshot: (snapshot: PlayerSnapshot) => void;
relocatePlayer: (spawn: WorldSpawn, makeActiveSpawn?: boolean) => void;
resetAtActiveSpawn: () => void;
resetAtEntrance: () => void;
}
@@ -97,6 +102,8 @@ export const useGameStore = create<GameState>((set) => ({
distanceTravelled: 0,
hasMoved: false,
resetRevision: 0,
relocationRevision: 0,
encounterResetRevision: 0,
activateDungeon: (activeDungeonId, requestedDifficultyId, options) => set((state) => {
const definition = requireDungeonDefinition(activeDungeonId);
const activeDifficultyId = definition.difficultyVariants.some((variant) => variant.id === requestedDifficultyId)
@@ -130,6 +137,7 @@ export const useGameStore = create<GameState>((set) => ({
distanceTravelled: 0,
hasMoved: false,
resetRevision: state.resetRevision + 1,
relocationRevision: state.relocationRevision + 1,
};
}),
openOverlay: (overlay) => set({
@@ -206,6 +214,19 @@ export const useGameStore = create<GameState>((set) => ({
hasMoved: state.hasMoved || distanceDelta > 0.02,
};
}),
relocatePlayer: (spawn, makeActiveSpawn = false) => set((state) => {
const definition = requireDungeonDefinition(state.activeDungeonId);
return {
...(makeActiveSpawn ? { activeSpawn: spawn } : {}),
playerPosition: spawn.footPosition,
playerNavigationPosition: spawn.footPosition,
playerGrounded: true,
cameraYaw: spawn.yaw,
areaName: resolveAreaNameForDungeon(definition, spawn.footPosition),
cameraLookActive: false,
relocationRevision: state.relocationRevision + 1,
};
}),
resetAtActiveSpawn: () => set((state) => {
const definition = requireDungeonDefinition(state.activeDungeonId);
return {
@@ -222,6 +243,8 @@ export const useGameStore = create<GameState>((set) => ({
hasMoved: false,
actionLayer: "primary",
resetRevision: state.resetRevision + 1,
relocationRevision: state.relocationRevision + 1,
encounterResetRevision: state.encounterResetRevision + 1,
};
}),
resetAtEntrance: () => set((state) => {
@@ -246,6 +269,8 @@ export const useGameStore = create<GameState>((set) => ({
hasMoved: false,
actionLayer: "primary",
resetRevision: state.resetRevision + 1,
relocationRevision: state.relocationRevision + 1,
encounterResetRevision: state.encounterResetRevision + 1,
};
}),
}));