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

cyx at users.sourceforge.net cyx at users.sourceforge.net
Sun Dec 7 15:24:46 CET 2008


Revision: 35276
          http://scummvm.svn.sourceforge.net/scummvm/?rev=35276&view=rev
Author:   cyx
Date:     2008-12-07 14:24:46 +0000 (Sun, 07 Dec 2008)

Log Message:
-----------
reduced saveload code dup

Modified Paths:
--------------
    scummvm/trunk/engines/touche/detection.cpp
    scummvm/trunk/engines/touche/menu.cpp
    scummvm/trunk/engines/touche/saveload.cpp
    scummvm/trunk/engines/touche/touche.h

Modified: scummvm/trunk/engines/touche/detection.cpp
===================================================================
--- scummvm/trunk/engines/touche/detection.cpp	2008-12-07 14:23:54 UTC (rev 35275)
+++ scummvm/trunk/engines/touche/detection.cpp	2008-12-07 14:24:46 UTC (rev 35276)
@@ -159,73 +159,47 @@
 }
 
 bool ToucheMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const {
-	const Common::ADGameDescription *gd = desc;
-	if (gd) {
-		*engine = new Touche::ToucheEngine(syst, gd->language);
+	if (desc) {
+		*engine = new Touche::ToucheEngine(syst, desc->language);
 	}
-	return gd != 0;
+	return desc != 0;
 }
 
 SaveStateList ToucheMetaEngine::listSaves(const char *target) const {
-	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
-	Common::StringList filenames;
-	char saveDesc[Touche::kGameStateDescriptionLen];
-	Common::String pattern = target;
-	pattern += ".?";
-
-	filenames = saveFileMan->listSavefiles(pattern.c_str());
-	sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
-
+	Common::String pattern = Touche::generateGameStateFileName(target, 0, true);
+	Common::StringList filenames = g_system->getSavefileManager()->listSavefiles(pattern.c_str());
+	bool slotsTable[Touche::kMaxSaveStates];
+	memset(slotsTable, 0, sizeof(slotsTable));
 	SaveStateList saveList;
 	for (Common::StringList::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
-		// Obtain the last digit of the filename, since they correspond to the save slot
-		int slotNum = atoi(file->c_str() + file->size() - 1);
-	
-		if (slotNum >= 0 && slotNum <= 9) {
-			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
-			if (in) {
-				in->readUint16LE();
-				in->readUint16LE();
-				in->read(saveDesc, Touche::kGameStateDescriptionLen);
-				saveList.push_back(SaveStateDescriptor(slotNum, saveDesc));
-				delete in;
-			}
+		int slot = Touche::getGameStateFileSlot(file->c_str());
+		if (slot >= 0 && slot < Touche::kMaxSaveStates) {
+			slotsTable[slot] = true;
 		}
 	}
-	
-	pattern += "?";
-
-	filenames = saveFileMan->listSavefiles(pattern.c_str());
-	sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
-
-	for (Common::StringList::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
-		// Obtain the last 2 digits of the filename, since they correspond to the save slot
-		int slotNum = atoi(file->c_str() + file->size() - 2);
-	
-		if (slotNum >= 10 && slotNum <= 99) {
-			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
+	for (int slot = 0; slot < Touche::kMaxSaveStates; ++slot) {
+		if (slotsTable[slot]) {
+			Common::String file = Touche::generateGameStateFileName(target, slot);
+			Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(file.c_str());
 			if (in) {
-				in->readUint16LE();
-				in->readUint16LE();
-				in->read(saveDesc, Touche::kGameStateDescriptionLen);
-				saveList.push_back(SaveStateDescriptor(slotNum, saveDesc));
+				char description[64] = { 0 };
+				Touche::readGameStateDescription(in, description, sizeof(description));
+				if (description[0]) {
+					saveList.push_back(SaveStateDescriptor(slot, description));
+				}
 				delete in;
 			}
 		}
 	}
-
 	return saveList;
 }
 
-int ToucheMetaEngine::getMaximumSaveSlot() const { return 99; }
+int ToucheMetaEngine::getMaximumSaveSlot() const {
+	return Touche::kMaxSaveStates - 1;
+}
 
 void ToucheMetaEngine::removeSaveState(const char *target, int slot) const {
-	char extension[5];
-	snprintf(extension, sizeof(extension), ".%d", slot);
-
-	Common::String filename = target;
-	filename += extension;
-
+	Common::String filename = Touche::generateGameStateFileName(target, slot);
 	g_system->getSavefileManager()->removeSavefile(filename.c_str());
 }
 

Modified: scummvm/trunk/engines/touche/menu.cpp
===================================================================
--- scummvm/trunk/engines/touche/menu.cpp	2008-12-07 14:23:54 UTC (rev 35275)
+++ scummvm/trunk/engines/touche/menu.cpp	2008-12-07 14:24:46 UTC (rev 35276)
@@ -375,13 +375,16 @@
 					for (int i = 0; i < kMaxSaveStates; ++i) {
 						menuData.saveLoadDescriptionsTable[i][0] = 0;
 					}
-					char gameStateFileName[16];
-					generateGameStateFileName(999, gameStateFileName, 15, true);
-					Common::StringList filenames = _saveFileMan->listSavefiles(gameStateFileName);
+					Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), 0, true);
+					Common::StringList filenames = _saveFileMan->listSavefiles(gameStateFileName.c_str());
 					for (Common::StringList::const_iterator it = filenames.begin(); it != filenames.end(); ++it) {
 						int i = getGameStateFileSlot(it->c_str());
 						if (i >= 0 && i < kMaxSaveStates) {
-							readGameStateDescription(i, menuData.saveLoadDescriptionsTable[i], 32);
+							Common::InSaveFile *f = _saveFileMan->openForLoading(it->c_str());
+							if (f) {
+								readGameStateDescription(f, menuData.saveLoadDescriptionsTable[i], 32);
+								delete f;
+							}
 						}
 					}
 				}

Modified: scummvm/trunk/engines/touche/saveload.cpp
===================================================================
--- scummvm/trunk/engines/touche/saveload.cpp	2008-12-07 14:23:54 UTC (rev 35275)
+++ scummvm/trunk/engines/touche/saveload.cpp	2008-12-07 14:24:46 UTC (rev 35276)
@@ -31,6 +31,11 @@
 
 namespace Touche {
 
+enum {
+	kGameStateDescriptionLen = 32,
+	kCurrentGameStateVersion = 6
+};
+
 static void saveOrLoad(Common::WriteStream &stream, uint16 &i) {
 	stream.writeUint16LE(i);
 }
@@ -318,9 +323,8 @@
 
 Common::Error ToucheEngine::saveGameState(int num, const char *description) {
 	bool saveOk = false;
-	char gameStateFileName[64];
-	generateGameStateFileName(num, gameStateFileName, 63);
-	Common::OutSaveFile *f = _saveFileMan->openForSaving(gameStateFileName);
+	Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num);
+	Common::OutSaveFile *f = _saveFileMan->openForSaving(gameStateFileName.c_str());
 	if (f) {
 		f->writeUint16LE(kCurrentGameStateVersion);
 		f->writeUint16LE(0);
@@ -333,7 +337,7 @@
 		if (!f->ioFailed()) {
 			saveOk = true;
 		} else {
-			warning("Can't write file '%s'", gameStateFileName);
+			warning("Can't write file '%s'", gameStateFileName.c_str());
 		}
 		delete f;
 	}
@@ -342,9 +346,8 @@
 
 Common::Error ToucheEngine::loadGameState(int num) {
 	bool loadOk = false;
-	char gameStateFileName[64];
-	generateGameStateFileName(num, gameStateFileName, 63);
-	Common::InSaveFile *f = _saveFileMan->openForLoading(gameStateFileName);
+	Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num);
+	Common::InSaveFile *f = _saveFileMan->openForLoading(gameStateFileName.c_str());
 	if (f) {
 		uint16 version = f->readUint16LE();
 		if (version < kCurrentGameStateVersion) {
@@ -355,7 +358,7 @@
 			if (!f->ioFailed()) {
 				loadOk = true;
 			} else {
-				warning("Can't read file '%s'", gameStateFileName);
+				warning("Can't read file '%s'", gameStateFileName.c_str());
 			}
 		}
 		delete f;
@@ -363,31 +366,30 @@
 	return loadOk ? Common::kNoError : Common::kUnknownError;
 }
 
-void ToucheEngine::readGameStateDescription(int num, char *description, int len) {
-	char gameStateFileName[64];
-	generateGameStateFileName(num, gameStateFileName, 63);
-	Common::InSaveFile *f = _saveFileMan->openForLoading(gameStateFileName);
-	if (f) {
-		uint16 version = f->readUint16LE();
-		if (version >= kCurrentGameStateVersion) {
-			f->readUint16LE();
-			f->read(description, MIN<int>(len, kGameStateDescriptionLen));
-			description[len] = 0;
-		}
-		delete f;
+void readGameStateDescription(Common::ReadStream *f, char *description, int len) {
+	uint16 version = f->readUint16LE();
+	if (version >= kCurrentGameStateVersion) {
+		f->readUint16LE();
+		f->read(description, MIN<int>(len, kGameStateDescriptionLen));
+		description[len] = 0;
+	} else {
+		description[0] = 0;
 	}
 }
 
-void ToucheEngine::generateGameStateFileName(int num, char *dst, int len, bool prefixOnly) const {
+Common::String generateGameStateFileName(const char *target, int slot, bool prefixOnly) {
+	Common::String name(target);
 	if (prefixOnly) {
-		snprintf(dst, len, "%s.*", _targetName.c_str());
+		name += ".*";
 	} else {
-		snprintf(dst, len, "%s.%d", _targetName.c_str(), num);
+		char slotStr[16];
+		snprintf(slotStr, sizeof(slotStr), ".%d", slot);
+		name += slotStr;
 	}
-	dst[len] = 0;
+	return name;
 }
 
-int ToucheEngine::getGameStateFileSlot(const char *filename) const {
+int getGameStateFileSlot(const char *filename) {
 	int i = -1;
 	const char *slot = strrchr(filename, '.');
 	if (slot) {

Modified: scummvm/trunk/engines/touche/touche.h
===================================================================
--- scummvm/trunk/engines/touche/touche.h	2008-12-07 14:23:54 UTC (rev 35275)
+++ scummvm/trunk/engines/touche/touche.h	2008-12-07 14:24:46 UTC (rev 35276)
@@ -328,9 +328,7 @@
 	kCursorHeight = 42,
 	kTextHeight = 16,
 	kMaxProgramDataSize = 61440,
-	kMaxSaveStates = 100,
-	kGameStateDescriptionLen = 32,	// Need these two values defined here
-	kCurrentGameStateVersion = 6	// for --list-saves support
+	kMaxSaveStates = 100
 };
 
 enum StringType {
@@ -338,6 +336,10 @@
 	kStringTypeConversation
 };
 
+void readGameStateDescription(Common::ReadStream *f, char *description, int len);
+Common::String generateGameStateFileName(const char *target, int slot, bool prefixOnly = false);
+int getGameStateFileSlot(const char *filename);
+
 class MidiPlayer;
 
 class ToucheEngine: public Engine {
@@ -497,13 +499,10 @@
 
 	void saveGameStateData(Common::WriteStream *stream);
 	void loadGameStateData(Common::ReadStream *stream);
-	Common::Error saveGameState(int num, const char *description);
-	Common::Error loadGameState(int num);
-	bool canLoadGameStateCurrently();
-	bool canSaveGameStateCurrently();
-	void readGameStateDescription(int num, char *description, int len);
-	void generateGameStateFileName(int num, char *dst, int len, bool prefixOnly = false) const;
-	int getGameStateFileSlot(const char *filename) const;
+	virtual Common::Error saveGameState(int num, const char *description);
+	virtual Common::Error loadGameState(int num);
+	virtual bool canLoadGameStateCurrently();
+	virtual bool canSaveGameStateCurrently();
 
 	void setupOpcodes();
 	void op_nop();


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