update: cinematic references

This commit is contained in:
Tom Boullay
2026-05-11 13:22:15 +02:00
parent b077b65640
commit ee41361a90
+32 -7
View File
@@ -233,7 +233,9 @@ const saveCinematicManifestPlugin = (): Plugin => ({
try { try {
const data = JSON.parse(Buffer.concat(chunks).toString()) as unknown; const data = JSON.parse(Buffer.concat(chunks).toString()) as unknown;
parseCinematicManifestData(data); const manifest = parseCinematicManifestData(data);
const dialogueManifest = await loadDialogueManifestData();
validateCinematicDialogueCues(manifest, dialogueManifest);
const manifestPath = path.resolve(__dirname, "public/cinematics.json"); const manifestPath = path.resolve(__dirname, "public/cinematics.json");
await fs.promises.writeFile( await fs.promises.writeFile(
@@ -340,12 +342,7 @@ interface DialogueValidationResult extends JsonObject {
async function validateDialogueAssets(): Promise<DialogueValidationResult> { async function validateDialogueAssets(): Promise<DialogueValidationResult> {
const errors: string[] = []; const errors: string[] = [];
const warnings: string[] = []; const warnings: string[] = [];
const manifestPath = path.resolve( const manifest = await loadDialogueManifestData();
__dirname,
"public/sounds/dialogue/dialogues.json",
);
const manifestContent = await fs.promises.readFile(manifestPath, "utf8");
const manifest = parseDialogueManifestData(JSON.parse(manifestContent));
const subtitleCueCache = new Map<string, Set<number>>(); const subtitleCueCache = new Map<string, Set<number>>();
@@ -396,6 +393,15 @@ async function validateDialogueAssets(): Promise<DialogueValidationResult> {
}; };
} }
async function loadDialogueManifestData(): Promise<DialogueManifestData> {
const manifestPath = path.resolve(
__dirname,
"public/sounds/dialogue/dialogues.json",
);
const manifestContent = await fs.promises.readFile(manifestPath, "utf8");
return parseDialogueManifestData(JSON.parse(manifestContent));
}
function parseDialogueManifestData(data: unknown): DialogueManifestData { function parseDialogueManifestData(data: unknown): DialogueManifestData {
if (!isRecord(data) || data.version !== 1) { if (!isRecord(data) || data.version !== 1) {
throw new Error("Invalid dialogue manifest"); throw new Error("Invalid dialogue manifest");
@@ -530,6 +536,25 @@ function parseCinematicData(data: unknown): CinematicData {
return cinematic; return cinematic;
} }
function validateCinematicDialogueCues(
cinematicManifest: CinematicManifestData,
dialogueManifest: DialogueManifestData,
): void {
const dialogueIds = new Set(
dialogueManifest.dialogues.map((dialogue) => dialogue.id),
);
for (const cinematic of cinematicManifest.cinematics) {
for (const cue of cinematic.dialogueCues ?? []) {
if (!dialogueIds.has(cue.dialogueId)) {
throw new Error(
`Cinematic ${cinematic.id} references unknown dialogue ${cue.dialogueId}`,
);
}
}
}
}
function parseCinematicDialogueCueData( function parseCinematicDialogueCueData(
data: unknown, data: unknown,
): CinematicDialogueCueData { ): CinematicDialogueCueData {