diff options
-rw-r--r-- | scumm/scumm.cpp | 43 | ||||
-rw-r--r-- | scumm/scumm.h | 1 |
2 files changed, 43 insertions, 1 deletions
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index 2c1ff66b2e..815af134f4 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -194,7 +194,7 @@ static const ScummGameSettings scumm_settings[] = { // Humongous Entertainment Scumm Version 6 {"puttputt", "Putt-Putt Joins The Parade", GID_HEGAME, 6, 60, MDT_ADLIB | MDT_NATIVE, - GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES, 0}, + GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS | GF_NEW_COSTUMES | GF_MULTIPLE_VERSIONS, 0}, {"puttdemo", "Putt-Putt Joins The Parade (Demo)", GID_PUTTDEMO, 6, 0, MDT_ADLIB | MDT_NATIVE, GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS, 0}, {"moondemo", "Putt-Putt Goes To The Moon (Demo)", GID_HEGAME, 6, 60, MDT_ADLIB | MDT_NATIVE, @@ -337,6 +337,18 @@ static const ScummGameSettings scumm_settings[] = { {NULL, NULL, 0, 0, 0, MDT_NONE, 0, 0} }; +// This additional table is used for titles where GF_MULTIPLE_VERSIONS is specified. +// Now these are HE games. Some of them were released for different versions of SPUTM, +// and instead of multiplying GIDs this table is used. +// +// Use main table to specify default flags and this table to override defaults. +static const ScummGameSettings he_md5_settings[] = { + {"0b3222aaa7efcf283eb621e0cefd26cc", "Putt-Putt Joins The Parade (early version)", GID_HEGAME, 6, 60, MDT_ADLIB | MDT_NATIVE, + GF_NEW_OPCODES | GF_USE_KEY | GF_HUMONGOUS, 0}, + {NULL, NULL, 0, 0, 0, MDT_NONE, 0, 0} +}; + + static int compareMD5Table(const void *a, const void *b) { const char *key = (const char *)a; const MD5Table *elem = (const MD5Table *)b; @@ -3038,6 +3050,35 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst) { ScummGameSettings game = *g; + if (game.features & GF_MULTIPLE_VERSIONS) { + uint8 md5sum[16]; + char buf[256]; + const char *name = game.name; + char md5str[32+1]; + + if (game.features & GF_HUMONGOUS) + sprintf(buf, "%s.he0", name); + else + sprintf(buf, "%s.000", name); + + if (md5_file(buf, md5sum, ConfMan.get("path").c_str())) { + for (int j = 0; j < 16; j++) { + sprintf(md5str + j*2, "%02x", (int)md5sum[j]); + } + } + + g = he_md5_settings; + while (g->name) { + if (!scumm_stricmp(md5str, g->name)) + break; + g++; + } + if (g->name) { + game = *g; + game.name = name; + } + } + if (ConfMan.hasKey("amiga")) { warning("Configuration key 'amiga' is deprecated. Use 'platform=amiga' instead"); if (ConfMan.getBool("amiga")) diff --git a/scumm/scumm.h b/scumm/scumm.h index ec8286b233..cd77f2cb7e 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -108,6 +108,7 @@ enum GameFeatures { GF_NO_SCALING = 1 << 12, GF_FEW_LOCALS = 1 << 13, GF_HUMONGOUS = 1 << 14, + GF_MULTIPLE_VERSIONS = 1 << 15, GF_FMTOWNS = 1 << 17, GF_AMIGA = 1 << 18, |