namespace Pegasus { static const PegasusGameDescription gameDescriptions[] = { { { "pegasus", "", AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2009943), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO0() }, }, { { "pegasus", "Demo", AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 360129), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK|ADGF_DEMO, GUIO1(GUIO_NOLAUNCHLOAD) }, }, { AD_TABLE_END_MARKER } }; } // End of namespace Pegasus
virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { // Set some defaults s_fallbackDesc.extra = ""; s_fallbackDesc.language = Common::UNK_LANG; s_fallbackDesc.flags = ADGF_UNSTABLE; s_fallbackDesc.platform = Common::kPlatformWindows; // default to Windows s_fallbackDesc.gameid = "wintermute"; s_fallbackDesc.guioptions = GUIO0(); if (allFiles.contains("data.dcp")) { Common::String name, caption; if (WintermuteEngine::getGameInfo(fslist, name, caption)) { for (uint32 i = 0; i < name.size(); i++) { // Replace spaces (and other non-alphanumerics) with underscores if (!Common::isAlnum(name[(int32)i])) { name.setChar('_', (uint32)i); } } // Prefix to avoid collisions with actually known games name = "wmefan-" + name; Common::strlcpy(s_fallbackGameIdBuf, name.c_str(), sizeof(s_fallbackGameIdBuf) - 1); s_fallbackDesc.gameid = s_fallbackGameIdBuf; if (caption != name) { caption += " (fangame) "; char *offset = s_fallbackGameIdBuf + name.size() + 1; uint32 remainingLength = (sizeof(s_fallbackGameIdBuf) - 1) - (name.size() + 1); Common::strlcpy(offset, caption.c_str(), remainingLength); s_fallbackDesc.extra = offset; s_fallbackDesc.flags |= ADGF_USEEXTRAASTITLE; } return &s_fallbackDesc; } // Fall through to return 0; } return 0; }
namespace Draci { const ADGameDescription gameDescriptions[] = { { "draci", 0, AD_ENTRY1s("INIT.DFW", "b890a5aeebaf16af39219cba2416b0a3", 906), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "draci", 0, AD_ENTRY1s("INIT.DFW", "9921c8f0045679a8f37eca8d41c5ec02", 906), Common::CZ_CZE, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "draci", 0, AD_ENTRY1s("INIT.DFW", "76b9b78a8a8809a240acc395df4d0715", 906), Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "draci", 0, AD_ENTRY1s("INIT.DFW", "9a7115b91cdea361bcaff3e046ac7ded", 906), Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, AD_TABLE_END_MARKER }; } // End of namespace Draci
namespace Gnap { static const ADGameDescription gameDescriptions[] = { { "gnap", "", { {"stock_n.dat", 0, "46819043d019a2f36b727cc2bdd6980f", 12515823}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformWindows, ADGF_TESTING, GUIO0() }, { "gnap", "", { {"stock_n.dat", 0, "46819043d019a2f36b727cc2bdd6980f", 12995485}, AD_LISTEND }, Common::RU_RUS, Common::kPlatformWindows, ADGF_TESTING, GUIO0() }, AD_TABLE_END_MARKER }; } // End of namespace Gnap
namespace Wintermute { /** * The fallback game descriptor used by the Wintermute engine's fallbackDetector. * Contents of this struct are overwritten by the fallbackDetector. (logic copied partially * from the SCI-engine). */ static ADGameDescription s_fallbackDesc = { "", "", AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor Common::UNK_LANG, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO0() }; static char s_fallbackGameIdBuf[256]; static const char *directoryGlobs[] = { "language", // To detect the various languages 0 }; class WintermuteMetaEngine : public AdvancedMetaEngine { public: WintermuteMetaEngine() : AdvancedMetaEngine(Wintermute::gameDescriptions, sizeof(ADGameDescription), Wintermute::wintermuteGames) { _singleid = "wintermute"; _maxScanDepth = 2; _directoryGlobs = directoryGlobs; } virtual const char *getName() const { return "Wintermute"; } virtual const char *getOriginalCopyright() const { return "Copyright (c) 2011 Jan Nedoma"; } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { // Set some defaults s_fallbackDesc.extra = ""; s_fallbackDesc.language = Common::UNK_LANG; s_fallbackDesc.flags = ADGF_UNSTABLE; s_fallbackDesc.platform = Common::kPlatformWindows; // default to Windows s_fallbackDesc.gameid = "wintermute"; s_fallbackDesc.guioptions = GUIO0(); if (allFiles.contains("data.dcp")) { Common::String name, caption; if (WintermuteEngine::getGameInfo(fslist, name, caption)) { for (uint32 i = 0; i < name.size(); i++) { // Replace spaces (and other non-alphanumerics) with underscores if (!Common::isAlnum(name[(int32)i])) { name.setChar('_', (uint32)i); } } // Prefix to avoid collisions with actually known games name = "wmefan-" + name; Common::strlcpy(s_fallbackGameIdBuf, name.c_str(), sizeof(s_fallbackGameIdBuf) - 1); s_fallbackDesc.gameid = s_fallbackGameIdBuf; if (caption != name) { caption += " (fangame) "; char *offset = s_fallbackGameIdBuf + name.size() + 1; uint32 remainingLength = (sizeof(s_fallbackGameIdBuf) - 1) - (name.size() + 1); Common::strlcpy(offset, caption.c_str(), remainingLength); s_fallbackDesc.extra = offset; s_fallbackDesc.flags |= ADGF_USEEXTRAASTITLE; } return &s_fallbackDesc; } // Fall through to return 0; } return 0; } virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { assert(syst); assert(engine); *engine = new Wintermute::WintermuteEngine(syst, desc); return true; } bool hasFeature(MetaEngineFeature f) const { switch (f) { case MetaEngine::kSupportsListSaves: return true; case MetaEngine::kSupportsLoadingDuringStartup: return true; case MetaEngine::kSupportsDeleteSave: return true; case MetaEngine::kSavesSupportCreationDate: return true; case MetaEngine::kSavesSupportMetaInfo: return true; case MetaEngine::kSavesSupportThumbnail: return true; default: return false; } } SaveStateList listSaves(const char *target) const { SaveStateList saves; Wintermute::BasePersistenceManager pm(target, true); for (int i = 0; i < getMaximumSaveSlot(); i++) { if (pm.getSaveExists(i)) { SaveStateDescriptor desc; pm.getSaveStateDesc(i, desc); saves.push_back(desc); } } return saves; } int getMaximumSaveSlot() const { return 100; } void removeSaveState(const char *target, int slot) const { Wintermute::BasePersistenceManager pm(target, true); pm.deleteSaveSlot(slot); } virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { Wintermute::BasePersistenceManager pm(target, true); SaveStateDescriptor retVal; retVal.setDescription("Invalid savegame"); pm.getSaveStateDesc(slot, retVal); return retVal; } }; } // end of namespace Wintermute
MacVentureMetaEngine() : AdvancedMetaEngine(MacVenture::gameDescriptions, sizeof(ADGameDescription), macventureGames) { _guiOptions = GUIO0(); _md5Bytes = 5000000; // TODO: Upper limit, adjust it once all games are added }
{ 0, 0 } }; static const ADGameDescription labDescriptions[] = { { "lab", "", { { "doors", 0, "d77536010e7e5ae17ee066323ceb9585", 2537 }, // game/doors { "noteold.fon", 0, "6c1d90ad55149556e79d3f7bfddb4bd7", 9252 }, // game/spict/noteold.fon { NULL, 0, NULL, 0 } }, Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "lab", "Lowres", { { "doors", 0, "d77536010e7e5ae17ee066323ceb9585", 2537 }, // game/doors { "64b", 0, "3a84d41bcc6a782f22e8e954bce09721", 39916 }, // game/pict/h2/64b { NULL, 0, NULL, 0 } }, Common::EN_ANY, Common::kPlatformDOS, Lab::GF_LOWRES | ADGF_NO_FLAGS, GUIO0() }, {
namespace Toon { static const ADGameDescription gameDescriptions[] = { { "toon", "", { {"local.pak", 0, "3290209ef9bc92692108dd2f45df0736", 3237611}, {"arcaddbl.svl", 0, "c418478cd2833c7c983799f948af41ac", 7844688}, {"study.svl", 0, "281efa3f33f6712c0f641a605f4d40fd", 2511090}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "toon", "", { {"local.pak", 0, "517132c3575b38806d1e7b6f59848072", 3224044}, {"arcaddbl.svl", 0, "ff74008827b62fbef1f46f104c438e44", 9699256}, {"study.svl", 0, "df056b94ea83f1ed92a539cf636053ab", 2542668}, AD_LISTEND }, Common::FR_FRA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "toon", "", { {"local.pak", 0, "bf5da4c03f78ffbd643f12122319366e", 3250841}, {"arcaddbl.svl", 0, "7a0d74f4d66d1c722b946abbeb0834ef", 9122249}, {"study.svl", 0, "72fe96a9e10967d3138e918295babc42", 2910283}, AD_LISTEND }, Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "toon", "", { {"local.pak", 0, "e8645168a247e2abdbfc2f9fa9d1c0fa", 3232222}, {"arcaddbl.svl", 0, "7893ac4cc78d51356baa058bbee7aa28", 8275016}, {"study.svl", 0, "b6b1ee2d9d94d53d305856039ab7bde7", 2634620}, AD_LISTEND }, Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "toon", "", { {"local.pak", 0, "48ec60709bebbdeff791d55ee18ec910", 3417846}, {"arcaddbl.svl", 0, "1d1b96e317e03ffd3874a8ebe59556f3", 6246232}, {"study.svl", 0, "d4aff126ee27be3c3d25e2996369d7cb", 2324368}, }, Common::RU_RUS, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { "toon", "", { {"local.pak", 0, "bf5da4c03f78ffbd643f12122319366e", 3250841}, {"wacexdbl.emc", 0, "cfbc2156a31b294b038204888407ebc8", 6974}, {"generic.svl", 0, "5eb99850ada22f0b8cf6392262d4dd07", 9404599}, AD_LISTEND }, Common::DE_DEU, Common::kPlatformDOS, ADGF_DEMO, GUIO0() }, { "toon", "", { {"local.pak", 0, "8ef3368078b9ea70b305c04db826feea", 2680573}, {"generic.svl", 0, "5c42724bb93b360dca7044d6b7ef26e5", 7739319}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO0() }, AD_TABLE_END_MARKER }; static const ADFileBasedFallback fileBasedFallback[] = { { &gameDescriptions[0], { "local.pak", "arcaddbl.svl", "study.svl", 0 } }, // default to english version { 0, { 0 } } }; } // End of namespace Toon
const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { bool foundResMap = false; bool foundRes000 = false; // Set some defaults s_fallbackDesc.extra = ""; s_fallbackDesc.language = Common::EN_ANY; s_fallbackDesc.flags = ADGF_NO_FLAGS; s_fallbackDesc.platform = Common::kPlatformPC; // default to PC platform s_fallbackDesc.gameid = "sci"; s_fallbackDesc.guioptions = GUIO0(); if (allFiles.contains("resource.map") || allFiles.contains("Data1") || allFiles.contains("resmap.001") || allFiles.contains("resmap.001")) { foundResMap = true; } // Determine if we got a CD version and set the CD flag accordingly, by checking for // resource.aud for SCI1.1 CD games, or audio001.002 for SCI1 CD games. We assume that // the file should be over 10MB, as it contains all the game speech and is usually // around 450MB+. The size check is for some floppy game versions like KQ6 floppy, which // also have a small resource.aud file if (allFiles.contains("resource.aud") || allFiles.contains("audio001.002")) { Common::FSNode file = allFiles.contains("resource.aud") ? allFiles["resource.aud"] : allFiles["audio001.002"]; Common::SeekableReadStream *tmpStream = file.createReadStream(); if (tmpStream->size() > 10 * 1024 * 1024) { // We got a CD version, so set the CD flag accordingly s_fallbackDesc.flags |= ADGF_CD; } delete tmpStream; } if (allFiles.contains("resource.000") || allFiles.contains("resource.001") || allFiles.contains("ressci.000") || allFiles.contains("ressci.001")) foundRes000 = true; // Data1 contains both map and volume for SCI1.1+ Mac games if (allFiles.contains("Data1")) { foundResMap = foundRes000 = true; s_fallbackDesc.platform = Common::kPlatformMacintosh; } // Determine the game platform // The existence of any of these files indicates an Amiga game if (allFiles.contains("9.pat") || allFiles.contains("spal") || allFiles.contains("patch.005") || allFiles.contains("bank.001")) s_fallbackDesc.platform = Common::kPlatformAmiga; // The existence of 7.pat or patch.200 indicates a Mac game if (allFiles.contains("7.pat") || allFiles.contains("patch.200")) s_fallbackDesc.platform = Common::kPlatformMacintosh; // The data files for Atari ST versions are the same as their DOS counterparts // If these files aren't found, it can't be SCI if (!foundResMap && !foundRes000) { return 0; } ResourceManager resMan; resMan.addAppropriateSources(fslist); resMan.init(true); // TODO: Add error handling. #ifndef ENABLE_SCI32 // Is SCI32 compiled in? If not, and this is a SCI32 game, // stop here if (getSciVersion() >= SCI_VERSION_2) { return (const ADGameDescription *)&s_fallbackDesc; } #endif ViewType gameViews = resMan.getViewType(); // Have we identified the game views? If not, stop here // Can't be SCI (or unsupported SCI views). Pinball Creep by sierra also uses resource.map/resource.000 files // but doesnt share sci format at all, if we dont return 0 here we will detect this game as SCI if (gameViews == kViewUnknown) { return 0; } // Set the platform to Amiga if the game is using Amiga views if (gameViews == kViewAmiga) s_fallbackDesc.platform = Common::kPlatformAmiga; // Determine the game id Common::String sierraGameId = resMan.findSierraGameId(); // If we don't have a game id, the game is not SCI if (sierraGameId.empty()) { return 0; } Common::String gameId = convertSierraGameId(sierraGameId, &s_fallbackDesc.flags, resMan); strncpy(s_fallbackGameIdBuf, gameId.c_str(), sizeof(s_fallbackGameIdBuf) - 1); s_fallbackGameIdBuf[sizeof(s_fallbackGameIdBuf) - 1] = 0; // Make sure string is NULL terminated s_fallbackDesc.gameid = s_fallbackGameIdBuf; // Try to determine the game language // Load up text 0 and start looking for "#" characters // Non-English versions contain strings like XXXX#YZZZZ // Where XXXX is the English string, #Y a separator indicating the language // (e.g. #G for German) and ZZZZ is the translated text // NOTE: This doesn't work for games which use message instead of text resources // (like, for example, Eco Quest 1 and all SCI1.1 games and newer, e.g. Freddy Pharkas). // As far as we know, these games store the messages of each language in separate // resources, and it's not possible to detect that easily // Also look for "%J" which is used in japanese games Resource *text = resMan.findResource(ResourceId(kResourceTypeText, 0), 0); uint seeker = 0; if (text) { while (seeker < text->size) { if (text->data[seeker] == '#') { if (seeker + 1 < text->size) s_fallbackDesc.language = charToScummVMLanguage(text->data[seeker + 1]); break; } if (text->data[seeker] == '%') { if ((seeker + 1 < text->size) && (text->data[seeker + 1] == 'J')) { s_fallbackDesc.language = charToScummVMLanguage(text->data[seeker + 1]); break; } } seeker++; } } // Fill in "extra" field // Is this an EGA version that might have a VGA pendant? Then we want // to mark it as such in the "extra" field. const bool markAsEGA = (gameViews == kViewEga && s_fallbackDesc.platform != Common::kPlatformAmiga && getSciVersion() > SCI_VERSION_1_EGA_ONLY); const bool isDemo = (s_fallbackDesc.flags & ADGF_DEMO); const bool isCD = (s_fallbackDesc.flags & ADGF_CD); if (!isCD) s_fallbackDesc.guioptions = GUIO1(GUIO_NOSPEECH); if (gameId.hasSuffix("sci")) { s_fallbackDesc.extra = "SCI"; // Differentiate EGA versions from the VGA ones, where needed if (markAsEGA) s_fallbackDesc.extra = "SCI/EGA"; // Mark as demo. // Note: This overwrites the 'EGA' info, if it was previously set. if (isDemo) s_fallbackDesc.extra = "SCI/Demo"; } else { if (markAsEGA) s_fallbackDesc.extra = "EGA"; // Set "CD" and "Demo" as appropriate. // Note: This overwrites the 'EGA' info, if it was previously set. if (isDemo && isCD) s_fallbackDesc.extra = "CD Demo"; else if (isDemo) s_fallbackDesc.extra = "Demo"; else if (isCD) s_fallbackDesc.extra = "CD"; } return &s_fallbackDesc; }
{ {"off.res", 0, NULL, -1}, {"on.res", 0, NULL, -1}, {"ons.res", 0, NULL, -1}, {"varia.res", 0, NULL, -1}, {"lan_000.res", 0, NULL, -1}, {"lan_500.res", 0, NULL, -1}, {"sam_sam.res", 0, NULL, -1}, {"voices.res", 0, NULL, -1}, {"cdlogo.res", 0, NULL, -1}, {NULL, 0, NULL, 0} }, Common::CZ_CZE, Common::kPlatformDOS, ADGF_CD, GUIO0() }, AD_TABLE_END_MARKER, }; enum { MAX_SAVES = 20 }; class TeenAgentMetaEngine : public AdvancedMetaEngine { public: TeenAgentMetaEngine() : AdvancedMetaEngine(teenAgentGameDescriptions, sizeof(ADGameDescription), teenAgentGames) { _singleid = "teenagent"; } virtual const char *getName() const {
namespace Avalanche { struct AvalancheGameDescription { ADGameDescription desc; }; uint32 AvalancheEngine::getFeatures() const { return _gameDescription->desc.flags; } const char *AvalancheEngine::getGameId() const { return _gameDescription->desc.gameid; } static const PlainGameDescriptor avalancheGames[] = { {"avalanche", "Lord Avalot d'Argent"}, {0, 0} }; static const ADGameDescription gameDescriptions[] = { { "avalanche", 0, { {"avalot.sez", 0, "de10eb353228013da3d3297784f81ff9", 48763}, {"mainmenu.avd", 0, "89f31211af579a872045b175cc264298", 18880}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, AD_TABLE_END_MARKER }; class AvalancheMetaEngine : public AdvancedMetaEngine { public: AvalancheMetaEngine() : AdvancedMetaEngine(gameDescriptions, sizeof(AvalancheGameDescription), avalancheGames) { } const char *getName() const { return "Avalanche"; } const char *getOriginalCopyright() const { return "Avalanche Engine Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman."; } bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const; bool hasFeature(MetaEngineFeature f) const; int getMaximumSaveSlot() const { return 99; } SaveStateList listSaves(const char *target) const; void removeSaveState(const char *target, int slot) const; SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; }; bool AvalancheMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const { if (gd) *engine = new AvalancheEngine(syst, (const AvalancheGameDescription *)gd); return gd != 0; } bool AvalancheMetaEngine::hasFeature(MetaEngineFeature f) const { return (f == kSupportsListSaves) || (f == kSupportsDeleteSave) || (f == kSupportsLoadingDuringStartup) || (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail); } SaveStateList AvalancheMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = target; pattern.toUppercase(); pattern += ".???"; filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { const Common::String &fname = *filename; int slotNum = atoi(fname.c_str() + fname.size() - 3); if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { Common::InSaveFile *file = saveFileMan->openForLoading(fname); if (file) { // Check for our signature. uint32 signature = file->readUint32LE(); if (signature != MKTAG('A', 'V', 'A', 'L')) { warning("Savegame of incompatible type!"); delete file; continue; } // Check version. byte saveVersion = file->readByte(); if (saveVersion != kSavegameVersion) { warning("Savegame of incompatible version!"); delete file; continue; } // Read name. uint32 nameSize = file->readUint32LE(); if (nameSize >= 255) { delete file; continue; } char *name = new char[nameSize + 1]; file->read(name, nameSize); name[nameSize] = 0; saveList.push_back(SaveStateDescriptor(slotNum, name)); delete[] name; delete file; } } } return saveList; } void AvalancheMetaEngine::removeSaveState(const char *target, int slot) const { Common::String fileName = Common::String::format("%s.%03d", target, slot); g_system->getSavefileManager()->removeSavefile(fileName); } SaveStateDescriptor AvalancheMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String fileName = Common::String::format("%s.%03d", target, slot); Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName); if (f) { // Check for our signature. uint32 signature = f->readUint32LE(); if (signature != MKTAG('A', 'V', 'A', 'L')) { warning("Savegame of incompatible type!"); delete f; return SaveStateDescriptor(); } // Check version. byte saveVersion = f->readByte(); if (saveVersion > kSavegameVersion) { warning("Savegame of a too recent version!"); delete f; return SaveStateDescriptor(); } // Read the description. uint32 descSize = f->readUint32LE(); Common::String description; for (uint32 i = 0; i < descSize; i++) { char actChar = f->readByte(); description += actChar; } SaveStateDescriptor desc(slot, description); Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*f); desc.setThumbnail(thumbnail); delete f; return desc; } return SaveStateDescriptor(); } } // End of namespace Avalanche
namespace CGE { static const ADGameDescription gameDescriptions[] = { { "soltys", "", { {"vol.cat", 0, "0c33e2c304821a2444d297fc5e2d67c6", 50176}, {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437572}, AD_LISTEND }, Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, { "soltys", "Soltys Freeware", { {"vol.cat", 0, "0c33e2c304821a2444d297fc5e2d67c6", 50176}, {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437676}, AD_LISTEND }, Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, { "soltys", "Soltys Demo (not supported)", { {"vol.cat", 0, "1e077c8ff58109a187f07ac54b0c873a", 18788}, {"vol.dat", 0, "75d385a6074c58b69f7730481f256051", 1796710}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO , GUIO0() }, { "soltys", "Soltys Demo (not supported)", { {"vol.cat", 0, "f17987487fab1ebddd781d8d02fedecc", 7168}, {"vol.dat", 0, "c5d9b15863cab61dc125551576dece04", 1075272}, AD_LISTEND }, Common::PL_POL, Common::kPlatformPC, ADGF_DEMO , GUIO0() }, { "soltys", "Soltys Freeware v1.0", { {"vol.cat", 0, "f1675684c68ab90272f5776f8f2c3974", 50176}, {"vol.dat", 0, "4ffeff4abc99ac5999b55ccfc56ab1df", 8430868}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS , GUIO0() }, { "soltys", "Soltys Freeware v1.0", { {"vol.cat", 0, "20fdce799adb618100ef9ee2362be875", 50176}, {"vol.dat", 0, "0e43331c846094d77f5dd201827e0a3b", 8439339}, AD_LISTEND }, Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, AD_TABLE_END_MARKER }; static const ADFileBasedFallback fileBasedFallback[] = { { &gameDescriptions[0], { "vol.cat", "vol.dat", 0 } }, { 0, { 0 } } }; } // End of namespace CGE
namespace CGE { struct CgeGameDescription { ADGameDescription desc; GameType gameType; }; static const CgeGameDescription gameDescriptions[] = { { { "soltys", "", { {"vol.cat", 0, "0c33e2c304821a2444d297fc5e2d67c6", 50176}, {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437572}, AD_LISTEND }, Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, kGameTypeSoltys }, { { "soltys", "Soltys Freeware", { {"vol.cat", 0, "0c33e2c304821a2444d297fc5e2d67c6", 50176}, {"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437676}, AD_LISTEND }, Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, kGameTypeSoltys }, { { "soltys", "Soltys Demo (not supported)", { {"vol.cat", 0, "1e077c8ff58109a187f07ac54b0c873a", 18788}, {"vol.dat", 0, "75d385a6074c58b69f7730481f256051", 1796710}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO , GUIO0() }, kGameTypeSoltys }, { { "soltys", "Soltys Demo (not supported)", { {"vol.cat", 0, "f17987487fab1ebddd781d8d02fedecc", 7168}, {"vol.dat", 0, "c5d9b15863cab61dc125551576dece04", 1075272}, AD_LISTEND }, Common::PL_POL, Common::kPlatformDOS, ADGF_DEMO , GUIO0() }, kGameTypeSoltys }, { { "soltys", "Soltys Freeware v1.0", { {"vol.cat", 0, "f1675684c68ab90272f5776f8f2c3974", 50176}, {"vol.dat", 0, "4ffeff4abc99ac5999b55ccfc56ab1df", 8430868}, AD_LISTEND }, Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS , GUIO0() }, kGameTypeSoltys }, { { "soltys", "Soltys Freeware v1.0", { {"vol.cat", 0, "20fdce799adb618100ef9ee2362be875", 50176}, {"vol.dat", 0, "0e43331c846094d77f5dd201827e0a3b", 8439339}, AD_LISTEND }, Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, kGameTypeSoltys }, { { "soltys", "Soltys Freeware v1.0", { {"vol.cat", 0, "fcae86b20eaa5cedec17b24fa5e85eb4", 50176}, {"vol.dat", 0, "ff10d54acc2c95696c57e05819b6906f", 8450151}, AD_LISTEND }, Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS , GUIO0() }, kGameTypeSoltys }, { { // Polish version, provided by Strangerke "sfinx", "Sfinx Freeware", { {"vol.cat", 0, "21197b287d397c53261b6616bf0dd880", 129024}, {"vol.dat", 0, "de14291869a8eb7c2732ab783c7542ef", 34180844}, AD_LISTEND }, Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, kGameTypeSfinx }, {AD_TABLE_END_MARKER, kGameTypeNone} }; static const ADFileBasedFallback fileBasedFallback[] = { { &gameDescriptions[0].desc, { "vol.cat", "vol.dat", 0 } }, { 0, { 0 } } }; } // End of namespace CGE
namespace Drascula { static const DrasculaGameDescription gameDescriptions[] = { //// Packed versions ////////////////////////////////////////////////////// { // Drascula English version (original packed files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, // HACK: List packet.001 twice to ensure this detector entry // is ranked just as high as the others (which each have two // detection files). {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {NULL, 0, NULL, 0} }, Common::EN_ANY, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula French version (original packed files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.002", 1, "4401123400f22f212b89f15fb4b43013", 721122}, {NULL, 0, NULL, 0} }, Common::FR_FRA, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula French version (ScummVM repacked files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.002", 1, "7b83cedb9bb326ed5143e5c459508d43", 722383}, {NULL, 0, NULL, 0} }, Common::FR_FRA, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula German version (original packed files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.003", 1, "e8f4dc6091037329bab4ddb1cba35807", 719728}, {NULL, 0, NULL, 0} }, Common::DE_DEU, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula Italian version (original packed version) { "drascula", 0, AD_ENTRY1s("packet.001", "0253e924af223f5fe52537023385159b", 32564209), Common::IT_ITA, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula Italian version (ScummVM repacked files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.005", 1, "58caac54b891f5d7f335e710e45e5d29", 16209623}, {NULL, 0, NULL, 0} }, Common::IT_ITA, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula Spanish version (original packed version) { "drascula", 0, AD_ENTRY1s("packet.001", "3c971aba65a037d29d0b479cad6f5943", 31702652), Common::ES_ESP, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, { // Drascula Spanish version (ScummVM repacked files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.004", 1, "a289d3cf80d50f25ec569b653248437e", 17205838}, {NULL, 0, NULL, 0} }, Common::ES_ESP, Common::kPlatformDOS, GF_PACKED, GUIO0() }, }, //// Unpacked versions //////////////////////////////////////////////////// { // Drascula English version { "drascula", 0, AD_ENTRY1s("14.ald", "09b2735953edcd43af115c65ae00b10e", 1595), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula French version { "drascula", 0, AD_ENTRY1s("14.ald", "eeeee96b82169003630e08992248296c", 608), Common::FR_FRA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula French version (updated - bug #3612236) { "drascula", 0, AD_ENTRY1s("14.ald", "1f9fbded768bee061cc22bc5bdeab540", 611), Common::FR_FRA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula German version { "drascula", 0, AD_ENTRY1s("14.ald", "72e46089033d56bad1c179ac36e2a9d2", 610), Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula Italian version { "drascula", 0, AD_ENTRY1s("14.ald", "02b49a18328d0bf2efe6ba658c9c7a1d", 2098), Common::IT_ITA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula Italian version (updated - bug #3612236) { "drascula", 0, AD_ENTRY1s("14.ald", "ccaee939bb3b344c048f28f9205710d1", 2925), Common::IT_ITA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula Spanish version { "drascula", 0, AD_ENTRY1s("14.ald", "0746ed1a5cc8d9728f790c29813f4b43", 23059), Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, }, { AD_TABLE_END_MARKER } }; static const ExtraGuiOption drasculaExtraGuiOption = { _s("Use original save/load screens"), _s("Use the original save/load screens, instead of the ScummVM ones"), "originalsaveload", false }; SaveStateDescriptor loadMetaData(Common::ReadStream *s, int slot, bool setPlayTime); class DrasculaMetaEngine : public AdvancedMetaEngine { public: DrasculaMetaEngine() : AdvancedMetaEngine(Drascula::gameDescriptions, sizeof(Drascula::DrasculaGameDescription), drasculaGames) { _singleid = "drascula"; _guioptions = GUIO1(GUIO_NOMIDI); } virtual const char *getName() const { return "Drascula"; } virtual const char *getOriginalCopyright() const { return "Drascula Engine (C) 2000 Alcachofa Soft, (C) 1996 Digital Dreams Multimedia, (C) 1994 Emilio de Paz"; } virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const; virtual bool hasFeature(MetaEngineFeature f) const; virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const; virtual SaveStateList listSaves(const char *target) const; virtual int getMaximumSaveSlot() const; virtual void removeSaveState(const char *target, int slot) const; SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; }; bool DrasculaMetaEngine::hasFeature(MetaEngineFeature f) const { return (f == kSupportsListSaves) || (f == kSupportsLoadingDuringStartup) || (f == kSupportsDeleteSave) || (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail) || (f == kSavesSupportCreationDate) || (f == kSavesSupportPlayTime); } const ExtraGuiOptions DrasculaMetaEngine::getExtraGuiOptions(const Common::String &target) const { ExtraGuiOptions options; options.push_back(drasculaExtraGuiOption); return options; } SaveStateList DrasculaMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = target; pattern += ".###"; filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; int slotNum = 0; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { SaveStateDescriptor desc = loadMetaData(in, slotNum, false); if (desc.getSaveSlot() != slotNum) { // invalid delete in; continue; } saveList.push_back(desc); delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; } SaveStateDescriptor DrasculaMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String fileName = Common::String::format("%s.%03d", target, slot); Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(fileName); SaveStateDescriptor desc; // Do not allow save slot 0 (used for auto-saving) to be deleted or // overwritten. desc.setDeletableFlag(slot != 0); desc.setWriteProtectedFlag(slot == 0); if (in) { desc = Drascula::loadMetaData(in, slot, false); if (desc.getSaveSlot() != slot) { delete in; return SaveStateDescriptor(); } Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in); desc.setThumbnail(thumbnail); delete in; } return desc; } int DrasculaMetaEngine::getMaximumSaveSlot() const { return 999; } void DrasculaMetaEngine::removeSaveState(const char *target, int slot) const { Common::String fileName = Common::String::format("%s.%03d", target, slot); g_system->getSavefileManager()->removeSavefile(fileName); } bool DrasculaMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { const Drascula::DrasculaGameDescription *gd = (const Drascula::DrasculaGameDescription *)desc; if (gd) { *engine = new Drascula::DrasculaEngine(syst, gd); } return gd != 0; } } // End of namespace Drascula
namespace Drascula { static const DrasculaGameDescription gameDescriptions[] = { { // Drascula English version { "drascula", 0, AD_ENTRY1s("14.ald", "09b2735953edcd43af115c65ae00b10e", 1595), Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula English version (original packed files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, // HACK: List packet.001 twice to ensure this detector entry // is ranked just as high as the others (which each have two // detection files). {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {NULL, 0, NULL, 0} }, Common::EN_ANY, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula German version (original packed files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.003", 1, "e8f4dc6091037329bab4ddb1cba35807", 719728}, {NULL, 0, NULL, 0} }, Common::DE_DEU, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula French version (original packed files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.002", 1, "4401123400f22f212b89f15fb4b43013", 721122}, {NULL, 0, NULL, 0} }, Common::FR_FRA, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula Spanish version (original packed version) { "drascula", 0, AD_ENTRY1s("packet.001", "3c971aba65a037d29d0b479cad6f5943", 31702652), Common::ES_ESP, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula Spanish version { "drascula", 0, AD_ENTRY1s("14.ald", "0746ed1a5cc8d9728f790c29813f4b43", 23059), Common::ES_ESP, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula German version { "drascula", 0, AD_ENTRY1s("14.ald", "72e46089033d56bad1c179ac36e2a9d2", 610), Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula French version { "drascula", 0, AD_ENTRY1s("14.ald", "eeeee96b82169003630e08992248296c", 608), Common::FR_FRA, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula Italian version (original packed version) { "drascula", 0, AD_ENTRY1s("packet.001", "0253e924af223f5fe52537023385159b", 32564209), Common::IT_ITA, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula Italian version { "drascula", 0, AD_ENTRY1s("14.ald", "02b49a18328d0bf2efe6ba658c9c7a1d", 2098), Common::IT_ITA, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO0() }, }, { // Drascula Spanish version (ScummVM repacked files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.004", 1, "a289d3cf80d50f25ec569b653248437e", 17205838}, {NULL, 0, NULL, 0} }, Common::ES_ESP, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula Italian version (ScummVM repacked files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.005", 1, "58caac54b891f5d7f335e710e45e5d29", 16209623}, {NULL, 0, NULL, 0} }, Common::IT_ITA, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { // Drascula French version (ScummVM repacked files) { "drascula", 0, { {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, {"packet.002", 1, "7b83cedb9bb326ed5143e5c459508d43", 722383}, {NULL, 0, NULL, 0} }, Common::FR_FRA, Common::kPlatformPC, GF_PACKED, GUIO0() }, }, { AD_TABLE_END_MARKER } }; } // End of namespace Drascula
int dataDiskSize; const char *extraDesc; int version; const char *guioptions; }; // TODO: Would be nice if Disk::determineGameVersion() used this table, too. static const SkyVersion skyVersions[] = { { 232, -1, "floppy demo", 272, GUIO1(GUIO_NOSPEECH) }, // German { 243, -1, "pc gamer demo", 109, GUIO1(GUIO_NOSPEECH) }, { 247, -1, "floppy demo", 267, GUIO1(GUIO_NOSPEECH) }, // English { 1404, -1, "floppy", 288, GUIO1(GUIO_NOSPEECH) }, { 1413, -1, "floppy", 303, GUIO1(GUIO_NOSPEECH) }, { 1445, 8830435, "floppy", 348, GUIO1(GUIO_NOSPEECH) }, { 1445, -1, "floppy", 331, GUIO1(GUIO_NOSPEECH) }, { 1711, -1, "cd demo", 365, GUIO0() }, { 5099, -1, "cd", 368, GUIO0() }, { 5097, -1, "cd", 372, GUIO0() }, { 0, 0, 0, 0, 0 } }; class SkyMetaEngine : public MetaEngine { public: const char *getEngineID() const { return "sky"; } const char *getName() const; const char *getOriginalCopyright() const; bool hasFeature(MetaEngineFeature f) const;
namespace Touche { static const ADGameDescription gameDescriptions[] = { { // retail version "touche", "", AD_ENTRY1s("touche.dat", "2af0177f8887e3430f345e6b4d8b1414", 26350211), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // retail version - tracker item #1601818 "touche", "", AD_ENTRY1s("touche.dat", "95967f0b51d2e813e99ca00325098340", 26350190), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // retail version "touche", "", AD_ENTRY1s("touche.dat", "1caa20bb4d4fc2ce8eb867b6610082b3", 26558232), Common::FR_FRA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // retail version - tracker item #1598643 "touche", "", AD_ENTRY1s("touche.dat", "be2ae6454b3325e410946f2322547cd4", 26625537), Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // retail version - tracker item #1681643 "touche", "", AD_ENTRY1s("touche.dat", "64e95ba1decf5a5a60f8fa1840f40c62", 26529523), Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // fan-made translation (http://www.iagtg.net/) - tracker item #1602360 "touche", "", AD_ENTRY1s("touche.dat", "1f442331d4b327c3488a9f6ffe9bdd25", 26367792), Common::IT_ITA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // retail version - tracker item #1800500 "touche", "", AD_ENTRY1s("touche.dat", "42d19a0bef65465109020440a9caa228", 26487370), Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, { // demo version "touche", "Demo", AD_ENTRY1s("touche.dat", "ddaed436445b2e77294ed19e8ae4aa2c", 8720683), Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO0() }, AD_TABLE_END_MARKER }; static const ADFileBasedFallback fileBasedFallback[] = { { &gameDescriptions[0], { "touche.dat", 0 } }, // default to english version { 0, { 0 } } }; } // End of namespace Touche
namespace Made { static const MadeGameDescription gameDescriptions[] = { { // NOTE: Return to Zork entries with *.dat are used to detect the game via rtzcd.dat, // which is packed inside rtzcd.red. Entries with *.red refer to the packed file // directly, which is the "official" way. // Return to Zork - English CD version 1.0 9/15/93 (installed) // Patch #1953654 submitted by spookypeanut { "rtz", "V1.0, 9/15/93, installed, CD", AD_ENTRY1("rtzcd.dat", "e95c38ded389e39cfbf87a8cb250b12e"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - English CD version 1.0 9/15/93 // Patch #1953654 submitted by spookypeanut { "rtz", "V1.0, 9/15/93, CD", AD_ENTRY1("rtzcd.red", "cd8b62ece4677c438688c1de3f5379b9"), Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD_COMPRESSED, 3, }, { // Return to Zork - English CD version 1.1 12/7/93 (installed) { "rtz", "V1.1, 12/7/93, installed, CD", AD_ENTRY1s("rtzcd.dat", "a1db8c97a78dae10f91d356f16ad07b8", 536064), Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - English CD version 1.1 12/7/93 { "rtz", "V1.1, 12/7/93, CD", AD_ENTRY1s("rtzcd.red", "c4e2430e6b6c6ff1562a80fb4a9df24c", 276177), Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD_COMPRESSED, 3, }, { // Return to Zork - English CD version 1.2 9/29/94 (installed) // Supplied by Dark-Star in the ScummVM forums { "rtz", "V1.2, 9/29/94, installed, CD", AD_ENTRY1("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a"), Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - English CD version 1.2 9/29/94 { "rtz", "V1.2, 9/29/94, CD", AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 276584), Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD_COMPRESSED, 3, }, { // Return to Zork - German CD version 1.2 9/29/94 (installed) // Supplied by Dark-Star in the ScummVM forums { "rtz", "V1.2, 9/29/94, installed, CD", AD_ENTRY1s("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a", 525824), Common::DE_DEU, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - German CD version 1.2 4/18/95 // Supplied by Dark-Star in the ScummVM forums { "rtz", "V1.2, 4/18/95, CD", AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 355442), Common::DE_DEU, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD_COMPRESSED, 3, }, { // Return to Zork - Italian CD version 1.2 3/31/95 (installed) // Patch #2685032 submitted by goodoldgeorg { "rtz", "V1.2, 3/31/95, installed, CD", AD_ENTRY1s("rtzcd.dat", "5b86035aed0277f96e3d173542b5364a", 523776), Common::IT_ITA, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - Italian CD version 1.2 3/31/95 // Patch #2685032 submitted by goodoldgeorg { "rtz", "V1.2, 3/31/95, CD", AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354971), Common::IT_ITA, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD_COMPRESSED, 3, }, { // Return to Zork - French CD version 1.2 5/13/95 (installed) // Patch #2685032 submitted by goodoldgeorg { "rtz", "V1.2, 5/13/95, installed, CD", AD_ENTRY1s("rtzcd.dat", "bde8251a8e34e87c54e3f93147d56c9e", 523776), Common::FR_FRA, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - French CD version 1.2 5/13/95 // Patch #2685032 submitted by goodoldgeorg { "rtz", "V1.2, 3/31/95, CD", AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354614), Common::FR_FRA, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD_COMPRESSED, 3, }, { // Return to Zork - English floppy version { "rtz", "Floppy", AD_ENTRY1("rtz.prj", "764d02f52ce1c219f2c0066677fba4ce"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_RTZ, 0, GF_FLOPPY, 3, }, { // Return to Zork - Demo { "rtz", "Demo", AD_ENTRY1("demo.dat", "2a6a1354bd5346fad4aee08e5b56caaa"), Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO0() }, GID_RTZ, 0, GF_DEMO, 3, }, { // Return to Zork - Japanese DOS // This is the RTZCD.DAT in the base directory of the FM-Towns CD { "rtz", "", AD_ENTRY1("rtzcd.dat", "c4fccf67ad247f09b94c3c808b138576"), Common::JA_JPN, Common::kPlatformDOS, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - Japanese FM-Towns // This is in the RTZFM folder of the FM-Towns CD { "rtz", "", AD_ENTRY1("rtzcd.dat", "e949a6a42d82daabfa7d4dc0a87a9843"), Common::JA_JPN, Common::kPlatformFMTowns, ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_RTZ, 0, GF_CD, 3, }, { // Return to Zork - Japanese PC-98 // This is in the RTZ9821 folder of the FM-Towns CD { "rtz", "", AD_ENTRY1("rtzcd.dat", "0c0117e98530c736a141c2aad6834dc5"), Common::JA_JPN, Common::kPlatformPC98, ADGF_CD, GUIO0() }, GID_RTZ, 0, GF_CD, 3, }, { // The Manhole: New and Enhanced { "manhole", "", AD_ENTRY1("manhole.dat", "cb21e31ed35c963208343bc995225b73"), Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO1(GUIO_NOSPEECH) }, GID_MANHOLE, 0, GF_CD, 2, }, { // The Manhole (EGA, 5.25") { "manhole", "EGA", AD_ENTRY1("manhole.dat", "2b1658292599a861c4cd3cf6cdb3c581"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_MANHOLE, 0, GF_FLOPPY, 1, }, { // Leather Goddesses of Phobos 2 (English) { "lgop2", "", AD_ENTRY1("lgop2.dat", "8137996db200ff67e8f172ff106f2e48"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_LGOP2, 0, GF_FLOPPY, 2, }, { // Leather Goddesses of Phobos 2 (German) // Supplied by windlepoons (bug tracker #2675695) { "lgop2", "", AD_ENTRY1s("lgop2.dat", "a0ffea6a3b7e39bd861edd00c397641c", 299466), Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_LGOP2, 0, GF_FLOPPY, 2, }, { // Leather Goddesses of Phobos 2 (French) // Supplied by goodoldgeorg (bug tracker #2675759) { "lgop2", "", AD_ENTRY1s("lgop2.dat", "f9e974087af7cf4b7ec2d8dc45d01e0c", 295366), Common::FR_FRA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_LGOP2, 0, GF_FLOPPY, 2, }, { // Leather Goddesses of Phobos 2 (Spanish) // Supplied by goodoldgeorg (bug tracker #2675759) { "lgop2", "", AD_ENTRY1s("lgop2.dat", "96eb95b4d75b9a3da0b0d67e3b4a787d", 288984), Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_LGOP2, 0, GF_FLOPPY, 2, }, { // Rodney's Funscreen { "rodney", "", AD_ENTRY1("rodneys.dat", "a79887dbaa47689facd7c6f09258ba5a"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GUIO_NOSPEECH) }, GID_RODNEY, 0, GF_FLOPPY, 2, }, { AD_TABLE_END_MARKER, 0, 0, 0, 0 } }; /** * The fallback game descriptor used by the Made engine's fallbackDetector. * Contents of this struct are to be overwritten by the fallbackDetector. */ static MadeGameDescription g_fallbackDesc = { { "", "", AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor Common::UNK_LANG, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, 0, 0, 0, 0, }; } // End of namespace Made
namespace Buried { static const BuriedGameDescription gameDescriptions[] = { // English Windows 3.11 8BPP // Installed // v1.01 { { "buried", "v1.01 8BPP", { { "BIT816.EXE", 0, "57a14461c77d9c77534bd418043db1ec", 1163776 }, { "BIT8LIB.DLL", 0, "31bcd9e5cc32df00b09ce626e6d9106e", 2420480 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, ADGF_NO_FLAGS, GUIO0() }, }, // English Windows 3.11 24BPP // Installed // v1.01 { { "buried", "v1.01 24BPP", { { "BIT2416.EXE", 0, "dcbfb3f2916ad902043942fc00d2017f", 1159680 }, { "BIT24LIB.DLL", 0, "74ac9dae92f415fea8cdbd220ba8795c", 5211648 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, GF_TRUECOLOR, GUIO0() }, }, // Japanese Windows 3.11 8BPP // Installed // v1.051 { { "buried", "v1.051 8BPP", { { "BIT816.EXE", 0, "decbf9a7d91803525137ffd980d16708", 1163264 }, { "BIT8LIB.DLL", 0, "f5ccde0efccb95afe902627a35262568", 2418816 }, { 0, 0, 0, 0 }, }, Common::JA_JPN, Common::kPlatformWindows, ADGF_NO_FLAGS, GUIO0() }, }, // Japanese Windows 3.11 24BPP // Installed // v1.051 { { "buried", "v1.051 24BPP", { { "BIT2416.EXE", 0, "9435b9a40e3ac83e6fa1e83caaf57792", 1157632 }, { "BIT24LIB.DLL", 0, "4d55802259d9648b9aa396461bfd53a3", 6576896 }, { 0, 0, 0, 0 }, }, Common::JA_JPN, Common::kPlatformWindows, GF_TRUECOLOR, GUIO0() }, }, // English Windows 3.11 8BPP // Not Installed // v1.01 { { "buried", "v1.01 8BPP", { { "BIT816.EX_", 0, "166b44e53350c19bb25ef93d2c2b8f79", 364490 }, { "BIT8LIB.DL_", 0, "8a345993f60f6bed7c17fa9e7f2bc37d", 908854 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, GF_COMPRESSED, GUIO0() }, }, // English Windows 3.11 24BPP // Not Installed // v1.01 { { "buried", "v1.01 24BPP", { { "BIT2416.EX_", 0, "a9ac76610ba614b59235a7d5e00e4a62", 361816 }, { "BIT24LIB.DL_", 0, "00e6eedbcef824988fbb01a87ca8f7fd", 2269314 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, GF_COMPRESSED | GF_TRUECOLOR, GUIO0() }, }, // German Windows 3.11 8BPP // Installed // v1.05 { { "buried", "v1.05 8BPP", { { "BIT816.EXE", 0, "a039e9f1c569acc1cf80f6b549ce1e37", 1178112 }, { "BIT8LIB.DLL", 0, "6b22f0b47efb29e45e9b2a336185d924", 2420608 }, { 0, 0, 0, 0 }, }, Common::DE_DEU, Common::kPlatformWindows, ADGF_NO_FLAGS, GUIO0() }, }, // German Windows 3.11 24BPP // Installed // v1.05 { { "buried", "v1.05 24BPP", { { "BIT2416.EXE", 0, "fbfd453cced2b14069fa32e3c8dd69e2", 1172480 }, { "BIT24LIB.DLL", 0, "30e56210d3150b5fa41c9bd2c90754fe", 6581376 }, { 0, 0, 0, 0 }, }, Common::DE_DEU, Common::kPlatformWindows, GF_TRUECOLOR, GUIO0() }, }, // French Windows 3.11 8BPP // Installed // v1.05 { { "buried", "v1.05 8BPP", { { "BIT816.EXE", 0, "edea5331dc7cb0f3da7322691e12a18a", 1182720 }, { "BIT8LIB.DLL", 0, "6b22f0b47efb29e45e9b2a336185d924", 2420608 }, { 0, 0, 0, 0 }, }, Common::FR_FRA, Common::kPlatformWindows, ADGF_NO_FLAGS, GUIO0() }, }, // French Windows 3.11 24BPP // Installed // v1.05 { { "buried", "v1.05 24BPP", { { "BIT2416.EXE", 0, "0adea8e1ad6fddad3b861be8a7bab340", 1177088 }, { "BIT24LIB.DLL", 0, "30e56210d3150b5fa41c9bd2c90754fe", 6581376 }, { 0, 0, 0, 0 }, }, Common::FR_FRA, Common::kPlatformWindows, GF_TRUECOLOR, GUIO0() }, }, // Italian Windows 3.11 8BPP // Installed // v1.05 { { "buried", "v1.05 8BPP", { { "BIT816.EXE", 0, "fb3e5c9198503bbb45b79150b511af5e", 1175040 }, { "BIT8LIB.DLL", 0, "6b22f0b47efb29e45e9b2a336185d924", 2420608 }, { 0, 0, 0, 0 }, }, Common::IT_ITA, Common::kPlatformWindows, ADGF_NO_FLAGS, GUIO0() }, }, // Italian Windows 3.11 24BPP // Installed // v1.05 { { "buried", "v1.05 24BPP", { { "BIT2416.EXE", 0, "56bdd481b063c91b95c21f02faa450bb", 1169408 }, { "BIT24LIB.DLL", 0, "30e56210d3150b5fa41c9bd2c90754fe", 6581376 }, { 0, 0, 0, 0 }, }, Common::IT_ITA, Common::kPlatformWindows, GF_TRUECOLOR, GUIO0() }, }, // Spanish Windows 3.11 8BPP // Installed // v1.05 { { "buried", "v1.05 8BPP", { { "BIT816.EXE", 0, "f08c96347fcb83d92ae57de1fb578234", 1174528 }, { "BIT8LIB.DLL", 0, "a80afdc20264e764e831ef5099cde623", 2420992 }, { 0, 0, 0, 0 }, }, Common::ES_ESP, Common::kPlatformWindows, ADGF_NO_FLAGS, GUIO0() }, }, // Spanish Windows 3.11 24BPP // Installed // v1.05 { { "buried", "v1.05 24BPP", { { "BIT2416.EXE", 0, "d409b59f124babc9b423793e762b7e03", 1168896 }, { "BIT24LIB.DLL", 0, "c864bcd69d05532e0066b8db173a939b", 6582784 }, { 0, 0, 0, 0 }, }, Common::ES_ESP, Common::kPlatformWindows, GF_TRUECOLOR, GUIO0() }, }, // English Windows 95 8BPP // v1.1 { { "buried", "v1.1 8BPP", { { "BIT832.EXE", 0, "f4f8007f49197ba40ea633eb113c0b6d", 1262592 }, { "BIT8L32.DLL", 0, "addfef0420e1f41a7766ecc6baa58553", 2424832 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, GF_WIN95, GUIO0() }, }, // English Windows 95 24BPP // v1.1 { { "buried", "v1.1 24BPP", { { "BIT2432.EXE", 0, "4086a8200938eac3e72d238a84f65618", 1257472 }, { "BIT24L32.DLL", 0, "198bfd476d5228c4a7a63c029cffadfc", 5216256 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, GF_TRUECOLOR | GF_WIN95, GUIO0() }, }, // English Windows Demo 8BPP { { "buried", "Demo 8BPP", AD_ENTRY1("BIT816.EXE", "a5bca831dac0903a304c29c320f881c5"), Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO1(GUIO_NOLAUNCHLOAD) }, }, // English Windows Demo 24BPP { { "buried", "Demo 24BPP", AD_ENTRY1("BIT2416.EXE", "9857e2d2b7a63b1304058dabc5098249"), Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | GF_TRUECOLOR, GUIO1(GUIO_NOLAUNCHLOAD) }, }, // English Windows 3.11 Trial 8BPP // v1.1 { { "buried", "Trial 8BPP", { { "BTV816.EXE", 0, "a3551483329816d8ddc8fa877113762c", 1170432 }, { "BIT8LIB.DLL", 0, "6b22f0b47efb29e45e9b2a336185d924", 2420608 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | GF_TRIAL, GUIO0() }, }, // English Windows 3.11 Trial 24BPP // v1.1 { { "buried", "Trial 24BPP", { { "BTV2416.EXE", 0, "e0783c5eda09176d414d3df4ada8fe89", 1164288 }, { "BIT24LIB.DLL", 0, "74ac9dae92f415fea8cdbd220ba8795c", 5211648 }, { 0, 0, 0, 0 }, }, Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | GF_TRUECOLOR | GF_TRIAL, GUIO0() }, }, { AD_TABLE_END_MARKER } }; static const char *directoryGlobs[] = { "win31", "manual", 0 }; } // End of namespace Buried
namespace Lure { static const LureGameDescription gameDescriptions[] = { { { "lure", "VGA", AD_ENTRY1("disk1.vga", "b2a8aa6d7865813a17a3c636e063572e"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, { { "lure", "EGA", AD_ENTRY1("disk1.ega", "e9c9fdd8a19f7910d68e53cb84651273"), Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY | GF_EGA, }, { { "lure", "VGA", AD_ENTRY1("disk1.vga", "cf69d5ada228dd74f89046691c16aafb"), Common::IT_ITA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, { { "lure", "EGA", AD_ENTRY1("disk1.ega", "b80aced0321f64c58df2c7d3d74dfe79"), Common::IT_ITA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY | GF_EGA, }, { { "lure", "", AD_ENTRY1("disk1.vga", "7aa19e444dab1ac7194d9f7a40ffe54a"), Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, { { "lure", "", AD_ENTRY1("disk1.vga", "894a2c2caeccbad2fc2f4a79a8ee47b0"), Common::DE_DEU, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, { { "lure", "", AD_ENTRY1("disk1.vga", "1c94475c1bb7e0e88c1757d3b5377e94"), Common::FR_FRA, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, { { "lure", "", AD_ENTRY1("disk1.vga", "1751145b653959f7a64fe1618d6b97ac"), Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, //add ScummVM OG Edition //Rusian fan translation v1.0 (Old-Games.ru) { { "lure", "", AD_ENTRY1("disk1.vga", "04cdcaa9f0cadca492f7aff0c8adfe06"), Common::RU_RUS, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() }, GF_FLOPPY, }, { AD_TABLE_END_MARKER, 0 } }; //add end } // End of namespace Lure
ADDetectedGame DirectorMetaEngine::fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { // TODO: Handle Mac fallback // reset fallback description Director::DirectorGameDescription *desc = &s_fallbackDesc; desc->desc.gameId = "director"; desc->desc.extra = ""; desc->desc.language = Common::UNK_LANG; desc->desc.flags = ADGF_NO_FLAGS; desc->desc.platform = Common::kPlatformWindows; desc->desc.guiOptions = GUIO0(); desc->desc.filesDescriptions[0].fileName = 0; desc->version = 0; desc->gameID = Director::GID_GENERIC; for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) continue; Common::String fileName = file->getName(); fileName.toLowercase(); if (!fileName.hasSuffix(".exe")) continue; Common::File f; if (!f.open(*file)) continue; f.seek(-4, SEEK_END); uint32 offset = f.readUint32LE(); if (f.eos() || offset == 0 || offset >= (uint32)(f.size() - 4)) continue; f.seek(offset); uint32 tag = f.readUint32LE(); switch (tag) { case MKTAG('3', '9', 'J', 'P'): desc->version = 4; break; case MKTAG('P', 'J', '9', '5'): desc->version = 5; break; case MKTAG('P', 'J', '0', '0'): desc->version = 7; break; default: // Prior to version 4, there was no tag here. So we'll use a bit of a // heuristic to detect. The first field is the entry count, of which // there should only be one. if ((tag & 0xFFFF) != 1) continue; f.skip(3); uint32 mmmSize = f.readUint32LE(); if (f.eos() || mmmSize == 0) continue; byte fileNameSize = f.readByte(); if (f.eos()) continue; f.skip(fileNameSize); byte directoryNameSize = f.readByte(); if (f.eos()) continue; f.skip(directoryNameSize); if (f.pos() != f.size() - 4) continue; // Assume v3 at this point (for now at least) desc->version = 3; } strncpy(s_fallbackFileNameBuffer, fileName.c_str(), 50); s_fallbackFileNameBuffer[50] = '\0'; desc->desc.filesDescriptions[0].fileName = s_fallbackFileNameBuffer; warning("Director fallback detection D%d", desc->version); return ADDetectedGame(&desc->desc); } return ADDetectedGame(); }