From 4b7498ae137807a39d34ce04c0feb32f3d65d781 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Mon, 11 May 2026 10:03:07 +0200 Subject: [PATCH] update: trigger dialogue en fonction du gameplay --- .../three/gameplay/RepairGameZone.tsx | 3 +++ src/utils/dialogues/playDialogue.ts | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/three/gameplay/RepairGameZone.tsx b/src/components/three/gameplay/RepairGameZone.tsx index cf0aaed..5ce1d45 100644 --- a/src/components/three/gameplay/RepairGameZone.tsx +++ b/src/components/three/gameplay/RepairGameZone.tsx @@ -8,6 +8,7 @@ import { REPAIR_GAME_ZONE_RADIUS, } from "@/data/gameplay/repairGameConfig"; import { useGameStore } from "@/managers/stores/useGameStore"; +import { playGameplayDialogueById } from "@/utils/dialogues/playDialogue"; const CASE_CLOSED_STEPS = new Set(["locked", "waiting"]); @@ -26,6 +27,7 @@ export function RepairGameZone(): React.JSX.Element { if (CASE_CLOSED_STEPS.has(bikeStep)) { setBikeState({ currentStep: "inspected" }); + void playGameplayDialogueById("narrateur_ebikecasse"); } }; @@ -46,6 +48,7 @@ export function RepairGameZone(): React.JSX.Element { if (bikeStep === "fragmented") { setBikeState({ currentStep: "scanning" }); + void playGameplayDialogueById("narrateur_galetscan"); } }; diff --git a/src/utils/dialogues/playDialogue.ts b/src/utils/dialogues/playDialogue.ts index 3c05489..c889ce2 100644 --- a/src/utils/dialogues/playDialogue.ts +++ b/src/utils/dialogues/playDialogue.ts @@ -2,7 +2,10 @@ import { AudioManager } from "@/managers/AudioManager"; import { useSettingsStore } from "@/managers/stores/useSettingsStore"; import { useSubtitleStore } from "@/managers/stores/useSubtitleStore"; import type { DialogueManifest } from "@/types/dialogues/dialogues"; -import { loadDialogueSubtitleCue } from "@/utils/dialogues/loadDialogueManifest"; +import { + loadDialogueManifest, + loadDialogueSubtitleCue, +} from "@/utils/dialogues/loadDialogueManifest"; interface QueuedDialogueRequest { manifest: DialogueManifest; @@ -12,6 +15,8 @@ interface QueuedDialogueRequest { const DIALOGUE_PLAY_START_TIMEOUT_MS = 800; const dialogueQueue: QueuedDialogueRequest[] = []; +let gameplayDialogueManifestPromise: Promise | null = + null; let isDialogueQueuePlaying = false; export function queueDialogueById( @@ -30,6 +35,16 @@ export function clearQueuedDialogues(): void { } } +export async function playGameplayDialogueById( + dialogueId: string, +): Promise { + gameplayDialogueManifestPromise ??= loadDialogueManifest(); + const manifest = await gameplayDialogueManifestPromise; + if (!manifest) return null; + + return queueDialogueById(manifest, dialogueId); +} + export async function playDialogueById( manifest: DialogueManifest, dialogueId: string,