diff options
-rw-r--r-- | engines/igor/detection.cpp | 115 |
1 files changed, 47 insertions, 68 deletions
diff --git a/engines/igor/detection.cpp b/engines/igor/detection.cpp index 2b52270f4b..5e68f2df3b 100644 --- a/engines/igor/detection.cpp +++ b/engines/igor/detection.cpp @@ -25,88 +25,67 @@ #include "base/plugins.h" +#include "common/advancedDetector.h" #include "common/config-manager.h" -#include "common/file.h" -#include "common/fs.h" #include "igor/igor.h" -struct GameDetectVersion { - uint32 borlandOverlaySize; +struct IgorGameDescription { + Common::ADGameDescription desc; int gameVersion; - Common::Language language; - const char *descriptionSuffix; }; -static const GameDetectVersion igorDetectVersionsTable[] = { - { 4086790, Igor::kIdEngDemo100, Common::EN_ANY, " 1.00s" }, - { 4094103, Igor::kIdEngDemo110, Common::EN_ANY, " 1.10s" } +static const IgorGameDescription igorGameDescriptions[] = { + { + { + "igor", + "Demo 1.00s", + AD_ENTRY1s("IGOR.DAT", 0, 4086790), + Common::EN_ANY, + Common::kPlatformPC, + Common::ADGF_DEMO + }, + Igor::kIdEngDemo100 + }, + { + { + "igor", + "Demo 1.10s", + AD_ENTRY1s("IGOR.DAT", 0, 4094103), + Common::EN_ANY, + Common::kPlatformPC, + Common::ADGF_DEMO + }, + Igor::kIdEngDemo110 + }, + { AD_TABLE_END_MARKER, 0 } }; -static const char *igorDetectFileName = "IGOR.DAT"; - -static const PlainGameDescriptor igorGameDescriptor = { - "igor", "Igor: Objective Uikokahonia" +static const PlainGameDescriptor igorGameDescriptors[] = { + { "igor", "Igor: Objective Uikokahonia" }, + { 0, 0 } }; -GameList Engine_IGOR_gameIDList() { - GameList games; - games.push_back(igorGameDescriptor); - return games; -} - -GameDescriptor Engine_IGOR_findGameID(const char *gameid) { - if (scumm_stricmp(igorGameDescriptor.gameid, gameid) == 0) { - return igorGameDescriptor; - } - return GameDescriptor(); -} - -static const GameDetectVersion *Engine_IGOR_findGameVersion(const FSList &fslist) { - for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { - if (file->isDirectory() || !file->getName().equalsIgnoreCase(igorDetectFileName)) { - continue; - } - Common::File f; - if (f.open(*file)) { - const uint32 fileSize = f.size(); - if (f.readUint32BE() == MKID_BE('FBOV')) { - for (int i = 0; i < ARRAYSIZE(igorDetectVersionsTable); ++i) { - if (igorDetectVersionsTable[i].borlandOverlaySize == fileSize) { - return &igorDetectVersionsTable[i]; - } - } - } - } - } - return 0; -} +static const Common::ADParams igorDetectionParams = { + (const byte *)igorGameDescriptions, + sizeof(IgorGameDescription), + 0, // no md5 + igorGameDescriptors, + 0, + "igor", + 0, + 0, + Common::kADFlagAugmentPreferredTarget +}; -GameList Engine_IGOR_detectGames(const FSList &fslist) { - GameList detectedGames; - const GameDetectVersion *gdv = Engine_IGOR_findGameVersion(fslist); - if (gdv) { - GameDescriptor gd(igorGameDescriptor.gameid, igorGameDescriptor.description, gdv->language, Common::kPlatformPC); - gd.description() += gdv->descriptionSuffix; - gd.updateDesc("Demo"); - detectedGames.push_back(gd); +static bool Engine_IGOR_createInstance(OSystem *syst, Engine **engine, Common::EncapsulatedADGameDesc encapsulatedDesc) { + const IgorGameDescription *gd = (const IgorGameDescription *)(encapsulatedDesc.realDesc); + if (gd) { + *engine = new Igor::IgorEngine(syst, gd->gameVersion); } - return detectedGames; + return gd != 0; } -PluginError Engine_IGOR_create(OSystem *system, Engine **engine) { - FSList fslist; - FilesystemNode dir(ConfMan.get("path")); - if (!dir.getChildren(fslist, FilesystemNode::kListFilesOnly)) { - return kInvalidPathError; - } - const GameDetectVersion *gdv = Engine_IGOR_findGameVersion(fslist); - if (!gdv) { - return kNoGameDataFoundError; - } - assert(engine); - *engine = new Igor::IgorEngine(system, gdv->gameVersion); - return kNoError; -} +ADVANCED_DETECTOR_DEFINE_PLUGIN(IGOR, Engine_IGOR_createInstance, igorDetectionParams); REGISTER_PLUGIN(IGOR, "Igor: Objective Uikokahonia", "Igor: Objective Uikokahonia (C) Pendulo Studios"); |