From bb5edf5426c3d8717d3a3f843a3dbf6193bbe9e9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 26 Apr 2014 11:01:21 -0400 Subject: MADS: Implemented more save/load logic --- engines/mads/game.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) (limited to 'engines/mads/game.cpp') diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 50c3ccd916..9a5ec1264b 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -51,7 +51,7 @@ Game::Game(MADSEngine *vm): _vm(vm), _surface(nullptr), _objects(vm), _sectionNumber = _priorSectionNumber = 0; _difficulty = DIFFICULTY_HARD; _loadGameSlot = -1; - _serializer = nullptr; + _saveFile = nullptr; _statusFlag = 0; _sectionHandler = nullptr; _sectionNumber = 1; @@ -79,6 +79,7 @@ Game::Game(MADSEngine *vm): _vm(vm), _surface(nullptr), _objects(vm), } Game::~Game() { + delete _saveFile; delete _surface; delete _sectionHandler; } @@ -118,7 +119,7 @@ void Game::run() { // Get the initial starting time for the first scene _scene._frameStartTime = _vm->_events->getFrameCounter(); - if (_serializer == nullptr && protectionResult != -1 && protectionResult != -2) { + if (_saveFile == nullptr && protectionResult != -1 && protectionResult != -2) { initSection(_sectionNumber); _statusFlag = true; @@ -142,8 +143,10 @@ void Game::run() { void Game::gameLoop() { while (!_vm->shouldQuit() && _statusFlag) { - if (_serializer) - synchronize(*_serializer, true); + if (_loadGameSlot != -1) { + loadGame(_loadGameSlot); + _loadGameSlot = -1; + } setSectionHandler(); _sectionHandler->preLoadSection(); @@ -255,6 +258,13 @@ void Game::sectionLoop() { _triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene._sceneLogic->enter(); + // If in the middle of restoring a game, handle the rest of the loading + if (_saveFile != nullptr) { + Common::Serializer s(_saveFile, nullptr); + synchronize(s, false); + delete _saveFile; + } + // Set player data _player._targetPos = _player._playerPos; _player._turnToFacing = _player._facing; @@ -420,6 +430,7 @@ void Game::synchronize(Common::Serializer &s, bool phase1) { if (phase1) { s.syncAsUint16LE(_scene._nextSceneId); s.syncAsUint16LE(_scene._priorSceneId); + _visitedScenes.synchronize(s); if (s.isLoading()) { _sectionNumber = _scene._nextSceneId / 100; @@ -439,11 +450,39 @@ void Game::synchronize(Common::Serializer &s, bool phase1) { } void Game::loadGame(int slotNumber) { + _saveFile = g_system->getSavefileManager()->openForLoading( + _vm->generateSaveName(slotNumber)); + + Common::Serializer s(_saveFile, nullptr); + + // Load the savaegame header + MADSSavegameHeader header; + if (!readSavegameHeader(_saveFile, header)) + error("Invalid savegame"); + + if (header._thumbnail) { + header._thumbnail->free(); + delete header._thumbnail; + } + // Load the initial data such as what scene needs to be loaded up + synchronize(s, true); } void Game::saveGame(int slotNumber, const Common::String &saveName) { + Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving( + _vm->generateSaveName(slotNumber)); + + MADSSavegameHeader header; + header._saveName = saveName; + writeSavegameHeader(out, header); + + Common::Serializer s(nullptr, out); + synchronize(s, true); + synchronize(s, false); + out->finalize(); + delete out; } const char *const SAVEGAME_STR = "MADS"; -- cgit v1.2.3