From 579c343d1361801c936eedae50d956018a7d83f4 Mon Sep 17 00:00:00 2001 From: lukaslw Date: Sat, 8 Mar 2014 00:31:27 +0100 Subject: DRACI: Saving improvements (item in hand and hero position). --- engines/draci/game.cpp | 23 ++++++++++++++++++++++- engines/draci/game.h | 7 ++++++- engines/draci/saveload.cpp | 7 ++++--- engines/draci/saveload.h | 2 +- engines/draci/script.cpp | 17 +++++++++++++++-- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index e5ff1f079a..98777a7eca 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -926,10 +926,12 @@ void Game::inventoryDraw() { void Game::inventoryReload() { // Make sure all items are loaded into memory (e.g., after loading a // savegame) by re-putting them on the same spot in the inventory. + GameItem *tempItem = _currentItem; for (uint i = 0; i < kInventorySlots; ++i) { putItem(_inventory[i], i); } setPreviousItemPosition(0); + _currentItem = tempItem; } void Game::inventorySwitch(int keycode) { @@ -1572,7 +1574,7 @@ Game::~Game() { delete[] _items; } -void Game::DoSync(Common::Serializer &s) { +void Game::DoSync(Common::Serializer &s, uint8 saveVersion) { s.syncAsUint16LE(_currentRoom._roomNum); for (uint i = 0; i < _info._numObjects; ++i) { @@ -1603,6 +1605,25 @@ void Game::DoSync(Common::Serializer &s) { s.syncAsSint16LE(_dialogueVars[i]); } + if(saveVersion >= 2) { + setPositionLoaded(true); + if (s.isSaving()) { + s.syncAsSint16LE(_hero.x); + s.syncAsSint16LE(_hero.y); + + int handItemID = _currentItem ? _currentItem->_absNum : -1; + s.syncAsSint16LE(handItemID); + } else { + s.syncAsSint16LE(_heroLoading.x); + s.syncAsSint16LE(_heroLoading.y); + + int handItemID = -1; + s.syncAsSint16LE(handItemID); + _currentItem = getItem(handItemID); + } + } else { + _currentItem = 0; + } } static double real_to_double(byte real[6]) { diff --git a/engines/draci/game.h b/engines/draci/game.h index 4a8f3de269..d3ae36e816 100644 --- a/engines/draci/game.h +++ b/engines/draci/game.h @@ -215,6 +215,7 @@ public: void walkHero(int x, int y, SightDirection dir); // start walking and leave callback as is void setHeroPosition(const Common::Point &p); const Common::Point &getHeroPosition() const { return _hero; } + const Common::Point &getHeroLoadingPosition() const { return _heroLoading; } void positionAnimAsHero(Animation *anim); void positionHeroAsAnim(Animation *anim); @@ -290,6 +291,8 @@ public: void setExitLoop(bool exit) { _shouldExitLoop = exit; } bool isReloaded() const { return _isReloaded; } void setIsReloaded(bool value) { _isReloaded = value; } + bool isPositionLoaded() { return _isPositionLoaded; } + void setPositionLoaded(bool value) { _isPositionLoaded = value; } void setSpeechTiming(uint tick, uint duration); void shiftSpeechAndFadeTick(int delta); @@ -327,7 +330,7 @@ public: void setEnableSpeedText(bool value) { _enableSpeedText = value; } bool getEnableSpeedText() const { return _enableSpeedText; } - void DoSync(Common::Serializer &s); + void DoSync(Common::Serializer &s, uint8 saveVersion); private: void updateOrdinaryCursor(); @@ -352,6 +355,7 @@ private: GameInfo _info; Common::Point _hero; + Common::Point _heroLoading; int *_variables; Person *_persons; @@ -395,6 +399,7 @@ private: bool _shouldQuit; bool _shouldExitLoop; bool _isReloaded; + bool _isPositionLoaded; uint _speechTick; uint _speechDuration; diff --git a/engines/draci/saveload.cpp b/engines/draci/saveload.cpp index 31ac63b791..3e7f8651c1 100644 --- a/engines/draci/saveload.cpp +++ b/engines/draci/saveload.cpp @@ -45,7 +45,8 @@ bool readSavegameHeader(Common::InSaveFile *in, DraciSavegameHeader &header) { return false; header.version = in->readByte(); - if (header.version != DRACI_SAVEGAME_VERSION) + // Version 1 is compatible with Version 2 + if (header.version > DRACI_SAVEGAME_VERSION) return false; // Read in the string @@ -106,7 +107,7 @@ Common::Error saveSavegameData(int saveGameIdx, const Common::String &saveName, } else { // Create the remainder of the savegame Common::Serializer s(NULL, f); - vm._game->DoSync(s); + vm._game->DoSync(s, header.version); f->finalize(); delete f; @@ -140,7 +141,7 @@ Common::Error loadSavegameData(int saveGameIdx, DraciEngine *vm) { // Synchronise the remaining data of the savegame Common::Serializer s(f, NULL); - vm->_game->DoSync(s); + vm->_game->DoSync(s, header.version); delete f; // Post-processing diff --git a/engines/draci/saveload.h b/engines/draci/saveload.h index 8b38ccb94f..6f951a3409 100644 --- a/engines/draci/saveload.h +++ b/engines/draci/saveload.h @@ -29,7 +29,7 @@ namespace Draci { -#define DRACI_SAVEGAME_VERSION 1 +#define DRACI_SAVEGAME_VERSION 2 struct DraciSavegameHeader { uint8 version; diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index 97dde39809..1149cdf717 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -634,8 +634,16 @@ void Script::stayOn(const Common::Array ¶ms) { return; } - int x = params[0]; - int y = params[1]; + int x, y; + Common::Point afterLoadingPos = _vm->_game->getHeroLoadingPosition(); + if(_vm->_game->isPositionLoaded() == true) { + x = afterLoadingPos.x; + y = afterLoadingPos.y; + } + else { + x = params[0]; + y = params[1]; + } SightDirection dir = static_cast (params[2]); // Jumps into the given position regardless of the walking map. @@ -670,6 +678,11 @@ void Script::walkOnPlay(const Common::Array ¶ms) { return; } + if(_vm->_game->isPositionLoaded() == true) { + _vm->_game->setPositionLoaded(false); + return; + } + int x = params[0]; int y = params[1]; SightDirection dir = static_cast (params[2]); -- cgit v1.2.3