[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