aboutsummaryrefslogtreecommitdiff
path: root/engines/made/database.cpp
diff options
context:
space:
mode:
authorBenjamin Haisch2008-12-15 09:01:43 +0000
committerBenjamin Haisch2008-12-15 09:01:43 +0000
commit2ce4a32fb61567522e0a7afb76337aca12357dcb (patch)
tree40ab7795411cd63f20b9ad6ec6a05a9f555f2e89 /engines/made/database.cpp
parentc76f0bdb10344f1a35e43a098a3dcec4f09aa76c (diff)
downloadscummvm-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.cpp36
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];