diff options
author | Filippos Karapetis | 2009-09-01 17:09:59 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-09-01 17:09:59 +0000 |
commit | 2e04dcb133e450b84983da5b680d1695fdf639bd (patch) | |
tree | df9cc660d3d11850ecf17d0a13b9cba9033bed73 /engines/sci/detection.cpp | |
parent | 3d0e8a568c804a7807ccd3c5de7040502718ec1b (diff) | |
download | scummvm-rg350-2e04dcb133e450b84983da5b680d1695fdf639bd.tar.gz scummvm-rg350-2e04dcb133e450b84983da5b680d1695fdf639bd.tar.bz2 scummvm-rg350-2e04dcb133e450b84983da5b680d1695fdf639bd.zip |
- Moved the Sierra game ID conversion code inside game.cpp, so that any game-specific workarounds are tested against ScummVM IDs
- Added detection for the EcoQuest 1 demo in the fallback detector
- Partially reverted my previous "fix" for EcoQuest 1 CD, and turned it into a script-specific hack for that game, for now
- Added handling of kDisposeScript calls made with 2 parameters, e.g. in KQ5CD and others (still untested, haven't found a test case)
svn-id: r43887
Diffstat (limited to 'engines/sci/detection.cpp')
-rw-r--r-- | engines/sci/detection.cpp | 131 |
1 files changed, 1 insertions, 130 deletions
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index d2615e8b4e..6f9e5a1c1b 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -29,6 +29,7 @@ #include "sci/sci.h" #include "sci/engine/kernel.h" #include "sci/engine/seg_manager.h" +#include "sci/engine/vm.h" // for convertSierraGameId namespace Sci { @@ -163,136 +164,6 @@ public: const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const; }; -struct OldNewIdTableEntry { - const char *oldId; - const char *newId; - bool demo; -}; - -static const OldNewIdTableEntry s_oldNewTable[] = { - { "demo", "christmas1988", false }, - // iceman is the same - { "icedemo", "iceman", true }, - // longbow is the same - { "rh", "longbow", true }, - { "eco", "ecoquest", false }, - { "eco2", "ecoquest2", true }, // EcoQuest 2 demo - { "rain", "ecoquest2", false }, // EcoQuest 2 full - { "fp", "freddypharkas", false }, - { "emc", "funseeker", false }, - { "gk", "gk1", false }, - { "hoyledemo", "hoyle1", true }, - { "cardgames", "hoyle1", false }, - { "solitare", "hoyle2", false }, - // hoyle3 is the same - // hoyle4 is the same - { "demo000", "kq1sci", true }, - { "kq1", "kq1sci", false }, - { "kq4", "kq4sci", false }, - { "ll1", "lsl1sci", true }, - { "lsl1", "lsl1sci", false }, - // lsl2 is the same - { "ll5", "lsl5", true }, - // lsl5 is the same - // lsl6 is the same - { "mg", "mothergoose", false }, - { "cb1", "laurabow", false }, - { "lb2", "laurabow2", false }, - { "twisty", "pepper", false }, - { "pq", "pq2", false }, - { "trial", "qfg2", false }, - { "hq2demo", "qfg2", true }, - { "thegame", "slater", false }, - { "sq1demo", "sq1sci", true }, - { "sq1", "sq1sci", false }, - // sq5 is the same - - { 0, 0, 0 } -}; - -static const char *convertSierraGameId(const char *gameName, uint32 *gameFlags) { - // Convert the id to lower case, so that we match all upper/lower case variants. - Common::String sierraId = gameName; - sierraId.toLowercase(); - - // TODO: SCI32 IDs - - for (const OldNewIdTableEntry *cur = s_oldNewTable; cur->oldId != 0; ++cur) { - if (sierraId == cur->oldId) { - if (cur->demo) - *gameFlags |= ADGF_DEMO; - return cur->newId; - } - } - - if (sierraId == "card") { - // This could either be christmas1990 or christmas1992 - // christmas1990 has a "resource.001" file, whereas - // christmas1992 has a "resource.000" file - return (Common::File::exists("resource.001")) ? "christmas1990" : "christmas1992"; - } - if (sierraId == "arthur") { - if (!Common::File::exists("resource.002")) - *gameFlags |= ADGF_DEMO; - return "camelot"; - } - if (sierraId == "brain") { - // This could either be The Castle of Dr. Brain, or The Island of Dr. Brain - // castlebrain has resource.001, whereas islandbrain doesn't - return (Common::File::exists("resource.001")) ? "castlebrain" : "islandbrain"; - } - if (sierraId == "lsl3") { - if (!Common::File::exists("resource.003")) - *gameFlags |= ADGF_DEMO; - return "lsl3"; - } - // TODO: lslcasino - if (sierraId == "tales") { - if (!Common::File::exists("resource.002")) - *gameFlags |= ADGF_DEMO; - return "fairytales"; - } - // TODO: pq1sci (its resources can't be read) - if (sierraId == "pq3") { - // The pq3 demo comes with resource.000 and resource.001 - // The full version was released with several resource.* files, - // or one big resource.000 file - if (Common::File::exists("resource.000") && Common::File::exists("resource.001") && - !Common::File::exists("resource.002")) - *gameFlags |= ADGF_DEMO; - return "pq3"; - } - if (sierraId == "glory" || sierraId == "hq") { - // This could either be qfg1 or qfg3 or qfg4 - // qfg3 has resource.aud, qfg4 has resource.sfx - if (Common::File::exists("resource.aud")) - return "qfg3"; - else if (Common::File::exists("resource.sfx")) - return "qfg4"; - else - return "qfg1"; - } - // TODO: qfg1 VGA (its resources can't be read) - if (sierraId == "sq3") { - // Both SQ3 and the separately released subgame, Astro Chicken, - // have internal ID "sq3", but Astro Chicken only has "resource.map" - // and "resource.001". Detect if it's SQ3 by the existence of - // "resource.002" - return (Common::File::exists("resource.002")) ? "sq3" : "astrochicken"; - } - if (sierraId == "sq4") { - // Both SQ4 and the separately released subgame, Ms. Astro Chicken, - // have internal ID "sq4", but Astro Chicken only has "resource.map" - // and "resource.001". Detect if it's SQ4 by the existence of - // "resource.000" (which exists in both SQ4 floppy and CD, but not in - // the subgame) - return (Common::File::exists("resource.000")) ? "sq4" : "msastrochicken"; - } - - // FIXME: Evil use of strdup here (we are leaking that memory, too) - return strdup(sierraId.c_str()); -} - Common::Language charToScummVMLanguage(const char c) { switch (c) { case 'F': |