aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/scumm.cpp101
1 files changed, 89 insertions, 12 deletions
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp
index 89340b12e5..50fd0b75b4 100644
--- a/scumm/scumm.cpp
+++ b/scumm/scumm.cpp
@@ -69,6 +69,8 @@
extern bool isSmartphone(void);
#endif
+static int generateMacFileName(const char *filename, char *buf, int bufsize, int cont = 0);
+
namespace Scumm {
// Use g_scumm from error() ONLY
@@ -433,6 +435,28 @@ static const ScummGameSettings he_md5_settings[] = {
{NULL, NULL, 0, 0, 0, MDT_NONE, 0, 0, 0, 0}
};
+static struct heMacFileNames {
+ const char *winName;
+ const char *macName;
+ bool hasParens;
+} heMacFileNameTable[] = {
+ { "Intentionally/left/blank", "", false},
+ { "airdemo", "Airport Demo", true},
+ { "f4-demo", "Freddi 4 Demo", true },
+ { "farmdemo", "Farm Demo", true},
+ { "fbdemo", "Fatty Bear Demo", false },
+ { "footdemo", "FoorBall Demo", true },
+ { "freddemo", "Freddi Demo", true },
+ { "moondemo", "Putt-Putt Moon Demo", false },
+ { "pajama", "Pajama Sam", true},
+ { "pj3-demo", "Pajama Sam 3-Demo", true },
+ { "circdemo", "Putt Circus Demo", true },
+ { "puttdemo", "Putt-Putt's Demo", false },
+ { "sf2-demo", "Spy Fox 2 - Demo", true },
+ { "spyozon", "SpyOzon", true },
+ { "zoodemo", "Puttzoo Demo", true },
+ { "zoodemo", "Zoo Demo", true}
+};
static int compareMD5Table(const void *a, const void *b) {
const char *key = (const char *)a;
@@ -2560,6 +2584,9 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {
DetectedGameList detectedGames;
const ScummGameSettings *g;
char detectName[128];
+ char tempName[128];
+ bool heOver;
+ int heLastName = 0;
typedef Common::Map<Common::String, bool> StringSet;
StringSet fileSet;
@@ -2583,23 +2610,45 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {
} else if (g->features & GF_HUMONGOUS) {
strcpy(detectName, base);
strcat(detectName, ".he0");
+ strcpy(tempName, base);
+ strcat(tempName, ".he0");
} else {
strcpy(detectName, base);
strcat(detectName, ".000");
}
- // Iterate over all files in the given directory
- for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
- if (!file->isDirectory()) {
- const char *name = file->displayName().c_str();
-
- if (0 == scumm_stricmp(detectName, name)) {
- // Match found, add to list of candidates, then abort inner loop.
- detectedGames.push_back(g->toGameSettings());
- fileSet.addKey(file->path());
- break;
+ heOver = false;
+ heLastName = 0;
+
+ while (!heOver) {
+ // Iterate over all files in the given directory
+ for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
+ if (!file->isDirectory()) {
+ const char *name = file->displayName().c_str();
+
+ if (0 == scumm_stricmp(detectName, name)) {
+ // Match found, add to list of candidates, then abort inner loop.
+ if (heLastName > 0) { // HE Mac versions.
+ detectedGames.push_back(DetectedGame(g->toGameSettings(),
+ Common::UNK_LANG,
+ Common::kPlatformMacintosh));
+ fileSet[file->path()] = true;
+ } else {
+ detectedGames.push_back(g->toGameSettings());
+ fileSet[file->path()] = false;
+ }
+ break;
+ }
}
}
+
+ if (g->features & GF_HUMONGOUS) {
+ if ((heLastName = generateMacFileName(tempName, detectName, 128,
+ heLastName)) == -1)
+ heOver = true;
+ } else {
+ heOver = true;
+ }
}
}
@@ -2609,6 +2658,7 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {
for (StringSet::const_iterator iter = fileSet.begin(); iter != fileSet.end(); ++iter) {
uint8 md5sum[16];
const char *name = iter->_key.c_str();
+
if (md5_file(name, md5sum, 0, kMD5FileSizeLimit)) {
char md5str[32+1];
for (int j = 0; j < 16; j++) {
@@ -2639,11 +2689,14 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {
// Find the GameSettings for that target
for (g = scumm_settings; g->name; ++g) {
if (0 == scumm_stricmp(g->name, target))
- break;
+ break;
}
assert(g->name);
// Insert the 'enhanced' game data into the candidate list
- detectedGames.push_back(DetectedGame(g->toGameSettings(), elem->language, elem->platform));
+ if (iter->_value == true) // This was HE Mac game
+ detectedGames.push_back(DetectedGame(g->toGameSettings(), elem->language, Common::kPlatformMacintosh));
+ else
+ detectedGames.push_back(DetectedGame(g->toGameSettings(), elem->language, elem->platform));
exactMatch = true;
}
}
@@ -2652,6 +2705,30 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {
return detectedGames;
}
+static int generateMacFileName(const char *filename, char *buf, int bufsize, int cont) {
+ if (cont == -1)
+ return -1;
+
+ if (cont >= 0)
+ cont++;
+
+ char num = filename[strlen(filename) - 1];
+ char *n = strrchr(filename, '.');
+ int len = n - filename;
+
+ for (int i = cont; i < ARRAYSIZE(heMacFileNameTable); i++) {
+ if (!scumm_strnicmp(filename, heMacFileNameTable[i].winName, len)) {
+ if (heMacFileNameTable[i].hasParens)
+ snprintf(buf, bufsize, "%s (%c)", heMacFileNameTable[i].macName, num);
+ else
+ snprintf(buf, bufsize, "%s %c", heMacFileNameTable[i].macName, num);
+
+ return i;
+ }
+ }
+ return -1;
+}
+
Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst) {
Engine *engine;