diff options
Diffstat (limited to 'engines/agi/saveload.cpp')
-rw-r--r-- | engines/agi/saveload.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp index 5f1c5112cd..0658609cd0 100644 --- a/engines/agi/saveload.cpp +++ b/engines/agi/saveload.cpp @@ -45,7 +45,7 @@ #include "agi/systemui.h" #include "agi/words.h" -#define SAVEGAME_CURRENT_VERSION 10 +#define SAVEGAME_CURRENT_VERSION 11 // // Version 0 (Sarien): view table has 64 entries @@ -266,6 +266,8 @@ int AgiEngine::saveGame(const Common::String &fileName, const Common::String &de out->writeByte(screenObj->motionType); out->writeByte(screenObj->cycle); + // Version 11+: loop_flag, was saved previously under vt.parm1 + out->writeByte(screenObj->loop_flag); out->writeByte(screenObj->priority); out->writeUint16BE(screenObj->flags); @@ -344,6 +346,7 @@ int AgiEngine::loadGame(const Common::String &fileName, bool checkId) { int16 parm[7]; Common::InSaveFile *in; bool totalPlayTimeWasSet = false; + byte oldLoopFlag = 0; debugC(3, kDebugLevelMain | kDebugLevelSavegame, "AgiEngine::loadGame(%s)", fileName.c_str()); @@ -634,6 +637,10 @@ int AgiEngine::loadGame(const Common::String &fileName, bool checkId) { screenObj->motionType = (MotionType)in->readByte(); screenObj->cycle = (CycleType)in->readByte(); + if (saveVersion >= 11) { + // Version 11+: loop_flag, was previously vt.parm1 + screenObj->loop_flag = in->readByte(); + } screenObj->priority = in->readByte(); screenObj->flags = in->readUint16BE(); @@ -641,7 +648,7 @@ int AgiEngine::loadGame(const Common::String &fileName, bool checkId) { // this was done so that saved games compatibility isn't broken switch (screenObj->motionType) { case kMotionNormal: - in->readByte(); + oldLoopFlag = in->readByte(); in->readByte(); in->readByte(); in->readByte(); @@ -651,12 +658,14 @@ int AgiEngine::loadGame(const Common::String &fileName, bool checkId) { in->readByte(); in->readByte(); in->readByte(); + oldLoopFlag = screenObj->wander_count; break; case kMotionFollowEgo: screenObj->follow_stepSize = in->readByte(); screenObj->follow_flag = in->readByte(); screenObj->follow_count = in->readByte(); in->readByte(); + oldLoopFlag = screenObj->follow_stepSize; break; case kMotionEgo: case kMotionMoveObj: @@ -664,10 +673,21 @@ int AgiEngine::loadGame(const Common::String &fileName, bool checkId) { screenObj->move_y = in->readByte(); screenObj->move_stepSize = in->readByte(); screenObj->move_flag = in->readByte(); + oldLoopFlag = screenObj->move_x; break; default: error("unknown motion-type"); } + if (saveVersion < 11) { + if (saveVersion < 7) { + // Recreate loop_flag from motion-type (was previously vt.parm1) + // vt.parm1 was shared for multiple uses + screenObj->loop_flag = oldLoopFlag; + } else { + // for Version 7-10 we can't really do anything, it was not saved + screenObj->loop_flag = 0; // set it to 0 + } + } } for (i = vtEntries; i < SCREENOBJECTS_MAX; i++) { memset(&_game.screenObjTable[i], 0, sizeof(ScreenObjEntry)); |