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(-) (limited to 'engines') 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 From 41285953605c0bc7a42988eff3b6f6de1038cda2 Mon Sep 17 00:00:00 2001 From: lukaslw Date: Sat, 8 Mar 2014 16:24:17 +0100 Subject: DRACI: Fading out improvements. --- engines/draci/game.cpp | 32 ++++++++++++++++++-------------- engines/draci/game.h | 1 + 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'engines') diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 98777a7eca..3a335f249a 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -72,6 +72,7 @@ Game::Game(DraciEngine *vm) : _vm(vm), _walkingState(vm) { _fadePhases = 0; _fadePhase = 0; _fadeTick = 0; + _isFadeOut = 1; _mouseChangeTick = 0; _enableQuickHero = 0; _wantQuickHero = 0; @@ -216,6 +217,7 @@ void Game::start() { // init scripts. This flag was turned on to skip the rest of // those programs. Don't call loop(), because the // location may have changed. + fadePalette(true); continue; } @@ -478,6 +480,7 @@ void Game::handleDialogueLoop() { } void Game::fadePalette(bool fading_out) { + _isFadeOut = fading_out; const byte *startPal = NULL; const byte *endPal = _currentRoom._palette >= 0 ? _vm->_paletteArchive->getFile(_currentRoom._palette)->_data @@ -551,6 +554,19 @@ void Game::advanceAnimationsAndTestLoopExit() { _vm->_anims->drawScene(_vm->_screen->getSurface()); _vm->_screen->copyToScreen(); _vm->_system->delayMillis(kTimeUnit); + if(_isFadeOut) { + fadePalette(false); + // Set cursor state + // Need to do this after we set the palette since the cursors use it + if (_currentRoom._mouseOn) { + debugC(6, kDraciLogicDebugLevel, "Mouse: ON"); + _vm->_mouse->cursorOn(); + _vm->_mouse->setCursorType(kNormalCursor); + } else { + debugC(6, kDraciLogicDebugLevel, "Mouse: OFF"); + _vm->_mouse->cursorOff(); + } + } // If the hero has arrived at his destination, after even the last // phase was correctly animated, run the callback. @@ -598,6 +614,8 @@ void Game::loop(LoopSubstatus substatus, bool shouldExit) { break; } + advanceAnimationsAndTestLoopExit(); + if (_vm->_mouse->isCursorOn()) { // Find animation under cursor and the game object // corresponding to it @@ -629,8 +647,6 @@ void Game::loop(LoopSubstatus substatus, bool shouldExit) { } } - advanceAnimationsAndTestLoopExit(); - } while (!shouldExitLoop()); setLoopSubstatus(kOuterLoop); @@ -1435,7 +1451,6 @@ void Game::enterNewRoom() { _vm->_screen->setPalette(NULL, 0, kNumColors); _vm->_anims->drawScene(_vm->_screen->getSurface()); _vm->_screen->copyToScreen(); - fadePalette(false); // Run the program for the gate the dragon came through debugC(6, kDraciLogicDebugLevel, "Running program for gate %d", _newGate); @@ -1448,17 +1463,6 @@ void Game::enterNewRoom() { // Don't immediately switch to the map or inventory even if the mouse // position tell us to. _mouseChangeTick = kMouseDoNotSwitch; - - // Set cursor state - // Need to do this after we set the palette since the cursors use it - if (_currentRoom._mouseOn) { - debugC(6, kDraciLogicDebugLevel, "Mouse: ON"); - _vm->_mouse->cursorOn(); - _vm->_mouse->setCursorType(kNormalCursor); - } else { - debugC(6, kDraciLogicDebugLevel, "Mouse: OFF"); - _vm->_mouse->cursorOff(); - } } void Game::positionAnimAsHero(Animation *anim) { diff --git a/engines/draci/game.h b/engines/draci/game.h index d3ae36e816..638c979d61 100644 --- a/engines/draci/game.h +++ b/engines/draci/game.h @@ -413,6 +413,7 @@ private: int _fadePhases; int _fadePhase; uint _fadeTick; + bool _isFadeOut; int _mouseChangeTick; bool _enableQuickHero; -- cgit v1.2.3 From 43e3a58c2cdba50e30a0eb8e758e1baa90b890c3 Mon Sep 17 00:00:00 2001 From: lukaslw Date: Tue, 11 Mar 2014 16:42:53 +0100 Subject: DRACI: Hero postion in first new room after loading. --- engines/draci/script.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'engines') diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index 1149cdf717..09c74f5e0d 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -700,6 +700,10 @@ void Script::newRoom(const Common::Array ¶ms) { return; } + if(_vm->_game->isPositionLoaded() == true) { + _vm->_game->setPositionLoaded(false); + } + int room = params[0] - 1; int gate = params[1] - 1; -- cgit v1.2.3