[Scummvm-git-logs] scummvm master -> e18beb4e9ea17c33c60cc6acc3a1f224fb8aaee1
athrxx
noreply at scummvm.org
Sun May 22 17:59:28 UTC 2022
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
d8004bebba KYRA: add more metadata to savegames
e5b35d05e9 KYRA: (LOL) - fix stack access warning
e18beb4e9e KYRA: (LoK/Mac) - slightly improve music fadeout
Commit: d8004bebbabff2f6a3b6688648b1d34a8f474013
https://github.com/scummvm/scummvm/commit/d8004bebbabff2f6a3b6688648b1d34a8f474013
Author: athrxx (athrxx at scummvm.org)
Date: 2022-05-22T19:57:46+02:00
Commit Message:
KYRA: add more metadata to savegames
(creation date/time and playing time)
Changed paths:
engines/kyra/engine/chargen.cpp
engines/kyra/engine/eob.cpp
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/eobcommon.h
engines/kyra/engine/kyra_hof.cpp
engines/kyra/engine/kyra_lok.cpp
engines/kyra/engine/kyra_mr.cpp
engines/kyra/engine/kyra_v1.cpp
engines/kyra/engine/lol.cpp
engines/kyra/engine/magic_eob.cpp
engines/kyra/engine/scene_eob.cpp
engines/kyra/gui/gui_eob.cpp
engines/kyra/gui/gui_eob_segacd.cpp
engines/kyra/gui/gui_lok.cpp
engines/kyra/gui/gui_lol.cpp
engines/kyra/gui/gui_v2.cpp
engines/kyra/gui/saveload.cpp
engines/kyra/gui/saveload_eob.cpp
engines/kyra/gui/saveload_hof.cpp
engines/kyra/gui/saveload_lok.cpp
engines/kyra/gui/saveload_lol.cpp
engines/kyra/gui/saveload_mr.cpp
engines/kyra/kyra_v1.h
engines/kyra/metaengine.cpp
engines/kyra/sequence/sequences_eob.cpp
engines/kyra/sequence/sequences_lol.cpp
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<uint32>(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<uint32>(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);
Commit: e5b35d05e9bedb3efa13661456f779828ffc6bb6
https://github.com/scummvm/scummvm/commit/e5b35d05e9bedb3efa13661456f779828ffc6bb6
Author: athrxx (athrxx at scummvm.org)
Date: 2022-05-22T19:58:06+02:00
Commit Message:
KYRA: (LOL) - fix stack access warning
Changed paths:
engines/kyra/script/script.h
engines/kyra/script/script_lol.cpp
diff --git a/engines/kyra/script/script.h b/engines/kyra/script/script.h
index be0c3930a58..fd4000f1f5e 100644
--- a/engines/kyra/script/script.h
+++ b/engines/kyra/script/script.h
@@ -61,11 +61,10 @@ struct EMCState {
#ifdef RELEASE_BUILD
#define stackPos(x) (script->stack[script->sp+x])
-#define safeStackPos(x) (script->sp+x < EMCState::kStackSize ? stackPos(x) : 0)
#else
#define stackPos(x) emcSafeReadStack(script, x, __LINE__, __FILE__)
-#define safeStackPos(x) stackPos(x)
#endif
+#define safeStackPos(x) (script->sp+x < EMCState::kStackSize ? stackPos(x) : 0)
#define stackPosString(x) ((const char *)&script->dataPtr->text[READ_BE_UINT16(&script->dataPtr->text[stackPos(x)<<1])])
class Resource;
diff --git a/engines/kyra/script/script_lol.cpp b/engines/kyra/script/script_lol.cpp
index 4aeee425575..5ac917ca86e 100644
--- a/engines/kyra/script/script_lol.cpp
+++ b/engines/kyra/script/script_lol.cpp
@@ -800,7 +800,7 @@ int LoLEngine::olol_copyRegion(EMCState *script) {
int LoLEngine::olol_initMonster(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initMonster(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script,
- stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8), stackPos(9), stackPos(10));
+ stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), safeStackPos(7), safeStackPos(8), safeStackPos(9), safeStackPos(10));
uint16 x = 0;
uint16 y = 0;
calcCoordinates(x, y, stackPos(0), stackPos(1), stackPos(2));
@@ -841,7 +841,7 @@ int LoLEngine::olol_initMonster(EMCState *script) {
l->destDirection = l->direction;
for (int ii = 0; ii < 4; ii++)
- l->equipmentShapes[ii] = stackPos(7 + ii) & 0xFF;
+ l->equipmentShapes[ii] = safeStackPos(7 + ii) & 0xFF;
checkSceneUpdateNeed(l->block);
return i;
Commit: e18beb4e9ea17c33c60cc6acc3a1f224fb8aaee1
https://github.com/scummvm/scummvm/commit/e18beb4e9ea17c33c60cc6acc3a1f224fb8aaee1
Author: athrxx (athrxx at scummvm.org)
Date: 2022-05-22T19:58:09+02:00
Commit Message:
KYRA: (LoK/Mac) - slightly improve music fadeout
(it shouldn't delay and pretend to fade if nothing is playing)
Changed paths:
engines/kyra/sound/sound_mac_lok.cpp
diff --git a/engines/kyra/sound/sound_mac_lok.cpp b/engines/kyra/sound/sound_mac_lok.cpp
index 500d8d23254..0d36f17b5a2 100644
--- a/engines/kyra/sound/sound_mac_lok.cpp
+++ b/engines/kyra/sound/sound_mac_lok.cpp
@@ -227,6 +227,9 @@ void SoundMac::beginFadeOut() {
if (!_ready)
return;
+ if (!isPlaying())
+ return;
+
_driver->doCommand(HalestormDriver::kSongFadeOut, 30);
while (_driver->doCommand(HalestormDriver::kSongFadeGetState) >= 16)
_vm->delay(8);
More information about the Scummvm-git-logs
mailing list