aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/kyra/saveload_v1.cpp4
-rw-r--r--engines/kyra/saveload_v2.cpp245
-rw-r--r--engines/kyra/timer.cpp38
-rw-r--r--engines/kyra/timer.h10
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();