update: loading waiting

This commit is contained in:
math-pixel
2026-05-12 21:47:54 +02:00
parent 28c6ef199f
commit f9d7c3f00e
3 changed files with 13 additions and 5 deletions
+3 -4
View File
@@ -1,21 +1,20 @@
import { useEffect, useRef } from "react"; import { useEffect, useRef } from "react";
import { AudioManager } from "@/managers/AudioManager";
import { useGameStore } from "@/managers/stores/useGameStore"; import { useGameStore } from "@/managers/stores/useGameStore";
import { AUDIO_PATHS } from "@/data/audioConfig";
export function GameFlow(): null { export function GameFlow(): null {
const step = useGameStore((state) => state.intro.currentStep); const step = useGameStore((state) => state.intro.currentStep);
const setStep = useGameStore((state) => state.setIntroStep); const setStep = useGameStore((state) => state.setIntroStep);
const isCinematicPlaying = useGameStore((state) => state.isCinematicPlaying); const isCinematicPlaying = useGameStore((state) => state.isCinematicPlaying);
const sceneReady = useGameStore((state) => state.sceneReady);
const setCanMove = useGameStore((state) => state.setCanMove); const setCanMove = useGameStore((state) => state.setCanMove);
const hasInitialized = useRef(false); const hasInitialized = useRef(false);
useEffect(() => { useEffect(() => {
if (!hasInitialized.current && step === "intro") { if (!hasInitialized.current && step === "intro" && sceneReady) {
hasInitialized.current = true; hasInitialized.current = true;
setStep("sequence_video"); setStep("sequence_video");
} }
}, [step, setStep]); }, [step, setStep, sceneReady]);
useEffect(() => { useEffect(() => {
if (step === "sequence_video" && !isCinematicPlaying) { if (step === "sequence_video" && !isCinematicPlaying) {
+4
View File
@@ -34,6 +34,7 @@ interface MissionFlowState {
interface GameState { interface GameState {
mainState: MainGameState; mainState: MainGameState;
isCinematicPlaying: boolean; isCinematicPlaying: boolean;
sceneReady: boolean;
missionFlow: MissionFlowState; missionFlow: MissionFlowState;
intro: IntroState; intro: IntroState;
bike: MissionState & { bike: MissionState & {
@@ -56,6 +57,7 @@ interface GameState {
interface GameActions { interface GameActions {
setMainState: (mainState: MainGameState) => void; setMainState: (mainState: MainGameState) => void;
setCinematicPlaying: (isCinematicPlaying: boolean) => void; setCinematicPlaying: (isCinematicPlaying: boolean) => void;
setSceneReady: (sceneReady: boolean) => void;
hideDialog: () => void; hideDialog: () => void;
setActivityCity: (activityCity: boolean) => void; setActivityCity: (activityCity: boolean) => void;
setCanMove: (canMove: boolean) => void; setCanMove: (canMove: boolean) => void;
@@ -219,6 +221,7 @@ function createInitialGameState(): GameState {
return { return {
mainState: "intro", mainState: "intro",
isCinematicPlaying: false, isCinematicPlaying: false,
sceneReady: false,
missionFlow: { missionFlow: {
activityCity: true, activityCity: true,
canMove: false, canMove: false,
@@ -257,6 +260,7 @@ export const useGameStore = create<GameStore>()((set) => ({
...createInitialGameState(), ...createInitialGameState(),
setMainState: (mainState) => set({ mainState }), setMainState: (mainState) => set({ mainState }),
setCinematicPlaying: (isCinematicPlaying) => set({ isCinematicPlaying }), setCinematicPlaying: (isCinematicPlaying) => set({ isCinematicPlaying }),
setSceneReady: (sceneReady) => set({ sceneReady }),
hideDialog: () => hideDialog: () =>
set((state) => ({ set((state) => ({
missionFlow: { ...state.missionFlow, dialogMessage: null }, missionFlow: { ...state.missionFlow, dialogMessage: null },
+6 -1
View File
@@ -19,6 +19,7 @@ export function HomePage(): React.JSX.Element {
(state) => state.missionFlow.dialogMessage, (state) => state.missionFlow.dialogMessage,
); );
const hideDialog = useGameStore((state) => state.hideDialog); const hideDialog = useGameStore((state) => state.hideDialog);
const setSceneReady = useGameStore((state) => state.setSceneReady);
const [sceneLoadingState, setSceneLoadingState] = useState<SceneLoadingState>( const [sceneLoadingState, setSceneLoadingState] = useState<SceneLoadingState>(
INITIAL_SCENE_LOADING_STATE, INITIAL_SCENE_LOADING_STATE,
); );
@@ -42,13 +43,17 @@ export function HomePage(): React.JSX.Element {
return currentState; return currentState;
} }
if (nextState.status === "ready" && currentState.status !== "ready") {
setSceneReady(true);
}
return { return {
...nextState, ...nextState,
progress: Math.max(currentState.progress, nextState.progress), progress: Math.max(currentState.progress, nextState.progress),
}; };
}); });
}, },
[], [setSceneReady],
); );
return ( return (