[Scummvm-git-logs] scummvm master -> 58b9848ccf834086d5577ad346a7229dcd8a17f3

lephilousophe lephilousophe at users.noreply.github.com
Fri Jul 5 07:55:21 CEST 2019


This automated email contains information about 11 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
2ac6d005bb CRYOMNI3D: Fix loading of game from original menu in-game
c24304a78b CRYOMNI3D: Remove detection leftover and add flags
57b74a2773 CRYOMNI3D: Load all characters and not only the letters
418cec512f CRYOMNI3D: Add internationalization through external DAT file
050536b137 CRYOMNI3D: Add English version of Versailles
215e2139fc CRYOMNI3D: Add Italian version of Versailles
95d1f30bd7 CRYOMNI3D: Add a timeout for displayHLZ
d46988491d CRYOMNI3D: Add German version of Versailles
5309672bea CRYOMNI3D: Move texts at the right place
70eca71905 CRYOMNI3D: Add Spanish version of Versailles
58b9848ccf CRYOMNI3D: Fix style


Commit: 2ac6d005bbbf03c2c4ab9591e6904df572af7993
    https://github.com/scummvm/scummvm/commit/2ac6d005bbbf03c2c4ab9591e6904df572af7993
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:40:29+02:00

Commit Message:
CRYOMNI3D: Fix loading of game from original menu in-game

Changed paths:
    engines/cryomni3d/versailles/menus.cpp


diff --git a/engines/cryomni3d/versailles/menus.cpp b/engines/cryomni3d/versailles/menus.cpp
index eff2085..9e072e8 100644
--- a/engines/cryomni3d/versailles/menus.cpp
+++ b/engines/cryomni3d/versailles/menus.cpp
@@ -304,9 +304,7 @@ uint CryOmni3DEngine_Versailles::displayOptions() {
 					end = displayYesNoBox(optionsSurface, Common::Rect(235, 420, 505, 465), 57);
 				}
 				drawState = 1;
-				if (end) {
-					_isPlaying = false;
-				} else {
+				if (!end) {
 					selectedMsg = 0;
 				}
 			}
@@ -332,7 +330,6 @@ uint CryOmni3DEngine_Versailles::displayOptions() {
 					selectedMsg = 0;
 				} else {
 					_loadedSave = saveNumber;
-					_isPlaying = false;
 					end = true;
 				}
 				waitMouseRelease();
@@ -347,7 +344,6 @@ uint CryOmni3DEngine_Versailles::displayOptions() {
 					selectedMsg = 0;
 				} else {
 					_loadedSave = saveNumber;
-					_isPlaying = false;
 					end = true;
 				}
 				waitMouseRelease();


Commit: c24304a78b8f04b36be28877e29135341a2953e4
    https://github.com/scummvm/scummvm/commit/c24304a78b8f04b36be28877e29135341a2953e4
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:40:29+02:00

Commit Message:
CRYOMNI3D: Remove detection leftover and add flags

That will let us adapt from different packaging across Versailles
editions.

Changed paths:
    engines/cryomni3d/cryomni3d.h
    engines/cryomni3d/detection.cpp
    engines/cryomni3d/detection_tables.h
    engines/cryomni3d/versailles/dialogs_manager.cpp
    engines/cryomni3d/versailles/dialogs_manager.h
    engines/cryomni3d/versailles/engine.cpp


diff --git a/engines/cryomni3d/cryomni3d.h b/engines/cryomni3d/cryomni3d.h
index d1855a8..95f3b54 100644
--- a/engines/cryomni3d/cryomni3d.h
+++ b/engines/cryomni3d/cryomni3d.h
@@ -65,6 +65,11 @@ enum CryOmni3DGameType {
 	GType_VERSAILLES
 };
 
+enum CryOmni3DGameFeatures {
+	GF_VERSAILLES_NUMERICFONTS             = (1 << 0), // Fonts are font01.crf, ...
+	GF_VERSAILLES_AUDIOPADDING             = (1 << 1), // Audio files have underscore padding before extension
+};
+
 struct CryOmni3DGameDescription;
 
 // Engine Debug Flags
@@ -93,7 +98,6 @@ public:
 	const CryOmni3DGameDescription *_gameDescription;
 	const char *getGameId() const;
 	uint32 getFeatures() const;
-	const char *getAppName() const;
 	uint16 getVersion() const;
 	Common::Platform getPlatform() const;
 	uint8 getGameType() const;
diff --git a/engines/cryomni3d/detection.cpp b/engines/cryomni3d/detection.cpp
index 10a7b49..5928776 100644
--- a/engines/cryomni3d/detection.cpp
+++ b/engines/cryomni3d/detection.cpp
@@ -41,7 +41,6 @@ struct CryOmni3DGameDescription {
 
 	uint8 gameType;
 	uint32 features;
-	const char *appName;
 };
 
 const char *CryOmni3DEngine::getGameId() const {
@@ -56,10 +55,6 @@ Common::Platform CryOmni3DEngine::getPlatform() const {
 	return _gameDescription->desc.platform;
 }
 
-const char *CryOmni3DEngine::getAppName() const {
-	return _gameDescription->appName;
-}
-
 uint8 CryOmni3DEngine::getGameType() const {
 	return _gameDescription->gameType;
 }
diff --git a/engines/cryomni3d/detection_tables.h b/engines/cryomni3d/detection_tables.h
index 8d56594..7593234 100644
--- a/engines/cryomni3d/detection_tables.h
+++ b/engines/cryomni3d/detection_tables.h
@@ -26,7 +26,7 @@ namespace CryOmni3D {
 
 static const CryOmni3DGameDescription gameDescriptions[] = {
 	// Versailles 1685
-	// French Windows 95
+	// French Windows 95 from hybrid Win95/DOS CD
 	// From lePhilousophe
 	{
 		{
@@ -39,12 +39,11 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 			GUI_OPTIONS_VERSAILLES
 		},
 		GType_VERSAILLES,
-		0,
-		0,
+		GF_VERSAILLES_NUMERICFONTS | GF_VERSAILLES_AUDIOPADDING,
 	},
 
 	// Versailles 1685
-	// French Windows 95 compressed
+	// French Windows 95 compressed from hybrid Win95/DOS CD
 	// From lePhilousophe
 	{
 		{
@@ -57,12 +56,11 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 			GUI_OPTIONS_VERSAILLES
 		},
 		GType_VERSAILLES,
-		0,
-		0,
+		GF_VERSAILLES_NUMERICFONTS | GF_VERSAILLES_AUDIOPADDING,
 	},
 
 	// Versailles 1685
-	// French DOS
+	// French DOS from hybrid Win95/DOS CD
 	// From lePhilousophe
 	{
 		{
@@ -75,8 +73,7 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 			GUI_OPTIONS_VERSAILLES
 		},
 		GType_VERSAILLES,
-		0,
-		0,
+		GF_VERSAILLES_NUMERICFONTS | GF_VERSAILLES_AUDIOPADDING,
 	},
 
 	// Versailles 1685
@@ -93,11 +90,10 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 			GUI_OPTIONS_VERSAILLES
 		},
 		GType_VERSAILLES,
-		0,
-		0,
+		GF_VERSAILLES_AUDIOPADDING,
 	},
 
-	{ AD_TABLE_END_MARKER, 0, 0, 0 }
+	{ AD_TABLE_END_MARKER, 0, 0 }
 };
 
 //////////////////////////////
@@ -117,7 +113,6 @@ static const CryOmni3DGameDescription fallbackDescs[] = {
 		},
 		GType_VERSAILLES,
 		0,
-		0
 	},
 };
 
diff --git a/engines/cryomni3d/versailles/dialogs_manager.cpp b/engines/cryomni3d/versailles/dialogs_manager.cpp
index 1ec751a..d7290c9 100644
--- a/engines/cryomni3d/versailles/dialogs_manager.cpp
+++ b/engines/cryomni3d/versailles/dialogs_manager.cpp
@@ -93,8 +93,10 @@ void Versailles_DialogsManager::playDialog(const Common::String &video, const Co
 	Common::String videoFName(_engine->prepareFileName(video, "hnm"));
 	Common::String soundFName(sound);
 
-	while (soundFName.size() < 8) {
-		soundFName += '_';
+	if (_padAudioFileName) {
+		while (soundFName.size() < 8) {
+			soundFName += '_';
+		}
 	}
 	soundFName = _engine->prepareFileName(soundFName, "wav");
 
diff --git a/engines/cryomni3d/versailles/dialogs_manager.h b/engines/cryomni3d/versailles/dialogs_manager.h
index 9c41fc4..55d45ac 100644
--- a/engines/cryomni3d/versailles/dialogs_manager.h
+++ b/engines/cryomni3d/versailles/dialogs_manager.h
@@ -37,7 +37,9 @@ class CryOmni3DEngine_Versailles;
 
 class Versailles_DialogsManager : public DialogsManager {
 public:
-	Versailles_DialogsManager(CryOmni3DEngine_Versailles *engine) : _engine(engine) { }
+	Versailles_DialogsManager(CryOmni3DEngine_Versailles *engine,
+	                          bool padAudioFileName) : _engine(engine),
+		_padAudioFileName(padAudioFileName) { }
 
 	// This overload will hide the base one and this is what we want
 	bool play(const Common::String &sequence);
@@ -56,6 +58,7 @@ protected:
 private:
 	CryOmni3DEngine_Versailles *_engine;
 	Common::HashMap<Common::String, ShowCallback> _shows;
+	bool _padAudioFileName;
 
 	void loadFrame(const Common::String &video);
 
diff --git a/engines/cryomni3d/versailles/engine.cpp b/engines/cryomni3d/versailles/engine.cpp
index e279915..98a34e3 100644
--- a/engines/cryomni3d/versailles/engine.cpp
+++ b/engines/cryomni3d/versailles/engine.cpp
@@ -53,7 +53,8 @@ CryOmni3DEngine_Versailles::CryOmni3DEngine_Versailles(OSystem *syst,
 	_mainPalette(nullptr), _cursorPalette(nullptr), _transparentPaletteMap(nullptr),
 	_currentPlace(nullptr), _currentWarpImage(nullptr), _fixedImage(nullptr),
 	_transitionAnimateWarp(true), _forceRedrawWarp(false), _forcePaletteUpdate(false),
-	_fadedPalette(false), _loadedSave(uint(-1)), _dialogsMan(this),
+	_fadedPalette(false), _loadedSave(uint(-1)), _dialogsMan(this,
+	        getFeatures() & GF_VERSAILLES_AUDIOPADDING),
 	_musicVolumeFactor(1.), _musicCurrentFile(nullptr),
 	_countingDown(false), _countdownNextEvent(0) {
 }
@@ -302,7 +303,21 @@ void CryOmni3DEngine_Versailles::setupFonts() {
 	Common::Array<Common::String> fonts;
 
 	// Explainations below are based on original binaries, debug is not used in this engine
-	if (getPlatform() == Common::kPlatformMacintosh) {
+	// Fonts loaded are not always the same: FR Mac and EN DOS don't use the same font for debug doc/unused
+	// The important is that the loaded one is present in all versions
+	if (getFeatures() & GF_VERSAILLES_NUMERICFONTS) {
+		fonts.push_back("font01.CRF"); // 0: Doc titles
+		fonts.push_back("font02.CRF"); // 1: Menu and T0 in credits
+		fonts.push_back("font03.CRF"); // 2: T1 and T3 in credits
+		fonts.push_back("font04.CRF"); // 3: Menu title, options messages boxes buttons
+		fonts.push_back("font05.CRF"); // 4: T2 in credits, text in docs
+		fonts.push_back("font06.CRF"); // 5: objects description in toolbar, options messages boxes text, T4 in credits
+		fonts.push_back("font07.CRF"); // 6: T5 in credits, doc subtitle
+		fonts.push_back("font08.CRF"); // 7: dialogs texts
+		fonts.push_back("font09.CRF"); // 8: unused
+		fonts.push_back("font10.CRF"); // 9: Warp messages texts
+		fonts.push_back("font11.CRF"); // 10: debug
+	} else {
 		fonts.push_back("garamB18.CRF"); // 0: Doc titles
 		fonts.push_back("garamB22.CRF"); // 1: Menu and T0 in credits
 		//fonts.push_back("geneva15.CRF");
@@ -332,18 +347,6 @@ void CryOmni3DEngine_Versailles::setupFonts() {
 
 		// This file isn't even loaded by MacOS executable
 		//fonts.push_back("garamB20.CRF");
-	} else {
-		fonts.push_back("font01.CRF"); // 0: Doc titles
-		fonts.push_back("font02.CRF"); // 1: Menu and T0 in credits
-		fonts.push_back("font03.CRF"); // 2: T1 and T3 in credits
-		fonts.push_back("font04.CRF"); // 3: Menu title, options messages boxes buttons
-		fonts.push_back("font05.CRF"); // 4: T2 in credits, text in docs
-		fonts.push_back("font06.CRF"); // 5: objects description in toolbar, options messages boxes text, T4 in credits
-		fonts.push_back("font07.CRF"); // 6: T5 in credits, doc subtitle
-		fonts.push_back("font08.CRF"); // 7: dialogs texts
-		fonts.push_back("font09.CRF"); // 8: unused
-		fonts.push_back("font10.CRF"); // 9: Warp messages texts
-		fonts.push_back("font11.CRF"); // 10: debug
 	}
 
 	_fontManager.loadFonts(fonts);


Commit: 57b74a2773ae083121e0e621eb555c19d666ea2a
    https://github.com/scummvm/scummvm/commit/57b74a2773ae083121e0e621eb555c19d666ea2a
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:40:29+02:00

Commit Message:
CRYOMNI3D: Load all characters and not only the letters

That will be useful for i18n. Let's suppose all the versions have all
the characters.

Changed paths:
    engines/cryomni3d/versailles/engine.h
    engines/cryomni3d/versailles/logic.cpp


diff --git a/engines/cryomni3d/versailles/engine.h b/engines/cryomni3d/versailles/engine.h
index 83beddb..ff00dfd 100644
--- a/engines/cryomni3d/versailles/engine.h
+++ b/engines/cryomni3d/versailles/engine.h
@@ -513,7 +513,7 @@ private:
 	static const char *kEpigraphPassword;
 	bool handleEpigraph(ZonFixedImage *fimg);
 	void drawEpigraphLetters(Graphics::ManagedSurface &surface,
-	                         const Graphics::Surface(&bmpLetters)[26], const Common::String &letters);
+	                         const Graphics::Surface(&bmpLetters)[28], const Common::String &letters);
 	IMG_CB(45130);
 	IMG_CB(45270);
 	IMG_CB(45270b);
@@ -536,7 +536,7 @@ private:
 	static const uint16 kBombLettersPos[2][kBombPasswordMaxLength][2];
 	static const char *kBombPassword;
 	bool handleBomb(ZonFixedImage *fimg);
-	void drawBombLetters(Graphics::ManagedSurface &surface, const Graphics::Surface(&bmpLetters)[26],
+	void drawBombLetters(Graphics::ManagedSurface &surface, const Graphics::Surface(&bmpLetters)[28],
 	                     const uint kBombPasswordLength,
 	                     const unsigned char (&bombPossibilites)[kBombPasswordMaxLength][5],
 	                     const unsigned char (&bombCurrentLetters)[kBombPasswordMaxLength]);
diff --git a/engines/cryomni3d/versailles/logic.cpp b/engines/cryomni3d/versailles/logic.cpp
index 0911a16..e46c1a7 100644
--- a/engines/cryomni3d/versailles/logic.cpp
+++ b/engines/cryomni3d/versailles/logic.cpp
@@ -184,12 +184,12 @@ void CryOmni3DEngine_Versailles::obj_126() {
 }
 
 void CryOmni3DEngine_Versailles::obj_126hk(Graphics::ManagedSurface &surface) {
-	Graphics::Surface bmpLetters[26];
-	loadBMPs("bomb_%02d.bmp", bmpLetters, 26);
+	Graphics::Surface bmpLetters[28];
+	loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
 
 	drawEpigraphLetters(surface, bmpLetters, kEpigraphPassword);
 
-	for (uint i = 0; i < 26; i++) {
+	for (uint i = 0; i < 28; i++) {
 		bmpLetters[i].free();
 	}
 }
@@ -2340,11 +2340,11 @@ IMG_CB(44161f) {
 
 bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
 	bool success = false;
-	Graphics::Surface bmpLetters[26];
+	Graphics::Surface bmpLetters[28];
 	Common::String password;
 	Graphics::ManagedSurface tempSurf;
 
-	loadBMPs("bomb_%02d.bmp", bmpLetters, 26);
+	loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
 
 	fimg->load("EPIL.GIF");
 	const Graphics::Surface *fimgSurface = fimg->surface();
@@ -2397,7 +2397,7 @@ bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
 		}
 	}
 
-	for (uint i = 0; i < 26; i++) {
+	for (uint i = 0; i < 28; i++) {
 		bmpLetters[i].free();
 	}
 	return success;
@@ -2407,11 +2407,15 @@ const char *CryOmni3DEngine_Versailles::kEpigraphContent = "FELIXFORTUNADIVINUME
 const char *CryOmni3DEngine_Versailles::kEpigraphPassword = "LELOUPETLATETE";
 
 void CryOmni3DEngine_Versailles::drawEpigraphLetters(Graphics::ManagedSurface &surface,
-        const Graphics::Surface(&bmpLetters)[26], const Common::String &letters) {
+        const Graphics::Surface(&bmpLetters)[28], const Common::String &letters) {
 	for (uint i = 0; i < letters.size() && i < kEpigraphMaxLetters; i++) {
 		uint letterId = 0;
 		if (letters[i] >= 'A' && letters[i] <= 'Z') {
 			letterId = letters[i] - 'A';
+		} else if (letters[i] == ' ') {
+			letterId = 26;
+		} else if (letters[i] == '\'') {
+			letterId = 27;
 		}
 		const Graphics::Surface &letter = bmpLetters[letterId];
 		Common::Point dst(34 * i + 4, 380);
@@ -2925,7 +2929,7 @@ IMG_CB(88003f) {
 bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 	bool success = false;
 	Common::RandomSource rnd("VersaillesBomb");
-	Graphics::Surface bmpLetters[26];
+	Graphics::Surface bmpLetters[28];
 	unsigned char bombPossibilites[60][5];
 	unsigned char bombCurrentLetters[60];
 	Graphics::ManagedSurface tempSurf;
@@ -2935,7 +2939,7 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 		error("Bomb password is too long");
 	}
 
-	loadBMPs("bomb_%02d.bmp", bmpLetters, 26);
+	loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
 	for (uint i = 0; i < kBombPasswordLength; i++) {
 		bombPossibilites[i][0] = toupper(kBombPassword[i]);
 		for (uint j = 1; j < 5; j++) {
@@ -3003,7 +3007,7 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 		}
 	}
 
-	for (uint i = 0; i < 26; i++) {
+	for (uint i = 0; i < 28; i++) {
 		bmpLetters[i].free();
 	}
 	return success;
@@ -3118,7 +3122,7 @@ const uint16 CryOmni3DEngine_Versailles::kBombLettersPos[2][kBombPasswordMaxLeng
 };
 
 void CryOmni3DEngine_Versailles::drawBombLetters(Graphics::ManagedSurface &surface,
-        const Graphics::Surface(&bmpLetters)[26], const uint kBombPasswordLength,
+        const Graphics::Surface(&bmpLetters)[28], const uint kBombPasswordLength,
         const unsigned char (&bombPossibilites)[kBombPasswordMaxLength][5],
         const unsigned char (&bombCurrentLetters)[kBombPasswordMaxLength]) {
 	uint table = kBombPasswordLength <= kBombPasswordSmallLength ? 0 : 1;
@@ -3127,6 +3131,10 @@ void CryOmni3DEngine_Versailles::drawBombLetters(Graphics::ManagedSurface &surfa
 		uint letterId = 0;
 		if (letterChar >= 'A' && letterChar <= 'Z') {
 			letterId = letterChar - 'A';
+		} else if (letterChar == ' ') {
+			letterId = 26;
+		} else if (letterChar == '\'') {
+			letterId = 27;
 		}
 		const Graphics::Surface &letter = bmpLetters[letterId];
 		Common::Point dst(kBombLettersPos[table][i][0], kBombLettersPos[table][i][1]);


Commit: 418cec512f177a0f523c80916770382dd0e4fdaf
    https://github.com/scummvm/scummvm/commit/418cec512f177a0f523c80916770382dd0e4fdaf
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:51:19+02:00

Commit Message:
CRYOMNI3D: Add internationalization through external DAT file

Changed paths:
  A devtools/create_cryomni3d/create_cryomni3d_dat.cpp
  A devtools/create_cryomni3d/create_cryomni3d_dat.h
  A devtools/create_cryomni3d/module.mk
  A devtools/create_cryomni3d/util.cpp
  A devtools/create_cryomni3d/util.h
  A devtools/create_cryomni3d/versailles.cpp
  A devtools/create_cryomni3d/versailles.h
  A dists/engine-data/cryomni3d.dat
  A engines/cryomni3d/datstream.cpp
  A engines/cryomni3d/datstream.h
    .gitignore
    Makefile.common
    backends/platform/maemo/debian/rules
    devtools/create_project/xcode.cpp
    dists/engine-data/README
    dists/scummvm.rc
    engines/cryomni3d/cryomni3d.cpp
    engines/cryomni3d/cryomni3d.h
    engines/cryomni3d/module.mk
    engines/cryomni3d/versailles/data.cpp
    engines/cryomni3d/versailles/documentation.cpp
    engines/cryomni3d/versailles/documentation.h
    engines/cryomni3d/versailles/engine.cpp
    engines/cryomni3d/versailles/engine.h
    engines/cryomni3d/versailles/logic.cpp
    engines/cryomni3d/versailles/menus.cpp


diff --git a/.gitignore b/.gitignore
index 4abb339..2342c7b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -145,6 +145,7 @@ project.xcworkspace
 /devtools/make-scumm-fontdata
 /devtools/create_access/create_access
 /devtools/create_cryo/create_cryo_dat
+/devtools/create_cryomni3d/create_cryomni3d_dat
 /devtools/create_drascula/create_drascula
 /devtools/create_hugo/create_hugo
 /devtools/create_kyradat/create_kyradat
diff --git a/Makefile.common b/Makefile.common
index 78e0d6e..9df4e60 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -310,6 +310,9 @@ endif
 ifdef ENABLE_CRYO
 DIST_FILES_ENGINEDATA+=cryo.dat
 endif
+ifdef ENABLE_CRYOMNI3D
+DIST_FILES_ENGINEDATA+=cryomni3d.dat
+endif
 ifdef ENABLE_DRASCULA
 DIST_FILES_ENGINEDATA+=drascula.dat
 endif
diff --git a/backends/platform/maemo/debian/rules b/backends/platform/maemo/debian/rules
index 2a763c9..9fbdff6 100755
--- a/backends/platform/maemo/debian/rules
+++ b/backends/platform/maemo/debian/rules
@@ -49,6 +49,7 @@ install: build
 	install -m0644 backends/vkeybd/packs/vkeybd_small.zip debian/scummvm/opt/scummvm/share
 # for optified version we can also add engine datafiles
 	install -m0644 dists/engine-data/access.dat debian/scummvm/opt/scummvm/share
+	install -m0644 dists/engine-data/cryomni3d.dat debian/scummvm/opt/scummvm/share
 	install -m0644 dists/engine-data/drascula.dat debian/scummvm/opt/scummvm/share
 	install -m0644 dists/engine-data/fonts.dat debian/scummvm/opt/scummvm/share
 	install -m0644 dists/engine-data/hugo.dat debian/scummvm/opt/scummvm/share
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
new file mode 100644
index 0000000..01262b2
--- /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 0000000..a040ca4
--- /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 0000000..79e2b1a
--- /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 0000000..4ce94ef
--- /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 0000000..4cd685e
--- /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 0000000..edddd7a
--- /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 0000000..e0bd191
--- /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
diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp
index 8312a3c..586eaa3 100644
--- a/devtools/create_project/xcode.cpp
+++ b/devtools/create_project/xcode.cpp
@@ -751,6 +751,7 @@ XcodeProvider::ValueList& XcodeProvider::getResourceFiles() const {
 		files.push_back("gui/themes/translations.dat");
 		files.push_back("dists/engine-data/access.dat");
 		files.push_back("dists/engine-data/cryo.dat");
+		files.push_back("dists/engine-data/cryomni3d.dat");
 		files.push_back("dists/engine-data/drascula.dat");
 		files.push_back("dists/engine-data/fonts.dat");
 		files.push_back("dists/engine-data/hugo.dat");
diff --git a/dists/engine-data/README b/dists/engine-data/README
index 31673d8..080fd6a 100644
--- a/dists/engine-data/README
+++ b/dists/engine-data/README
@@ -7,6 +7,11 @@ TODO
 cryo.dat
 This file contains a lot of hardcoded tables used by the Cryo engine.
 
+cryomni3d.dat
+This file contains all strings and some file names depending only on platform/localization.
+Some filenames depend on the edition, these are handled by game flags in engine code.
+Those informations were stored in the original executables.
+
 drascula.dat
 TODO
 
diff --git a/dists/engine-data/cryomni3d.dat b/dists/engine-data/cryomni3d.dat
new file mode 100644
index 0000000..a4a0beb
Binary files /dev/null and b/dists/engine-data/cryomni3d.dat differ
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 17b1caf..c7846fe 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -36,6 +36,9 @@ access.dat           FILE    "dists/engine-data/access.dat"
 #if PLUGIN_ENABLED_STATIC(CRYO)
 cryo.dat               FILE    "dists/engine-data/cryo.dat"
 #endif
+#if PLUGIN_ENABLED_STATIC(CRYOMNI3D)
+cryomni3d.dat               FILE    "dists/engine-data/cryomni3d.dat"
+#endif
 #if PLUGIN_ENABLED_STATIC(DRASCULA)
 drascula.dat           FILE    "dists/engine-data/drascula.dat"
 #endif
diff --git a/engines/cryomni3d/cryomni3d.cpp b/engines/cryomni3d/cryomni3d.cpp
index 334bcd3..35a4cce 100644
--- a/engines/cryomni3d/cryomni3d.cpp
+++ b/engines/cryomni3d/cryomni3d.cpp
@@ -34,6 +34,7 @@
 #include "graphics/palette.h"
 
 #include "cryomni3d/cryomni3d.h"
+#include "cryomni3d/datstream.h"
 
 #include "cryomni3d/image/hlz.h"
 #include "cryomni3d/video/hnm_decoder.h"
@@ -79,6 +80,26 @@ void CryOmni3DEngine::pauseEngineIntern(bool pause) {
 	*/
 }
 
+DATSeekableStream *CryOmni3DEngine::getStaticData(uint32 gameId, uint16 version) const {
+	Common::File *datFile = new Common::File();
+
+	if (!datFile->open("cryomni3d.dat")) {
+		delete datFile;
+		error("Failed to open cryomni3d.dat file");
+		return nullptr;
+	}
+
+	DATSeekableStream *gameStream = DATSeekableStream::getGame(datFile, gameId, version, getLanguage(),
+	                                getPlatform());
+	if (!gameStream) {
+		delete datFile;
+		error("Failed to find game in cryomni3d.dat file");
+		return nullptr;
+	}
+
+	return gameStream;
+}
+
 Common::String CryOmni3DEngine::prepareFileName(const Common::String &baseName,
         const char *const *extensions) const {
 	Common::String fname(baseName);
diff --git a/engines/cryomni3d/cryomni3d.h b/engines/cryomni3d/cryomni3d.h
index 95f3b54..86803a1 100644
--- a/engines/cryomni3d/cryomni3d.h
+++ b/engines/cryomni3d/cryomni3d.h
@@ -61,6 +61,8 @@ class ImageDecoder;
  */
 namespace CryOmni3D {
 
+class DATSeekableStream;
+
 enum CryOmni3DGameType {
 	GType_VERSAILLES
 };
@@ -155,6 +157,8 @@ public:
 	virtual void setupPalette(const byte *colors, uint start, uint num) = 0;
 
 protected:
+	DATSeekableStream *getStaticData(uint32 gameId, uint16 version) const;
+
 	void copySubPalette(byte *dst, const byte *src, uint start, uint num);
 	void setPalette(const byte *colors, uint start, uint num);
 	void lockPalette(uint startRW, uint endRW) { _lockPaletteStartRW = startRW; _lockPaletteEndRW = endRW; }
diff --git a/engines/cryomni3d/datstream.cpp b/engines/cryomni3d/datstream.cpp
new file mode 100644
index 0000000..461146f
--- /dev/null
+++ b/engines/cryomni3d/datstream.cpp
@@ -0,0 +1,146 @@
+/* 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.
+ *
+ */
+
+
+#include "cryomni3d/datstream.h"
+
+namespace CryOmni3D {
+
+DATSeekableStream *DATSeekableStream::getGame(Common::SeekableReadStream *stream,
+        uint32 gameId, uint16 version, Common::Language lang, Common::Platform platform) {
+	if (stream == nullptr) {
+		return nullptr;
+	}
+
+	// Go to start of file
+	stream->seek(0, SEEK_SET);
+
+	// ALl of this should match devtools/create_cryomni3d_dat
+
+	// Check header
+	byte header[8];
+	memset(header, 0, sizeof(header));
+	stream->read(header, sizeof(header));
+	if (memcmp(header, "CY3DDATA", sizeof(header))) {
+		return nullptr;
+	}
+
+	// Check version
+	uint16 fileVersion = stream->readUint16LE();
+	if (fileVersion != kFileVersion) {
+		return nullptr;
+	}
+
+	uint16 langTranslated = translateLanguage(lang);
+	uint32 platformTranslated = translatePlatform(platform);
+
+	uint16 games = stream->readUint16LE();
+
+	// Padding to align to 16 bytes boundary
+	(void)stream->readUint32LE();
+
+	for (uint16 game = 0; game < games; game++) {
+		// Keep tag readable
+		uint32 readGameId = stream->readUint32BE();
+		uint16 readVersion = stream->readUint16LE();
+		// Keep tag readable
+		uint16 readLang = stream->readUint16BE();
+		uint32 readPlatforms = stream->readUint32LE();
+		uint32 offset = stream->readUint32LE();
+		uint32 size = stream->readUint32LE();
+
+		if (gameId != readGameId) {
+			continue;
+		}
+		if (version != readVersion) {
+			continue;
+		}
+		if (langTranslated != readLang) {
+			continue;
+		}
+		if (!(platformTranslated & readPlatforms)) {
+			continue;
+		}
+
+		// If we are there, we got a match
+		return new DATSeekableStream(stream, offset, offset + size);
+	}
+
+	// No match
+	return nullptr;
+}
+
+Common::String DATSeekableStream::readString16() {
+	char *buf;
+	uint16 len;
+
+	len = readUint16LE();
+	buf = (char *)malloc(len);
+	read(buf, len);
+
+	Common::String s(buf, len);
+	free(buf);
+
+	return s;
+}
+
+void DATSeekableStream::readString16Array16(Common::StringArray &array) {
+	uint16 items;
+	uint16 i;
+
+	items = readUint16LE();
+
+	array.reserve(items);
+	for (i = 0; i < items; i++) {
+		array.push_back(readString16());
+	}
+}
+
+uint16 DATSeekableStream::translateLanguage(Common::Language lang) {
+	switch (lang) {
+	case Common::FR_FRA:
+		return MKTAG16('f', 'r');
+	default:
+		// Invalid language
+		return 0;
+	}
+}
+
+uint32 DATSeekableStream::translatePlatform(Common::Platform platform) {
+	switch (platform) {
+	case Common::kPlatformWindows:
+		return 0x1;
+	case Common::kPlatformDOS:
+		return 0x2;
+	case Common::kPlatformMacintosh:
+		return 0x4;
+	case Common::kPlatformPSX:
+		return 0x8;
+	case Common::kPlatformSegaCD:
+		return 0x10;
+	default:
+		// Invalid platform
+		return 0;
+	}
+}
+
+} // End of namespace CryOmni3D
diff --git a/engines/cryomni3d/datstream.h b/engines/cryomni3d/datstream.h
new file mode 100644
index 0000000..78614ef
--- /dev/null
+++ b/engines/cryomni3d/datstream.h
@@ -0,0 +1,58 @@
+/* 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 CRYOMNI3D_DATSTREAM_H
+#define CRYOMNI3D_DATSTREAM_H
+
+#include "common/language.h"
+#include "common/platform.h"
+#include "common/str.h"
+#include "common/str-array.h"
+#include "common/substream.h"
+
+namespace CryOmni3D {
+
+class DATSeekableStream : public Common::SeekableSubReadStream {
+public:
+
+	/* Parent stream must not be used after this call and will be disposed if fetch succeeded */
+	static DATSeekableStream *getGame(Common::SeekableReadStream *stream,
+	                                  uint32 gameId, uint16 version, Common::Language lang, Common::Platform platform);
+
+	Common::String readString16();
+	void readString16Array16(Common::StringArray &array);
+
+private:
+	DATSeekableStream(SeekableReadStream *parentStream, uint32 start, uint32 end) :
+		SeekableSubReadStream(parentStream, start, end, DisposeAfterUse::YES) { }
+
+	static uint16 translateLanguage(Common::Language lang);
+	static uint32 translatePlatform(Common::Platform platform);
+
+	/* This is the version of the global file format
+	 * Each game has then a version specific for its data */
+	static const uint16 kFileVersion = 1;
+};
+
+} // End of namespace CryOmni3D
+
+#endif
diff --git a/engines/cryomni3d/module.mk b/engines/cryomni3d/module.mk
index 30dd767..830f450 100644
--- a/engines/cryomni3d/module.mk
+++ b/engines/cryomni3d/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS = \
 	image/hlz.o \
 	video/hnm_decoder.o \
 	cryomni3d.o \
+	datstream.o \
 	detection.o \
 	dialogs_manager.o \
 	fixed_image.o \
diff --git a/engines/cryomni3d/versailles/data.cpp b/engines/cryomni3d/versailles/data.cpp
index af3dae4..f97e0da 100644
--- a/engines/cryomni3d/versailles/data.cpp
+++ b/engines/cryomni3d/versailles/data.cpp
@@ -20,6 +20,8 @@
  *
  */
 
+#include "cryomni3d/datstream.h"
+
 #include "cryomni3d/versailles/engine.h"
 
 namespace CryOmni3D {
@@ -69,224 +71,27 @@ const FakeTransitionActionPlace CryOmni3DEngine_Versailles::kFakeTransitions[] =
 	{0, 0} // Must be the last one
 };
 
-void CryOmni3DEngine_Versailles::setupMessages() {
-	_messages.resize(146);
-#define SET_MESSAGE(id, str) _messages[id] = str
-	SET_MESSAGE(0, "Il est interdit d'ouvrir cette porte pour l'instant.");
-	SET_MESSAGE(1, "Cette porte est ferm" "\x8e" "e " "\x88" " clef.");
-	SET_MESSAGE(2, "Cette porte est ferm" "\x8e" "e.");
-	SET_MESSAGE(3, "Ce tiroir est vide.");
-	SET_MESSAGE(4, "Vous ne pouvez pas atteindre la b" "\x89" "che.");
-	SET_MESSAGE(5, "Il n'y a rien dans cet oranger");
-	SET_MESSAGE(6, "Ceci n'est pas un oranger!");
-	SET_MESSAGE(7, "Il fait trop sombre. ");
-	SET_MESSAGE(8, "Le coffre est ferm" "\x8e" ". ");
-	SET_MESSAGE(9, "Vous pouvez ouvrir la porte");
-	SET_MESSAGE(10, "Il faudrait quelque chose pour atteindre la bombe.");
-	SET_MESSAGE(11, "Ce vase est vide.");
-	SET_MESSAGE(12, "Maintenant, vous pouvez y aller.");
-	SET_MESSAGE(13, "Vous n" "\xd5" "avez plus le temps de vous renseigner sur la Cour!");
-	SET_MESSAGE(14, "Il est trop tard pour regarder les tableaux!");
-	SET_MESSAGE(16, "Vous ne pouvez pas atteindre le papier.");
-	SET_MESSAGE(15, "Attendez ! Transmettez donc vos indices " "\x88" " l'huissier.");
-	SET_MESSAGE(17, "Vers l'apothicairerie");
-	SET_MESSAGE(
-	    18,
-	    "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.");
-	SET_MESSAGE(
-	    19,
-	    "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.");
-	SET_MESSAGE(20, "Vous ne pouvez pas vous d" "\x8e" "placer en portant une " "\x8e" "chelle!");
-	SET_MESSAGE(21, "Il n'y a plus rien ici");
-	SET_MESSAGE(22, "Au revoir ...");
-	SET_MESSAGE(23, "VERSAILLES,");
-	SET_MESSAGE(24, "Complot " "\x88" " la Cour du Roi Soleil");
-	SET_MESSAGE(27, "           Commencer une nouvelle partie");
-	SET_MESSAGE(26, "           Reprendre la partie en cours");
-	SET_MESSAGE(44, "           Reprendre la visite en cours");
-	SET_MESSAGE(28, "           Charger une partie");
-	SET_MESSAGE(46, "           Charger une visite");
-	SET_MESSAGE(29, "           Sauver la partie");
-	SET_MESSAGE(45, "           Sauver la visite");
-	SET_MESSAGE(25, "Consulter l'espace documentaire");
-	SET_MESSAGE(42, "Visiter le ch" "\x89" "teau");
-	SET_MESSAGE(48, "           Omni3D : normal");
-	SET_MESSAGE(51, "           Omni3D : rapide");
-	SET_MESSAGE(52, "           Omni3D : tr" "\x8f" "s rapide");
-	SET_MESSAGE(49, "           Omni3D : lent");
-	SET_MESSAGE(50, "           Omni3D : tr" "\x8f" "s lent");
-	SET_MESSAGE(30, "           Afficher les sous-titres : OUI");
-	SET_MESSAGE(31, "           Afficher les sous-titres : NON");
-	SET_MESSAGE(32, "           Musique : OUI");
-	SET_MESSAGE(33, "           Musique : NON");
-	SET_MESSAGE(35, "           Toutes les musiques sur disque dur (92 Mo)");
-	SET_MESSAGE(34, "           Une seule musique sur disque dur (20 Mo)");
-	SET_MESSAGE(36, "           Aucune musique sur disque dur (lecture CD)");
-	SET_MESSAGE(43, "Cr" "\x8e" "dits");
-	SET_MESSAGE(39, "Volume");
-	SET_MESSAGE(41, "");
-	SET_MESSAGE(40, "Quitter le jeu");
-	SET_MESSAGE(53, "Confirmer");
-	SET_MESSAGE(54, "Annuler");
-	SET_MESSAGE(55, "libre");
-	SET_MESSAGE(56, "sans nom");
-	SET_MESSAGE(57, "Attention : la partie en cours va " "\x90" "tre abandonn" "\x8e" "e.");
-	SET_MESSAGE(58, "Retour");
-	SET_MESSAGE(59, "Le chateau");
-	SET_MESSAGE(60, "Retour Menu Principal");
-	SET_MESSAGE(61, "Sommaire Espace documentaire");
-	SET_MESSAGE(62, "Plan du ch" "\x89" "teau et des jardins");
-	SET_MESSAGE(63, "Plan des int" "\x8e" "rieurs du ch" "\x89" "teau");
-	SET_MESSAGE(64, "Probl" "\x8f" "me d'" "\x8e" "criture sur dique dur : disque plein ");
-	SET_MESSAGE(66, "Veuillez ins" "\x8e" "rer le CD ");
-	SET_MESSAGE(67, "Veuillez ins" "\x8e" "rer le CD %d et presser une touche");
-	SET_MESSAGE(68, "Les arts");
-	SET_MESSAGE(69, "Le r" "\x8f" "gne");
-	SET_MESSAGE(70, "La Cour");
-	SET_MESSAGE(71, "Vie de Ch" "\x89" "teau");
-	SET_MESSAGE(72, "Le ch" "\x89" "teau et les jardins");
-	SET_MESSAGE(73, "Chronologie");
-	SET_MESSAGE(74, "Bassin d'Apollon");
-	SET_MESSAGE(75, "Le Ch" "\x89" "teau");
-	SET_MESSAGE(76, "Colonnade");
-	SET_MESSAGE(77, "Labyrinthe");
-	SET_MESSAGE(78, "Latone");
-	SET_MESSAGE(79, "Orangerie");
-	SET_MESSAGE(80, "Parterre d'eau");
-	SET_MESSAGE(81, "Tapis vert");
-	SET_MESSAGE(86, "Grand Canal");
-	SET_MESSAGE(87, "Parterre du Midi");
-	SET_MESSAGE(88, "Parterre du nord");
-	SET_MESSAGE(89, "Potager du Roi");
-	SET_MESSAGE(90, "Salle de bal");
-	SET_MESSAGE(91, "Bassin de Neptune");
-	SET_MESSAGE(92, "Pi" "\x8f" "ce d'eau des suisses");
-	SET_MESSAGE(82, "Grandes Ecuries");
-	SET_MESSAGE(83, "Petites Ecuries");
-	SET_MESSAGE(84, "Les jardins");
-	SET_MESSAGE(85, "Avant cour");
-	SET_MESSAGE(93, "Aiguilles (Inutile!)");
-	SET_MESSAGE(94, "Ciseaux");
-	SET_MESSAGE(95, "Papier");
-	SET_MESSAGE(96, "Pamphlet sur les arts");
-	SET_MESSAGE(97, "Petite clef 1");
-	SET_MESSAGE(98, "Papier r" "\x8e" "v" "\x8e" "l" "\x8e" "");
-	SET_MESSAGE(99, "Papier t" "\x89" "ch" "\x8e" "");
-	SET_MESSAGE(100, "Papier du coffre");
-	SET_MESSAGE(101, "Pamphlet sur la lign" "\x8e" "e royale");
-	SET_MESSAGE(102, "Bougie allum" "\x8e" "e");
-	SET_MESSAGE(103, "Bougie");
-	SET_MESSAGE(104, "Clef ");
-	SET_MESSAGE(105, "Carton " "\x88" " dessin");
-	SET_MESSAGE(106, "Carton " "\x88" " dessin");
-	SET_MESSAGE(107, "Fausse esquisse");
-	SET_MESSAGE(108, "Echelle");
-	SET_MESSAGE(109, "Esquisse d" "\x8e" "truite");
-	SET_MESSAGE(110, "pinceau");
-	SET_MESSAGE(111, "pinceau Or");
-	SET_MESSAGE(112, "pinceau Rouge");
-	SET_MESSAGE(113, "Fusain");
-	SET_MESSAGE(114, "Papier");
-	SET_MESSAGE(115, "Pamphlet sur l" "\xd5" "architecture");
-	SET_MESSAGE(116, "Petite clef 2");
-	SET_MESSAGE(117, "Archer(inutile!)");
-	SET_MESSAGE(118, "Partition");
-	SET_MESSAGE(119, "Queue de billard");
-	SET_MESSAGE(120, "Autorisation");
-	SET_MESSAGE(121, "Reproduction des m" "\x8e" "dailles");
-	SET_MESSAGE(122, "Tiroir " "\x88" " m" "\x8e" "dailles");
-	SET_MESSAGE(123, "Clef de la petite porte d" "\xd5" "Apollon");
-	SET_MESSAGE(124, "Nourriture");
-	SET_MESSAGE(125, "Pamphlet sur la religion");
-	SET_MESSAGE(126, "Epigraphe");
-	SET_MESSAGE(127, "Pamphlet sur le gouvernement");
-	SET_MESSAGE(128, "Plume");
-	SET_MESSAGE(129, "Pense-b" "\x90" "te");
-	SET_MESSAGE(130, "Lunette");
-	SET_MESSAGE(131, "Plan Vauban");
-	SET_MESSAGE(132, "Plan Vauban");
-	SET_MESSAGE(133, "Cordon");
-	SET_MESSAGE(134, "Gravure");
-	SET_MESSAGE(135, "Petite clef 3");
-	SET_MESSAGE(136, "Petite clef 4");
-	SET_MESSAGE(137, "M" "\x8e" "morandum");
-	SET_MESSAGE(138, "Plans du chateau");
-	SET_MESSAGE(139, "Plans du chateau");
-	SET_MESSAGE(140, "Clef des combles");
-	SET_MESSAGE(141, "Fables");
-	SET_MESSAGE(142, "Plan du Labyrinthe");
-	SET_MESSAGE(143, "Outil");
-	SET_MESSAGE(144, "M" "\x8e" "dicament");
-	SET_MESSAGE(145, "Eteignoir");
-#undef SET_MESSAGE
-}
+void CryOmni3DEngine_Versailles::loadStaticData() {
+	// This should match data in devtools/create_cryomni3d_dat
+	DATSeekableStream *data = getStaticData(MKTAG('V', 'R', 'S', 'L'), 1);
+
+	// In the dat file we have
+	// file names
+	data->readString16Array16(_localizedFilenames);
+	assert(_localizedFilenames.size() == LocalizedFilenames::kMax);
+
+	// epigraph settings, bomb password
+	_epigraphContent = data->readString16();
+	_epigraphPassword = data->readString16();
+	_bombPassword = data->readString16();
+
+	// messages, paintings titles
+	data->readString16Array16(_messages);
+	assert(_messages.size() == 146);
+	data->readString16Array16(_paintingsTitles);
+	assert(_paintingsTitles.size() == 48);
 
-void CryOmni3DEngine_Versailles::setupPaintingsTitles() {
-	_paintingsTitles.reserve(48);
-#define SET_PAINTING_TITLE(str) _paintingsTitles.push_back(str)
-	SET_PAINTING_TITLE("\"Entr" "\x8e" "e des animaux dans l'arche\"\rGerolamo Bassano"); // 0: 41201
-	SET_PAINTING_TITLE("\"Le repas d'Emma" "\x9f" "s\"\rJacopo Bassano"); // 1: 41202
-	SET_PAINTING_TITLE("\"La Madeleine aux pieds de J" "\x8e" "sus Christ\"\rSustris"); // 2: 41203
-	SET_PAINTING_TITLE("\"La sortie de l'arche\"\rGerolamo Bassano"); // 3: 41204
-	SET_PAINTING_TITLE("\"Le frappement du rocher\"\rJacopo Bassano"); // 4: 41205
-	SET_PAINTING_TITLE("\"La Bataille d'Arbelles\"\rJoseph Parrocel"); // 5: 41301
-	SET_PAINTING_TITLE("\"Alexandre Le Grand vainqueur de Darius " "\x88"
-	                   " la bataille d'Arbelles\"\rLe Bourguignon"); // 6: 41302
-	SET_PAINTING_TITLE("\"Le Combat de Leuze\"\rJoseph Parrocel"); // 7: 42401
-	SET_PAINTING_TITLE("\"Sainte C" "\x8e"
-	                   "cile avec un ange tenant une partition musicale\"\rDominiquin"); // 8: 42901
-	SET_PAINTING_TITLE("\"Don Francisco du Moncada \"\rVan Dyck"); // 9: 42902
-	SET_PAINTING_TITLE("\"Le Petit Saint Jean Baptiste\"\rLe Carrache"); // 10: 42903
-	SET_PAINTING_TITLE("\"Saint Mathieu\"\rValentin"); // 11: 42904
-	SET_PAINTING_TITLE("\"Le Denier de C" "\x8e" "sar \"\rValentin"); // 12: 42905
-	SET_PAINTING_TITLE("\"Saint Luc\"\rValentin"); // 13: 42906
-	SET_PAINTING_TITLE("\"Le mariage mystique de Sainte Catherine\"\r Alessandro Turchi"); // 14: 42907
-	SET_PAINTING_TITLE("\"R" "\x8e" "union de buveurs\"\rNicolas Tournier"); // 15: 42908
-	SET_PAINTING_TITLE("\"La diseuse de Bonne aventure \"\rValentin"); // 16: 42909
-	SET_PAINTING_TITLE("\"le roi David jouant de la harpe \"\rDominiquin"); // 17: 42910
-	SET_PAINTING_TITLE("\"Sainte Madeleine\"\rDominiquin"); // 18: 42911
-	SET_PAINTING_TITLE("\"Autoportrait \"\rVan Dyck"); // 19: 42912
-	SET_PAINTING_TITLE("\"Saint Jean l'" "\x8e" "vang" "\x8e" "liste\"\r Valentin"); // 20: 42913
-	SET_PAINTING_TITLE("\"Agar secouru par un ange \"\rGiovanni Lanfranco"); // 21: 42914
-	SET_PAINTING_TITLE("\"Saint Marc \"\rValentin"); // 22: 42915
-	SET_PAINTING_TITLE("\"M" "\x8e" "l" "\x8e" "agre ayant " "\x88"
-	                   " ses pieds la hure du sanglier de Calydon\"\r Jacques Rousseau"); // 23: 43090
-	SET_PAINTING_TITLE("\"Le Roi en costume romain\"\rJean Warin"); // 24: 43091
-	SET_PAINTING_TITLE("\"attalante\"\rJacques Rousseau"); // 25: 43092
-	SET_PAINTING_TITLE("\"En" "\x8e" "e portant Anchise\"\rSpada"); // 26: 43100
-	SET_PAINTING_TITLE("\"David et Bethsab" "\x8e" "e\"\rV" "\x8e" "ron" "\x8f" "se"); // 27: 43101
-	SET_PAINTING_TITLE("\"La fuite en Egypte\"\rGuido R" "\x8e" "ni "); // 28: 43102
-	SET_PAINTING_TITLE("\"Louis XIV " "\x88" " cheval\"\rPierre Mignard"); // 29: 43103
-	SET_PAINTING_TITLE("\"La magnificience royale & le progr" "\x8f"
-	                   "s des beaux arts\"\rHouasse"); // 30: 43104
-	SET_PAINTING_TITLE("\"Le Sacrifice d'Iphig" "\x8e" "nie\"\rCharles de la Fosse"); // 31: 43130
-	SET_PAINTING_TITLE("\"Buste de Louis XIV\"\rsculpt" "\x8e"
-	                   " par le Chevalier Bernin "); // 32: 43131
-	SET_PAINTING_TITLE("\"Diane d" "\x8e" "couvrant son berger Endymion endormi dans les bras de Morph"
-	                   "\x8e" "e\"\rGabriel Blanchard"); // 33: 43132
-	SET_PAINTING_TITLE("\"La vierge & Saint Pierre\"\rGuerchin"); // 34: 43140
-	SET_PAINTING_TITLE("\"Les P" "\x8e" "lerins d'Emma" "\x9f" "s\"\rV" "\x8e" "ron" "\x8f"
-	                   "se"); // 35: 43141
-	SET_PAINTING_TITLE("\"La sainte Famille\"\rV" "\x8e" "ron" "\x8f" "se"); // 36: 43142
-	SET_PAINTING_TITLE("\"La famille de Darius aux pieds d'Alexandre\"\rCharles LeBrun"); // 37: 43143
-	SET_PAINTING_TITLE("\"Saint Jean-Baptiste\"\rRapha" "\x91" "l"); // 38: 43144
-	SET_PAINTING_TITLE("\"Marie de m" "\x8e" "dicis\"\rVan Dyck"); // 39: 43150
-	SET_PAINTING_TITLE("\"Hercule luttant contre Achelous\"\rGuido R" "\x8e" "ni"); // 40: 43151
-	SET_PAINTING_TITLE("\"Le Centaure Nessus porte Dejanire\"\rGuido R" "\x8e" "ni"); // 41: 43152
-	SET_PAINTING_TITLE("\"Saint Fran" "\x8d" "ois d'Assise r" "\x8e" "confort" "\x8e" " apr" "\x8f"
-	                   "s sa stigmatisation\"\rSeghers"); // 42: 43153
-	SET_PAINTING_TITLE("\"Thomiris faisant tremper la t" "\x90"
-	                   "te de Cyrus dans le sang\"\rRubens"); // 43: 43154
-	SET_PAINTING_TITLE("\"Hercule tuant l'Hydre\"\rGuido R" "\x8e" "ni"); // 44: 43155
-	SET_PAINTING_TITLE("\"Hercule sur le b" "\x9e" "cher\"\rGuido R" "\x8e" "ni"); // 45: 43156
-	SET_PAINTING_TITLE("\"Portrait du Prince Palatin & de son fr" "\x8f"
-	                   "re le Prince Robert\"\rVan Dyck"); // 46: 43157
-	SET_PAINTING_TITLE("\"La descente de Croix \"\rCharles Lebrun"); // 47: 45260
-#undef SET_PAINTING_TITLE
+	delete data;
 }
 
 struct VideoSubSetting {
diff --git a/engines/cryomni3d/versailles/documentation.cpp b/engines/cryomni3d/versailles/documentation.cpp
index c74aaa9..c207d9d 100644
--- a/engines/cryomni3d/versailles/documentation.cpp
+++ b/engines/cryomni3d/versailles/documentation.cpp
@@ -35,8 +35,6 @@
 namespace CryOmni3D {
 namespace Versailles {
 
-const char *Versailles_Documentation::kAllDocsFile = "tous_doc.txt";
-const char *Versailles_Documentation::kLinksDocsFile = "lien_doc.txt";
 const Versailles_Documentation::TimelineEntry Versailles_Documentation::kTimelineEntries[] = {
 	{ "1638", 340,  15 },
 	{ "1643", 470,  30 },
@@ -84,17 +82,20 @@ const Versailles_Documentation::TimelineEntry Versailles_Documentation::kTimelin
 };
 
 void Versailles_Documentation::init(const Sprites *sprites, FontManager *fontManager,
-                                    const Common::StringArray *messages, CryOmni3DEngine *engine) {
+                                    const Common::StringArray *messages, CryOmni3DEngine *engine,
+                                    const Common::String &allDocsFileName, const Common::String &linksDocsFileName) {
 	_sprites = sprites;
 	_fontManager = fontManager;
 	_messages = messages;
 	_engine = engine;
+	_allDocsFileName = allDocsFileName;
+	_linksDocsFileName = linksDocsFileName;
 
 	// Build list of records
 	Common::File allDocsFile;
 
-	if (!allDocsFile.open(kAllDocsFile)) {
-		error("Can't open %s", kAllDocsFile);
+	if (!allDocsFile.open(_allDocsFileName)) {
+		error("Can't open %s", _allDocsFileName.c_str());
 	}
 
 	uint allDocsSize = allDocsFile.size();
@@ -1940,8 +1941,8 @@ Common::String Versailles_Documentation::getRecordTitle(const Common::String &re
 	const RecordInfo &recordInfo = it->_value;
 	Common::File allDocsFile;
 
-	if (!allDocsFile.open(kAllDocsFile)) {
-		error("Can't open %s", kAllDocsFile);
+	if (!allDocsFile.open(_allDocsFileName)) {
+		error("Can't open %s", _allDocsFileName.c_str());
 	}
 	allDocsFile.seek(recordInfo.position);
 
@@ -1969,8 +1970,8 @@ Common::String Versailles_Documentation::getRecordData(const Common::String &rec
 	const RecordInfo &recordInfo = it->_value;
 	Common::File allDocsFile;
 
-	if (!allDocsFile.open(kAllDocsFile)) {
-		error("Can't open %s", kAllDocsFile);
+	if (!allDocsFile.open(_allDocsFileName)) {
+		error("Can't open %s", _allDocsFileName.c_str());
 	}
 	allDocsFile.seek(recordInfo.position);
 
@@ -2014,8 +2015,8 @@ void Versailles_Documentation::loadLinksFile() {
 	}
 
 	Common::File linksFile;
-	if (!linksFile.open(kLinksDocsFile)) {
-		error("Can't open links file: %s", kLinksDocsFile);
+	if (!linksFile.open(_linksDocsFileName)) {
+		error("Can't open links file: %s", _linksDocsFileName.c_str());
 	}
 
 	_linksSize = linksFile.size();
diff --git a/engines/cryomni3d/versailles/documentation.h b/engines/cryomni3d/versailles/documentation.h
index 1808956..dd889e1 100644
--- a/engines/cryomni3d/versailles/documentation.h
+++ b/engines/cryomni3d/versailles/documentation.h
@@ -44,7 +44,8 @@ public:
 	~Versailles_Documentation() { delete [] _linksData; }
 
 	void init(const Sprites *sprites, FontManager *fontManager, const Common::StringArray *messages,
-	          CryOmni3DEngine *engine);
+	          CryOmni3DEngine *engine, const Common::String &allDocsFileName,
+	          const Common::String &linksDocsFileName);
 	void handleDocArea();
 	void handleDocInGame(const Common::String &record);
 
@@ -109,8 +110,8 @@ private:
 	void loadLinksFile();
 	void getLinks(const Common::String &record, Common::Array<LinkInfo> &links);
 
-	static const char *kAllDocsFile;
-	static const char *kLinksDocsFile;
+	Common::String _allDocsFileName;
+	Common::String _linksDocsFileName;
 
 	static const uint kPopupMenuMargin = 5;
 
diff --git a/engines/cryomni3d/versailles/engine.cpp b/engines/cryomni3d/versailles/engine.cpp
index 98a34e3..7fba901 100644
--- a/engines/cryomni3d/versailles/engine.cpp
+++ b/engines/cryomni3d/versailles/engine.cpp
@@ -122,17 +122,18 @@ Common::Error CryOmni3DEngine_Versailles::run() {
 
 	SearchMan.add("__fallbackFiles", fallbackFiles);
 
-	setupMessages();
+	// First thing, load all data that was originally in the executable
+	// We don't need anything prepared for that
+	loadStaticData();
 
 	_dialogsMan.init(138, _messages[22]);
 	_gameVariables.resize(GameVariables::kMax);
 	_omni3dMan.init(75. / 180. * M_PI);
 
-	_dialogsMan.loadGTO("DIALOG1.GTO");
+	_dialogsMan.loadGTO(_localizedFilenames[LocalizedFilenames::kDialogs]);
 	setupDialogVariables();
 	setupDialogShows();
 
-	setupPaintingsTitles();
 	setupImgScripts();
 
 	_mainPalette = new byte[3 * 256];
@@ -162,7 +163,9 @@ Common::Error CryOmni3DEngine_Versailles::run() {
 
 	// Documentation is needed by noone at init time, let's do it last
 	initDocPeopleRecord();
-	_docManager.init(&_sprites, &_fontManager, &_messages, this);
+	_docManager.init(&_sprites, &_fontManager, &_messages, this,
+	                 _localizedFilenames[LocalizedFilenames::kAllDocs],
+	                 _localizedFilenames[LocalizedFilenames::kLinksDocs]);
 
 	_countdownSurface.create(40, 15, Graphics::PixelFormat::createFormatCLUT8());
 
diff --git a/engines/cryomni3d/versailles/engine.h b/engines/cryomni3d/versailles/engine.h
index ff00dfd..95747ce 100644
--- a/engines/cryomni3d/versailles/engine.h
+++ b/engines/cryomni3d/versailles/engine.h
@@ -168,6 +168,17 @@ struct SoundIds {
 	};
 };
 
+struct LocalizedFilenames {
+	enum {
+		kDialogs = 0,
+		kAllDocs,
+		kLinksDocs,
+		kCredits,
+		kLeb001,
+		kMax
+	};
+};
+
 struct PlaceState {
 	typedef void (CryOmni3DEngine_Versailles::*InitFunc)();
 	typedef bool (CryOmni3DEngine_Versailles::*FilterEventFunc)(uint *event);
@@ -242,11 +253,10 @@ private:
 	void setupSprites();
 	void loadCursorsPalette();
 	void calculateTransparentMapping();
-	void setupMessages();
 	void setupObjects();
 	void setupDialogVariables();
 	void setupImgScripts();
-	void setupPaintingsTitles();
+	void loadStaticData();
 
 	void syncOmni3DSettings();
 	void syncSoundSettings();
@@ -340,6 +350,7 @@ private:
 	void musicStop();
 	void musicSetQuiet(bool quiet);
 
+	Common::StringArray _localizedFilenames;
 	Common::StringArray _messages;
 	static const uint kSpritesMapTable[];
 	static const uint kSpritesMapTableSize;
@@ -509,8 +520,8 @@ private:
 	IMG_CB(44161e);
 	IMG_CB(44161f);
 	static const uint kEpigraphMaxLetters = 32;
-	static const char *kEpigraphContent;
-	static const char *kEpigraphPassword;
+	Common::String _epigraphContent;
+	Common::String _epigraphPassword;
 	bool handleEpigraph(ZonFixedImage *fimg);
 	void drawEpigraphLetters(Graphics::ManagedSurface &surface,
 	                         const Graphics::Surface(&bmpLetters)[28], const Common::String &letters);
@@ -531,13 +542,13 @@ private:
 	IMG_CB(88003d);
 	IMG_CB(88003e);
 	IMG_CB(88003f);
+	Common::String _bombPassword;
 	static const uint kBombPasswordSmallLength = 40;
 	static const uint kBombPasswordMaxLength = 60;
 	static const uint16 kBombLettersPos[2][kBombPasswordMaxLength][2];
-	static const char *kBombPassword;
 	bool handleBomb(ZonFixedImage *fimg);
 	void drawBombLetters(Graphics::ManagedSurface &surface, const Graphics::Surface(&bmpLetters)[28],
-	                     const uint kBombPasswordLength,
+	                     const uint bombPasswordLength,
 	                     const unsigned char (&bombPossibilites)[kBombPasswordMaxLength][5],
 	                     const unsigned char (&bombCurrentLetters)[kBombPasswordMaxLength]);
 	IMG_CB(88004);
diff --git a/engines/cryomni3d/versailles/logic.cpp b/engines/cryomni3d/versailles/logic.cpp
index e46c1a7..952489c 100644
--- a/engines/cryomni3d/versailles/logic.cpp
+++ b/engines/cryomni3d/versailles/logic.cpp
@@ -187,7 +187,7 @@ void CryOmni3DEngine_Versailles::obj_126hk(Graphics::ManagedSurface &surface) {
 	Graphics::Surface bmpLetters[28];
 	loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
 
-	drawEpigraphLetters(surface, bmpLetters, kEpigraphPassword);
+	drawEpigraphLetters(surface, bmpLetters, _epigraphPassword);
 
 	for (uint i = 0; i < 28; i++) {
 		bmpLetters[i].free();
@@ -2361,7 +2361,7 @@ bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
 				continue;
 			}
 			// Find which letter got clicked
-			char letter = kEpigraphContent[fimg->_currentZone];
+			char letter = _epigraphContent[fimg->_currentZone];
 			password += letter;
 			// Reset the surface and redraw digits on it
 			tempSurf.blitFrom(*fimgSurface);
@@ -2379,7 +2379,7 @@ bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
 				}
 				if (keyCode >= Common::KEYCODE_a &&
 				        keyCode <= Common::KEYCODE_z &&
-				        strchr(kEpigraphContent, keyCode - Common::KEYCODE_a + 'A')) {
+				        _epigraphContent.contains(keyCode - Common::KEYCODE_a + 'A')) {
 					password += keyCode - Common::KEYCODE_a + 'A';
 				} else {
 					continue;
@@ -2391,7 +2391,7 @@ bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
 			fimg->updateSurface(&tempSurf.rawSurface());
 		}
 
-		if (password == kEpigraphPassword) {
+		if (password == _epigraphPassword) {
 			success = true;
 			break;
 		}
@@ -2403,9 +2403,6 @@ bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
 	return success;
 }
 
-const char *CryOmni3DEngine_Versailles::kEpigraphContent = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
-const char *CryOmni3DEngine_Versailles::kEpigraphPassword = "LELOUPETLATETE";
-
 void CryOmni3DEngine_Versailles::drawEpigraphLetters(Graphics::ManagedSurface &surface,
         const Graphics::Surface(&bmpLetters)[28], const Common::String &letters) {
 	for (uint i = 0; i < letters.size() && i < kEpigraphMaxLetters; i++) {
@@ -2934,14 +2931,14 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 	unsigned char bombCurrentLetters[60];
 	Graphics::ManagedSurface tempSurf;
 
-	const uint kBombPasswordLength = strlen(kBombPassword);
-	if (kBombPasswordLength >= kBombPasswordMaxLength) {
+	const uint bombPasswordLength = _bombPassword.size();
+	if (bombPasswordLength >= kBombPasswordMaxLength) {
 		error("Bomb password is too long");
 	}
 
 	loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
-	for (uint i = 0; i < kBombPasswordLength; i++) {
-		bombPossibilites[i][0] = toupper(kBombPassword[i]);
+	for (uint i = 0; i < bombPasswordLength; i++) {
+		bombPossibilites[i][0] = toupper(_bombPassword[i]);
 		for (uint j = 1; j < 5; j++) {
 			bool foundSameLetter;
 			do {
@@ -2957,7 +2954,7 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 		bombCurrentLetters[i] = rnd.getRandomNumber(4);
 	}
 
-	if (kBombPasswordLength <= kBombPasswordSmallLength) {
+	if (bombPasswordLength <= kBombPasswordSmallLength) {
 		fimg->load("70z_16.GIF");
 	} else {
 		fimg->load("70z_17.GIF");
@@ -2965,7 +2962,7 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 	const Graphics::Surface *fimgSurface = fimg->surface();
 	tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
 	tempSurf.blitFrom(*fimgSurface);
-	drawBombLetters(tempSurf, bmpLetters, kBombPasswordLength, bombPossibilites, bombCurrentLetters);
+	drawBombLetters(tempSurf, bmpLetters, bombPasswordLength, bombPossibilites, bombCurrentLetters);
 	drawCountdown(&tempSurf);
 	fimg->updateSurface(&tempSurf.rawSurface());
 
@@ -2975,12 +2972,12 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 			break;
 		}
 		if (fimg->_zoneUse) {
-			if (fimg->_currentZone < kBombPasswordLength) {
+			if (fimg->_currentZone < bombPasswordLength) {
 				// Safe digit
 				bombCurrentLetters[fimg->_currentZone] = (bombCurrentLetters[fimg->_currentZone] + 1) % 5;
 				// Reset the surface and redraw letters on it
 				tempSurf.blitFrom(*fimgSurface);
-				drawBombLetters(tempSurf, bmpLetters, kBombPasswordLength, bombPossibilites, bombCurrentLetters);
+				drawBombLetters(tempSurf, bmpLetters, bombPasswordLength, bombPossibilites, bombCurrentLetters);
 				drawCountdown(&tempSurf);
 				fimg->updateSurface(&tempSurf.rawSurface());
 
@@ -2988,9 +2985,9 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 
 				// Check if password is OK
 				success = true;
-				for (uint i = 0; i < kBombPasswordLength; i++) {
+				for (uint i = 0; i < bombPasswordLength; i++) {
 					unsigned char letterChar = bombPossibilites[i][bombCurrentLetters[i]];
-					if (letterChar != kBombPassword[i]) {
+					if (letterChar != _bombPassword[i]) {
 						success = false;
 						break;
 					}
@@ -3013,7 +3010,6 @@ bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
 	return success;
 }
 
-const char *CryOmni3DEngine_Versailles::kBombPassword = "JEMENVAISMAISLETATDEMEURERATOUJOURS";
 const uint16 CryOmni3DEngine_Versailles::kBombLettersPos[2][kBombPasswordMaxLength][2] = {
 	{
 		{26, 91},
@@ -3122,11 +3118,11 @@ const uint16 CryOmni3DEngine_Versailles::kBombLettersPos[2][kBombPasswordMaxLeng
 };
 
 void CryOmni3DEngine_Versailles::drawBombLetters(Graphics::ManagedSurface &surface,
-        const Graphics::Surface(&bmpLetters)[28], const uint kBombPasswordLength,
+        const Graphics::Surface(&bmpLetters)[28], const uint bombPasswordLength,
         const unsigned char (&bombPossibilites)[kBombPasswordMaxLength][5],
         const unsigned char (&bombCurrentLetters)[kBombPasswordMaxLength]) {
-	uint table = kBombPasswordLength <= kBombPasswordSmallLength ? 0 : 1;
-	for (uint i = 0; i < kBombPasswordLength; i++) {
+	uint table = bombPasswordLength <= kBombPasswordSmallLength ? 0 : 1;
+	for (uint i = 0; i < bombPasswordLength; i++) {
 		unsigned char letterChar = bombPossibilites[i][bombCurrentLetters[i]];
 		uint letterId = 0;
 		if (letterChar >= 'A' && letterChar <= 'Z') {
@@ -3232,8 +3228,8 @@ FILTER_EVENT(1, 2) {
 INIT_PLACE(1, 3) {
 	if (!_gameVariables[GameVariables::kHasPlayedLebrun]) {
 		Common::File *audioFile = new Common::File();
-		if (!audioFile->open("LEB001__.WAV")) {
-			warning("Failed to open sound file %s", "LEB001__.WAV");
+		if (!audioFile->open(_localizedFilenames[LocalizedFilenames::kLeb001])) {
+			warning("Failed to open sound file %s", _localizedFilenames[LocalizedFilenames::kLeb001].c_str());
 			delete audioFile;
 			return;
 		}
diff --git a/engines/cryomni3d/versailles/menus.cpp b/engines/cryomni3d/versailles/menus.cpp
index 9e072e8..2459882 100644
--- a/engines/cryomni3d/versailles/menus.cpp
+++ b/engines/cryomni3d/versailles/menus.cpp
@@ -956,8 +956,9 @@ void CryOmni3DEngine_Versailles::displayCredits() {
 	_fontManager.setSurface(&creditsSurface);
 
 	Common::File creditsFile;
-	if (!creditsFile.open("credits.txt")) {
-		warning("Failed to open credits file: %s", "credits.txt");
+	if (!creditsFile.open(_localizedFilenames[LocalizedFilenames::kCredits])) {
+		warning("Failed to open credits file: %s",
+		        _localizedFilenames[LocalizedFilenames::kCredits].c_str());
 		delete imageDecoder;
 		return;
 	}


Commit: 050536b137627abce8ef12e2ff7a74a408f66212
    https://github.com/scummvm/scummvm/commit/050536b137627abce8ef12e2ff7a74a408f66212
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:52:00+02:00

Commit Message:
CRYOMNI3D: Add English version of Versailles

Changed paths:
    devtools/create_cryomni3d/create_cryomni3d_dat.cpp
    devtools/create_cryomni3d/create_cryomni3d_dat.h
    devtools/create_cryomni3d/versailles.cpp
    devtools/create_cryomni3d/versailles.h
    dists/engine-data/cryomni3d.dat
    engines/cryomni3d/datstream.cpp
    engines/cryomni3d/detection_tables.h


diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
index 01262b2..7fbd08f 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
@@ -50,9 +50,11 @@ struct Parts {
     write ## game ## _ ## platform ## _ ## lang ## Data, 0, 0 }
 
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, FR)
+DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, EN)
 
 static Parts gamesParts[] = {
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, FR),
+	GAME_PLATFORM_LANG_PART(Versailles, ALL, EN),
 };
 
 #define CRYOMNI3D_DAT_VER 1 // 32-bit integer
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.h b/devtools/create_cryomni3d/create_cryomni3d_dat.h
index a040ca4..13cc5bb 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.h
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.h
@@ -38,6 +38,7 @@ size_t writeGameHeader(FILE *f, uint32 gameId, uint16 version, uint16 lang, uint
 #define PLATFORM_SATURN               0x10
 #define PLATFORM_ALL            0xffffffff
 
+#define LANG_EN                       MKTAG16('e', 'n')
 #define LANG_FR                       MKTAG16('f', 'r')
 
 #endif
diff --git a/devtools/create_cryomni3d/versailles.cpp b/devtools/create_cryomni3d/versailles.cpp
index edddd7a..e59b0d4 100644
--- a/devtools/create_cryomni3d/versailles.cpp
+++ b/devtools/create_cryomni3d/versailles.cpp
@@ -58,3 +58,4 @@
     }
 
 DEFINE_FUNCS(FR)
+DEFINE_FUNCS(EN)
diff --git a/devtools/create_cryomni3d/versailles.h b/devtools/create_cryomni3d/versailles.h
index e0bd191..4d41c7c 100644
--- a/devtools/create_cryomni3d/versailles.h
+++ b/devtools/create_cryomni3d/versailles.h
@@ -36,11 +36,21 @@ static char const *const versaillesFRlocalizedFilenames[] = {
 	"credits.txt",
 	"LEB001__.WAV",
 };
+static char const *const versaillesENlocalizedFilenames[] = {
+	"DIALOG1.GB",
+	"tous_doc.gb",
+	"lien_doc.txt",
+	"credits.GB",
+	"LEB1_GB.WAV",
+};
 
 static char const versaillesFREpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesFREpilPwd[] = "LELOUPETLATETE";
+static char const versaillesENEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
+static char const versaillesENEpilPwd[] = "FOXANDCRANE";
 
 static char const versaillesFRBombPwd[] = "JEMENVAISMAISLETATDEMEURERATOUJOURS";
+static char const versaillesENBombPwd[] = "IT IS NOT IN THE POWER OF KINGS TO ATTAIN PERFECTION";
 
 #define VERSAILLES_MESSAGES_COUNT 146
 #define VERSAILLES_PAINTINGS_COUNT 48
@@ -264,4 +274,215 @@ static char const *const versaillesFRpaintings[] = {
 	"\"La descente de Croix \"\rCharles Lebrun",                          /* 47: 45260 */
 };
 
+static char const *const versaillesENmessages[] = {
+	"For the moment it is forbidden to open this door.",                  /*   0 */
+	"This door is locked.",                                               /*   1 */
+	"This door is locked.",                                               /*   2 */
+	"This drawer is empty.",                                              /*   3 */
+	"You cannot reach the covering.",                                     /*   4 */
+	"There is nothing in this orange tree.",                              /*   5 */
+	"This is not an orange tree!",                                        /*   6 */
+	"It is too dark. ",                                                   /*   7 */
+	"The casket is locked. ",                                             /*   8 */
+	"You can open the door.",                                             /*   9 */
+	"You will need something to be able to reach the bomb.",              /*  10 */
+	"This vase is empty.",                                                /*  11 */
+	"Now you can go through.",                                            /*  12 */
+	"You have no time to learn about the Court!",                         /*  13 */
+	"It is too late for looking at pictures!",                            /*  14 */
+	"Wait! Give your clues to the usher.",                                /*  15 */
+	"You cannot reach the paper.",                                        /*  16 */
+	"To the apothecary's.",                                               /*  17 */
+	"Warning: You will be able to come to the end of this level, but "
+	"you have not performed all the actions necessary in order to be "
+	"able to continue. You are advised to SAVE this game now.",           /*  18 */
+	"Warning: You will be able to come to the end of this level, but "
+	"you may not have performed all the actions necessary in order to "
+	"be able to continue. You are advised to SAVE this game now.",        /*  19 */
+	"You cannot move about while carrying a ladder!",                     /*  20 */
+	"There is nothing else here.",                                        /*  21 */
+	"Goodbye ...",                                                        /*  22 */
+	"VERSAILLES,",                                                        /*  23 */
+	"A Game of Intrigue at the Court of Louis XIV",                       /*  24 */
+	"Consult the documentation zone",                                     /*  25 */
+	"           Continue this game",                                      /*  26 */
+	"           Start a new game",                                        /*  27 */
+	"           Load a game",                                             /*  28 */
+	"           Save this game",                                          /*  29 */
+	"           Display subtitles: YES",                                  /*  30 */
+	"           Display subtitles: NO",                                   /*  31 */
+	"           Music: YES",                                              /*  32 */
+	"           Music: NO",                                               /*  33 */
+	"           One piece of music to hard disk (20 Mo)",                 /*  34 */
+	"           All music to hard disk (92 Mo)",                          /*  35 */
+	"           No music to hard disk (CD read)",                         /*  36 */
+	nullptr,                                                              /*  37 */
+	nullptr,                                                              /*  38 */
+	"Volume",                                                             /*  39 */
+	"Quit game",                                                          /*  40 */
+	"",                                                                   /*  41 */
+	"Visit the chateau",                                                  /*  42 */
+	"Credits",                                                            /*  43 */
+	"           Continue this visit",                                     /*  44 */
+	"           Save this visit",                                         /*  45 */
+	"           Load a visit",                                            /*  46 */
+	nullptr,                                                              /*  47 */
+	"           Omni3D: standard",                                        /*  48 */
+	"           Omni3D: slow",                                            /*  49 */
+	"           Omni3D: very slow",                                       /*  50 */
+	"           Omni3D: fast",                                            /*  51 */
+	"           Omni3D: very fast",                                       /*  52 */
+	"Confirm",                                                            /*  53 */
+	"Cancel",                                                             /*  54 */
+	"free",                                                               /*  55 */
+	"nameless ",                                                          /*  56 */
+	"Warning: this game is about to be aborted.",                         /*  57 */
+	"Return",                                                             /*  58 */
+	"The Chateau",                                                        /*  59 */
+	"Return to Main Menu",                                                /*  60 */
+	"Summary of Documentation Zone",                                      /*  61 */
+	"Map of Chateau and gardens",                                         /*  62 */
+	"Interior plan of chateau",                                           /*  63 */
+	"Impossible to write to hard disk: disk full",                        /*  64 */
+	nullptr,                                                              /*  65 */
+	"Insert the CD ",                                                     /*  66 */
+	"Insert the %d CD and press any key",                                 /*  67 */
+	"The Arts",                                                           /*  68 */
+	"The Reign",                                                          /*  69 */
+	"The Court",                                                          /*  70 */
+	"Life in the Chateau",                                                /*  71 */
+	"The Chateau and gardens",                                            /*  72 */
+	"Chronology",                                                         /*  73 */
+	"The Apollo Fountain",                                                /*  74 */
+	"The Chateau",                                                        /*  75 */
+	"Colonnade",                                                          /*  76 */
+	"Maze",                                                               /*  77 */
+	"Latona",                                                             /*  78 */
+	"Orangery",                                                           /*  79 */
+	"Water Parterre",                                                     /*  80 */
+	"Tapis vert",                                                         /*  81 */
+	"Grand Stables",                                                      /*  82 */
+	"Small Stables",                                                      /*  83 */
+	"The gardens",                                                        /*  84 */
+	"Forecourt",                                                          /*  85 */
+	"Grand Canal",                                                        /*  86 */
+	"South Parterre",                                                     /*  87 */
+	"North Parterre",                                                     /*  88 */
+	"The King's vegetable garden",                                        /*  89 */
+	"Ballroom",                                                           /*  90 */
+	"The Neptune Fountain",                                               /*  91 */
+	"The Lake of the Swiss Guards",                                       /*  92 */
+	"Aiguilles (Useless!)",                                               /*  93 */
+	"Scissors",                                                           /*  94 */
+	"Paper",                                                              /*  95 */
+	"Pamphlet on the arts",                                               /*  96 */
+	"Small key 1",                                                        /*  97 */
+	"Transformed paper",                                                  /*  98 */
+	"Stained paper",                                                      /*  99 */
+	"Paper from casket",                                                  /* 100 */
+	"Pamphlet on royal lineage",                                          /* 101 */
+	"Lighted candle ",                                                    /* 102 */
+	"Candle",                                                             /* 103 */
+	"Key ",                                                               /* 104 */
+	"Sketch folder",                                                      /* 105 */
+	"Sketch folder",                                                      /* 106 */
+	"Fake sketch",                                                        /* 107 */
+	"Ladder",                                                             /* 108 */
+	"Destroyed sketch",                                                   /* 109 */
+	"brush",                                                              /* 110 */
+	"golden brush",                                                       /* 111 */
+	"red brush",                                                          /* 112 */
+	"Charcoal pencil",                                                    /* 113 */
+	"Paper",                                                              /* 114 */
+	"Pamphlet on architecture",                                           /* 115 */
+	"Small key 2",                                                        /* 116 */
+	"Archer(useless!)",                                                   /* 117 */
+	"Musical score",                                                      /* 118 */
+	"Billiard cue",                                                       /* 119 */
+	"Authorisation",                                                      /* 120 */
+	"Reproduction of medals",                                             /* 121 */
+	"Drawer with medals",                                                 /* 122 */
+	"Key to small Apollo door",                                           /* 123 */
+	"Food",                                                               /* 124 */
+	"Pamphlet on religion",                                               /* 125 */
+	"Epigraph",                                                           /* 126 */
+	"Pamphlet on government",                                             /* 127 */
+	"Quill",                                                              /* 128 */
+	"Memo",                                                               /* 129 */
+	"Telescope",                                                          /* 130 */
+	"Vauban Plan",                                                        /* 131 */
+	"Vauban Plan",                                                        /* 132 */
+	"Cord",                                                               /* 133 */
+	"Engraving",                                                          /* 134 */
+	"Small key 3",                                                        /* 135 */
+	"Small key 4",                                                        /* 136 */
+	"Memorandum",                                                         /* 137 */
+	"Plans of Chateau",                                                   /* 138 */
+	"Plans of Chateau",                                                   /* 139 */
+	"Key to attic",                                                       /* 140 */
+	"Fables",                                                             /* 141 */
+	"Plan of Maze",                                                       /* 142 */
+	"Tool",                                                               /* 143 */
+	"Medicine",                                                           /* 144 */
+	"Candle snuffer",                                                     /* 145 */
+};
+
+static char const *const versaillesENpaintings[] = {
+	"\"The Animals entering the Ark\"\rGerolamo Bassano",                 /*  0: 41201 */
+	"\"The Supper at Emmaus\"\rJacopo Bassano",                           /*  1: 41202 */
+	"\"Mary Magdalen at the feet of the Christ",                          /*  2: 41203 */
+	"\"Leaving the Ark\"\rGerolamo Bassano",                              /*  3: 41204 */
+	"\"Striking the Rock\"\rJacopo Bassano",                              /*  4: 41205 */
+	"\"The Battle of Arbelles\"\rJoseph Parrocel",                        /*  5: 41301 */
+	"\"Alexander the Great, Vanquisher of Darisu at the battle of "
+	"Arbelles\"\rLe Bourguignon",                                         /*  6: 41302 */
+	"\"The Combat of Leuze\"\rJoseph Parrocel",                           /*  7: 42401 */
+	"\"Saint Cecilia with an angel holding musical notation\"\rIl "
+	"Domenichino",                                                        /*  8: 42901 */
+	"\"Don Francisco of Moncada\"\rVan Dyck",                             /*  9: 42902 */
+	"\"The young John the Baptist\"\rCarracci",                           /* 10: 42903 */
+	"\"Saint Matthew\"\rValentin",                                        /* 11: 42904 */
+	"\"Render unto Caesar\"\rValentin",                                   /* 12: 42905 */
+	"\"Saint Luke\"\rValentin",                                           /* 13: 42906 */
+	"\"The Mystical Marriage of Saint Catherine\"\r Alessandro Turchi",   /* 14: 42907 */
+	"\"The Meeting of the Drinkers\"\rNicolas Tournier",                  /* 15: 42908 */
+	"\"The Fortune-teller\"\rValentin",                                   /* 16: 42909 */
+	"\"King David playing the Harp\"\rIl Domenichino",                    /* 17: 42910 */
+	"\"Mary Magdalen\"\rIl Domenichino",                                  /* 18: 42911 */
+	"\"Self-portrait\"\rVan Dyck",                                        /* 19: 42912 */
+	"\"Saint John the Evangelist\"\r Valentin",                           /* 20: 42913 */
+	"\"Hagar being helped by an angel\"\rGiovanni Lanfranco",             /* 21: 42914 */
+	"\"Saint Mark\"\rValentin",                                           /* 22: 42915 */
+	"\"Meleager with the head of the boar of Calydon at his "
+	"feet\"\rJacques Rousseau",                                           /* 23: 43090 */ /* BUG: Switched */
+	"\"The King in Roman dress\"\rJean Warin",                            /* 24: 43091 */
+	"\"Atalanta\"\rJacques Rousseau",                                     /* 25: 43092 */
+	"\"Aeneas carrying Anchises\"\rSpada",                                /* 26: 43100 */
+	"\"David and Bethsheba\"\rVeronese",                                  /* 27: 43101 */
+	"\"The Flight into Egypt\"\rGuido Reni",                              /* 28: 43102 */
+	"\"Louis XIV on horseback\"\rPierre Mignard",                         /* 29: 43103 */
+	"\"Royal Magnificence and the Progress of the Beaux "
+	"Arts\"\rHouasse",                                                    /* 30: 43104 */
+	"\"The Sacrifice of Iphigeneia\"\rCharles de La Fosse",               /* 31: 43130 */
+	"\"Bust of Louis XIV\"\rsculpted by Bernini",                         /* 32: 43131 */
+	"\"Diana  discovers Endymion in the arms of Morpheus\"\rGabriel "
+	"Blanchard",                                                          /* 33: 43132 */
+	"\"Saint Peter and the Virgin Mary\"\rIl Guercino",                   /* 34: 43140 */
+	"\"The Disciples at Emmaus\"\rVeronese",                              /* 35: 43141 */
+	"\"The Holy Family\"\rVeronese",                                      /* 36: 43142 */
+	"\"Darius' family at the feet of Alexander\"\rCharles LeBrun",        /* 37: 43143 */
+	"\"Saint John the Baptist\"\rRaphael",                                /* 38: 43144 */
+	"\"Marie de Medici\"\rVan Dyck",                                      /* 39: 43150 */
+	"\"Hercules struggling with Achelous\"\rGuido Reni",                  /* 40: 43151 */
+	"\"The Centaur Nessus carrying away Deianeira\"\rGuido Reni",         /* 41: 43152 */
+	"\"Saint Francis of Assissi comforted after receiving the "
+	"stigmata\"\rSeghers",                                                /* 42: 43153 */
+	"\"Thomiris plunging Cyrus' head in blood\"\rRubens",                 /* 43: 43154 */
+	"\"Hercules Slaying the Hydra\"\rGuido Reni",                         /* 44: 43155 */
+	"\"Hercules in flames \"\rGuido Reni",                                /* 45: 43156 */
+	"\"Portrait of the Prince Palatine & his brother Prince "
+	"Robert\"\rVan Dyck",                                                 /* 46: 43157 */
+	"\"Christ being taken down from the cross\"\rCharles Lebrun",         /* 47: 45260 */
+};
+
 #endif
diff --git a/dists/engine-data/cryomni3d.dat b/dists/engine-data/cryomni3d.dat
index a4a0beb..bf1e60e 100644
Binary files a/dists/engine-data/cryomni3d.dat and b/dists/engine-data/cryomni3d.dat differ
diff --git a/engines/cryomni3d/datstream.cpp b/engines/cryomni3d/datstream.cpp
index 461146f..1ee8069 100644
--- a/engines/cryomni3d/datstream.cpp
+++ b/engines/cryomni3d/datstream.cpp
@@ -117,6 +117,8 @@ void DATSeekableStream::readString16Array16(Common::StringArray &array) {
 
 uint16 DATSeekableStream::translateLanguage(Common::Language lang) {
 	switch (lang) {
+	case Common::EN_ANY:
+		return MKTAG16('e', 'n');
 	case Common::FR_FRA:
 		return MKTAG16('f', 'r');
 	default:
diff --git a/engines/cryomni3d/detection_tables.h b/engines/cryomni3d/detection_tables.h
index 7593234..f75ae14 100644
--- a/engines/cryomni3d/detection_tables.h
+++ b/engines/cryomni3d/detection_tables.h
@@ -93,6 +93,57 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 		GF_VERSAILLES_AUDIOPADDING,
 	},
 
+	// Versailles 1685
+	// English Windows from Mac/Win hybrid CD
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("Versaill.exe", "5c3c10ec821b8d96016041ab649af8c7", 377856),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_NUMERICFONTS,
+	},
+
+	// Versailles 1685
+	// English Macintosh from Mac/Win hybrid CD
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("Versailles", "7fa3cb6a3c18f6b4ba6be85dcd433cff", 366199),
+			Common::EN_ANY,
+			Common::kPlatformMacintosh,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_NUMERICFONTS,
+	},
+
+	// Versailles 1685
+	// English DOS
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("VERSAILL.PGM", "1c992f034f43418a5da2e8ebd0b92620", 598639),
+			Common::EN_ANY,
+			Common::kPlatformDOS,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_AUDIOPADDING,
+	},
+
 	{ AD_TABLE_END_MARKER, 0, 0 }
 };
 


Commit: 215e2139fcce276dcb989a11fccbe21e45b5aed8
    https://github.com/scummvm/scummvm/commit/215e2139fcce276dcb989a11fccbe21e45b5aed8
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:52:00+02:00

Commit Message:
CRYOMNI3D: Add Italian version of Versailles

Changed paths:
    devtools/create_cryomni3d/create_cryomni3d_dat.cpp
    devtools/create_cryomni3d/create_cryomni3d_dat.h
    devtools/create_cryomni3d/versailles.cpp
    devtools/create_cryomni3d/versailles.h
    dists/engine-data/cryomni3d.dat
    engines/cryomni3d/datstream.cpp
    engines/cryomni3d/detection_tables.h


diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
index 7fbd08f..484634e 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
@@ -51,10 +51,12 @@ struct Parts {
 
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, FR)
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, EN)
+DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, IT)
 
 static Parts gamesParts[] = {
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, FR),
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, EN),
+	GAME_PLATFORM_LANG_PART(Versailles, ALL, IT),
 };
 
 #define CRYOMNI3D_DAT_VER 1 // 32-bit integer
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.h b/devtools/create_cryomni3d/create_cryomni3d_dat.h
index 13cc5bb..e58e128 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.h
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.h
@@ -40,5 +40,6 @@ size_t writeGameHeader(FILE *f, uint32 gameId, uint16 version, uint16 lang, uint
 
 #define LANG_EN                       MKTAG16('e', 'n')
 #define LANG_FR                       MKTAG16('f', 'r')
+#define LANG_IT                       MKTAG16('i', 't')
 
 #endif
diff --git a/devtools/create_cryomni3d/versailles.cpp b/devtools/create_cryomni3d/versailles.cpp
index e59b0d4..1ef3db0 100644
--- a/devtools/create_cryomni3d/versailles.cpp
+++ b/devtools/create_cryomni3d/versailles.cpp
@@ -59,3 +59,4 @@
 
 DEFINE_FUNCS(FR)
 DEFINE_FUNCS(EN)
+DEFINE_FUNCS(IT)
diff --git a/devtools/create_cryomni3d/versailles.h b/devtools/create_cryomni3d/versailles.h
index 4d41c7c..b7f6407 100644
--- a/devtools/create_cryomni3d/versailles.h
+++ b/devtools/create_cryomni3d/versailles.h
@@ -43,14 +43,24 @@ static char const *const versaillesENlocalizedFilenames[] = {
 	"credits.GB",
 	"LEB1_GB.WAV",
 };
+static char const *const versaillesITlocalizedFilenames[] = {
+	"DIALOG1.ITA",
+	"tous_doc.ita",
+	"lien_doc.txt",
+	"credits.ita",
+	"LEB1_IT.WAV",
+};
 
 static char const versaillesFREpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesFREpilPwd[] = "LELOUPETLATETE";
 static char const versaillesENEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesENEpilPwd[] = "FOXANDCRANE";
+static char const versaillesITEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
+static char const versaillesITEpilPwd[] = "LEANATREEILCANE";
 
 static char const versaillesFRBombPwd[] = "JEMENVAISMAISLETATDEMEURERATOUJOURS";
 static char const versaillesENBombPwd[] = "IT IS NOT IN THE POWER OF KINGS TO ATTAIN PERFECTION";
+static char const versaillesITBombPwd[] = "AI SOVRANI NON E DATO RAGGIUNGERE LA PERFEZIONE";
 
 #define VERSAILLES_MESSAGES_COUNT 146
 #define VERSAILLES_PAINTINGS_COUNT 48
@@ -485,4 +495,214 @@ static char const *const versaillesENpaintings[] = {
 	"\"Christ being taken down from the cross\"\rCharles Lebrun",         /* 47: 45260 */
 };
 
+static char const *const versaillesITmessages[] = {
+	"Per ora " "\x8f" " vietato aprire questa porta.",                    /*   0 */
+	"Questa porta " "\x8f" " chiusa a chiave.",                           /*   1 */
+	"Questa porta " "\x8f" " chiusa.",                                    /*   2 */
+	"Questo cassetto " "\x8f" " vuoto.",                                  /*   3 */
+	"Non puoi raggiungere il" "\xca" "rivestimento.",                     /*   4 */
+	"Non c" "\xd5\x8f" " niente in questo arancio.",                      /*   5 */
+	"Questo non " "\x8f" " un arancio!",                                  /*   6 */
+	"\xe9" " troppo buio. ",                                              /*   7 */
+	"Lo scrigno " "\x8f" " chiuso. ",                                     /*   8 */
+	"Puoi aprire la porta.",                                              /*   9 */
+	"Avrai bisogno di qualcosa per poter raggiungere la bomba.",          /*  10 */
+	"Questo vaso " "\x8f" " vuoto.",                                      /*  11 */
+	"Ora ci puoi passare.",                                               /*  12 */
+	"Non hai tempo per studiare la Corte!",                               /*  13 */
+	"\xe9" " troppo tardi per guardare i quadri!",                        /*  14 */
+	"Aspetta! Dai al messo i tuoi indizi.",                               /*  15 */
+	"Non puoi raggiungere il foglio.",                                    /*  16 */
+	"Alla farmacia.",                                                     /*  17 */
+	"Attenzione: sarai in grado di raggiungere la fine di questo "
+	"livello, ma non hai eseguito tutte le azioni necessarie per poter "
+	"continuare. Ti consigliamo di SALVARE la partita ora.",              /*  18 */
+	"Attenzione: sarai in grado di raggiungere la fine di questo "
+	"livello, ma potresti non aver eseguito tutte le azioni necessarie "
+	"per poter continuare. Ti consigliamo di SALVARE la partita ora.",    /*  19 */
+	"Non puoi muoverti mentre trasporti una scala!",                      /*  20 */
+	"Non c" "\xd5\x8f" " nient" "\xd5" "altro qui.",                      /*  21 */
+	"Arrivederci...",                                                     /*  22 */
+	"VERSAILLES,",                                                        /*  23 */
+	"Complotto alla Corte del Re Sole",                                   /*  24 */
+	"Consulta lo spazio documentativo",                                   /*  25 */
+	"           Continua questa partita ",                                /*  26 */
+	"           Avvia una nuova partita",                                 /*  27 */
+	"           Carica una partita ",                                     /*  28 */
+	"           Salva questa partita ",                                   /*  29 */
+	"           Mostra sottotitoli: S" "\xea",                            /*  30 */
+	"           Mostra sottotitoli: NO",                                  /*  31 */
+	"           Musica: S" "\xea",                                        /*  32 */
+	"           Musica: NO",                                              /*  33 */
+	"           Un brano musicale sul disco fisso (20 Mb)",               /*  34 */
+	"           Tutta la musica sul disco fisso (92 Mb)",                 /*  35 */
+	"           Nessuna musica sul disco fisso (lettore CD)",             /*  36 */
+	nullptr,                                                              /*  37 */
+	nullptr,                                                              /*  38 */
+	"Volume",                                                             /*  39 */
+	"Esci dal gioco",                                                     /*  40 */
+	"",                                                                   /*  41 */
+	"Visita il castello",                                                 /*  42 */
+	"Riconoscimenti",                                                     /*  43 */
+	"           Continua questa visita ",                                 /*  44 */
+	"           Salva questa visita ",                                    /*  45 */
+	"           Carica una visita ",                                      /*  46 */
+	nullptr,                                                              /*  47 */
+	"           Omni3D: standard",                                        /*  48 */
+	"           Omni3D: lento",                                           /*  49 */
+	"           Omni3D: molto lento",                                     /*  50 */
+	"           Omni3D: veloce",                                          /*  51 */
+	"           Omni3D: molto veloce",                                    /*  52 */
+	"Conferma",                                                           /*  53 */
+	"Annulla",                                                            /*  54 */
+	"libero",                                                             /*  55 */
+	"senza nome ",                                                        /*  56 */
+	"Attenzione: questa partita sta per essere annullata.",               /*  57 */
+	"Ritorno",                                                            /*  58 */
+	"Il Castello",                                                        /*  59 */
+	"Ritorna al Men" "\x9d" " Principale",                                /*  60 */
+	"Sommario dello spazio documentativo",                                /*  61 */
+	"Mappa del Castello e dei giardini",                                  /*  62 */
+	"Cartina interna del castello",                                       /*  63 */
+	"Impossibile scrivere sul disco fisso: disco pieno",                  /*  64 */
+	nullptr,                                                              /*  65 */
+	"Inserisci il CD ",                                                   /*  66 */
+	"Inserisci il CD %d e premi un tasto",                                /*  67 */
+	"Le Arti",                                                            /*  68 */
+	"Il Regno",                                                           /*  69 */
+	"La Corte",                                                           /*  70 */
+	"La vita nel Castello",                                               /*  71 */
+	"Il Castello e i giardini",                                           /*  72 */
+	"Cronologia",                                                         /*  73 */
+	"La fontana di Apollo",                                               /*  74 */
+	"Il castello",                                                        /*  75 */
+	"Il colonnato",                                                       /*  76 */
+	"Il labirinto",                                                       /*  77 */
+	"Latona",                                                             /*  78 */
+	"L" "\xd5" "aranceto",                                                /*  79 */
+	"Parterre d" "\xd5" "acqua",                                          /*  80 */
+	"Tapis vert",                                                         /*  81 */
+	"Grande scuderia",                                                    /*  82 */
+	"Piccola scuderia",                                                   /*  83 */
+	"I giardini",                                                         /*  84 */
+	"Corte esterna",                                                      /*  85 */
+	"Gran Canale",                                                        /*  86 */
+	"Parterre di sud",                                                    /*  87 */
+	"Parterre di nord",                                                   /*  88 */
+	"L" "\xd5" "orto del Re",                                             /*  89 */
+	"La sala da ballo",                                                   /*  90 */
+	"La fontana di Nettuno",                                              /*  91 */
+	"Il lago delle guardie svizzere",                                     /*  92 */
+	"Aiguilles (Inutile!)",                                               /*  93 */
+	"Forbici",                                                            /*  94 */
+	"Documento",                                                          /*  95 */
+	"Libello delle arti",                                                 /*  96 */
+	"Piccola chiave 1",                                                   /*  97 */
+	"Documento trasformato",                                              /*  98 */
+	"Documento macchiato",                                                /*  99 */
+	"Documento dello scrigno",                                            /* 100 */
+	"Libello sulla discendenza reale",                                    /* 101 */
+	"Candela accesa ",                                                    /* 102 */
+	"Candela",                                                            /* 103 */
+	"Chiave ",                                                            /* 104 */
+	"Cartella dei disegni ",                                              /* 105 */
+	"Cartella dei disegni",                                               /* 106 */
+	"Disegno falso",                                                      /* 107 */
+	"Scala",                                                              /* 108 */
+	"Disegno distrutto",                                                  /* 109 */
+	"pennello",                                                           /* 110 */
+	"pennello d" "\xd5" "oro",                                            /* 111 */
+	"pennello rosso",                                                     /* 112 */
+	"Carboncino",                                                         /* 113 */
+	"Carta",                                                              /* 114 */
+	"Libello sull" "\xd5" "architettura",                                 /* 115 */
+	"Piccola chiave 2",                                                   /* 116 */
+	"Archer (inutile!)",                                                  /* 117 */
+	"Partitura",                                                          /* 118 */
+	"Stecca da biliardo",                                                 /* 119 */
+	"Autorizzazione",                                                     /* 120 */
+	"Riproduzione delle medaglie",                                        /* 121 */
+	"Disegnatore con medaglie",                                           /* 122 */
+	"Chiave per la porta di Apollo",                                      /* 123 */
+	"Cibo",                                                               /* 124 */
+	"Libello sulla religione",                                            /* 125 */
+	"Epigrafe",                                                           /* 126 */
+	"Libello sul governo",                                                /* 127 */
+	"Penna d" "\xd5" "oca",                                               /* 128 */
+	"Appunto",                                                            /* 129 */
+	"Telescopio",                                                         /* 130 */
+	"Progetto di Vauban",                                                 /* 131 */
+	"Progetto di Vauban",                                                 /* 132 */
+	"Corda",                                                              /* 133 */
+	"Incisione",                                                          /* 134 */
+	"Piccola chiave 3",                                                   /* 135 */
+	"Piccola chiave 4",                                                   /* 136 */
+	"Memorandum",                                                         /* 137 */
+	"Progetti del castello",                                              /* 138 */
+	"Progetti del castello",                                              /* 139 */
+	"Chiave dell" "\xd5" "attico",                                        /* 140 */
+	"Favole",                                                             /* 141 */
+	"Progetto del labirinto",                                             /* 142 */
+	"Attrezzo",                                                           /* 143 */
+	"Medicina",                                                           /* 144 */
+	"Smoccolatoio",                                                       /* 145 */
+};
+
+static char const *const versaillesITpaintings[] = {
+	"\"Entrata degli animali nell'arca\"\rGerolamo Bassano",              /*  0: 41201 */
+	"\"La cena di Emmaus\"\rJacopo Bassano",                              /*  1: 41202 */
+	"\"La Maddalena ai piedi del Cristo\"",                               /*  2: 41203 */
+	"\"Uscita dall'arca\"\rGerolamo Bassano",                             /*  3: 41204 */
+	"\"Scalfittura della roccia\"\rJacopo Bassano",                       /*  4: 41205 */
+	"\"La battaglia di Arbelles\"\rJoseph Parrocel",                      /*  5: 41301 */
+	"\"Alessandro il Grande, vincitore di Dario nella battaglia "
+	"Arbelles\"\rLe Bourguignon",                                         /*  6: 41302 */
+	"\"Il combattimento di Leuze\"\rJoseph Parrocel",                     /*  7: 42401 */
+	"\"Santa Cecilia con un angelo che tiene una partitura "
+	"musicale\"\rIl Domenichino",                                         /*  8: 42901 */
+	"\"Don Francisco di Moncada\"\rVan Dyck",                             /*  9: 42902 */
+	"\"Il giovane santo Giovanni il Battista\"\rCarracci",                /* 10: 42903 */
+	"\"San Matteo\"\rValentin",                                           /* 11: 42904 */
+	"\"Il rifiuto di Cesare\"\rValentin",                                 /* 12: 42905 */
+	"\"San Luca\"\rValentin",                                             /* 13: 42906 */
+	"\"Il matrimonio mistico di Santa Caterina\"\r Alessandro Turchi",    /* 14: 42907 */
+	"\"Convivio di bevitori\"\rNicolas Tournier",                         /* 15: 42908 */
+	"\"L'indovina\"\rValentin",                                           /* 16: 42909 */
+	"\"Re Davide che suona l'arpa\"\rIl Domenichino",                     /* 17: 42910 */
+	"\"Maria Maddalena\"\rIl Domenichino",                                /* 18: 42911 */
+	"\"Autoritratto\"\rVan Dyck",                                         /* 19: 42912 */
+	"\"San Giovanni l'Evangelista\"\r Valentin",                          /* 20: 42913 */
+	"\"Agar soccorso da un angelo\"\rGiovanni Lanfranco",                 /* 21: 42914 */
+	"\"San Marco\"\rValentin",                                            /* 22: 42915 */
+	"\"Meleagro con la testa del cinghiale di Calidone ai suoi "
+	"piedi\"\r Jacques Rousseau",                                         /* 23: 43090 */
+	"\"Il Re in abito romano\"\rJean Warin",                              /* 24: 43091 */
+	"\"Atalanta\"\rJacques Rousseau",                                     /* 25: 43092 */
+	"\"Enea che porta Anchise\"\rSpada",                                  /* 26: 43100 */
+	"\"Davide e Betsabea\"\rVeronese",                                    /* 27: 43101 */
+	"\"La fuga in Egitto\"\rGuido Reni",                                  /* 28: 43102 */
+	"\"Luigi XIV a cavallo\"\rPierre Mignard",                            /* 29: 43103 */
+	"\"La magnificenza reale e i progressi delle Belle Arti\"\rHouasse",  /* 30: 43104 */
+	"\"Il sacrificio di Ifigenia\"\rCharles de La Fosse",                 /* 31: 43130 */
+	"\"Busto di Luigi XIV\"\rsculpted by Bernini",                        /* 32: 43131 */
+	"\"Diana scopre il pastore Endimione assopito tra le braccia di "
+	"Morfeo\"\rGabriel Blanchard",                                        /* 33: 43132 */
+	"\"San Pietro e la Vergine Maria\"\rIl Guercino",                     /* 34: 43140 */
+	"\"I pellegrini di Emmaus\"\rVeronese",                               /* 35: 43141 */
+	"\"La Sacra Famiglia\"\rVeronese",                                    /* 36: 43142 */
+	"\"La famiglia di Dario ai piedi di Alessandro\"\rCharles LeBrun",    /* 37: 43143 */
+	"\"San Giovanni il Battista\"\rRaphael",                              /* 38: 43144 */
+	"\"Maria de' Medici\"\rVan Dyck",                                     /* 39: 43150 */
+	"\"Ercole in lotta con Achel" "\x98" "o\"\rGuido Reni",               /* 40: 43151 */
+	"\"Il Centauro Nesso che porta Deianira\"\rGuido Reni",               /* 41: 43152 */
+	"\"San Francesco d'Assisi confortato dopo aver ricevuto le "
+	"stimmate\"\rSeghers",                                                /* 42: 43153 */
+	"\"Thomiris che immerge la testa di Ciro nel sangue\"\rRubens",       /* 43: 43154 */
+	"\"Ercole che uccide l'Idra\"\rGuido Reni",                           /* 44: 43155 */
+	"\"Ercole sul rogo " "\xd2" " \rGuido Reni",                          /* 45: 43156 */
+	"\"Ritratto del Principe Palatine e di suo fratello il Principe "
+	"Robert\"\rVan Dyck",                                                 /* 46: 43157 */
+	"\"Cristo calato dalla Croce\"\rCharles Lebrun",                      /* 47: 45260 */
+};
+
 #endif
diff --git a/dists/engine-data/cryomni3d.dat b/dists/engine-data/cryomni3d.dat
index bf1e60e..fdcb8fb 100644
Binary files a/dists/engine-data/cryomni3d.dat and b/dists/engine-data/cryomni3d.dat differ
diff --git a/engines/cryomni3d/datstream.cpp b/engines/cryomni3d/datstream.cpp
index 1ee8069..b8af327 100644
--- a/engines/cryomni3d/datstream.cpp
+++ b/engines/cryomni3d/datstream.cpp
@@ -121,6 +121,8 @@ uint16 DATSeekableStream::translateLanguage(Common::Language lang) {
 		return MKTAG16('e', 'n');
 	case Common::FR_FRA:
 		return MKTAG16('f', 'r');
+	case Common::IT_ITA:
+		return MKTAG16('i', 't');
 	default:
 		// Invalid language
 		return 0;
diff --git a/engines/cryomni3d/detection_tables.h b/engines/cryomni3d/detection_tables.h
index f75ae14..0ece04d 100644
--- a/engines/cryomni3d/detection_tables.h
+++ b/engines/cryomni3d/detection_tables.h
@@ -144,6 +144,23 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 		GF_VERSAILLES_AUDIOPADDING,
 	},
 
+	// Versailles 1685
+	// Italian DOS
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("VERSAILL.PGM", "1c992f034f43418a5da2e8ebd0b92620", 603023),
+			Common::IT_ITA,
+			Common::kPlatformDOS,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_AUDIOPADDING,
+	},
+
 	{ AD_TABLE_END_MARKER, 0, 0 }
 };
 


Commit: 95d1f30bd7f4dc5394f0e718c791b21bc431fc65
    https://github.com/scummvm/scummvm/commit/95d1f30bd7f4dc5394f0e718c791b21bc431fc65
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:52:00+02:00

Commit Message:
CRYOMNI3D: Add a timeout for displayHLZ

Changed paths:
    engines/cryomni3d/cryomni3d.cpp
    engines/cryomni3d/cryomni3d.h


diff --git a/engines/cryomni3d/cryomni3d.cpp b/engines/cryomni3d/cryomni3d.cpp
index 35a4cce..452d6b7 100644
--- a/engines/cryomni3d/cryomni3d.cpp
+++ b/engines/cryomni3d/cryomni3d.cpp
@@ -213,11 +213,11 @@ Image::ImageDecoder *CryOmni3DEngine::loadHLZ(const Common::String &filename) {
 	return imageDecoder;
 }
 
-void CryOmni3DEngine::displayHLZ(const Common::String &filename) {
+bool CryOmni3DEngine::displayHLZ(const Common::String &filename, uint32 timeout) {
 	Image::ImageDecoder *imageDecoder = loadHLZ(filename);
 
 	if (!imageDecoder) {
-		return;
+		return false;
 	}
 
 	if (imageDecoder->hasPalette()) {
@@ -229,10 +229,16 @@ void CryOmni3DEngine::displayHLZ(const Common::String &filename) {
 	g_system->copyRectToScreen(frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h);
 	g_system->updateScreen();
 
+	uint32 end;
+	if (timeout == uint(-1)) {
+		end = uint(-1);
+	} else {
+		end = g_system->getMillis() + timeout;
+	}
 	bool exitImg = false;
-	while (!shouldAbort() && !exitImg) {
+	while (!shouldAbort() && !exitImg && g_system->getMillis() < end) {
 		if (pollEvents()) {
-			if (checkKeysPressed(1, Common::KEYCODE_ESCAPE) || getCurrentMouseButton() == 1) {
+			if (checkKeysPressed() || getCurrentMouseButton() == 1) {
 				exitImg = true;
 			}
 		}
@@ -241,6 +247,8 @@ void CryOmni3DEngine::displayHLZ(const Common::String &filename) {
 	}
 
 	delete imageDecoder;
+
+	return exitImg || shouldAbort();
 }
 
 void CryOmni3DEngine::setCursor(const Graphics::Cursor &cursor) const {
diff --git a/engines/cryomni3d/cryomni3d.h b/engines/cryomni3d/cryomni3d.h
index 86803a1..fa60cdb 100644
--- a/engines/cryomni3d/cryomni3d.h
+++ b/engines/cryomni3d/cryomni3d.h
@@ -126,7 +126,7 @@ public:
 	void playHNM(const Common::String &filename,
 	             Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType,
 	             HNMCallback beforeDraw = nullptr, HNMCallback afterDraw = nullptr);
-	void displayHLZ(const Common::String &filename);
+	bool displayHLZ(const Common::String &filename, uint32 timeout = uint(-1));
 
 	bool pollEvents();
 	Common::Point getMousePos();


Commit: d46988491d49f4fdfeb4662a9e5be245afac9008
    https://github.com/scummvm/scummvm/commit/d46988491d49f4fdfeb4662a9e5be245afac9008
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:52:00+02:00

Commit Message:
CRYOMNI3D: Add German version of Versailles

Changed paths:
    devtools/create_cryomni3d/create_cryomni3d_dat.cpp
    devtools/create_cryomni3d/create_cryomni3d_dat.h
    devtools/create_cryomni3d/versailles.cpp
    devtools/create_cryomni3d/versailles.h
    dists/engine-data/cryomni3d.dat
    engines/cryomni3d/datstream.cpp
    engines/cryomni3d/detection_tables.h
    engines/cryomni3d/versailles/engine.cpp


diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
index 484634e..741d76f 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
@@ -50,11 +50,13 @@ struct Parts {
     write ## game ## _ ## platform ## _ ## lang ## Data, 0, 0 }
 
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, FR)
+DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, DE)
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, EN)
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, IT)
 
 static Parts gamesParts[] = {
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, FR),
+	GAME_PLATFORM_LANG_PART(Versailles, ALL, DE),
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, EN),
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, IT),
 };
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.h b/devtools/create_cryomni3d/create_cryomni3d_dat.h
index e58e128..8f8aeb8 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.h
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.h
@@ -38,6 +38,7 @@ size_t writeGameHeader(FILE *f, uint32 gameId, uint16 version, uint16 lang, uint
 #define PLATFORM_SATURN               0x10
 #define PLATFORM_ALL            0xffffffff
 
+#define LANG_DE                       MKTAG16('d', 'e')
 #define LANG_EN                       MKTAG16('e', 'n')
 #define LANG_FR                       MKTAG16('f', 'r')
 #define LANG_IT                       MKTAG16('i', 't')
diff --git a/devtools/create_cryomni3d/versailles.cpp b/devtools/create_cryomni3d/versailles.cpp
index 1ef3db0..46d276d 100644
--- a/devtools/create_cryomni3d/versailles.cpp
+++ b/devtools/create_cryomni3d/versailles.cpp
@@ -58,5 +58,6 @@
     }
 
 DEFINE_FUNCS(FR)
+DEFINE_FUNCS(DE)
 DEFINE_FUNCS(EN)
 DEFINE_FUNCS(IT)
diff --git a/devtools/create_cryomni3d/versailles.h b/devtools/create_cryomni3d/versailles.h
index b7f6407..8dc58fd 100644
--- a/devtools/create_cryomni3d/versailles.h
+++ b/devtools/create_cryomni3d/versailles.h
@@ -36,6 +36,13 @@ static char const *const versaillesFRlocalizedFilenames[] = {
 	"credits.txt",
 	"LEB001__.WAV",
 };
+static char const *const versaillesDElocalizedFilenames[] = {
+	"DIALOG1.ALM",
+	"tous_doc.ALM",
+	"lien_doc.alm",
+	"credits.ALM",
+	"LEB1_ALM.WAV",
+};
 static char const *const versaillesENlocalizedFilenames[] = {
 	"DIALOG1.GB",
 	"tous_doc.gb",
@@ -53,12 +60,16 @@ static char const *const versaillesITlocalizedFilenames[] = {
 
 static char const versaillesFREpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesFREpilPwd[] = "LELOUPETLATETE";
+static char const versaillesDEEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
+static char const versaillesDEEpilPwd[] = "DIEENTENUNDDERPUDEL";
 static char const versaillesENEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesENEpilPwd[] = "FOXANDCRANE";
 static char const versaillesITEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesITEpilPwd[] = "LEANATREEILCANE";
 
 static char const versaillesFRBombPwd[] = "JEMENVAISMAISLETATDEMEURERATOUJOURS";
+static char const versaillesDEBombPwd[] =
+    "MONARCHEN IST ES NICHT GEGEBEN VOLLKOMMENHEIT ZU ERREICHEN";
 static char const versaillesENBombPwd[] = "IT IS NOT IN THE POWER OF KINGS TO ATTAIN PERFECTION";
 static char const versaillesITBombPwd[] = "AI SOVRANI NON E DATO RAGGIUNGERE LA PERFEZIONE";
 
@@ -284,6 +295,225 @@ static char const *const versaillesFRpaintings[] = {
 	"\"La descente de Croix \"\rCharles Lebrun",                          /* 47: 45260 */
 };
 
+static char const *const versaillesDEmessages[] = {
+	"Das " "\x85" "ffnen dieser T" "\x9f" "r ist zur Zeit nicht "
+	"gestattet.",                                                         /*   0 */
+	"Diese T" "\x9f" "r ist verschlossen.",                               /*   1 */
+	"Diese T" "\x9f" "r ist zu.",                                         /*   2 */
+	"Diese Schublade ist leer.",                                          /*   3 */
+	"Sie k" "\x9a" "nnen die Plane nicht erreichen.",                     /*   4 */
+	"In diesem Orangenbaum ist nichts zu finden.",                        /*   5 */
+	"Dies hier ist kein Orangenbaum.",                                    /*   6 */
+	"Es ist zu dunkel.",                                                  /*   7 */
+	"Die Kiste ist verschlossen.",                                        /*   8 */
+	"Sie k" "\x9a" "nnen diese T" "\x9f" "r " "\x9a" "ffnen.",            /*   9 */
+	"Sie ben" "\x9a" "tigen etwas, um die Bombe zu erreichen.",           /*  10 */
+	"Diese Vase ist leer.",                                               /*  11 */
+	"Jetzt k" "\x9a" "nnen Sie gehen.",                                   /*  12 */
+	"Sie haben keine Zeit mehr, sich " "\x9f" "ber den Hof zu "
+	"informieren!",                                                       /*  13 */
+	"Es ist zu sp" "\x8a" "t, um sich die Bilder anzusehen.",             /*  14 */
+	"Warten Sie! Geben Sie Ihre Hinweise doch an den Diener weiter.",     /*  15 */
+	"Sie k" "\x9a" "nnen das Papier nicht erreichen.",                    /*  16 */
+	"Zur Apotheke",                                                       /*  17 */
+	"Vorsicht! Sie k" "\x9a" "nnen dieses Level beenden, aber Sie "
+	"haben noch nicht alle notwendigen Informationen, um "
+	"weiterzukommen. Es empfiehlt sich, Ihr Spiel jetzt zu SPEICHERN.",   /*  18 */
+	"Vorsicht! Sie k" "\x9a" "nnen dieses Level beenden, aber Sie "
+	"haben vielleicht noch nicht alle notwendigen Informationen, um "
+	"weiterzukommen. Es empfiehlt sich, Ihr Spiel jetzt zu SPEICHERN.",   /*  19 */
+	"Sie k" "\x9a" "nnen sich nicht von der Stelle bewegen, wenn Sie "
+	"eine Leiter tragen!",                                                /*  20 */
+	"Hier ist nichts mehr zu tun.",                                       /*  21 */
+	"Auf Wiedersehen...",                                                 /*  22 */
+	"VERSAILLES,",                                                        /*  23 */
+	"Verschw" "\x9a" "rung am Hof",                                       /*  24 */
+	"Die Enzyklop" "\x8a" "die",                                          /*  25 */
+	"           Spiel wieder aufnehmen",                                  /*  26 */
+	"           Spiel starten",                                           /*  27 */
+	"           Spiel laden",                                             /*  28 */
+	"           Spiel speichern",                                         /*  29 */
+	"           Anzeige der Untertitel: JA",                              /*  30 */
+	"           Anzeige der Untertitel: NEIN",                            /*  31 */
+	"           Musik: JA",                                               /*  32 */
+	"           Musik: NEIN",                                             /*  33 */
+	"           ein Musikst" "\x9f" "ck auf Festplatte kopieren (20 "
+	"MB)",                                                                /*  34 */
+	"           komplette Musik auf Festplatte kopieren (92 MB)",         /*  35 */
+	"           Musik von CD-ROM spielen",                                /*  36 */
+	nullptr,                                                              /*  37 */
+	nullptr,                                                              /*  38 */
+	"Lautst" "\x8a" "rke",                                                /*  39 */
+	"Programm beenden",                                                   /*  40 */
+	"",                                                                   /*  41 */
+	"Der Rundgang",                                                       /*  42 */
+	"Credits",                                                            /*  43 */
+	"           Besichtigung wieder aufnehmen",                           /*  44 */
+	"           Rundgang speichern",                                      /*  45 */
+	"           Rundgang laden",                                          /*  46 */
+	nullptr,                                                              /*  47 */
+	"           Omni3D: normal",                                          /*  48 */
+	"           Omni3D: langsam",                                         /*  49 */
+	"           Omni3D: sehr langsam",                                    /*  50 */
+	"           Omni3D: schnell",                                         /*  51 */
+	"           Omni3D: sehr schnell",                                    /*  52 */
+	"Best" "\x8a" "tigen",                                                /*  53 */
+	"Abbrechen",                                                          /*  54 */
+	"Frei",                                                               /*  55 */
+	"Ohne Namen",                                                         /*  56 */
+	"Vorsicht! Das begonnene Spiel wird beendet.",                        /*  57 */
+	"Zur" "\x9f" "ck",                                                    /*  58 */
+	"Das Schloss",                                                        /*  59 */
+	"Zur" "\x9f" "ck zum Hauptmen" "\x9f",                                /*  60 */
+	"Gesamt" "\x9f" "bersicht Enzyklop" "\x8a" "die",                     /*  61 */
+	"Pl" "\x8a" "ne von Schloss und G" "\x8a" "rten",                     /*  62 */
+	"Pl" "\x8a" "ne der Innenr" "\x8a" "ume des Schlosses",               /*  63 */
+	"Problem beim Schreiben auf Festplatte: Nicht genug Speicherplatz",   /*  64 */
+	nullptr,                                                              /*  65 */
+	"Legen Sie die CD-ROM %d ein",                                        /*  66 */
+	"Legen Sie die CD-ROM %d und dr" "\x9f" "cken Sie eine Taste",        /*  67 */
+	"Die K" "\x9f" "nste",                                                /*  68 */
+	"Die Regierung",                                                      /*  69 */
+	"Der Hof",                                                            /*  70 */
+	"Leben bei Hofe",                                                     /*  71 */
+	"Das Schloss und die G" "\x8a" "rten",                                /*  72 */
+	"Chronologie",                                                        /*  73 */
+	"Apollobecken",                                                       /*  74 */
+	"Das Schloss",                                                        /*  75 */
+	"S" "\x8a" "ulengang",                                                /*  76 */
+	"Labyrinth",                                                          /*  77 */
+	"Latone",                                                             /*  78 */
+	"Orangerie",                                                          /*  79 */
+	"Wasserterrasse",                                                     /*  80 */
+	"Gr" "\x9f" "ner Teppich",                                            /*  81 */
+	"Gro" "\xa7" "e Reitst" "\x8a" "lle",                                 /*  82 */
+	"Kleine Reitst" "\x8a" "lle",                                         /*  83 */
+	"Die G" "\x8a" "rten",                                                /*  84 */
+	"Vorhof",                                                             /*  85 */
+	"Gro" "\xa7" "er Kanal",                                              /*  86 */
+	"S" "\x9f" "dterrasse",                                               /*  87 */
+	"Nordterrasse",                                                       /*  88 */
+	"K" "\x9a" "niglicher Gem" "\x9f" "segarten",                         /*  89 */
+	"Ballsaal",                                                           /*  90 */
+	"Neptunbecken",                                                       /*  91 */
+	"Wasserraum der Schweizer",                                           /*  92 */
+	"Nadeln (Unn" "\x9a" "tig!)",                                         /*  93 */
+	"Schere",                                                             /*  94 */
+	"Papier",                                                             /*  95 */
+	"Schm" "\x8a" "hschrift " "\x9f" "ber die K" "\x9f" "nste",           /*  96 */
+	"Kleiner Schl" "\x9f" "ssel 1",                                       /*  97 */
+	"Aufgedecktes Papier",                                                /*  98 */
+	"Beflecktes Papier",                                                  /*  99 */
+	"Papier aus der Kiste",                                               /* 100 */
+	"Schm" "\x8a" "hschrift " "\x9f" "ber die k" "\x9a" "nigliche "
+	"Ahnenreihe",                                                         /* 101 */
+	"Brennende Kerze",                                                    /* 102 */
+	"Kerze",                                                              /* 103 */
+	"Schl" "\x9f" "ssel",                                                 /* 104 */
+	"Zeichenkarton",                                                      /* 105 */
+	"Zeichenkarton",                                                      /* 106 */
+	"Falsche Skizze",                                                     /* 107 */
+	"Leiter",                                                             /* 108 */
+	"Zerst" "\x9a" "rte Skizze",                                          /* 109 */
+	"Pinsel",                                                             /* 110 */
+	"Goldpinsel",                                                         /* 111 */
+	"Rotpinsel",                                                          /* 112 */
+	"Zeichenkohle",                                                       /* 113 */
+	"Papier",                                                             /* 114 */
+	"Schm" "\x8a" "hschrift " "\x9f" "ber die Architektur",               /* 115 */
+	"Kleiner Schl" "\x9f" "ssel 2",                                       /* 116 */
+	"Bogensch" "\x9f" "tze (unn" "\x9a" "tig!)",                          /* 117 */
+	"Partitur",                                                           /* 118 */
+	"Billardstock",                                                       /* 119 */
+	"Genehmigung",                                                        /* 120 */
+	"Reproduktion der Medaillen",                                         /* 121 */
+	"Medaillen-Schublade",                                                /* 122 */
+	"Schl" "\x9f" "ssel zur kleinen Apollo-T" "\x9f" "r",                 /* 123 */
+	"Nahrungsmittel",                                                     /* 124 */
+	"Schm" "\x8a" "hschrift " "\x9f" "ber die Religion",                  /* 125 */
+	"Inschrift",                                                          /* 126 */
+	"Schm" "\x8a" "hschrift " "\x9f" "ber die Regierung",                 /* 127 */
+	"Feder",                                                              /* 128 */
+	"Merkzeichen",                                                        /* 129 */
+	"Fernrohr",                                                           /* 130 */
+	"Vaubanplan",                                                         /* 131 */
+	"Plan Vauban",                                                        /* 132 */
+	"Schnur",                                                             /* 133 */
+	"Schnitt",                                                            /* 134 */
+	"Kleiner Schl" "\x9f" "ssel 3",                                       /* 135 */
+	"Kleiner Schl" "\x9f" "ssel 4",                                       /* 136 */
+	"Memorandum",                                                         /* 137 */
+	"Schlosspl" "\x8a" "ne",                                              /* 138 */
+	"Schlosspl" "\x8a" "ne",                                              /* 139 */
+	"Schl" "\x9f" "ssel zum Dachstuhl",                                   /* 140 */
+	"Fabeln",                                                             /* 141 */
+	"Plan zum Labyrinth",                                                 /* 142 */
+	"Werkzeug",                                                           /* 143 */
+	"Medikament",                                                         /* 144 */
+	"Trichter",                                                           /* 145 */
+};
+
+static char const *const versaillesDEpaintings[] = {
+	"\"Einzug der Tiere in die Arche\"\rGerolamo Bassano",                /*  0: 41201 */
+	"\"Das Mahl von Emmaus\"\rJacopo Bassano",                            /*  1: 41202 */
+	"\"Magdalena zu F" "\x9f\xa7" "en Jesu Christi\"\rSustris",           /*  2: 41203 */
+	"\"Auszug aus der Arche\"\rGerolamo Bassano",                         /*  3: 41204 */
+	"\"Schlag gegen den Felsen\"\rJacopo Bassano",                        /*  4: 41205 */
+	"\"Die Schlacht von Arbil\"\rJoseph Parrocel",                        /*  5: 41301 */
+	"\"Alexander der Gro" "\xa7" "e als Sieger " "\x9f" "ber Darius in "
+	"der Schlacht von Arbil\"\rLe Bourguignon",                           /*  6: 41302 */
+	"\"Der Kampf des Leukippos\"\rJoseph Parrocel",                       /*  7: 42401 */
+	"\"Die heilige C" "\x8a" "cilia mit einem Engel, der ein "
+	"Notenblatt h" "\x8a" "lt\"\rDominiquin",                             /*  8: 42901 */
+	"\"Don Francisco du Moncada\"\rVan Dyck",                             /*  9: 42902 */
+	"\"Der kleine Johannes der T" "\x8a" "ufer\"\rLe Carrache",           /* 10: 42903 */
+	"\"Der heilige Matth" "\x8a" "us\"\rValentin",                        /* 11: 42904 */
+	"\"Der Denar des C" "\x8a" "sar\"\rValentin",                         /* 12: 42905 */
+	"\"Der heilige Lukas\"\rValentin",                                    /* 13: 42906 */
+	"\"Die geheimnisvolle Hochzeit der heiligen "
+	"Katharina\"\rAlessandro Turchi",                                     /* 14: 42907 */
+	"\"Zusammenkunft der Trinker\"\rNicolas Tournier",                    /* 15: 42908 */
+	"\"Die Wahrsagerin\"\rValentin",                                      /* 16: 42909 */
+	"\"Der K" "\x9a" "nig David beim Harfenspiel\"\rDominiquin",          /* 17: 42910 */
+	"\"Die heilige Magdalena\"\rDominiquin",                              /* 18: 42911 */
+	"\"Selbstportr" "\x8a" "t\"\rVan Dyck",                               /* 19: 42912 */
+	"\"Der heilige Johannes Evangelist\"\rValentin",                      /* 20: 42913 */
+	"\"Agar, dem ein Engel Beistand leistet\"\rGiovanni Lanfranco",       /* 21: 42914 */
+	"\"Der heilige Markus\"\rValentin",                                   /* 22: 42915 */
+	"\"Meleagros mit dem kalydonischen Eberkopf zu seinen F" "\x9f"
+	"\xa7" "en\"\rJacques Rousseau",                                      /* 23: 43090 */
+	"\"Der K" "\x9a" "nig in r" "\x9a" "mischem Gewand\"\rJean Warin",    /* 24: 43091 */ /* BUG: Switched */
+	"\"Attalante\"\rJacques Rousseau",                                    /* 25: 43092 */
+	"\"\x80" "neas tr" "\x8a" "gt Anchises\"\rSpada",                     /* 26: 43100 */
+	"\"David und Bethsabee\"\rV" "\x8e" "ron" "\x8f" "se",                /* 27: 43101 */
+	"\"Die Flucht nach " "\x80" "gypten\"\rGuido R" "\x8e" "ni",          /* 28: 43102 */
+	"\"Ludwig XIV. zu Pferd\"\rPierre Mignard",                           /* 29: 43103 */
+	"\"Die k" "\x9a" "nigliche Pracht und der Fortschritt der sch"
+	"\x9a" "nen K" "\x9f" "nste\"\rHouasse",                              /* 30: 43104 */
+	"\"Das Opfer der Iphigenie\"\rCharles de la fosse",                   /* 31: 43130 */
+	"\"B" "\x9f" "ste Ludwigs XIV.\"\rSkulptur von Bernini",              /* 32: 43131 */
+	"\"Diana entdeckt ihren Hirten Endymion, der in Morpheus' Armen "
+	"eingeschlafen ist\"\rGabriel Blanchard",                             /* 33: 43132 */
+	"\"Die Jungfrau und der heilige Petrus\"\rGuerchin",                  /* 34: 43140 */
+	"\"Die Emmaus-Pilger\"\rV" "\x8e" "ron" "\x8f" "se",                  /* 35: 43141 */
+	"\"Die heilige Familie\"\rV" "\x8e" "ron" "\x8f" "se",                /* 36: 43142 */
+	"\"Die Familie des Darius zu F" "\x9f\xa7" "en "
+	"Alexanders\"\rCharles Le Brun",                                      /* 37: 43143 */
+	"\"Der heilige Johannes der T" "\x8a" "ufer\"\rRapha" "\x91" "l",     /* 38: 43144 */
+	"\"Maria von Medici\"\rVan Dyck",                                     /* 39: 43150 */
+	"\"Herkules k" "\x8a" "mpft gegen Acheloos\"\rGuido R" "\x8e" "ni",   /* 40: 43151 */
+	"\"Der Zentaur Nessus tr" "\x8a" "gt Deianeira\"\rGuido R" "\x8e"
+	"ni",                                                                 /* 41: 43152 */
+	"\"Der heilige Franz von Assisi, nach seiner Stigmatisierung gest"
+	"\x8a" "rkt\"\rSeghers",                                              /* 42: 43153 */
+	"\"Thomiris taucht den Kopf des Cyrus in Blut\"\rRubens",             /* 43: 43154 */
+	"\"Herkules t" "\x9a" "tet Hydra\"\rGuido R" "\x8e" "ni",             /* 44: 43155 */
+	"\"Herkules auf dem Scheiterhaufen\"\rGuido R" "\x8e" "ni",           /* 45: 43156 */
+	"\"Portr" "\x8a" "t des pf" "\x8a" "lzischen Prinzen und seines "
+	"Bruders, Prinz Robert\"\rVan Dyck",                                  /* 46: 43157 */
+	"\"Die Kreuzabnahme\"\rCharles Le Brun",                              /* 47: 45260 */
+};
+
 static char const *const versaillesENmessages[] = {
 	"For the moment it is forbidden to open this door.",                  /*   0 */
 	"This door is locked.",                                               /*   1 */
diff --git a/dists/engine-data/cryomni3d.dat b/dists/engine-data/cryomni3d.dat
index fdcb8fb..02bc9e4 100644
Binary files a/dists/engine-data/cryomni3d.dat and b/dists/engine-data/cryomni3d.dat differ
diff --git a/engines/cryomni3d/datstream.cpp b/engines/cryomni3d/datstream.cpp
index b8af327..f679467 100644
--- a/engines/cryomni3d/datstream.cpp
+++ b/engines/cryomni3d/datstream.cpp
@@ -117,6 +117,8 @@ void DATSeekableStream::readString16Array16(Common::StringArray &array) {
 
 uint16 DATSeekableStream::translateLanguage(Common::Language lang) {
 	switch (lang) {
+	case Common::DE_DEU:
+		return MKTAG16('d', 'e');
 	case Common::EN_ANY:
 		return MKTAG16('e', 'n');
 	case Common::FR_FRA:
diff --git a/engines/cryomni3d/detection_tables.h b/engines/cryomni3d/detection_tables.h
index 0ece04d..5f824f1 100644
--- a/engines/cryomni3d/detection_tables.h
+++ b/engines/cryomni3d/detection_tables.h
@@ -161,6 +161,23 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 		GF_VERSAILLES_AUDIOPADDING,
 	},
 
+	// Versailles 1685
+	// German Macintosh
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("Versailles", "f1aa0603e7f71404f936e4189b4c5b2b", 348614),
+			Common::DE_DEU,
+			Common::kPlatformMacintosh,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_AUDIOPADDING,
+	},
+
 	{ AD_TABLE_END_MARKER, 0, 0 }
 };
 
diff --git a/engines/cryomni3d/versailles/engine.cpp b/engines/cryomni3d/versailles/engine.cpp
index 7fba901..6f0a0e3 100644
--- a/engines/cryomni3d/versailles/engine.cpp
+++ b/engines/cryomni3d/versailles/engine.cpp
@@ -635,6 +635,24 @@ void CryOmni3DEngine_Versailles::playTransitionEndLevel(int level) {
 	// In original game the HNM player just doesn't render the cursor
 	bool cursorWasVisible = showMouse(false);
 
+	if (level == -2) {
+		if (getLanguage() == Common::DE_DEU) {
+			// Display one more copyright
+			if (displayHLZ("RAVENSBG", 5000)) {
+				clearKeys();
+				fadeOutPalette();
+				if (shouldAbort()) {
+					return;
+				}
+				// Display back cursor there once the palette has been zeroed
+				showMouse(cursorWasVisible);
+
+				fillSurface(0);
+				return;
+			}
+		}
+	}
+
 	// Videos are like music because if you mute music in game it will mute videos soundtracks
 	playHNM(video, Audio::Mixer::kMusicSoundType);
 


Commit: 5309672bea7a7e25f58e16c717ae738a9f02308e
    https://github.com/scummvm/scummvm/commit/5309672bea7a7e25f58e16c717ae738a9f02308e
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:52:00+02:00

Commit Message:
CRYOMNI3D: Move texts at the right place

With different languages text should be placed to fit on the screen

Changed paths:
    engines/cryomni3d/versailles/menus.cpp


diff --git a/engines/cryomni3d/versailles/menus.cpp b/engines/cryomni3d/versailles/menus.cpp
index 2459882..a6490dc 100644
--- a/engines/cryomni3d/versailles/menus.cpp
+++ b/engines/cryomni3d/versailles/menus.cpp
@@ -45,17 +45,38 @@ void CryOmni3DEngine_Versailles::drawMenuTitle(Graphics::ManagedSurface *surface
 	int offY;
 
 	int oldFont = _fontManager.getCurrentFont();
+
+	int titleX, titleY, subtitleX, subtitleY;
+	if (getLanguage() == Common::FR_FRA) {
+		titleX = 144;
+		titleY = 160;
+		subtitleX = 305;
+		subtitleY = 160;
+	} else if (getLanguage() == Common::DE_DEU) {
+		titleX = 122;
+		titleY = 80;
+		subtitleX = 283;
+		subtitleY = 80;
+	} else {
+		titleX = 100;
+		titleY = 80;
+		subtitleX = 261;
+		subtitleY = 80;
+	}
+
 	_fontManager.setSurface(surface);
 	_fontManager.setForeColor(color);
 	_fontManager.setCurrentFont(1);
 	offY = _fontManager.getFontMaxHeight();
-	_fontManager.displayStr(144, 160 - offY, _messages[23]);
+	_fontManager.displayStr(titleX, titleY - offY, _messages[23]);
 	_fontManager.setCurrentFont(3);
 	offY = _fontManager.getFontMaxHeight();
-	_fontManager.displayStr(305, 160 - offY, _messages[24]);
+	_fontManager.displayStr(subtitleX, subtitleY - offY, _messages[24]);
 
-	surface->vLine(100, 146, 172, color);
-	surface->hLine(100, 172, 168, color); // minus 1 because hLine draws inclusive
+	if (getLanguage() == Common::FR_FRA) {
+		surface->vLine(100, 146, 172, color);
+		surface->hLine(100, 172, 168, color); // minus 1 because hLine draws inclusive
+	}
 
 	_fontManager.setCurrentFont(oldFont);
 }
@@ -301,7 +322,15 @@ uint CryOmni3DEngine_Versailles::displayOptions() {
 				if (!_isPlaying || _isVisiting) {
 					end = true;
 				} else {
-					end = displayYesNoBox(optionsSurface, Common::Rect(235, 420, 505, 465), 57);
+					Common::Rect rct;
+					if (getLanguage() == Common::DE_DEU) {
+						rct = Common::Rect(286, 433, 555, 475);
+					} else if (getLanguage() == Common::IT_ITA) {
+						rct = Common::Rect(250, 420, 530, 465);
+					} else {
+						rct = Common::Rect(235, 420, 505, 465);
+					}
+					end = displayYesNoBox(optionsSurface, rct, 57);
 				}
 				drawState = 1;
 				if (!end) {


Commit: 70eca7190573ad43d78c75c9ea0f4207b4ecbf62
    https://github.com/scummvm/scummvm/commit/70eca7190573ad43d78c75c9ea0f4207b4ecbf62
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:52:44+02:00

Commit Message:
CRYOMNI3D: Add Spanish version of Versailles

Changed paths:
    devtools/create_cryomni3d/create_cryomni3d_dat.cpp
    devtools/create_cryomni3d/create_cryomni3d_dat.h
    devtools/create_cryomni3d/versailles.cpp
    devtools/create_cryomni3d/versailles.h
    dists/engine-data/cryomni3d.dat
    engines/cryomni3d/datstream.cpp
    engines/cryomni3d/detection_tables.h
    engines/cryomni3d/versailles/menus.cpp


diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
index 741d76f..9646a1c 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.cpp
@@ -52,12 +52,14 @@ struct Parts {
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, FR)
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, DE)
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, EN)
+DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, ES)
 DEFINE_GAME_PLATFORM_LANG_FUNCS(Versailles, ALL, IT)
 
 static Parts gamesParts[] = {
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, FR),
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, DE),
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, EN),
+	GAME_PLATFORM_LANG_PART(Versailles, ALL, ES),
 	GAME_PLATFORM_LANG_PART(Versailles, ALL, IT),
 };
 
diff --git a/devtools/create_cryomni3d/create_cryomni3d_dat.h b/devtools/create_cryomni3d/create_cryomni3d_dat.h
index 8f8aeb8..9ccad39 100644
--- a/devtools/create_cryomni3d/create_cryomni3d_dat.h
+++ b/devtools/create_cryomni3d/create_cryomni3d_dat.h
@@ -40,6 +40,7 @@ size_t writeGameHeader(FILE *f, uint32 gameId, uint16 version, uint16 lang, uint
 
 #define LANG_DE                       MKTAG16('d', 'e')
 #define LANG_EN                       MKTAG16('e', 'n')
+#define LANG_ES                       MKTAG16('e', 's')
 #define LANG_FR                       MKTAG16('f', 'r')
 #define LANG_IT                       MKTAG16('i', 't')
 
diff --git a/devtools/create_cryomni3d/versailles.cpp b/devtools/create_cryomni3d/versailles.cpp
index 46d276d..588a105 100644
--- a/devtools/create_cryomni3d/versailles.cpp
+++ b/devtools/create_cryomni3d/versailles.cpp
@@ -60,4 +60,5 @@
 DEFINE_FUNCS(FR)
 DEFINE_FUNCS(DE)
 DEFINE_FUNCS(EN)
+DEFINE_FUNCS(ES)
 DEFINE_FUNCS(IT)
diff --git a/devtools/create_cryomni3d/versailles.h b/devtools/create_cryomni3d/versailles.h
index 8dc58fd..9f5b507 100644
--- a/devtools/create_cryomni3d/versailles.h
+++ b/devtools/create_cryomni3d/versailles.h
@@ -50,6 +50,13 @@ static char const *const versaillesENlocalizedFilenames[] = {
 	"credits.GB",
 	"LEB1_GB.WAV",
 };
+static char const *const versaillesESlocalizedFilenames[] = {
+	"DIALOG1.SP",
+	"tous_doc.SP",
+	"lien_doc.txt",
+	"credits.SP",
+	"LEB1_SP.WAV",
+};
 static char const *const versaillesITlocalizedFilenames[] = {
 	"DIALOG1.ITA",
 	"tous_doc.ita",
@@ -64,6 +71,8 @@ static char const versaillesDEEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT"
 static char const versaillesDEEpilPwd[] = "DIEENTENUNDDERPUDEL";
 static char const versaillesENEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesENEpilPwd[] = "FOXANDCRANE";
+static char const versaillesESEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
+static char const versaillesESEpilPwd[] = "ELZORROYLAGRULLA";
 static char const versaillesITEpilMsg[] = "FELIXFORTUNADIVINUMEXPLORATUMACTUIIT";
 static char const versaillesITEpilPwd[] = "LEANATREEILCANE";
 
@@ -71,6 +80,7 @@ static char const versaillesFRBombPwd[] = "JEMENVAISMAISLETATDEMEURERATOUJOURS";
 static char const versaillesDEBombPwd[] =
     "MONARCHEN IST ES NICHT GEGEBEN VOLLKOMMENHEIT ZU ERREICHEN";
 static char const versaillesENBombPwd[] = "IT IS NOT IN THE POWER OF KINGS TO ATTAIN PERFECTION";
+static char const versaillesESBombPwd[] = "NO ES PODER DE REYES EL ALCANZAR LA PERFECCION";
 static char const versaillesITBombPwd[] = "AI SOVRANI NON E DATO RAGGIUNGERE LA PERFEZIONE";
 
 #define VERSAILLES_MESSAGES_COUNT 146
@@ -725,6 +735,221 @@ static char const *const versaillesENpaintings[] = {
 	"\"Christ being taken down from the cross\"\rCharles Lebrun",         /* 47: 45260 */
 };
 
+static char const *const versaillesESmessages[] = {
+	"Por el momento est" "\x87" " prohibido abrir esta puerta.",          /*   0 */
+	"Esta puerta est" "\x87" " cerrada.",                                 /*   1 */
+	"Esta puerta est" "\x87" " cerrada.",                                 /*   2 */
+	"Este caj" "\x97" "n est" "\x87" " vac" "\x92" "o.",                  /*   3 */
+	"No puedes alcanzar la cubierta.",                                    /*   4 */
+	"No hay nada en este naranjo.",                                       /*   5 */
+	"\xc1" "Esto no es un naranjo!",                                      /*   6 */
+	"Est" "\x87" " demasiado oscuro.",                                    /*   7 */
+	"El cofre est" "\x87" " cerrado. ",                                   /*   8 */
+	"Puedes abrir la puerta.",                                            /*   9 */
+	"Necesitar" "\x87" "s algo para poder alcanzar la bomba.",            /*  10 */
+	"Este jarr" "\x97" "n est" "\x87" " vac" "\x92" "o.",                 /*  11 */
+	"Ahora puedes pasar.",                                                /*  12 */
+	"\xc1" "No tienes tiempo para aprender sobre la Corte.!",             /*  13 */
+	"\xc1" "Es demasiado tarde para admirar los cuadros!",                /*  14 */
+	"\xc1" "Espera! Dale tus pistas al ujier.",                           /*  15 */
+	"No puedes alcanzar el papel.",                                       /*  16 */
+	"A la botica.",                                                       /*  17 */
+	"Aviso: Podr" "\x87" "s llegar al final de este nivel, pero no has "
+	"realizado todas las acciones necesarias para poder continuar. Se "
+	"te aconseja que GUARDES este juego ahora.",                          /*  18 */
+	"Aviso: Podr" "\x87" "s llegar al final de este nivel, pero puede "
+	"que no hayas realizado todas las acciones necesarias para poder "
+	"continuar. Se te aconseja que GUARDES este juego ahora.",            /*  19 */
+	"No puedes moverte por ah" "\x92" " mientras lleves una escalera.",   /*  20 */
+	"Aqu" "\x92" " no hay nada m" "\x87" "s.",                            /*  21 */
+	"Adi" "\x97" "s ...",                                                 /*  22 */
+	"VERSALLES,",                                                         /*  23 */
+	"Intriga en la Corte de Luis XIV",                                    /*  24 */
+	"Consultar la zona de documentaci" "\x97" "n",                        /*  25 */
+	"           Continuar el juego",                                      /*  26 */
+	"           Empezar un juego nuevo",                                  /*  27 */
+	"           Cargar un juego",                                         /*  28 */
+	"           Guardar este juego",                                      /*  29 */
+	"           Mostrar subt" "\x92" "tulos: SI",                         /*  30 */
+	"           Mostrar subt" "\x92" "tulos: NO",                         /*  31 */
+	"           M" "\x9c" "sica: SI",                                     /*  32 */
+	"           M" "\x9c" "sica: NO",                                     /*  33 */
+	"           Una parte de la m" "\x9c" "sica en el disco duro (20 "
+	"Mb)",                                                                /*  34 */
+	"           Toda la m" "\x9c" "sica en el disco duro (92 Mb)",        /*  35 */
+	"           No guardar m" "\x9c" "sica en el disco duro (leer CD)",   /*  36 */
+	nullptr,                                                              /*  37 */
+	nullptr,                                                              /*  38 */
+	"Volumen",                                                            /*  39 */
+	"Salir del juego",                                                    /*  40 */
+	"",                                                                   /*  41 */
+	"Visitar el palacio",                                                 /*  42 */
+	"Cr" "\x8e" "ditos",                                                  /*  43 */
+	"           Continuar la visita",                                     /*  44 */
+	"           Guardar esta visita",                                     /*  45 */
+	"           Cargar una visita",                                       /*  46 */
+	nullptr,                                                              /*  47 */
+	"           Omni3D: normal",                                          /*  48 */
+	"           Omni3D: despacio",                                        /*  49 */
+	"           Omni3D: muy despacio",                                    /*  50 */
+	"           Omni3D: r" "\x87" "pido",                                 /*  51 */
+	"           Omni3D: muy r" "\x87" "pido",                             /*  52 */
+	"Confirmar",                                                          /*  53 */
+	"Cancelar",                                                           /*  54 */
+	"libre",                                                              /*  55 */
+	"sin nombre",                                                         /*  56 */
+	"Aviso: este juego va a ser abandonado.",                             /*  57 */
+	"Vuelta",                                                             /*  58 */
+	"El Palacio",                                                         /*  59 */
+	"Volver al Men" "\x9c" " Principal",                                  /*  60 */
+	"Sumario de la Zona de Documentaci" "\x97" "n",                       /*  61 */
+	"Mapa del Palacio y los jardines",                                    /*  62 */
+	"Plano interior del palacio",                                         /*  63 */
+	"Imposible escribir en el disco duro: disco lleno",                   /*  64 */
+	nullptr,                                                              /*  65 */
+	"Inserta el CD",                                                      /*  66 */
+	"Inserta el %d CD y pulsa cualquier tecla",                           /*  67 */
+	"Las Artes",                                                          /*  68 */
+	"El  Reinado",                                                        /*  69 */
+	"La Corte",                                                           /*  70 */
+	"Vida en el Palacio",                                                 /*  71 */
+	"El Palacio y los jardines",                                          /*  72 */
+	"Cronolog" "\x92" "a",                                                /*  73 */
+	"La Fuente de Apolo",                                                 /*  74 */
+	"El Palacio",                                                         /*  75 */
+	"Colonnade",                                                          /*  76 */
+	"Laberinto",                                                          /*  77 */
+	"Latona",                                                             /*  78 */
+	"Orangerie",                                                          /*  79 */
+	"El Parterre de agua",                                                /*  80 */
+	"Alfombra verde",                                                     /*  81 */
+	"Las Caballerizas Grandes",                                           /*  82 */
+	"Las Caballerizas Peque" "\x96" "as",                                 /*  83 */
+	"Los jardines",                                                       /*  84 */
+	"El Patio",                                                           /*  85 */
+	"El Gran Canal",                                                      /*  86 */
+	"El Parterre Sur",                                                    /*  87 */
+	"El Parterre Norte",                                                  /*  88 */
+	"El huerto del Rey",                                                  /*  89 */
+	"El Sal" "\x97" "n de Baile",                                         /*  90 */
+	"La Fuente de Neptuno",                                               /*  91 */
+	"El Lago de los Guardas Suizos",                                      /*  92 */
+	"Agujas (" "\xc1" "Sin uso!)",                                        /*  93 */
+	"Tijeras",                                                            /*  94 */
+	"Papel",                                                              /*  95 */
+	"Panfleto sobre las artes",                                           /*  96 */
+	"Llave peque" "\x96" "a 1",                                           /*  97 */
+	"Papel transformado",                                                 /*  98 */
+	"Papel manchado",                                                     /*  99 */
+	"Papel del cofre",                                                    /* 100 */
+	"Panfleto sobre linaje real",                                         /* 101 */
+	"Vela encendida",                                                     /* 102 */
+	"Vela",                                                               /* 103 */
+	"Llave",                                                              /* 104 */
+	"Carpeta de bocetos",                                                 /* 105 */
+	"Carpeta de bocetos",                                                 /* 106 */
+	"Boceto falso",                                                       /* 107 */
+	"Escalera",                                                           /* 108 */
+	"Boceto destruido",                                                   /* 109 */
+	"pincel",                                                             /* 110 */
+	"pincel dorado",                                                      /* 111 */
+	"pincel rojo",                                                        /* 112 */
+	"Carboncillo",                                                        /* 113 */
+	"Papel",                                                              /* 114 */
+	"Panfleto sobre arquitectura",                                        /* 115 */
+	"Llave peque" "\x96" "a 2",                                           /* 116 */
+	"Arquero(" "\xc1" "sin uso!)",                                        /* 117 */
+	"Partitura",                                                          /* 118 */
+	"Taco de Billar",                                                     /* 119 */
+	"Autorizaci" "\x97" "n",                                              /* 120 */
+	"Reproducci" "\x97" "n de medallas",                                  /* 121 */
+	"Caj" "\x97" "n con medallas",                                        /* 122 */
+	"Llave de la peque" "\x96" "a puerta de Apolo",                       /* 123 */
+	"Comida",                                                             /* 124 */
+	"Panfleto sobre religi" "\x97" "n",                                   /* 125 */
+	"Ep" "\x92" "grafe",                                                  /* 126 */
+	"Panfleto sobre el gobierno",                                         /* 127 */
+	"Pluma",                                                              /* 128 */
+	"Memo",                                                               /* 129 */
+	"Telescopio",                                                         /* 130 */
+	"Plano de Vauban",                                                    /* 131 */
+	"Plano de Vauban",                                                    /* 132 */
+	"Cord" "\x97" "n",                                                    /* 133 */
+	"Grabado",                                                            /* 134 */
+	"Llave peque" "\x96" "a 3",                                           /* 135 */
+	"Llave peque" "\x96" "a 4",                                           /* 136 */
+	"Memorandum",                                                         /* 137 */
+	"Planos del Palacio",                                                 /* 138 */
+	"Planos del Palacio",                                                 /* 139 */
+	"Llave del " "\x87" "tico",                                           /* 140 */
+	"F" "\x87" "bulas",                                                   /* 141 */
+	"Plano del laberinto",                                                /* 142 */
+	"Herramienta",                                                        /* 143 */
+	"Medicina",                                                           /* 144 */
+	"Apagavelas",                                                         /* 145 */
+};
+
+static char const *const versaillesESpaintings[] = {
+	"\"Animales entrando en el Arca\"\rGerolamo Bassano ",                /*  0: 41201 */
+	"\"La Cena de Emmaus\"\rJacopo Bassano",                              /*  1: 41202 */
+	"\"Mar" "\x92" "a Magdalena a los pies de Cristo\"",                  /*  2: 41203 */
+	"\"Saliendo del Arca\"\rGerolamo Bassano ",                           /*  3: 41204 */
+	"\"Golpeando la Roca\"\rJacopo Bassano",                              /*  4: 41205 */
+	"\"La Batalla de Arbelles\"\rJoseph Parrocel",                        /*  5: 41301 */
+	"\"Alejandro el Grande, Conquistador de Darisu en la batalla de "
+	"Arbelles\"\rLe Bourguignon ",                                        /*  6: 41302 */
+	"\"El Combate de Leuze\"\rJoseph Parrocel",                           /*  7: 42401 */
+	"\"Santa Cecilia con un " "\x87" "ngel sosteniendo una "
+	"partitura\"\rIl Domenichino",                                        /*  8: 42901 */
+	"\"Don Francisco de Moncada\"\rVan Dyck",                             /*  9: 42902 */
+	"\"El joven Juan Bautista\"\rCarracci",                               /* 10: 42903 */
+	"\"San Mateo\"\rValentin",                                            /* 11: 42904 */
+	"\"Rendici" "\x97" "n ante el C" "\x8e" "sar\"\rValentin",            /* 12: 42905 */
+	"\"San Lucas\"\rValentin",                                            /* 13: 42906 */
+	"\"El matrimonio m" "\x92" "stico de Santa Catalina\"\r Alessandro "
+	"Turchi",                                                             /* 14: 42907 */
+	"\"La Reuni" "\x97" "n de los Bebedores\"\rNicolas Tournier",         /* 15: 42908 */
+	"\"Vidente\"\rValentin",                                              /* 16: 42909 */
+	"\"El Rey David tocando el arpa\"\rIl Domenichino",                   /* 17: 42910 */
+	"\"Mar" "\x92" "a Magdalena\"\rIl Domenichino",                       /* 18: 42911 */
+	"\"Autorretrato\"\rVan Dyck",                                         /* 19: 42912 */
+	"\"San Juan el Evangelista\"\r Valentin",                             /* 20: 42913 */
+	"\"Hagar siendo ayudada por un " "\x87" "ngel\"\rGiovanni "
+	"Lanfranco",                                                          /* 21: 42914 */
+	"\"San Marcos\"\rValentin",                                           /* 22: 42915 */
+	"\"Meleager con la cabeza del verraco de Calydon a sus "
+	"pies\"\rJacques Rousseau",                                           /* 23: 43090 */
+	"\"El Rey vestido de romano\"\rJean Warin",                           /* 24: 43091 */
+	"\"Atalanta\"\rJacques Rousseau",                                     /* 25: 43092 */
+	"\"Eneas llevando a Anchises\"\rSpada",                               /* 26: 43100 */
+	"\"David y Betsab" "\x8e" "\"\rVeronese",                             /* 27: 43101 */
+	"\"El Vuelo a Egipto\"\rGuido Reni",                                  /* 28: 43102 */
+	"\"Luis XIV a caballo\"\rPierre Mignard",                             /* 29: 43103 */
+	"\"La Magnificencia Real y el Progreso de las Bellas "
+	"Artes\"\rHouasse",                                                   /* 30: 43104 */
+	"\"El sacrificio de Ifigenia\"\rCharles de La Fosse",                 /* 31: 43130 */
+	"\"Busto de Luis XIV\"\rsculpted by Bernini",                         /* 32: 43131 */
+	"\"Diana descubre a Endymion en los brazos de Morfeo\"\rGabriel "
+	"Blanchard",                                                          /* 33: 43132 */
+	"\"San Pedro y la V" "\x92" "rgen Mar" "\x92" "a\"\rIl Guercino",     /* 34: 43140 */
+	"\"Los disc" "\x92" "pulos en Emmaus\"\rVeronese",                    /* 35: 43141 */
+	"\"La Sagrada Familia\"\rVeronese",                                   /* 36: 43142 */
+	"\"La familia de Dar" "\x92" "o a los pies de Alejandro\"\rCharles "
+	"LeBrun",                                                             /* 37: 43143 */
+	"\"San Juan Bautista\"\rRaphael",                                     /* 38: 43144 */
+	"\"Mar" "\x92" "a de M" "\x8e" "dicis\"\rVan Dyck",                   /* 39: 43150 */
+	"\"H" "\x8e" "rcules luchando contra Aqueleo\"\rGuido Reni",          /* 40: 43151 */
+	"\"El Centauro Nessus raptando a Deianeira\"\rGuido Reni",            /* 41: 43152 */
+	"\"San Francisco de As" "\x92" "s consolado tras recibir el "
+	"estigma\"\rSeghers",                                                 /* 42: 43153 */
+	"\"Thomiris hundiendo la cabeza de Ciro en sangre\"\rRubens",         /* 43: 43154 */
+	"\"H" "\x8e" "rcules destruyendo a Hydra\"\rGuido Reni",              /* 44: 43155 */
+	"\"H" "\x8e" "rcules en llamas\"\rGuido Reni",                        /* 45: 43156 */
+	"\"Retrato del Pr" "\x92" "ncipe Palatine y de su hermano el Pr"
+	"\x92" "ncipe Roberto\"\rVan Dyck",                                   /* 46: 43157 */
+	"\"El Descendimiento de Cristo\"\rCharles Lebrun",                    /* 47: 45260 */
+};
+
 static char const *const versaillesITmessages[] = {
 	"Per ora " "\x8f" " vietato aprire questa porta.",                    /*   0 */
 	"Questa porta " "\x8f" " chiusa a chiave.",                           /*   1 */
diff --git a/dists/engine-data/cryomni3d.dat b/dists/engine-data/cryomni3d.dat
index 02bc9e4..e991ebe 100644
Binary files a/dists/engine-data/cryomni3d.dat and b/dists/engine-data/cryomni3d.dat differ
diff --git a/engines/cryomni3d/datstream.cpp b/engines/cryomni3d/datstream.cpp
index f679467..f1e10fe 100644
--- a/engines/cryomni3d/datstream.cpp
+++ b/engines/cryomni3d/datstream.cpp
@@ -121,6 +121,8 @@ uint16 DATSeekableStream::translateLanguage(Common::Language lang) {
 		return MKTAG16('d', 'e');
 	case Common::EN_ANY:
 		return MKTAG16('e', 'n');
+	case Common::ES_ESP:
+		return MKTAG16('e', 's');
 	case Common::FR_FRA:
 		return MKTAG16('f', 'r');
 	case Common::IT_ITA:
diff --git a/engines/cryomni3d/detection_tables.h b/engines/cryomni3d/detection_tables.h
index 5f824f1..f6791fa 100644
--- a/engines/cryomni3d/detection_tables.h
+++ b/engines/cryomni3d/detection_tables.h
@@ -178,6 +178,57 @@ static const CryOmni3DGameDescription gameDescriptions[] = {
 		GF_VERSAILLES_AUDIOPADDING,
 	},
 
+	// Versailles 1685
+	// Spanish Windows 95 from hybrid Win95/DOS CD
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("VERSAILL.EXE", "78d90d656ec3b76f158721d38bc68083", 346112),
+			Common::ES_ESP,
+			Common::kPlatformWindows,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_NUMERICFONTS | GF_VERSAILLES_AUDIOPADDING,
+	},
+
+	// Versailles 1685
+	// Spanish Windows 95 compressed from hybrid Win95/DOS CD
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("PROGRAM.Z", "9e7c0c3125124010d45dde9dc62744ef", 346112),
+			Common::ES_ESP,
+			Common::kPlatformWindows,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_NUMERICFONTS | GF_VERSAILLES_AUDIOPADDING,
+	},
+
+	// Versailles 1685
+	// Spanish DOS from hybrid Win95/DOS CD
+	// From lePhilousophe
+	{
+		{
+			"versailles",
+			"",
+			AD_ENTRY1s("VERSAILL.PGM", "1c992f034f43418a5da2e8ebd0b92620", 715887),
+			Common::ES_ESP,
+			Common::kPlatformDOS,
+			ADGF_UNSTABLE,
+			GUI_OPTIONS_VERSAILLES
+		},
+		GType_VERSAILLES,
+		GF_VERSAILLES_NUMERICFONTS | GF_VERSAILLES_AUDIOPADDING,
+	},
+
 	{ AD_TABLE_END_MARKER, 0, 0 }
 };
 
diff --git a/engines/cryomni3d/versailles/menus.cpp b/engines/cryomni3d/versailles/menus.cpp
index a6490dc..bec962e 100644
--- a/engines/cryomni3d/versailles/menus.cpp
+++ b/engines/cryomni3d/versailles/menus.cpp
@@ -47,7 +47,8 @@ void CryOmni3DEngine_Versailles::drawMenuTitle(Graphics::ManagedSurface *surface
 	int oldFont = _fontManager.getCurrentFont();
 
 	int titleX, titleY, subtitleX, subtitleY;
-	if (getLanguage() == Common::FR_FRA) {
+	if (getLanguage() == Common::FR_FRA ||
+	        getLanguage() == Common::ES_ESP) {
 		titleX = 144;
 		titleY = 160;
 		subtitleX = 305;
@@ -73,7 +74,8 @@ void CryOmni3DEngine_Versailles::drawMenuTitle(Graphics::ManagedSurface *surface
 	offY = _fontManager.getFontMaxHeight();
 	_fontManager.displayStr(subtitleX, subtitleY - offY, _messages[24]);
 
-	if (getLanguage() == Common::FR_FRA) {
+	if (getLanguage() == Common::FR_FRA ||
+	        getLanguage() == Common::ES_ESP) {
 		surface->vLine(100, 146, 172, color);
 		surface->hLine(100, 172, 168, color); // minus 1 because hLine draws inclusive
 	}
@@ -325,7 +327,8 @@ uint CryOmni3DEngine_Versailles::displayOptions() {
 					Common::Rect rct;
 					if (getLanguage() == Common::DE_DEU) {
 						rct = Common::Rect(286, 433, 555, 475);
-					} else if (getLanguage() == Common::IT_ITA) {
+					} else if (getLanguage() == Common::ES_ESP ||
+					           getLanguage() == Common::IT_ITA) {
 						rct = Common::Rect(250, 420, 530, 465);
 					} else {
 						rct = Common::Rect(235, 420, 505, 465);


Commit: 58b9848ccf834086d5577ad346a7229dcd8a17f3
    https://github.com/scummvm/scummvm/commit/58b9848ccf834086d5577ad346a7229dcd8a17f3
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2019-07-05T07:54:09+02:00

Commit Message:
CRYOMNI3D: Fix style

Changed paths:
    engines/cryomni3d/objects.h


diff --git a/engines/cryomni3d/objects.h b/engines/cryomni3d/objects.h
index 0004672..8a68949 100644
--- a/engines/cryomni3d/objects.h
+++ b/engines/cryomni3d/objects.h
@@ -35,7 +35,8 @@ class Object {
 public:
 	typedef Common::Functor0<void> *ViewCallback;
 
-	Object() : _valid(false), _idCA(uint(-1)), _idCl(uint(-1)), _idSA(uint(-1)), _idSl(uint(-1)), _idOBJ(uint(-1)),
+	Object() : _valid(false), _idCA(uint(-1)), _idCl(uint(-1)), _idSA(uint(-1)), _idSl(uint(-1)),
+		_idOBJ(uint(-1)),
 		_viewCallback(nullptr) {}
 
 	Object(const Sprites &sprites, uint id_CA, uint id_OBJ) : _idCA(id_CA),





More information about the Scummvm-git-logs mailing list