diff options
author | Max Horn | 2006-04-15 00:24:20 +0000 |
---|---|---|
committer | Max Horn | 2006-04-15 00:24:20 +0000 |
commit | aa2964ceffe5bfa4ad1ee5d827e7bef17cb6c8cf (patch) | |
tree | cc33fd47d7999cb2a0ca4000156d44798e7710bd | |
parent | 0bad4c701eca214c6c9863a57b1a3557c67d7b91 (diff) | |
download | scummvm-rg350-aa2964ceffe5bfa4ad1ee5d827e7bef17cb6c8cf.tar.gz scummvm-rg350-aa2964ceffe5bfa4ad1ee5d827e7bef17cb6c8cf.tar.bz2 scummvm-rg350-aa2964ceffe5bfa4ad1ee5d827e7bef17cb6c8cf.zip |
Some more detector stub code (unused)
svn-id: r21896
-rw-r--r-- | engines/scumm/plugin.cpp | 279 |
1 files changed, 173 insertions, 106 deletions
diff --git a/engines/scumm/plugin.cpp b/engines/scumm/plugin.cpp index 9604332b84..a7657b99bf 100644 --- a/engines/scumm/plugin.cpp +++ b/engines/scumm/plugin.cpp @@ -615,111 +615,6 @@ struct GameFilenamePattern { const char *variant; }; -Common::String generateFilenameForDetection(const GameFilenamePattern &gfp) { - char buf[128]; - - switch (gfp.genMethod) { - case kGenDiskNum: - case kGenRoomNum: - snprintf(buf, sizeof(buf), gfp.pattern, 0); - break; - - case kGenHEPC: - snprintf(buf, sizeof(buf), "%s.he0", gfp.pattern); - break; - - case kGenHEMac: - snprintf(buf, sizeof(buf), "%s (0)", gfp.pattern); - break; - - case kGenHEMacNoParens: - snprintf(buf, sizeof(buf), "%s 0", gfp.pattern); - break; - - default: - error("generateFilenameForDetection: Unhandled genMethod"); - } - - return buf; -} - -#if 0 -Common::String ScummEngine::generateFilename(int room, int diskNumber) { - char buf[128]; - - if (_game.version == 4) { - if (room == 0 || room >= 900) { - snprintf(buf, sizeof(buf), "%.3d.lfl", room); - } else { - snprintf(buf, sizeof(buf), "disk%.2d.lec", diskNumber); - } - } else { - char id = 0; - - switch (_substEntry.genMethod) { - case kGenDiskNum: - snprintf(buf, sizeof(buf), _substEntry.pattern, diskNumber); - break; - - case kGenRoomNum: - snprintf(buf, sizeof(buf), _substEntry.pattern, room); - break; - - case kGenHEMac: - case kGenHEMacNoParens: - case kGenHEPC: - // FIXME: Not sure if the following HE section is quite correct... - if (_game.heversion >= 98) { - int disk = 0; - if (_heV7DiskOffsets) - disk = _heV7DiskOffsets[room]; - - switch(disk) { - case 2: - id = 'b'; - snprintf(buf, sizeof(buf), "%s.(b)", pattern); - break; - case 1: - id = 'a'; - snprintf(buf, sizeof(buf), "%s.(a)", pattern); - break; - default: - id = '0'; - snprintf(buf, sizeof(buf), "%s.he0", pattern); - } - } else if (_game.heversion >= 70) { - id = (room == 0) ? '0' : '1'; - } else { - id = diskNumber + '0'; - } - - if (_substEntry.genMethod == kGenHEPC) { - // For HE >= 98, we already called snprintf above. - if (_game.heversion < 98) - snprintf(buf, sizeof(buf), "%s.he%c", pattern, id); - } else { - if (id == '3') { // special case for cursors - // For mac they're stored in game binary - strncpy(buf, _substEntry.pattern, bufsize); - } else { - if (subst.genMethod == kGenMac) - snprintf(buf, sizeof(buf), "%s (%c)", _substEntry.pattern, id); - else - snprintf(buf, sizeof(buf), "%s %c", _substEntry.pattern, id); - } - } - - break; - - default: - error("FOO"); - } - } - - return buf; -} -#endif - using Common::UNK_LANG; // The following describes how Fingolfin thinks this table might be used one day; @@ -1069,7 +964,6 @@ static const GameFilenamePattern gameFilenamesTable[] = { { NULL, NULL, kGenUnchanged, UNK_LANG, UNK, 0 } }; - #endif @@ -1104,6 +998,179 @@ const MD5Table *findInMD5Table(const char *md5) { return (const MD5Table *)bsearch(md5, md5table, arraySize, sizeof(MD5Table), compareMD5Table); } +#if 0 +Common::String generateFilenameForDetection(const GameFilenamePattern &gfp) { + char buf[128]; + + switch (gfp.genMethod) { + case kGenDiskNum: + case kGenRoomNum: + snprintf(buf, sizeof(buf), gfp.pattern, 0); + break; + + case kGenHEPC: + snprintf(buf, sizeof(buf), "%s.he0", gfp.pattern); + break; + + case kGenHEMac: + snprintf(buf, sizeof(buf), "%s (0)", gfp.pattern); + break; + + case kGenHEMacNoParens: + snprintf(buf, sizeof(buf), "%s 0", gfp.pattern); + break; + + default: + error("generateFilenameForDetection: Unhandled genMethod"); + } + + return buf; +} + +#if 0 +Common::String ScummEngine::generateFilename(int room, int diskNumber) { + char buf[128]; + + if (_game.version == 4) { + if (room == 0 || room >= 900) { + snprintf(buf, sizeof(buf), "%.3d.lfl", room); + } else { + snprintf(buf, sizeof(buf), "disk%.2d.lec", diskNumber); + } + } else { + char id = 0; + + switch (_substEntry.genMethod) { + case kGenDiskNum: + snprintf(buf, sizeof(buf), _substEntry.pattern, diskNumber); + break; + + case kGenRoomNum: + snprintf(buf, sizeof(buf), _substEntry.pattern, room); + break; + + case kGenHEMac: + case kGenHEMacNoParens: + case kGenHEPC: + // FIXME: Not sure if the following HE section is quite correct... + if (_game.heversion >= 98) { + int disk = 0; + if (_heV7DiskOffsets) + disk = _heV7DiskOffsets[room]; + + switch(disk) { + case 2: + id = 'b'; + snprintf(buf, sizeof(buf), "%s.(b)", pattern); + break; + case 1: + id = 'a'; + snprintf(buf, sizeof(buf), "%s.(a)", pattern); + break; + default: + id = '0'; + snprintf(buf, sizeof(buf), "%s.he0", pattern); + } + } else if (_game.heversion >= 70) { + id = (room == 0) ? '0' : '1'; + } else { + id = diskNumber + '0'; + } + + if (_substEntry.genMethod == kGenHEPC) { + // For HE >= 98, we already called snprintf above. + if (_game.heversion < 98) + snprintf(buf, sizeof(buf), "%s.he%c", pattern, id); + } else { + if (id == '3') { // special case for cursors + // For mac they're stored in game binary + strncpy(buf, _substEntry.pattern, bufsize); + } else { + if (subst.genMethod == kGenMac) + snprintf(buf, sizeof(buf), "%s (%c)", _substEntry.pattern, id); + else + snprintf(buf, sizeof(buf), "%s %c", _substEntry.pattern, id); + } + } + + break; + + default: + error("FOO"); + } + } + + return buf; +} +#endif + +struct DetectorDesc { + Common::String path; + Common::String md5; + const MD5Table *md5Entry; // Entry of the md5 table corresponding to this file, if any. + //GameSettings game; +}; + +void detectGames(const FSList &fslist) { + typedef Common::HashMap<Common::String, DetectorDesc> DescMap; + DescMap fileMD5Map; + + for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { + if (!file->isDirectory()) { + DetectorDesc d; + d.path = file->path(); + d.md5Entry = 0; + fileMD5Map[file->displayName()] = d; + } + } + + // Iterate over all filename patterns. + for (const GameFilenamePattern *gfp = gameFilenamesTable; gfp->gameid; ++gfp) { + // Generate the detectname corresponding to the gfp. + Common::String file(generateFilenameForDetection(*gfp)); + if (!fileMD5Map.contains(file)) + continue; + + // OK, the file is present. Compute the MD5, if it hasn't been done yet. + DetectorDesc &d = fileMD5Map[file]; + if (d.md5.empty()) { + uint8 md5sum[16]; + if (Common::md5_file(d.path.c_str(), md5sum, 0, kMD5FileSizeLimit)) { + char md5str[32+1]; + for (int j = 0; j < 16; j++) { + sprintf(md5str + j*2, "%02x", (int)md5sum[j]); + } + + d.md5 = md5str; + d.md5Entry = findInMD5Table(md5str); + + if (d.md5Entry) { + TODO: Exact match found, handle this + } + } + } + + // If an exact match for this file has already been found, don't bother + // looking at it anymore. + if (d.md5Entry != 0) + continue; + + // At this point, the MD5 sum has been computed but is not known. + TODO: Look at the file (like in Engine_SCUMM_detectGames) to further + narrow down the possibilities... For names that are unique, we don't + have to do much more. For non-unique names, we could at least try + to determine the SCUMM version to somewhat reduce the list of + possible candidates. + + How to determine whether a detection filename is unique? Well the only + names which are *not* unique are 00.LFL and 000.LFL anyway! + + } +} + +#endif + + #pragma mark - #pragma mark --- Filename substitution --- #pragma mark - |