aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/agos/game.cpp173
-rw-r--r--engines/cine/detection.cpp138
-rw-r--r--engines/kyra/plugin.cpp24
-rw-r--r--engines/saga/game.cpp126
-rw-r--r--engines/saga/saga.h1
5 files changed, 26 insertions, 436 deletions
diff --git a/engines/agos/game.cpp b/engines/agos/game.cpp
index 55fa425a5a..04860c41b4 100644
--- a/engines/agos/game.cpp
+++ b/engines/agos/game.cpp
@@ -37,18 +37,12 @@ static DetectedGameList GAME_detectGames(const FSList &fslist);
using Common::File;
-struct ObsoleteGameID {
- const char *from;
- const char *to;
- Common::Platform platform;
-};
-
/**
* Conversion table mapping old obsolete target names to the
* corresponding new target and platform combination.
*
*/
-static const ObsoleteGameID obsoleteGameIDsTable[] = {
+static const Common::ADObsoleteGameID obsoleteGameIDsTable[] = {
{"simon1acorn", "simon1", Common::kPlatformAcorn},
{"simon1amiga", "simon1", Common::kPlatformAmiga},
{"simon1cd32", "simon1", Common::kPlatformAmiga},
@@ -77,85 +71,13 @@ static const PlainGameDescriptor simonGames[] = {
{NULL, NULL}
};
-GameList Engine_AGOS_gameIDList() {
- GameList games;
- const PlainGameDescriptor *g = simonGames;
- while (g->gameid) {
- games.push_back(*g);
- g++;
- }
+ADVANCED_DETECTOR_GAMEID_LIST(AGOS, simonGames);
- return games;
-}
+ADVANCED_DETECTOR_FIND_GAMEID(AGOS, simonGames, obsoleteGameIDsTable);
-GameDescriptor Engine_AGOS_findGameID(const char *gameid) {
- // First search the list of supported game IDs.
- const PlainGameDescriptor *g = simonGames;
- while (g->gameid) {
- if (!scumm_stricmp(gameid, g->gameid))
- return *g;
- g++;
- }
-
- // If we didn't find the gameid in the main list, check if it
- // is an obsolete game id.
- GameDescriptor gs;
- const ObsoleteGameID *o = obsoleteGameIDsTable;
- while (o->from) {
- if (0 == scumm_stricmp(gameid, o->from)) {
- gs.gameid = gameid;
- gs.description = "Obsolete game ID";
- return gs;
- }
- o++;
- }
- return gs;
-}
+ADVANCED_DETECTOR_DETECT_GAMES(AGOS, AGOS::GAME_detectGames);
-DetectedGameList Engine_AGOS_detectGames(const FSList &fslist) {
- return AGOS::GAME_detectGames(fslist);
-}
-
-PluginError Engine_AGOS_create(OSystem *syst, Engine **engine) {
- assert(syst);
- assert(engine);
- const char *gameid = ConfMan.get("gameid").c_str();
-
- for (const ObsoleteGameID *o = obsoleteGameIDsTable; o->from; ++o) {
- if (!scumm_stricmp(gameid, o->from)) {
- // Match found, perform upgrade
- gameid = o->to;
- ConfMan.set("gameid", o->to);
-
- if (o->platform != Common::kPlatformUnknown)
- ConfMan.set("platform", Common::getPlatformCode(o->platform));
-
- warning("Target upgraded from %s to %s", o->from, o->to);
- ConfMan.flushToDisk();
- break;
- }
- }
-
- FSList fslist;
- FilesystemNode dir(ConfMan.get("path"));
- if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) {
- warning("AGOSEngine: invalid game path '%s'", dir.path().c_str());
- return kInvalidPathError;
- }
-
- // Invoke the detector
- DetectedGameList detectedGames = Engine_AGOS_detectGames(fslist);
-
- for (uint i = 0; i < detectedGames.size(); i++) {
- if (detectedGames[i].gameid == gameid) {
- *engine = new AGOS::AGOSEngine(syst);
- return kNoError;
- }
- }
-
- warning("AGOSEngine: Unable to locate game data at path '%s'", dir.path().c_str());
- return kNoGameDataFoundError;
-}
+ADVANCED_DETECTOR_ENGINE_CREATE(AGOS, AGOS::AGOSEngine, "AGOSEngine", obsoleteGameIDsTable);
REGISTER_PLUGIN(AGOS, "AGOS", "AGOS (C) Adventure Soft");
@@ -166,89 +88,10 @@ using Common::ADGameDescription;
#include "agosgame.cpp"
-DetectedGame toDetectedGame(const ADGameDescription &g) {
- const char *title = 0;
-
- const PlainGameDescriptor *sg = simonGames;
- while (sg->gameid) {
- if (!scumm_stricmp(g.name, sg->gameid))
- title = sg->description;
- sg++;
- }
-
- DetectedGame dg(g.name, title, g.language, g.platform);
- dg.updateDesc(g.extra);
- return dg;
-}
-
-bool AGOSEngine::initGame() {
- int gameNumber = -1;
-
- DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
- Common::ADList matches;
- Common::ADGameDescList descList;
-
- Common::Language language = Common::UNK_LANG;
- Common::Platform platform = Common::kPlatformUnknown;
-
- if (ConfMan.hasKey("language"))
- language = Common::parseLanguage(ConfMan.get("language"));
- if (ConfMan.hasKey("platform"))
- platform = Common::parsePlatform(ConfMan.get("platform"));
-
- Common::String gameid = ConfMan.get("gameid");
+ADVANCED_DETECTOR_TO_DETECTED_GAME(simonGames);
- // At this point, Engine_AGOS_create() has already verified that the
- // desired game is in the specified directory. But we've already
- // forgotten which particular version it was, so we have to do it all
- // over again...
+ADVANCED_DETECTOR_DETECT_INIT_GAME(AGOSEngine::initGame, gameDescriptions, _gameDescription, Common::ADTrue);
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- descList.push_back((const ADGameDescription *)&gameDescriptions[i]);
-
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(FILE_MD5_BYTES);
-
- matches = AdvDetector.detectGame(NULL, language, platform);
-
- for (uint i = 0; i < matches.size(); i++) {
- if (toDetectedGame(gameDescriptions[matches[i]].desc).gameid == gameid) {
- gameNumber = matches[i];
- break;
- }
- }
-
- if (gameNumber >= ARRAYSIZE(gameDescriptions) || gameNumber == -1) {
- error("AGOSEngine::loadGame wrong gameNumber");
- }
-
- debug(2, "Running %s", toDetectedGame(gameDescriptions[gameNumber].desc).description.c_str());
-
- _gameDescription = &gameDescriptions[gameNumber];
-
- return true;
-}
-
-DetectedGameList GAME_detectGames(const FSList &fslist) {
- DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
- Common::ADList matches;
- Common::ADGameDescList descList;
-
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- descList.push_back((const ADGameDescription *)&gameDescriptions[i]);
-
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(FILE_MD5_BYTES);
-
- matches = AdvDetector.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
-
- for (uint i = 0; i < matches.size(); i++)
- detectedGames.push_back(toDetectedGame(gameDescriptions[matches[i]].desc));
-
- //delete &matches;
- return detectedGames;
-}
+ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION(GAME_detectGames, gameDescriptions);
} // End of namespace AGOS
diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp
index d56d85481d..e3b546daf1 100644
--- a/engines/cine/detection.cpp
+++ b/engines/cine/detection.cpp
@@ -44,58 +44,14 @@ static const PlainGameDescriptor cineGames[] = {
{NULL, NULL}
};
-GameList Engine_CINE_gameIDList() {
- GameList games;
- const PlainGameDescriptor *g = cineGames;
- while (g->gameid) {
- games.push_back(*g);
- g++;
- }
-
- return games;
-}
+ADVANCED_DETECTOR_GAMEID_LIST(CINE, cineGames);
-GameDescriptor Engine_CINE_findGameID(const char *gameid) {
- // First search the list of supported game IDs.
- const PlainGameDescriptor *g = cineGames;
- while (g->gameid) {
- if (!scumm_stricmp(gameid, g->gameid))
- return *g;
- g++;
- }
+ADVANCED_DETECTOR_FIND_GAMEID(CINE, cineGames, NULL);
- return *g;
-}
+ADVANCED_DETECTOR_DETECT_GAMES(CINE, Cine::GAME_detectGames);
-DetectedGameList Engine_CINE_detectGames(const FSList &fslist) {
- return Cine::GAME_detectGames(fslist);
-}
+ADVANCED_DETECTOR_ENGINE_CREATE(CINE, Cine::CineEngine, "CineEngine", NULL);
-PluginError Engine_CINE_create(OSystem *syst, Engine **engine) {
- assert(syst);
- assert(engine);
-
- FSList fslist;
- FilesystemNode dir(ConfMan.get("path"));
- if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) {
- warning("CineEngine: invalid game path '%s'", dir.path().c_str());
- return kInvalidPathError;
- }
-
- // Invoke the detector
- Common::String gameid = ConfMan.get("gameid");
- DetectedGameList detectedGames = Engine_CINE_detectGames(fslist);
-
- for (uint i = 0; i < detectedGames.size(); i++) {
- if (detectedGames[i].gameid == gameid) {
- *engine = new Cine::CineEngine(syst);
- return kNoError;
- }
- }
-
- warning("CineEngine: Unable to locate game data at path '%s'", dir.path().c_str());
- return kNoGameDataFoundError;
-}
REGISTER_PLUGIN(CINE, "Cinematique evo 1 engine", "Future Wars & Operation Stealth (C) Delphine Software");
@@ -623,90 +579,10 @@ static const CINEGameDescription gameDescriptions[] = {
};
-DetectedGame toDetectedGame(const ADGameDescription &g) {
- const char *title = 0;
-
- const PlainGameDescriptor *sg = cineGames;
- while (sg->gameid) {
- if (!scumm_stricmp(g.name, sg->gameid))
- title = sg->description;
- sg++;
- }
-
- DetectedGame dg(g.name, title, g.language, g.platform);
- dg.updateDesc(g.extra);
- return dg;
-}
-
-bool CineEngine::initGame() {
- int gameNumber = -1;
-
- DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
- Common::ADList matches;
- Common::ADGameDescList descList;
-
- Common::Language language = Common::UNK_LANG;
- Common::Platform platform = Common::kPlatformUnknown;
-
- if (ConfMan.hasKey("language"))
- language = Common::parseLanguage(ConfMan.get("language"));
- if (ConfMan.hasKey("platform"))
- platform = Common::parsePlatform(ConfMan.get("platform"));
-
- Common::String gameid = ConfMan.get("gameid");
-
- // At this point, Engine_Cine_create() has already verified that the
- // desired game is in the specified directory. But we've already
- // forgotten which particular version it was, so we have to do it all
- // over again...
-
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- descList.push_back((const ADGameDescription *)&gameDescriptions[i]);
+ADVANCED_DETECTOR_TO_DETECTED_GAME(cineGames);
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(FILE_MD5_BYTES);
+ADVANCED_DETECTOR_DETECT_INIT_GAME(CineEngine::initGame, gameDescriptions, _gameDescription, Common::ADTrue);
- matches = AdvDetector.detectGame(NULL, language, platform);
-
- for (uint i = 0; i < matches.size(); i++) {
- if (toDetectedGame(gameDescriptions[matches[i]].desc).gameid == gameid) {
- gameNumber = matches[i];
- break;
- }
- }
-
- //delete &matches;
-
- if (gameNumber >= ARRAYSIZE(gameDescriptions) || gameNumber == -1) {
- error("CineEngine::loadGame wrong gameNumber");
- }
-
- debug(2, "Running %s", toDetectedGame(gameDescriptions[gameNumber].desc).description.c_str());
-
- _gameDescription = &gameDescriptions[gameNumber];
-
- return true;
-}
-
-DetectedGameList GAME_detectGames(const FSList &fslist) {
- DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
- Common::ADList matches;
- Common::ADGameDescList descList;
-
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- descList.push_back((const ADGameDescription *)&gameDescriptions[i]);
-
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(FILE_MD5_BYTES);
-
- matches = AdvDetector.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
-
- for (uint i = 0; i < matches.size(); i++)
- detectedGames.push_back(toDetectedGame(gameDescriptions[matches[i]].desc));
-
- return detectedGames;
-}
+ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION(GAME_detectGames, gameDescriptions);
} // End of namespace Cine
diff --git a/engines/kyra/plugin.cpp b/engines/kyra/plugin.cpp
index 658a1847a2..e63db7ee05 100644
--- a/engines/kyra/plugin.cpp
+++ b/engines/kyra/plugin.cpp
@@ -203,29 +203,9 @@ const PlainGameDescriptor gameList[] = {
} // End of anonymous namespace
-GameList Engine_KYRA_gameIDList() {
- GameList games;
- const PlainGameDescriptor *g = gameList;
+ADVANCED_DETECTOR_GAMEID_LIST(KYRA, gameList);
- while (g->gameid) {
- games.push_back(*g);
- g++;
- }
-
- return games;
-}
-
-GameDescriptor Engine_KYRA_findGameID(const char *gameid) {
- const PlainGameDescriptor *g = gameList;
-
- while (g->gameid) {
- if (0 == scumm_stricmp(gameid, g->gameid))
- break;
- g++;
- }
-
- return *g;
-}
+ADVANCED_DETECTOR_FIND_GAMEID(KYRA, gameList, NULL);
DetectedGameList Engine_KYRA_detectGames(const FSList &fslist) {
DetectedGameList detectedGames;
diff --git a/engines/saga/game.cpp b/engines/saga/game.cpp
index 31654eba9a..ed5d708c1f 100644
--- a/engines/saga/game.cpp
+++ b/engines/saga/game.cpp
@@ -48,57 +48,14 @@ static const PlainGameDescriptor saga_games[] = {
{0, 0}
};
-GameList Engine_SAGA_gameIDList() {
- GameList games;
- const PlainGameDescriptor *g = saga_games;
+ADVANCED_DETECTOR_GAMEID_LIST(SAGA, saga_games);
- while (g->gameid) {
- games.push_back(*g);
- g++;
- }
-
- return games;
-}
+ADVANCED_DETECTOR_FIND_GAMEID(SAGA, saga_games, NULL);
-GameDescriptor Engine_SAGA_findGameID(const char *gameid) {
- const PlainGameDescriptor *g = saga_games;
- while (g->gameid) {
- if (0 == scumm_stricmp(gameid, g->gameid))
- break;
- g++;
- }
- return *g;
-}
+ADVANCED_DETECTOR_DETECT_GAMES(SAGA, Saga::GAME_detectGames);
-DetectedGameList Engine_SAGA_detectGames(const FSList &fslist) {
- return Saga::GAME_detectGames(fslist);
-}
-
-PluginError Engine_SAGA_create(OSystem *syst, Engine **engine) {
- assert(syst);
- assert(engine);
-
- FSList fslist;
- FilesystemNode dir(ConfMan.get("path"));
- if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) {
- warning("SagaEngine: invalid game path '%s'", dir.path().c_str());
- return kInvalidPathError;
- }
+ADVANCED_DETECTOR_ENGINE_CREATE(SAGA, Saga::SagaEngine, "SagaEngine", NULL);
- // Invoke the detector
- Common::String gameid = ConfMan.get("gameid");
- DetectedGameList detectedGames = Engine_SAGA_detectGames(fslist);
-
- for (uint i = 0; i < detectedGames.size(); i++) {
- if (detectedGames[i].gameid == gameid) {
- *engine = new Saga::SagaEngine(syst);
- return kNoError;
- }
- }
-
- warning("SagaEngine: Unable to locate game data at path '%s'", dir.path().c_str());
- return kNoGameDataFoundError;
-}
REGISTER_PLUGIN(SAGA, "SAGA Engine", "Inherit the Earth (C) Wyrmkeep Entertainment");
@@ -109,59 +66,9 @@ using Common::ADGameDescription;
#include "sagagame.cpp"
-DetectedGame toDetectedGame(const SAGAGameDescription &g) {
- const char *title;
- title = saga_games[g.gameType].description;
- DetectedGame dg(g.desc.name, title, g.desc.language, g.desc.platform);
- dg.updateDesc(g.desc.extra);
- return dg;
-}
-
-bool SagaEngine::initGame() {
- uint16 gameCount = ARRAYSIZE(gameDescriptions);
- int gameNumber = -1;
-
- DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
- Common::ADList matches;
- Common::ADGameDescList descList;
-
- Common::Language language = Common::UNK_LANG;
- Common::Platform platform = Common::kPlatformUnknown;
-
- if (ConfMan.hasKey("language"))
- language = Common::parseLanguage(ConfMan.get("language"));
- if (ConfMan.hasKey("platform"))
- platform = Common::parsePlatform(ConfMan.get("platform"));
+ADVANCED_DETECTOR_TO_DETECTED_GAME(saga_games);
-
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- descList.push_back((const ADGameDescription *)&gameDescriptions[i]);
-
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(FILE_MD5_BYTES);
-
- matches = AdvDetector.detectGame(NULL, language, platform);
-
- if (matches.size() == 0) {
- warning("No valid games were found in the specified directory.");
- return false;
- }
-
- if (matches.size() != 1)
- warning("Conflicting targets detected (%d)", matches.size());
-
- gameNumber = matches[0];
-
- if (gameNumber >= gameCount || gameNumber == -1) {
- error("SagaEngine::loadGame wrong gameNumber");
- }
-
- _gameTitle = toDetectedGame(gameDescriptions[gameNumber]).description;
- debug(2, "Running %s", _gameTitle.c_str());
-
- _gameNumber = gameNumber;
- _gameDescription = &gameDescriptions[gameNumber];
+bool SagaEngine::postInitGame() {
_gameDisplayInfo = *_gameDescription->gameDisplayInfo;
_displayClip.right = _gameDisplayInfo.logicalWidth;
_displayClip.bottom = _gameDisplayInfo.logicalHeight;
@@ -172,25 +79,8 @@ bool SagaEngine::initGame() {
return true;
}
-DetectedGameList GAME_detectGames(const FSList &fslist) {
- DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
- Common::ADList matches;
- Common::ADGameDescList descList;
-
- for (int i = 0; i < ARRAYSIZE(gameDescriptions); i++)
- descList.push_back((const ADGameDescription *)&gameDescriptions[i]);
+ADVANCED_DETECTOR_DETECT_INIT_GAME(SagaEngine::initGame, gameDescriptions, _gameDescription, postInitGame);
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(FILE_MD5_BYTES);
-
- matches = AdvDetector.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
-
- for (uint i = 0; i < matches.size(); i++)
- detectedGames.push_back(toDetectedGame(gameDescriptions[matches[i]]));
- //delete matches;
-
- return detectedGames;
-}
+ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION(GAME_detectGames, gameDescriptions);
} // End of namespace Saga
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 4d26c960d7..0cefe76caf 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -372,6 +372,7 @@ public:
public:
bool initGame(void);
+ bool postInitGame(void);
public:
const SAGAGameDescription *getGameDescription() const { return _gameDescription; }
const bool isBigEndian() const { return (_gameDescription->features & GF_BIG_ENDIAN_DATA) != 0; }