[Scummvm-cvs-logs] SF.net SVN: scummvm: [25272] scummvm/trunk/engines/touche

sev at users.sourceforge.net sev at users.sourceforge.net
Tue Jan 30 01:24:09 CET 2007


Revision: 25272
          http://scummvm.svn.sourceforge.net/scummvm/?rev=25272&view=rev
Author:   sev
Date:     2007-01-29 16:24:09 -0800 (Mon, 29 Jan 2007)

Log Message:
-----------
Moved Touche engine to AdvancedDetector.

Modified Paths:
--------------
    scummvm/trunk/engines/touche/plugin.cpp
    scummvm/trunk/engines/touche/touche.cpp
    scummvm/trunk/engines/touche/touche.h

Modified: scummvm/trunk/engines/touche/plugin.cpp
===================================================================
--- scummvm/trunk/engines/touche/plugin.cpp	2007-01-30 00:22:58 UTC (rev 25271)
+++ scummvm/trunk/engines/touche/plugin.cpp	2007-01-30 00:24:09 UTC (rev 25272)
@@ -22,162 +22,107 @@
 
 #include "common/stdafx.h"
 #include "common/config-manager.h"
-#include "common/fs.h"
-#include "common/md5.h"
+#include "common/advancedDetector.h"
 
 #include "base/plugins.h"
 
 #include "touche/touche.h"
 
-struct GameVersion {
-	const char *description;
-	uint32 filesize;
-	const char *md5digest;
-	Common::Language language;
-	Common::Platform platform;
+namespace Touche {
+static GameList GAME_detectGames(const FSList &fslist);
+}
+
+
+static const PlainGameDescriptor toucheGames[] = {
+	{"touche", "Touche: The Adventures of the Fifth Musketeer"},
+	{"touche-fr", "Touche: Les Aventures du Cinquieme Mousquetaire"},
+	{"touche-de", "Touche - Die Abenteuer des funften Musketiers"},
+	{"touche-it", "Touche: The Adventures of the Fifth Musketeer"},
+	{0, 0}
 };
 
-static const GameVersion toucheGameVersionsTable[] = {
+namespace Touche {
+
+static const Common::ADGameDescription gameDescriptions[] = {
 	{ // retail version
-		"Touche: The Adventures of the Fifth Musketeer",
-		26350211,
-		"2af0177f8887e3430f345e6b4d8b1414",
+		"touche",
+		"",
+		AD_ENTRY1s("touche.dat", "2af0177f8887e3430f345e6b4d8b1414", 26350211),
 		Common::EN_ANY,
-		Common::kPlatformPC
+		Common::kPlatformPC,
 	},
 	{ // retail version - tracker item #1601818
-		"Touche: The Adventures of the Fifth Musketeer",
-		26350190,
-		"95967f0b51d2e813e99ca00325098340",
+		"touche",
+		"",
+		AD_ENTRY1s("touche.dat", "95967f0b51d2e813e99ca00325098340", 26350190),
 		Common::EN_ANY,
-		Common::kPlatformWindows
+		Common::kPlatformPC,
 	},
 	{ // retail version
-		"Touche: Les Aventures du Cinquieme Mousquetaire",
-		26558232,
-		"1caa20bb4d4fc2ce8eb867b6610082b3",
+		"touche-fr",
+		"",
+		AD_ENTRY1s("touche.dat", "1caa20bb4d4fc2ce8eb867b6610082b3", 26558232),
 		Common::FR_FRA,
-		Common::kPlatformPC
+		Common::kPlatformPC,
 	},
 	{ // retail version - tracker item #1598643
-		"Touche - Die Abenteuer des funften Musketiers",
-		26625537,
-		"be2ae6454b3325e410946f2322547cd4",
+		"touche-de",
+		"",
+		AD_ENTRY1s("touche.dat", "be2ae6454b3325e410946f2322547cd4", 26625537),
 		Common::DE_DEU,
-		Common::kPlatformPC
+		Common::kPlatformPC,
 	},
 	{ // fan-made translation (http://www.iagtg.net/) - tracker item #1602360
-		"Touche: The Adventures of the Fifth Musketeer",
-		26367792,
-		"1f442331d4b327c3488a9f6ffe9bdd25",
+		"touche-it",
+		"",
+		AD_ENTRY1s("touche.dat", "1f442331d4b327c3488a9f6ffe9bdd25", 26367792),
 		Common::IT_ITA,
-		Common::kPlatformPC
+		Common::kPlatformPC,
 	},
 	{ // demo version
-		"Touche: The Adventures of the Fifth Musketeer (Demo)",
-		8720683,
-		"ddaed436445b2e77294ed19e8ae4aa2c",
+		"touche",
+		"Demo",
+		AD_ENTRY1s("touche.dat", "ddaed436445b2e77294ed19e8ae4aa2c", 8720683),
 		Common::EN_ANY,
-		Common::kPlatformPC
-	}
+		Common::kPlatformPC,
+	},
+	{ NULL, NULL, { { NULL, 0, NULL, 0 } }, Common::UNK_LANG, Common::kPlatformUnknown }
 };
 
-static const PlainGameDescriptor toucheGameDescriptor = {
-	"touche", "Touche: The Adventures of the Fifth Musketeer"
+}
+
+static const Common::ADParams detectionParams = {
+	// Pointer to ADGameDescription or its superset structure
+	(const byte *)Touche::gameDescriptions,
+	// Size of that superset structure
+	sizeof(Common::ADGameDescription),
+	// Number of bytes to compute MD5 sum for
+	4096,
+	// List of all engine targets
+	toucheGames,
+	// Structure for autoupgrading obsolete targets
+	0,
+	// Name of single gameid (optional)
+	"touche",
+	// Flags
+	0
 };
 
-static const char *toucheDetectFileName = "TOUCHE.DAT";
+ADVANCED_DETECTOR_DEFINE_PLUGIN(TOUCHE, Touche::ToucheEngine, Touche::GAME_detectGames, detectionParams);
 
-static Common::String Engine_TOUCHE_md5digest(const FilesystemNode *file) {
-	static const int md5DataSize = 4096;
-	uint8 md5digest[16];
-	if (Common::md5_file(*file, md5digest, md5DataSize)) {
-		char md5sum[32 + 1];
-		for (int i = 0; i < 16; ++i) {
-			sprintf(md5sum + i * 2, "%02x", (int)md5digest[i]);
-		}
-		return md5sum;
-	}
-	return "";
-}
+REGISTER_PLUGIN(TOUCHE, "Touche Engine", "Touche: The Adventures of the 5th Musketeer (C) Clipper Software");
 
-static uint32 Engine_TOUCHE_filesize(const FilesystemNode *file) {
-	Common::File f;
-	if (f.open(file->path().c_str())) {
-		return f.size();
-	}
-	return 0;
-}
+namespace Touche {
 
-GameList Engine_TOUCHE_gameIDList() {
-	GameList games;
-	games.push_back(toucheGameDescriptor);
-	return games;
-}
+bool ToucheEngine::detectGame() {
+	int i = Common::AdvancedDetector::detectBestMatchingGame(detectionParams);
 
-GameDescriptor Engine_TOUCHE_findGameID(const char *gameid) {
-	if (scumm_stricmp(toucheGameDescriptor.gameid, gameid) == 0) {
-		return toucheGameDescriptor;
-	}
-	return GameDescriptor();
+	_language = gameDescriptions[i].language;
+	return true;
 }
 
-GameList Engine_TOUCHE_detectGames(const FSList &fslist) {
-	bool foundFile = false;
-	FSList::const_iterator file;
-	for (file = fslist.begin(); file != fslist.end(); ++file) {
-		if (file->isDirectory()) {
-			continue;
-		}
-		for (int i = 0; i < ARRAYSIZE(toucheGameVersionsTable); ++i) {
-			if (file->name().equalsIgnoreCase(toucheDetectFileName)) {
-				foundFile = true;
-				break;
-			}
-		}
-		if (foundFile) {
-			break;
-		}
-	}
-	GameList detectedGames;
-	if (foundFile) {
-		// Currently, the detection code is based on a MD5 checksum. If all known versions
-		// have a different file size for TOUCHE.DAT, we may consider using this to do the
-		// detection.
-		Common::String md5digest = Engine_TOUCHE_md5digest(file);
-		if (!md5digest.empty()) {
-			for (int i = 0; i < ARRAYSIZE(toucheGameVersionsTable); ++i) {
-				const GameVersion *gv = &toucheGameVersionsTable[i];
-				if (md5digest.equalsIgnoreCase(gv->md5digest)) {
-					GameDescriptor dg(toucheGameDescriptor.gameid, gv->description, gv->language, gv->platform);
-					detectedGames.push_back(dg);
-					break;
-				}
-			}
-			if (detectedGames.empty()) {
-				const uint32 filesize = Engine_TOUCHE_filesize(file);
-				printf("Datafile size (%d) and MD5 (%s) are unknown !\n", filesize, md5digest.c_str());
-				printf("Please report the details (language, platform, etc.) of this game to the ScummVM team.\n");
-				detectedGames.push_back(toucheGameDescriptor);
-			}
-		}
-	}
-	return detectedGames;
+GameList GAME_detectGames(const FSList &fslist) {
+	return Common::AdvancedDetector::detectAllGames(fslist, detectionParams);
 }
 
-PluginError Engine_TOUCHE_create(OSystem *system, Engine **engine) {
-	FSList fslist;
-	FilesystemNode dir(ConfMan.get("path"));
-	if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) {
-		return kInvalidPathError;
-	}
-	GameList game = Engine_TOUCHE_detectGames(fslist);
-	if (game.size() != 1) {
-		return kNoGameDataFoundError;
-	}
-	assert(engine);
-	*engine = new Touche::ToucheEngine(system, game[0].language());
-	return kNoError;
-}
-
-REGISTER_PLUGIN(TOUCHE, "Touche Engine", "Touche: The Adventures of the 5th Musketeer (C) Clipper Software");
+} // End of namespace Touche

Modified: scummvm/trunk/engines/touche/touche.cpp
===================================================================
--- scummvm/trunk/engines/touche/touche.cpp	2007-01-30 00:22:58 UTC (rev 25271)
+++ scummvm/trunk/engines/touche/touche.cpp	2007-01-30 00:24:09 UTC (rev 25272)
@@ -32,8 +32,8 @@
 
 namespace Touche {
 
-ToucheEngine::ToucheEngine(OSystem *system, Common::Language language)
-	: Engine(system), _language(language) {
+ToucheEngine::ToucheEngine(OSystem *system)
+	: Engine(system) {
 
 	_saveLoadCurrentPage = 0;
 	_saveLoadCurrentSlot = 0;
@@ -63,19 +63,11 @@
 	_menuRedrawCounter = 0;
 	memset(_paletteBuffer, 0, sizeof(_paletteBuffer));
 
-	Graphics::setupFont(_language);
-
-	setupOpcodes();
-
 	Common::addSpecialDebugLevel(kDebugEngine,   "Engine",   "Engine debug level");
 	Common::addSpecialDebugLevel(kDebugGraphics, "Graphics", "Graphics debug level");
 	Common::addSpecialDebugLevel(kDebugResource, "Resource", "Resource debug level");
 	Common::addSpecialDebugLevel(kDebugOpcodes,  "Opcodes",  "Opcodes debug level");
 	Common::addSpecialDebugLevel(kDebugUserIntf, "UserIntf", "UserInterface debug level");
-
-	int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);
-	MidiDriver *driver = MidiDriver::createMidi(midiDriver);
-	_midiPlayer = new MidiPlayer(driver);
 }
 
 ToucheEngine::~ToucheEngine() {
@@ -89,6 +81,20 @@
 		_system->initSize(kScreenWidth, kScreenHeight);
 	_system->endGFXTransaction();
 
+	// Detect game
+	if (!detectGame()) {
+		GUIErrorMessage("No valid games were found in the specified directory.");
+		return -1;
+	}
+
+	Graphics::setupFont(_language);
+
+	setupOpcodes();
+
+	int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);
+	MidiDriver *driver = MidiDriver::createMidi(midiDriver);
+	_midiPlayer = new MidiPlayer(driver);
+
 	_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
 	_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume"));
 	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, Audio::Mixer::kMaxMixerVolume);

Modified: scummvm/trunk/engines/touche/touche.h
===================================================================
--- scummvm/trunk/engines/touche/touche.h	2007-01-30 00:22:58 UTC (rev 25271)
+++ scummvm/trunk/engines/touche/touche.h	2007-01-30 00:24:09 UTC (rev 25272)
@@ -347,7 +347,7 @@
 
 	typedef void (ToucheEngine::*OpcodeProc)();
 
-	ToucheEngine(OSystem *system, Common::Language language);
+	ToucheEngine(OSystem *system);
 	virtual ~ToucheEngine();
 
 	virtual int init();
@@ -355,6 +355,8 @@
 
 protected:
 
+	bool detectGame();
+
 	void restart();
 	void readConfigurationSettings();
 	void writeConfigurationSettings();


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