aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/game.h12
-rw-r--r--common/advancedDetector.cpp28
-rw-r--r--common/advancedDetector.h121
-rw-r--r--engines/kyra/plugin.cpp26
4 files changed, 86 insertions, 101 deletions
diff --git a/base/game.h b/base/game.h
index cb95f1730e..eca0050c51 100644
--- a/base/game.h
+++ b/base/game.h
@@ -55,7 +55,17 @@ struct GameDescriptor {
};
/** List of games. */
-typedef Common::Array<GameDescriptor> GameList;
+class GameList : public Common::Array<GameDescriptor> {
+public:
+ GameList() {}
+ GameList(const GameList &list) : Common::Array<GameDescriptor>(list) {}
+ GameList(const PlainGameDescriptor *g) {
+ while (g->gameid) {
+ push_back(*g);
+ g++;
+ }
+ }
+};
diff --git a/common/advancedDetector.cpp b/common/advancedDetector.cpp
index 3a7028cd11..d385bbdaef 100644
--- a/common/advancedDetector.cpp
+++ b/common/advancedDetector.cpp
@@ -72,16 +72,6 @@ PluginError real_ADVANCED_DETECTOR_ENGINE_CREATE(
return kNoGameDataFoundError;
}
-GameList real_ADVANCED_DETECTOR_GAMEID_LIST(const PlainGameDescriptor *list) {
- GameList games;
- const PlainGameDescriptor *g = list;
- while (g->gameid) {
- games.push_back(*g);
- g++;
- }
- return games;
-}
-
GameDescriptor real_ADVANCED_DETECTOR_FIND_GAMEID(
const char *gameid,
const PlainGameDescriptor *list,
@@ -110,7 +100,7 @@ GameDescriptor real_ADVANCED_DETECTOR_FIND_GAMEID(
return gs;
}
-DetectedGame toDetectedGame(const ADGameDescription &g, const PlainGameDescriptor *sg) {
+static DetectedGame toDetectedGame(const ADGameDescription &g, const PlainGameDescriptor *sg) {
const char *title = 0;
while (sg->gameid) {
@@ -132,7 +122,7 @@ DetectedGameList real_ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION(
const PlainGameDescriptor *list
) {
DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
+ Common::AdvancedDetector ad;
Common::ADList matches;
Common::ADGameDescList descList;
const byte *descPtr;
@@ -140,12 +130,12 @@ DetectedGameList real_ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION(
for (descPtr = descs; *descPtr != 0; descPtr += descItemSize)
descList.push_back((const ADGameDescription *)descPtr);
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(md5Bytes);
+ ad.registerGameDescriptions(descList);
+ ad.setFileMD5Bytes(md5Bytes);
debug(3, "%s: cnt: %d", ((const ADGameDescription *)descs)->name, descList.size());
- matches = AdvDetector.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
+ matches = ad.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
for (uint i = 0; i < matches.size(); i++)
detectedGames.push_back(toDetectedGame(*(const ADGameDescription *)(descs + matches[i] * descItemSize), list));
@@ -162,7 +152,7 @@ int real_ADVANCED_DETECTOR_DETECT_INIT_GAME(
int gameNumber = -1;
DetectedGameList detectedGames;
- Common::AdvancedDetector AdvDetector;
+ Common::AdvancedDetector ad;
Common::ADList matches;
Common::ADGameDescList descList;
const byte *descPtr;
@@ -180,10 +170,10 @@ int real_ADVANCED_DETECTOR_DETECT_INIT_GAME(
for (descPtr = descs; *descPtr != 0; descPtr += descItemSize)
descList.push_back((const ADGameDescription *)descPtr);
- AdvDetector.registerGameDescriptions(descList);
- AdvDetector.setFileMD5Bytes(md5Bytes);
+ ad.registerGameDescriptions(descList);
+ ad.setFileMD5Bytes(md5Bytes);
- matches = AdvDetector.detectGame(0, language, platform);
+ matches = ad.detectGame(0, language, platform);
for (uint i = 0; i < matches.size(); i++) {
if (toDetectedGame(*(const ADGameDescription *)(descs + matches[i] * descItemSize), list).gameid == gameid) {
diff --git a/common/advancedDetector.h b/common/advancedDetector.h
index ac64c4bb8c..437f17d8f9 100644
--- a/common/advancedDetector.h
+++ b/common/advancedDetector.h
@@ -53,11 +53,55 @@ struct ADObsoleteGameID {
typedef Array<int> ADList;
typedef Array<const ADGameDescription*> ADGameDescList;
-// FIXME/TODO: Rename this function to something more sensible.
-// Possibly move it inside class AdvancedDetector ?
-// Maybe rename it to something like asGameList or pgdArrayToGameList,
-// and move it to base/game.h. Or add a constructor to GameList ... ?
-GameList real_ADVANCED_DETECTOR_GAMEID_LIST(const PlainGameDescriptor *list);
+
+
+// TODO/FIXME: Fingolfin asks: Why is AdvancedDetector a class, considering that
+// it is only used as follow:
+// 1) Create an instance of it on the stack
+// 2) invoke registerGameDescriptions and setFileMD5Bytes
+// 3) invoke detectGame *once*
+// Obviously, 2) could also be handled by passing more params to detectGame.
+// So it seem we could replace this class by a simple advancedDetectGame(...)
+// function, w/o a class or instantiating object... ? Or is there a deeper
+// reason I miss?
+class AdvancedDetector {
+
+public:
+ AdvancedDetector();
+ ~AdvancedDetector() {};
+
+
+ void registerGameDescriptions(ADGameDescList gameDescriptions) {
+ _gameDescriptions = gameDescriptions;
+ }
+
+ /**
+ * Specify number of bytes which are used to calculate MD5.
+ * Default value is 0 which means whole file.
+ */
+ void setFileMD5Bytes(int bytes) { _fileMD5Bytes = bytes; }
+
+ /**
+ * Detect games in specified directory.
+ * Parameters language and platform are used to pass on values
+ * specified by the user. I.e. this is used to restrict search scope.
+ *
+ * @param fslist FSList to scan or NULL for scanning all specified
+ * default directories.
+ * @param language restrict results to specified language only
+ * @param platform restrict results to specified platform only
+ * @return list of indexes to GameDescriptions of matched games
+ */
+ ADList detectGame(const FSList *fslist, Language language, Platform platform);
+
+private:
+ ADGameDescList _gameDescriptions;
+
+ int _fileMD5Bytes;
+
+ String getDescription(int num) const;
+};
+
// FIXME/TODO: Rename this function to something more sensible.
// Possibly move it inside class AdvancedDetector ?
@@ -102,18 +146,6 @@ PluginError real_ADVANCED_DETECTOR_ENGINE_CREATE(
);
-#define ADVANCED_DETECTOR_GAMEID_LIST(engine,list) \
- GameList Engine_##engine##_gameIDList() { \
- return Common::real_ADVANCED_DETECTOR_GAMEID_LIST(list); \
- } \
- void dummyFuncToAllowTrailingSemicolon()
-
-#define ADVANCED_DETECTOR_FIND_GAMEID(engine,list,obsoleteList) \
- GameDescriptor Engine_##engine##_findGameID(const char *gameid) { \
- return Common::real_ADVANCED_DETECTOR_FIND_GAMEID(gameid,list,obsoleteList); \
- } \
- void dummyFuncToAllowTrailingSemicolon()
-
#define ADVANCED_DETECTOR_DETECT_GAMES(engine,detectFunc) \
DetectedGameList Engine_##engine##_detectGames(const FSList &fslist) { \
return detectFunc(fslist); \
@@ -132,59 +164,16 @@ PluginError real_ADVANCED_DETECTOR_ENGINE_CREATE(
void dummyFuncToAllowTrailingSemicolon()
#define ADVANCED_DETECTOR_DEFINE_PLUGIN(engine,createFunction,detectFunc,list,obsoleteList) \
- ADVANCED_DETECTOR_GAMEID_LIST(engine, list); \
- ADVANCED_DETECTOR_FIND_GAMEID(engine, list, obsoleteList); \
+ GameList Engine_##engine##_gameIDList() { \
+ return GameList(list); \
+ } \
+ GameDescriptor Engine_##engine##_findGameID(const char *gameid) { \
+ return Common::real_ADVANCED_DETECTOR_FIND_GAMEID(gameid,list,obsoleteList); \
+ } \
ADVANCED_DETECTOR_DETECT_GAMES(engine, detectFunc); \
ADVANCED_DETECTOR_ENGINE_CREATE(engine, createFunction, detectFunc, obsoleteList)
-// TODO/FIXME: Fingolfin asks: Why is AdvancedDetector a class, considering that
-// it is only used as follow:
-// 1) Create an instance of it on the stack
-// 2) invoke registerGameDescriptions and setFileMD5Bytes
-// 3) invoke detectGame *once*
-// Obviously, 2) could also be handled by passing more params to detectGame.
-// So it seem we could replace this class by a simple advancedDetectGame(...)
-// function, w/o a class or instantiating object... ? Or is there a deeper
-// reason I miss?
-class AdvancedDetector {
-
-public:
- AdvancedDetector();
- ~AdvancedDetector() {};
-
-
- void registerGameDescriptions(ADGameDescList gameDescriptions) {
- _gameDescriptions = gameDescriptions;
- }
-
- /**
- * Specify number of bytes which are used to calculate MD5.
- * Default value is 0 which means whole file.
- */
- void setFileMD5Bytes(int bytes) { _fileMD5Bytes = bytes; }
-
- /**
- * Detect games in specified directory.
- * Parameters language and platform are used to pass on values
- * specified by the user. I.e. this is used to restrict search scope.
- *
- * @param fslist FSList to scan or NULL for scanning all specified
- * default directories.
- * @param language restrict results to specified language only
- * @param platform restrict results to specified platform only
- * @return list of indexes to GameDescriptions of matched games
- */
- ADList detectGame(const FSList *fslist, Language language, Platform platform);
-
-private:
- ADGameDescList _gameDescriptions;
-
- int _fileMD5Bytes;
-
- String getDescription(int num) const;
-};
-
} // End of namespace Common
#endif
diff --git a/engines/kyra/plugin.cpp b/engines/kyra/plugin.cpp
index 9c24e243a8..cb98666805 100644
--- a/engines/kyra/plugin.cpp
+++ b/engines/kyra/plugin.cpp
@@ -39,7 +39,7 @@ enum {
};
struct KYRAGameDescription {
- ADGameDescription desc;
+ Common::ADGameDescription desc;
const char *id;
GameFlags flags;
@@ -151,27 +151,23 @@ const KYRAGameDescription adGameDescs[] = {
{ { NULL, NULL, NULL, UNK_LANG, kPlatformUnknown }, NULL, KYRA2_UNK_FLAGS }
};
-ADGameDescList getADDescList() {
- ADGameDescList gameDesc;
+static ADList detectKyraGames(const FSList &fslist) {
+ Common::AdvancedDetector ad;
+ Common::ADList matches;
+ Common::ADGameDescList descList;
for (int i = 0; i < ARRAYSIZE(adGameDescs) - 1; ++i) {
- gameDesc.push_back(&adGameDescs[i].desc);
+ descList.push_back(&adGameDescs[i].desc);
}
- return gameDesc;
-}
-
-ADList detectKyraGames(const FSList &fslist) {
- AdvancedDetector ad;
-
- ad.registerGameDescriptions(getADDescList());
+ ad.registerGameDescriptions(descList);
ad.setFileMD5Bytes(kMD5FileSizeLimit);
- ADList list = ad.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
- return list;
+ matches = ad.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown);
+ return matches;
}
-bool setupGameFlags(const ADList &list, GameFlags &flags) {
+static bool setupGameFlags(const ADList &list, GameFlags &flags) {
if (!list.size()) {
// maybe add non md5 based detection again?
return false;
@@ -224,7 +220,7 @@ const PlainGameDescriptor gameList[] = {
} // End of anonymous namespace
GameList Engine_KYRA_gameIDList() {
- return Common::real_ADVANCED_DETECTOR_GAMEID_LIST(gameList);
+ return GameList(gameList);
}
GameDescriptor Engine_KYRA_findGameID(const char *gameid) {