switched igor detection code to AdvancedDetector

svn-id: r29400
This commit is contained in:
Gregory Montoir 2007-11-04 03:04:37 +00:00
parent 52b18c9ae6
commit 74bb325a7e

View File

@ -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;
static const Common::ADParams igorDetectionParams = {
(const byte *)igorGameDescriptions,
sizeof(IgorGameDescription),
0, // no md5
igorGameDescriptors,
0,
"igor",
0,
0,
Common::kADFlagAugmentPreferredTarget
};
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 gd != 0;
}
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;
}
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);
}
return detectedGames;
}
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");