From 8b3f2955a458ea9c677491a4e41f9fc95c806b8d Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 21 Jan 2011 13:28:35 +0000 Subject: GOB: Make the Cemetary/Lab screen work correctly Saving there still won't work though svn-id: r55374 --- engines/gob/inter_v5.cpp | 17 +++++++++- engines/gob/save/savehandler.cpp | 4 +++ engines/gob/save/savehandler.h | 3 ++ engines/gob/save/saveload.cpp | 24 ++++++++++++++ engines/gob/save/saveload.h | 22 +++++++++++++ engines/gob/save/saveload_v6.cpp | 70 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 138 insertions(+), 2 deletions(-) (limited to 'engines') diff --git a/engines/gob/inter_v5.cpp b/engines/gob/inter_v5.cpp index 32e659feed..a22392be55 100644 --- a/engines/gob/inter_v5.cpp +++ b/engines/gob/inter_v5.cpp @@ -26,12 +26,15 @@ #include "common/endian.h" #include "common/file.h" +#include "gui/message.h" + #include "gob/gob.h" #include "gob/inter.h" #include "gob/global.h" #include "gob/game.h" #include "gob/script.h" #include "gob/draw.h" +#include "gob/save/saveload.h" namespace Gob { @@ -95,8 +98,20 @@ void Inter_v5::setupOpcodesGob() { void Inter_v5::o5_deleteFile() { _vm->_game->_script->evalExpr(0); + char *file = _vm->_game->_script->getResultStr(); + + debugC(2, kDebugFileIO, "Delete file \"%s\"", file); + + SaveLoad::SaveMode mode = _vm->_saveLoad->getSaveMode(file); + if (mode == SaveLoad::kSaveModeSave) { + + if (!_vm->_saveLoad->deleteFile(file)) { + GUI::MessageDialog dialog("Failed to save game state to file."); + dialog.runModal(); + } - warning("deleteFile: \"%s\"", _vm->_game->_script->getResultStr()); + } else if (mode == SaveLoad::kSaveModeNone) + warning("Attempted to delete file \"%s\"", file); } void Inter_v5::o5_initScreen() { diff --git a/engines/gob/save/savehandler.cpp b/engines/gob/save/savehandler.cpp index d447b0dbd6..8a20665140 100644 --- a/engines/gob/save/savehandler.cpp +++ b/engines/gob/save/savehandler.cpp @@ -212,6 +212,10 @@ uint32 SaveHandler::getVarSize(GobEngine *vm) { return vm->_inter->_variables->getSize(); } +bool SaveHandler::deleteFile() { + return true; +} + TempSpriteHandler::TempSpriteHandler(GobEngine *vm) : SaveHandler(vm) { _sprite = 0; diff --git a/engines/gob/save/savehandler.h b/engines/gob/save/savehandler.h index 723215cf08..c6370947e2 100644 --- a/engines/gob/save/savehandler.h +++ b/engines/gob/save/savehandler.h @@ -121,6 +121,9 @@ public: /** Saves (parts of) the file. */ virtual bool save(int16 dataVar, int32 size, int32 offset) = 0; + /** Deletes the file. */ + virtual bool deleteFile(); + static uint32 getVarSize(GobEngine *vm); protected: diff --git a/engines/gob/save/saveload.cpp b/engines/gob/save/saveload.cpp index 81239f07dc..3508e58f16 100644 --- a/engines/gob/save/saveload.cpp +++ b/engines/gob/save/saveload.cpp @@ -117,6 +117,30 @@ bool SaveLoad::save(const char *fileName, int16 dataVar, int32 size, int32 offse return true; } +bool SaveLoad::deleteFile(const char *fileName) { + debugC(3, kDebugSaveLoad, "Requested deletion save file \"%s\"", fileName); + + SaveHandler *handler = getHandler(fileName); + + if (!handler) { + warning("No save handler for \"%s\"", fileName); + return false; + } + + if (!handler->deleteFile()) { + const char *desc = getDescription(fileName); + + if (!desc) + desc = "Unknown"; + + warning("Could not delete %s (\"%s\")", desc, fileName); + return false; + } + + debugC(3, kDebugSaveLoad, "Successfully deleted file"); + return true; +} + SaveLoad::SaveMode SaveLoad::getSaveMode(const char *fileName) const { return kSaveModeNone; } diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h index 89beafd9fc..af1c323723 100644 --- a/engines/gob/save/saveload.h +++ b/engines/gob/save/saveload.h @@ -64,6 +64,9 @@ public: /** Saves size bytes from the variables starting with data dataVar at offset. */ bool save(const char *fileName, int16 dataVar, int32 size, int32 offset); + /** Deletes the file. */ + bool deleteFile(const char *fileName); + protected: GobEngine *_vm; @@ -653,10 +656,29 @@ protected: File _file; }; + /** Handles the temporary saves. */ + class TempHandler : public SaveHandler { + public: + TempHandler(GobEngine *vm); + ~TempHandler(); + + int32 getSize(); + bool load(int16 dataVar, int32 size, int32 offset); + bool save(int16 dataVar, int32 size, int32 offset); + bool deleteFile(); + + private: + bool _empty; + + uint32 _size; + byte *_data; + }; + static SaveFile _saveFiles[]; GameHandler *_gameHandler; AutoHandler *_autoHandler; + TempHandler *_tmpHandler[2]; SaveHandler *getHandler(const char *fileName) const; const char *getDescription(const char *fileName) const; diff --git a/engines/gob/save/saveload_v6.cpp b/engines/gob/save/saveload_v6.cpp index 8961b050f2..9a439fbf4c 100644 --- a/engines/gob/save/saveload_v6.cpp +++ b/engines/gob/save/saveload_v6.cpp @@ -37,7 +37,9 @@ SaveLoad_v6::SaveFile SaveLoad_v6::_saveFiles[] = { { "no_cd.txt", kSaveModeExists, 0, 0}, { "vide.inf", kSaveModeIgnore, 0, 0}, {"fenetre.txt", kSaveModeIgnore, 0, 0}, - { "music.txt", kSaveModeIgnore, 0, 0} + { "music.txt", kSaveModeIgnore, 0, 0}, + { "cata2.inf", kSaveModeSave, 0, "temp save"}, + { "cata3.inf", kSaveModeSave, 0, "temp save"} }; @@ -374,17 +376,83 @@ bool SaveLoad_v6::AutoHandler::save(int16 dataVar, int32 size, int32 offset) { } +SaveLoad_v6::TempHandler::TempHandler(GobEngine *vm) : SaveHandler(vm), + _empty(true), _size(0), _data(0) { +} + +SaveLoad_v6::TempHandler::~TempHandler() { + delete[] _data; +} + +int32 SaveLoad_v6::TempHandler::getSize() { + if (_empty) + return -1; + + return _size + 2900; +} + +bool SaveLoad_v6::TempHandler::load(int16 dataVar, int32 size, int32 offset) { + if (_empty || (_size == 0) || !_data) + return false; + + if ((size != 0) || (offset != 2900)) { + warning("Invalid temp loading procedure (%d, %d, %d)", dataVar, size, offset); + return false; + } + + _vm->_inter->_variables->copyFrom(0, _data, _size); + + return true; +} + +bool SaveLoad_v6::TempHandler::save(int16 dataVar, int32 size, int32 offset) { + if ((size != 0) || (offset != 2900)) { + warning("Invalid temp saving procedure (%d, %d, %d)", dataVar, size, offset); + return false; + } + + delete[] _data; + + _size = SaveHandler::getVarSize(_vm); + _data = new byte[_size]; + + _vm->_inter->_variables->copyTo(0, _data, _size); + + _empty = false; + + return true; +} + +bool SaveLoad_v6::TempHandler::deleteFile() { + delete[] _data; + + _empty = true; + _size = 0; + _data = 0; + + return true; +} + + SaveLoad_v6::SaveLoad_v6(GobEngine *vm, const char *targetName) : SaveLoad(vm) { _gameHandler = new GameHandler(vm, targetName); _autoHandler = new AutoHandler(vm, targetName); + _tmpHandler[0] = new TempHandler(vm); + _tmpHandler[1] = new TempHandler(vm); + _saveFiles[0].handler = _gameHandler; _saveFiles[1].handler = _autoHandler; + + _saveFiles[7].handler = _tmpHandler[0]; + _saveFiles[8].handler = _tmpHandler[1]; } SaveLoad_v6::~SaveLoad_v6() { + delete _tmpHandler[0]; + delete _tmpHandler[1]; delete _autoHandler; delete _gameHandler; } -- cgit v1.2.3