diff options
author | Johannes Schickel | 2008-03-27 20:54:59 +0000 |
---|---|---|
committer | Johannes Schickel | 2008-03-27 20:54:59 +0000 |
commit | c5526604c07aae0adb3a9a02339ddbf13705879a (patch) | |
tree | 01586b3da9ba3de195b0f826661b39d5b0a612b0 | |
parent | ff2ba585b3efb3b4f37b287fcfbb66db9ac9c8e7 (diff) | |
download | scummvm-rg350-c5526604c07aae0adb3a9a02339ddbf13705879a.tar.gz scummvm-rg350-c5526604c07aae0adb3a9a02339ddbf13705879a.tar.bz2 scummvm-rg350-c5526604c07aae0adb3a9a02339ddbf13705879a.zip |
Removed much code duplication in Hand of Fate savefile loading with SeekableSubReadStreamEndian.
svn-id: r31271
-rw-r--r-- | engines/kyra/saveload_v1.cpp | 4 | ||||
-rw-r--r-- | engines/kyra/saveload_v2.cpp | 245 | ||||
-rw-r--r-- | engines/kyra/timer.cpp | 38 | ||||
-rw-r--r-- | engines/kyra/timer.h | 10 |
4 files changed, 121 insertions, 176 deletions
diff --git a/engines/kyra/saveload_v1.cpp b/engines/kyra/saveload_v1.cpp index 3168d150fb..d5e7e2d3d8 100644 --- a/engines/kyra/saveload_v1.cpp +++ b/engines/kyra/saveload_v1.cpp @@ -104,7 +104,7 @@ void KyraEngine_v1::loadGame(const char *fileName) { _poisonDeathCounter = in->readByte(); _animator->_brandonDrawFrame = in->readUint16BE(); - _timer->loadDataFromFile(in, header.version); + _timer->loadDataFromFile(*in, header.version); memset(_flagsTable, 0, sizeof(_flagsTable)); uint32 flagsSize = in->readUint32BE(); @@ -262,7 +262,7 @@ void KyraEngine_v1::saveGame(const char *fileName, const char *saveName) { out->writeByte(_poisonDeathCounter); out->writeUint16BE(_animator->_brandonDrawFrame); - _timer->saveDataToFile(out); + _timer->saveDataToFile(*out); out->writeUint32BE(sizeof(_flagsTable)); out->write(_flagsTable, sizeof(_flagsTable)); diff --git a/engines/kyra/saveload_v2.cpp b/engines/kyra/saveload_v2.cpp index 40468a6dad..c4adba60b0 100644 --- a/engines/kyra/saveload_v2.cpp +++ b/engines/kyra/saveload_v2.cpp @@ -42,7 +42,7 @@ void KyraEngine_v2::saveGame(const char *fileName, const char *saveName) { if (!out) return; - _timer->saveDataToFile(out); + _timer->saveDataToFile(*out); out->writeUint32BE(sizeof(_flagsTable)); out->write(_flagsTable, sizeof(_flagsTable)); @@ -132,8 +132,8 @@ void KyraEngine_v2::loadGame(const char *fileName) { debugC(9, kDebugLevelMain, "KyraEngine_v2::loadGame('%s')", fileName); SaveHeader header; - Common::InSaveFile *in = openSaveForReading(fileName, header); - if (!in) { + Common::InSaveFile *saveFile = openSaveForReading(fileName, header); + if (!saveFile) { showMessageFromCCode(0x35, 0x84, 0); snd_playSoundEffect(0x0D); } @@ -152,188 +152,137 @@ void KyraEngine_v2::loadGame(const char *fileName) { int loadedZTable = _loadedZTable; + Common::SeekableSubReadStreamEndian in(saveFile, saveFile->pos(), saveFile->size(), !header.originalSave, true); + _screen->hideMouse(); if (!header.originalSave) { _timer->loadDataFromFile(in, header.version); - uint32 flagsSize = in->readUint32BE(); + uint32 flagsSize = in.readUint32BE(); assert(flagsSize <= sizeof(_flagsTable)); - in->read(_flagsTable, flagsSize); - - // usually we have to save the flag set by opcode 10 here - //word_2AB05 = in->readUint16BE(); - _lastMusicCommand = in->readSint16BE(); - _newChapterFile = in->readByte(); - _loadedZTable = in->readByte(); - _cauldronState = in->readByte(); - _colorCodeFlag1 = in->readByte(); - _colorCodeFlag2 = in->readByte(); - _bookCurPage = in->readByte(); - _bookMaxPage = in->readByte(); - for (int i = 0; i < 7; ++i) - _presetColorCode[i] = in->readByte(); - for (int i = 0; i < 7; ++i) - _inputColorCode[i] = in->readByte(); - for (int i = 0; i < 25; ++i) - _cauldronTable[i] = in->readSint16BE(); - for (int i = 0; i < 20; ++i) - _hiddenItems[i] = in->readUint16BE(); - for (int i = 0; i < 19; ++i) - in->read(_conversationState[i], 14); - in->read(_newSceneDlgState, 32); - _cauldronUseCount = in->readSint16BE(); - - _mainCharacter.sceneId = in->readUint16BE(); - _mainCharacter.dlgIndex = in->readUint16BE(); - _mainCharacter.height = in->readByte(); - _mainCharacter.facing = in->readByte(); - _mainCharacter.animFrame = in->readUint16BE(); - _mainCharacter.unk8 = in->readByte(); - _mainCharacter.unk9 = in->readByte(); - _mainCharacter.unkA = in->readByte(); - for (int i = 0; i < 20; ++i) - _mainCharacter.inventory[i] = in->readUint16BE(); - _mainCharacter.x1 = in->readSint16BE(); - _mainCharacter.y1 = in->readSint16BE(); - _mainCharacter.x2 = in->readSint16BE(); - _mainCharacter.y2 = in->readSint16BE(); - - for (int i = 0; i < 30; ++i) { - _itemList[i].id = in->readUint16BE(); - _itemList[i].sceneId = in->readUint16BE(); - _itemList[i].x = in->readSint16BE(); - _itemList[i].y = in->readByte(); - _itemList[i].unk7 = in->readUint16BE(); - } + in.read(_flagsTable, flagsSize); + } - for (int i = 0; i < 72; ++i) { - in->read(_talkObjectList[i].filename, 13); - _talkObjectList[i].scriptId = in->readByte(); - _talkObjectList[i].x = in->readSint16BE(); - _talkObjectList[i].y = in->readSint16BE(); - _talkObjectList[i].color = in->readByte(); - } + // usually we have to save the flag set by opcode 10 here + //word_2AB05 = in.readUint16(); + if (header.originalSave) + in.readUint16(); + _lastMusicCommand = in.readSint16(); + _newChapterFile = in.readByte(); + _loadedZTable = in.readByte(); + _cauldronState = in.readByte(); + _colorCodeFlag1 = in.readByte(); + _colorCodeFlag2 = in.readByte(); + _bookCurPage = in.readByte(); + _bookMaxPage = in.readByte(); + for (int i = 0; i < 7; ++i) + _presetColorCode[i] = in.readByte(); + for (int i = 0; i < 7; ++i) + _inputColorCode[i] = in.readByte(); + for (int i = 0; i < 25; ++i) + _cauldronTable[i] = in.readSint16(); + for (int i = 0; i < 20; ++i) + _hiddenItems[i] = in.readUint16(); - for (int i = 0; i < 86; ++i) { - in->read(_sceneList[i].filename, 10); - _sceneList[i].exit1 = in->readUint16BE(); - _sceneList[i].exit2 = in->readUint16BE(); - _sceneList[i].exit3 = in->readUint16BE(); - _sceneList[i].exit4 = in->readUint16BE(); - _sceneList[i].flags = in->readByte(); - _sceneList[i].sound = in->readByte(); - } + if (header.originalSave) { + assert(sizeof(_flagsTable) >= 0x41); + in.read(_flagsTable, 0x41); + } - _itemInHand = in->readSint16BE(); - _sceneExit1 = in->readUint16BE(); - _sceneExit2 = in->readUint16BE(); - _sceneExit3 = in->readUint16BE(); - _sceneExit4 = in->readUint16BE(); + for (int i = 0; i < 19; ++i) + in.read(_conversationState[i], 14); + + if (!header.originalSave) { + in.read(_newSceneDlgState, 32); } else { - /*word_2AB05 = */in->readUint16LE(); - _lastMusicCommand = in->readSint16LE(); - _newChapterFile = in->readByte(); - _loadedZTable = in->readByte(); - _cauldronState = in->readByte(); - _colorCodeFlag1 = in->readByte(); - _colorCodeFlag2 = in->readByte(); - _bookCurPage = in->readByte(); - _bookMaxPage = in->readByte(); - - for (int i = 0; i < 7; ++i) - _presetColorCode[i] = in->readByte(); - for (int i = 0; i < 7; ++i) - _inputColorCode[i] = in->readByte(); - for (int i = 0; i < 25; ++i) - _cauldronTable[i] = in->readSint16LE(); - for (int i = 0; i < 20; ++i) - _hiddenItems[i] = in->readUint16LE(); + for (int i = 0; i < 31; ++i) + _newSceneDlgState[i] = in.readUint16(); + } + + _cauldronUseCount = in.readSint16(); - assert(sizeof(_flagsTable) >= 0x41); - in->read(_flagsTable, 0x41); + if (header.originalSave) + in.seek(6, SEEK_CUR); + + _mainCharacter.sceneId = in.readUint16(); + _mainCharacter.dlgIndex = in.readUint16(); + _mainCharacter.height = in.readByte(); + _mainCharacter.facing = in.readByte(); + _mainCharacter.animFrame = in.readUint16(); + _mainCharacter.unk8 = in.readByte(); + _mainCharacter.unk9 = in.readByte(); + _mainCharacter.unkA = in.readByte(); + for (int i = 0; i < 20; ++i) + _mainCharacter.inventory[i] = in.readUint16(); + _mainCharacter.x1 = in.readSint16(); + _mainCharacter.y1 = in.readSint16(); + _mainCharacter.x2 = in.readSint16(); + _mainCharacter.y2 = in.readSint16(); - for (int i = 0; i < 19; ++i) - in->read(_conversationState[i], 14); - for (int i = 0; i < 31; ++i) - _newSceneDlgState[i] = in->readUint16LE(); - _cauldronUseCount = in->readSint16LE(); - in->seek(6, SEEK_CUR); - - _mainCharacter.sceneId = in->readUint16LE(); - _mainCharacter.dlgIndex = in->readUint16LE(); - _mainCharacter.height = in->readByte(); - _mainCharacter.facing = in->readByte(); - _mainCharacter.animFrame = in->readUint16LE(); - _mainCharacter.unk8 = in->readByte(); - _mainCharacter.unk9 = in->readByte(); - _mainCharacter.unkA = in->readByte(); - for (int i = 0; i < 20; ++i) - _mainCharacter.inventory[i] = in->readUint16LE(); - _mainCharacter.x1 = in->readSint16LE(); - _mainCharacter.y1 = in->readSint16LE(); - _mainCharacter.x2 = in->readSint16LE(); - _mainCharacter.y2 = in->readSint16LE(); - - for (int i = 0; i < 30; ++i) { - _itemList[i].id = in->readUint16LE(); - _itemList[i].sceneId = in->readUint16LE(); - _itemList[i].x = in->readSint16LE(); - _itemList[i].y = in->readByte(); - _itemList[i].unk7 = in->readUint16LE(); - } + for (int i = 0; i < 30; ++i) { + _itemList[i].id = in.readUint16(); + _itemList[i].sceneId = in.readUint16(); + _itemList[i].x = in.readSint16(); + _itemList[i].y = in.readByte(); + _itemList[i].unk7 = in.readUint16(); + } - for (int i = 0; i < 72; ++i) { - in->read(_talkObjectList[i].filename, 13); - _talkObjectList[i].scriptId = in->readByte(); - _talkObjectList[i].x = in->readSint16LE(); - _talkObjectList[i].y = in->readSint16LE(); - _talkObjectList[i].color = in->readByte(); - } + for (int i = 0; i < 72; ++i) { + in.read(_talkObjectList[i].filename, 13); + _talkObjectList[i].scriptId = in.readByte(); + _talkObjectList[i].x = in.readSint16(); + _talkObjectList[i].y = in.readSint16(); + _talkObjectList[i].color = in.readByte(); + } - for (int i = 0; i < 86; ++i) { - in->read(_sceneList[i].filename, 9); + for (int i = 0; i < 86; ++i) { + if (!header.originalSave) { + in.read(_sceneList[i].filename, 10); + } else { + in.read(_sceneList[i].filename, 9); _sceneList[i].filename[9] = 0; - _sceneList[i].exit1 = in->readUint16LE(); - _sceneList[i].exit2 = in->readUint16LE(); - _sceneList[i].exit3 = in->readUint16LE(); - _sceneList[i].exit4 = in->readUint16LE(); - _sceneList[i].flags = in->readByte(); - _sceneList[i].sound = in->readByte(); } - _itemInHand = in->readSint16LE(); + _sceneList[i].exit1 = in.readUint16(); + _sceneList[i].exit2 = in.readUint16(); + _sceneList[i].exit3 = in.readUint16(); + _sceneList[i].exit4 = in.readUint16(); + _sceneList[i].flags = in.readByte(); + _sceneList[i].sound = in.readByte(); + } + + _itemInHand = in.readSint16(); + if (header.originalSave) { uint32 currentTime = _system->getMillis(); for (int i = 0; i < 6; ++i) - _timer->setDelay(i, in->readSint32LE()); + _timer->setDelay(i, in.readSint32LE()); for (int i = 0; i < 6; ++i) { - if (in->readUint16LE()) + if (in.readUint16LE()) _timer->enable(i); else _timer->disable(i); } for (int i = 0; i < 6; ++i) - _timer->setNextRun(i, currentTime + (in->readUint32LE() * _tickLength)); + _timer->setNextRun(i, currentTime + (in.readUint32LE() * _tickLength)); _timer->resetNextRun(); - - _sceneExit1 = in->readUint16LE(); - _sceneExit2 = in->readUint16LE(); - _sceneExit3 = in->readUint16LE(); - _sceneExit4 = in->readUint16LE(); } - if (in->ioFailed()) + _sceneExit1 = in.readUint16(); + _sceneExit2 = in.readUint16(); + _sceneExit3 = in.readUint16(); + _sceneExit4 = in.readUint16(); + + if (saveFile->ioFailed()) error("Load failed ('%s', '%s').", fileName, header.description.c_str()); else debugC(1, kDebugLevelMain, "Loaded savegame '%s.'", header.description.c_str()); - delete in; - if (loadedZTable != _loadedZTable) loadZShapes(_loadedZTable); diff --git a/engines/kyra/timer.cpp b/engines/kyra/timer.cpp index 6a6b9ff654..f275867516 100644 --- a/engines/kyra/timer.cpp +++ b/engines/kyra/timer.cpp @@ -27,7 +27,7 @@ #include "kyra/timer.h" #include "common/func.h" -#include "common/savefile.h" +#include "common/stream.h" namespace Kyra { @@ -218,15 +218,15 @@ void TimerManager::disable(uint8 id) { warning("TimerManager::disable: No timer %d", id); } -void TimerManager::loadDataFromFile(Common::InSaveFile *file, int version) { - debugC(9, kDebugLevelTimer, "TimerManager::loadDataFromFile(%p, %d)", (const void*)file, version); +void TimerManager::loadDataFromFile(Common::SeekableReadStream &file, int version) { + debugC(9, kDebugLevelTimer, "TimerManager::loadDataFromFile(%p, %d)", (const void*)&file, version); if (version <= 7) { _nextRun = 0; for (int i = 0; i < 32; ++i) { - uint8 enabled = file->readByte(); - int32 countdown = file->readSint32BE(); - uint32 nextRun = file->readUint32BE(); + uint8 enabled = file.readByte(); + int32 countdown = file.readSint32BE(); + uint32 nextRun = file.readUint32BE(); Iterator timer = Common::find_if(_timers.begin(), _timers.end(), TimerEqual(i)); if (timer != _timers.end()) { @@ -246,18 +246,18 @@ void TimerManager::loadDataFromFile(Common::InSaveFile *file, int version) { } } } else { - int entries = file->readByte(); + int entries = file.readByte(); for (int i = 0; i < entries; ++i) { - uint8 id = file->readByte(); + uint8 id = file.readByte(); Iterator timer = Common::find_if(_timers.begin(), _timers.end(), TimerEqual(id)); if (timer != _timers.end()) { - timer->enabled = file->readByte(); - timer->countdown = file->readSint32BE(); - timer->lastUpdate = file->readSint32BE(); + timer->enabled = file.readByte(); + timer->countdown = file.readSint32BE(); + timer->lastUpdate = file.readSint32BE(); } else { warning("Loading timer data for non existing timer %d", id); - file->seek(7, SEEK_CUR); + file.seek(7, SEEK_CUR); } } @@ -265,15 +265,15 @@ void TimerManager::loadDataFromFile(Common::InSaveFile *file, int version) { } } -void TimerManager::saveDataToFile(Common::OutSaveFile *file) const { - debugC(9, kDebugLevelTimer, "TimerManager::saveDataToFile(%p)", (const void*)file); +void TimerManager::saveDataToFile(Common::WriteStream &file) const { + debugC(9, kDebugLevelTimer, "TimerManager::saveDataToFile(%p)", (const void*)&file); - file->writeByte(count()); + file.writeByte(count()); for (CIterator pos = _timers.begin(); pos != _timers.end(); ++pos) { - file->writeByte(pos->id); - file->writeByte(pos->enabled); - file->writeSint32BE(pos->countdown); - file->writeSint32BE(pos->lastUpdate - _system->getMillis()); + file.writeByte(pos->id); + file.writeByte(pos->enabled); + file.writeSint32BE(pos->countdown); + file.writeSint32BE(pos->lastUpdate - _system->getMillis()); } } diff --git a/engines/kyra/timer.h b/engines/kyra/timer.h index d943ec5cb0..44f2e744c6 100644 --- a/engines/kyra/timer.h +++ b/engines/kyra/timer.h @@ -30,11 +30,7 @@ #include "kyra/util.h" #include "common/list.h" - -namespace Common { -class InSaveFile; -class OutSaveFile; -} // end of namespace Common +#include "common/stream.h" namespace Kyra { @@ -76,8 +72,8 @@ public: void enable(uint8 id); void disable(uint8 id); - void loadDataFromFile(Common::InSaveFile *file, int version); - void saveDataToFile(Common::OutSaveFile *file) const; + void loadDataFromFile(Common::SeekableReadStream &file, int version); + void saveDataToFile(Common::WriteStream &file) const; private: void resync(); |