diff options
author | Jaromir Wysoglad | 2019-05-31 12:13:47 +0200 |
---|---|---|
committer | Thierry Crozat | 2019-07-28 15:09:14 +0100 |
commit | c331b69bbd8b8ec8c99b04f9ed04ab11b1829a53 (patch) | |
tree | 8e20831a827fdfee491f89b74d78317adfb3e498 /engines/supernova2/state.cpp | |
parent | 83b0da1ebd24c1ad0aa5f01c290f5ae2348380c4 (diff) | |
download | scummvm-rg350-c331b69bbd8b8ec8c99b04f9ed04ab11b1829a53.tar.gz scummvm-rg350-c331b69bbd8b8ec8c99b04f9ed04ab11b1829a53.tar.bz2 scummvm-rg350-c331b69bbd8b8ec8c99b04f9ed04ab11b1829a53.zip |
SUPERNOVA2: Add load and save mechanism
Diffstat (limited to 'engines/supernova2/state.cpp')
-rw-r--r-- | engines/supernova2/state.cpp | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index 97c5f2a6dd..a0c1ef78b1 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -31,6 +31,69 @@ namespace Supernova2 { +bool GameManager::serialize(Common::WriteStream *out) { + if (out->err()) + return false; + + // GameState + out->writeSint16LE(_state._money); + out->writeByte(_state._addressKnown); + + // Inventory + out->writeSint32LE(_inventory.getSize()); + out->writeSint32LE(_inventoryScroll); + for (int i = 0; i < _inventory.getSize(); ++i) { + Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0); + byte objectIndex = _inventory.get(i) - objectStateBegin; + out->writeSint32LE(_inventory.get(i)->_roomId); + out->writeSint32LE(objectIndex); + } + + // Rooms + out->writeByte(_currentRoom->getId()); + for (int i = 0; i < 3; ++i) { + _rooms[i]->serialize(out); + } + + return !out->err(); +} + + +bool GameManager::deserialize(Common::ReadStream *in, int version) { + if (in->err()) + return false; + + // GameState + _state._money = in->readSint16LE(); + _state._addressKnown = in->readByte(); + _vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money)); + + _oldTime = g_system->getMillis(); + + // Inventory + int inventorySize = in->readSint32LE(); + _inventoryScroll = in->readSint32LE(); + _inventory.clear(); + for (int i = 0; i < inventorySize; ++i) { + RoomId objectRoom = static_cast<RoomId>(in->readSint32LE()); + int objectIndex = in->readSint32LE(); + _inventory.add(*_rooms[objectRoom]->getObject(objectIndex)); + } + + // Rooms + RoomId curRoomId = static_cast<RoomId>(in->readByte()); + for (int i = 0; i < 3; ++i) { + _rooms[i]->deserialize(in, version); + } + changeRoom(curRoomId); + + // Some additional variables + _state._previousRoom = _rooms[INTRO]; + _guiEnabled = true; + _animationEnabled = true; + + return !in->err(); +} StringId GameManager::guiCommands[] = { kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose, @@ -1138,6 +1201,7 @@ void GameManager::taxiPayment(int price, int destination) { } void GameManager::taxi() { + _vm->_allowSaveGame = false; static StringId dest[] = { kStringAirport, kStringDowntown, @@ -1148,7 +1212,6 @@ void GameManager::taxi() { }; Common::String input; int possibility = _taxi_possibility; - bool paid = false; _state._previousRoom = _currentRoom; _currentRoom = _rooms[INTRO]; @@ -1220,6 +1283,7 @@ void GameManager::taxi() { } _rooms[INTRO]->addAllSentences(1); } while(answer == 3 && !_vm->shouldQuit()); + _vm->_allowSaveGame = true; } } |