diff options
author | Gregory Montoir | 2007-11-04 03:07:03 +0000 |
---|---|---|
committer | Gregory Montoir | 2007-11-04 03:07:03 +0000 |
commit | 9f84af06d62715d07bffa05967205d01d5a3239e (patch) | |
tree | 9190ede8a01dbe4cfe1a83dcbf612a7da313de68 /engines/igor/saveload.cpp | |
parent | 74bb325a7ea5b19e6048466c9071a44d3a7cbb63 (diff) | |
download | scummvm-rg350-9f84af06d62715d07bffa05967205d01d5a3239e.tar.gz scummvm-rg350-9f84af06d62715d07bffa05967205d01d5a3239e.tar.bz2 scummvm-rg350-9f84af06d62715d07bffa05967205d01d5a3239e.zip |
added saveload code, fixed calls to debugC
svn-id: r29401
Diffstat (limited to 'engines/igor/saveload.cpp')
-rw-r--r-- | engines/igor/saveload.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/engines/igor/saveload.cpp b/engines/igor/saveload.cpp new file mode 100644 index 0000000000..96bacdf1ac --- /dev/null +++ b/engines/igor/saveload.cpp @@ -0,0 +1,197 @@ + +#include "common/savefile.h" +#include "common/system.h" + +#include "igor/igor.h" + +namespace Igor { + +class TypeSerializer { +public: + + TypeSerializer(Common::ReadStream *s) : _readStr(s), _writeStr(0), _saving(false) {} + TypeSerializer(Common::WriteStream *s) : _readStr(0), _writeStr(s), _saving(true) {} + +#define SAVEORLOAD_BASIC_TYPE(T, N, S) \ + void saveOrLoad ## N (T &t) { \ + if (_saving) { \ + _writeStr->write ## S (t); \ + } else { \ + t = _readStr->read ## S (); \ + } \ + } + + SAVEORLOAD_BASIC_TYPE(int8, Byte, Byte) + SAVEORLOAD_BASIC_TYPE(uint8, Byte, Byte) + SAVEORLOAD_BASIC_TYPE(int16, Int16, Uint16LE) + SAVEORLOAD_BASIC_TYPE(uint16, Int16, Uint16LE) + + void saveOrLoadBool(bool &b) { + if (_saving) { + _writeStr->writeByte(b ? 1 : 0); + } else { + b = _readStr->readByte() != 0; + } + } + + void saveOrLoadPad(int sz) { + if (_saving) { + while (sz--) { + _writeStr->writeByte(0); + } + } else { + while (sz--) { + _readStr->readByte(); + } + } + } + + void saveOrLoadPascalString(char *str) { + if (_saving) { + int len = strlen(str); + assert(len < 100); + _writeStr->writeByte(len); + _writeStr->write(str, len); + for (; len < 100; ++len) { + _writeStr->writeByte(' '); + } + } else { + int len = _readStr->readByte(); + assert(len < 100); + _readStr->read(str, len); + str[len] = 0; + for (; len < 100; ++len) { + _readStr->readByte(); + } + } + } + + void saveOrLoadWalkData(WalkData &wd) { + saveOrLoadPad(2); + saveOrLoadInt16(wd.x); + saveOrLoadInt16(wd.y); + saveOrLoadByte(wd.posNum); + saveOrLoadByte(wd.frameNum); + saveOrLoadByte(wd.clipSkipX); + saveOrLoadInt16(wd.clipWidth); + saveOrLoadInt16(wd.scaleWidth); + saveOrLoadByte(wd.xPosChanged); + saveOrLoadInt16(wd.dxPos); + saveOrLoadByte(wd.yPosChanged); + saveOrLoadInt16(wd.dyPos); + saveOrLoadByte(wd.scaleHeight); + } + + void saveOrLoadAction(Action &a) { + saveOrLoadByte(a.verb); + saveOrLoadByte(a.object1Num); + saveOrLoadByte(a.object1Type); + saveOrLoadByte(a.verbType); + saveOrLoadByte(a.object2Num); + saveOrLoadByte(a.object2Type); + } + + void saveOrLoadGameState(GameStateData &gs) { + saveOrLoadByte(gs.enableLight); + saveOrLoadByte(gs.colorLum); + for (int i = 0; i < 5; ++i) { + saveOrLoadInt16(gs.counter[i]); + } + saveOrLoadBool(gs.igorMoving); + saveOrLoadBool(gs.dialogueTextRunning); + saveOrLoadBool(gs.updateLight); + saveOrLoadBool(gs.unkF); + saveOrLoadByte(gs.unk10); + saveOrLoadByte(gs.unk11); + saveOrLoadBool(gs.dialogueStarted); + saveOrLoadPad(1); + for (int i = 0; i < 500; ++i) { + saveOrLoadByte(gs.dialogueData[i]); + } + saveOrLoadByte(gs.dialogueChoiceStart); + saveOrLoadByte(gs.dialogueChoiceCount); + saveOrLoadPad(2); + saveOrLoadByte(gs.nextMusicCounter); + saveOrLoadBool(gs.jumpToNextMusic); + saveOrLoadByte(gs.configSoundEnabled); + saveOrLoadByte(gs.talkSpeed); + saveOrLoadByte(gs.talkMode); + saveOrLoadPad(3); + saveOrLoadByte(gs.musicNum); + saveOrLoadByte(gs.musicSequenceIndex); + } + +private: + + bool _saving; + Common::ReadStream *_readStr; + Common::WriteStream *_writeStr; +}; + +void IgorEngine::saveOrLoadGameState(TypeSerializer &typeSerializer) { + for (int i = 0; i < 100; ++i) { + typeSerializer.saveOrLoadWalkData(_walkData[i]); + } + typeSerializer.saveOrLoadPad(20); + typeSerializer.saveOrLoadByte(_walkDataCurrentIndex); + typeSerializer.saveOrLoadByte(_walkDataLastIndex); + typeSerializer.saveOrLoadByte(_walkCurrentFrame); + typeSerializer.saveOrLoadByte(_walkCurrentPos); + typeSerializer.saveOrLoadPad(23); + typeSerializer.saveOrLoadAction(_currentAction); + typeSerializer.saveOrLoadPad(10); + typeSerializer.saveOrLoadInt16(_currentPart); + typeSerializer.saveOrLoadPad(8); + typeSerializer.saveOrLoadByte(_actionCode); + typeSerializer.saveOrLoadByte(_actionWalkPoint); + typeSerializer.saveOrLoadPad(2); + typeSerializer.saveOrLoadInt16(_inputVars[kInputCursorXPos]); + typeSerializer.saveOrLoadInt16(_inputVars[kInputCursorYPos]); + typeSerializer.saveOrLoadGameState(_gameState); + for (int i = 0; i < 112; ++i) { + typeSerializer.saveOrLoadByte(_objectsState[i]); + } + for (int i = 0; i < 74; ++i) { + typeSerializer.saveOrLoadByte(_inventoryInfo[i]); + } +} + +void IgorEngine::loadGameState(int slot) { + char name[64]; + generateGameStateFileName(slot, name, 63); + Common::InSaveFile *isf = _saveFileMan->openForLoading(name); + if (isf) { + TypeSerializer ts(isf); + ts.saveOrLoadPascalString(_saveStateDescriptions[slot]); + saveOrLoadGameState(ts); + delete isf; + + memcpy(_igorPalette, (_currentPart == 760) ? PAL_IGOR_2 : PAL_IGOR_1, 48); + UPDATE_OBJECT_STATE(255); + playMusic(_gameState.musicNum); + _system->warpMouse(_inputVars[kInputCursorXPos], _inputVars[kInputCursorYPos]); + if (_currentPart < 900) { + showCursor(); + } + debug(0, "Loaded state, current part %d", _currentPart); + } +} + +void IgorEngine::saveGameState(int slot) { + char name[64]; + generateGameStateFileName(slot, name, 63); + Common::OutSaveFile *osf = _saveFileMan->openForSaving(name); + if (osf) { + TypeSerializer ts(osf); + ts.saveOrLoadPascalString(_saveStateDescriptions[slot]); + saveOrLoadGameState(ts); + delete osf; + } +} + +void IgorEngine::generateGameStateFileName(int num, char *dst, int len) const { + snprintf(dst, len, "%s.%d", _targetName.c_str(), num); + dst[len] = 0; +} + +} // namespace Igor |