diff options
author | Ľubomír Remák | 2018-08-30 23:38:41 +0200 |
---|---|---|
committer | Ľubomír Remák | 2018-08-30 23:38:41 +0200 |
commit | 543f7666f3577eb4cdfe7988873fa731b995d45b (patch) | |
tree | 345751f755d60d06a409c01bc2adbb14cb21e4ae /engines/mutationofjb/mutationofjb.cpp | |
parent | 041ab365588a1a612050159f0d42c7aea5426a71 (diff) | |
download | scummvm-rg350-543f7666f3577eb4cdfe7988873fa731b995d45b.tar.gz scummvm-rg350-543f7666f3577eb4cdfe7988873fa731b995d45b.tar.bz2 scummvm-rg350-543f7666f3577eb4cdfe7988873fa731b995d45b.zip |
MUTATIONOFJB: Basic save/load support.
Warning: The save format is subject to change.
Diffstat (limited to 'engines/mutationofjb/mutationofjb.cpp')
-rw-r--r-- | engines/mutationofjb/mutationofjb.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/engines/mutationofjb/mutationofjb.cpp b/engines/mutationofjb/mutationofjb.cpp index 4e004f0868..1537646f9e 100644 --- a/engines/mutationofjb/mutationofjb.cpp +++ b/engines/mutationofjb/mutationofjb.cpp @@ -28,6 +28,7 @@ #include "common/system.h" #include "common/events.h" #include "common/fs.h" +#include "common/savefile.h" #include "graphics/screen.h" #include "graphics/cursorman.h" @@ -125,6 +126,55 @@ void MutationOfJBEngine::updateCursor() { } } +bool MutationOfJBEngine::hasFeature(Engine::EngineFeature f) const { + if (f == kSupportsLoadingDuringRuntime || f == kSupportsSavingDuringRuntime) { + return true; + } + + return false; +} + +bool MutationOfJBEngine::canLoadGameStateCurrently() { + return _game->loadSaveAllowed(); +} + +Common::Error MutationOfJBEngine::loadGameState(int slot) { + const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot); + Common::InSaveFile *const saveFile = g_system->getSavefileManager()->openForLoading(saveName); + + Common::Serializer sz(saveFile, nullptr); + + SaveHeader saveHdr; + saveHdr.sync(sz); + _game->getGameData().saveLoadWithSerializer(sz); + delete saveFile; + + _game->changeScene(_game->getGameData()._currentScene, _game->getGameData()._partB); + _game->getGui().markDirty(); + + return Common::kNoError; +} + +bool MutationOfJBEngine::canSaveGameStateCurrently() { + return _game->loadSaveAllowed(); +} + +Common::Error MutationOfJBEngine::saveGameState(int slot, const Common::String &desc) { + const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot); + Common::OutSaveFile *const saveFile = g_system->getSavefileManager()->openForSaving(saveName); + + Common::Serializer sz(nullptr, saveFile); + + SaveHeader saveHdr; + saveHdr._description = desc; + saveHdr.sync(sz); + _game->getGameData().saveLoadWithSerializer(sz); + saveFile->finalize(); + delete saveFile; + + return Common::kNoError; +} + void MutationOfJBEngine::handleNormalScene(const Common::Event &event) { Scene *const scene = _game->getGameData().getCurrentScene(); @@ -255,6 +305,9 @@ Common::Error MutationOfJBEngine::run() { event.kbd.ascii == '~' || event.kbd.ascii == '#') { _console->attach(); } + if (event.kbd.keycode == Common::KEYCODE_F5 && event.kbd.hasFlags(0)) { + openMainMenuDialog(); + } break; } case Common::EVENT_KEYUP: { @@ -297,4 +350,26 @@ Common::Error MutationOfJBEngine::run() { return Common::kNoError; } +bool SaveHeader::sync(Common::Serializer &sz) { + const uint32 SAVE_MAGIC_NUMBER = MKTAG('M', 'O', 'J', 'B'); + const uint32 SAVE_FILE_VERSION = 1; + + if (sz.isLoading()) { + uint32 magic = 0; + sz.syncAsUint32BE(magic); + if (magic != SAVE_MAGIC_NUMBER) { + warning("Invalid save"); + return false; + } + } else { + uint32 magic = SAVE_MAGIC_NUMBER; + sz.syncAsUint32BE(magic); + } + + sz.syncVersion(SAVE_FILE_VERSION); + sz.syncString(_description); + + return true; +} + } |