From d8004bebbabff2f6a3b6688648b1d34a8f474013 Mon Sep 17 00:00:00 2001 From: athrxx Date: Sun, 22 May 2022 02:26:47 +0200 Subject: [PATCH] KYRA: add more metadata to savegames (creation date/time and playing time) --- engines/kyra/engine/chargen.cpp | 2 ++ engines/kyra/engine/eob.cpp | 2 -- engines/kyra/engine/eobcommon.cpp | 12 ++++------ engines/kyra/engine/eobcommon.h | 4 +--- engines/kyra/engine/kyra_hof.cpp | 2 ++ engines/kyra/engine/kyra_lok.cpp | 2 ++ engines/kyra/engine/kyra_mr.cpp | 2 ++ engines/kyra/engine/kyra_v1.cpp | 22 +++++++++++++++++++ engines/kyra/engine/lol.cpp | 2 ++ engines/kyra/engine/magic_eob.cpp | 4 ++-- engines/kyra/engine/scene_eob.cpp | 2 +- engines/kyra/gui/gui_eob.cpp | 1 + engines/kyra/gui/gui_eob_segacd.cpp | 4 ---- engines/kyra/gui/gui_lok.cpp | 2 +- engines/kyra/gui/gui_lol.cpp | 1 + engines/kyra/gui/gui_v2.cpp | 1 + engines/kyra/gui/saveload.cpp | 29 ++++++++++++++++++++++++- engines/kyra/gui/saveload_eob.cpp | 6 +++-- engines/kyra/gui/saveload_hof.cpp | 2 ++ engines/kyra/gui/saveload_lok.cpp | 2 ++ engines/kyra/gui/saveload_lol.cpp | 2 ++ engines/kyra/gui/saveload_mr.cpp | 2 ++ engines/kyra/kyra_v1.h | 13 ++++++++++- engines/kyra/metaengine.cpp | 8 +++++++ engines/kyra/sequence/sequences_eob.cpp | 7 ++---- engines/kyra/sequence/sequences_lol.cpp | 1 + 26 files changed, 107 insertions(+), 30 deletions(-) diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp index 23984bc3efd..130e01cacfc 100644 --- a/engines/kyra/engine/chargen.cpp +++ b/engines/kyra/engine/chargen.cpp @@ -213,6 +213,8 @@ bool CharacterGenerator::start(EoBCharacter *characters, const uint8 ***faceShap _vm->snd_stopSound(); _vm->delay(_vm->_tickLength); + _vm->restartPlayTimerAt(0); + init(defaultParty); if (defaultParty) diff --git a/engines/kyra/engine/eob.cpp b/engines/kyra/engine/eob.cpp index d32648015b3..fc3cd2b0904 100644 --- a/engines/kyra/engine/eob.cpp +++ b/engines/kyra/engine/eob.cpp @@ -1019,7 +1019,6 @@ void EoBEngine::displayParchment(int id) { if (id < 46 || id > 50) return; - uint32 startTime = _system->getMillis(); disableSysTimer(2); _screen->sega_fadeToBlack(2); @@ -1077,7 +1076,6 @@ void EoBEngine::displayParchment(int id) { snd_playLevelScore(); enableSysTimer(2); - _totalPlaySecs += ((_system->getMillis() - startTime) / 1000); } const uint8 **EoBEngine::makePortalShapes() { diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp index 438b74bbae7..1f89bc2b2cc 100644 --- a/engines/kyra/engine/eobcommon.cpp +++ b/engines/kyra/engine/eobcommon.cpp @@ -242,7 +242,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE _amigaSoundMap = 0; _amigaCurSoundFile = -1; _prefMenuPlatformOffset = 0; - _lastVIntTick = _lastSecTick = _totalPlaySecs = _totalEnemiesKilled = _totalSteps = 0; + _lastVIntTick = _totalEnemiesKilled = _totalSteps = 0; _levelMaps = 0; _closeSpellbookAfterUse = false; _wndBackgrnd = 0; @@ -734,7 +734,8 @@ void EoBCoreEngine::runLoop() { if (_sceneUpdateRequired && !_sceneShakeCountdown) drawScene(1); - updateAnimTimers(); + updatePlayTimer(); + updateAnimations(); uint32 curTime = _system->getMillis(); if (_envAudioTimer < curTime && !(_flags.gameID == GI_EOB1 && (_flags.platform == Common::kPlatformSegaCD || _flags.platform == Common::kPlatformAmiga || _currentLevel == 0 || _currentLevel > 3))) { @@ -786,13 +787,8 @@ bool EoBCoreEngine::checkPartyStatus(bool handleDeath) { return false; } -void EoBCoreEngine::updateAnimTimers() { +void EoBCoreEngine::updateAnimations() { uint32 curTime = _system->getMillis(); - if (_lastSecTick + 1000 <= curTime) { - _lastSecTick = curTime; - _totalPlaySecs++; - } - if (_lastVIntTick + 16 <= curTime) { _lastVIntTick = curTime; gui_updateAnimations(); diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h index 6514e895f5e..6cd63762bb6 100644 --- a/engines/kyra/engine/eobcommon.h +++ b/engines/kyra/engine/eobcommon.h @@ -343,7 +343,7 @@ protected: void runLoop(); void update() override { screen()->updateScreen(); } bool checkPartyStatus(bool handleDeath); - void updateAnimTimers(); + void updateAnimations(); bool _runFlag; @@ -389,8 +389,6 @@ protected: uint32 _restPartyElapsedTime; uint32 _lastVIntTick; - uint32 _lastSecTick; - uint32 _totalPlaySecs; uint32 _totalEnemiesKilled; uint32 _totalSteps; diff --git a/engines/kyra/engine/kyra_hof.cpp b/engines/kyra/engine/kyra_hof.cpp index dfaf32c83fb..a6112018035 100644 --- a/engines/kyra/engine/kyra_hof.cpp +++ b/engines/kyra/engine/kyra_hof.cpp @@ -377,6 +377,7 @@ void KyraEngine_HoF::startup() { loadNPCScript(); if (_gameToLoad == -1) { + restartPlayTimerAt(0); snd_playWanderScoreViaMap(52, 1); enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); saveGameStateIntern(0, "New Game", nullptr); @@ -446,6 +447,7 @@ void KyraEngine_HoF::runLoop() { removeInputTop(); update(); + updatePlayTimer(); if (inputFlag == 198 || inputFlag == 199) { _savedMouseState = _mouseState; diff --git a/engines/kyra/engine/kyra_lok.cpp b/engines/kyra/engine/kyra_lok.cpp index f67bea224ea..9b0d6a9021c 100644 --- a/engines/kyra/engine/kyra_lok.cpp +++ b/engines/kyra/engine/kyra_lok.cpp @@ -428,6 +428,7 @@ void KyraEngine_LoK::startup() { _gui->buttonMenuCallback(nullptr); _menuDirectlyToLoad = false; } else if (!shouldQuit()) { + restartPlayTimerAt(0); saveGameStateIntern(0, "New game", nullptr); } } else { @@ -484,6 +485,7 @@ void KyraEngine_LoK::mainLoop() { _timer->update(); _sound->process(); updateTextFade(); + updatePlayTimer(); if (inputFlag == 198 || inputFlag == 199) processInput(_mouseX, _mouseY); diff --git a/engines/kyra/engine/kyra_mr.cpp b/engines/kyra/engine/kyra_mr.cpp index 200fe3073b5..f4ada01b0d8 100644 --- a/engines/kyra/engine/kyra_mr.cpp +++ b/engines/kyra/engine/kyra_mr.cpp @@ -613,6 +613,7 @@ void KyraEngine_MR::startup() { assert(_invWsa); _invWsa->open("MOODOMTR.WSA", 1, nullptr); _invWsaFrame = 6; + restartPlayTimerAt(0); saveGameStateIntern(0, "New Game", nullptr); if (_gameToLoad == -1) enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); @@ -926,6 +927,7 @@ void KyraEngine_MR::runLoop() { update(); _timer->update(); + updatePlayTimer(); if (inputFlag == 198 || inputFlag == 199) { _savedMouseState = _mouseState; diff --git a/engines/kyra/engine/kyra_v1.cpp b/engines/kyra/engine/kyra_v1.cpp index 7edb880a635..764f14e1621 100644 --- a/engines/kyra/engine/kyra_v1.cpp +++ b/engines/kyra/engine/kyra_v1.cpp @@ -63,6 +63,7 @@ KyraEngine_v1::KyraEngine_v1(OSystem *system, const GameFlags &flags) memset(_flagsTable, 0, sizeof(_flagsTable)); _isSaveAllowed = false; + _totalPlaySecs = _lastSecTick = _lastSecTickAtPauseStart = 0; _mouseX = _mouseY = 0; _transOffsY = 0; @@ -75,6 +76,7 @@ void KyraEngine_v1::pauseEngineIntern(bool pause) { _sound->pause(pause); if (_timer) _timer->pause(pause); + pausePlayTimer(pause); } Common::Error KyraEngine_v1::init() { @@ -706,4 +708,24 @@ void KyraEngine_v1::syncSoundSettings() { _sound->updateVolumeSettings(); } +void KyraEngine_v1::updatePlayTimer() { + uint32 curTime = _system->getMillis(); + while (_lastSecTick + 1000 <= curTime) { + _lastSecTick += 1000; + _totalPlaySecs++; + } +} + +void KyraEngine_v1::restartPlayTimerAt(uint32 totalPlaySecs) { + _lastSecTick = _system->getMillis(); + _totalPlaySecs = totalPlaySecs; +} + +void KyraEngine_v1::pausePlayTimer(bool pause) { + if (pause) + _lastSecTickAtPauseStart = _lastSecTick; + else + _lastSecTick += (_system->getMillis() - _lastSecTickAtPauseStart); +} + } // End of namespace Kyra diff --git a/engines/kyra/engine/lol.cpp b/engines/kyra/engine/lol.cpp index 730eeb00b52..d2a1145ff1f 100644 --- a/engines/kyra/engine/lol.cpp +++ b/engines/kyra/engine/lol.cpp @@ -904,6 +904,8 @@ void LoLEngine::runLoop() { update(); + updatePlayTimer(); + if (_sceneUpdateRequired) gui_drawScene(0); else diff --git a/engines/kyra/engine/magic_eob.cpp b/engines/kyra/engine/magic_eob.cpp index a1b14a7c30c..2502f063011 100644 --- a/engines/kyra/engine/magic_eob.cpp +++ b/engines/kyra/engine/magic_eob.cpp @@ -427,7 +427,7 @@ void EoBCoreEngine::sparkEffectDefensive(int charIndex) { _screen->drawShape(0, _sparkShapes[shpIndex - 1], x, y, 0); } } - updateAnimTimers(); + updateAnimations(); _screen->updateScreen(); delay(_tickLength >> 1); } @@ -446,7 +446,7 @@ void EoBCoreEngine::sparkEffectOffensive() { for (int i = 0; i < 44; i++) { bool sceneShake = _sceneShakeCountdown; - updateAnimTimers(); + updateAnimations(); if (sceneShake) { _screen->copyRegion(0, 0, 0, 0, 176, 120, 0, 2, Screen::CR_NO_P_CHECK); if (!_sceneShakeCountdown) { diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp index 21fff549ac7..14c3e6cbcfe 100644 --- a/engines/kyra/engine/scene_eob.cpp +++ b/engines/kyra/engine/scene_eob.cpp @@ -578,7 +578,7 @@ void EoBCoreEngine::drawScene(int refresh) { int diff = _flashShapeTimer - ct; while ((diff > 0) && !shouldQuit()) { updateInput(); - updateAnimTimers(); + updateAnimations(); uint32 step = MIN(diff, _tickLength / 5); _system->delayMillis(step); diff -= step; diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp index eee409a497d..f624a1d3dff 100644 --- a/engines/kyra/gui/gui_eob.cpp +++ b/engines/kyra/gui/gui_eob.cpp @@ -3192,6 +3192,7 @@ bool GUI_EoB::runSaveMenu(int x, int y) { // does not survive this conversion. And the rest of the characters in these descriptions do not require it. if (!(_vm->gameFlags().platform == Common::kPlatformSegaCD && _vm->gameFlags().lang == Common::JA_JPN && Common::String(temp).contains('\r'))) Util::convertDOSToUTF8(temp, 26); + _vm->updatePlayTimer(); Common::Error err = _vm->saveGameStateIntern(_savegameOffset + slot, temp, &thumb); thumb.free(); diff --git a/engines/kyra/gui/gui_eob_segacd.cpp b/engines/kyra/gui/gui_eob_segacd.cpp index 51dff3489e1..075384fd15e 100644 --- a/engines/kyra/gui/gui_eob_segacd.cpp +++ b/engines/kyra/gui/gui_eob_segacd.cpp @@ -34,7 +34,6 @@ namespace Kyra { int EoBEngine::clickedCamp(Button *button) { - uint32 startTime = _system->getMillis(); gui_resetAnimations(); if (_flags.platform == Common::kPlatformSegaCD) @@ -46,7 +45,6 @@ int EoBEngine::clickedCamp(Button *button) { return button->arg; gui_resetAnimations(); - _totalPlaySecs += ((_system->getMillis() - startTime) / 1000); return button->arg; } @@ -231,7 +229,6 @@ void EoBEngine::gui_drawCharacterStatsPage() { } void EoBEngine::gui_displayMap() { - uint32 startTime = _system->getMillis(); disableSysTimer(2); _screen->sega_fadeToBlack(2); @@ -322,7 +319,6 @@ void EoBEngine::gui_displayMap() { snd_playLevelScore(); enableSysTimer(2); - _totalPlaySecs += ((_system->getMillis() - startTime) / 1000); } void EoBEngine::gui_drawSpellbook() { diff --git a/engines/kyra/gui/gui_lok.cpp b/engines/kyra/gui/gui_lok.cpp index 86a35b3d006..abe5eea8897 100644 --- a/engines/kyra/gui/gui_lok.cpp +++ b/engines/kyra/gui/gui_lok.cpp @@ -791,7 +791,7 @@ int GUI_LoK::saveGame(Button *button) { _vm->_gameToLoad = getNextSavegameSlot(); if (_vm->_gameToLoad > 0) { Util::convertDOSToUTF8(_savegameName, 35); - + _vm->updatePlayTimer(); Graphics::Surface thumb; createScreenThumbnail(thumb); _vm->saveGameStateIntern(_vm->_gameToLoad, _savegameName, &thumb); diff --git a/engines/kyra/gui/gui_lol.cpp b/engines/kyra/gui/gui_lol.cpp index 8c141c206d7..4e61970638d 100644 --- a/engines/kyra/gui/gui_lol.cpp +++ b/engines/kyra/gui/gui_lol.cpp @@ -2848,6 +2848,7 @@ int GUI_LoL::clickedSavenameMenu(Button *button) { int slot = _menuResult == -2 ? getNextSavegameSlot() : _menuResult - 1; Graphics::Surface thumb; createScreenThumbnail(thumb); + _vm->updatePlayTimer(); _vm->saveGameStateIntern(slot, _saveDescription, &thumb); thumb.free(); diff --git a/engines/kyra/gui/gui_v2.cpp b/engines/kyra/gui/gui_v2.cpp index 1f93cdf6e10..280c9b947bd 100644 --- a/engines/kyra/gui/gui_v2.cpp +++ b/engines/kyra/gui/gui_v2.cpp @@ -638,6 +638,7 @@ int GUI_v2::saveMenu(Button *caller) { Graphics::Surface thumb; createScreenThumbnail(thumb); + _vm->updatePlayTimer(); Util::convertDOSToUTF8(_saveDescription, 81); _vm->saveGameStateIntern(_saveSlot, _saveDescription, &thumb); thumb.free(); diff --git a/engines/kyra/gui/saveload.cpp b/engines/kyra/gui/saveload.cpp index ec83d0f48d2..e01b57b49e8 100644 --- a/engines/kyra/gui/saveload.cpp +++ b/engines/kyra/gui/saveload.cpp @@ -28,7 +28,7 @@ #include "graphics/thumbnail.h" #include "graphics/surface.h" -#define CURRENT_SAVE_VERSION 20 +#define CURRENT_SAVE_VERSION 21 #define GF_FLOPPY (1 << 0) #define GF_TALKIE (1 << 1) @@ -134,6 +134,20 @@ WARN_UNUSED_RESULT KyraEngine_v1::ReadSaveHeaderError KyraEngine_v1::readSaveHea header.thumbnail = nullptr; } + if (header.version >= 21) { + header.timeDate.tm_sec = in->readSint32BE(); + header.timeDate.tm_min = in->readSint32BE(); + header.timeDate.tm_hour = in->readSint32BE(); + header.timeDate.tm_mday = in->readSint32BE(); + header.timeDate.tm_mon = in->readSint32BE(); + header.timeDate.tm_year = in->readSint32BE(); + header.timeDate.tm_wday = in->readSint32BE(); + header.totalPlaySecs = in->readUint32BE(); + } else { + header.totalPlaySecs = 0; + memset(&header.timeDate, 0, sizeof(TimeDate)); + } + return ((in->err() || in->eos()) ? kRSHEIoError : kRSHENoError); } @@ -228,6 +242,19 @@ Common::OutSaveFile *KyraEngine_v1::openSaveForWriting(const char *filename, con delete genThumbnail; } + TimeDate td; + _system->getTimeAndDate(td); + + out->writeSint32BE(td.tm_sec); + out->writeSint32BE(td.tm_min); + out->writeSint32BE(td.tm_hour); + out->writeSint32BE(td.tm_mday); + out->writeSint32BE(td.tm_mon); + out->writeSint32BE(td.tm_year); + out->writeSint32BE(td.tm_wday); + + out->writeUint32BE(_totalPlaySecs); + return new Common::OutSaveFile(out); } diff --git a/engines/kyra/gui/saveload_eob.cpp b/engines/kyra/gui/saveload_eob.cpp index 08ada72c593..d0c8ac8de39 100644 --- a/engines/kyra/gui/saveload_eob.cpp +++ b/engines/kyra/gui/saveload_eob.cpp @@ -140,7 +140,8 @@ Common::Error EoBCoreEngine::loadGameState(int slot) { _returnAfterSpellCallback = in.readByte() ? true : false; if (_flags.platform == Common::kPlatformSegaCD || header.version > 18) { - _totalPlaySecs = in.readUint32BE(); + if (header.version < 21) + header.totalPlaySecs = in.readUint32BE(); _totalEnemiesKilled = in.readUint32BE(); _totalSteps = in.readUint32BE(); _levelMaps = in.readUint32BE(); @@ -312,6 +313,8 @@ Common::Error EoBCoreEngine::loadGameState(int slot) { if (_flags.platform != Common::kPlatformSegaCD) _screen->fadeFromBlack(20); + restartPlayTimerAt(header.totalPlaySecs); + _loading = false; removeInputTop(); @@ -419,7 +422,6 @@ Common::Error EoBCoreEngine::saveGameStateIntern(int slot, const char *saveName, out->writeByte(_returnAfterSpellCallback ? 1 : 0); // SegaCD specific - out->writeUint32BE(_totalPlaySecs); out->writeUint32BE(_totalEnemiesKilled); out->writeUint32BE(_totalSteps); out->writeUint32BE(_levelMaps); diff --git a/engines/kyra/gui/saveload_hof.cpp b/engines/kyra/gui/saveload_hof.cpp index 6d5cc283b69..1dd2a6029c9 100644 --- a/engines/kyra/gui/saveload_hof.cpp +++ b/engines/kyra/gui/saveload_hof.cpp @@ -304,6 +304,8 @@ Common::Error KyraEngine_HoF::loadGameState(int slot) { _mainCharY = _mainCharacter.y2 = _mainCharacter.y1; _mainCharacter.facing = 4; + restartPlayTimerAt(header.totalPlaySecs); + enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); setHandItem(_itemInHand); diff --git a/engines/kyra/gui/saveload_lok.cpp b/engines/kyra/gui/saveload_lok.cpp index 9df23c6407f..37650d67042 100644 --- a/engines/kyra/gui/saveload_lok.cpp +++ b/engines/kyra/gui/saveload_lok.cpp @@ -211,6 +211,8 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) { // #4625 "KYRA1: Invisible Brandon" for an example of this. _animator->_noDrawShapesFlag = 0; + restartPlayTimerAt(header.totalPlaySecs); + enterNewScene(_currentCharacter->sceneId, _currentCharacter->facing, 0, 0, 1); _animator->animRefreshNPC(0); diff --git a/engines/kyra/gui/saveload_lol.cpp b/engines/kyra/gui/saveload_lol.cpp index 874db7b3d16..f7e35b27160 100644 --- a/engines/kyra/gui/saveload_lol.cpp +++ b/engines/kyra/gui/saveload_lol.cpp @@ -322,6 +322,8 @@ Common::Error LoLEngine::loadGameState(int slot) { setHandItem(_itemInHand); loadLevel(_currentLevel); gui_drawPlayField(); + restartPlayTimerAt(header.totalPlaySecs); + timerSpecialCharacterUpdate(0); _flagsTable[73] |= 0x08; diff --git a/engines/kyra/gui/saveload_mr.cpp b/engines/kyra/gui/saveload_mr.cpp index 1036999c8ff..0b4c7a0f1eb 100644 --- a/engines/kyra/gui/saveload_mr.cpp +++ b/engines/kyra/gui/saveload_mr.cpp @@ -303,6 +303,8 @@ Common::Error KyraEngine_MR::loadGameState(int slot) { _goodConscienceShown = false; _goodConsciencePosition = false; + restartPlayTimerAt(header.totalPlaySecs); + enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); setHandItem(_itemInHand); diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index aada92f29a2..aee91f8483d 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -69,7 +69,6 @@ class KyraMetaEngine; * Some execeptions: * - The PC-98 version of Eye of the Beholder II is not yet supported. * - We don't support NES or Gameboy versions of Eye of the Beholder. - * - The Macintosh version of Kyrandia 1 lacks sound effects and music. * * The official translations of the games of which we are aware are mostly * supported. Some of the more rare versions (of which we don't even know @@ -376,6 +375,9 @@ protected: bool oldHeader; // old scummvm save header Graphics::Surface *thumbnail; + + TimeDate timeDate; + uint32 totalPlaySecs; }; enum ReadSaveHeaderError { @@ -399,6 +401,15 @@ protected: // TODO: Consider moving this to Screen virtual Graphics::Surface *generateSaveThumbnail() const { return 0; } + + // Officially used in EOB SegaCD (appears in the final stats), but we also use this for the savegame metadata for all games. + void updatePlayTimer(); + void restartPlayTimerAt(uint32 totalPlaySecs); + void pausePlayTimer(bool pause); + + uint32 _lastSecTick; + uint32 _lastSecTickAtPauseStart; + uint32 _totalPlaySecs; }; } // End of namespace Kyra diff --git a/engines/kyra/metaengine.cpp b/engines/kyra/metaengine.cpp index 268efac716f..7e92d0a1568 100644 --- a/engines/kyra/metaengine.cpp +++ b/engines/kyra/metaengine.cpp @@ -62,6 +62,8 @@ bool KyraMetaEngine::hasFeature(MetaEngineFeature f) const { (f == kSupportsDeleteSave) || (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail) || + (f == kSavesSupportCreationDate) || + (f == kSavesSupportPlayTime) || (f == kSimpleSavesNames); } @@ -217,6 +219,12 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s desc.setAutosave(true); desc.setThumbnail(header.thumbnail); + if (header.version >= 21) { + desc.setPlayTime(header.totalPlaySecs * 1000); + desc.setSaveDate(header.timeDate.tm_year + 1900, header.timeDate.tm_mon + 1, header.timeDate.tm_mday); + desc.setSaveTime(header.timeDate.tm_hour, header.timeDate.tm_min); + } + return desc; } } diff --git a/engines/kyra/sequence/sequences_eob.cpp b/engines/kyra/sequence/sequences_eob.cpp index 698ef08b4c7..900cd1f56cb 100644 --- a/engines/kyra/sequence/sequences_eob.cpp +++ b/engines/kyra/sequence/sequences_eob.cpp @@ -2379,10 +2379,10 @@ void EoBEngine::seq_xdeath() { _screen->copyRegion(0, 0, 0, 0, 176, 120, 2, 0, Screen::CR_NO_P_CHECK); _screen->drawShape(0, shapes2, 32, 10, 0); _screen->updateScreen(); - updateAnimTimers(); + updateAnimations(); delete[] shapes2; for (uint32 cur = _system->getMillis(); cur < del; cur = _system->getMillis()) { - updateAnimTimers(); + updateAnimations(); delay(MIN(8, del - cur)); } } @@ -2817,7 +2817,6 @@ bool EoBEngine::seq_segaPlaySequence(int sequenceId, bool setupScreen) { if (_flags.platform != Common::kPlatformSegaCD) return true; - uint32 startTime = _system->getMillis(); _allowSkip = true; resetSkipFlag(); @@ -2832,8 +2831,6 @@ bool EoBEngine::seq_segaPlaySequence(int sequenceId, bool setupScreen) { if (setupScreen) seq_segaRestoreAfterSequence(); - _totalPlaySecs += ((_system->getMillis() - startTime) / 1000); - if (!res) error("EoBEngine::seq_segaPlaySequence(): Failed to play cutscene no. %d", sequenceId); diff --git a/engines/kyra/sequence/sequences_lol.cpp b/engines/kyra/sequence/sequences_lol.cpp index 34f6dd8709e..09b010beb38 100644 --- a/engines/kyra/sequence/sequences_lol.cpp +++ b/engines/kyra/sequence/sequences_lol.cpp @@ -124,6 +124,7 @@ int LoLEngine::processPrologue() { } if (processSelection == 0) { + restartPlayTimerAt(0); if (_flags.isDemo) { _charSelection = 0; _screen->loadBitmap("ITEMICN.SHP", 3, 3, 0);