aboutsummaryrefslogtreecommitdiff
path: root/saga/game.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2004-12-22 19:34:41 +0000
committerEugene Sandulenko2004-12-22 19:34:41 +0000
commitab4734dcf60d8f06786cbdd382a7a83ca962103a (patch)
treef5c8c92cb3bb511a0d74d153f2fceafd10c6d66c /saga/game.cpp
parentfd09e3c71cf5bf3e14ccc01b2f21fe9d6a4982c4 (diff)
downloadscummvm-rg350-ab4734dcf60d8f06786cbdd382a7a83ca962103a.tar.gz
scummvm-rg350-ab4734dcf60d8f06786cbdd382a7a83ca962103a.tar.bz2
scummvm-rg350-ab4734dcf60d8f06786cbdd382a7a83ca962103a.zip
o Fix regression with Mac versions
o Normalize GIDs and GTypes o Introduce MD5-based game detection. Now only 2 games should be ordered. Linux demo should go before Win32 newer demo o Fix sound in Mac versions svn-id: r16262
Diffstat (limited to 'saga/game.cpp')
-rw-r--r--saga/game.cpp246
1 files changed, 210 insertions, 36 deletions
diff --git a/saga/game.cpp b/saga/game.cpp
index 0ad7e53c80..572274adc6 100644
--- a/saga/game.cpp
+++ b/saga/game.cpp
@@ -24,9 +24,11 @@
// Game detection, general game parameters
#include "saga/saga.h"
+
#include "common/file.h"
-#include "base/gameDetector.h"
+#include "common/md5.h"
#include "base/plugins.h"
+#include "base/gameDetector.h"
#include "backends/fs/fs.h"
#include "saga/rscfile_mod.h"
@@ -55,22 +57,21 @@ static GAME_SOUNDINFO ITEDEMO_GameSound = {
GAME_SOUND_VOC, 0, 0, 0
};
-// Inherit the Earth - MAC Wyrmkeep Demo version
-static GAME_FILEDESC ITEMACDEMO_GameFiles[] = {
- {"ITED.RSC", GAME_RESOURCEFILE},
- {"SCRIPTSD.RSC", GAME_SCRIPTFILE},
- {"SOUNDSD.RSC", GAME_SOUNDFILE},
- {"VOICESD.RSC", GAME_VOICEFILE},
- {"MUSICD.RSC", GAME_MUSICFILE}
-};
-
static GAME_FONTDESC ITEMACDEMO_GameFonts[] = {
{GAME_FONT_MEDIUM, 0},
{GAME_FONT_SMALL, 2}
};
-// Inherit the Earth - win32 Wyrmkeep Linux Demo version
-static GAME_FILEDESC ITEWINDEMO_GameFiles[] = {
+// Inherit the Earth - Wyrmkeep Win32 Demo version
+static GAME_FILEDESC ITEWINDEMO2_GameFiles[] = {
+ {"ITED.RSC", GAME_RESOURCEFILE},
+ {"SCRIPTSD.RSC", GAME_SCRIPTFILE},
+ {"SOUNDSD.RSC", GAME_SOUNDFILE},
+ {"VOICESD.RSC", GAME_VOICEFILE}
+};
+
+// Inherit the Earth - Wyrmkeep Linux Demo version
+static GAME_FILEDESC ITELINDEMO_GameFiles[] = {
{"ITED.RSC", GAME_RESOURCEFILE},
{"SCRIPTSD.RSC", GAME_SCRIPTFILE},
{"SOUNDSD.RSC", GAME_SOUNDFILE},
@@ -83,8 +84,17 @@ static GAME_FONTDESC ITEWINDEMO_GameFonts[] = {
{GAME_FONT_SMALL, 2}
};
+// Inherit the Earth - Mac Wyrmkeep version
+static GAME_FILEDESC ITEMACCD_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE},
+ {"scripts.rsc", GAME_SCRIPTFILE},
+ {"sounds.rsc", GAME_SOUNDFILE},
+ {"Inherit the Earth Voices", GAME_VOICEFILE},
+ {"music.rsc", GAME_MUSICFILE}
+};
+
// Inherit the Earth - win32 Wyrmkeep Demo version older release
-static GAME_FILEDESC ITEWINDEMOOld_GameFiles[] = {
+static GAME_FILEDESC ITEWINDEMO1_GameFiles[] = {
{"ITED.RSC", GAME_RESOURCEFILE},
{"SCRIPTSD.RSC", GAME_SCRIPTFILE},
{"SOUNDSD.RSC", GAME_SOUNDFILE},
@@ -181,12 +191,74 @@ static GAME_SOUNDINFO IHNM_GameSound = {
GAME_SOUND_WAV, 0, 0, 0
};
+struct GAME_MD5 {
+ GAME_IDS id;
+ const char *md5;
+ const char *filename;
+ uint32 len;
+};
+
+static GAME_MD5 game_md5[] = {
+ { GID_ITE_DISK_G, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", 5000 },
+ { GID_ITE_DISK_G, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", 5000 },
+ { GID_ITE_DISK_G, "c46e4392fcd2e89bc91e5567db33b62d", "voices.rsc", 5000 },
+
+ { GID_ITE_CD_G, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", 5000 },
+ { GID_ITE_CD_G, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", 5000 },
+ { GID_ITE_CD_G, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", 5000 },
+ { GID_ITE_CD_G, "41bb6b95d792dde5196bdb78740895a6", "voices.rsc", 5000 },
+
+ { GID_ITE_DEMO_G, "986c79c4d2939dbe555576529fd37932", "ite.rsc", 5000 },
+ { GID_ITE_DEMO_G, "d5697dd3240a3ceaddaa986c47e1a2d7", "scripts.rsc", 5000 },
+ { GID_ITE_DEMO_G, "c58e67c506af4ffa03fd0aac2079deb0", "voices.rsc", 5000 },
+
+ { GID_ITE_MACCD, "4f7fa11c5175980ed593392838523060", "ite.rsc", 5000 },
+ { GID_ITE_MACCD, "adf1f46c1d0589083996a7060c798ad0", "scripts.rsc", 5000 },
+ { GID_ITE_MACCD, "1a91cd60169f367ecb6c6e058d899b2f", "music.rsc", 5000 },
+ { GID_ITE_MACCD, "95863b89a0916941f6c5e1789843ba14", "sounds.rsc", 5000 },
+ { GID_ITE_MACCD, "c14c4c995e7a0d3828e3812a494301b7", "Inherit the Earth Voices", 5000 },
+
+ { GID_ITE_DISK_DE, "869fc23c8f38f575979ec67152914fee", "ite.rsc", 5000 },
+ { GID_ITE_DISK_DE, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", 5000 },
+ { GID_ITE_DISK_DE, "0c9113e630f97ef0996b8c3114badb08", "voices.rsc", 5000 },
+
+ { GID_ITE_WINDEMO2, "3a450852cbf3c80773984d565647e6ac", "ited.rsc", 5000 },
+ { GID_ITE_WINDEMO2, "3f12b67fa93e56e1a6be39d2921d80bb", "scriptsd.rsc", 5000 },
+ { GID_ITE_WINDEMO2, "95a6c148e22e99a8c243f2978223583c", "soundsd.rsc", 5000 },
+ { GID_ITE_WINDEMO2, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", 5000 },
+
+ { GID_ITE_LINDEMO, "3a450852cbf3c80773984d565647e6ac", "ited.rsc", 5000 },
+ { GID_ITE_LINDEMO, "3f12b67fa93e56e1a6be39d2921d80bb", "scriptsd.rsc", 5000 },
+ { GID_ITE_LINDEMO, "d6454756517f042f01210458abe8edd4", "musicd.rsc", 5000 },
+ { GID_ITE_LINDEMO, "95a6c148e22e99a8c243f2978223583c", "soundsd.rsc", 5000 },
+ { GID_ITE_LINDEMO, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", 5000 },
+
+ { GID_ITE_MACDEMO2, "addfc9d82bc2fa1f4cab23743c652c08", "ited.rsc", 5000 },
+ { GID_ITE_MACDEMO2, "fded5c59b8b7c5976229f960d21e6b0b", "scriptsd.rsc", 5000 },
+ { GID_ITE_MACDEMO2, "495bdde51fd9f4bea2b9c911091b1ab2", "musicd.rsc", 5000 },
+ { GID_ITE_MACDEMO2, "b3a831fbed337d1f1300fee1dd474f6c", "soundsd.rsc", 5000 },
+ { GID_ITE_MACDEMO2, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", 5000 },
+
+ { GID_ITE_WINDEMO1, "3a450852cbf3c80773984d565647e6ac", "ited.rsc", 5000 },
+ { GID_ITE_WINDEMO1, "3f12b67fa93e56e1a6be39d2921d80bb", "scriptsd.rsc", 5000 },
+ { GID_ITE_WINDEMO1, "a741139dd7365a13f463cd896ff9969a", "soundsd.rsc", 5000 },
+ { GID_ITE_WINDEMO1, "0759eaf5b64ae19fd429920a70151ad3", "voicesd.rsc", 5000 },
+
+ { GID_ITE_MACDEMO1, "addfc9d82bc2fa1f4cab23743c652c08", "ited.rsc", 5000 },
+ { GID_ITE_MACDEMO1, "fded5c59b8b7c5976229f960d21e6b0b", "scriptsd.rsc", 5000 },
+ { GID_ITE_MACDEMO1, "1a91cd60169f367ecb6c6e058d899b2f", "musicd.rsc", 5000 },
+ { GID_ITE_MACDEMO1, "b3a831fbed337d1f1300fee1dd474f6c", "soundsd.rsc", 5000 },
+ { GID_ITE_MACDEMO1, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", 5000 },
+};
+
+static bool gameMD5check(int descNum);
+
static GAMEDESC GameDescs[] = {
// Inherit the earth - DOS Demo version
{
"ite-demo",
GType_ITE,
- GID_ITE_DEMO, // Game id
+ GID_ITE_DEMO_G, // Game id
"Inherit the Earth (DOS Demo)", // Game title
320, 200, // Logical resolution
137, // Scene viewport height
@@ -201,55 +273,108 @@ static GAMEDESC GameDescs[] = {
},
// Inherit the earth - MAC Demo version
- // Note: it should be before win32 version ???
{
"ite-demo",
GType_ITE,
- GID_ITE_MACDEMO,
+ GID_ITE_MACDEMO2,
"Inherit the Earth (MAC Demo)",
320, 200,
137,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMACDEMO_GameFiles),
- ITEMACDEMO_GameFiles,
+ ARRAYSIZE(ITEWINDEMO2_GameFiles),
+ ITEWINDEMO2_GameFiles,
+ ARRAYSIZE(ITEMACDEMO_GameFonts),
+ ITEMACDEMO_GameFonts,
+ &ITECD_GameSound,
+ GF_VOX_VOICES | GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES
+ },
+
+ // Inherit the earth - early MAC Demo version
+ {
+ "ite-demo",
+ GType_ITE,
+ GID_ITE_MACDEMO1,
+ "Inherit the Earth (early MAC Demo)",
+ 320, 200,
+ 137,
+ ITE_DEFAULT_SCENE,
+ &ITE_Resources,
+ ARRAYSIZE(ITEWINDEMO2_GameFiles),
+ ITEWINDEMO2_GameFiles,
+ ARRAYSIZE(ITEMACDEMO_GameFonts),
+ ITEMACDEMO_GameFonts,
+ &ITECD_GameSound,
+ GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES
+ },
+
+ // Inherit the earth - MAC CD Wyrmkeep version
+ {
+ "ite",
+ GType_ITE,
+ GID_ITE_MACCD,
+ "Inherit the Earth (MAC CD)",
+ 320, 200,
+ 137,
+ ITE_DEFAULT_SCENE,
+ &ITE_Resources,
+ ARRAYSIZE(ITEMACCD_GameFiles),
+ ITEMACCD_GameFiles,
ARRAYSIZE(ITEMACDEMO_GameFonts),
ITEMACDEMO_GameFonts,
&ITECD_GameSound,
- GF_VOX_VOICES | GF_BIG_ENDIAN_DATA
+ GF_BIG_ENDIAN_DATA | GF_MAC_RESOURCES
},
// Inherit the earth - Linux Demo version
- // Note: it should be before win32 version
+ // Note: it should be before GID_ITE_WINDEMO2 version
{
"ite-demo",
GType_ITE,
- GID_ITE_WINDEMO,
+ GID_ITE_LINDEMO,
"Inherit the Earth (Linux Demo)",
320, 200,
137,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEWINDEMO_GameFiles),
- ITEWINDEMO_GameFiles,
+ ARRAYSIZE(ITELINDEMO_GameFiles),
+ ITELINDEMO_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
GF_VOX_VOICES
},
- // Inherit the earth - Win32 Demo version
+ // Inherit the earth - Linux Demo version
{
"ite-demo",
GType_ITE,
- GID_ITE_WINDEMO,
+ GID_ITE_WINDEMO2,
"Inherit the Earth (Win32 Demo)",
320, 200,
137,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEWINDEMOOld_GameFiles),
- ITEWINDEMO_GameFiles,
+ ARRAYSIZE(ITEWINDEMO2_GameFiles),
+ ITEWINDEMO2_GameFiles,
+ ARRAYSIZE(ITECD_GameFonts),
+ ITECD_GameFonts,
+ &ITECD_GameSound,
+ GF_VOX_VOICES
+ },
+
+ // Inherit the earth - Win32 Demo version
+ {
+ "ite-demo",
+ GType_ITE,
+ GID_ITE_WINDEMO1,
+ "Inherit the Earth (early Win32 Demo)",
+ 320, 200,
+ 137,
+ ITE_DEFAULT_SCENE,
+ &ITE_Resources,
+ ARRAYSIZE(ITEWINDEMO1_GameFiles),
+ ITEWINDEMO1_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITECD_GameSound,
@@ -257,12 +382,11 @@ static GAMEDESC GameDescs[] = {
},
// Inherit the earth - CD version
- // NOTE: it should be before floppy version
{
"ite",
GType_ITE,
- GID_ITE_CD,
- "Inherit the Earth (DOS CD Version)",
+ GID_ITE_CD_G,
+ "Inherit the Earth (DOS/Win32 CD Version)",
320, 200,
137,
ITE_DEFAULT_SCENE,
@@ -275,12 +399,30 @@ static GAMEDESC GameDescs[] = {
0
},
+ // Inherit the earth - German Floppy version
+ {
+ "ite",
+ GType_ITE,
+ GID_ITE_DISK_DE,
+ "Inherit the Earth (De DOS Floppy)",
+ 320, 200,
+ 137,
+ ITE_DEFAULT_SCENE,
+ &ITE_Resources,
+ ARRAYSIZE(ITEDISK_GameFiles),
+ ITEDISK_GameFiles,
+ ARRAYSIZE(ITEDISK_GameFonts),
+ ITEDISK_GameFonts,
+ &ITE_GameSound,
+ GF_LANG_DE
+ },
+
// Inherit the earth - Disk version
{
"ite",
GType_ITE,
- GID_ITE_DISK,
- "Inherit the Earth (DOS)",
+ GID_ITE_DISK_G,
+ "Inherit the Earth (DOS Floppy)",
320, 200,
137,
ITE_DEFAULT_SCENE,
@@ -481,6 +623,10 @@ int SagaEngine::detectGame(uint16 *game_n_p) {
// game
if (file_missing) {
continue;
+ } else {
+ debug(0, "Pre-Found game: %s", GameDescs[game_n].gd_title);
+ if (!gameMD5check(game_n))
+ continue;
}
debug(0, "Found game: %s", GameDescs[game_n].gd_title);
@@ -505,6 +651,10 @@ int SagaEngine::loadGame(uint16 game_n) {
GameModule.game_number = game_n;
GameModule.gamedesc = &GameDescs[game_n];
+ _gameId = GameModule.gamedesc->gd_game_id;
+ _gameType = GameModule.gamedesc->gd_game_type;
+ _features = GameModule.gamedesc->features;
+
game_filect = GameDescs[game_n].gd_filect;
GameModule.gfile_data = (GAME_FILEDATA *)malloc(game_filect * sizeof *GameModule.gfile_data);
@@ -532,10 +682,6 @@ int SagaEngine::loadGame(uint16 game_n) {
GameModule.gd_fontct = GameDescs[game_n].gd_fontct;
GameModule.gd_fontdescs = GameDescs[game_n].gd_fontdescs;
- _gameId = GameModule.gamedesc->gd_game_id;
- _gameType = GameModule.gamedesc->gd_game_type;
- _features = GameModule.gamedesc->features;
-
return SUCCESS;
}
@@ -579,4 +725,32 @@ int SagaEngine::getSceneInfo(GAME_SCENEDESC *gs_desc) {
return SUCCESS;
}
+static bool gameMD5check(int descNum) {
+ bool result = true;
+ char md5str[32+1];
+ uint8 md5sum[16];
+
+ for (int i = 0; i < ARRAYSIZE(game_md5); i++) {
+ if (game_md5[i].id == GameDescs[descNum].gd_game_id) {
+ if (md5_file(game_md5[i].filename, md5sum, NULL, game_md5[i].len)) {
+ for (int j = 0; j < 16; j++) {
+ sprintf(md5str + j*2, "%02x", (int)md5sum[j]);
+ }
+
+ if (strcmp(game_md5[i].md5, md5str)) {
+ result = false;
+ debug(0, "!MD5 for %s wrong", game_md5[i].filename);
+ break;
+ } else {
+ debug(0, "MD5 for %s correct", game_md5[i].filename);
+ }
+ } else {
+ result = false;
+ }
+ }
+ }
+
+ return result;
+}
+
} // End of namespace Saga