[Scummvm-cvs-logs] SF.net SVN: scummvm:[43344] scummvm/trunk/engines/gob/save

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Thu Aug 13 11:56:54 CEST 2009


Revision: 43344
          http://scummvm.svn.sourceforge.net/scummvm/?rev=43344&view=rev
Author:   strangerke
Date:     2009-08-13 09:56:54 +0000 (Thu, 13 Aug 2009)

Log Message:
-----------
Initial save handler for Playtoons 

Modified Paths:
--------------
    scummvm/trunk/engines/gob/save/saveload.h
    scummvm/trunk/engines/gob/save/saveload_playtoons.cpp

Modified: scummvm/trunk/engines/gob/save/saveload.h
===================================================================
--- scummvm/trunk/engines/gob/save/saveload.h	2009-08-13 00:32:15 UTC (rev 43343)
+++ scummvm/trunk/engines/gob/save/saveload.h	2009-08-13 09:56:54 UTC (rev 43344)
@@ -450,13 +450,16 @@
 };
 
 /** Save/Load class for Playtoons. */
-/** Only used for the moment to check file presence */
-
 class SaveLoad_Playtoons : public SaveLoad {
 public:
-	SaveLoad_Playtoons(GobEngine *vm);
+	static const uint32 kSlotCount = 60;
+	static const uint32 kSlotNameLength = 40;
+
+	SaveLoad_Playtoons(GobEngine *vm, const char *targetName);
 	virtual ~SaveLoad_Playtoons();
 
+	SaveMode getSaveMode(const char *fileName) const;
+
 protected:
 	struct SaveFile {
 		const char *sourceName;
@@ -465,14 +468,45 @@
 		const char *description;
 	};
 
+	/** Handles the save slots. */
+	class GameHandler : public SaveHandler {
+	public:
+		GameHandler(GobEngine *vm, const char *target);
+		~GameHandler();
+
+		int32 getSize();
+		bool load(int16 dataVar, int32 size, int32 offset);
+		bool save(int16 dataVar, int32 size, int32 offset);
+
+	private:
+		/** Slot file construction. */
+		class File : public SlotFileIndexed {
+		public:
+			File(GobEngine *vm, const char *base);
+			~File();
+
+			int getSlot(int32 offset) const;
+			int getSlotRemainder(int32 offset) const;
+		};
+
+		byte _props[500];
+		/** The index. 500 bytes properties + kSlotCount * kSlotNameLength bytes. */
+		byte _index[2400];
+
+		File *_slotFile;
+
+		void buildIndex(byte *buffer) const;
+	};
+
 	static SaveFile _saveFiles[];
 
-	SaveMode getSaveMode(const char *fileName) const;
+	GameHandler *_gameHandler;
 
+	SaveHandler *getHandler(const char *fileName) const;
+	const char *getDescription(const char *fileName) const;
+
 	const SaveFile *getSaveFile(const char *fileName) const;
-	
 	SaveFile *getSaveFile(const char *fileName);
-
 };
 
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/save/saveload_playtoons.cpp
===================================================================
--- scummvm/trunk/engines/gob/save/saveload_playtoons.cpp	2009-08-13 00:32:15 UTC (rev 43343)
+++ scummvm/trunk/engines/gob/save/saveload_playtoons.cpp	2009-08-13 09:56:54 UTC (rev 43344)
@@ -30,14 +30,17 @@
 namespace Gob {
 
 SaveLoad_Playtoons::SaveFile SaveLoad_Playtoons::_saveFiles[] = {
-	{  "disk.001", kSaveModeExists, 0, 0}, // Playtoons 1 identification file
-	{  "disk.002", kSaveModeExists, 0, 0}, // Playtoons 2 identification file
-	{  "disk.003", kSaveModeExists, 0, 0}, // Playtoons 3 identification file
-	{  "disk.004", kSaveModeExists, 0, 0}, // Playtoons 4 identification file
-	{  "disk.005", kSaveModeExists, 0, 0}, // Playtoons 5 identification file
-	{  "disk.006", kSaveModeExists, 0, 0}, // Playtoons CK 1 identification file
-	{  "disk.007", kSaveModeExists, 0, 0}, // Playtoons CK 2 identification file
-	{  "disk.008", kSaveModeExists, 0, 0}, // Playtoons CK 3 identification file
+	{    "did.inf", kSaveModeSave,   0, 0}, // 
+	{    "dan.itk", kSaveModeNone,   0, 0}, // Playtoons CK initial detection file
+	{   "disk.001", kSaveModeExists, 0, 0}, // Playtoons 1 identification file
+	{   "disk.002", kSaveModeExists, 0, 0}, // Playtoons 2 identification file
+	{   "disk.003", kSaveModeExists, 0, 0}, // Playtoons 3 identification file
+	{   "disk.004", kSaveModeExists, 0, 0}, // Playtoons 4 identification file
+	{   "disk.005", kSaveModeExists, 0, 0}, // Playtoons 5 identification file
+	{   "disk.006", kSaveModeExists, 0, 0}, // Playtoons CK 1 identification file
+	{   "disk.007", kSaveModeExists, 0, 0}, // Playtoons CK 2 identification file
+	{   "disk.008", kSaveModeExists, 0, 0}, // Playtoons CK 3 identification file
+/*
 	{  "titre.001", kSaveModeExists, 0, 0}, // Playtoons 1 titles
 	{  "titre.002", kSaveModeExists, 0, 0}, // Playtoons 2 titles
 	{  "titre.003", kSaveModeExists, 0, 0}, // Playtoons 3 titles
@@ -46,25 +49,237 @@
 	{  "titre.006", kSaveModeExists, 0, 0}, // Playtoons CK 1 empty title (???)
 	{  "titre.007", kSaveModeExists, 0, 0}, // Playtoons CK 2 empty title (???)
 	{  "titre.008", kSaveModeExists, 0, 0}, // Playtoons CK 3 empty title (???)
-	{  "mdo.def",  kSaveModeExists, 0, 0},
-	{  "dan.itk",  kSaveModeNone, 0, 0},
-	{  "did.inf",  kSaveModeSave, 0, 0},
+	{    "mdo.def", kSaveModeExists, 0, 0}, // 
+*/
 };
 
-SaveLoad::SaveMode SaveLoad_Playtoons::getSaveMode(const char *fileName) const {
-	const SaveFile *saveFile = getSaveFile(fileName);
+SaveLoad_Playtoons::GameHandler::File::File(GobEngine *vm, const char *base) :
+	SlotFileIndexed(vm, SaveLoad_Playtoons::kSlotCount, base, "s") {
+}
 
-	if (saveFile)
-		return saveFile->mode;
+SaveLoad_Playtoons::GameHandler::File::~File() {
+}
 
-	return kSaveModeNone;
+int SaveLoad_Playtoons::GameHandler::File::getSlot(int32 offset) const {
+	uint32 varSize = SaveHandler::getVarSize(_vm);
+
+	if (varSize == 0)
+		return -1;
+
+	return ((offset - 2900) / varSize);
 }
 
-SaveLoad_Playtoons::SaveLoad_Playtoons(GobEngine *vm) :
+int SaveLoad_Playtoons::GameHandler::File::getSlotRemainder(int32 offset) const {
+	uint32 varSize = SaveHandler::getVarSize(_vm);
+
+	if (varSize == 0)
+		return -1;
+
+	return ((offset - 2900) % varSize);
+}
+
+
+SaveLoad_Playtoons::GameHandler::GameHandler(GobEngine *vm, const char *target) : SaveHandler(vm) {
+	memset(_props, 0,  500);
+	memset(_index, 0, 2400);
+
+	_slotFile = new File(vm, target);
+}
+
+SaveLoad_Playtoons::GameHandler::~GameHandler() {
+	delete _slotFile;
+}
+
+int32 SaveLoad_Playtoons::GameHandler::getSize() {
+	uint32 varSize = SaveHandler::getVarSize(_vm);
+
+	if (varSize == 0)
+		return -1;
+
+	return _slotFile->tallyUpFiles(varSize, 2900);
+}
+
+bool SaveLoad_Playtoons::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
+	uint32 varSize = SaveHandler::getVarSize(_vm);
+
+	if (varSize == 0)
+		return false;
+
+	if (size == 0) {
+		// Indicator to load all variables
+		dataVar = 0;
+		size = varSize;
+	}
+
+	if (offset < 500) {
+		// Properties
+
+		if ((offset + size) > 500) {
+			warning("Wrong index size (%d, %d)", size, offset);
+			return false;
+		}
+
+		_vm->_inter->_variables->copyFrom(dataVar, _props + offset, size);
+
+	} else if (offset < 2900) {
+		// Save index
+
+		if (size != 2400) {
+			warning("Wrong index size (%d, %d)", size, offset);
+			return false;
+		}
+
+		buildIndex(_vm->_inter->_variables->getAddressOff8(dataVar));
+
+	} else {
+		// Save slot, whole variable block
+
+		uint32 slot = _slotFile->getSlot(offset);
+		int slotRem = _slotFile->getSlotRemainder(offset);
+
+		debugC(2, kDebugSaveLoad, "Loading from slot %d", slot);
+
+		if ((slot >= kSlotCount) || (slotRem != 0) ||
+		    (dataVar != 0) || (((uint32) size) != varSize)) {
+
+			warning("Invalid loading procedure (%d, %d, %d, %d, %d)",
+					dataVar, size, offset, slot, slotRem);
+			return false;
+		}
+
+		Common::String slotFile = _slotFile->build(slot);
+
+		SaveReader *reader = 0;
+
+		// New save, load directly
+		reader = new SaveReader(2, slot, slotFile);
+
+		SavePartInfo info(kSlotNameLength, (uint32) _vm->getGameType(), 0,
+				_vm->getEndianness(), varSize);
+		SavePartVars vars(_vm, varSize);
+
+		if (!reader->load()) {
+			delete reader;
+			return false;
+		}
+
+		if (!reader->readPart(0, &info)) {
+			delete reader;
+			return false;
+		}
+		if (!reader->readPart(1, &vars)) {
+			delete reader;
+			return false;
+		}
+
+		// Get all variables
+		if (!vars.writeInto(0, 0, varSize)) {
+			delete reader;
+			return false;
+		}
+
+		delete reader;
+	}
+
+	return true;
+}
+
+bool SaveLoad_Playtoons::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
+	uint32 varSize = SaveHandler::getVarSize(_vm);
+
+	warning("Saving %d %d %d", dataVar, size, offset);
+
+	if (varSize == 0)
+		return false;
+
+	if (size == 0) {
+		// Indicator to save all variables
+		dataVar = 0;
+		size = varSize;
+	}
+
+	if (offset < 500) {
+		// Properties
+
+		if ((offset + size) > 500) {
+			warning("Wrong index size (%d, %d)", size, offset);
+			return false;
+		}
+
+		_vm->_inter->_variables->copyTo(dataVar, _props + offset, size);
+
+	}  else if (offset < 2900) {
+		// Save index
+
+		if (size != 2400) {
+			warning("Wrong index size (%d, %d)", size, offset);
+			return false;
+		}
+
+		// Just copy the index into our buffer
+		_vm->_inter->_variables->copyTo(dataVar, _index, 2400);
+
+	} else {
+		// Save slot, whole variable block
+
+		uint32 slot = _slotFile->getSlot(offset);
+		int slotRem = _slotFile->getSlotRemainder(offset);
+
+		debugC(2, kDebugSaveLoad, "Saving to slot %d", slot);
+
+		if ((slot >= kSlotCount) || (slotRem != 0) ||
+		    (dataVar != 0) || (((uint32) size) != varSize)) {
+
+			warning("Invalid saving procedure (%d, %d, %d, %d, %d)",
+					dataVar, size, offset, slot, slotRem);
+			return false;
+		}
+
+		Common::String slotFile = _slotFile->build(slot);
+
+		SaveWriter writer(2, slot, slotFile);
+		SavePartInfo info(kSlotNameLength, (uint32) _vm->getGameType(), 0,
+				_vm->getEndianness(), varSize);
+		SavePartVars vars(_vm, varSize);
+
+		// Write the description
+		info.setDesc(_index + (slot * kSlotNameLength), kSlotNameLength);
+		// Write all variables
+		if (!vars.readFrom(0, 0, varSize))
+			return false;
+
+		if (!writer.writePart(0, &info))
+			return false;
+		if (!writer.writePart(1, &vars))
+			return false;
+	}
+
+	return true;
+}
+
+void SaveLoad_Playtoons::GameHandler::buildIndex(byte *buffer) const {
+	uint32 varSize = SaveHandler::getVarSize(_vm);
+
+	if (varSize == 0)
+		return;
+
+	SavePartInfo info(kSlotNameLength, (uint32) _vm->getGameType(),
+			0, _vm->getEndianness(), varSize);
+
+	_slotFile->buildIndex(buffer, info, 0);
+}
+
+
+SaveLoad_Playtoons::SaveLoad_Playtoons(GobEngine *vm, const char *targetName) :
 		SaveLoad(vm) {
+
+	_gameHandler = new GameHandler(vm, targetName);
+
+	_saveFiles[0].handler = _gameHandler;
 }
 
 SaveLoad_Playtoons::~SaveLoad_Playtoons() {
+	delete _gameHandler;
 }
 
 const SaveLoad_Playtoons::SaveFile *SaveLoad_Playtoons::getSaveFile(const char *fileName) const {
@@ -87,4 +302,31 @@
 	return 0;
 }
 
+SaveHandler *SaveLoad_Playtoons::getHandler(const char *fileName) const {
+	const SaveFile *saveFile = getSaveFile(fileName);
+
+	if (saveFile)
+		return saveFile->handler;
+
+	return 0;
+}
+
+const char *SaveLoad_Playtoons::getDescription(const char *fileName) const {
+	const SaveFile *saveFile = getSaveFile(fileName);
+
+	if (saveFile)
+		return saveFile->description;
+
+	return 0;
+}
+
+SaveLoad::SaveMode SaveLoad_Playtoons::getSaveMode(const char *fileName) const {
+	const SaveFile *saveFile = getSaveFile(fileName);
+
+	if (saveFile)
+		return saveFile->mode;
+
+	return kSaveModeNone;
+}
+
 } // End of namespace Gob


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