[Scummvm-cvs-logs] SF.net SVN: scummvm: [30726] scummvm/trunk

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sat Feb 2 01:54:53 CET 2008


Revision: 30726
          http://scummvm.svn.sourceforge.net/scummvm/?rev=30726&view=rev
Author:   fingolfin
Date:     2008-02-01 16:54:52 -0800 (Fri, 01 Feb 2008)

Log Message:
-----------
New MetaEngine class (work in progress to replace the current Engine plugin API with a more object oriented approach)

Modified Paths:
--------------
    scummvm/trunk/common/advancedDetector.h
    scummvm/trunk/engines/agi/detection.cpp
    scummvm/trunk/engines/saga/detection.cpp
    scummvm/trunk/engines/scumm/detection.cpp
    scummvm/trunk/engines/sword1/sword1.cpp
    scummvm/trunk/engines/sword2/sword2.cpp
    scummvm/trunk/engines/touche/detection.cpp

Added Paths:
-----------
    scummvm/trunk/engines/metaengine.h

Modified: scummvm/trunk/common/advancedDetector.h
===================================================================
--- scummvm/trunk/common/advancedDetector.h	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/common/advancedDetector.h	2008-02-02 00:54:52 UTC (rev 30726)
@@ -26,10 +26,11 @@
 #define COMMON_ADVANCED_DETECTOR_H
 
 #include "common/fs.h"
+#include "common/error.h"
 
 #include "base/game.h"	// For PlainGameDescriptor and GameList
-#include "base/plugins.h"	// For PluginError
 
+#include "engines/metaengine.h"
 
 namespace Common {
 
@@ -273,4 +274,41 @@
 
 }	// End of namespace Common
 
+/**
+ * A MetaEngine implementation based around the advanced detector code.
+ */
+class AdvancedMetaEngine : public MetaEngine {
+	const Common::ADParams ¶ms;
+public:
+	AdvancedMetaEngine(const Common::ADParams &dp) : params(dp) {}
+	
+	// To be provided by subclasses
+	virtual bool createInstance(OSystem *syst, Engine **engine, const Common::EncapsulatedADGameDesc &encapsulatedDesc) const = 0;
+
+
+protected:
+	virtual GameList getSupportedGames() const {
+		return Common::AdvancedDetector::gameIDList(params);
+	}
+	virtual GameDescriptor findGame(const char *gameid) const {
+		return Common::AdvancedDetector::findGameID(gameid, params.list, params.obsoleteList);
+	}
+	virtual GameList detectGames(const FSList &fslist) const {
+		return Common::AdvancedDetector::detectAllGames(fslist, params);
+	}
+
+	virtual PluginError createInstance(OSystem *syst, Engine **engine) const {
+		assert(engine);
+		Common::AdvancedDetector::upgradeTargetIfNecessary(params);
+		Common::EncapsulatedADGameDesc encapsulatedDesc = Common::AdvancedDetector::detectBestMatchingGame(params);
+		if (encapsulatedDesc.realDesc == 0) {
+			return kNoGameDataFoundError;
+		}
+		if (!createInstance(syst,engine,encapsulatedDesc)) {
+			return kNoGameDataFoundError;
+		}
+		return kNoError;
+	}
+};
+
 #endif

Modified: scummvm/trunk/engines/agi/detection.cpp
===================================================================
--- scummvm/trunk/engines/agi/detection.cpp	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/engines/agi/detection.cpp	2008-02-02 00:54:52 UTC (rev 30726)
@@ -2250,7 +2250,21 @@
 	Common::kADFlagAugmentPreferredTarget
 };
 
-bool engineCreateAgi(OSystem *syst, Engine **engine, Common::EncapsulatedADGameDesc encapsulatedDesc) {
+class AgiMetaEngine : public AdvancedMetaEngine {
+public:
+	AgiMetaEngine() : AdvancedMetaEngine(detectionParams) {}
+
+	virtual const char *getName() const {
+		return "AGI preAGI + v2 + v3 Engine";
+	}
+	virtual const char *getCopyright() const {
+		return "Sierra AGI Engine (C) Sierra On-Line Software";
+	}
+
+	virtual bool createInstance(OSystem *syst, Engine **engine, const Common::EncapsulatedADGameDesc &encapsulatedDesc) const;
+};
+
+bool AgiMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::EncapsulatedADGameDesc &encapsulatedDesc) const {
 	const Agi::AGIGameDescription *gd = (const Agi::AGIGameDescription *)(encapsulatedDesc.realDesc);
 	bool res = true;
 
@@ -2270,7 +2284,7 @@
 	return res;
 }
 
-ADVANCED_DETECTOR_DEFINE_PLUGIN(AGI, engineCreateAgi, detectionParams);
+META_COMPATIBLITY_WRAPPER(AGI, AgiMetaEngine);
 
 REGISTER_PLUGIN(AGI, "AGI preAGI + v2 + v3 Engine", "Sierra AGI Engine (C) Sierra On-Line Software");
 

Added: scummvm/trunk/engines/metaengine.h
===================================================================
--- scummvm/trunk/engines/metaengine.h	                        (rev 0)
+++ scummvm/trunk/engines/metaengine.h	2008-02-02 00:54:52 UTC (rev 30726)
@@ -0,0 +1,81 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#ifndef ENGINES_METAENGINE_H
+#define ENGINES_METAENGINE_H
+
+#include "common/scummsys.h"
+#include "common/str.h"
+#include "common/error.h"
+
+#include "base/game.h"
+
+class Engine;
+class OSystem;
+
+/**
+ * A meta engine is essentially a factory for Engine instances with the
+ * added ability of listing and detecting supported games.
+ * Every engine "plugin" provides a hook to get an instance of a MetaEngine
+ * subclass for that "engine plugin". E.g. SCUMM povides ScummMetaEngine.
+ * This is then in turn used by the frontend code to detect games,
+ * and instantiate actual Engine objects.
+ */
+class MetaEngine {
+public:
+	virtual ~MetaEngine() {}
+
+	virtual const char *getName() const = 0;
+	virtual const char *getCopyright() const = 0;
+//	virtual int getVersion() const = 0;	// TODO!
+
+	virtual GameList getSupportedGames() const = 0;
+	virtual GameDescriptor findGame(const char *gameid) const = 0;
+	virtual GameList detectGames(const FSList &fslist) const = 0;
+
+	virtual PluginError createInstance(OSystem *syst, Engine **engine) const = 0;
+};
+
+
+/**
+ * The META_COMPATIBLITY_WRAPPER macro is there to ease the transition from the
+ * old plugin API to the new MetaEngine class. Ultimately, this macro will go
+ * and REGISTER_PLUGIN will be changedd to simply take an ID and a METACLASS.
+ * Until then, use META_COMPATIBLITY_WRAPPER + REGISTER_PLUGIN.
+ */
+#define META_COMPATIBLITY_WRAPPER(ID,METACLASS) \
+	static MetaEngine &getMetaEngine() { \
+		static MetaEngine *meta = 0; \
+		if (!meta) meta = new METACLASS(); \
+		return *meta; \
+	} \
+	GameList Engine_##ID##_gameIDList() { return getMetaEngine().getSupportedGames(); } \
+	GameDescriptor Engine_##ID##_findGameID(const char *gameid) { return getMetaEngine().findGame(gameid); } \
+	PluginError Engine_##ID##_create(OSystem *syst, Engine **engine) { return getMetaEngine().createInstance(syst, engine); } \
+	GameList Engine_##ID##_detectGames(const FSList &fslist) { return getMetaEngine().detectGames(fslist); } \
+	void dummyFuncToAllowTrailingSemicolon()
+
+
+
+#endif


Property changes on: scummvm/trunk/engines/metaengine.h
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Date Rev Author URL Id
Name: svn:eol-style
   + native

Modified: scummvm/trunk/engines/saga/detection.cpp
===================================================================
--- scummvm/trunk/engines/saga/detection.cpp	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/engines/saga/detection.cpp	2008-02-02 00:54:52 UTC (rev 30726)
@@ -27,6 +27,8 @@
 
 #include "saga/saga.h"
 
+#include "base/plugins.h"
+
 #include "common/config-manager.h"
 #include "common/advancedDetector.h"
 

Modified: scummvm/trunk/engines/scumm/detection.cpp
===================================================================
--- scummvm/trunk/engines/scumm/detection.cpp	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/engines/scumm/detection.cpp	2008-02-02 00:54:52 UTC (rev 30726)
@@ -36,6 +36,9 @@
 #include "scumm/intern.h"
 #include "scumm/he/intern_he.h"
 
+#include "engines/metaengine.h"
+
+
 namespace Scumm {
 
 enum {
@@ -662,20 +665,33 @@
 
 using namespace Scumm;
 
-GameList Engine_SCUMM_gameIDList() {
+class ScummMetaEngine : public MetaEngine {
+public:
+	virtual const char *getName() const;
+	virtual const char *getCopyright() const;
+//	virtual int getVersion() const	{ return 0; }	// TODO!
+
+	virtual GameList getSupportedGames() const;
+	virtual GameDescriptor findGame(const char *gameid) const;
+	virtual GameList detectGames(const FSList &fslist) const;
+
+	virtual PluginError createInstance(OSystem *syst, Engine **engine) const;
+};
+
+GameList ScummMetaEngine::getSupportedGames() const {
 	return GameList(gameDescriptions);
 }
 
-GameDescriptor Engine_SCUMM_findGameID(const char *gameid) {
+GameDescriptor ScummMetaEngine::findGame(const char *gameid) const {
 	return Common::AdvancedDetector::findGameID(gameid, gameDescriptions, obsoleteGameIDsTable);
 }
 
 
-GameList Engine_SCUMM_detectGames(const FSList &fslist) {
+GameList ScummMetaEngine::detectGames(const FSList &fslist) const {
 	GameList detectedGames;
 	Common::List<DetectorResult> results;
 
-	detectGames(fslist, results, 0);
+	::detectGames(fslist, results, 0);
 
 	// TODO: We still don't handle the FM-TOWNS demos (like zakloom) very well.
 	// In particular, they are detected as ZakTowns, which is bad.
@@ -724,7 +740,7 @@
  *
  * This is heavily based on our MD5 detection scheme.
  */
-PluginError Engine_SCUMM_create(OSystem *syst, Engine **engine) {
+PluginError ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) const {
 	assert(syst);
 	assert(engine);
 	const char *gameid = ConfMan.get("gameid").c_str();
@@ -756,7 +772,7 @@
 
 	// Invoke the detector, but fixed to the specified gameid.
 	Common::List<DetectorResult> results;
-	detectGames(fslist, results, gameid);
+	::detectGames(fslist, results, gameid);
 
 	// Unable to locate game data
 	if (results.empty()) {
@@ -904,6 +920,17 @@
 	return kNoError;
 }
 
+const char *ScummMetaEngine::getName() const {
+	return "Scumm Engine";
+}
+
+const char *ScummMetaEngine::getCopyright() const {
+	return "LucasArts SCUMM Games (C) LucasArts\n"
+	       "Humongous SCUMM Games (C) Humongous";
+}
+
+META_COMPATIBLITY_WRAPPER(SCUMM, ScummMetaEngine);
+
 REGISTER_PLUGIN(SCUMM, "Scumm Engine",
 				"LucasArts SCUMM Games (C) LucasArts\n"
 				"Humongous SCUMM Games (C) Humongous" );

Modified: scummvm/trunk/engines/sword1/sword1.cpp
===================================================================
--- scummvm/trunk/engines/sword1/sword1.cpp	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/engines/sword1/sword1.cpp	2008-02-02 00:54:52 UTC (rev 30726)
@@ -34,6 +34,8 @@
 #include "common/events.h"
 #include "common/system.h"
 
+#include "engines/metaengine.h"
+
 #include "sword1/resman.h"
 #include "sword1/objectman.h"
 #include "sword1/mouse.h"
@@ -83,7 +85,23 @@
 	// the engine needs several more files to work, but checking these should be sufficient
 };
 
-GameList Engine_SWORD1_gameIDList() {
+class SwordMetaEngine : public MetaEngine {
+public:
+	virtual const char *getName() const {
+		return "Broken Sword";
+	}
+	virtual const char *getCopyright() const {
+		return "Broken Sword Games (C) Revolution";
+	}
+
+	virtual GameList getSupportedGames() const;
+	virtual GameDescriptor findGame(const char *gameid) const;
+	virtual GameList detectGames(const FSList &fslist) const;
+
+	virtual PluginError createInstance(OSystem *syst, Engine **engine) const;
+};
+
+GameList SwordMetaEngine::getSupportedGames() const {
 	GameList games;
 	games.push_back(sword1FullSettings);
 	games.push_back(sword1DemoSettings);
@@ -92,7 +110,7 @@
 	return games;
 }
 
-GameDescriptor Engine_SWORD1_findGameID(const char *gameid) {
+GameDescriptor SwordMetaEngine::findGame(const char *gameid) const {
 	if (0 == scumm_stricmp(gameid, sword1FullSettings.gameid))
 		return sword1FullSettings;
 	if (0 == scumm_stricmp(gameid, sword1DemoSettings.gameid))
@@ -122,7 +140,7 @@
 	}
 }
 
-GameList Engine_SWORD1_detectGames(const FSList &fslist) {
+GameList SwordMetaEngine::detectGames(const FSList &fslist) const {
 	int i, j;
 	GameList detectedGames;
 	bool filesFound[NUM_FILES_TO_CHECK];
@@ -163,12 +181,14 @@
 	return detectedGames;
 }
 
-PluginError Engine_SWORD1_create(OSystem *syst, Engine **engine) {
+PluginError SwordMetaEngine::createInstance(OSystem *syst, Engine **engine) const {
 	assert(engine);
 	*engine = new SwordEngine(syst);
 	return kNoError;
 }
 
+META_COMPATIBLITY_WRAPPER(SWORD1, SwordMetaEngine);
+
 REGISTER_PLUGIN(SWORD1, "Broken Sword", "Broken Sword Games (C) Revolution");
 
 namespace Sword1 {

Modified: scummvm/trunk/engines/sword2/sword2.cpp
===================================================================
--- scummvm/trunk/engines/sword2/sword2.cpp	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/engines/sword2/sword2.cpp	2008-02-02 00:54:52 UTC (rev 30726)
@@ -35,6 +35,8 @@
 #include "common/events.h"
 #include "common/system.h"
 
+#include "engines/metaengine.h"
+
 #include "sword2/sword2.h"
 #include "sword2/defs.h"
 #include "sword2/header.h"
@@ -68,7 +70,23 @@
 
 } // End of namespace Sword2
 
-GameList Engine_SWORD2_gameIDList() {
+class Sword2MetaEngine : public MetaEngine {
+public:
+	virtual const char *getName() const {
+		return "Broken Sword 2";
+	}
+	virtual const char *getCopyright() const {
+		return "Broken Sword Games (C) Revolution";
+	}
+
+	virtual GameList getSupportedGames() const;
+	virtual GameDescriptor findGame(const char *gameid) const;
+	virtual GameList detectGames(const FSList &fslist) const;
+
+	virtual PluginError createInstance(OSystem *syst, Engine **engine) const;
+};
+
+GameList Sword2MetaEngine::getSupportedGames() const {
 	const Sword2::GameSettings *g = Sword2::sword2_settings;
 	GameList games;
 	while (g->gameid) {
@@ -78,7 +96,7 @@
 	return games;
 }
 
-GameDescriptor Engine_SWORD2_findGameID(const char *gameid) {
+GameDescriptor Sword2MetaEngine::findGame(const char *gameid) const {
 	const Sword2::GameSettings *g = Sword2::sword2_settings;
 	while (g->gameid) {
 		if (0 == scumm_stricmp(gameid, g->gameid))
@@ -88,7 +106,7 @@
 	return GameDescriptor(g->gameid, g->description);
 }
 
-GameList Engine_SWORD2_detectGames(const FSList &fslist) {
+GameList Sword2MetaEngine::detectGames(const FSList &fslist) const {
 	GameList detectedGames;
 	const Sword2::GameSettings *g;
 	FSList::const_iterator file;
@@ -123,7 +141,7 @@
 				if (0 == scumm_stricmp("clusters", fileName)) {
 					FSList recList;
 					if (file->getChildren(recList, FilesystemNode::kListAll)) {
-						GameList recGames(Engine_SWORD2_detectGames(recList));
+						GameList recGames(detectGames(recList));
 						if (!recGames.empty()) {
 							detectedGames.push_back(recGames);
 							break;
@@ -138,7 +156,7 @@
 	return detectedGames;
 }
 
-PluginError Engine_SWORD2_create(OSystem *syst, Engine **engine) {
+PluginError Sword2MetaEngine::createInstance(OSystem *syst, Engine **engine) const {
 	assert(syst);
 	assert(engine);
 
@@ -150,7 +168,7 @@
 
 	// Invoke the detector
 	Common::String gameid = ConfMan.get("gameid");
-	GameList detectedGames = Engine_SWORD2_detectGames(fslist);
+	GameList detectedGames = detectGames(fslist);
 
 	for (uint i = 0; i < detectedGames.size(); i++) {
 		if (detectedGames[i].gameid() == gameid) {
@@ -162,6 +180,8 @@
 	return kNoGameDataFoundError;
 }
 
+META_COMPATIBLITY_WRAPPER(SWORD2, Sword2MetaEngine);
+
 REGISTER_PLUGIN(SWORD2, "Broken Sword 2", "Broken Sword Games (C) Revolution");
 
 namespace Sword2 {

Modified: scummvm/trunk/engines/touche/detection.cpp
===================================================================
--- scummvm/trunk/engines/touche/detection.cpp	2008-02-02 00:41:31 UTC (rev 30725)
+++ scummvm/trunk/engines/touche/detection.cpp	2008-02-02 00:54:52 UTC (rev 30726)
@@ -124,7 +124,22 @@
 	Common::kADFlagAugmentPreferredTarget | Common::kADFlagPrintWarningOnFileBasedFallback
 };
 
-static bool Engine_TOUCHE_createInstance(OSystem *syst, Engine **engine, const Common::EncapsulatedADGameDesc &encapsulatedDesc) {
+class ToucheMetaEngine : public AdvancedMetaEngine {
+public:
+	ToucheMetaEngine() : AdvancedMetaEngine(detectionParams) {}
+
+	virtual const char *getName() const {
+		return "Touche Engine";
+	}
+	virtual const char *getCopyright() const {
+		return "Touche: The Adventures of the 5th Musketeer (C) Clipper Software";
+	}
+
+	virtual bool createInstance(OSystem *syst, Engine **engine, const Common::EncapsulatedADGameDesc &encapsulatedDesc) const;
+};
+
+
+bool ToucheMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::EncapsulatedADGameDesc &encapsulatedDesc) const {
 	const Common::ADGameDescription *gd = encapsulatedDesc.realDesc;
 	if (gd) {
 		*engine = new Touche::ToucheEngine(syst, gd->language);
@@ -132,6 +147,6 @@
 	return gd != 0;
 }
 
-ADVANCED_DETECTOR_DEFINE_PLUGIN(TOUCHE, Engine_TOUCHE_createInstance, detectionParams);
+META_COMPATIBLITY_WRAPPER(TOUCHE, ToucheMetaEngine);
 
 REGISTER_PLUGIN(TOUCHE, "Touche Engine", "Touche: The Adventures of the 5th Musketeer (C) Clipper Software");


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list