3 Commits

Author SHA1 Message Date
Tom Boullay 296c0b233a fix(pylon): start post-ebike delay in tampon state
🔍 Lint / 🪄 Check lint (push) Has been cancelled
🔍 Lint / 🎨 Check format (push) Has been cancelled
🔍 Lint / 🔎 Typecheck (push) Has been cancelled
🔍 Lint / 🏗 Build (push) Has been cancelled
📊 Quality / 📦 Bundle Size (push) Has been cancelled
📊 Quality / 🔒 Security Audit (push) Has been cancelled
📊 Quality / 📋 Dependency Freshness (push) Has been cancelled
2026-06-03 07:31:10 +02:00
Tom Boullay d8da88246d fix(assets): match packderelance texture casing
🔍 Lint / 🪄 Check lint (push) Has been cancelled
🔍 Lint / 🎨 Check format (push) Has been cancelled
🔍 Lint / 🔎 Typecheck (push) Has been cancelled
📊 Quality / 🔒 Security Audit (push) Has been cancelled
📊 Quality / 📋 Dependency Freshness (push) Has been cancelled
📊 Quality / 📦 Bundle Size (push) Has been cancelled
🔍 Lint / 🏗 Build (push) Has been cancelled
2026-06-03 07:24:23 +02:00
Tom Boullay 063ee20202 fix(pylon): delay approach sequence trigger 2026-06-03 07:23:30 +02:00
6 changed files with 31 additions and 6 deletions
Binary file not shown.
@@ -5,7 +5,10 @@ import { ZoneDetection } from "@/components/zone/ZoneDetection";
import { PylonFarmerNPC } from "@/components/gameplay/pylon/PylonFarmerNPC";
import { PylonNarratorOutro } from "@/components/gameplay/pylon/PylonNarratorOutro";
import { PYLON_APPROACH_ZONE, PYLON_ARRIVED_ZONE } from "@/data/gameplay/zones";
import { PYLON_NARRATIVE_DIALOGUES } from "@/data/gameplay/pylonConfig";
import {
PYLON_APPROACH_DELAY_MS,
PYLON_NARRATIVE_DIALOGUES,
} from "@/data/gameplay/pylonConfig";
import { AudioManager } from "@/managers/AudioManager";
import { loadDialogueManifest } from "@/utils/dialogues/loadDialogueManifest";
import { playDialogueById } from "@/utils/dialogues/playDialogue";
@@ -19,6 +22,18 @@ export function PylonNarrativeFlow(): React.JSX.Element | null {
const setMissionStep = useGameStore((state) => state.setMissionStep);
const setCanMove = useGameStore((state) => state.setCanMove);
useEffect(() => {
if (mainState !== "pylon" || step !== "tampon") return undefined;
const timeoutId = window.setTimeout(() => {
setMissionStep("pylon", "approaching");
}, PYLON_APPROACH_DELAY_MS);
return () => {
window.clearTimeout(timeoutId);
};
}, [mainState, setMissionStep, step]);
// ── approaching : powerdown sfx → then electricOutage dialogue ────────────
useEffect(() => {
if (mainState !== "pylon" || step !== "approaching") return undefined;
@@ -129,7 +144,7 @@ export function PylonNarrativeFlow(): React.JSX.Element | null {
<ZoneDetection
key="pylon-approach"
zone={PYLON_APPROACH_ZONE}
onEnter={() => setMissionStep("pylon", "approaching")}
onEnter={() => setMissionStep("pylon", "tampon")}
/>
);
}
+2
View File
@@ -41,6 +41,8 @@ export const PYLON_NARRATIVE_INTERACT_RADIUS = 3.5;
export const PYLON_STRAIGHTEN_ANIMATION_DURATION_MS = 2200;
export const PYLON_APPROACH_DELAY_MS = 7500;
export const PYLON_NARRATIVE_DIALOGUES = {
electricOutage: "narrateur_coupureelec",
searchCentral: "narrateur_fouillelecentre",
+8 -2
View File
@@ -11,6 +11,7 @@ const REPAIR_MISSION_ID_VALUES: ReadonlySet<string> = new Set(
export const MISSION_STEPS = [
"locked",
"electricienne_history",
"tampon",
"approaching",
"arrived",
"npc-return",
@@ -26,6 +27,7 @@ export const MISSION_STEPS = [
const MISSION_STEP_VALUES: ReadonlySet<string> = new Set(MISSION_STEPS);
const PYLON_ONLY_MISSION_STEPS = new Set<MissionStep>([
"tampon",
"approaching",
"arrived",
"npc-return",
@@ -61,9 +63,11 @@ export function getNextMissionStep(
): MissionStep {
switch (step) {
case "locked":
return mission === "pylon" ? "approaching" : "waiting";
return mission === "pylon" ? "tampon" : "waiting";
case "electricienne_history":
return "done";
case "tampon":
return "approaching";
case "approaching":
return "arrived";
case "arrived":
@@ -98,8 +102,10 @@ export function getPreviousMissionStep(
return "locked";
case "electricienne_history":
return "locked";
case "approaching":
case "tampon":
return "locked";
case "approaching":
return "tampon";
case "arrived":
return "approaching";
case "npc-return":
+1 -1
View File
@@ -146,7 +146,7 @@ function completeEbikeState(state: GameState): GameStateUpdate {
},
pylon: {
...state.pylon,
currentStep: "approaching",
currentStep: "tampon",
},
};
}
+2
View File
@@ -99,6 +99,7 @@ export interface RepairMissionConfig {
export type MissionStep =
| "locked"
| "tampon"
| "approaching"
| "arrived"
| "npc-return"
@@ -113,6 +114,7 @@ export type MissionStep =
| "electricienne_history";
export const PYLON_NARRATIVE_STEPS = [
"tampon",
"approaching",
"arrived",
"npc-return",