aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2012-02-29 16:48:25 +0100
committerJohannes Schickel2012-03-19 21:04:29 +0100
commit82ab3056fa52f78309ae3271114dbec28ceb9684 (patch)
treea8e8814a85521a633773605debaa3f880f247565
parentc84cd8dee83fe42263f82ae3bb603360b99e0b0a (diff)
downloadscummvm-rg350-82ab3056fa52f78309ae3271114dbec28ceb9684.tar.gz
scummvm-rg350-82ab3056fa52f78309ae3271114dbec28ceb9684.tar.bz2
scummvm-rg350-82ab3056fa52f78309ae3271114dbec28ceb9684.zip
ENGINES: Implement per-game options caching in AdvancedDetector via GUIO flags.
-rw-r--r--common/gui_options.cpp8
-rw-r--r--common/gui_options.h10
-rw-r--r--engines/advancedDetector.cpp24
-rw-r--r--engines/advancedDetector.h27
4 files changed, 66 insertions, 3 deletions
diff --git a/common/gui_options.cpp b/common/gui_options.cpp
index 32a7cc9c41..59fbfb38d1 100644
--- a/common/gui_options.cpp
+++ b/common/gui_options.cpp
@@ -64,6 +64,14 @@ const struct GameOpt {
{ GUIO_RENDERPC9821, "pc9821" },
{ GUIO_RENDERPC9801, "pc9801" },
+ { GUIO_GAMEOPTIONS1, "gameOption1" },
+ { GUIO_GAMEOPTIONS2, "gameOption2" },
+ { GUIO_GAMEOPTIONS3, "gameOption3" },
+ { GUIO_GAMEOPTIONS4, "gameOption4" },
+ { GUIO_GAMEOPTIONS5, "gameOption5" },
+ { GUIO_GAMEOPTIONS6, "gameOption6" },
+ { GUIO_GAMEOPTIONS7, "gameOption7" },
+
{ GUIO_NONE, 0 }
};
diff --git a/common/gui_options.h b/common/gui_options.h
index 33ecccad63..1ea2b777d0 100644
--- a/common/gui_options.h
+++ b/common/gui_options.h
@@ -56,6 +56,16 @@
#define GUIO_RENDERPC9821 "\037"
#define GUIO_RENDERPC9801 "\040"
+// Special GUIO flags for the AdvancedDetector's caching of game specific
+// options.
+#define GUIO_GAMEOPTIONS1 "\041"
+#define GUIO_GAMEOPTIONS2 "\042"
+#define GUIO_GAMEOPTIONS3 "\043"
+#define GUIO_GAMEOPTIONS4 "\044"
+#define GUIO_GAMEOPTIONS5 "\045"
+#define GUIO_GAMEOPTIONS6 "\046"
+#define GUIO_GAMEOPTIONS7 "\047"
+
#define GUIO0() (GUIO_NONE)
#define GUIO1(a) (a)
#define GUIO2(a,b) (a b)
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp
index 081a97b9f1..dc7f7e007c 100644
--- a/engines/advancedDetector.cpp
+++ b/engines/advancedDetector.cpp
@@ -167,6 +167,25 @@ GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const {
return detectedGames;
}
+const ExtraGuiOptions AdvancedMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ if (!_extraGuiOptions)
+ return ExtraGuiOptions();
+
+ // Query the GUI options
+ const Common::String guiOptionsString = ConfMan.get("guioptions", target);
+ const Common::String guiOptions = parseGameGUIOptions(guiOptionsString);
+
+ ExtraGuiOptions options;
+
+ // Add all the applying extra GUI options.
+ for (const ADExtraGuiOptionsMap *entry = _extraGuiOptions; entry->guioFlag; ++entry) {
+ if (guiOptions.contains(entry->guioFlag))
+ options.push_back(entry->option);
+ }
+
+ return options;
+}
+
Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) const {
assert(engine);
@@ -562,8 +581,9 @@ GameDescriptor AdvancedMetaEngine::findGame(const char *gameid) const {
return GameDescriptor();
}
-AdvancedMetaEngine::AdvancedMetaEngine(const void *descs, uint descItemSize, const PlainGameDescriptor *gameids)
- : _gameDescriptors((const byte *)descs), _descItemSize(descItemSize), _gameids(gameids) {
+AdvancedMetaEngine::AdvancedMetaEngine(const void *descs, uint descItemSize, const PlainGameDescriptor *gameids, const ADExtraGuiOptionsMap *extraGuiOptions)
+ : _gameDescriptors((const byte *)descs), _descItemSize(descItemSize), _gameids(gameids),
+ _extraGuiOptions(extraGuiOptions) {
_md5Bytes = 5000;
_singleid = NULL;
diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h
index 0cec039b5e..45a9f183e8 100644
--- a/engines/advancedDetector.h
+++ b/engines/advancedDetector.h
@@ -134,6 +134,24 @@ enum ADFlags {
/**
+ * Map entry for mapping GUIO_GAMEOPTIONS* to their ExtraGuiOption
+ * description.
+ */
+struct ADExtraGuiOptionsMap {
+ /**
+ * GUIO_GAMEOPTION* string.
+ */
+ const char *guioFlag;
+
+ /**
+ * The associated option.
+ */
+ ExtraGuiOption option;
+};
+
+#define AD_EXTRA_GUI_OPTIONS_TERMINATOR { 0, { 0, 0, 0, 0 } }
+
+/**
* A MetaEngine implementation based around the advanced detector code.
*/
class AdvancedMetaEngine : public MetaEngine {
@@ -159,6 +177,11 @@ protected:
const PlainGameDescriptor *_gameids;
/**
+ * A map containing all the extra game GUI options the engine supports.
+ */
+ const ADExtraGuiOptionsMap * const _extraGuiOptions;
+
+ /**
* The number of bytes to compute MD5 sum for. The AdvancedDetector
* is primarily based on computing and matching MD5 checksums of files.
* Since doing that for large files can be slow, it can be restricted
@@ -211,7 +234,7 @@ protected:
const char * const *_directoryGlobs;
public:
- AdvancedMetaEngine(const void *descs, uint descItemSize, const PlainGameDescriptor *gameids);
+ AdvancedMetaEngine(const void *descs, uint descItemSize, const PlainGameDescriptor *gameids, const ADExtraGuiOptionsMap *extraGuiOptions = 0);
/**
* Returns list of targets supported by the engine.
@@ -225,6 +248,8 @@ public:
virtual Common::Error createInstance(OSystem *syst, Engine **engine) const;
+ virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
+
protected:
// To be implemented by subclasses
virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const = 0;