aboutsummaryrefslogtreecommitdiff
path: root/common/advancedDetector.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2007-01-29 23:25:51 +0000
committerEugene Sandulenko2007-01-29 23:25:51 +0000
commitadcfd2cc5f64157bd5135e5a90b29443036233f2 (patch)
tree1ee0bbc7c06e93a9c584892b2261322dd32779fa /common/advancedDetector.cpp
parent7bb9b05f551b81f3c34dacf3bea80ae7fd726fbc (diff)
downloadscummvm-rg350-adcfd2cc5f64157bd5135e5a90b29443036233f2.tar.gz
scummvm-rg350-adcfd2cc5f64157bd5135e5a90b29443036233f2.tar.bz2
scummvm-rg350-adcfd2cc5f64157bd5135e5a90b29443036233f2.zip
Now AdvancedDetector could use single ID per engine. Also it can suggest
more complex game IDs with platform and language specified. AGI engine benefits most from that. Also turned Cine, Parallaction and SAGA to single ID, autoupgrading old ID. svn-id: r25269
Diffstat (limited to 'common/advancedDetector.cpp')
-rw-r--r--common/advancedDetector.cpp63
1 files changed, 61 insertions, 2 deletions
diff --git a/common/advancedDetector.cpp b/common/advancedDetector.cpp
index ca0b9b547f..e7b72b6474 100644
--- a/common/advancedDetector.cpp
+++ b/common/advancedDetector.cpp
@@ -50,6 +50,25 @@ namespace AdvancedDetector {
static ADList detectGame(const FSList *fslist, const Common::ADParams &params, Language language, Platform platform);
+GameList genGameList(const Common::ADParams &params) {
+ if (params.singleid != NULL) {
+ GameList gl;
+
+ const PlainGameDescriptor *g = params.list;
+ while (g->gameid) {
+ if (0 == scumm_stricmp(params.singleid, g->gameid)) {
+ gl.push_back(GameDescriptor(g->gameid, g->description));
+
+ return gl;
+ }
+ g++;
+ }
+ error("Engine %s doesn't have its singleid specified in ids list", params.singleid);
+ }
+
+ return GameList(params.list);
+}
+
void upgradeTargetIfNecessary(const Common::ADParams &params) {
if (params.obsoleteList == 0)
return;
@@ -85,6 +104,10 @@ PluginError detectGameForEngineCreation(
GameList detectedGames = detectFunc(fslist);
+ // We have single ID set, so we have a game if there are hits
+ if (params.singleid != NULL && detectedGames.size())
+ return kNoError;
+
for (uint i = 0; i < detectedGames.size(); i++) {
if (detectedGames[i].gameid() == gameid) {
return kNoError;
@@ -106,6 +129,7 @@ GameDescriptor findGameID(
}
GameDescriptor gs;
+
if (params.obsoleteList != 0) {
const Common::ADObsoleteGameID *o = params.obsoleteList;
while (o->from) {
@@ -135,6 +159,26 @@ static GameDescriptor toGameDescriptor(const ADGameDescription &g, const PlainGa
return gd;
}
+/**
+ * Makes gameid in form of
+ * gameid-plaform-lang
+ */
+static String generateComplexID(const String id, int listPos, const Common::ADParams &params) {
+ const ADGameDescription *desc = (const ADGameDescription *)(params.descs + listPos * params.descItemSize);
+
+ String res(id);
+
+ if (desc->platform != kPlatformPC && desc->platform != kPlatformUnknown) {
+ res = res + "-" + getPlatformAbbrev(desc->platform);
+ }
+
+ if (desc->language != EN_ANY && desc->language != UNK_LANG) {
+ res = res + "-" + getLanguageCode(desc->language);
+ }
+
+ return res;
+}
+
GameList detectAllGames(
const FSList &fslist,
const Common::ADParams &params
@@ -142,8 +186,23 @@ GameList detectAllGames(
Common::ADList matches = detectGame(&fslist, params, Common::UNK_LANG, Common::kPlatformUnknown);
GameList detectedGames;
- for (uint i = 0; i < matches.size(); i++)
- detectedGames.push_back(toGameDescriptor(*(const ADGameDescription *)(params.descs + matches[i] * params.descItemSize), params.list));
+ for (uint i = 0; i < matches.size(); i++) {
+ GameDescriptor desc(toGameDescriptor(*(const ADGameDescription *)(params.descs + matches[i] * params.descItemSize), params.list));
+
+ if (params.singleid != NULL) {
+ desc["preferredtarget"] = desc["gameid"];
+ desc["gameid"] = params.singleid;
+ }
+
+ if (params.flags & kADFlagComplexID) {
+ if (!desc.contains("preferredtarget"))
+ desc["preferredtarget"] = desc["gameid"];
+
+ desc["preferredtarget"] = generateComplexID(desc["preferredtarget"], matches[i], params);
+ }
+
+ detectedGames.push_back(desc);
+ }
return detectedGames;
}