diff options
author | Benjamin Haisch | 2008-12-15 09:01:43 +0000 |
---|---|---|
committer | Benjamin Haisch | 2008-12-15 09:01:43 +0000 |
commit | 2ce4a32fb61567522e0a7afb76337aca12357dcb (patch) | |
tree | 40ab7795411cd63f20b9ad6ec6a05a9f555f2e89 /engines/made/database.cpp | |
parent | c76f0bdb10344f1a35e43a098a3dcec4f09aa76c (diff) | |
download | scummvm-rg350-2ce4a32fb61567522e0a7afb76337aca12357dcb.tar.gz scummvm-rg350-2ce4a32fb61567522e0a7afb76337aca12357dcb.tar.bz2 scummvm-rg350-2ce4a32fb61567522e0a7afb76337aca12357dcb.zip |
- Implemented cmd_restart (for the restart functionality in Return to Zork)
svn-id: r35378
Diffstat (limited to 'engines/made/database.cpp')
-rw-r--r-- | engines/made/database.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/engines/made/database.cpp b/engines/made/database.cpp index 3497b5b46f..8de30e28e8 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -254,6 +254,9 @@ GameDatabase::~GameDatabase() { void GameDatabase::open(const char *filename) { debug(1, "GameDatabase::open() Loading from %s", filename); + _isRedSource = false; + _filename = filename; + _redFilename = ""; Common::File fd; if (!fd.open(filename)) error("GameDatabase::open() Could not open %s", filename); @@ -263,6 +266,9 @@ void GameDatabase::open(const char *filename) { void GameDatabase::openFromRed(const char *redFilename, const char *filename) { debug(1, "GameDatabase::openFromRed() Loading from %s->%s", redFilename, filename); + _isRedSource = true; + _filename = filename; + _redFilename = redFilename; Common::MemoryReadStream *fileS = RedReader::loadFromRed(redFilename, filename); if (!fileS) error("GameDatabase::openFromRed() Could not load %s from %s", filename, redFilename); @@ -270,6 +276,21 @@ void GameDatabase::openFromRed(const char *redFilename, const char *filename) { delete fileS; } +void GameDatabase::reload() { + if (!_isRedSource) { + Common::File fd; + if (!fd.open(_filename.c_str())) + error("GameDatabase::reload() Could not open %s", _filename.c_str()); + reloadFromStream(fd); + } else { + Common::MemoryReadStream *fileS = RedReader::loadFromRed(_redFilename.c_str(), _filename.c_str()); + if (!fileS) + error("GameDatabase::openFromRed() Could not load %s from %s", _filename.c_str(), _redFilename.c_str()); + reloadFromStream(*fileS); + delete fileS; + } +} + int16 GameDatabase::getVar(int16 index) { return (int16)READ_LE_UINT16(_gameState + index * 2); } @@ -391,6 +412,10 @@ void GameDatabaseV2::load(Common::SeekableReadStream &sourceS) { } +void GameDatabaseV2::reloadFromStream(Common::SeekableReadStream &sourceS) { + // Not used in version 2 games +} + bool GameDatabaseV2::getSavegameDescription(const char *filename, Common::String &description) { // Not used in version 2 games return false; @@ -509,16 +534,16 @@ void GameDatabaseV3::load(Common::SeekableReadStream &sourceS) { uint32 objectIndexOffs = sourceS.readUint32LE(); uint16 objectCount = sourceS.readUint16LE(); - uint32 gameStateOffs = sourceS.readUint32LE(); + _gameStateOffs = sourceS.readUint32LE(); _gameStateSize = sourceS.readUint32LE(); uint32 objectsOffs = sourceS.readUint32LE(); uint32 objectsSize = sourceS.readUint32LE(); _mainCodeObjectIndex = sourceS.readUint16LE(); - debug(2, "objectIndexOffs = %08X; objectCount = %d; gameStateOffs = %08X; gameStateSize = %d; objectsOffs = %08X; objectsSize = %d\n", objectIndexOffs, objectCount, gameStateOffs, _gameStateSize, objectsOffs, objectsSize); + debug(2, "objectIndexOffs = %08X; objectCount = %d; gameStateOffs = %08X; gameStateSize = %d; objectsOffs = %08X; objectsSize = %d\n", objectIndexOffs, objectCount, _gameStateOffs, _gameStateSize, objectsOffs, objectsSize); _gameState = new byte[_gameStateSize]; - sourceS.seek(gameStateOffs); + sourceS.seek(_gameStateOffs); sourceS.read(_gameState, _gameStateSize); Common::Array<uint32> objectOffsets; @@ -544,6 +569,11 @@ void GameDatabaseV3::load(Common::SeekableReadStream &sourceS) { } +void GameDatabaseV3::reloadFromStream(Common::SeekableReadStream &sourceS) { + sourceS.seek(_gameStateOffs); + sourceS.read(_gameState, _gameStateSize); +} + bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description) { Common::InSaveFile *in; char desc[64]; |