aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Boutonné2009-08-13 09:56:54 +0000
committerArnaud Boutonné2009-08-13 09:56:54 +0000
commit6bcc9a45fd63c35f4060fee81989d5cb1c0f833f (patch)
tree91249cf4ce08e61ff32941e1d16c65d1c08ee834
parent568ffca0a60339b5c0e2d20ddef57f65f229950b (diff)
downloadscummvm-rg350-6bcc9a45fd63c35f4060fee81989d5cb1c0f833f.tar.gz
scummvm-rg350-6bcc9a45fd63c35f4060fee81989d5cb1c0f833f.tar.bz2
scummvm-rg350-6bcc9a45fd63c35f4060fee81989d5cb1c0f833f.zip
Initial save handler for Playtoons
svn-id: r43344
-rw-r--r--engines/gob/save/saveload.h46
-rw-r--r--engines/gob/save/saveload_playtoons.cpp276
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