From 6bcc9a45fd63c35f4060fee81989d5cb1c0f833f Mon Sep 17 00:00:00 2001 From: Arnaud Boutonné Date: Thu, 13 Aug 2009 09:56:54 +0000 Subject: Initial save handler for Playtoons svn-id: r43344 --- engines/gob/save/saveload.h | 46 +++++- engines/gob/save/saveload_playtoons.cpp | 276 ++++++++++++++++++++++++++++++-- 2 files changed, 299 insertions(+), 23 deletions(-) diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h index 1a1a47178b..66cc34827e 100644 --- a/engines/gob/save/saveload.h +++ b/engines/gob/save/saveload.h @@ -450,13 +450,16 @@ protected: }; /** 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 @@ protected: 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 diff --git a/engines/gob/save/saveload_playtoons.cpp b/engines/gob/save/saveload_playtoons.cpp index 3014e3f2bf..392c9a94ac 100644 --- a/engines/gob/save/saveload_playtoons.cpp +++ b/engines/gob/save/saveload_playtoons.cpp @@ -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 @@ SaveLoad_Playtoons::SaveFile SaveLoad_Playtoons::_saveFiles[] = { { "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); +} + +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; } -SaveLoad_Playtoons::SaveLoad_Playtoons(GobEngine *vm) : +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 @@ SaveLoad_Playtoons::SaveFile *SaveLoad_Playtoons::getSaveFile(const char *fileNa 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 -- cgit v1.2.3