34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import { create } from "zustand";
|
|
import type { MissionStep, RepairMissionId } from "@/types/gameplay/repairMission";
|
|
import type { Vector3Tuple } from "@/types/three/three";
|
|
|
|
export interface RepairPendingCompletion {
|
|
mission: RepairMissionId;
|
|
/** Next step to set. When it equals "done", completeMission() is called
|
|
* instead (ebike / farm have no further narrative sub-step). */
|
|
nextStep: MissionStep;
|
|
}
|
|
|
|
interface RepairTransitionState {
|
|
/** Set when the repair game reaches "done". page.tsx reads this and
|
|
* executes the completion only after the world has fully re-loaded. */
|
|
pendingCompletion: RepairPendingCompletion | null;
|
|
/** Player 3D position captured just before entering the repair scene,
|
|
* used to re-spawn the player at the correct location on return. */
|
|
savedPlayerPosition: Vector3Tuple | null;
|
|
}
|
|
|
|
interface RepairTransitionActions {
|
|
setPendingCompletion: (data: RepairPendingCompletion | null) => void;
|
|
setSavedPlayerPosition: (pos: Vector3Tuple | null) => void;
|
|
}
|
|
|
|
export const useRepairTransitionStore = create<
|
|
RepairTransitionState & RepairTransitionActions
|
|
>()((set) => ({
|
|
pendingCompletion: null,
|
|
savedPlayerPosition: null,
|
|
setPendingCompletion: (data) => set({ pendingCompletion: data }),
|
|
setSavedPlayerPosition: (pos) => set({ savedPlayerPosition: pos }),
|
|
}));
|