[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