aboutsummaryrefslogtreecommitdiff
path: root/devtools/create_cryomni3d
diff options
context:
space:
mode:
authorLe Philousophe2019-06-23 09:31:37 +0200
committerLe Philousophe2019-07-05 07:51:19 +0200
commit418cec512f177a0f523c80916770382dd0e4fdaf (patch)
tree2d7d35c48a9f135acccf9d00bfe5d9412a856b2f /devtools/create_cryomni3d
parent57b74a2773ae083121e0e621eb555c19d666ea2a (diff)
downloadscummvm-rg350-418cec512f177a0f523c80916770382dd0e4fdaf.tar.gz
scummvm-rg350-418cec512f177a0f523c80916770382dd0e4fdaf.tar.bz2
scummvm-rg350-418cec512f177a0f523c80916770382dd0e4fdaf.zip
CRYOMNI3D: Add internationalization through external DAT file
Diffstat (limited to 'devtools/create_cryomni3d')
-rw-r--r--devtools/create_cryomni3d/create_cryomni3d_dat.cpp131
-rw-r--r--devtools/create_cryomni3d/create_cryomni3d_dat.h43
-rw-r--r--devtools/create_cryomni3d/module.mk14
-rw-r--r--devtools/create_cryomni3d/util.cpp174
-rw-r--r--devtools/create_cryomni3d/util.h57
-rw-r--r--devtools/create_cryomni3d/versailles.cpp60
-rw-r--r--devtools/create_cryomni3d/versailles.h267
7 files changed, 746 insertions, 0 deletions
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
new file mode 100644
index 0000000000..01262b22d2
--- /dev/null
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
@@ -0,0 +1,131 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+// HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "util.h"
+#include "create_cryomni3d_dat.h"
+
+struct Parts {
+ size_t (*writeHeader)(FILE *f, uint32 offset, uint32 size);
+ size_t (*writeData)(FILE *f);
+ uint32 offset;
+ uint32 size;
+};
+
+#define DEFINE_GAME_PLATFORM_LANG_FUNCS(game, platform, lang) \
+ size_t write ## game ## _ ## platform ## _ ## lang ## Header(FILE *f, \
+ uint32 offset, uint32 size); \
+ size_t write ## game ## _ ## platform ## _ ## lang ## Data(FILE *f);
+#define GAME_PLATFORM_LANG_PART(game, platform, lang) { write ## game ## _ ## platform ## _ ## lang ## Header, \
+ write ## game ## _ ## platform ## _ ## lang ## Data, 0, 0 }
+
+DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, FR)
+
+static Parts gamesParts[] = {
+ GAME_PLATFORM_LANG_PART(Versailles, ALL, FR),
+};
+
+#define CRYOMNI3D_DAT_VER 1 // 32-bit integer
+
+size_t writeFileHeader(FILE *f, uint16 games) {
+ size_t headerSize = 0;
+ fwrite("CY3DDATA", 8, 1, f);
+ headerSize += 8;
+ headerSize += writeUint16LE(f, CRYOMNI3D_DAT_VER);
+ headerSize += writeUint16LE(f, games);
+ // Dummy value to pad to 16 bytes
+ headerSize += writeUint32LE(f, 0);
+ assert((headerSize & PADDING_MASK) == 0);
+ return headerSize;
+}
+
+size_t writeGameHeader(FILE *f, uint32 gameId, uint16 version, uint16 lang, uint32 platforms,
+ uint32 offset, uint32 size) {
+ size_t headerSize = 0;
+ headerSize += writeUint32BE(f, gameId); // BE to keep the tag readable
+ headerSize += writeUint16LE(f, version);
+ headerSize += writeUint16BE(f, lang); // BE to keep the tag readable
+ headerSize += writeUint32LE(f, platforms);
+ headerSize += writeUint32LE(f, offset);
+ headerSize += writeUint32LE(f, size);
+ return headerSize;
+}
+
+static int emitData(char *outputFilename) {
+ FILE *f = fopen(outputFilename, "w+b");
+ if (!f) {
+ printf("ERROR: Unable to create output file %s\n", outputFilename);
+ return 1;
+ }
+
+ printf("Generating %s...\n", outputFilename);
+
+ writeFileHeader(f);
+
+ for (unsigned int i = 0; i < ARRAYSIZE(gamesParts); i++) {
+ gamesParts[i].writeHeader(f, 0xdeadfeed, 0xdeadfeed);
+ }
+
+ // Pad the games list
+ writePadding(f);
+
+ for (unsigned int i = 0; i < ARRAYSIZE(gamesParts); i++) {
+ gamesParts[i].offset = ftell(f);
+ gamesParts[i].size = gamesParts[i].writeData(f);
+ }
+
+ fseek(f, 0, SEEK_SET);
+
+ writeFileHeader(f, ARRAYSIZE(gamesParts));
+
+ for (unsigned int i = 0; i < ARRAYSIZE(gamesParts); i++) {
+ gamesParts[i].writeHeader(f, gamesParts[i].offset, gamesParts[i].size);
+ }
+
+ fclose(f);
+
+ printf("Done!\n");
+
+ return 0;
+}
+
+int main(int argc, char **argv) {
+
+ if (argc > 1) {
+ return emitData(argv[1]);
+ } else {
+ printf("Usage: %s <output.dat>\n", argv[0]);
+ }
+
+ return 0;
+}
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.h b/devtools/create_cryomni3d/create_cryomni3d_dat.h
new file mode 100644
index 0000000000..a040ca47db
--- /dev/null
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.h
@@ -0,0 +1,43 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef CREATE_CRYOMNI3D_DAT_H
+#define CREATE_CRYOMNI3D_DAT_H
+
+#ifndef MKTAG16
+#define MKTAG16(a0,a1) ((uint16)((a1) | ((a0) << 8)))
+#endif
+
+size_t writeFileHeader(FILE *f, uint16 games = 0xdead);
+size_t writeGameHeader(FILE *f, uint32 gameId, uint16 version, uint16 lang, uint32 platforms,
+ uint32 offset = 0xdeadfeed, uint32 size = 0xdeadfeed);
+
+#define PLATFORM_WIN 0x1
+#define PLATFORM_DOS 0x2
+#define PLATFORM_MAC 0x4
+#define PLATFORM_PLAYSTATION 0x8
+#define PLATFORM_SATURN 0x10
+#define PLATFORM_ALL 0xffffffff
+
+#define LANG_FR MKTAG16('f', 'r')
+
+#endif
diff --git a/devtools/create_cryomni3d/module.mk b/devtools/create_cryomni3d/module.mk
new file mode 100644
index 0000000000..79e2b1a11a
--- /dev/null
+++ b/devtools/create_cryomni3d/module.mk
@@ -0,0 +1,14 @@
+
+MODULE := devtools/create_cryomni3d
+
+MODULE_OBJS := \
+ create_cryomni3d_dat.o \
+ util.o \
+ versailles.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_cryomni3d_dat
+
+# Include common rules
+include $(srcdir)/rules.mk
+
diff --git a/devtools/create_cryomni3d/util.cpp b/devtools/create_cryomni3d/util.cpp
new file mode 100644
index 0000000000..4ce94efb8c
--- /dev/null
+++ b/devtools/create_cryomni3d/util.cpp
@@ -0,0 +1,174 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "util.h"
+#include <stdarg.h>
+
+#ifdef _MSC_VER
+#define vsnprintf _vsnprintf
+#endif
+
+void error(const char *s, ...) {
+ char buf[1024];
+ va_list va;
+
+ va_start(va, s);
+ vsnprintf(buf, 1024, s, va);
+ va_end(va);
+
+ fprintf(stderr, "ERROR: %s!\n", buf);
+
+ exit(1);
+}
+
+void warning(const char *s, ...) {
+ char buf[1024];
+ va_list va;
+
+ va_start(va, s);
+ vsnprintf(buf, 1024, s, va);
+ va_end(va);
+
+ fprintf(stderr, "WARNING: %s!\n", buf);
+}
+
+int scumm_stricmp(const char *s1, const char *s2) {
+ byte l1, l2;
+ do {
+ // Don't use ++ inside tolower, in case the macro uses its
+ // arguments more than once.
+ l1 = (byte) * s1++;
+ l1 = tolower(l1);
+ l2 = (byte) * s2++;
+ l2 = tolower(l2);
+ } while (l1 == l2 && l1 != 0);
+ return l1 - l2;
+}
+
+void debug(int level, const char *s, ...) {
+ char buf[1024];
+ va_list va;
+
+ va_start(va, s);
+ vsnprintf(buf, 1024, s, va);
+ va_end(va);
+
+ fprintf(stderr, "DEBUG: %s!\n", buf);
+}
+
+size_t writeByte(FILE *fp, uint8 b) {
+ fwrite(&b, 1, 1, fp);
+ return sizeof(b);
+}
+
+size_t writeUint16BE(FILE *fp, uint16 value) {
+ writeByte(fp, (uint8)(value >> 8));
+ writeByte(fp, (uint8)(value));
+ return sizeof(value);
+}
+
+size_t writeUint16LE(FILE *fp, uint16 value) {
+ writeByte(fp, (uint8)(value));
+ writeByte(fp, (uint8)(value >> 8));
+ return sizeof(value);
+}
+
+size_t writeUint32BE(FILE *fp, uint32 value) {
+ writeByte(fp, (uint8)(value >> 24));
+ writeByte(fp, (uint8)(value >> 16));
+ writeByte(fp, (uint8)(value >> 8));
+ writeByte(fp, (uint8)(value));
+ return sizeof(value);
+}
+
+size_t writeUint32LE(FILE *fp, uint32 value) {
+ writeByte(fp, (uint8)(value));
+ writeByte(fp, (uint8)(value >> 8));
+ writeByte(fp, (uint8)(value >> 16));
+ writeByte(fp, (uint8)(value >> 24));
+ return sizeof(value);
+}
+
+size_t writeString16(FILE *fp, const char *string) {
+ if (string == nullptr) {
+ // Like an empty string
+ return writeUint16LE(fp, 0);
+ }
+ size_t n = strlen(string);
+ if (n > 0xffff) {
+ return 0;
+ }
+ size_t written = 0;
+ written += writeUint16LE(fp, n);
+ fwrite(string, n, 1, fp);
+ written += n;
+ return written;
+}
+
+template<typename T, size_t (*Tf)(FILE *fp, T), typename U, size_t (*Uf)(FILE *fp, U)>
+size_t writeArray(FILE *fp, T const *array, U elems) {
+ size_t written = 0;
+ written += Uf(fp, elems);
+ for (U i = 0; i < elems; i++) {
+ written += Tf(fp, array[i]);
+ }
+ return written;
+}
+
+size_t writeString16Array16(FILE *fp, char const *const *array, uint16 elems) {
+ return writeArray<char const *, writeString16, uint16, writeUint16LE>(fp, array, elems);
+}
+
+
+//#define DEBUG
+static const char padBuf[PADDING_ALIGNMENT] = {
+#ifndef DEBUG
+ 0
+#else
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+#endif
+};
+
+size_t writePadding(FILE *fp) {
+ long pos = ftell(fp);
+
+ pos = pos & PADDING_MASK; // Keep only remainder
+ if (pos == 0) {
+ return 0;
+ }
+
+ pos = PADDING_ALIGNMENT - pos;
+ fwrite(padBuf, pos, 1, fp);
+ return pos;
+}
+
+uint32 fileSize(FILE *fp) {
+ uint32 sz;
+ uint32 pos = ftell(fp);
+ fseek(fp, 0, SEEK_END);
+ sz = ftell(fp);
+ fseek(fp, pos, SEEK_SET);
+ return sz;
+}
diff --git a/devtools/create_cryomni3d/util.h b/devtools/create_cryomni3d/util.h
new file mode 100644
index 0000000000..4cd685e927
--- /dev/null
+++ b/devtools/create_cryomni3d/util.h
@@ -0,0 +1,57 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef UTIL_H
+#define UTIL_H
+
+#include "common/scummsys.h"
+#include "common/endian.h"
+#include "common/util.h"
+
+#ifdef WIN32
+#include <io.h>
+#include <process.h>
+#endif
+
+#define PADDING_ALIGNMENT 16
+#define PADDING_MASK 0xf
+
+/* File I/O */
+size_t writeByte(FILE *fp, uint8 b);
+size_t writeUint16BE(FILE *fp, uint16 value);
+size_t writeUint16LE(FILE *fp, uint16 value);
+size_t writeUint32BE(FILE *fp, uint32 value);
+size_t writeUint32LE(FILE *fp, uint32 value);
+size_t writeString16(FILE *fp, char const *string);
+size_t writeString16Array16(FILE *fp, char const *const *string, uint16 elems);
+size_t writePadding(FILE *fp);
+uint32 fileSize(FILE *fp);
+
+/* Misc stuff */
+void NORETURN_PRE error(const char *s, ...) NORETURN_POST;
+void warning(const char *s, ...);
+void debug(int level, const char *s, ...);
+int scumm_stricmp(const char *s1, const char *s2);
+
+using namespace Common;
+
+#endif
diff --git a/devtools/create_cryomni3d/versailles.cpp b/devtools/create_cryomni3d/versailles.cpp
new file mode 100644
index 0000000000..edddd7a4ce
--- /dev/null
+++ b/devtools/create_cryomni3d/versailles.cpp
@@ -0,0 +1,60 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "util.h"
+#include "create_cryomni3d_dat.h"
+
+#include "versailles.h"
+
+// In Versailles platform doesn't seem to change anything
+#define DEFINE_FUNCS(lang) \
+ size_t writeVersailles_ALL_ ## lang ## Header(FILE *f, uint32 offset, uint32 size) { \
+ return writeGameHeader(f, VERSAILLES_GAMEID, VERSAILLES_VERSION, LANG_ ## lang, PLATFORM_ALL, \
+ offset, size); \
+ } \
+ \
+ size_t writeVersailles_ALL_ ## lang ## Data(FILE *f) { \
+ size_t size = 0; \
+ \
+ assert(VERSAILLES_LOCALIZED_FILENAMES_COUNT == ARRAYSIZE(versailles ## lang ## localizedFilenames)); \
+ size += writeString16Array16(f, versailles ## lang ## localizedFilenames, \
+ VERSAILLES_LOCALIZED_FILENAMES_COUNT); \
+ \
+ size += writeString16(f, versailles ## lang ## EpilMsg); \
+ size += writeString16(f, versailles ## lang ## EpilPwd); \
+ \
+ size += writeString16(f, versailles ## lang ## BombPwd); \
+ \
+ assert(VERSAILLES_MESSAGES_COUNT == ARRAYSIZE(versailles ## lang ## messages)); \
+ size += writeString16Array16(f, versailles ## lang ## messages, VERSAILLES_MESSAGES_COUNT); \
+ \
+ assert(VERSAILLES_PAINTINGS_COUNT == ARRAYSIZE(versailles ## lang ## paintings)); \
+ size += writeString16Array16(f, versailles ## lang ## paintings, VERSAILLES_PAINTINGS_COUNT); \
+ \
+ size += writePadding(f); \
+ return size; \
+ }
+
+DEFINE_FUNCS(FR)
diff --git a/devtools/create_cryomni3d/versailles.h b/devtools/create_cryomni3d/versailles.h
new file mode 100644
index 0000000000..e0bd191c88
--- /dev/null
+++ b/devtools/create_cryomni3d/versailles.h
@@ -0,0 +1,267 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef VERSAILLES_H
+#define VERSAILLES_H
+
+// This file contains static data and should be included only once
+
+#define VERSAILLES_GAMEID MKTAG('V', 'R', 'S', 'L')
+#define VERSAILLES_VERSION 1
+
+#define VERSAILLES_LOCALIZED_FILENAMES_COUNT 5
+static char const *const versaillesFRlocalizedFilenames[] = {
+ "DIALOG1.GTO",
+ "tous_doc.txt",
+ "lien_doc.txt",
+ "credits.txt",
+ "LEB001__.WAV",
+};
+
+static char const versaillesFREpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
+static char const versaillesFREpilPwd[] = "LELOUPETLATETE";
+
+static char const versaillesFRBombPwd[] = "JEMENVAISMAISLETATDEMEURERATOUJOURS";
+
+#define VERSAILLES_MESSAGES_COUNT 146
+#define VERSAILLES_PAINTINGS_COUNT 48
+
+static char const *const versaillesFRmessages[] = {
+ "Il est interdit d'ouvrir cette porte pour l'instant.", /* 0 */
+ "Cette porte est ferm" "\x8e" "e " "\x88" " clef.", /* 1 */
+ "Cette porte est ferm" "\x8e" "e.", /* 2 */
+ "Ce tiroir est vide.", /* 3 */
+ "Vous ne pouvez pas atteindre la b" "\x89" "che.", /* 4 */
+ "Il n'y a rien dans cet oranger", /* 5 */
+ "Ceci n'est pas un oranger!", /* 6 */
+ "Il fait trop sombre. ", /* 7 */
+ "Le coffre est ferm" "\x8e" ". ", /* 8 */
+ "Vous pouvez ouvrir la porte", /* 9 */
+ "Il faudrait quelque chose pour atteindre la bombe.", /* 10 */
+ "Ce vase est vide.", /* 11 */
+ "Maintenant, vous pouvez y aller.", /* 12 */
+ "Vous n" "\xd5" "avez plus le temps de vous renseigner sur la "
+ "Cour!", /* 13 */
+ "Il est trop tard pour regarder les tableaux!", /* 14 */
+ "Attendez ! Transmettez donc vos indices " "\x88" " l'huissier.", /* 15 */
+ "Vous ne pouvez pas atteindre le papier.", /* 16 */
+ "Vers l'apothicairerie", /* 17 */
+ "Attention : Vous allez pouvoir terminer ce niveau, mais vous "
+ "n'avez pas effectu" "\x8e" " toutes les actions necessaires pour "
+ "la suite. Il est conseill" "\x8e" " de SAUVEGARDER votre partie "
+ "maintenant.", /* 18 */
+ "Attention : Vous allez pouvoir terminer ce niveau, mais vous "
+ "n'avez peut-" "\x90" "tre pas effectu" "\x8e" " toutes les "
+ "actions necessaires pour la suite. Il est conseill" "\x8e" " de "
+ "SAUVEGARDER votre partie maintenant.", /* 19 */
+ "Vous ne pouvez pas vous d" "\x8e" "placer en portant une " "\x8e"
+ "chelle!", /* 20 */
+ "Il n'y a plus rien ici", /* 21 */
+ "Au revoir ...", /* 22 */
+ "VERSAILLES,", /* 23 */
+ "Complot " "\x88" " la Cour du Roi Soleil", /* 24 */
+ "Consulter l'espace documentaire", /* 25 */
+ " Reprendre la partie en cours", /* 26 */
+ " Commencer une nouvelle partie", /* 27 */
+ " Charger une partie", /* 28 */
+ " Sauver la partie", /* 29 */
+ " Afficher les sous-titres : OUI", /* 30 */
+ " Afficher les sous-titres : NON", /* 31 */
+ " Musique : OUI", /* 32 */
+ " Musique : NON", /* 33 */
+ " Une seule musique sur disque dur (20 Mo)", /* 34 */
+ " Toutes les musiques sur disque dur (92 Mo)", /* 35 */
+ " Aucune musique sur disque dur (lecture CD)", /* 36 */
+ nullptr, /* 37 */
+ nullptr, /* 38 */
+ "Volume", /* 39 */
+ "Quitter le jeu", /* 40 */
+ "", /* 41 */
+ "Visiter le ch" "\x89" "teau", /* 42 */
+ "Cr" "\x8e" "dits", /* 43 */
+ " Reprendre la visite en cours", /* 44 */
+ " Sauver la visite", /* 45 */
+ " Charger une visite", /* 46 */
+ nullptr, /* 47 */
+ " Omni3D : normal", /* 48 */
+ " Omni3D : lent", /* 49 */
+ " Omni3D : tr" "\x8f" "s lent", /* 50 */
+ " Omni3D : rapide", /* 51 */
+ " Omni3D : tr" "\x8f" "s rapide", /* 52 */
+ "Confirmer", /* 53 */
+ "Annuler", /* 54 */
+ "libre", /* 55 */
+ "sans nom", /* 56 */
+ "Attention : la partie en cours va " "\x90" "tre abandonn" "\x8e"
+ "e.", /* 57 */
+ "Retour", /* 58 */
+ "Le chateau", /* 59 */
+ "Retour Menu Principal", /* 60 */
+ "Sommaire Espace documentaire", /* 61 */
+ "Plan du ch" "\x89" "teau et des jardins", /* 62 */
+ "Plan des int" "\x8e" "rieurs du ch" "\x89" "teau", /* 63 */
+ "Probl" "\x8f" "me d'" "\x8e" "criture sur dique dur : disque "
+ "plein ", /* 64 */
+ nullptr, /* 65 */
+ "Veuillez ins" "\x8e" "rer le CD ", /* 66 */
+ "Veuillez ins" "\x8e" "rer le CD %d et presser une touche", /* 67 */
+ "Les arts", /* 68 */
+ "Le r" "\x8f" "gne", /* 69 */
+ "La Cour", /* 70 */
+ "Vie de Ch" "\x89" "teau", /* 71 */
+ "Le ch" "\x89" "teau et les jardins", /* 72 */
+ "Chronologie", /* 73 */
+ "Bassin d'Apollon", /* 74 */
+ "Le Ch" "\x89" "teau", /* 75 */
+ "Colonnade", /* 76 */
+ "Labyrinthe", /* 77 */
+ "Latone", /* 78 */
+ "Orangerie", /* 79 */
+ "Parterre d'eau", /* 80 */
+ "Tapis vert", /* 81 */
+ "Grandes Ecuries", /* 82 */
+ "Petites Ecuries", /* 83 */
+ "Les jardins", /* 84 */
+ "Avant cour", /* 85 */
+ "Grand Canal", /* 86 */
+ "Parterre du Midi", /* 87 */
+ "Parterre du nord", /* 88 */
+ "Potager du Roi", /* 89 */
+ "Salle de bal", /* 90 */
+ "Bassin de Neptune", /* 91 */
+ "Pi" "\x8f" "ce d'eau des suisses", /* 92 */
+ "Aiguilles (Inutile!)", /* 93 */
+ "Ciseaux", /* 94 */
+ "Papier", /* 95 */
+ "Pamphlet sur les arts", /* 96 */
+ "Petite clef 1", /* 97 */
+ "Papier r" "\x8e" "v" "\x8e" "l" "\x8e", /* 98 */
+ "Papier t" "\x89" "ch" "\x8e", /* 99 */
+ "Papier du coffre", /* 100 */
+ "Pamphlet sur la lign" "\x8e" "e royale", /* 101 */
+ "Bougie allum" "\x8e" "e", /* 102 */
+ "Bougie", /* 103 */
+ "Clef ", /* 104 */
+ "Carton " "\x88" " dessin", /* 105 */
+ "Carton " "\x88" " dessin", /* 106 */
+ "Fausse esquisse", /* 107 */
+ "Echelle", /* 108 */
+ "Esquisse d" "\x8e" "truite", /* 109 */
+ "pinceau", /* 110 */
+ "pinceau Or", /* 111 */
+ "pinceau Rouge", /* 112 */
+ "Fusain", /* 113 */
+ "Papier", /* 114 */
+ "Pamphlet sur l" "\xd5" "architecture", /* 115 */
+ "Petite clef 2", /* 116 */
+ "Archer(inutile!)", /* 117 */
+ "Partition", /* 118 */
+ "Queue de billard", /* 119 */
+ "Autorisation", /* 120 */
+ "Reproduction des m" "\x8e" "dailles", /* 121 */
+ "Tiroir " "\x88" " m" "\x8e" "dailles", /* 122 */
+ "Clef de la petite porte d" "\xd5" "Apollon", /* 123 */
+ "Nourriture", /* 124 */
+ "Pamphlet sur la religion", /* 125 */
+ "Epigraphe", /* 126 */
+ "Pamphlet sur le gouvernement", /* 127 */
+ "Plume", /* 128 */
+ "Pense-b" "\x90" "te", /* 129 */
+ "Lunette", /* 130 */
+ "Plan Vauban", /* 131 */
+ "Plan Vauban", /* 132 */
+ "Cordon", /* 133 */
+ "Gravure", /* 134 */
+ "Petite clef 3", /* 135 */
+ "Petite clef 4", /* 136 */
+ "M" "\x8e" "morandum", /* 137 */
+ "Plans du chateau", /* 138 */
+ "Plans du chateau", /* 139 */
+ "Clef des combles", /* 140 */
+ "Fables", /* 141 */
+ "Plan du Labyrinthe", /* 142 */
+ "Outil", /* 143 */
+ "M" "\x8e" "dicament", /* 144 */
+ "Eteignoir", /* 145 */
+};
+
+static char const *const versaillesFRpaintings[] = {
+ "\"Entr" "\x8e" "e des animaux dans l'arche\"\rGerolamo Bassano", /* 0: 41201 */
+ "\"Le repas d'Emma" "\x9f" "s\"\rJacopo Bassano", /* 1: 41202 */
+ "\"La Madeleine aux pieds de J" "\x8e" "sus Christ\"\rSustris", /* 2: 41203 */
+ "\"La sortie de l'arche\"\rGerolamo Bassano ", /* 3: 41204 */
+ "\"Le frappement du rocher\"\rJacopo Bassano", /* 4: 41205 */
+ "\"La Bataille d'Arbelles\"\rJoseph Parrocel", /* 5: 41301 */
+ "\"Alexandre Le Grand vainqueur de Darius " "\x88" " la bataille "
+ "d'Arbelles\"\rLe Bourguignon", /* 6: 41302 */
+ "\"Le Combat de Leuze\"\rJoseph Parrocel", /* 7: 42401 */
+ "\"Sainte C" "\x8e" "cile avec un ange tenant une partition "
+ "musicale\"\rDominiquin", /* 8: 42901 */
+ "\"Don Francisco du Moncada \"\rVan Dyck", /* 9: 42902 */
+ "\"Le Petit Saint Jean Baptiste\"\rLe Carrache", /* 10: 42903 */
+ "\"Saint Mathieu\"\rValentin", /* 11: 42904 */
+ "\"Le Denier de C" "\x8e" "sar \"\rValentin", /* 12: 42905 */
+ "\"Saint Luc\"\rValentin", /* 13: 42906 */
+ "\"Le mariage mystique de Sainte Catherine\"\r Alessandro Turchi", /* 14: 42907 */
+ "\"R" "\x8e" "union de buveurs\"\rNicolas Tournier", /* 15: 42908 */
+ "\"La diseuse de Bonne aventure \"\rValentin", /* 16: 42909 */
+ "\"le roi David jouant de la harpe \"\rDominiquin", /* 17: 42910 */
+ "\"Sainte Madeleine\"\rDominiquin", /* 18: 42911 */
+ "\"Autoportrait \"\rVan Dyck", /* 19: 42912 */
+ "\"Saint Jean l'" "\x8e" "vang" "\x8e" "liste\"\r Valentin", /* 20: 42913 */
+ "\"Agar secouru par un ange \"\rGiovanni Lanfranco", /* 21: 42914 */
+ "\"Saint Marc \"\rValentin", /* 22: 42915 */
+ "\"M" "\x8e" "l" "\x8e" "agre ayant " "\x88" " ses pieds la hure "
+ "du sanglier de Calydon\"\r Jacques Rousseau", /* 23: 43090 */
+ "\"Le Roi en costume romain\"\rJean Warin", /* 24: 43091 */
+ "\"attalante\"\rJacques Rousseau", /* 25: 43092 */
+ "\"En" "\x8e" "e portant Anchise\"\rSpada", /* 26: 43100 */
+ "\"David et Bethsab" "\x8e" "e\"\rV" "\x8e" "ron" "\x8f" "se", /* 27: 43101 */
+ "\"La fuite en Egypte\"\rGuido R" "\x8e" "ni ", /* 28: 43102 */
+ "\"Louis XIV " "\x88" " cheval\"\rPierre Mignard", /* 29: 43103 */
+ "\"La magnificience royale & le progr" "\x8f" "s des beaux "
+ "arts\"\rHouasse", /* 30: 43104 */
+ "\"Le Sacrifice d'Iphig" "\x8e" "nie\"\rCharles de la Fosse", /* 31: 43130 */
+ "\"Buste de Louis XIV\"\rsculpt" "\x8e" " par le Chevalier Bernin ", /* 32: 43131 */
+ "\"Diane d" "\x8e" "couvrant son berger Endymion endormi dans les "
+ "bras de Morph" "\x8e" "e\"\rGabriel Blanchard", /* 33: 43132 */
+ "\"La vierge & Saint Pierre\"\rGuerchin", /* 34: 43140 */
+ "\"Les P" "\x8e" "lerins d'Emma" "\x9f" "s\"\rV" "\x8e" "ron"
+ "\x8f" "se", /* 35: 43141 */
+ "\"La sainte Famille\"\rV" "\x8e" "ron" "\x8f" "se", /* 36: 43142 */
+ "\"La famille de Darius aux pieds d'Alexandre\"\rCharles LeBrun", /* 37: 43143 */
+ "\"Saint Jean-Baptiste\"\rRapha" "\x91" "l", /* 38: 43144 */
+ "\"Marie de m" "\x8e" "dicis\"\rVan Dyck", /* 39: 43150 */
+ "\"Hercule luttant contre Achelous\"\rGuido R" "\x8e" "ni", /* 40: 43151 */
+ "\"Le Centaure Nessus porte Dejanire\"\rGuido R" "\x8e" "ni", /* 41: 43152 */
+ "\"Saint Fran" "\x8d" "ois d'Assise r" "\x8e" "confort" "\x8e" " "
+ "apr" "\x8f" "s sa stigmatisation\"\rSeghers", /* 42: 43153 */
+ "\"Thomiris faisant tremper la t" "\x90" "te de Cyrus dans le "
+ "sang\"\rRubens", /* 43: 43154 */
+ "\"Hercule tuant l'Hydre\"\rGuido R" "\x8e" "ni", /* 44: 43155 */
+ "\"Hercule sur le b" "\x9e" "cher\"\rGuido R" "\x8e" "ni", /* 45: 43156 */
+ "\"Portrait du Prince Palatin & de son fr" "\x8f" "re le Prince "
+ "Robert\"\rVan Dyck", /* 46: 43157 */
+ "\"La descente de Croix \"\rCharles Lebrun", /* 47: 45260 */
+};
+
+#endif