aboutsummaryrefslogtreecommitdiff
path: root/engines/saga
diff options
context:
space:
mode:
authorAndrew Kurushin2006-03-27 16:56:08 +0000
committerAndrew Kurushin2006-03-27 16:56:08 +0000
commit7191d474a463a2821ce8cdb1c89b5481416985a0 (patch)
tree48fe9611e68edd3a251dfc004a93339e10f2367b /engines/saga
parent017bcdb44510aeadfa1cf1327b9889da22443fa2 (diff)
downloadscummvm-rg350-7191d474a463a2821ce8cdb1c89b5481416985a0.tar.gz
scummvm-rg350-7191d474a463a2821ce8cdb1c89b5481416985a0.tar.bz2
scummvm-rg350-7191d474a463a2821ce8cdb1c89b5481416985a0.zip
improve game detection:
- start process speedup (remove already scanned files) - merge md5 & game files list svn-id: r21468
Diffstat (limited to 'engines/saga')
-rw-r--r--engines/saga/game.cpp975
-rw-r--r--engines/saga/saga.h8
2 files changed, 426 insertions, 557 deletions
diff --git a/engines/saga/game.cpp b/engines/saga/game.cpp
index 5d6aa1efed..ddd365a80e 100644
--- a/engines/saga/game.cpp
+++ b/engines/saga/game.cpp
@@ -49,7 +49,7 @@
#define IHNM_CONVERSE_TEXT_LINES 10
namespace Saga {
-static DetectedGameList GAME_ProbeGame(const FSList &fslist, int **matches = NULL);
+static DetectedGameList GAME_detectGames(const FSList &fslist);
}
static const PlainGameDescriptor saga_games[] = {
@@ -81,7 +81,7 @@ GameDescriptor Engine_SAGA_findGameID(const char *gameid) {
}
DetectedGameList Engine_SAGA_detectGames(const FSList &fslist) {
- return Saga::GAME_ProbeGame(fslist);
+ return Saga::GAME_detectGames(fslist);
}
Engine *Engine_SAGA_create(GameDetector *detector, OSystem *syst) {
@@ -92,8 +92,6 @@ REGISTER_PLUGIN(SAGA, "SAGA Engine")
namespace Saga {
-static int detectGame(const FSList &fslist, bool mode = false, int start = -1);
-
// ITE section
static PanelButton ITE_MainPanelButtons[] = {
{kPanelButtonVerb, 52,4, 57,10, kVerbITEWalkTo,'w',0, 0,1,0},
@@ -264,11 +262,11 @@ static GameResourceDescription ITEDemo_Resources = {
};
// Inherit the Earth - DOS Demo version
-static GameFileDescription ITEDEMO_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- //{"ite.dmo", GAME_DEMOFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE}
+static GameFileDescription ITE_DEMO_G_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "986c79c4d2939dbe555576529fd37932"},
+ //{"ite.dmo", GAME_DEMOFILE}, "0b9a70eb4e120b6f00579b46c8cae29e"
+ {"scripts.rsc", GAME_SCRIPTFILE, "d5697dd3240a3ceaddaa986c47e1a2d7"},
+ {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE, "c58e67c506af4ffa03fd0aac2079deb0"}
};
static GameFontDescription ITEDEMO_GameFonts[] = {
@@ -286,11 +284,19 @@ static GameSoundInfo ITEDEMO_GameSound = {
};
// Inherit the Earth - Wyrmkeep Win32 Demo version
-static GameFileDescription ITEWINDEMO_GameFiles[] = {
- {"ited.rsc", GAME_RESOURCEFILE},
- {"scriptsd.rsc", GAME_SCRIPTFILE},
- {"soundsd.rsc", GAME_SOUNDFILE},
- {"voicesd.rsc", GAME_VOICEFILE}
+
+static GameFileDescription ITE_WINDEMO2_GameFiles[] = {
+ {"ited.rsc", GAME_RESOURCEFILE, "3a450852cbf3c80773984d565647e6ac"},
+ {"scriptsd.rsc", GAME_SCRIPTFILE, "3f12b67fa93e56e1a6be39d2921d80bb"},
+ {"soundsd.rsc", GAME_SOUNDFILE, "95a6c148e22e99a8c243f2978223583c"},
+ {"voicesd.rsc", GAME_VOICEFILE, "e139d86bab2ee8ba3157337f894a92d4"}
+};
+
+static GameFileDescription ITE_WINDEMO1_GameFiles[] = {
+ {"ited.rsc", GAME_RESOURCEFILE, "3a450852cbf3c80773984d565647e6ac"},
+ {"scriptsd.rsc", GAME_SCRIPTFILE, "3f12b67fa93e56e1a6be39d2921d80bb"},
+ {"soundsd.rsc", GAME_SOUNDFILE, "a741139dd7365a13f463cd896ff9969a"},
+ {"voicesd.rsc", GAME_VOICEFILE, "0759eaf5b64ae19fd429920a70151ad3"}
};
static GameFontDescription ITEWINDEMO_GameFonts[] = {
@@ -326,12 +332,20 @@ static GameSoundInfo ITEWINDEMO2_GameSound = {
};
// Inherit the Earth - Wyrmkeep Mac Demo version
-static GameFileDescription ITEMACDEMO_GameFiles[] = {
- {"ited.rsc", GAME_RESOURCEFILE},
- {"scriptsd.rsc", GAME_SCRIPTFILE},
- {"soundsd.rsc", GAME_SOUNDFILE},
- {"voicesd.rsc", GAME_VOICEFILE},
- {"musicd.rsc", GAME_MUSICFILE}
+static GameFileDescription ITE_MACDEMO2_GameFiles[] = {
+ {"ited.rsc", GAME_RESOURCEFILE, "addfc9d82bc2fa1f4cab23743c652c08"},
+ {"scriptsd.rsc", GAME_SCRIPTFILE, "fded5c59b8b7c5976229f960d21e6b0b"},
+ {"soundsd.rsc", GAME_SOUNDFILE, "b3a831fbed337d1f1300fee1dd474f6c"},
+ {"voicesd.rsc", GAME_VOICEFILE, "e139d86bab2ee8ba3157337f894a92d4"},
+ {"musicd.rsc", GAME_MUSICFILE, "495bdde51fd9f4bea2b9c911091b1ab2"}
+};
+
+static GameFileDescription ITE_MACDEMO1_GameFiles[] = {
+ {"ited.rsc", GAME_RESOURCEFILE, "addfc9d82bc2fa1f4cab23743c652c08"},
+ {"scriptsd.rsc", GAME_SCRIPTFILE, "fded5c59b8b7c5976229f960d21e6b0b"},
+ {"soundsd.rsc", GAME_SOUNDFILE, "b3a831fbed337d1f1300fee1dd474f6c"},
+ {"voicesd.rsc", GAME_VOICEFILE, "e139d86bab2ee8ba3157337f894a92d4"},
+ {"musicd.rsc", GAME_MUSICFILE, "1a91cd60169f367ecb6c6e058d899b2f"}
};
static GameSoundInfo ITEMACDEMO_GameVoice = {
@@ -362,12 +376,12 @@ static GameSoundInfo ITEMACDEMO_GameMusic = {
};
// Inherit the Earth - Wyrmkeep Linux Demo version
-static GameFileDescription ITELINDEMO_GameFiles[] = {
- {"ited.rsc", GAME_RESOURCEFILE},
- {"scriptsd.rsc", GAME_SCRIPTFILE},
- {"soundsd.rsc", GAME_SOUNDFILE},
- {"voicesd.rsc", GAME_VOICEFILE},
- {"musicd.rsc", GAME_MUSICFILE}
+static GameFileDescription ITE_LINDEMO_GameFiles[] = {
+ {"ited.rsc", GAME_RESOURCEFILE, "3a450852cbf3c80773984d565647e6ac"},
+ {"scriptsd.rsc", GAME_SCRIPTFILE, "3f12b67fa93e56e1a6be39d2921d80bb"},
+ {"soundsd.rsc", GAME_SOUNDFILE, "95a6c148e22e99a8c243f2978223583c"},
+ {"voicesd.rsc", GAME_VOICEFILE, "e139d86bab2ee8ba3157337f894a92d4"},
+ {"musicd.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
};
static GameSoundInfo ITELINDEMO_GameMusic = {
@@ -380,12 +394,13 @@ static GameSoundInfo ITELINDEMO_GameMusic = {
};
// Inherit the Earth - Wyrmkeep Linux version
-static GameFileDescription ITELINCD_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"sounds.rsc", GAME_SOUNDFILE},
- {"voices.rsc", GAME_VOICEFILE},
- {"music.rsc", GAME_MUSICFILE}
+
+static GameFileDescription ITE_LINCD_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "a891405405edefc69c9d6c420c868b84"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "41bb6b95d792dde5196bdb78740895a6"},
+ {"music.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
};
// Inherit the Earth - Wyrmkeep combined Windows/Mac/Linux version. This
@@ -394,20 +409,20 @@ static GameFileDescription ITELINCD_GameFiles[] = {
// modified to include the Wyrmkeep changes. The resource files are little-
// endian, except for the voice file which is big-endian.
-static GameFileDescription ITEMULTICD_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"sounds.rsc", GAME_SOUNDFILE},
- {"Inherit the Earth Voices", GAME_VOICEFILE | GAME_SWAPENDIAN},
- {"music.rsc", GAME_MUSICFILE}
+static GameFileDescription ITE_MULTICD_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "a6433e34b97b15e64fe8214651012db9"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "a891405405edefc69c9d6c420c868b84"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"inherit the earth voices", GAME_VOICEFILE | GAME_SWAPENDIAN, "c14c4c995e7a0d3828e3812a494301b7"},
+ {"music.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
};
-static GameFileDescription ITEMACCD_G_GameFiles[] = {
- {"ITE Resources.bin", GAME_RESOURCEFILE | GAME_MACBINARY},
- {"ITE Scripts.bin", GAME_SCRIPTFILE | GAME_MACBINARY},
- {"ITE Sounds.bin", GAME_SOUNDFILE | GAME_MACBINARY},
- {"ITE Music.bin", GAME_MUSICFILE_GM | GAME_MACBINARY},
- {"ITE Voices.bin", GAME_VOICEFILE | GAME_MACBINARY}
+static GameFileDescription ITE_MACCD_G_GameFiles[] = {
+ {"ite resources.bin", GAME_RESOURCEFILE | GAME_MACBINARY, "0bd506aa887bfc7965f695c6bd28237d"},
+ {"ite scripts.bin", GAME_SCRIPTFILE | GAME_MACBINARY, "af0d7a2588e09ad3ecbc5b474ea238bf"},
+ {"ite sounds.bin", GAME_SOUNDFILE | GAME_MACBINARY, "441426c6bb2a517f65c7e49b57f7a345"},
+ {"ite music.bin", GAME_MUSICFILE_GM | GAME_MACBINARY, "c1d20324b7cdf1650e67061b8a93251c"},
+ {"ite voices.bin", GAME_VOICEFILE | GAME_MACBINARY, "dba92ae7d57e942250fe135609708369"}
};
static GameSoundInfo ITEMACCD_G_GameSound = {
@@ -420,12 +435,12 @@ static GameSoundInfo ITEMACCD_G_GameSound = {
};
// Inherit the Earth - Mac Wyrmkeep version
-static GameFileDescription ITEMACCD_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"sounds.rsc", GAME_SOUNDFILE},
- {"Inherit the Earth Voices", GAME_VOICEFILE},
- {"music.rsc", GAME_MUSICFILE}
+static GameFileDescription ITE_MACCD_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "4f7fa11c5175980ed593392838523060"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "adf1f46c1d0589083996a7060c798ad0"},
+ {"sounds.rsc", GAME_SOUNDFILE, "95863b89a0916941f6c5e1789843ba14"},
+ {"inherit the earth voices", GAME_VOICEFILE, "c14c4c995e7a0d3828e3812a494301b7"},
+ {"music.rsc", GAME_MUSICFILE, "1a91cd60169f367ecb6c6e058d899b2f"}
};
static GameSoundInfo ITEMACCD_GameSound = {
@@ -447,17 +462,30 @@ static GameSoundInfo ITEMACCD_GameMusic = {
};
// Inherit the Earth - Diskette version
-static GameFileDescription ITEDISK_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE}
+static GameFileDescription ITE_DISK_DE_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "869fc23c8f38f575979ec67152914fee"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "516f7330f8410057b834424ea719d1ef"},
+ {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE, "0c9113e630f97ef0996b8c3114badb08"}
+};
+
+static GameFileDescription ITE_DISK_G_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "516f7330f8410057b834424ea719d1ef"},
+ {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE, "c46e4392fcd2e89bc91e5567db33b62d"}
};
-static GameFileDescription ITEDISK2_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE},
- {"music.rsc", GAME_MUSICFILE}
+static GameFileDescription ITE_DISK_DE2_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "869fc23c8f38f575979ec67152914fee"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "516f7330f8410057b834424ea719d1ef"},
+ {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE, "0c9113e630f97ef0996b8c3114badb08"},
+ {"music.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
+};
+
+static GameFileDescription ITE_DISK_G2_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "516f7330f8410057b834424ea719d1ef"},
+ {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE, "c46e4392fcd2e89bc91e5567db33b62d"},
+ {"music.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
};
static GameFontDescription ITEDISK_GameFonts[] = {
@@ -476,21 +504,53 @@ static GameSoundInfo ITEDISK_GameSound = {
};
// Inherit the Earth - CD Enhanced version
-static GameFileDescription ITECD_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"sounds.rsc", GAME_SOUNDFILE},
- {"voices.rsc", GAME_VOICEFILE}
+static GameFileDescription ITE_WINCD_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "a891405405edefc69c9d6c420c868b84"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "41bb6b95d792dde5196bdb78740895a6"}
+};
+
+static GameFileDescription ITE_CD_G_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "50a0d2d7003c926a3832d503c8534e90"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "41bb6b95d792dde5196bdb78740895a6"}
+};
+
+// reported by mld. Bestsellergamers cover disk
+static GameFileDescription ITE_CD_DE_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "869fc23c8f38f575979ec67152914fee"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "a891405405edefc69c9d6c420c868b84"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "2fbad5d10b9b60a3415dc4aebbb11718"}
+};
+
+static GameFileDescription ITE_CD_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "a891405405edefc69c9d6c420c868b84"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "41bb6b95d792dde5196bdb78740895a6"}
+};
+
+
+static GameFileDescription ITE_CD_G2_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "8f4315a9bb10ec839253108a032c8b54"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "50a0d2d7003c926a3832d503c8534e90"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "41bb6b95d792dde5196bdb78740895a6"},
+ {"music.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
};
-static GameFileDescription ITECD2_GameFiles[] = {
- {"ite.rsc", GAME_RESOURCEFILE},
- {"scripts.rsc", GAME_SCRIPTFILE},
- {"sounds.rsc", GAME_SOUNDFILE},
- {"voices.rsc", GAME_VOICEFILE},
- {"music.rsc", GAME_MUSICFILE}
+static GameFileDescription ITE_CD_DE2_GameFiles[] = {
+ {"ite.rsc", GAME_RESOURCEFILE, "869fc23c8f38f575979ec67152914fee"},
+ {"scripts.rsc", GAME_SCRIPTFILE, "a891405405edefc69c9d6c420c868b84"},
+ {"sounds.rsc", GAME_SOUNDFILE, "e2ccb61c325d6d1ead3be0e731fe29fe"},
+ {"voices.rsc", GAME_VOICEFILE, "2fbad5d10b9b60a3415dc4aebbb11718"},
+ {"music.rsc", GAME_MUSICFILE, "d6454756517f042f01210458abe8edd4"}
};
+
static GameFontDescription ITECD_GameFonts[] = {
{2},
{0},
@@ -720,44 +780,94 @@ static GameResourceDescription IHNM_Resources = {
};
// I Have No Mouth and I Must Scream - Demo version
-static GameFileDescription IHNMDEMO_GameFiles[] = {
- {"scream.res", GAME_RESOURCEFILE},
- {"scripts.res", GAME_SCRIPTFILE},
- {"sfx.res", GAME_SOUNDFILE},
- {"voicesd.res", GAME_VOICEFILE}
+static GameFileDescription IHNM_DEMO_GameFiles[] = {
+ {"scream.res", GAME_RESOURCEFILE, "46bbdc65d164ba7e89836a0935eec8e6"},
+ {"scripts.res", GAME_SCRIPTFILE, "9626bda8978094ff9b29198bc1ed5f9a"},
+ {"sfx.res", GAME_SOUNDFILE, "1c610d543f32ec8b525e3f652536f269"},
+ {"voicesd.res", GAME_VOICEFILE, "3bbc16a8f741dbb511da506c660a0b54"}
};
// I Have No Mouth and I Must Scream - Retail CD version
-static GameFileDescription IHNMCD_GameFiles[] = {
- {"musicfm.res", GAME_MUSICFILE_FM},
- {"musicgm.res", GAME_MUSICFILE_GM},
- {"scream.res", GAME_RESOURCEFILE},
- {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE},
- {"scripts.res", GAME_SCRIPTFILE},
- {"sfx.res", GAME_SOUNDFILE},
- {"voicess.res", GAME_VOICEFILE}, //order of voice bank file is important
- {"voices1.res", GAME_VOICEFILE},
- {"voices2.res", GAME_VOICEFILE},
- {"voices3.res", GAME_VOICEFILE},
- {"voices4.res", GAME_VOICEFILE},
- {"voices5.res", GAME_VOICEFILE},
- {"voices6.res", GAME_VOICEFILE}
+
+static GameFileDescription IHNM_CD_GameFiles[] = {
+ {"musicfm.res", GAME_MUSICFILE_FM, "0439083e3dfdc51b486071d45872ae52"},
+ {"musicgm.res", GAME_MUSICFILE_GM, "80f875a1fb384160d1f4b27166eef583"},
+ {"scream.res", GAME_RESOURCEFILE, "46bbdc65d164ba7e89836a0935eec8e6"},
+ {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE, "58b79e61594779513c7f2d35509fa89e"},
+ {"scripts.res", GAME_SCRIPTFILE, "be38bbc5a26be809dbf39f13befebd01"},
+ {"sfx.res", GAME_SOUNDFILE, "1c610d543f32ec8b525e3f652536f269"},
+ {"voicess.res", GAME_VOICEFILE, "54b1f2013a075338ceb0e258d97808bd"}, //order of voice bank file is important
+ {"voices1.res", GAME_VOICEFILE, "fc6440b38025f4b2cc3ff55c3da5c3eb"},
+ {"voices2.res", GAME_VOICEFILE, "b37f10fd1696ade7d58704ccaaebceeb"},
+ {"voices3.res", GAME_VOICEFILE, "3bbc16a8f741dbb511da506c660a0b54"},
+ {"voices4.res", GAME_VOICEFILE, "ebfa160122d2247a676ca39920e5d481"},
+ {"voices5.res", GAME_VOICEFILE, "1f501ce4b72392bdd1d9ec38f6eec6da"},
+ {"voices6.res", GAME_VOICEFILE, "f580ed7568c7d6ef34e934ba20adf834"}
+};
+
+static GameFileDescription IHNM_CD_ES_GameFiles[] = {
+ {"musicfm.res", GAME_MUSICFILE_FM, "0439083e3dfdc51b486071d45872ae52"},
+ {"musicgm.res", GAME_MUSICFILE_GM, "80f875a1fb384160d1f4b27166eef583"},
+ {"scream.res", GAME_RESOURCEFILE, "c92370d400e6f2a3fc411c3729d09224"},
+ {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE, "58b79e61594779513c7f2d35509fa89e"},
+ {"scripts.res", GAME_SCRIPTFILE, "be38bbc5a26be809dbf39f13befebd01"},
+ {"sfx.res", GAME_SOUNDFILE, "1c610d543f32ec8b525e3f652536f269"},
+ {"voicess.res", GAME_VOICEFILE, "d869de9883c8faea7f687217a9ec7057"}, //order of voice bank file is important
+ {"voices1.res", GAME_VOICEFILE, "dc6a34e3d1668730ea46815a92c7847f"},
+ {"voices2.res", GAME_VOICEFILE, "dc6a5fa7a4cdc2ca5a6fd924e969986c"},
+ {"voices3.res", GAME_VOICEFILE, "dc6a5fa7a4cdc2ca5a6fd924e969986c"},
+ {"voices4.res", GAME_VOICEFILE, "0f87400b804232a58dd22e404420cc45"},
+ {"voices5.res", GAME_VOICEFILE, "172668cfc5d8c305cb5b1a9b4d995fc0"},
+ {"voices6.res", GAME_VOICEFILE, "96c9bda9a5f41d6bc232ed7bf6d371d9"}
+};
+
+static GameFileDescription IHNM_CD_RU_GameFiles[] = {
+ {"musicfm.res", GAME_MUSICFILE_FM, "0439083e3dfdc51b486071d45872ae52"},
+ {"musicgm.res", GAME_MUSICFILE_GM, "80f875a1fb384160d1f4b27166eef583"},
+ {"scream.res", GAME_RESOURCEFILE, "46bbdc65d164ba7e89836a0935eec8e6"},
+ {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE, "58b79e61594779513c7f2d35509fa89e"},
+ {"scripts.res", GAME_SCRIPTFILE, "be38bbc5a26be809dbf39f13befebd01"},
+ {"sfx.res", GAME_SOUNDFILE, "1c610d543f32ec8b525e3f652536f269"},
+ {"voicess.res", GAME_VOICEFILE, "9df7cd3b18ddaa16b5291b3432567036"}, //order of voice bank file is important
+ {"voices1.res", GAME_VOICEFILE, "d6100d2dc3b2b9f2e1ad247f613dce9b"},
+ {"voices2.res", GAME_VOICEFILE, "84f6f48ecc2832841ea6417a9a379430"},
+ {"voices3.res", GAME_VOICEFILE, "ebb9501283047f27a0f54e27b3c8ba1e"},
+ {"voices4.res", GAME_VOICEFILE, "4c145da5fa6d1306162a7ca8ce5a4f2e"},
+ {"voices5.res", GAME_VOICEFILE, "871a559644281917677eca4af1b05620"},
+ {"voices6.res", GAME_VOICEFILE, "211be5c24f066d69a2f6cfa953acfba6"}
};
// I Have No Mouth and I Must Scream - Censored CD version (without Nimdok)
-static GameFileDescription IHNMCD_Censored_GameFiles[] = {
- {"musicfm.res", GAME_MUSICFILE_FM},
- {"musicgm.res", GAME_MUSICFILE_GM},
- {"scream.res", GAME_RESOURCEFILE},
- {"scripts.res", GAME_SCRIPTFILE},
- {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE},
- {"sfx.res", GAME_SOUNDFILE},
- {"voicess.res", GAME_VOICEFILE}, //order of voice bank file is important
- {"voices1.res", GAME_VOICEFILE},
- {"voices2.res", GAME_VOICEFILE},
- {"voices3.res", GAME_VOICEFILE},
- {"voices5.res", GAME_VOICEFILE},
- {"voices6.res", GAME_VOICEFILE}
+
+// Reported by mld. German Retail
+static GameFileDescription IHNM_CD_DE_GameFiles[] = {
+ {"musicfm.res", GAME_MUSICFILE_FM, "0439083e3dfdc51b486071d45872ae52"},
+ {"musicgm.res", GAME_MUSICFILE_GM, "80f875a1fb384160d1f4b27166eef583"},
+ {"scream.res", GAME_RESOURCEFILE, "c92370d400e6f2a3fc411c3729d09224"},
+ {"scripts.res", GAME_SCRIPTFILE, "32aa01a89937520fe0ea513950117292"},
+ {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE, "58b79e61594779513c7f2d35509fa89e"},
+ {"sfx.res", GAME_SOUNDFILE, "1c610d543f32ec8b525e3f652536f269"},
+ {"voicess.res", GAME_VOICEFILE, "8b09a196a52627cacb4eab13bfe0b2c3"}, //order of voice bank file is important
+ {"voices1.res", GAME_VOICEFILE, "424971e1e2373187c3f5734fe36071a2"},
+ {"voices2.res", GAME_VOICEFILE, "c270e0980782af43641a86e4a14e2a32"},
+ {"voices3.res", GAME_VOICEFILE, "49e42befea883fd101ec3d0f5d0647b9"},
+ {"voices5.res", GAME_VOICEFILE, "c477443c52a0aa56e686ebd8d051e4ab"},
+ {"voices6.res", GAME_VOICEFILE, "8b09a196a52627cacb4eab13bfe0b2c3"}
+};
+
+static GameFileDescription IHNM_CD_FR_GameFiles[] = {
+ {"musicfm.res", GAME_MUSICFILE_FM, "0439083e3dfdc51b486071d45872ae52"},
+ {"musicgm.res", GAME_MUSICFILE_GM, "80f875a1fb384160d1f4b27166eef583"},
+ {"scream.res", GAME_RESOURCEFILE, "c92370d400e6f2a3fc411c3729d09224"},
+ {"scripts.res", GAME_SCRIPTFILE, "32aa01a89937520fe0ea513950117292"},
+ {"patch.re_", GAME_PATCHFILE | GAME_RESOURCEFILE, "58b79e61594779513c7f2d35509fa89e"},
+ {"sfx.res", GAME_SOUNDFILE, "1c610d543f32ec8b525e3f652536f269"},
+ {"voicess.res", GAME_VOICEFILE, "b8642e943bbebf89cef2f48b31cb4305"}, //order of voice bank file is important
+ {"voices1.res", GAME_VOICEFILE, "424971e1e2373187c3f5734fe36071a2"},
+ {"voices2.res", GAME_VOICEFILE, "c2d93a35d2c2def9c3d6d242576c794b"},
+ {"voices3.res", GAME_VOICEFILE, "49e42befea883fd101ec3d0f5d0647b9"},
+ {"voices5.res", GAME_VOICEFILE, "f4c415de7c03de86b73f9a12b8bd632f"},
+ {"voices6.res", GAME_VOICEFILE, "3fc5358a5d8eee43bdfab2740276572e"}
};
static GameFontDescription IHNMDEMO_GameFonts[] = {
@@ -785,199 +895,8 @@ static GameSoundInfo IHNM_GameSound = {
true
};
-struct GameMD5 {
- GameIds id;
- const char *md5;
- const char *filename;
- bool caseSensitive;
-};
-
#define FILE_MD5_BYTES 5000
-static GameMD5 gameMD5[] = {
- { GID_ITE_DISK_G, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_DISK_G, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false },
- { GID_ITE_DISK_G, "c46e4392fcd2e89bc91e5567db33b62d", "voices.rsc", false },
-
- { GID_ITE_DISK_G2, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_DISK_G2, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false },
- { GID_ITE_DISK_G2, "c46e4392fcd2e89bc91e5567db33b62d", "voices.rsc", false },
- { GID_ITE_DISK_G2, "d6454756517f042f01210458abe8edd4", "music.rsc", false },
-
- { GID_ITE_CD_G, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_CD_G, "50a0d2d7003c926a3832d503c8534e90", "scripts.rsc", false },
- { GID_ITE_CD_G, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_CD_G, "41bb6b95d792dde5196bdb78740895a6", "voices.rsc", false },
-
- { GID_ITE_CD_G2, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_CD_G2, "50a0d2d7003c926a3832d503c8534e90", "scripts.rsc", false },
- { GID_ITE_CD_G2, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_CD_G2, "41bb6b95d792dde5196bdb78740895a6", "voices.rsc", false },
- { GID_ITE_CD_G2, "d6454756517f042f01210458abe8edd4", "music.rsc", false },
-
- { GID_ITE_CD, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_CD, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", false },
- { GID_ITE_CD, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_CD, "41bb6b95d792dde5196bdb78740895a6", "voices.rsc", false },
-
- // reported by mld. Bestsellergamers cover disk
- { GID_ITE_CD_DE, "869fc23c8f38f575979ec67152914fee", "ite.rsc", false },
- { GID_ITE_CD_DE, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", false },
- { GID_ITE_CD_DE, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_CD_DE, "2fbad5d10b9b60a3415dc4aebbb11718", "voices.rsc", false },
-
- { GID_ITE_CD_DE2, "869fc23c8f38f575979ec67152914fee", "ite.rsc", false },
- { GID_ITE_CD_DE2, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", false },
- { GID_ITE_CD_DE2, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_CD_DE2, "2fbad5d10b9b60a3415dc4aebbb11718", "voices.rsc", false },
- { GID_ITE_CD_DE2, "d6454756517f042f01210458abe8edd4", "music.rsc", false },
-
- { GID_ITE_DEMO_G, "986c79c4d2939dbe555576529fd37932", "ite.rsc", false },
- { GID_ITE_DEMO_G, "d5697dd3240a3ceaddaa986c47e1a2d7", "scripts.rsc", false },
- { GID_ITE_DEMO_G, "c58e67c506af4ffa03fd0aac2079deb0", "voices.rsc", false },
- { GID_ITE_DEMO_G, "0b9a70eb4e120b6f00579b46c8cae29e", "ite.dmo", false },
-
- { GID_ITE_WINCD, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_WINCD, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", false },
- { GID_ITE_WINCD, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_WINCD, "41bb6b95d792dde5196bdb78740895a6", "voices.rsc", false },
-
- { GID_ITE_MACCD, "4f7fa11c5175980ed593392838523060", "ite.rsc", false },
- { GID_ITE_MACCD, "adf1f46c1d0589083996a7060c798ad0", "scripts.rsc", false },
- { GID_ITE_MACCD, "1a91cd60169f367ecb6c6e058d899b2f", "music.rsc", false },
- { GID_ITE_MACCD, "95863b89a0916941f6c5e1789843ba14", "sounds.rsc", false },
- { GID_ITE_MACCD, "c14c4c995e7a0d3828e3812a494301b7", "Inherit the Earth Voices", true },
-
- { GID_ITE_MACCD_G, "0bd506aa887bfc7965f695c6bd28237d", "ITE Resources.bin", true },
- { GID_ITE_MACCD_G, "af0d7a2588e09ad3ecbc5b474ea238bf", "ITE Scripts.bin", true },
- { GID_ITE_MACCD_G, "c1d20324b7cdf1650e67061b8a93251c", "ITE Music.bin", true },
- { GID_ITE_MACCD_G, "441426c6bb2a517f65c7e49b57f7a345", "ITE Sounds.bin", true },
- { GID_ITE_MACCD_G, "dba92ae7d57e942250fe135609708369", "ITE Voices.bin", true },
-
- { GID_ITE_LINCD, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
- { GID_ITE_LINCD, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", false },
- { GID_ITE_LINCD, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_LINCD, "41bb6b95d792dde5196bdb78740895a6", "voices.rsc", false },
- { GID_ITE_LINCD, "d6454756517f042f01210458abe8edd4", "music.rsc", false },
-
- { GID_ITE_MULTICD, "a6433e34b97b15e64fe8214651012db9", "ite.rsc", false },
- { GID_ITE_MULTICD, "a891405405edefc69c9d6c420c868b84", "scripts.rsc", false },
- { GID_ITE_MULTICD, "e2ccb61c325d6d1ead3be0e731fe29fe", "sounds.rsc", false },
- { GID_ITE_MULTICD, "c14c4c995e7a0d3828e3812a494301b7", "Inherit the Earth Voices", true },
- { GID_ITE_MULTICD, "d6454756517f042f01210458abe8edd4", "music.rsc", false },
-
- { GID_ITE_DISK_DE, "869fc23c8f38f575979ec67152914fee", "ite.rsc", false },
- { GID_ITE_DISK_DE, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false },
- { GID_ITE_DISK_DE, "0c9113e630f97ef0996b8c3114badb08", "voices.rsc", false },
-
- { GID_ITE_DISK_DE2, "869fc23c8f38f575979ec67152914fee", "ite.rsc", false },
- { GID_ITE_DISK_DE2, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false },
- { GID_ITE_DISK_DE2, "0c9113e630f97ef0996b8c3114badb08", "voices.rsc", false },
- { GID_ITE_DISK_DE2, "d6454756517f042f01210458abe8edd4", "music.rsc", false },
-
- { GID_ITE_WINDEMO2, "3a450852cbf3c80773984d565647e6ac", "ited.rsc", false },
- { GID_ITE_WINDEMO2, "3f12b67fa93e56e1a6be39d2921d80bb", "scriptsd.rsc", false },
- { GID_ITE_WINDEMO2, "95a6c148e22e99a8c243f2978223583c", "soundsd.rsc", false },
- { GID_ITE_WINDEMO2, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", false },
-
- { GID_ITE_LINDEMO, "3a450852cbf3c80773984d565647e6ac", "ited.rsc", false },
- { GID_ITE_LINDEMO, "3f12b67fa93e56e1a6be39d2921d80bb", "scriptsd.rsc", false },
- { GID_ITE_LINDEMO, "d6454756517f042f01210458abe8edd4", "musicd.rsc", false },
- { GID_ITE_LINDEMO, "95a6c148e22e99a8c243f2978223583c", "soundsd.rsc", false },
- { GID_ITE_LINDEMO, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", false },
-
- { GID_ITE_MACDEMO2, "addfc9d82bc2fa1f4cab23743c652c08", "ited.rsc", false },
- { GID_ITE_MACDEMO2, "fded5c59b8b7c5976229f960d21e6b0b", "scriptsd.rsc", false },
- { GID_ITE_MACDEMO2, "495bdde51fd9f4bea2b9c911091b1ab2", "musicd.rsc", false },
- { GID_ITE_MACDEMO2, "b3a831fbed337d1f1300fee1dd474f6c", "soundsd.rsc", false },
- { GID_ITE_MACDEMO2, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", false },
-
- { GID_ITE_WINDEMO1, "3a450852cbf3c80773984d565647e6ac", "ited.rsc", false },
- { GID_ITE_WINDEMO1, "3f12b67fa93e56e1a6be39d2921d80bb", "scriptsd.rsc", false },
- { GID_ITE_WINDEMO1, "a741139dd7365a13f463cd896ff9969a", "soundsd.rsc", false },
- { GID_ITE_WINDEMO1, "0759eaf5b64ae19fd429920a70151ad3", "voicesd.rsc", false },
-
- { GID_ITE_MACDEMO1, "addfc9d82bc2fa1f4cab23743c652c08", "ited.rsc", false },
- { GID_ITE_MACDEMO1, "fded5c59b8b7c5976229f960d21e6b0b", "scriptsd.rsc", false },
- { GID_ITE_MACDEMO1, "1a91cd60169f367ecb6c6e058d899b2f", "musicd.rsc", false },
- { GID_ITE_MACDEMO1, "b3a831fbed337d1f1300fee1dd474f6c", "soundsd.rsc", false },
- { GID_ITE_MACDEMO1, "e139d86bab2ee8ba3157337f894a92d4", "voicesd.rsc", false },
-
- { GID_IHNM_CD, "0439083e3dfdc51b486071d45872ae52", "musicfm.res", false },
- { GID_IHNM_CD, "80f875a1fb384160d1f4b27166eef583", "musicgm.res", false },
- { GID_IHNM_CD, "46bbdc65d164ba7e89836a0935eec8e6", "scream.res", false },
- { GID_IHNM_CD, "be38bbc5a26be809dbf39f13befebd01", "scripts.res", false },
- { GID_IHNM_CD, "58b79e61594779513c7f2d35509fa89e", "patch.re_", false },
- { GID_IHNM_CD, "1c610d543f32ec8b525e3f652536f269", "sfx.res", false },
- { GID_IHNM_CD, "fc6440b38025f4b2cc3ff55c3da5c3eb", "voices1.res", false },
- { GID_IHNM_CD, "b37f10fd1696ade7d58704ccaaebceeb", "voices2.res", false },
- { GID_IHNM_CD, "3bbc16a8f741dbb511da506c660a0b54", "voices3.res", false },
- { GID_IHNM_CD, "ebfa160122d2247a676ca39920e5d481", "voices4.res", false },
- { GID_IHNM_CD, "1f501ce4b72392bdd1d9ec38f6eec6da", "voices5.res", false },
- { GID_IHNM_CD, "f580ed7568c7d6ef34e934ba20adf834", "voices6.res", false },
- { GID_IHNM_CD, "54b1f2013a075338ceb0e258d97808bd", "voicess.res", false },
-
- // Reported by mld. German Retail
- { GID_IHNM_CD_DE, "0439083e3dfdc51b486071d45872ae52", "musicfm.res", false },
- { GID_IHNM_CD_DE, "80f875a1fb384160d1f4b27166eef583", "musicgm.res", false },
- { GID_IHNM_CD_DE, "c92370d400e6f2a3fc411c3729d09224", "scream.res", false },
- { GID_IHNM_CD_DE, "32aa01a89937520fe0ea513950117292", "scripts.res", false },
- { GID_IHNM_CD_DE, "58b79e61594779513c7f2d35509fa89e", "patch.re_", false },
- { GID_IHNM_CD_DE, "1c610d543f32ec8b525e3f652536f269", "sfx.res", false },
- { GID_IHNM_CD_DE, "424971e1e2373187c3f5734fe36071a2", "voices1.res", false },
- { GID_IHNM_CD_DE, "c270e0980782af43641a86e4a14e2a32", "voices2.res", false },
- { GID_IHNM_CD_DE, "49e42befea883fd101ec3d0f5d0647b9", "voices3.res", false },
- { GID_IHNM_CD_DE, "c477443c52a0aa56e686ebd8d051e4ab", "voices5.res", false },
- { GID_IHNM_CD_DE, "2b9aea838f74b4eecfb29a8f205a2bd4", "voices6.res", false },
- { GID_IHNM_CD_DE, "8b09a196a52627cacb4eab13bfe0b2c3", "voicess.res", false },
-
- { GID_IHNM_CD_ES, "0439083e3dfdc51b486071d45872ae52", "musicfm.res", false },
- { GID_IHNM_CD_ES, "80f875a1fb384160d1f4b27166eef583", "musicgm.res", false },
- { GID_IHNM_CD_ES, "58b79e61594779513c7f2d35509fa89e", "patch.re_", false },
- { GID_IHNM_CD_ES, "c92370d400e6f2a3fc411c3729d09224", "scream.res", false },
- { GID_IHNM_CD_ES, "be38bbc5a26be809dbf39f13befebd01", "scripts.res", false },
- { GID_IHNM_CD_ES, "1c610d543f32ec8b525e3f652536f269", "sfx.res", false },
- { GID_IHNM_CD_ES, "dc6a34e3d1668730ea46815a92c7847f", "voices1.res", false },
- { GID_IHNM_CD_ES, "dc6a5fa7a4cdc2ca5a6fd924e969986c", "voices2.res", false },
- { GID_IHNM_CD_ES, "dc6a5fa7a4cdc2ca5a6fd924e969986c", "voices3.res", false },
- { GID_IHNM_CD_ES, "0f87400b804232a58dd22e404420cc45", "voices4.res", false },
- { GID_IHNM_CD_ES, "172668cfc5d8c305cb5b1a9b4d995fc0", "voices5.res", false },
- { GID_IHNM_CD_ES, "96c9bda9a5f41d6bc232ed7bf6d371d9", "voices6.res", false },
- { GID_IHNM_CD_ES, "d869de9883c8faea7f687217a9ec7057", "voicess.res", false },
-
- { GID_IHNM_CD_RU, "0439083e3dfdc51b486071d45872ae52", "musicfm.res", false },
- { GID_IHNM_CD_RU, "80f875a1fb384160d1f4b27166eef583", "musicgm.res", false },
- { GID_IHNM_CD_RU, "46bbdc65d164ba7e89836a0935eec8e6", "scream.res", false },
- { GID_IHNM_CD_RU, "be38bbc5a26be809dbf39f13befebd01", "scripts.res", false },
- { GID_IHNM_CD_RU, "58b79e61594779513c7f2d35509fa89e", "patch.re_", false },
- { GID_IHNM_CD_RU, "1c610d543f32ec8b525e3f652536f269", "sfx.res", false },
- { GID_IHNM_CD_RU, "d6100d2dc3b2b9f2e1ad247f613dce9b", "voices1.res", false },
- { GID_IHNM_CD_RU, "84f6f48ecc2832841ea6417a9a379430", "voices2.res", false },
- { GID_IHNM_CD_RU, "ebb9501283047f27a0f54e27b3c8ba1e", "voices3.res", false },
- { GID_IHNM_CD_RU, "4c145da5fa6d1306162a7ca8ce5a4f2e", "voices4.res", false },
- { GID_IHNM_CD_RU, "871a559644281917677eca4af1b05620", "voices5.res", false },
- { GID_IHNM_CD_RU, "211be5c24f066d69a2f6cfa953acfba6", "voices6.res", false },
- { GID_IHNM_CD_RU, "9df7cd3b18ddaa16b5291b3432567036", "voicess.res", false },
-
- { GID_IHNM_CD_FR, "0439083e3dfdc51b486071d45872ae52", "musicfm.res", false },
- { GID_IHNM_CD_FR, "80f875a1fb384160d1f4b27166eef583", "musicgm.res", false },
- { GID_IHNM_CD_FR, "58b79e61594779513c7f2d35509fa89e", "patch.re_", false },
- { GID_IHNM_CD_FR, "c92370d400e6f2a3fc411c3729d09224", "scream.res", false },
- { GID_IHNM_CD_FR, "32aa01a89937520fe0ea513950117292", "scripts.res", false },
- { GID_IHNM_CD_FR, "1c610d543f32ec8b525e3f652536f269", "sfx.res", false },
- { GID_IHNM_CD_FR, "424971e1e2373187c3f5734fe36071a2", "voices1.res", false },
- { GID_IHNM_CD_FR, "c2d93a35d2c2def9c3d6d242576c794b", "voices2.res", false },
- { GID_IHNM_CD_FR, "49e42befea883fd101ec3d0f5d0647b9", "voices3.res", false },
- { GID_IHNM_CD_FR, "f4c415de7c03de86b73f9a12b8bd632f", "voices5.res", false },
- { GID_IHNM_CD_FR, "3fc5358a5d8eee43bdfab2740276572e", "voices6.res", false },
- { GID_IHNM_CD_FR, "b8642e943bbebf89cef2f48b31cb4305", "voicess.res", false },
-
- { GID_IHNM_DEMO, "46bbdc65d164ba7e89836a0935eec8e6", "scream.res", false },
- { GID_IHNM_DEMO, "9626bda8978094ff9b29198bc1ed5f9a", "scripts.res", false },
- { GID_IHNM_DEMO, "1c610d543f32ec8b525e3f652536f269", "sfx.res", false },
- { GID_IHNM_DEMO, "3bbc16a8f741dbb511da506c660a0b54", "voicesd.res", false },
-};
-
static GameDescription gameDescriptions[] = {
// Inherit the earth - DOS Demo version
// sound unchecked
@@ -989,8 +908,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE, // Starting scene number
&ITEDemo_Resources,
- ARRAYSIZE(ITEDEMO_GameFiles), // Game datafiles
- ITEDEMO_GameFiles,
+ ARRAYSIZE(ITE_DEMO_G_GameFiles), // Game datafiles
+ ITE_DEMO_G_GameFiles,
ARRAYSIZE(ITEDEMO_GameFonts),
ITEDEMO_GameFonts,
&ITEDEMO_GameSound,
@@ -1012,8 +931,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMACDEMO_GameFiles),
- ITEMACDEMO_GameFiles,
+ ARRAYSIZE(ITE_MACDEMO2_GameFiles),
+ ITE_MACDEMO2_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEMACDEMO_GameVoice,
@@ -1035,8 +954,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMACDEMO_GameFiles),
- ITEMACDEMO_GameFiles,
+ ARRAYSIZE(ITE_MACDEMO1_GameFiles),
+ ITE_MACDEMO1_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEMACDEMO_GameVoice,
@@ -1058,8 +977,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMACCD_G_GameFiles),
- ITEMACCD_G_GameFiles,
+ ARRAYSIZE(ITE_MACCD_G_GameFiles),
+ ITE_MACCD_G_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEMACCD_G_GameSound,
@@ -1081,8 +1000,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMACCD_GameFiles),
- ITEMACCD_GameFiles,
+ ARRAYSIZE(ITE_MACCD_GameFiles),
+ ITE_MACCD_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEMACCD_GameSound,
@@ -1105,8 +1024,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITELINDEMO_GameFiles),
- ITELINDEMO_GameFiles,
+ ARRAYSIZE(ITE_LINDEMO_GameFiles),
+ ITE_LINDEMO_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEWINDEMO2_GameVoice,
@@ -1128,8 +1047,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEWINDEMO_GameFiles),
- ITEWINDEMO_GameFiles,
+ ARRAYSIZE(ITE_WINDEMO2_GameFiles),
+ ITE_WINDEMO2_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEWINDEMO2_GameVoice,
@@ -1151,8 +1070,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEWINDEMO_GameFiles),
- ITEWINDEMO_GameFiles,
+ ARRAYSIZE(ITE_WINDEMO1_GameFiles),
+ ITE_WINDEMO1_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEWINDEMO1_GameSound,
@@ -1174,8 +1093,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMULTICD_GameFiles),
- ITEMULTICD_GameFiles,
+ ARRAYSIZE(ITE_MULTICD_GameFiles),
+ ITE_MULTICD_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITEMACCD_GameSound,
@@ -1197,8 +1116,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITELINCD_GameFiles),
- ITELINCD_GameFiles,
+ ARRAYSIZE(ITE_LINCD_GameFiles),
+ ITE_LINCD_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1220,8 +1139,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITECD_GameFiles),
- ITECD_GameFiles,
+ ARRAYSIZE(ITE_WINCD_GameFiles),
+ ITE_WINCD_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1243,8 +1162,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITECD_GameFiles),
- ITECD_GameFiles,
+ ARRAYSIZE(ITE_CD_G_GameFiles),
+ ITE_CD_G_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1266,8 +1185,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITECD2_GameFiles),
- ITECD2_GameFiles,
+ ARRAYSIZE(ITE_CD_G2_GameFiles),
+ ITE_CD_G2_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1289,8 +1208,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITECD_GameFiles),
- ITECD_GameFiles,
+ ARRAYSIZE(ITE_CD_DE_GameFiles),
+ ITE_CD_DE_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1312,8 +1231,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITECD2_GameFiles),
- ITECD2_GameFiles,
+ ARRAYSIZE(ITE_CD_DE2_GameFiles),
+ ITE_CD_DE2_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1335,8 +1254,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITECD_GameFiles),
- ITECD_GameFiles,
+ ARRAYSIZE(ITE_CD_GameFiles),
+ ITE_CD_GameFiles,
ARRAYSIZE(ITECD_GameFonts),
ITECD_GameFonts,
&ITECD_GameSound,
@@ -1358,8 +1277,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEDISK_GameFiles),
- ITEDISK_GameFiles,
+ ARRAYSIZE(ITE_DISK_DE_GameFiles),
+ ITE_DISK_DE_GameFiles,
ARRAYSIZE(ITEDISK_GameFonts),
ITEDISK_GameFonts,
&ITEDISK_GameSound,
@@ -1381,8 +1300,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEDISK2_GameFiles),
- ITEDISK2_GameFiles,
+ ARRAYSIZE(ITE_DISK_DE2_GameFiles),
+ ITE_DISK_DE2_GameFiles,
ARRAYSIZE(ITEDISK_GameFonts),
ITEDISK_GameFonts,
&ITEDISK_GameSound,
@@ -1404,8 +1323,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEDISK_GameFiles),
- ITEDISK_GameFiles,
+ ARRAYSIZE(ITE_DISK_G_GameFiles),
+ ITE_DISK_G_GameFiles,
ARRAYSIZE(ITEDISK_GameFonts),
ITEDISK_GameFonts,
&ITEDISK_GameSound,
@@ -1427,8 +1346,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEDISK2_GameFiles),
- ITEDISK2_GameFiles,
+ ARRAYSIZE(ITE_DISK_G2_GameFiles),
+ ITE_DISK_G2_GameFiles,
ARRAYSIZE(ITEDISK_GameFonts),
ITEDISK_GameFonts,
&ITEDISK_GameSound,
@@ -1450,8 +1369,8 @@ static GameDescription gameDescriptions[] = {
&IHNM_DisplayInfo,
0,
&IHNM_Resources,
- ARRAYSIZE(IHNMDEMO_GameFiles),
- IHNMDEMO_GameFiles,
+ ARRAYSIZE(IHNM_DEMO_GameFiles),
+ IHNM_DEMO_GameFiles,
ARRAYSIZE(IHNMDEMO_GameFonts),
IHNMDEMO_GameFonts,
&IHNM_GameSound,
@@ -1473,8 +1392,8 @@ static GameDescription gameDescriptions[] = {
&IHNM_DisplayInfo,
IHNM_DEFAULT_SCENE,
&IHNM_Resources,
- ARRAYSIZE(IHNMCD_GameFiles),
- IHNMCD_GameFiles,
+ ARRAYSIZE(IHNM_CD_GameFiles),
+ IHNM_CD_GameFiles,
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
@@ -1496,8 +1415,8 @@ static GameDescription gameDescriptions[] = {
&IHNM_DisplayInfo,
IHNM_DEFAULT_SCENE,
&IHNM_Resources,
- ARRAYSIZE(IHNMCD_Censored_GameFiles),
- IHNMCD_Censored_GameFiles,
+ ARRAYSIZE(IHNM_CD_DE_GameFiles),
+ IHNM_CD_DE_GameFiles,
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
@@ -1518,8 +1437,8 @@ static GameDescription gameDescriptions[] = {
&IHNM_DisplayInfo,
IHNM_DEFAULT_SCENE,
&IHNM_Resources,
- ARRAYSIZE(IHNMCD_GameFiles),
- IHNMCD_GameFiles,
+ ARRAYSIZE(IHNM_CD_ES_GameFiles),
+ IHNM_CD_ES_GameFiles,
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
@@ -1540,8 +1459,8 @@ static GameDescription gameDescriptions[] = {
&IHNM_DisplayInfo,
IHNM_DEFAULT_SCENE,
&IHNM_Resources,
- ARRAYSIZE(IHNMCD_GameFiles),
- IHNMCD_GameFiles,
+ ARRAYSIZE(IHNM_CD_RU_GameFiles),
+ IHNM_CD_RU_GameFiles,
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
@@ -1562,8 +1481,8 @@ static GameDescription gameDescriptions[] = {
&IHNM_DisplayInfo,
IHNM_DEFAULT_SCENE,
&IHNM_Resources,
- ARRAYSIZE(IHNMCD_Censored_GameFiles),
- IHNMCD_Censored_GameFiles,
+ ARRAYSIZE(IHNM_CD_FR_GameFiles),
+ IHNM_CD_FR_GameFiles,
ARRAYSIZE(IHNMCD_GameFonts),
IHNMCD_GameFonts,
&IHNM_GameSound,
@@ -1577,268 +1496,214 @@ static GameDescription gameDescriptions[] = {
},
};
-
-static DetectedGame toDetectedGame(const GameDescription &g) {
- const char *title = 0;
- if (g.gameType == GType_ITE)
- title = "Inherit the Earth: Quest for the Orb";
- else if (g.gameType == GType_IHNM)
- title = "I Have No Mouth and I Must Scream";
- DetectedGame dg(g.name, title, g.language, g.platform);
- dg.updateDesc(g.extra);
+DetectedGame GameDescription::toDetectedGame() {
+ const char *title;
+ title = saga_games[gameType].description;
+ DetectedGame dg(name, title, language, platform);
+ dg.updateDesc(extra);
return dg;
}
-
-bool SagaEngine::initGame() {
- uint16 gameCount = ARRAYSIZE(gameDescriptions);
- int gameNumber = -1;
- FSList dummy;
- DetectedGameList detectedGames;
- int *matches;
Common::Language language = Common::UNK_LANG;
Common::Platform platform = Common::kPlatformUnknown;
- if (ConfMan.hasKey("language"))
- language = Common::parseLanguage(ConfMan.get("language"));
- if (ConfMan.hasKey("platform"))
- platform = Common::parsePlatform(ConfMan.get("platform"));
-
+static int detectGame(const FSList *fslist, Common::Language language, Common::Platform platform, int*& returnMatches) {
+ int gamesCount = ARRAYSIZE(gameDescriptions);
+ int filesCount;
- detectedGames = GAME_ProbeGame(dummy, &matches);
+ typedef Common::Map<Common::String, bool> StringSet;
+ StringSet filesList;
- if (detectedGames.size() == 0) {
- warning("No valid games were found in the specified directory.");
- return false;
- }
+ typedef Common::Map<Common::String, Common::String> StringMap;
+ StringMap filesMD5;
- // If we have more than one match then try to match by platform and
- // language
- int count = 0;
- if (detectedGames.size() > 1) {
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- if (matches[i] != -1) {
- if ((gameDescriptions[matches[i]].language != language &&
- language != Common::UNK_LANG) ||
- (gameDescriptions[matches[i]].platform != platform &&
- platform != Common::kPlatformUnknown)) {
- debug(2, "Purged (pass 2) %s", toDetectedGame(gameDescriptions[matches[i]]).description.c_str());
- matches[i] = -1;
- }
- else
- count++;
- }
- } else
- count = 1;
+ Common::String tstr;
+
+ int i, j;
+ char md5str[32+1];
+ uint8 md5sum[16];
- if (count != 1)
- warning("Conflicting targets detected (%d)", count);
+ int matched[ARRAYSIZE(gameDescriptions)];
+ int matchedCount = 0;
+ bool fileMissing;
+ GameFileDescription *fileDesc;
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- if (matches[i] != -1) {
- gameNumber = matches[i];
- break;
+ // First we compose list of files which we need MD5s for
+ for (i = 0; i < gamesCount; i++) {
+ for (j = 0; j < gameDescriptions[i].filesCount; j++) {
+ tstr = Common::String(gameDescriptions[i].filesDescriptions[j].fileName);
+ tstr.toLowercase();
+ filesList[tstr] = true;
+ }
+ }
+
+ if (fslist != NULL) {
+ for (FSList::const_iterator file = fslist->begin(); file != fslist->end(); ++file) {
+ if (file->isDirectory()) continue;
+ tstr = file->displayName();
+ tstr.toLowercase();
+
+ if (!filesList.contains(tstr)) continue;
+
+ if (!Common::md5_file(file->path().c_str(), md5sum, NULL, FILE_MD5_BYTES)) continue;
+ for (j = 0; j < 16; j++) {
+ sprintf(md5str + j*2, "%02x", (int)md5sum[j]);
+ }
+ filesMD5[tstr] = Common::String(md5str);
}
+ } else {
+ Common::File testFile;
- free(matches);
+ for (StringSet::const_iterator file = filesList.begin(); file != filesList.end(); ++file) {
+ tstr = file->_key;
+ tstr.toLowercase();
- if (gameNumber >= gameCount || gameNumber == -1) {
- error("SagaEngine::loadGame wrong gameNumber");
+ if(!filesMD5.contains(tstr)) {
+ if (testFile.open(file->_key.c_str())) {
+ testFile.close();
+
+ if (Common::md5_file(file->_key.c_str(), md5sum, NULL, FILE_MD5_BYTES)) {
+ for (j = 0; j < 16; j++) {
+ sprintf(md5str + j*2, "%02x", (int)md5sum[j]);
+ }
+ filesMD5[tstr] = Common::String(md5str);
+ }
+ }
+ }
+ }
}
- _gameTitle = toDetectedGame(gameDescriptions[gameNumber]).description;
- debug(2, "Running %s", _gameTitle.c_str());
+ for (i = 0; i < gamesCount; i++) {
+ filesCount = gameDescriptions[i].filesCount;
+ fileMissing = false;
- _gameNumber = gameNumber;
- _gameDescription = &gameDescriptions[gameNumber];
- _gameDisplayInfo = *_gameDescription->gameDisplayInfo;
- _displayClip.right = _gameDisplayInfo.logicalWidth;
- _displayClip.bottom = _gameDisplayInfo.logicalHeight;
+ // Try to open all files for this game
+ for (j = 0; j < filesCount; j++) {
+ fileDesc = &gameDescriptions[i].filesDescriptions[j];
+ tstr = fileDesc->fileName;
+ tstr.toLowercase();
- if (!_resource->createContexts()) {
- return false;
+ if (!filesMD5.contains(tstr)) {
+
+ if ((fileDesc->fileType & (GAME_SOUNDFILE | GAME_VOICEFILE | GAME_MUSICFILE)) != 0) {
+ //TODO: find recompressed files
+ }
+ fileMissing = true;
+ break;
+ }
+ if (strcmp(fileDesc->md5, filesMD5[tstr].c_str())) {
+ fileMissing = true;
+ break;
+ }
+ }
+ if (!fileMissing) {
+ debug(2, "Found game: %s", gameDescriptions[i].toDetectedGame().description.c_str());
+ matched[matchedCount++] = i;
+ }
}
- return true;
-}
-DetectedGameList GAME_ProbeGame(const FSList &fslist, int **retmatches) {
- DetectedGameList detectedGames;
- int game_n;
- int index = 0, i, j;
- int matches[ARRAYSIZE(gameDescriptions)];
- bool mode = retmatches ? false : true;
-
- game_n = -1;
- for (i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- matches[i] = -1;
-
- while (1) {
- game_n = detectGame(fslist, mode, game_n);
- if (game_n == -1)
- break;
- matches[index++] = game_n;
+ if (!filesMD5.isEmpty() && (matchedCount == 0)) {
+ printf("MD5s of your game version are unknown. Please, report following data to\n");
+ printf("ScummVM team along with your game name and version:\n");
+
+ for (StringMap::const_iterator file = filesMD5.begin(); file != filesMD5.end(); ++file)
+ printf("%s: %s\n", file->_key.c_str(), file->_value.c_str());
}
// We have some resource sets which are superpositions of other
// Particularly it is ite-demo-linux vs ite-demo-win
// Now remove lesser set if bigger matches too
- if (index > 1) {
+ if (matchedCount > 1) {
// Search max number
int maxcount = 0;
- for (i = 0; i < index; i++) {
- int count = 0;
- for (j = 0; j < ARRAYSIZE(gameMD5); j++)
- if (gameMD5[j].id == gameDescriptions[matches[i]].gameId)
- count++;
- maxcount = MAX(maxcount, count);
+ for (i = 0; i < matchedCount; i++) {
+ maxcount = MAX(gameDescriptions[matched[i]].filesCount, maxcount);
}
// Now purge targets with number of files lesser than max
- for (i = 0; i < index; i++) {
- int count = 0;
- for (j = 0; j < ARRAYSIZE(gameMD5); j++)
- if (gameMD5[j].id == gameDescriptions[matches[i]].gameId)
- count++;
- if (count < maxcount) {
- debug(2, "Purged: %s", toDetectedGame(gameDescriptions[matches[i]]).description.c_str());
- matches[i] = -1;
+ for (i = 0; i < matchedCount; i++) {
+ if ((gameDescriptions[matched[i]].language != language && language != Common::UNK_LANG) ||
+ (gameDescriptions[matched[i]].platform != platform && platform != Common::kPlatformUnknown)) {
+ debug(2, "Purged %s", gameDescriptions[matched[i]].toDetectedGame().description.c_str());
+ matched[i] = -1;
+ continue;
}
- }
-
- }
- // and now push them into list of detected games
- for (i = 0; i < index; i++)
- if (matches[i] != -1) {
- detectedGames.push_back(toDetectedGame(gameDescriptions[matches[i]]));
+ if (gameDescriptions[matched[i]].filesCount < maxcount) {
+ debug(2, "Purged: %s", gameDescriptions[matched[i]].toDetectedGame().description.c_str());
+ matched[i] = -1;
+ }
}
-
- if (retmatches) {
- *retmatches = (int *)calloc(ARRAYSIZE(gameDescriptions), sizeof(int));
- for (i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- (*retmatches)[i] = matches[i];
}
- return detectedGames;
-}
-
-int detectGame(const FSList &fslist, bool mode, int start) {
- int game_count = ARRAYSIZE(gameDescriptions);
- int game_n = -1;
- typedef Common::Map<Common::String, Common::String> StringMap;
- StringMap filesMD5;
- typedef Common::Map<Common::String, bool> StringSet;
- StringSet filesList;
+ returnMatches = (int *)malloc(matchedCount * sizeof(int));
+ j = 0;
+ for (i = 0; i < matchedCount; i++)
+ if (matched[i] != -1)
+ returnMatches[j++] = matched[i];
+ return j;
+}
- uint16 file_count;
- uint16 file_n;
- Common::File test_file;
- bool file_missing;
+bool SagaEngine::initGame() {
+ uint16 gameCount = ARRAYSIZE(gameDescriptions);
+ int gameNumber = -1;
+
+ DetectedGameList detectedGames;
+ int count;
+ int* matches;
+ Common::Language language = Common::UNK_LANG;
+ Common::Platform platform = Common::kPlatformUnknown;
- Common::String tstr, tstr1;
- char md5str[32+1];
- uint8 md5sum[16];
+ if (ConfMan.hasKey("language"))
+ language = Common::parseLanguage(ConfMan.get("language"));
+ if (ConfMan.hasKey("platform"))
+ platform = Common::parsePlatform(ConfMan.get("platform"));
- // First we compose list of files which we need MD5s for
- for (int i = 0; i < ARRAYSIZE(gameMD5); i++) {
- tstr = Common::String(gameMD5[i].filename);
- tstr.toLowercase();
- if (gameMD5[i].caseSensitive && !mode)
- filesList[Common::String(gameMD5[i].filename)] = true;
- else
- filesList[tstr] = true;
- }
+ count = detectGame(NULL, language, platform, matches);
- if (mode) {
- // Now count MD5s for required files
- for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
- if (!file->isDirectory()) {
- tstr = file->displayName();
- // FIXME: there is a bug in String class. tstr1 = tstr; tstr.toLowercase()
- // makes tstr1 lowercase as well
- tstr1 = Common::String(file->displayName().c_str());
- tstr.toLowercase();
-
- if (filesList.contains(tstr) || filesList.contains(tstr1)) {
- if (Common::md5_file(file->path().c_str(), md5sum, NULL, FILE_MD5_BYTES)) {
- for (int j = 0; j < 16; j++) {
- sprintf(md5str + j*2, "%02x", (int)md5sum[j]);
- }
- filesMD5[tstr] = Common::String(md5str);
- filesMD5[tstr1] = Common::String(md5str);
- }
- }
- }
- }
- } else {
- Common::File testFile;
-
- for (StringSet::const_iterator file = filesList.begin(); file != filesList.end(); ++file) {
- if (testFile.open(file->_key.c_str())) {
- testFile.close();
- if (Common::md5_file(file->_key.c_str(), md5sum, NULL, FILE_MD5_BYTES)) {
- for (int j = 0; j < 16; j++) {
- sprintf(md5str + j*2, "%02x", (int)md5sum[j]);
- }
- filesMD5[file->_key] = Common::String(md5str);
- }
- }
- }
+ if (count == 0) {
+ warning("No valid games were found in the specified directory.");
+ return false;
}
- for (game_n = start + 1; game_n < game_count; game_n++) {
- file_count = gameDescriptions[game_n].filesCount;
- file_missing = false;
-
- // Try to open all files for this game
- for (file_n = 0; file_n < file_count; file_n++) {
- tstr = gameDescriptions[game_n].filesDescriptions[file_n].fileName;
-
- if (!filesMD5.contains(tstr)) {
- file_missing = true;
- break;
- }
- }
+ if (count != 1)
+ warning("Conflicting targets detected (%d)", count);
- // Try the next game, couldn't find all files for the current
- // game
- if (file_missing) {
- continue;
- } else {
- bool match = true;
+ gameNumber = matches[0];
- debug(2, "Probing game: %s", toDetectedGame(gameDescriptions[game_n]).description.c_str());
+ free(matches);
- for (int i = 0; i < ARRAYSIZE(gameMD5); i++) {
- if (gameMD5[i].id == gameDescriptions[game_n].gameId) {
- tstr = gameMD5[i].filename;
+ if (gameNumber >= gameCount || gameNumber == -1) {
+ error("SagaEngine::loadGame wrong gameNumber");
+ }
- if (strcmp(gameMD5[i].md5, filesMD5[tstr].c_str())) {
- match = false;
- break;
- }
- }
- }
- if (!match)
- continue;
+ _gameTitle = gameDescriptions[gameNumber].toDetectedGame().description;
+ debug(2, "Running %s", _gameTitle.c_str());
- debug(2, "Found game: %s", toDetectedGame(gameDescriptions[game_n]).description.c_str());
+ _gameNumber = gameNumber;
+ _gameDescription = &gameDescriptions[gameNumber];
+ _gameDisplayInfo = *_gameDescription->gameDisplayInfo;
+ _displayClip.right = _gameDisplayInfo.logicalWidth;
+ _displayClip.bottom = _gameDisplayInfo.logicalHeight;
- return game_n;
- }
+ if (!_resource->createContexts()) {
+ return false;
}
+ return true;
+}
- if (!filesMD5.isEmpty() && start == -1) {
- printf("MD5s of your game version are unknown. Please, report following data to\n");
- printf("ScummVM team along with your game name and version:\n");
-
- for (StringMap::const_iterator file = filesMD5.begin(); file != filesMD5.end(); ++file)
- printf("%s: %s\n", file->_key.c_str(), file->_value.c_str());
- }
+DetectedGameList GAME_detectGames(const FSList &fslist) {
+ DetectedGameList detectedGames;
+ int count;
+ int* matches;
+ count = detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown, matches);
- return -1;
+ for (int i = 0; i < count; i++)
+ detectedGames.push_back(gameDescriptions[matches[i]].toDetectedGame());
+ free(matches);
+ return detectedGames;
}
} // End of namespace Saga
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index e7637161fe..0ba23b4948 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -28,6 +28,7 @@
#include "base/engine.h"
#include "common/stream.h"
+#include "base/plugins.h"
#include "saga/gfx.h"
#include "saga/list.h"
@@ -84,8 +85,8 @@ enum ERRORCODE {
};
enum SAGAGameType {
- GType_ITE,
- GType_IHNM
+ GType_ITE = 0,
+ GType_IHNM = 1
};
enum GameObjectTypes {
@@ -383,6 +384,7 @@ struct GameResourceDescription {
struct GameFileDescription {
const char *fileName;
uint16 fileType;
+ const char *md5;
};
struct GamePatchDescription {
@@ -515,6 +517,8 @@ struct GameDescription {
uint32 features;
Common::Language language;
Common::Platform platform;
+
+ DetectedGame toDetectedGame();
};
struct SaveFileData {