[Scummvm-git-logs] scummvm master -> c3c0d04d2a2f97c1f059963a8ed5d921f9f61759

dreammaster paulfgilbert at gmail.com
Sun Feb 16 23:44:48 UTC 2020


This automated email contains information about 28 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a00e44ba6c ENGINES: Merge saveGameState virtual methods into a single one
30d34fa63d ENGINES: Implement autosaving in the Engine base class
af265a12ac GRIFFON: Remove autosave code
128bd50051 AGI: Remove autosave code
b1197cf26b COMPOSER: Remove autosave code
429cfd1cad KYRA: Remove autosave code
d35d91e6f6 MOHAWK: Remove autosave code
a2a8229abe ENGINES: Do an autosave before loading a new game
d97949857f MOHAWK: Re-add saving autosave for Myst on quit
1c5cbbb186 QUEEN: Remove autosave code
958cb05295 SKY: Removed bulk of engine-specific autosave code
6c187dbb30 TUCKER: Changing autosave to work with common Engine code
6a3aac1478 XEEN: Remove autosave code
37c397f19b ZVISION: Remove autosave code
8288e9579b ULTIMA: Remove autosave code
c40adffbdd SCUMM: Disable base engine autosave code in favour of engine's existing
9f175c4053 ENGINES: Cleanup of savegame filenames generation
1687427e8e ENGINES: Mark autosave slots as write protected
510818499d ENGINES: If an autosave can't be created, try again in 5 minutes
e8abfaf98e ENGINES: Added OSD messages for failed autosaves or savegames
91801a9c55 ULTIMA: Refactor out use of meta engine pointer
4f26f2c7ef ENGINES: Autosave won't save over a custom save in it's slot
233614a2ff MOHAWK: Re-add missing isAutoSaveAllowed call
0b81eaab7b ENGINES: Abstract autosave check into SaveStateDescriptor
52b87e7660 ENGINES: Add an autosave flag to the extended savegame data
de5e3e3414 NUVIE: Pass autosave flag to extended savegame header when saving
1c8443cac9 NEWS: Add line for better autosave support
c3c0d04d2a MOHAWK: Hook Myst & Riven into SaveStateDescriptor autosave flag


Commit: a00e44ba6cd64823be44d57a4ad8cc5469afd012
    https://github.com/scummvm/scummvm/commit/a00e44ba6cd64823be44d57a4ad8cc5469afd012
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Merge saveGameState virtual methods into a single one

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/adl/adl.cpp
    engines/adl/adl.h
    engines/agi/agi.h
    engines/agi/saveload.cpp
    engines/avalanche/avalanche.cpp
    engines/avalanche/avalanche.h
    engines/bbvs/bbvs.h
    engines/bbvs/saveload.cpp
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/cge/cge.h
    engines/cge/cge_main.cpp
    engines/cge2/cge2.h
    engines/cge2/saveload.cpp
    engines/cine/cine.h
    engines/cine/detection.cpp
    engines/composer/composer.h
    engines/composer/saveload.cpp
    engines/cruise/cruise.cpp
    engines/cruise/cruise.h
    engines/cryomni3d/versailles/engine.h
    engines/cryomni3d/versailles/saveload.cpp
    engines/draci/draci.cpp
    engines/draci/draci.h
    engines/drascula/drascula.h
    engines/drascula/saveload.cpp
    engines/dreamweb/detection.cpp
    engines/dreamweb/dreamweb.h
    engines/engine.cpp
    engines/engine.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/glk/frotz/frotz.cpp
    engines/glk/frotz/frotz.h
    engines/glk/glk.cpp
    engines/glk/glk.h
    engines/gnap/gnap.h
    engines/gnap/menu.cpp
    engines/griffon/griffon.h
    engines/groovie/groovie.cpp
    engines/groovie/groovie.h
    engines/hdb/hdb.h
    engines/hdb/saveload.cpp
    engines/hopkins/hopkins.cpp
    engines/hopkins/hopkins.h
    engines/hugo/hugo.cpp
    engines/hugo/hugo.h
    engines/illusions/illusions.h
    engines/illusions/saveload.cpp
    engines/kyra/kyra_v1.h
    engines/lab/lab.cpp
    engines/lab/lab.h
    engines/lure/lure.h
    engines/macventure/macventure.h
    engines/macventure/saveload.cpp
    engines/mads/mads.cpp
    engines/mads/mads.h
    engines/mohawk/myst.cpp
    engines/mohawk/myst.h
    engines/mohawk/riven.cpp
    engines/mohawk/riven.h
    engines/mortevielle/mortevielle.cpp
    engines/mortevielle/mortevielle.h
    engines/mutationofjb/mutationofjb.cpp
    engines/mutationofjb/mutationofjb.h
    engines/neverhood/neverhood.h
    engines/neverhood/saveload.cpp
    engines/pegasus/pegasus.cpp
    engines/pegasus/pegasus.h
    engines/pink/pink.h
    engines/pink/saveload.cpp
    engines/prince/prince.h
    engines/prince/saveload.cpp
    engines/queen/queen.cpp
    engines/queen/queen.h
    engines/saga/detection.cpp
    engines/saga/saga.h
    engines/sci/detection.cpp
    engines/sci/sci.h
    engines/scumm/saveload.cpp
    engines/scumm/scumm.h
    engines/sherlock/sherlock.cpp
    engines/sherlock/sherlock.h
    engines/sky/detection.cpp
    engines/sky/sky.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/sword1/detection.cpp
    engines/sword1/sword1.h
    engines/sword2/sword2.cpp
    engines/sword2/sword2.h
    engines/sword25/sword25.h
    engines/teenagent/teenagent.cpp
    engines/teenagent/teenagent.h
    engines/tinsel/detection.cpp
    engines/tinsel/tinsel.h
    engines/titanic/titanic.cpp
    engines/titanic/titanic.h
    engines/toltecs/saveload.cpp
    engines/toltecs/toltecs.h
    engines/tony/tony.cpp
    engines/tony/tony.h
    engines/toon/toon.h
    engines/touche/saveload.cpp
    engines/touche/touche.h
    engines/tsage/tsage.cpp
    engines/tsage/tsage.h
    engines/tucker/saveload.cpp
    engines/tucker/tucker.h
    engines/voyeur/voyeur.cpp
    engines/voyeur/voyeur.h
    engines/wage/saveload.cpp
    engines/wage/wage.h
    engines/wintermute/wintermute.cpp
    engines/wintermute/wintermute.h
    engines/xeen/saves.cpp
    engines/xeen/saves.h
    engines/xeen/xeen.cpp
    engines/xeen/xeen.h
    engines/zvision/detection.cpp
    engines/zvision/zvision.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index ee15273..790b870 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -455,7 +455,7 @@ void AccessEngine::freeChar() {
 	_animation->freeAnimationData();
 }
 
-Common::Error AccessEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error AccessEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
 		generateSaveName(slot));
 	if (!out)
diff --git a/engines/access/access.h b/engines/access/access.h
index c5d2108..b2ff86a 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -289,7 +289,7 @@ public:
 	/**
 	 * Save the game
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Returns true if a savegame can currently be loaded
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index 3495c1b..9057627 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -924,7 +924,7 @@ void AdlEngine::saveState(Common::WriteStream &stream) {
 		stream.writeByte(_state.vars[i]);
 }
 
-Common::Error AdlEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error AdlEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String fileName = Common::String::format("%s.s%02d", _targetName.c_str(), slot);
 	Common::OutSaveFile *outFile = getSaveFileManager()->openForSaving(fileName);
 
diff --git a/engines/adl/adl.h b/engines/adl/adl.h
index 88ada3b..c73fb83 100644
--- a/engines/adl/adl.h
+++ b/engines/adl/adl.h
@@ -250,7 +250,7 @@ protected:
 
 	// Engine
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 
 	Common::String getDiskImageName(byte volume) const { return Adl::getDiskImageName(*_gameDescription, volume); }
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index caaf08d..d0ed6c1 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -849,7 +849,7 @@ public:
 	bool promptIsEnabled() override;
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
 
 private:
 	int _keyQueue[KEY_QUEUE_SIZE];
diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp
index 8edcf27..f1a851e 100644
--- a/engines/agi/saveload.cpp
+++ b/engines/agi/saveload.cpp
@@ -1083,7 +1083,7 @@ Common::Error AgiEngine::loadGameState(int slot) {
 	}
 }
 
-Common::Error AgiEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error AgiEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	Common::String saveLoadSlot = getSavegameFilename(slot);
 	if (saveGame(saveLoadSlot, description) == errOK)
 		return Common::kNoError;
diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp
index c2274ec..d044882 100644
--- a/engines/avalanche/avalanche.cpp
+++ b/engines/avalanche/avalanche.cpp
@@ -331,7 +331,7 @@ bool AvalancheEngine::canSaveGameStateCurrently() {
 	return (_animationsEnabled && _alive);
 }
 
-Common::Error AvalancheEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error AvalancheEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return (saveGame(slot, desc) ? Common::kNoError : Common::kWritingFailed);
 }
 
diff --git a/engines/avalanche/avalanche.h b/engines/avalanche/avalanche.h
index dea1809..384bcef 100644
--- a/engines/avalanche/avalanche.h
+++ b/engines/avalanche/avalanche.h
@@ -110,7 +110,7 @@ public:
 
 	void synchronize(Common::Serializer &sz);
 	bool canSaveGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool saveGame(const int16 slot, const Common::String &desc);
 	Common::String getSaveFileName(const int slot);
 	bool canLoadGameStateCurrently() override;
diff --git a/engines/bbvs/bbvs.h b/engines/bbvs/bbvs.h
index 728dc68..e0c343a 100644
--- a/engines/bbvs/bbvs.h
+++ b/engines/bbvs/bbvs.h
@@ -409,7 +409,7 @@ public:
 	bool canLoadGameStateCurrently() override { return _isSaveAllowed; }
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
 	void savegame(const char *filename, const char *description);
 	void loadgame(const char *filename);
 	const char *getSavegameFilename(int num);
diff --git a/engines/bbvs/saveload.cpp b/engines/bbvs/saveload.cpp
index d4782aa..d09b59b 100644
--- a/engines/bbvs/saveload.cpp
+++ b/engines/bbvs/saveload.cpp
@@ -187,7 +187,7 @@ Common::Error BbvsEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error BbvsEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error BbvsEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	const char *fileName = getSavegameFilename(slot);
 	savegame(fileName, description.c_str());
 	return Common::kNoError;
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 529a74b..1ce859a 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -283,7 +283,7 @@ bool BladeRunnerEngine::canSaveGameStateCurrently() {
 		!_elevator->isOpen();
 }
 
-Common::Error BladeRunnerEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error BladeRunnerEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *saveFile = BladeRunner::SaveFileManager::openForSaving(_targetName, slot);
 	if (saveFile == nullptr || saveFile->err()) {
 		delete saveFile;
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index e5cb6dd..45bed4d 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -257,7 +257,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	bool canSaveGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void pauseEngineIntern(bool pause) override;
 
 	Common::Error run() override;
diff --git a/engines/cge/cge.h b/engines/cge/cge.h
index 337079d..633f85c 100644
--- a/engines/cge/cge.h
+++ b/engines/cge/cge.h
@@ -141,7 +141,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	static const int _maxSceneArr[5];
 	bool _quitFlag;
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp
index c944772..7b9ea7a 100644
--- a/engines/cge/cge_main.cpp
+++ b/engines/cge/cge_main.cpp
@@ -298,7 +298,7 @@ void CGEEngine::resetGame() {
 	_commandHandler->reset();
 }
 
-Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	sceneDown();
 	_hero->park();
 	_oldLev = _lev;
diff --git a/engines/cge2/cge2.h b/engines/cge2/cge2.h
index 66de6aa..c60cdf1 100644
--- a/engines/cge2/cge2.h
+++ b/engines/cge2/cge2.h
@@ -158,7 +158,7 @@ public:
 	bool hasFeature(EngineFeature f) const override;
 	bool canSaveGameStateCurrently() override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error run() override;
 
diff --git a/engines/cge2/saveload.cpp b/engines/cge2/saveload.cpp
index a8120c1..b93e2c6 100644
--- a/engines/cge2/saveload.cpp
+++ b/engines/cge2/saveload.cpp
@@ -47,7 +47,7 @@ bool CGE2Engine::canSaveGameStateCurrently() {
 		_commandHandler->idle() && (_soundStat._wait == nullptr);
 }
 
-Common::Error CGE2Engine::saveGameState(int slot, const Common::String &desc) {
+Common::Error CGE2Engine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	storeHeroPos();
 	saveGame(slot, desc);
 	sceneUp(_now);
diff --git a/engines/cine/cine.h b/engines/cine/cine.h
index c83a444..b308b0e 100644
--- a/engines/cine/cine.h
+++ b/engines/cine/cine.h
@@ -127,7 +127,7 @@ public:
 	int modifyGameSpeed(int speedChange);
 	int getTimerDelay() const;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 
diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp
index 2dd1d3f..73177a6 100644
--- a/engines/cine/detection.cpp
+++ b/engines/cine/detection.cpp
@@ -223,7 +223,7 @@ Common::Error CineEngine::loadGameState(int slot) {
 	return gameLoaded ? Common::kNoError : Common::kUnknownError;
 }
 
-Common::Error CineEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error CineEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	// Load savegame descriptions from index file
 	loadSaveDirectory();
 
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
index f74467b..b717c47 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -169,7 +169,7 @@ protected:
 	bool canLoadGameStateCurrently() override { return true; }
 	Common::Error loadGameState(int slot) override;
 	bool canSaveGameStateCurrently() override { return true; }
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 public:
 	ComposerEngine(OSystem *syst, const ComposerGameDescription *gameDesc);
diff --git a/engines/composer/saveload.cpp b/engines/composer/saveload.cpp
index ea657a9..56dad66 100644
--- a/engines/composer/saveload.cpp
+++ b/engines/composer/saveload.cpp
@@ -373,7 +373,7 @@ Common::Error ComposerEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error ComposerEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error ComposerEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String filename = makeSaveGameName(slot);
 	Common::OutSaveFile *out;
 	_lastSaveTime = _system->getMillis();
diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp
index 1c0888a..3bc01fd 100644
--- a/engines/cruise/cruise.cpp
+++ b/engines/cruise/cruise.cpp
@@ -205,7 +205,7 @@ bool CruiseEngine::canLoadGameStateCurrently() {
 	return playerMenuEnabled != 0;
 }
 
-Common::Error CruiseEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error CruiseEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return saveSavegameData(slot, desc);
 }
 
diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h
index 4e04586..f6cc19b 100644
--- a/engines/cruise/cruise.h
+++ b/engines/cruise/cruise.h
@@ -93,7 +93,7 @@ public:
 	static const char *getSavegameFile(int saveGameIdx);
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 	void syncSoundSettings() override;
 
diff --git a/engines/cryomni3d/versailles/engine.h b/engines/cryomni3d/versailles/engine.h
index a711c87..9020963 100644
--- a/engines/cryomni3d/versailles/engine.h
+++ b/engines/cryomni3d/versailles/engine.h
@@ -232,7 +232,7 @@ public:
 
 	bool hasFeature(EngineFeature f) const override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	Common::String prepareFileName(const Common::String &baseName, const char *extension) const {
 		const char *const extensions[] = { extension, nullptr };
diff --git a/engines/cryomni3d/versailles/saveload.cpp b/engines/cryomni3d/versailles/saveload.cpp
index 521bebe..2f961f8 100644
--- a/engines/cryomni3d/versailles/saveload.cpp
+++ b/engines/cryomni3d/versailles/saveload.cpp
@@ -36,7 +36,7 @@ Common::Error CryOmni3DEngine_Versailles::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error CryOmni3DEngine_Versailles::saveGameState(int slot, const Common::String &desc) {
+Common::Error CryOmni3DEngine_Versailles::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	saveGame(_isVisiting, slot + 1, desc);
 	return Common::kNoError;
 }
diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp
index ed36216..467d5b7 100644
--- a/engines/draci/draci.cpp
+++ b/engines/draci/draci.cpp
@@ -468,7 +468,7 @@ bool DraciEngine::canLoadGameStateCurrently() {
 		(_game->getLoopSubstatus() == kOuterLoop);
 }
 
-Common::Error DraciEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error DraciEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return saveSavegameData(slot, desc, *this);
 }
 
diff --git a/engines/draci/draci.h b/engines/draci/draci.h
index 20d33ee..5214f0b 100644
--- a/engines/draci/draci.h
+++ b/engines/draci/draci.h
@@ -70,7 +70,7 @@ public:
 	static Common::String getSavegameFile(int saveGameIdx);
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 
 	Screen *_screen;
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index ecd73c2..8dcffbd 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -330,7 +330,7 @@ public:
 
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 
 	Common::RandomSource *_rnd;
diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp
index d54c337..7250eb9 100644
--- a/engines/drascula/saveload.cpp
+++ b/engines/drascula/saveload.cpp
@@ -199,7 +199,7 @@ bool DrasculaEngine::canLoadGameStateCurrently() {
 	return _canSaveLoad;
 }
 
-Common::Error DrasculaEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error DrasculaEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	saveGame(slot, desc);
 	return Common::kNoError;
 }
diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp
index f680494..dfc68b6 100644
--- a/engines/dreamweb/detection.cpp
+++ b/engines/dreamweb/detection.cpp
@@ -239,7 +239,7 @@ Common::Error DreamWebEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error DreamWebEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error DreamWebEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return Common::kNoError;
 }
 
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index 7c09f4d..c01017b 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -114,7 +114,7 @@ public:
 	void waitForVSync();
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
diff --git a/engines/engine.cpp b/engines/engine.cpp
index ac6a01b..1a66089 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -662,10 +662,6 @@ bool Engine::canLoadGameStateCurrently() {
 	return false;
 }
 
-Common::Error Engine::saveGameState(int slot, const Common::String &desc) {
-	return saveGameState(slot, desc, false);
-}
-
 Common::Error Engine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(getSaveStateName(slot));
 
diff --git a/engines/engine.h b/engines/engine.h
index 65a325f..38ed829 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -261,18 +261,10 @@ public:
 	 * Save a game state.
 	 * @param slot	the slot into which the savestate should be stored
 	 * @param desc	a description for the savestate, entered by the user
-	 * @return returns kNoError on success, else an error code.
-	 */
-	virtual Common::Error saveGameState(int slot, const Common::String &desc);
-
-	/**
-	 * Save a game state.
-	 * @param slot	the slot into which the savestate should be stored
-	 * @param desc	a description for the savestate, entered by the user
 	 * @param isAutosave	Expected to be true if an autosave is being created
 	 * @return returns kNoError on success, else an error code.
 	 */
-	virtual Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave);
+	virtual Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false);
 
 	/**
 	 * Save a game state.
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index de4c633..10c756f 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -239,7 +239,7 @@ Common::Error FullpipeEngine::loadGameState(int slot) {
 		return Common::kUnknownError;
 }
 
-Common::Error FullpipeEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error FullpipeEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	if (_gameLoader->writeSavegame(_currentScene, getSavegameFile(slot), description))
 		return Common::kNoError;
 	else
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 609a7a0..db85cf6 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -356,7 +356,7 @@ public:
 	bool _isSaveAllowed;
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
 
 	bool canLoadGameStateCurrently() override { return true; }
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
diff --git a/engines/glk/frotz/frotz.cpp b/engines/glk/frotz/frotz.cpp
index c9a0395..34751b2 100644
--- a/engines/glk/frotz/frotz.cpp
+++ b/engines/glk/frotz/frotz.cpp
@@ -129,7 +129,7 @@ Common::Error Frotz::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error Frotz::saveGameState(int slot, const Common::String &desc) {
+Common::Error Frotz::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String msg;
 	FileReference ref(slot, desc, fileusage_BinaryMode | fileusage_SavedGame);
 
diff --git a/engines/glk/frotz/frotz.h b/engines/glk/frotz/frotz.h
index d2b99a3..87eb13e 100644
--- a/engines/glk/frotz/frotz.h
+++ b/engines/glk/frotz/frotz.h
@@ -79,7 +79,7 @@ public:
 	/**
 	 * Save the game to a given slot
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Loading method not used for Frotz sub-engine
diff --git a/engines/glk/glk.cpp b/engines/glk/glk.cpp
index a168051..3f092e3 100644
--- a/engines/glk/glk.cpp
+++ b/engines/glk/glk.cpp
@@ -228,7 +228,7 @@ Common::Error GlkEngine::loadGameState(int slot) {
 	return errCode;
 }
 
-Common::Error GlkEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error GlkEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String msg;
 	FileReference ref(slot, desc, fileusage_BinaryMode | fileusage_SavedGame);
 
diff --git a/engines/glk/glk.h b/engines/glk/glk.h
index 7cc6bc2..fe4d6b8 100644
--- a/engines/glk/glk.h
+++ b/engines/glk/glk.h
@@ -201,7 +201,7 @@ public:
 	/**
 	 * Save the game to a given slot
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Load a savegame from the passed Quetzal file chunk stream
diff --git a/engines/gnap/gnap.h b/engines/gnap/gnap.h
index 17ba7f0..bc52307 100644
--- a/engines/gnap/gnap.h
+++ b/engines/gnap/gnap.h
@@ -315,7 +315,7 @@ public:
 
 	int readSavegameDescription(int savegameNum, Common::String &description);
 	int loadSavegame(int savegameNum);
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
 	Common::String generateSaveName(int slot);
 	void synchronize(Common::Serializer &s);
diff --git a/engines/gnap/menu.cpp b/engines/gnap/menu.cpp
index ac64928..58030b4 100644
--- a/engines/gnap/menu.cpp
+++ b/engines/gnap/menu.cpp
@@ -527,7 +527,7 @@ void GnapEngine::updateMenuStatusMainMenu() {
 #endif
 }
 
-Common::Error GnapEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error GnapEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
 		generateSaveName(slot));
 	if (!out)
diff --git a/engines/griffon/griffon.h b/engines/griffon/griffon.h
index 08c3d55..69804c8 100644
--- a/engines/griffon/griffon.h
+++ b/engines/griffon/griffon.h
@@ -417,7 +417,7 @@ private:
 	Common::String getSaveStateName(int slot) const override;
 	int loadPlayer(int slotnum);
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameStream(Common::SeekableReadStream *file) override;
 	Common::Error saveGameStream(Common::WriteStream *file, bool isAutosave) override;
 	void autoSaveCheck();
diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp
index 213ceb4..335142c 100644
--- a/engines/groovie/groovie.cpp
+++ b/engines/groovie/groovie.cpp
@@ -391,7 +391,7 @@ Common::Error GroovieEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error GroovieEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error GroovieEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	_script->directGameSave(slot,desc);
 
 	// TODO: Use specific error codes
diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h
index 73f07ca..7d36bce 100644
--- a/engines/groovie/groovie.h
+++ b/engines/groovie/groovie.h
@@ -105,7 +105,7 @@ protected:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void syncSoundSettings() override;
 
 public:
diff --git a/engines/hdb/hdb.h b/engines/hdb/hdb.h
index ad2a7ba..e04e932 100644
--- a/engines/hdb/hdb.h
+++ b/engines/hdb/hdb.h
@@ -195,7 +195,7 @@ public:
 		_changeLevel = true;
 	}
 
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
diff --git a/engines/hdb/saveload.cpp b/engines/hdb/saveload.cpp
index 1af7c63..8d178fa 100644
--- a/engines/hdb/saveload.cpp
+++ b/engines/hdb/saveload.cpp
@@ -36,7 +36,7 @@ bool HDBGame::canSaveGameStateCurrently() {
 	return (_gameState == GAME_PLAY && !_ai->cinematicsActive());
 }
 
-Common::Error HDBGame::saveGameState(int slot, const Common::String &desc) {
+Common::Error HDBGame::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 
 	// If no map is loaded, don't try to save
 	if (!g_hdb->_map->isLoaded())
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
index c9d44ee..5df8ec2 100644
--- a/engines/hopkins/hopkins.cpp
+++ b/engines/hopkins/hopkins.cpp
@@ -106,7 +106,7 @@ Common::Error HopkinsEngine::loadGameState(int slot) {
 /**
  * Save the game to the given slot index, and with the given name
  */
-Common::Error HopkinsEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error HopkinsEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return _saveLoad->saveGame(slot, desc);
 }
 
diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h
index 9e2510a..b6da7cc 100644
--- a/engines/hopkins/hopkins.h
+++ b/engines/hopkins/hopkins.h
@@ -165,8 +165,10 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+
 	int _startGameSlot;
+
 	/**
 	 * Run the introduction sequence
 	 */
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index cdecac8..01e7bbd 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -176,7 +176,7 @@ void HugoEngine::setMaxScore(const int newScore) {
 	_maxscore = newScore;
 }
 
-Common::Error HugoEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error HugoEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return (_file->saveGame(slot, desc) ? Common::kWritingFailed : Common::kNoError);
 }
 
diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h
index 45422c9..6cc74ac 100644
--- a/engines/hugo/hugo.h
+++ b/engines/hugo/hugo.h
@@ -283,7 +283,7 @@ public:
 	void adjustScore(const int adjustment);
 	int getMaxScore() const;
 	void setMaxScore(const int newScore);
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
 	bool hasFeature(EngineFeature f) const override;
 	const char *getCopyrightString() const;
diff --git a/engines/illusions/illusions.h b/engines/illusions/illusions.h
index 7ec4eb0..83a3fcf 100644
--- a/engines/illusions/illusions.h
+++ b/engines/illusions/illusions.h
@@ -226,7 +226,7 @@ public:
 	bool canLoadGameStateCurrently() override { return _isSaveAllowed; }
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error removeGameState(int slot);
 	bool savegame(const char *filename, const char *description);
 	bool loadgame(const char *filename);
diff --git a/engines/illusions/saveload.cpp b/engines/illusions/saveload.cpp
index 9409173..f46496a 100644
--- a/engines/illusions/saveload.cpp
+++ b/engines/illusions/saveload.cpp
@@ -134,7 +134,7 @@ Common::Error IllusionsEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error IllusionsEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error IllusionsEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	const char *fileName = getSavegameFilename(slot);
 	if (!savegame(fileName, description.c_str()))
 		return Common::kWritingFailed;
diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h
index ff3a3c6..56434ea 100644
--- a/engines/kyra/kyra_v1.h
+++ b/engines/kyra/kyra_v1.h
@@ -424,7 +424,9 @@ protected:
 
 	void loadGameStateCheck(int slot);
 	Common::Error loadGameState(int slot) override = 0;
-	Common::Error saveGameState(int slot, const Common::String &desc) override { return saveGameStateIntern(slot, desc.c_str(), 0); }
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override {
+		return saveGameStateIntern(slot, desc.c_str(), 0);
+	}
 	virtual Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail) = 0;
 
 	Common::SeekableReadStream *openSaveForReading(const char *filename, SaveHeader &header, bool checkID = true);
diff --git a/engines/lab/lab.cpp b/engines/lab/lab.cpp
index 5584464..e7cca24 100644
--- a/engines/lab/lab.cpp
+++ b/engines/lab/lab.cpp
@@ -216,7 +216,7 @@ Common::Error LabEngine::loadGameState(int slot) {
 	return (result) ? Common::kNoError : Common::kUserCanceled;
 }
 
-Common::Error LabEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error LabEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	bool result = saveGame(slot, desc);
 	return (result) ? Common::kNoError : Common::kUserCanceled;
 }
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index a72a99e..7766805 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -227,7 +227,7 @@ public:
 	void waitTOF();
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 
diff --git a/engines/lure/lure.h b/engines/lure/lure.h
index 821b28b..a3ca075 100644
--- a/engines/lure/lure.h
+++ b/engines/lure/lure.h
@@ -121,7 +121,7 @@ public:
 	Common::Error loadGameState(int slot) override {
 		return loadGame(slot) ? Common::kNoError : Common::kReadingFailed;
 	}
-	Common::Error saveGameState(int slot, const Common::String &desc) override {
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override {
 		Common::String s(desc);
 		return saveGame(slot, s) ? Common::kNoError : Common::kReadingFailed;
 	}
diff --git a/engines/macventure/macventure.h b/engines/macventure/macventure.h
index 1e45e7b..fc8ec38 100644
--- a/engines/macventure/macventure.h
+++ b/engines/macventure/macventure.h
@@ -200,7 +200,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void newGame();
 	void setInitialFlags();
 	void setNewGameState();
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index f926d3c..e279cee 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -149,7 +149,7 @@ Common::Error MacVentureEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
 	Common::SaveFileManager *manager = getSaveFileManager();
 	// HACK Get a real name!
diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
index 4475c03..9b77245 100644
--- a/engines/mads/mads.cpp
+++ b/engines/mads/mads.cpp
@@ -215,7 +215,7 @@ Common::Error MADSEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error MADSEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error MADSEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	_game->saveGame(slot, desc);
 	return Common::kNoError;
 }
diff --git a/engines/mads/mads.h b/engines/mads/mads.h
index 2401195..5e6e7ae 100644
--- a/engines/mads/mads.h
+++ b/engines/mads/mads.h
@@ -150,7 +150,7 @@ public:
 	/**
 	 * Handles saving the game via the GMM
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Handles updating sound settings after they're changed in the GMM dialog
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 6046e28..8707475 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -968,7 +968,7 @@ Common::Error MohawkEngine_Myst::loadGameState(int slot) {
 	return Common::kUnknownError;
 }
 
-Common::Error MohawkEngine_Myst::saveGameState(int slot, const Common::String &desc) {
+Common::Error MohawkEngine_Myst::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	const Graphics::Surface *thumbnail = nullptr;
 	if (_stack->getStackId() == kMenuStack) {
 		thumbnail = _gfx->getThumbnailForMainMenu();
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index a7e6e25..771a25b 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -188,7 +188,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void tryAutoSaving();
 	bool hasFeature(EngineFeature f) const override;
 	static Common::Array<Common::Keymap *> initKeymaps(const char *target);
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index f3480a0..4262946 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -723,18 +723,14 @@ void MohawkEngine_Riven::loadGameStateAndDisplayError(int slot) {
 	}
 }
 
-Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &desc) {
-	return saveGameState(slot, desc, false);
-}
-
-Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &desc, bool autosave) {
+Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	if (_menuSavedStack != -1) {
 		_vars["CurrentStackID"] = _menuSavedStack;
 		_vars["CurrentCardID"] = _menuSavedCard;
 	}
 
 	const Graphics::Surface *thumbnail = _menuSavedStack != -1 ? _menuThumbnail.get() : nullptr;
-	Common::Error error = _saveLoad->saveGame(slot, desc, thumbnail, autosave);
+	Common::Error error = _saveLoad->saveGame(slot, desc, thumbnail, isAutosave);
 
 	if (_menuSavedStack != -1) {
 		_vars["CurrentStackID"] = 1;
diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h
index ba00caa..ea2cb46 100644
--- a/engines/mohawk/riven.h
+++ b/engines/mohawk/riven.h
@@ -104,7 +104,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool hasFeature(EngineFeature f) const override;
 	static Common::Array<Common::Keymap *> initKeymaps(const char *target);
 
@@ -168,7 +168,6 @@ public:
 	void runSaveDialog();
 	void tryAutoSaving();
 	void loadGameStateAndDisplayError(int slot);
-	Common::Error saveGameState(int slot, const Common::String &desc, bool autosave) override;
 	void saveGameStateAndDisplayError(int slot, const Common::String &desc);
 
 	/**
diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp
index 16609ca..90bb90a 100644
--- a/engines/mortevielle/mortevielle.cpp
+++ b/engines/mortevielle/mortevielle.cpp
@@ -203,7 +203,7 @@ Common::Error MortevielleEngine::loadGameState(int slot) {
 /**
  * Save the current game
  */
-Common::Error MortevielleEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error MortevielleEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	if (slot == 0)
 		return Common::kWritingFailed;
 
diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h
index 03df3a0..0b1aa5f 100644
--- a/engines/mortevielle/mortevielle.h
+++ b/engines/mortevielle/mortevielle.h
@@ -442,7 +442,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error run() override;
 	void pauseEngineIntern(bool pause) override;
 	uint32 getGameFlags() const;
diff --git a/engines/mutationofjb/mutationofjb.cpp b/engines/mutationofjb/mutationofjb.cpp
index 71e639f..63cbc5d 100644
--- a/engines/mutationofjb/mutationofjb.cpp
+++ b/engines/mutationofjb/mutationofjb.cpp
@@ -147,7 +147,7 @@ bool MutationOfJBEngine::canSaveGameStateCurrently() {
 	return _game->loadSaveAllowed();
 }
 
-Common::Error MutationOfJBEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error MutationOfJBEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
 	Common::OutSaveFile *const saveFile = g_system->getSavefileManager()->openForSaving(saveName);
 	if (!saveFile)
diff --git a/engines/mutationofjb/mutationofjb.h b/engines/mutationofjb/mutationofjb.h
index 30a4ec1..ca841e1 100644
--- a/engines/mutationofjb/mutationofjb.h
+++ b/engines/mutationofjb/mutationofjb.h
@@ -69,7 +69,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	bool canSaveGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	const ADGameDescription *getGameDescription() const;
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index ccf1488..1cadda3 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -121,7 +121,7 @@ public:
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
 	Common::Error removeGameState(int slot);
 	bool savegame(const char *filename, const char *description);
 	bool loadgame(const char *filename);
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index d7e6f1e..0176345 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -136,7 +136,7 @@ Common::Error NeverhoodEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	const char *fileName = getSavegameFilename(slot);
 	if (!savegame(fileName, description.c_str()))
 		return Common::kWritingFailed;
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index 599985c..02b0413 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -696,7 +696,7 @@ static bool isValidSaveFileName(const Common::String &desc) {
 	return true;
 }
 
-Common::Error PegasusEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error PegasusEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	if (!isValidSaveFileName(desc))
 		return Common::Error(Common::kCreatingFileFailed, _("Invalid file name for saving"));
 
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h
index ae47ce8..e205535 100644
--- a/engines/pegasus/pegasus.h
+++ b/engines/pegasus/pegasus.h
@@ -81,7 +81,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	static Common::Array<Common::Keymap *> initKeymaps();
 
 	// Base classes
diff --git a/engines/pink/pink.h b/engines/pink/pink.h
index 85c5890..17db8d8 100644
--- a/engines/pink/pink.h
+++ b/engines/pink/pink.h
@@ -99,7 +99,7 @@ public:
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
 
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 
 	static void pauseEngine(void *engine, bool pause); // for MacWndMgr
diff --git a/engines/pink/saveload.cpp b/engines/pink/saveload.cpp
index dacec35..5299b01 100644
--- a/engines/pink/saveload.cpp
+++ b/engines/pink/saveload.cpp
@@ -49,7 +49,7 @@ Common::Error PinkEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error PinkEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error PinkEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *out = _saveFileMan->openForSaving(generateSaveName(slot, _targetName.c_str()));
 	if (!out)
 		return Common::kUnknownError;
diff --git a/engines/prince/prince.h b/engines/prince/prince.h
index 2bd130c..6101f25 100644
--- a/engines/prince/prince.h
+++ b/engines/prince/prince.h
@@ -285,7 +285,7 @@ public:
 	void pauseEngineIntern(bool pause) override;
 	bool canSaveGameStateCurrently() override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
 
 	void playVideo(Common::String videoFilename);
diff --git a/engines/prince/saveload.cpp b/engines/prince/saveload.cpp
index b1d9fc4..3d1465f 100644
--- a/engines/prince/saveload.cpp
+++ b/engines/prince/saveload.cpp
@@ -144,7 +144,7 @@ bool PrinceEngine::canLoadGameStateCurrently() {
 	return false;
 }
 
-Common::Error PrinceEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error PrinceEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	// Set up the serializer
 	Common::String slotName = generateSaveName(slot);
 	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(slotName);
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 3f70249..2cdef5e 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -182,7 +182,7 @@ bool QueenEngine::canSaveGameStateCurrently() {
 	return canLoadOrSave();
 }
 
-Common::Error QueenEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error QueenEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	debug(3, "Saving game to slot %d", slot);
 	char name[20];
 	Common::Error err = Common::kNoError;
diff --git a/engines/queen/queen.h b/engines/queen/queen.h
index a69ef2f..6204e26 100644
--- a/engines/queen/queen.h
+++ b/engines/queen/queen.h
@@ -96,7 +96,7 @@ public:
 	bool canLoadOrSave() const;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
 	void makeGameStateName(int slot, char *buf) const;
 	int getGameStateSlot(const char *filename) const;
diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp
index 4851daa..a8749b0 100644
--- a/engines/saga/detection.cpp
+++ b/engines/saga/detection.cpp
@@ -334,7 +334,7 @@ Common::Error SagaEngine::loadGameState(int slot) {
 	return Common::kNoError;	// TODO: return success/failure
 }
 
-Common::Error SagaEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error SagaEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	save(calcSaveFileName((uint)slot), desc.c_str());
 	return Common::kNoError;	// TODO: return success/failure
 }
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index ae7497b..2754d2e 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -628,7 +628,7 @@ public:
 
 	const Common::Rect &getDisplayClip() const { return _displayClip;}
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	const GameDisplayInfo &getDisplayInfo();
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index 82f933f..53c1e2e 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -937,7 +937,7 @@ Common::Error SciEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error SciEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error SciEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String fileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
 	Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
 	Common::OutSaveFile *out = saveFileMan->openForSaving(fileName);
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index fafd49f..2a1d2ab 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -260,7 +260,7 @@ public:
 	void severeError();
 	Console *getSciDebugger();
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	void syncSoundSettings() override; ///< from ScummVM to the game
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index e3557ee..7f419c1 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -102,7 +102,7 @@ bool ScummEngine::canLoadGameStateCurrently() {
 	return (VAR_MAINMENU_KEY == 0xFF || VAR(VAR_MAINMENU_KEY) != 0);
 }
 
-Common::Error ScummEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error ScummEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	requestSave(slot, desc);
 	return Common::kNoError;
 }
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index a4c2bbc..a645c1b 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -434,7 +434,7 @@ public:
 
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 
 	void pauseEngineIntern(bool pause) override;
diff --git a/engines/sherlock/sherlock.cpp b/engines/sherlock/sherlock.cpp
index ce000d0..fa5e9da 100644
--- a/engines/sherlock/sherlock.cpp
+++ b/engines/sherlock/sherlock.cpp
@@ -279,7 +279,7 @@ Common::Error SherlockEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error SherlockEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error SherlockEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	_saves->saveGame(slot, desc);
 	return Common::kNoError;
 }
diff --git a/engines/sherlock/sherlock.h b/engines/sherlock/sherlock.h
index c9db8cd..cbd82c8 100644
--- a/engines/sherlock/sherlock.h
+++ b/engines/sherlock/sherlock.h
@@ -162,7 +162,7 @@ public:
 	/**
 	 * Called by the GMM to save the game
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Called by the engine when sound settings are updated
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index 8ebb0e1..6fe2a51 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -317,7 +317,7 @@ Common::Error SkyEngine::loadGameState(int slot) {
 	return (result == GAME_RESTORED) ? Common::kNoError : Common::kUnknownError;
 }
 
-Common::Error SkyEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error SkyEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	if (slot == 0)
 		return Common::kWritePermissionDenied;	// we can't overwrite the auto save
 
diff --git a/engines/sky/sky.h b/engines/sky/sky.h
index b802d8c..c5deb20 100644
--- a/engines/sky/sky.h
+++ b/engines/sky/sky.h
@@ -87,7 +87,7 @@ public:
 	static bool isCDVersion();
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3f69d54..bc4ac19 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -666,7 +666,7 @@ bool SupernovaEngine::canSaveGameStateCurrently() {
 	return _allowSaveGame && _gm->canSaveGameStateCurrently();
 }
 
-Common::Error SupernovaEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error SupernovaEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return (saveGame(slot, desc) ? Common::kNoError : Common::kWritingFailed);
 }
 
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 84f82b8..60f552a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -67,7 +67,7 @@ public:
 	Common::Error run() override;
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 	bool hasFeature(EngineFeature f) const override;
 	void pauseEngineIntern(bool pause) override;
diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp
index d9742dd..4188d3d 100644
--- a/engines/sword1/detection.cpp
+++ b/engines/sword1/detection.cpp
@@ -366,7 +366,7 @@ bool SwordEngine::canLoadGameStateCurrently() {
 	return (mouseIsActive() && !_control->isPanelShown()); // Disable GMM loading when game panel is shown
 }
 
-Common::Error SwordEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error SwordEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	_control->setSaveDescription(slot, desc.c_str());
 	_control->saveGameToFile(slot);
 	return Common::kNoError;    // TODO: return success/failure
diff --git a/engines/sword1/sword1.h b/engines/sword1/sword1.h
index c90630a..f63977f 100644
--- a/engines/sword1/sword1.h
+++ b/engines/sword1/sword1.h
@@ -110,7 +110,7 @@ protected:
 
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 
 private:
diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp
index fafdddc..95855e4 100644
--- a/engines/sword2/sword2.cpp
+++ b/engines/sword2/sword2.cpp
@@ -824,7 +824,7 @@ uint32 Sword2Engine::getMillis() {
 	return _system->getMillis();
 }
 
-Common::Error Sword2Engine::saveGameState(int slot, const Common::String &desc) {
+Common::Error Sword2Engine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	uint32 saveVal = saveGame(slot, (const byte *)desc.c_str());
 
 	if (saveVal == SR_OK)
diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h
index 0d77805..7e035a7 100644
--- a/engines/sword2/sword2.h
+++ b/engines/sword2/sword2.h
@@ -163,7 +163,7 @@ public:
 	void setSubtitles(bool b) { _useSubtitles = b; }
 
 	// GMM Loading/Saving
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
diff --git a/engines/sword25/sword25.h b/engines/sword25/sword25.h
index 9b58cf9..d69d34a 100644
--- a/engines/sword25/sword25.h
+++ b/engines/sword25/sword25.h
@@ -80,7 +80,7 @@ protected:
 // 	void pauseEngineIntern(bool pause);	// TODO: Implement this!!!
 // 	void syncSoundSettings();	// TODO: Implement this!!!
 // 	Common::Error loadGameState(int slot);	// TODO: Implement this?
-// 	Common::Error saveGameState(int slot, const Common::String &desc);	// TODO: Implement this?
+// 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false);	// TODO: Implement this?
 // 	bool canLoadGameStateCurrently();	// TODO: Implement this?
 // 	bool canSaveGameStateCurrently();	// TODO: Implement this?
 
diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp
index c97902f..8499e37 100644
--- a/engines/teenagent/teenagent.cpp
+++ b/engines/teenagent/teenagent.cpp
@@ -263,7 +263,7 @@ Common::Error TeenAgentEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error TeenAgentEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error TeenAgentEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	debug(0, "saving to slot %d", slot);
 	Common::ScopedPtr<Common::OutSaveFile> out(_saveFileMan->openForSaving(Common::String::format("teenagent.%02d", slot)));
 	if (!out)
diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h
index f0324ab..0906e45 100644
--- a/engines/teenagent/teenagent.h
+++ b/engines/teenagent/teenagent.h
@@ -88,7 +88,7 @@ public:
 
 	Common::Error run() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override { return true; }
 	bool canSaveGameStateCurrently() override { return !_sceneBusy; }
 	bool hasFeature(EngineFeature f) const override;
diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp
index 7218b89..c686cad 100644
--- a/engines/tinsel/detection.cpp
+++ b/engines/tinsel/detection.cpp
@@ -440,7 +440,7 @@ Common::Error TinselEngine::loadGameState(int slot) {
 }
 
 #if 0
-Common::Error TinselEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error TinselEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String saveName = _vm->getSavegameFilename((int16)(slot + 1));
 	char saveDesc[SG_DESC_LEN];
 	Common::strlcpy(saveDesc, desc, SG_DESC_LEN);
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index 1917a8a..a99f9e1 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -164,7 +164,7 @@ protected:
 	bool hasFeature(EngineFeature f) const override;
 	Common::Error loadGameState(int slot) override;
 #if 0
-	Common::Error saveGameState(int slot, const Common::String &desc);
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false);
 #endif
 	bool canLoadGameStateCurrently() override;
 #if 0
diff --git a/engines/titanic/titanic.cpp b/engines/titanic/titanic.cpp
index f11e851..b6df256 100644
--- a/engines/titanic/titanic.cpp
+++ b/engines/titanic/titanic.cpp
@@ -231,7 +231,7 @@ Common::Error TitanicEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error TitanicEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error TitanicEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	_window->_project->saveGame(slot, desc);
 	return Common::kNoError;
 }
diff --git a/engines/titanic/titanic.h b/engines/titanic/titanic.h
index 1dab3e5..e1ce596 100644
--- a/engines/titanic/titanic.h
+++ b/engines/titanic/titanic.h
@@ -149,7 +149,7 @@ public:
 	/**
 	 * Called by the GMM to save the game
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Handles updates to the sound levels
diff --git a/engines/toltecs/saveload.cpp b/engines/toltecs/saveload.cpp
index 1f2198f..a5b9afb 100644
--- a/engines/toltecs/saveload.cpp
+++ b/engines/toltecs/saveload.cpp
@@ -205,7 +205,7 @@ Common::Error ToltecsEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error ToltecsEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error ToltecsEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	const char *fileName = getSavegameFilename(slot);
 	savegame(fileName, description.c_str());
 	return Common::kNoError;
diff --git a/engines/toltecs/toltecs.h b/engines/toltecs/toltecs.h
index aed237a..31c3194 100644
--- a/engines/toltecs/toltecs.h
+++ b/engines/toltecs/toltecs.h
@@ -215,7 +215,7 @@ public:
 	bool canLoadGameStateCurrently() override { return _isSaveAllowed; }
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
 	void savegame(const char *filename, const char *description);
 	void loadgame(const char *filename);
 
diff --git a/engines/tony/tony.cpp b/engines/tony/tony.cpp
index 5bcfd84..e451ac4 100644
--- a/engines/tony/tony.cpp
+++ b/engines/tony/tony.cpp
@@ -752,7 +752,7 @@ Common::Error TonyEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error TonyEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error TonyEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	if (!GLOBALS._gfxEngine)
 		return Common::kUnknownError;
 
diff --git a/engines/tony/tony.h b/engines/tony/tony.h
index e963c48..f357351 100644
--- a/engines/tony/tony.h
+++ b/engines/tony/tony.h
@@ -165,7 +165,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	void play();
 	void close();
diff --git a/engines/toon/toon.h b/engines/toon/toon.h
index 5a64718..e1f17c6 100644
--- a/engines/toon/toon.h
+++ b/engines/toon/toon.h
@@ -317,7 +317,7 @@ public:
 		return _shouldQuit;
 	}
 
-	Common::Error saveGameState(int slot, const Common::String &desc) override {
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override {
 		return (saveGame(slot, desc) ? Common::kNoError : Common::kWritingFailed);
 	}
 
diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp
index d44a3d4..36ffcc1 100644
--- a/engines/touche/saveload.cpp
+++ b/engines/touche/saveload.cpp
@@ -319,7 +319,7 @@ void ToucheEngine::loadGameStateData(Common::ReadStream *stream) {
 	debug(0, "Loaded state, current episode %d", _currentEpisodeNum);
 }
 
-Common::Error ToucheEngine::saveGameState(int num, const Common::String &description) {
+Common::Error ToucheEngine::saveGameState(int num, const Common::String &description, bool isAutosave) {
 	bool saveOk = false;
 	Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num);
 	Common::OutSaveFile *f = _saveFileMan->openForSaving(gameStateFileName);
diff --git a/engines/touche/touche.h b/engines/touche/touche.h
index dfc34e6..2cc1bed 100644
--- a/engines/touche/touche.h
+++ b/engines/touche/touche.h
@@ -604,7 +604,7 @@ protected:
 
 	void saveGameStateData(Common::WriteStream *stream);
 	void loadGameStateData(Common::ReadStream *stream);
-	Common::Error saveGameState(int num, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int num) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp
index 6de5e2e..b93b042 100644
--- a/engines/tsage/tsage.cpp
+++ b/engines/tsage/tsage.cpp
@@ -168,7 +168,7 @@ Common::Error TSageEngine::loadGameState(int slot) {
 /**
  * Save the game to the given slot index, and with the given name
  */
-Common::Error TSageEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error TSageEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return g_saver->save(slot, desc);
 }
 
diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h
index 57e00ea..5fb37bf 100644
--- a/engines/tsage/tsage.h
+++ b/engines/tsage/tsage.h
@@ -79,7 +79,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void syncSoundSettings() override;
 	Common::String generateSaveName(int slot);
 
diff --git a/engines/tucker/saveload.cpp b/engines/tucker/saveload.cpp
index 00911b9..ec34de3 100644
--- a/engines/tucker/saveload.cpp
+++ b/engines/tucker/saveload.cpp
@@ -234,7 +234,7 @@ TuckerEngine::SavegameError TuckerEngine::writeSavegameHeader(Common::OutSaveFil
 	return (file->err() ? kSavegameIoError : kSavegameNoError);
 }
 
-Common::Error TuckerEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error TuckerEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	return writeSavegame(slot, description, false);
 }
 
diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h
index 34a4f93..f3c5ac2 100644
--- a/engines/tucker/tucker.h
+++ b/engines/tucker/tucker.h
@@ -743,7 +743,7 @@ protected:
 
 	template<class S> SavegameError saveOrLoadGameStateData(S &s);
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error writeSavegame(int slot, const Common::String &description, bool autosave = false);
 	SavegameError writeSavegameHeader(Common::OutSaveFile *file, SavegameHeader &header);
 	void writeAutosave();
diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp
index 1b2837d..cd61306 100644
--- a/engines/voyeur/voyeur.cpp
+++ b/engines/voyeur/voyeur.cpp
@@ -806,7 +806,7 @@ void VoyeurEngine::loadGame(int slot) {
 /**
  * Save the game to the given slot index, and with the given name
  */
-Common::Error VoyeurEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error VoyeurEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	// Open the save file for writing
 	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(generateSaveName(slot));
 	if (!saveFile)
diff --git a/engines/voyeur/voyeur.h b/engines/voyeur/voyeur.h
index c262ae0..99540a6 100644
--- a/engines/voyeur/voyeur.h
+++ b/engines/voyeur/voyeur.h
@@ -209,7 +209,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void loadGame(int slot);
 
 	void playRL2Video(const Common::String &filename);
diff --git a/engines/wage/saveload.cpp b/engines/wage/saveload.cpp
index db7e91e..dddb49b 100644
--- a/engines/wage/saveload.cpp
+++ b/engines/wage/saveload.cpp
@@ -734,7 +734,7 @@ Common::Error WageEngine::loadGameState(int slot) {
 		return Common::kUnknownError;
 }
 
-Common::Error WageEngine::saveGameState(int slot, const Common::String &description) {
+Common::Error WageEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	Common::String saveLoadSlot = getSavegameFilename(slot);
 	if (saveGame(saveLoadSlot, description) == 0)
 		return Common::kNoError;
diff --git a/engines/wage/wage.h b/engines/wage/wage.h
index acf390a..2af7b9e 100644
--- a/engines/wage/wage.h
+++ b/engines/wage/wage.h
@@ -211,7 +211,7 @@ public:
 	void saveGame();
 
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &description) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool scummVMSaveLoadDialog(bool isSave);
 
 private:
diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp
index 1f02199..f0bb147 100644
--- a/engines/wintermute/wintermute.cpp
+++ b/engines/wintermute/wintermute.cpp
@@ -322,7 +322,7 @@ Common::Error WintermuteEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::Error WintermuteEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error WintermuteEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	BaseEngine::instance().getGameRef()->saveGame(slot, desc.c_str(), false);
 	return Common::kNoError;
 }
diff --git a/engines/wintermute/wintermute.h b/engines/wintermute/wintermute.h
index 9799cc5..8042e0e 100644
--- a/engines/wintermute/wintermute.h
+++ b/engines/wintermute/wintermute.h
@@ -65,7 +65,7 @@ public:
 	Common::SaveFileManager *getSaveFileMan() { return _saveFileMan; }
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
 	// For detection-purposes:
 	static bool getGameInfo(const Common::FSList &fslist, Common::String &name, Common::String &caption);
diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp
index 6b88a19..646e97b 100644
--- a/engines/xeen/saves.cpp
+++ b/engines/xeen/saves.cpp
@@ -115,7 +115,7 @@ void SavesManager::writeSavegameHeader(Common::OutSaveFile *out, XeenSavegameHea
 	out->writeUint32LE(events.playTime());
 }
 
-Common::Error SavesManager::saveGameState(int slot, const Common::String &desc) {
+Common::Error SavesManager::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
 		generateSaveName(slot));
 	if (!out)
diff --git a/engines/xeen/saves.h b/engines/xeen/saves.h
index d3352f1..791b2b7 100644
--- a/engines/xeen/saves.h
+++ b/engines/xeen/saves.h
@@ -84,7 +84,7 @@ public:
 	/**
 	 * Save the game
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc);
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false);
 
 	/**
 	 * Does an autosave
diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp
index fd0a041..5546155 100644
--- a/engines/xeen/xeen.cpp
+++ b/engines/xeen/xeen.cpp
@@ -184,7 +184,7 @@ int XeenEngine::getRandomNumber(int minNumber, int maxNumber) {
 	return getRandomNumber(maxNumber - minNumber) + minNumber;
 }
 
-Common::Error XeenEngine::saveGameState(int slot, const Common::String &desc) {
+Common::Error XeenEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	return _saves->saveGameState(slot, desc);
 }
 
diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h
index 52377cd..dceb632 100644
--- a/engines/xeen/xeen.h
+++ b/engines/xeen/xeen.h
@@ -264,7 +264,7 @@ public:
 	/**
 	 * Save the game
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 	/**
 	 * Updates sound settings
diff --git a/engines/zvision/detection.cpp b/engines/zvision/detection.cpp
index 7152b5f..6b01fe9 100644
--- a/engines/zvision/detection.cpp
+++ b/engines/zvision/detection.cpp
@@ -106,7 +106,7 @@ Common::Error ZVision::ZVision::loadGameState(int slot) {
 	return _saveManager->loadGame(slot);
 }
 
-Common::Error ZVision::ZVision::saveGameState(int slot, const Common::String &desc) {
+Common::Error ZVision::ZVision::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	_saveManager->saveGame(slot, desc, false);
 	return Common::kNoError;
 }
diff --git a/engines/zvision/zvision.h b/engines/zvision/zvision.h
index b098670..3469867 100644
--- a/engines/zvision/zvision.h
+++ b/engines/zvision/zvision.h
@@ -242,7 +242,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
-	Common::Error saveGameState(int slot, const Common::String &desc) override;
+	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 
 private:
 	void initialize();


Commit: 30d34fa63d1f5ccf37dfd9c80b0009c4115e78f2
    https://github.com/scummvm/scummvm/commit/30d34fa63d1f5ccf37dfd9c80b0009c4115e78f2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Implement autosaving in the Engine base class

Changed paths:
    backends/events/default/default-events.cpp
    engines/engine.cpp
    engines/engine.h


diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index 6554663..9565d11 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -89,6 +89,10 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
 		handleKeyRepeat();
 	}
 
+	if (g_engine)
+		// Handle autosaves if enabled
+		g_engine->handleAutoSave();
+
 	if (_eventQueue.empty()) {
 		return false;
 	}
diff --git a/engines/engine.cpp b/engines/engine.cpp
index 1a66089..c9582a5 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -148,7 +148,9 @@ Engine::Engine(OSystem *syst)
 		_saveSlotToLoad(-1),
 		_engineStartTime(_system->getMillis()),
 		_mainMenuDialog(NULL),
-		_debugger(NULL) {
+		_debugger(NULL),
+		_autosaveInterval(ConfMan.getInt("autosave_period")),
+		_lastAutosaveTime(_system->getMillis()) {
 
 	g_engine = this;
 	Common::setErrorOutputFormatter(defaultOutputFormatter);
@@ -482,10 +484,16 @@ void Engine::checkCD() {
 #endif
 }
 
-bool Engine::shouldPerformAutoSave(int lastSaveTime) {
-	const int diff = _system->getMillis() - lastSaveTime;
-	const int autosavePeriod = ConfMan.getInt("autosave_period");
-	return autosavePeriod != 0 && diff > autosavePeriod * 1000;
+void Engine::handleAutoSave() {
+	const int diff = _system->getMillis() - _lastAutosaveTime;
+
+	if (_autosaveInterval != 0 && diff > (_autosaveInterval * 1000)) {
+		// Save the autosave
+		saveGameState(getAutosaveSlot(), _("Autosave"), true);
+
+		// Reset the last autosave time
+		_lastAutosaveTime = _system->getMillis();
+	}
 }
 
 void Engine::errorString(const char *buf1, char *buf2, int size) {
diff --git a/engines/engine.h b/engines/engine.h
index 38ed829..c60dffa 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -92,6 +92,16 @@ private:
 	int32 _engineStartTime;
 
 	/**
+	 * Autosave interval
+	 */
+	const int _autosaveInterval;
+
+	/**
+	 * The last time an autosave was done
+	 */
+	int _lastAutosaveTime;
+
+	/**
 	 * Save slot selected via global main menu.
 	 * This slot will be loaded after main menu execution (not from inside
 	 * the menu loop, to avoid bugs like #2822778).
@@ -290,7 +300,6 @@ public:
 	bool loadGameDialog();
 
 protected:
-
 	/**
 	 * Actual implementation of pauseEngine by subclasses. See there
 	 * for details.
@@ -367,17 +376,27 @@ public:
 	inline Common::SaveFileManager *getSaveFileManager() { return _saveFileMan; }
 
 public:
-
 	/** On some systems, check if the game appears to be run from CD. */
 	void checkCD();
 
-protected:
 
 	/**
-	 * Indicate whether an autosave should be performed.
+	 * Checks for whether it's time to do an autosave, and if so, does it.
 	 */
-	bool shouldPerformAutoSave(int lastSaveTime);
+	void handleAutoSave();
 
+	/**
+	 * Returns the slot that should be used for autosaves
+	 */
+	virtual int getAutosaveSlot() const {
+		return 0;
+	}
+
+	bool shouldPerformAutoSave(int lastSaveTime) {
+		// TODO: Remove deprecated method once all engines are refactored
+		// to no longer do autosaves directly themselves
+		return false;
+	}
 };
 
 // Chained games


Commit: af265a12acdcca3aaf812d5273671913ed9625dc
    https://github.com/scummvm/scummvm/commit/af265a12acdcca3aaf812d5273671913ed9625dc
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
GRIFFON: Remove autosave code

Changed paths:
    engines/griffon/engine.cpp
    engines/griffon/griffon.cpp
    engines/griffon/griffon.h


diff --git a/engines/griffon/engine.cpp b/engines/griffon/engine.cpp
index 9da522d..524ffd4 100644
--- a/engines/griffon/engine.cpp
+++ b/engines/griffon/engine.cpp
@@ -97,7 +97,6 @@ void GriffonEngine::mainLoop() {
 
 		checkTrigger();
 		checkInputs();
-		autoSaveCheck();
 
 		if (!_forcePause)
 			handleWalking();
diff --git a/engines/griffon/griffon.cpp b/engines/griffon/griffon.cpp
index ace6ba9..b92c47f 100644
--- a/engines/griffon/griffon.cpp
+++ b/engines/griffon/griffon.cpp
@@ -61,7 +61,6 @@ GriffonEngine::GriffonEngine(OSystem *syst) : Engine(syst) {
 
 	_shouldQuit = false;
 	_gameMode = kGameModeIntro;
-	_lastAutosaveTime = g_system->getMillis();
 
 	_musicChannel = -1;
 	_menuChannel = -1;
@@ -187,11 +186,4 @@ Common::Error GriffonEngine::run() {
 	return Common::kNoError;
 }
 
-void GriffonEngine::autoSaveCheck() {
-	if (shouldPerformAutoSave(_lastAutosaveTime) && canSaveGameStateCurrently()) {
-		saveGameState(4, _("Autosave"), true);
-		_lastAutosaveTime = g_system->getMillis();
-	}
-}
-
 }
diff --git a/engines/griffon/griffon.h b/engines/griffon/griffon.h
index 69804c8..82abbeb 100644
--- a/engines/griffon/griffon.h
+++ b/engines/griffon/griffon.h
@@ -340,7 +340,6 @@ private:
 	Common::RandomSource *_rnd;
 	bool _shouldQuit;
 	int _gameMode;
-	uint32 _lastAutosaveTime;
 
 	Console *_console;
 
@@ -420,7 +419,6 @@ private:
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameStream(Common::SeekableReadStream *file) override;
 	Common::Error saveGameStream(Common::WriteStream *file, bool isAutosave) override;
-	void autoSaveCheck();
 
 	// sound.cpp
 	void setChannelVolume(int channel, int volume);
@@ -435,6 +433,7 @@ private:
 
 	bool canLoadGameStateCurrently() override { return true; }
 	bool canSaveGameStateCurrently() override { return _gameMode == kGameModePlay; }
+	int getAutosaveSlot() const override { return 4; }
 	bool hasFeature(EngineFeature f) const override;
 
 private:


Commit: 128bd50051ee46080a7d54d0dd20fa760afd3762
    https://github.com/scummvm/scummvm/commit/128bd50051ee46080a7d54d0dd20fa760afd3762
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
AGI: Remove autosave code

Changed paths:
    engines/agi/agi.cpp
    engines/agi/agi.h
    engines/agi/cycle.cpp
    engines/agi/saveload.cpp
    engines/agi/systemui.cpp
    engines/illusions/saveload.cpp


diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp
index 8382b10..af7377b 100644
--- a/engines/agi/agi.cpp
+++ b/engines/agi/agi.cpp
@@ -399,8 +399,6 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas
 
 	_setVolumeBrokenFangame = false; // for further study see AgiEngine::setVolumeViaScripts()
 
-	_lastSaveTime = 0;
-
 	_playTimeInSecondsAdjust = 0;
 	_lastUsedPlayTimeInCycles = 0;
 	_lastUsedPlayTimeInSeconds = 0;
@@ -485,8 +483,6 @@ void AgiEngine::initialize() {
 
 	_game.name[0] = '\0';
 
-	_lastSaveTime = 0;
-
 	debugC(2, kDebugLevelMain, "Detect game");
 
 	if (agiDetectGame() == errOK) {
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index d0ed6c1..311e368 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -840,8 +840,6 @@ protected:
 
 	void initialize() override;
 
-	uint32 _lastSaveTime;
-
 public:
 	AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc);
 	~AgiEngine() override;
@@ -870,7 +868,6 @@ public:
 	StringData _stringdata;
 
 	SavedGameSlotIdArray getSavegameSlotIds();
-	Common::String getSavegameFilename(int16 slotId) const;
 	bool getSavegameInformation(int16 slotId, Common::String &saveDescription, uint32 &saveDate, uint32 &saveTime, bool &saveIsValid);
 
 	int saveGame(const Common::String &fileName, const Common::String &descriptionString);
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index 32217ff..674b902 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -449,10 +449,6 @@ int AgiEngine::playGame() {
 			setVar(VM_VAR_KEY, 0);
 		}
 
-		if (shouldPerformAutoSave(_lastSaveTime)) {
-			saveGame(getSavegameFilename(0), "Autosave");
-		}
-
 	} while (!(shouldQuit() || _restartGame));
 
 	_sound->stopSound();
diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp
index f1a851e..29dd41a 100644
--- a/engines/agi/saveload.cpp
+++ b/engines/agi/saveload.cpp
@@ -332,8 +332,6 @@ int AgiEngine::saveGame(const Common::String &fileName, const Common::String &de
 	delete out;
 	debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName.c_str());
 
-	_lastSaveTime = _system->getMillis();
-
 	return result;
 }
 
@@ -787,7 +785,7 @@ int AgiEngine::scummVMSaveLoadDialog(bool isSave) {
 }
 
 int AgiEngine::doSave(int slot, const Common::String &desc) {
-	Common::String fileName = getSavegameFilename(slot);
+	Common::String fileName = getSaveStateName(slot);
 	debugC(8, kDebugLevelMain | kDebugLevelResources, "file is [%s]", fileName.c_str());
 
 	// Make sure all graphics was blitted to screen. This fixes bug
@@ -799,7 +797,7 @@ int AgiEngine::doSave(int slot, const Common::String &desc) {
 }
 
 int AgiEngine::doLoad(int slot, bool showMessages) {
-	Common::String fileName = getSavegameFilename(slot);
+	Common::String fileName = getSaveStateName(slot);
 	debugC(8, kDebugLevelMain | kDebugLevelResources, "file is [%s]", fileName.c_str());
 
 	_sprites->eraseSprites();
@@ -847,15 +845,9 @@ SavedGameSlotIdArray AgiEngine::getSavegameSlotIds() {
 	return slotIdArray;
 }
 
-Common::String AgiEngine::getSavegameFilename(int16 slotId) const {
-	Common::String saveLoadSlot = _targetName;
-	saveLoadSlot += Common::String::format(".%.3d", slotId);
-	return saveLoadSlot;
-}
-
 bool AgiEngine::getSavegameInformation(int16 slotId, Common::String &saveDescription, uint32 &saveDate, uint32 &saveTime, bool &saveIsValid) {
 	Common::InSaveFile *in;
-	Common::String fileName = getSavegameFilename(slotId);
+	Common::String fileName = getSaveStateName(slotId);
 	char saveGameDescription[31];
 	int16 curPos = 0;
 	byte  saveVersion = 0;
@@ -1056,7 +1048,7 @@ void AgiEngine::releaseImageStack() {
 
 void AgiEngine::checkQuickLoad() {
 	if (ConfMan.hasKey("save_slot")) {
-		Common::String saveNameBuffer = getSavegameFilename(ConfMan.getInt("save_slot"));
+		Common::String saveNameBuffer = getSaveStateName(ConfMan.getInt("save_slot"));
 
 		_sprites->eraseSprites();
 		_sound->stopSound();
@@ -1069,7 +1061,7 @@ void AgiEngine::checkQuickLoad() {
 }
 
 Common::Error AgiEngine::loadGameState(int slot) {
-	Common::String saveLoadSlot = getSavegameFilename(slot);
+	Common::String saveLoadSlot = getSaveStateName(slot);
 
 	_sprites->eraseSprites();
 	_sound->stopSound();
@@ -1084,7 +1076,7 @@ Common::Error AgiEngine::loadGameState(int slot) {
 }
 
 Common::Error AgiEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
-	Common::String saveLoadSlot = getSavegameFilename(slot);
+	Common::String saveLoadSlot = getSaveStateName(slot);
 	if (saveGame(saveLoadSlot, description) == errOK)
 		return Common::kNoError;
 	else
diff --git a/engines/agi/systemui.cpp b/engines/agi/systemui.cpp
index 4698b75..f2304ea 100644
--- a/engines/agi/systemui.cpp
+++ b/engines/agi/systemui.cpp
@@ -745,7 +745,7 @@ void SystemUI::drawSavedGameSlotSelector(bool active) {
 bool SystemUI::askForSavedGameVerification(const char *verifyText, const char *verifyButton1, const char *verifyButton2, const char *actualDescription, int16 slotId) {
 	char displayDescription[SYSTEMUI_SAVEDGAME_DISPLAYTEXT_LEN + 1];
 	Common::String userActionVerify;
-	Common::String savedGameFilename = _vm->getSavegameFilename(slotId);
+	Common::String savedGameFilename = _vm->getSaveStateName(slotId);
 
 	createSavedGameDisplayText(displayDescription, actualDescription, slotId, false);
 	userActionVerify = Common::String::format(verifyText, displayDescription, savedGameFilename.c_str());
diff --git a/engines/illusions/saveload.cpp b/engines/illusions/saveload.cpp
index f46496a..a02c080 100644
--- a/engines/illusions/saveload.cpp
+++ b/engines/illusions/saveload.cpp
@@ -133,7 +133,7 @@ Common::Error IllusionsEngine::loadGameState(int slot) {
 	_savegameSlotNum = slot;
 	return Common::kNoError;
 }
-
+ 
 Common::Error IllusionsEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
 	const char *fileName = getSavegameFilename(slot);
 	if (!savegame(fileName, description.c_str()))


Commit: b1197cf26b13c6a6bd6642a312610d4cd13dabce
    https://github.com/scummvm/scummvm/commit/b1197cf26b13c6a6bd6642a312610d4cd13dabce
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
COMPOSER: Remove autosave code

Changed paths:
    engines/composer/composer.cpp
    engines/composer/composer.h
    engines/composer/saveload.cpp


diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp
index 17ad32c..97c0cd5 100644
--- a/engines/composer/composer.cpp
+++ b/engines/composer/composer.cpp
@@ -123,7 +123,6 @@ Common::Error ComposerEngine::run() {
 	else
 		warning("FPS in book.ini is zero. Defaulting to 8...");
 	uint32 lastDrawTime = 0;
-	_lastSaveTime = _system->getMillis();
 
 	bool loadFromLauncher = ConfMan.hasKey("save_slot");
 
@@ -179,8 +178,7 @@ Common::Error ComposerEngine::run() {
 			loadGameState(ConfMan.getInt("save_slot"));
 			loadFromLauncher = false;
 		}
-		if (shouldPerformAutoSave(_lastSaveTime))
-			saveGameState(0, "Autosave");
+
 		while (_eventMan->pollEvent(event)) {
 			switch (event.type) {
 			case Common::EVENT_LBUTTONDOWN:
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
index b717c47..de2f2b7 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -193,7 +193,7 @@ private:
 	Audio::QueuingAudioStream *_audioStream;
 	uint16 _currSoundPriority;
 
-	uint32 _currentTime, _lastTime, _timeDelta, _lastSaveTime;
+	uint32 _currentTime, _lastTime, _timeDelta;
 
 	bool _needsUpdate;
 	Common::Array<Common::Rect> _dirtyRects;
diff --git a/engines/composer/saveload.cpp b/engines/composer/saveload.cpp
index 56dad66..bdd67e2 100644
--- a/engines/composer/saveload.cpp
+++ b/engines/composer/saveload.cpp
@@ -366,17 +366,12 @@ Common::Error ComposerEngine::loadGameState(int slot) {
 	if (!_mixer->isSoundHandleActive(_soundHandle))
 		_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, _audioStream);
 
-
-	// Reset autosave duration on load
-	_lastSaveTime = _system->getMillis();
-
 	return Common::kNoError;
 }
 
 Common::Error ComposerEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String filename = makeSaveGameName(slot);
 	Common::OutSaveFile *out;
-	_lastSaveTime = _system->getMillis();
 	if (!(out = _saveFileMan->openForSaving(filename)))
 		return Common::kWritingFailed;
 


Commit: 429cfd1cadd0007c5b3672c3d89b869faadfa44e
    https://github.com/scummvm/scummvm/commit/429cfd1cadd0007c5b3672c3d89b869faadfa44e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
KYRA: Remove autosave code

Changed paths:
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/kyra_v1.cpp
    engines/kyra/gui/gui_hof.cpp
    engines/kyra/gui/gui_mr.cpp
    engines/kyra/gui/saveload.cpp
    engines/kyra/kyra_v1.h


diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 002c7c2..e4d9f17 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -560,9 +560,6 @@ Common::Error EoBCoreEngine::init() {
 	memset(_monsterStoneOverlay, (_flags.platform == Common::kPlatformAmiga) ? guiSettings()->colors.guiColorWhite : 0x0D, 16 * sizeof(uint8));
 	_monsterFlashOverlay[0] = _monsterStoneOverlay[0] = 0;
 
-	// Prevent autosave on game startup
-	_lastAutosave = _system->getMillis();
-
 	return Common::kNoError;
 }
 
diff --git a/engines/kyra/engine/kyra_v1.cpp b/engines/kyra/engine/kyra_v1.cpp
index ccb6280..a2579fa 100644
--- a/engines/kyra/engine/kyra_v1.cpp
+++ b/engines/kyra/engine/kyra_v1.cpp
@@ -194,9 +194,6 @@ Common::Error KyraEngine_v1::init() {
 
 	setupKeyMap();
 
-	// Prevent autosave on game startup
-	_lastAutosave = _system->getMillis();
-
 	return Common::kNoError;
 }
 
@@ -251,9 +248,6 @@ int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop, int eventFlag)
 	updateInput();
 	_isSaveAllowed = false;
 
-	if (mainLoop)
-		checkAutosave();
-
 	int keys = 0;
 	int8 mouseWheel = 0;
 
diff --git a/engines/kyra/gui/gui_hof.cpp b/engines/kyra/gui/gui_hof.cpp
index 0b5d7ea..94e96fa 100644
--- a/engines/kyra/gui/gui_hof.cpp
+++ b/engines/kyra/gui/gui_hof.cpp
@@ -961,8 +961,6 @@ int GUI_HoF::gameOptionsTalkie(Button *caller) {
 		_vm->saveGameStateIntern(999, "Autosave", &thumb);
 		thumb.free();
 
-		_vm->_lastAutosave = _vm->_system->getMillis();
-
 		_vm->loadCCodeBuffer("C_CODE.XXX");
 		if (_vm->_flags.isTalkie)
 			_vm->loadOptionsBuffer("OPTIONS.XXX");
diff --git a/engines/kyra/gui/gui_mr.cpp b/engines/kyra/gui/gui_mr.cpp
index b115e30..f812daa 100644
--- a/engines/kyra/gui/gui_mr.cpp
+++ b/engines/kyra/gui/gui_mr.cpp
@@ -1341,8 +1341,6 @@ int GUI_MR::gameOptions(Button *caller) {
 		_vm->saveGameStateIntern(999, "Autosave", &thumb);
 		thumb.free();
 
-		_vm->_lastAutosave = _vm->_system->getMillis();
-
 		if (!_vm->loadLanguageFile("ITEMS.", _vm->_itemFile))
 			error("Couldn't load ITEMS");
 		if (!_vm->loadLanguageFile("SCORE.", _vm->_scoreFile))
diff --git a/engines/kyra/gui/saveload.cpp b/engines/kyra/gui/saveload.cpp
index 4f5044f..e3aafb1 100644
--- a/engines/kyra/gui/saveload.cpp
+++ b/engines/kyra/gui/saveload.cpp
@@ -254,13 +254,6 @@ bool KyraEngine_v1::saveFileLoadable(int slot) {
 	return false;
 }
 
-void KyraEngine_v1::checkAutosave() {
-	if (shouldPerformAutoSave(_lastAutosave)) {
-		saveGameStateIntern(999, "Autosave", 0);
-		_lastAutosave = _system->getMillis();
-	}
-}
-
 void KyraEngine_v1::loadGameStateCheck(int slot) {
 	// FIXME: Instead of throwing away the error returned by
 	// loadGameState, we should use it / augment it.
diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h
index 56434ea..bcda071 100644
--- a/engines/kyra/kyra_v1.h
+++ b/engines/kyra/kyra_v1.h
@@ -388,13 +388,11 @@ protected:
 	// save/load
 	int _gameToLoad;
 
-	uint32 _lastAutosave;
-	void checkAutosave();
-
 	bool _isSaveAllowed;
 
 	bool canLoadGameStateCurrently() override { return _isSaveAllowed; }
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
+	virtual int getAutosaveSlot() const override { return 999; }
 
 	const char *getSavegameFilename(int num);
 	Common::String _savegameFilename;


Commit: d35d91e6f613cb9c887aeba938b3c4e9944d741c
    https://github.com/scummvm/scummvm/commit/d35d91e6f613cb9c887aeba938b3c4e9944d741c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
MOHAWK: Remove autosave code

Changed paths:
    engines/engine.cpp
    engines/engine.h
    engines/mohawk/myst.cpp
    engines/mohawk/myst.h
    engines/mohawk/riven.cpp
    engines/mohawk/riven.h
    engines/mohawk/riven_saveload.cpp
    engines/mohawk/riven_saveload.h


diff --git a/engines/engine.cpp b/engines/engine.cpp
index c9582a5..56f84e3 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -489,7 +489,8 @@ void Engine::handleAutoSave() {
 
 	if (_autosaveInterval != 0 && diff > (_autosaveInterval * 1000)) {
 		// Save the autosave
-		saveGameState(getAutosaveSlot(), _("Autosave"), true);
+		if (canSaveAutosaveCurrently())
+			saveGameState(getAutosaveSlot(), _("Autosave"), true);
 
 		// Reset the last autosave time
 		_lastAutosaveTime = _system->getMillis();
diff --git a/engines/engine.h b/engines/engine.h
index c60dffa..49fddb2 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -386,6 +386,13 @@ public:
 	void handleAutoSave();
 
 	/**
+	 * Indicates whether an autosave can currently be saved.
+	 */
+	virtual bool canSaveAutosaveCurrently() {
+		return canSaveGameStateCurrently();
+	}
+
+	/**
 	 * Returns the slot that should be used for autosaves
 	 */
 	virtual int getAutosaveSlot() const {
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 8707475..5b54960 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -89,7 +89,6 @@ MohawkEngine_Myst::MohawkEngine_Myst(OSystem *syst, const MohawkGameDescription
 	_currentCursor = 0;
 	_mainCursor = kDefaultMystCursor;
 	_showResourceRects = false;
-	_lastSaveTime = 0;
 
 	_sound = nullptr;
 	_video = nullptr;
@@ -560,10 +559,6 @@ void MohawkEngine_Myst::doFrame() {
 		_waitingOnBlockingOperation = false;
 	}
 
-	if (shouldPerformAutoSave(_lastSaveTime)) {
-		tryAutoSaving();
-	}
-
 	Common::Event event;
 	while (_system->getEventManager()->pollEvent(event)) {
 		switch (event.type) {
@@ -629,11 +624,6 @@ void MohawkEngine_Myst::doFrame() {
 				break;
 			}
 			break;
-		case Common::EVENT_QUIT:
-		case Common::EVENT_RTL:
-			// Attempt to autosave before exiting
-			tryAutoSaving();
-			break;
 		default:
 			break;
 		}
@@ -960,8 +950,6 @@ MystArea *MohawkEngine_Myst::loadResource(Common::SeekableReadStream *rlstStream
 }
 
 Common::Error MohawkEngine_Myst::loadGameState(int slot) {
-	tryAutoSaving();
-
 	if (_gameState->load(slot))
 		return Common::kNoError;
 
@@ -977,24 +965,8 @@ Common::Error MohawkEngine_Myst::saveGameState(int slot, const Common::String &d
 	return _gameState->save(slot, desc, thumbnail, false) ? Common::kNoError : Common::kUnknownError;
 }
 
-void MohawkEngine_Myst::tryAutoSaving() {
-	if (!canSaveGameStateCurrently()) {
-		return; // Can't save right now, try again on the next frame
-	}
-
-	_lastSaveTime = _system->getMillis();
-
-	if (!_gameState->isAutoSaveAllowed()) {
-		return; // Can't autosave ever, try again after the next autosave delay
-	}
-
-	const Graphics::Surface *thumbnail = nullptr;
-	if (_stack->getStackId() == kMenuStack) {
-		thumbnail = _gfx->getThumbnailForMainMenu();
-	}
-
-	if (!_gameState->save(MystGameState::kAutoSaveSlot, "Autosave", thumbnail, true))
-		warning("Attempt to autosave has failed.");
+bool MohawkEngine_Myst::canSaveAutosaveCurrently() {
+	return canSaveGameStateCurrently() && _gameState->isAutoSaveAllowed();
 }
 
 bool MohawkEngine_Myst::hasGameSaveSupport() const {
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index 771a25b..e1686a6 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -189,7 +189,8 @@ public:
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
-	void tryAutoSaving();
+	virtual bool canSaveAutosaveCurrently() override;
+
 	bool hasFeature(EngineFeature f) const override;
 	static Common::Array<Common::Keymap *> initKeymaps(const char *target);
 
@@ -207,7 +208,6 @@ private:
 
 	MystCardPtr _card;
 	MystCardPtr _prevCard;
-	uint32 _lastSaveTime;
 
 	bool hasGameSaveSupport() const;
 	void pauseEngineIntern(bool pause) override;
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index 4262946..d100f31 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -229,10 +229,6 @@ void MohawkEngine_Riven::doFrame() {
 		_scriptMan->runQueuedScripts();
 	}
 
-	if (shouldPerformAutoSave(_lastSaveTime)) {
-		tryAutoSaving();
-	}
-
 	_inventory->onFrame();
 
 	// Update the screen once per frame
@@ -314,7 +310,6 @@ void MohawkEngine_Riven::processInput() {
 		case Common::EVENT_QUIT:
 		case Common::EVENT_RTL:
 			// Attempt to autosave before exiting
-			tryAutoSaving();
 			break;
 		default:
 			break;
@@ -751,23 +746,10 @@ void MohawkEngine_Riven::saveGameStateAndDisplayError(int slot, const Common::St
 	}
 }
 
-void MohawkEngine_Riven::tryAutoSaving() {
-	if (!canSaveGameStateCurrently() || _gameEnded) {
-		return; // Can't save right now, try again on the next frame
-	}
-
-	_lastSaveTime = _system->getMillis();
-
-	if (!_saveLoad->isAutoSaveAllowed()) {
-		return; // Can't autosave ever, try again after the next autosave delay
-	}
-
-	Common::Error saveError = saveGameState(RivenSaveLoad::kAutoSaveSlot, "Autosave", true);
-	if (saveError.getCode() != Common::kNoError)
-		warning("Attempt to autosave has failed.");
+bool MohawkEngine_Riven::canSaveAutosaveCurrently() {
+	return canSaveGameStateCurrently() && !_gameEnded;
 }
 
-
 void MohawkEngine_Riven::addZipVisitedCard(uint16 cardId, uint16 cardNameId) {
 	Common::String cardName = getStack()->getName(kCardNames, cardNameId);
 	if (cardName.empty())
@@ -844,7 +826,6 @@ void MohawkEngine_Riven::runOptionsDialog() {
 
 	if (hasGameEnded()) {
 		// Attempt to autosave before exiting
-		tryAutoSaving();
 	}
 
 	_gfx->setTransitionMode((RivenTransitionMode) _vars["transitionmode"]);
diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h
index ea2cb46..00298f0 100644
--- a/engines/mohawk/riven.h
+++ b/engines/mohawk/riven.h
@@ -166,7 +166,7 @@ public:
 	// Save / Load
 	void runLoadDialog();
 	void runSaveDialog();
-	void tryAutoSaving();
+	virtual bool canSaveAutosaveCurrently() override;
 	void loadGameStateAndDisplayError(int slot);
 	void saveGameStateAndDisplayError(int slot, const Common::String &desc);
 
diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp
index 7a156ad..ab73ad1 100644
--- a/engines/mohawk/riven_saveload.cpp
+++ b/engines/mohawk/riven_saveload.cpp
@@ -60,8 +60,6 @@ bool RivenSaveMetadata::sync(Common::Serializer &s) {
 	return true;
 }
 
-const int RivenSaveLoad::kAutoSaveSlot = 0;
-
 RivenSaveLoad::RivenSaveLoad(MohawkEngine_Riven *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) {
 }
 
@@ -110,7 +108,6 @@ SaveStateDescriptor RivenSaveLoad::querySaveMetaInfos(const int slot) {
 	Common::String filename = buildSaveFilename(slot);
 	Common::InSaveFile *loadFile = g_system->getSavefileManager()->openForLoading(filename);
 	SaveStateDescriptor descriptor;
-	descriptor.setWriteProtectedFlag(slot == kAutoSaveSlot);
 
 	if (!loadFile) {
 		return descriptor;
@@ -142,8 +139,6 @@ SaveStateDescriptor RivenSaveLoad::querySaveMetaInfos(const int slot) {
 	descriptor.setPlayTime(metadata.totalPlayTime);
 	descriptor.setSaveDate(metadata.saveYear, metadata.saveMonth, metadata.saveDay);
 	descriptor.setSaveTime(metadata.saveHour, metadata.saveMinute);
-	if (metadata.autoSave) // Allow non-saves to be deleted, but not autosaves
-		descriptor.setDeletableFlag(slot != kAutoSaveSlot);	
 
 	delete metaStream;
 
@@ -171,7 +166,7 @@ bool RivenSaveLoad::isAutoSaveAllowed() {
 	// Open autosave slot and see if it an autosave
 	// Autosaving will be enabled if it is an autosave or if there is no save in that slot
 
-	Common::String filename = buildSaveFilename(kAutoSaveSlot);
+	Common::String filename = buildSaveFilename(_vm->getAutosaveSlot());
 	Common::InSaveFile *loadFile = g_system->getSavefileManager()->openForLoading(filename);
 	if (!loadFile) {
 		return true; // There is no save in the autosave slot, enable autosave
diff --git a/engines/mohawk/riven_saveload.h b/engines/mohawk/riven_saveload.h
index 1682db3..fba8f28 100644
--- a/engines/mohawk/riven_saveload.h
+++ b/engines/mohawk/riven_saveload.h
@@ -59,8 +59,6 @@ struct RivenSaveMetadata {
 
 class RivenSaveLoad {
 public:
-	static const int kAutoSaveSlot;
-
 	RivenSaveLoad(MohawkEngine_Riven*, Common::SaveFileManager*);
 	~RivenSaveLoad();
 


Commit: a2a8229abef229e631f5be0d9f68c6394fbe859e
    https://github.com/scummvm/scummvm/commit/a2a8229abef229e631f5be0d9f68c6394fbe859e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Do an autosave before loading a new game

Unfortunately, this will only apply to new engines that
use the Engine::loadGameState method. Other existing engines call
loadGameState directly and provide their own implementations,
so there's nowhere convenient to add the call that'd work for
all of them

Changed paths:
    engines/engine.cpp
    engines/engine.h


diff --git a/engines/engine.cpp b/engines/engine.cpp
index 56f84e3..377bed4 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -489,14 +489,18 @@ void Engine::handleAutoSave() {
 
 	if (_autosaveInterval != 0 && diff > (_autosaveInterval * 1000)) {
 		// Save the autosave
-		if (canSaveAutosaveCurrently())
-			saveGameState(getAutosaveSlot(), _("Autosave"), true);
-
-		// Reset the last autosave time
-		_lastAutosaveTime = _system->getMillis();
+		saveAutosaveIfEnabled();
 	}
 }
 
+void Engine::saveAutosaveIfEnabled() {
+	if (_autosaveInterval != 0 && canSaveAutosaveCurrently())
+		saveGameState(getAutosaveSlot(), _("Autosave"), true);
+
+	// Reset the last autosave time
+	_lastAutosaveTime = _system->getMillis();
+}
+
 void Engine::errorString(const char *buf1, char *buf2, int size) {
 	Common::strlcpy(buf2, buf1, size);
 }
@@ -645,6 +649,9 @@ void Engine::flipMute() {
 }
 
 Common::Error Engine::loadGameState(int slot) {
+	// In case autosaves are on, do a save first before loading the new save
+	saveAutosaveIfEnabled();
+
 	Common::InSaveFile *saveFile = _saveFileMan->openForLoading(getSaveStateName(slot));
 
 	if (!saveFile)
diff --git a/engines/engine.h b/engines/engine.h
index 49fddb2..56bb6b4 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -386,6 +386,11 @@ public:
 	void handleAutoSave();
 
 	/**
+	 * Does an autosave immediately if autosaves are turned on
+	 */
+	void saveAutosaveIfEnabled();
+
+	/**
 	 * Indicates whether an autosave can currently be saved.
 	 */
 	virtual bool canSaveAutosaveCurrently() {


Commit: d97949857fd2904fac61de85b5da1a5807a817ca
    https://github.com/scummvm/scummvm/commit/d97949857fd2904fac61de85b5da1a5807a817ca
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
MOHAWK: Re-add saving autosave for Myst on quit

I haven't figured out a good way to an exit on save for all engines,
so I'm re-adding the save autosave on exit that Myst previously had,
to call the new common Engine autosave method

Changed paths:
    engines/mohawk/myst.cpp
    engines/mohawk/riven.cpp


diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 5b54960..86a0947 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -624,6 +624,11 @@ void MohawkEngine_Myst::doFrame() {
 				break;
 			}
 			break;
+		case Common::EVENT_QUIT:
+		case Common::EVENT_RTL:
+			// Attempt to autosave before exiting
+			saveAutosaveIfEnabled();
+			break;
 		default:
 			break;
 		}
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index d100f31..d4a89c5 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -310,6 +310,7 @@ void MohawkEngine_Riven::processInput() {
 		case Common::EVENT_QUIT:
 		case Common::EVENT_RTL:
 			// Attempt to autosave before exiting
+			saveAutosaveIfEnabled();
 			break;
 		default:
 			break;
@@ -826,6 +827,7 @@ void MohawkEngine_Riven::runOptionsDialog() {
 
 	if (hasGameEnded()) {
 		// Attempt to autosave before exiting
+		saveAutosaveIfEnabled();
 	}
 
 	_gfx->setTransitionMode((RivenTransitionMode) _vars["transitionmode"]);


Commit: 1c5cbbb18665996de382d27ec875e961051dbec4
    https://github.com/scummvm/scummvm/commit/1c5cbbb18665996de382d27ec875e961051dbec4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
QUEEN: Remove autosave code

Changed paths:
    engines/queen/queen.cpp
    engines/queen/queen.h


diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 2cdef5e..9a03733 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -154,10 +154,6 @@ void QueenEngine::update(bool checkPlayerInput) {
 			_input->quickLoadReset();
 			loadGameState(SLOT_QUICKSAVE);
 		}
-		if (shouldPerformAutoSave(_lastSaveTime)) {
-			saveGameState(SLOT_AUTOSAVE, "Autosave");
-			_lastSaveTime = _system->getMillis();
-		}
 	}
 	if (!_input->cutawayRunning()) {
 		if (checkPlayerInput) {
@@ -274,15 +270,20 @@ Common::InSaveFile *QueenEngine::readGameStateHeader(int slot, GameStateHeader *
 	return file;
 }
 
-void QueenEngine::makeGameStateName(int slot, char *buf) const {
+Common::String QueenEngine::getSaveStateName(int slot) const {
 	if (slot == SLOT_LISTPREFIX) {
-		strcpy(buf, "queen.s??");
+		return "queen.s??";
 	} else if (slot == SLOT_AUTOSAVE) {
-		strcpy(buf, "queen.asd");
-	} else {
-		assert(slot >= 0);
-		sprintf(buf, "queen.s%02d", slot);
+		slot = getAutosaveSlot();
 	}
+
+	assert(slot >= 0);
+	return Common::String::format("queen.s%02d", slot);
+}
+
+void QueenEngine::makeGameStateName(int slot, char *buf) const {
+	Common::String name = getSaveStateName(slot);
+	strcpy(buf, name.c_str());
 }
 
 int QueenEngine::getGameStateSlot(const char *filename) const {
@@ -354,7 +355,6 @@ Common::Error QueenEngine::run() {
 	if (ConfMan.hasKey("save_slot") && canLoadOrSave()) {
 		loadGameState(ConfMan.getInt("save_slot"));
 	}
-	_lastSaveTime = _lastUpdateTime = _system->getMillis();
 
 	while (!shouldQuit()) {
 		if (_logic->newRoom() > 0) {
diff --git a/engines/queen/queen.h b/engines/queen/queen.h
index 6204e26..7c6ddb2 100644
--- a/engines/queen/queen.h
+++ b/engines/queen/queen.h
@@ -98,6 +98,8 @@ public:
 	bool canSaveGameStateCurrently() override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
+	virtual int getAutosaveSlot() const { return 99; }
+	virtual Common::String getSaveStateName(int slot) const override;
 	void makeGameStateName(int slot, char *buf) const;
 	int getGameStateSlot(const char *filename) const;
 	void findGameStateDescriptions(char descriptions[100][32]);
@@ -126,7 +128,6 @@ protected:
 
 	int _talkSpeed;
 	bool _subtitles;
-	uint32 _lastSaveTime;
 	uint32 _lastUpdateTime;
 	bool _gameStarted;
 


Commit: 958cb0529519dbcc357cd21a18399bd79900523c
    https://github.com/scummvm/scummvm/commit/958cb0529519dbcc357cd21a18399bd79900523c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
SKY: Removed bulk of engine-specific autosave code

There's still some specific code remaining to keep the way the
existing autosave is handled the same, even though it now saves
it to slot 0, rather than with a .asd extension

Changed paths:
    engines/sky/control.cpp
    engines/sky/control.h
    engines/sky/detection.cpp
    engines/sky/sky.cpp
    engines/sky/sky.h


diff --git a/engines/sky/control.cpp b/engines/sky/control.cpp
index a7c39f7..b1835be 100644
--- a/engines/sky/control.cpp
+++ b/engines/sky/control.cpp
@@ -827,14 +827,8 @@ uint16 Control::shiftUp(uint8 speed) {
 
 bool Control::autoSaveExists() {
 	bool test = false;
-	Common::InSaveFile *f;
-	char fName[20];
-	if (SkyEngine::isCDVersion())
-		strcpy(fName, "SKY-VM-CD.ASD");
-	else
-		sprintf(fName, "SKY-VM%03d.ASD", SkyEngine::_systemVars.gameVersion);
-
-	f = _saveFileMan->openForLoading(fName);
+	Common::InSaveFile *f = _saveFileMan->openForLoading(
+		g_engine->getSaveStateName(g_engine->getAutosaveSlot()));
 	if (f != NULL) {
 		test = true;
 		delete f;
@@ -1124,24 +1118,10 @@ void Control::saveDescriptions(const Common::StringArray &list) {
 		displayMessage(NULL, "Unable to store Savegame names to file SKY-VM.SAV. (%s)", _saveFileMan->popErrorDesc().c_str());
 }
 
-void Control::doAutoSave() {
-	char fName[20];
-	if (SkyEngine::isCDVersion())
-		strcpy(fName, "SKY-VM-CD.ASD");
-	else
-		sprintf(fName, "SKY-VM%03d.ASD", SkyEngine::_systemVars.gameVersion);
-
-	uint16 res = saveGameToFile(false, fName);
-
-	if (res != GAME_SAVED)
-		displayMessage(0, "Unable to perform autosave to '%s'. (%s)", fName, _saveFileMan->popErrorDesc().c_str());
-
-}
-
-uint16 Control::saveGameToFile(bool fromControlPanel, const char *filename) {
+uint16 Control::saveGameToFile(bool fromControlPanel, const char *filename, bool isAutosave) {
 	char fName[20];
 	if (!filename) {
-		sprintf(fName,"SKY-VM.%03d", _selectedGame);
+		sprintf(fName,"SKY-VM.%03d", isAutosave ? 0 : _selectedGame + 1);
 		filename = fName;
 	}
 
@@ -1420,17 +1400,11 @@ uint16 Control::parseSaveData(uint8 *srcBuf) {
 
 
 uint16 Control::restoreGameFromFile(bool autoSave) {
-	char fName[20];
-	if (autoSave) {
-		if (SkyEngine::isCDVersion())
-			strcpy(fName, "SKY-VM-CD.ASD");
-		else
-			sprintf(fName, "SKY-VM%03d.ASD", SkyEngine::_systemVars.gameVersion);
-	} else
-		sprintf(fName,"SKY-VM.%03d", _selectedGame);
+	int slot = autoSave ? g_engine->getAutosaveSlot() : _selectedGame + 1;
+	Common::String filename = g_engine->getSaveStateName(slot);
 
 	Common::InSaveFile *inf;
-	inf = _saveFileMan->openForLoading(fName);
+	inf = _saveFileMan->openForLoading(filename);
 	if (inf == NULL) {
 		return RESTORE_FAILED;
 	}
@@ -1441,7 +1415,7 @@ uint16 Control::restoreGameFromFile(bool autoSave) {
 	*(uint32 *)saveData = TO_LE_32(infSize);
 
 	if (inf->read(saveData+4, infSize-4) != infSize-4) {
-		displayMessage(NULL, "Can't read from file '%s'", fName);
+		displayMessage(NULL, "Can't read from file '%s'", filename.c_str());
 		free(saveData);
 		delete inf;
 		return RESTORE_FAILED;
diff --git a/engines/sky/control.h b/engines/sky/control.h
index 76d0a20..0534fd3 100644
--- a/engines/sky/control.h
+++ b/engines/sky/control.h
@@ -185,12 +185,11 @@ public:
 	void doLoadSavePanel();
 	void restartGame();
 	void showGameQuitMsg();
-	void doAutoSave();
 	uint16 quickXRestore(uint16 slot);
 	bool loadSaveAllowed();
 
 	uint16 _selectedGame;
-	uint16 saveGameToFile(bool fromControlPanel, const char *filename = 0);
+	uint16 saveGameToFile(bool fromControlPanel, const char *filename = 0, bool isAutosave = false);
 
 	void loadDescriptions(Common::StringArray &list);
 	void saveDescriptions(const Common::StringArray &list);
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index 6fe2a51..cb412a6 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -233,11 +233,6 @@ SaveStateList SkyMetaEngine::listSaves(const char *target) const {
 	Common::StringArray filenames;
 	filenames = saveFileMan->listSavefiles("SKY-VM.###");
 
-	// Slot 0 is the autosave, if it exists.
-	// TODO: Check for the existence of the autosave -- but this require us
-	// to know which SKY variant we are looking at.
-	saveList.insert_at(0, SaveStateDescriptor(0, "*AUTOSAVE*"));
-
 	// Prepare the list of savestates by looping over all matching savefiles
 	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
 		// Extract the extension
@@ -246,7 +241,8 @@ SaveStateList SkyMetaEngine::listSaves(const char *target) const {
 		int slotNum = atoi(ext.c_str());
 		Common::InSaveFile *in = saveFileMan->openForLoading(*file);
 		if (in) {
-			saveList.push_back(SaveStateDescriptor(slotNum+1, savenames[slotNum]));
+			saveList.push_back(SaveStateDescriptor(slotNum,
+				(slotNum == 0) ? _("Autosave") : savenames[slotNum - 1]));
 			delete in;
 		}
 	}
@@ -264,7 +260,7 @@ void SkyMetaEngine::removeSaveState(const char *target, int slot) const {
 
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 	char fName[20];
-	sprintf(fName,"SKY-VM.%03d", slot - 1);
+	sprintf(fName,"SKY-VM.%03d", slot);
 	saveFileMan->removeSavefile(fName);
 
 	// Load current save game descriptions
@@ -285,7 +281,7 @@ void SkyMetaEngine::removeSaveState(const char *target, int slot) const {
 	}
 
 	// Update the save game description at the given slot
-	savenames[slot - 1] = "";
+	savenames[slot] = "";
 
 	// Save the updated descriptions
 	Common::OutSaveFile *outf;
@@ -313,17 +309,14 @@ void SkyMetaEngine::removeSaveState(const char *target, int slot) const {
 
 namespace Sky {
 Common::Error SkyEngine::loadGameState(int slot) {
-	uint16 result = _skyControl->quickXRestore(slot);
+	uint16 result = _skyControl->quickXRestore(slot - 1);
 	return (result == GAME_RESTORED) ? Common::kNoError : Common::kUnknownError;
 }
 
 Common::Error SkyEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	if (slot == 0)
-		return Common::kWritePermissionDenied;	// we can't overwrite the auto save
-
 	// Set the save slot and save the game
-	_skyControl->_selectedGame = slot - 1;
-	if (_skyControl->saveGameToFile(false) != GAME_SAVED)
+	_skyControl->_selectedGame = isAutosave ? 0 : slot - 1;
+	if (_skyControl->saveGameToFile(false, nullptr, isAutosave) != GAME_SAVED)
 		return Common::kWritePermissionDenied;
 
 	// Load current save game descriptions
@@ -332,7 +325,9 @@ Common::Error SkyEngine::saveGameState(int slot, const Common::String &desc, boo
 	_skyControl->loadDescriptions(saveGameTexts);
 
 	// Update the save game description at the given slot
-	saveGameTexts[slot - 1] = desc;
+	if (!isAutosave)
+		saveGameTexts[slot - 1] = desc;
+
 	// Save the updated descriptions
 	_skyControl->saveDescriptions(saveGameTexts);
 
diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp
index 17785c0..7650802 100644
--- a/engines/sky/sky.cpp
+++ b/engines/sky/sky.cpp
@@ -186,17 +186,8 @@ Common::Error SkyEngine::go() {
 		}
 	}
 
-	_lastSaveTime = _system->getMillis();
-
 	uint32 delayCount = _system->getMillis();
 	while (!shouldQuit()) {
-		if (shouldPerformAutoSave(_lastSaveTime)) {
-			if (_skyControl->loadSaveAllowed()) {
-				_lastSaveTime = _system->getMillis();
-				_skyControl->doAutoSave();
-			} else
-				_lastSaveTime += 30 * 1000; // try again in 30 secs
-		}
 		_skySound->checkFxQueue();
 		_skyMouse->mouseEngine();
 		handleKey();
diff --git a/engines/sky/sky.h b/engines/sky/sky.h
index c5deb20..2e505b4 100644
--- a/engines/sky/sky.h
+++ b/engines/sky/sky.h
@@ -90,6 +90,9 @@ public:
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
+	virtual Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("SKY-VM.%03d", slot);
+	}
 
 	static void *fetchItem(uint32 num);
 	static void *_itemList[300];
@@ -115,8 +118,6 @@ protected:
 	void delay(int32 amount);
 	void handleKey();
 
-	uint32 _lastSaveTime;
-
 	void initItemList();
 
 	void initVirgin();


Commit: 6c187dbb30cce1c14587bd3fa5f095a3ef5706c2
    https://github.com/scummvm/scummvm/commit/6c187dbb30cce1c14587bd3fa5f095a3ef5706c2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
TUCKER: Changing autosave to work with common Engine code

Changed paths:
    engines/tucker/saveload.cpp
    engines/tucker/tucker.cpp
    engines/tucker/tucker.h


diff --git a/engines/tucker/saveload.cpp b/engines/tucker/saveload.cpp
index ec34de3..763aca5 100644
--- a/engines/tucker/saveload.cpp
+++ b/engines/tucker/saveload.cpp
@@ -93,7 +93,7 @@ TuckerEngine::SavegameError TuckerEngine::saveOrLoadGameStateData(S &s) {
 }
 
 Common::Error TuckerEngine::loadGameState(int slot) {
-	Common::String fileName = generateGameStateFileName(_targetName.c_str(), slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::InSaveFile *file = _saveFileMan->openForLoading(fileName);
 
 	if (!file) {
@@ -235,11 +235,7 @@ TuckerEngine::SavegameError TuckerEngine::writeSavegameHeader(Common::OutSaveFil
 }
 
 Common::Error TuckerEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
-	return writeSavegame(slot, description, false);
-}
-
-Common::Error TuckerEngine::writeSavegame(int slot, const Common::String &description, bool autosave) {
-	Common::String fileName = generateGameStateFileName(_targetName.c_str(), slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::OutSaveFile *file = _saveFileMan->openForSaving(fileName);
 	SavegameHeader header;
 	SavegameError savegameError = kSavegameNoError;
@@ -249,7 +245,7 @@ Common::Error TuckerEngine::writeSavegame(int slot, const Common::String &descri
 
 	if (!savegameError) {
 		// savegame flags
-		if (autosave)
+		if (isAutosave)
 			header.flags |= kSavegameFlagAutosave;
 
 		// description
@@ -274,7 +270,7 @@ Common::Error TuckerEngine::writeSavegame(int slot, const Common::String &descri
 	return Common::kNoError;
 }
 
-bool TuckerEngine::isAutosaveAllowed() {
+bool TuckerEngine::canSaveAutosaveCurrently() {
 	return isAutosaveAllowed(_targetName.c_str());
 }
 
@@ -284,24 +280,6 @@ bool TuckerEngine::isAutosaveAllowed(const char *target) {
 	return (savegameError == kSavegameNotFoundError || (savegameHeader.flags & kSavegameFlagAutosave));
 }
 
-void TuckerEngine::writeAutosave() {
-	if (canSaveGameStateCurrently()) {
-		// unconditionally reset last autosave timestamp so we don't start
-		// hammering the disk in case we can't/don't actually write the file
-		_lastSaveTime = _system->getMillis();
-
-		if (!isAutosaveAllowed()) {
-			warning("Refusing to overwrite non-autosave savegame in slot %i, skipping autosave", kAutoSaveSlot);
-			return;
-		}
-
-		if (writeSavegame(kAutoSaveSlot, "Autosave", true).getCode() != Common::kNoError) {
-			warning("Can't create autosave in slot %i, game not saved", kAutoSaveSlot);
-			return;
-		}
-	}
-}
-
 bool TuckerEngine::canLoadOrSave() const {
 	return !_player && _cursorState != kCursorStateDisabledHidden;
 }
diff --git a/engines/tucker/tucker.cpp b/engines/tucker/tucker.cpp
index c4725d1..02cd1b6 100644
--- a/engines/tucker/tucker.cpp
+++ b/engines/tucker/tucker.cpp
@@ -350,8 +350,6 @@ void TuckerEngine::resetVariables() {
 	_updateLocationFlag = false;
 	_updateLocation70StringLen = 0;
 	memset(_updateLocation70String, 0, sizeof(_updateLocation70String));
-
-	_lastSaveTime = _system->getMillis();
 }
 
 void TuckerEngine::mainLoop() {
@@ -617,14 +615,10 @@ void TuckerEngine::mainLoop() {
 			handleCreditsSequence();
 			_quitGame = true;
 		}
-
-		if (shouldPerformAutoSave(_lastSaveTime)) {
-			writeAutosave();
-		}
 	} while (!_quitGame && _flagsTable[100] == 0);
 
 	// auto save on quit
-	writeAutosave();
+	saveAutosaveIfEnabled();
 
 	if (_flagsTable[100] == 1) {
 		handleCongratulationsSequence();
diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h
index f3c5ac2..20f02ff 100644
--- a/engines/tucker/tucker.h
+++ b/engines/tucker/tucker.h
@@ -453,7 +453,8 @@ public:
 
 	WARN_UNUSED_RESULT static SavegameError readSavegameHeader(Common::InSaveFile *file, SavegameHeader &header, bool skipThumbnail = true);
 	WARN_UNUSED_RESULT static SavegameError readSavegameHeader(const char *target, int slot, SavegameHeader &header);
-	bool isAutosaveAllowed();
+	virtual bool canSaveAutosaveCurrently() override;
+
 	static bool isAutosaveAllowed(const char *target);
 protected:
 
@@ -744,9 +745,12 @@ protected:
 	template<class S> SavegameError saveOrLoadGameStateData(S &s);
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
-	Common::Error writeSavegame(int slot, const Common::String &description, bool autosave = false);
 	SavegameError writeSavegameHeader(Common::OutSaveFile *file, SavegameHeader &header);
-	void writeAutosave();
+	virtual int getAutosaveSlot() const override { return kAutoSaveSlot; }
+	virtual Common::String getSaveStateName(int slot) const {
+		return Common::String::format("%s.%d", _targetName.c_str(), slot);
+	}
+
 	bool canLoadOrSave() const;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
@@ -795,7 +799,6 @@ protected:
 	Common::Language _gameLang;
 	uint32 _gameFlags;
 	int _startSlot;
-	uint32 _lastSaveTime;
 
 	bool _quitGame;
 	bool _fastMode;


Commit: 6a3aac1478f7cec1a0e6a1162e35ba7201926d55
    https://github.com/scummvm/scummvm/commit/6a3aac1478f7cec1a0e6a1162e35ba7201926d55
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
XEEN: Remove autosave code

Changed paths:
    engines/xeen/events.cpp
    engines/xeen/events.h
    engines/xeen/saves.cpp
    engines/xeen/saves.h
    engines/xeen/xeen.cpp
    engines/xeen/xeen.h


diff --git a/engines/xeen/events.cpp b/engines/xeen/events.cpp
index 090c6e0..eabb7b3 100644
--- a/engines/xeen/events.cpp
+++ b/engines/xeen/events.cpp
@@ -32,7 +32,7 @@
 namespace Xeen {
 
 EventsManager::EventsManager(XeenEngine *vm) : _vm(vm), _playTime(0), _gameCounter(0),
-		_frameCounter(0), _priorFrameCounterTime(0), _priorScreenRefreshTime(0), _lastAutosaveTime(0),
+		_frameCounter(0), _priorFrameCounterTime(0), _priorScreenRefreshTime(0),
 		_mousePressed(false), _sprites("mouse.icn") {
 	Common::fill(&_gameCounters[0], &_gameCounters[6], 0);
 }
@@ -76,11 +76,6 @@ void EventsManager::pollEvents() {
 		nextFrame();
 	}
 
-	// Handle auto saves
-	if (!_lastAutosaveTime)
-		_lastAutosaveTime = timer;
-	g_vm->autoSaveCheck(_lastAutosaveTime);
-
 	// Event handling
 	Common::Event event;
 	while (g_system->getEventManager()->pollEvent(event)) {
diff --git a/engines/xeen/events.h b/engines/xeen/events.h
index 768e241..9913b2f 100644
--- a/engines/xeen/events.h
+++ b/engines/xeen/events.h
@@ -63,7 +63,6 @@ private:
 	uint32 _frameCounter;
 	uint32 _priorFrameCounterTime;
 	uint32 _priorScreenRefreshTime;
-	int _lastAutosaveTime;
 	uint32 _gameCounter;
 	uint32 _gameCounters[6];
 	uint32 _playTime;
diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp
index 646e97b..b3c7617 100644
--- a/engines/xeen/saves.cpp
+++ b/engines/xeen/saves.cpp
@@ -116,8 +116,7 @@ void SavesManager::writeSavegameHeader(Common::OutSaveFile *out, XeenSavegameHea
 }
 
 Common::Error SavesManager::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
-		generateSaveName(slot));
+	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(g_vm->getSaveStateName(slot));
 	if (!out)
 		return Common::kCreatingFileFailed;
 
@@ -159,7 +158,7 @@ Common::Error SavesManager::loadGameState(int slot) {
 	Party &party = *g_vm->_party;
 
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
-		generateSaveName(slot));
+		g_vm->getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kReadingFailed;
 
@@ -208,10 +207,6 @@ Common::Error SavesManager::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::String SavesManager::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 void SavesManager::newGame() {
 	delete File::_xeenSave;
 	delete File::_darkSave;
diff --git a/engines/xeen/saves.h b/engines/xeen/saves.h
index 791b2b7..02478c8 100644
--- a/engines/xeen/saves.h
+++ b/engines/xeen/saves.h
@@ -50,12 +50,6 @@ private:
 	Common::String _targetName;
 private:
 	/**
-	 * Support method that generates a savegame name
-	 * @param slot		Slot number
-	 */
-	Common::String generateSaveName(int slot);
-
-	/**
 	 * Initializes a new savegame
 	 */
 	void reset();
diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp
index 5546155..5de7f79 100644
--- a/engines/xeen/xeen.cpp
+++ b/engines/xeen/xeen.cpp
@@ -202,6 +202,11 @@ bool XeenEngine::canSaveGameStateCurrently() {
 		&& (_map->mazeData()._mazeFlags & RESTRICTION_SAVE) == 0;
 }
 
+bool XeenEngine::canSaveAutosaveCurrently() {
+	return canSaveGameStateCurrently() &&
+		(_map && !(_map->mazeData()._mazeFlags & RESTRICTION_SAVE));
+}
+
 void XeenEngine::playGame() {
 	_files->setGameCc(0);
 	_sound->stopAllAudio();
@@ -327,12 +332,4 @@ void XeenEngine::GUIError(const Common::String &msg) {
 	GUIErrorMessage(msg);
 }
 
-void XeenEngine::autoSaveCheck(int &lastSaveTime) {
-	if (shouldPerformAutoSave(lastSaveTime) && canSaveGameStateCurrently() &&
-			(_map && !(_map->mazeData()._mazeFlags & RESTRICTION_SAVE))) {
-		_saves->doAutosave();
-		lastSaveTime = g_system->getMillis();
-	}
-}
-
 } // End of namespace Xeen
diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h
index dceb632..038abe7 100644
--- a/engines/xeen/xeen.h
+++ b/engines/xeen/xeen.h
@@ -282,6 +282,11 @@ public:
 	bool canSaveGameStateCurrently() override;
 
 	/**
+	* Returns true if an autosave can be created
+	*/
+	virtual bool canSaveAutosaveCurrently() override;
+
+	/**
 	 * Show a cutscene
 	 * @param name		Name of cutscene
 	 * @param status	For World of Xeen, Goober status
@@ -309,11 +314,6 @@ public:
 	 * Show an error message in a GUI dialog
 	 */
 	void GUIError(const Common::String &msg);
-
-	/**
-	 * Checks if an auto save should be done, and if so, takes care of it
-	 */
-	void autoSaveCheck(int &lastSaveTime);
 };
 
 extern XeenEngine *g_vm;


Commit: 37c397f19b15e63bc117770ff3bbcabff48d5964
    https://github.com/scummvm/scummvm/commit/37c397f19b15e63bc117770ff3bbcabff48d5964
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ZVISION: Remove autosave code

Changed paths:
    engines/zvision/file/save_manager.cpp
    engines/zvision/file/save_manager.h
    engines/zvision/zvision.cpp


diff --git a/engines/zvision/file/save_manager.cpp b/engines/zvision/file/save_manager.cpp
index dd4425a..e424dab 100644
--- a/engines/zvision/file/save_manager.cpp
+++ b/engines/zvision/file/save_manager.cpp
@@ -100,10 +100,6 @@ void SaveManager::saveGame(uint slot, const Common::String &saveName, bool useSa
 	_lastSaveTime = g_system->getMillis();
 }
 
-void SaveManager::autoSave() {
-	saveGame(0, "Auto save", false);
-}
-
 void SaveManager::writeSaveGameHeader(Common::OutSaveFile *file, const Common::String &saveName, bool useSaveBuffer) {
 	file->writeUint32BE(SAVEGAME_ID);
 
diff --git a/engines/zvision/file/save_manager.h b/engines/zvision/file/save_manager.h
index e5bf47b..ea03bfa 100644
--- a/engines/zvision/file/save_manager.h
+++ b/engines/zvision/file/save_manager.h
@@ -73,11 +73,6 @@ private:
 
 public:
 	/**
-	 * Called every room change. Saves the state of the room just before
-	 * the room changes.
-	 */
-	void autoSave();
-	/**
 	 * Copies the data from the last auto-save into a new save file. We
 	 * can't use the current state data because the save menu *IS* a room.
 	 * The file is named using ZVision::generateSaveFileName(slot)
diff --git a/engines/zvision/zvision.cpp b/engines/zvision/zvision.cpp
index c3dd189..aa6f73a 100644
--- a/engines/zvision/zvision.cpp
+++ b/engines/zvision/zvision.cpp
@@ -348,10 +348,6 @@ Common::Error ZVision::run() {
 			delay >>= 1;
 		}
 
-		if (canSaveGameStateCurrently() && shouldPerformAutoSave(_saveManager->getLastSaveTime())) {
-			_saveManager->autoSave();
-		}
-
 		_system->delayMillis(delay);
 	}
 


Commit: 8288e9579b40631b6a18a11fc10f3000fcf07525
    https://github.com/scummvm/scummvm/commit/8288e9579b40631b6a18a11fc10f3000fcf07525
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ULTIMA: Remove autosave code

Changed paths:
    engines/ultima/shared/engine/events.cpp
    engines/ultima/shared/engine/events.h
    engines/ultima/shared/engine/ultima.cpp
    engines/ultima/shared/engine/ultima.h


diff --git a/engines/ultima/shared/engine/events.cpp b/engines/ultima/shared/engine/events.cpp
index 9a6816b..13a5647 100644
--- a/engines/ultima/shared/engine/events.cpp
+++ b/engines/ultima/shared/engine/events.cpp
@@ -33,8 +33,8 @@ namespace Ultima {
 namespace Shared {
 
 EventsManager::EventsManager(EventsCallback *callback) : _callback(callback), _playTime(0),
-		_gameCounter(0), _frameCounter(0), _priorFrameCounterTime(0), _lastAutosaveTime(0),
-		_buttonsDown(0), _specialButtons(0) {
+		_gameCounter(0), _frameCounter(0), _priorFrameCounterTime(0), _buttonsDown(0),
+		_specialButtons(0) {
 }
 
 void EventsManager::showCursor() {
@@ -58,11 +58,6 @@ bool EventsManager::pollEvent(Common::Event &event) {
 		nextFrame();
 	}
 
-	// Handle auto saves
-	if (!_lastAutosaveTime)
-		_lastAutosaveTime = timer;
-	_callback->autoSaveCheck(_lastAutosaveTime);
-
 	// Event handling
 	if (g_system->getEventManager()->pollEvent(event)) {
 		if (isMouseDownEvent(event.type)) {
diff --git a/engines/ultima/shared/engine/events.h b/engines/ultima/shared/engine/events.h
index f08fcbb..bcf58be 100644
--- a/engines/ultima/shared/engine/events.h
+++ b/engines/ultima/shared/engine/events.h
@@ -129,11 +129,6 @@ public:
 	 */
 	virtual ~EventsCallback() {}
 
-    /**
-     * Checks if an auto save should be done, and if so, takes care of it
-     */
-	virtual bool autoSaveCheck(int lastSaveTime) = 0;
-
 	/**
 	 * Get the screen
 	 */
@@ -149,7 +144,6 @@ private:
 	uint32 _frameCounter;
 	uint32 _priorFrameTime;
 	uint32 _priorFrameCounterTime;
-	uint32 _lastAutosaveTime;
 	uint32 _gameCounter;
 	uint32 _playTime;
 	Point _mousePos;
diff --git a/engines/ultima/shared/engine/ultima.cpp b/engines/ultima/shared/engine/ultima.cpp
index e866876..49b9de4 100644
--- a/engines/ultima/shared/engine/ultima.cpp
+++ b/engines/ultima/shared/engine/ultima.cpp
@@ -74,15 +74,6 @@ void UltimaEngine::GUIError(const Common::String &msg) {
 	GUIErrorMessage(msg);
 }
 
-bool UltimaEngine::autoSaveCheck(int lastSaveTime) {
-	if (shouldPerformAutoSave(lastSaveTime) && canSaveGameStateCurrently(true)) {
-		saveGameState(0, _("Autosave"), true);
-		return true;
-	}
-
-	return false;
-}
-
 bool UltimaEngine::hasFeature(EngineFeature f) const {
 	return
 		(f == kSupportsRTL) ||
diff --git a/engines/ultima/shared/engine/ultima.h b/engines/ultima/shared/engine/ultima.h
index 4b985b6..8f983d7 100644
--- a/engines/ultima/shared/engine/ultima.h
+++ b/engines/ultima/shared/engine/ultima.h
@@ -132,11 +132,6 @@ public:
 	}
 
 	/**
-	 * Checks if an auto save should be done, and if so, takes care of it
-	 */
-	bool autoSaveCheck(int lastSaveTime) override;
-
-	/**
 	 * Returns a file system node for the game directory
 	 */
 	Common::FSNode getGameDirectory() const;


Commit: c40adffbdd407f9e2961e75b9d90ede1eca0d933
    https://github.com/scummvm/scummvm/commit/c40adffbdd407f9e2961e75b9d90ede1eca0d933
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
SCUMM: Disable base engine autosave code in favour of engine's existing

The autosave code looks more complicated for the Scumm engine, and
since it's already present and working, it's simpler just to disable
the autosave code in the base engine for just this engine, letting
it keep taking care of it

Changed paths:
    engines/scumm/scumm.h


diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index a645c1b..ccaf2fc 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -436,6 +436,10 @@ public:
 	bool canLoadGameStateCurrently() override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
+	bool canSaveAutosaveCurrently() override {
+		// Keep base engine autosave code disabled in favour of engine's autosave code
+		return false;
+	}
 
 	void pauseEngineIntern(bool pause) override;
 


Commit: 9f175c40538cc20ce347e4d566b50954918ca179
    https://github.com/scummvm/scummvm/commit/9f175c40538cc20ce347e4d566b50954918ca179
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Cleanup of savegame filenames generation

This removes filename methods when it matched the Engine method.
Secondly, ensuring there was an overriden getSaveStateName method
for engines that didn't do the standard target.00x save filenames

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/adl/adl.cpp
    engines/adl/adl.h
    engines/avalanche/avalanche.cpp
    engines/avalanche/avalanche.h
    engines/bbvs/bbvs.h
    engines/bbvs/saveload.cpp
    engines/cge/cge.h
    engines/cge/cge_main.cpp
    engines/cge2/cge2.h
    engines/cge2/saveload.cpp
    engines/cine/cine.h
    engines/cine/detection.cpp
    engines/composer/composer.h
    engines/composer/saveload.cpp
    engines/cruise/cruise.h
    engines/cryomni3d/versailles/engine.h
    engines/cryomni3d/versailles/saveload.cpp
    engines/draci/draci.h
    engines/drascula/saveload.cpp
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/fullpipe.h
    engines/gnap/gnap.h
    engines/gnap/menu.cpp
    engines/hopkins/hopkins.cpp
    engines/hopkins/hopkins.h
    engines/hopkins/saveload.cpp
    engines/hugo/file.cpp
    engines/hugo/hugo.cpp
    engines/hugo/hugo.h
    engines/lab/lab.cpp
    engines/lab/lab.h
    engines/lab/savegame.cpp
    engines/macventure/saveload.cpp
    engines/mads/game.cpp
    engines/mads/mads.cpp
    engines/mads/mads.h
    engines/mohawk/myst.h
    engines/mohawk/riven.h
    engines/mortevielle/mortevielle.cpp
    engines/mortevielle/mortevielle.h
    engines/mortevielle/saveload.cpp
    engines/mutationofjb/mutationofjb.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/saveload.cpp
    engines/pegasus/pegasus.h
    engines/pink/pink.h
    engines/prince/prince.h
    engines/prince/saveload.cpp
    engines/saga/saga.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/sword1/sword1.h
    engines/sword2/saveload.cpp
    engines/sword2/sword2.h
    engines/teenagent/teenagent.cpp
    engines/teenagent/teenagent.h
    engines/titanic/core/project_item.cpp
    engines/titanic/pet_control/pet_load_save.cpp
    engines/titanic/titanic.cpp
    engines/titanic/titanic.h
    engines/tony/tony.cpp
    engines/tony/tony.h
    engines/touche/touche.h
    engines/tsage/blue_force/blueforce_logic.cpp
    engines/tsage/ringworld/ringworld_logic.cpp
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/saveload.cpp
    engines/tsage/tsage.cpp
    engines/tsage/tsage.h
    engines/voyeur/voyeur.cpp
    engines/voyeur/voyeur.h
    engines/wage/saveload.cpp
    engines/wage/wage.h
    engines/zvision/file/save_manager.cpp
    engines/zvision/zvision.cpp
    engines/zvision/zvision.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 790b870..1328ffa 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -457,7 +457,7 @@ void AccessEngine::freeChar() {
 
 Common::Error AccessEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
-		generateSaveName(slot));
+		getSaveStateName(slot));
 	if (!out)
 		return Common::kCreatingFileFailed;
 
@@ -476,7 +476,7 @@ Common::Error AccessEngine::saveGameState(int slot, const Common::String &desc,
 
 Common::Error AccessEngine::loadGameState(int slot) {
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
-		generateSaveName(slot));
+		getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kReadingFailed;
 
@@ -499,10 +499,6 @@ Common::Error AccessEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::String AccessEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 bool AccessEngine::canLoadGameStateCurrently() {
 	return _canSaveLoad;
 }
diff --git a/engines/access/access.h b/engines/access/access.h
index b2ff86a..5c0519d 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -111,12 +111,6 @@ protected:
 	void doRoom();
 
 	/**
-	* Support method that generates a savegame name
-	* @param slot		Slot number
-	*/
-	Common::String generateSaveName(int slot);
-
-	/**
 	 * Play back an entire video
 	 */
 	void playVideo(int videoNum, const Common::Point &pt);
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index 9057627..756ce83 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -924,8 +924,12 @@ void AdlEngine::saveState(Common::WriteStream &stream) {
 		stream.writeByte(_state.vars[i]);
 }
 
+Common::String AdlEngine::getSaveStateName(int slot) const {
+	return Common::String::format("%s.s%02d", _targetName.c_str(), slot);
+}
+
 Common::Error AdlEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	Common::String fileName = Common::String::format("%s.s%02d", _targetName.c_str(), slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::OutSaveFile *outFile = getSaveFileManager()->openForSaving(fileName);
 
 	if (!outFile) {
diff --git a/engines/adl/adl.h b/engines/adl/adl.h
index c73fb83..00611cc9 100644
--- a/engines/adl/adl.h
+++ b/engines/adl/adl.h
@@ -252,6 +252,7 @@ protected:
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
+	virtual Common::String getSaveStateName(int slot) const override;
 
 	Common::String getDiskImageName(byte volume) const { return Adl::getDiskImageName(*_gameDescription, volume); }
 	GameType getGameType() const { return Adl::getGameType(*_gameDescription); }
diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp
index d044882..95506ca 100644
--- a/engines/avalanche/avalanche.cpp
+++ b/engines/avalanche/avalanche.cpp
@@ -336,7 +336,7 @@ Common::Error AvalancheEngine::saveGameState(int slot, const Common::String &des
 }
 
 bool AvalancheEngine::saveGame(const int16 slot, const Common::String &desc) {
-	Common::String fileName = getSaveFileName(slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::OutSaveFile *f = g_system->getSavefileManager()->openForSaving(fileName);
 	if (!f) {
 		warning("Can't create file '%s', game not saved.", fileName.c_str());
@@ -368,10 +368,6 @@ bool AvalancheEngine::saveGame(const int16 slot, const Common::String &desc) {
 	return true;
 }
 
-Common::String AvalancheEngine::getSaveFileName(const int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 bool AvalancheEngine::canLoadGameStateCurrently() {
 	return (_animationsEnabled);
 }
@@ -381,7 +377,7 @@ Common::Error AvalancheEngine::loadGameState(int slot) {
 }
 
 bool AvalancheEngine::loadGame(const int16 slot) {
-	Common::String fileName = getSaveFileName(slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
 	if (!f)
 		return false;
diff --git a/engines/avalanche/avalanche.h b/engines/avalanche/avalanche.h
index 384bcef..9dd7a59 100644
--- a/engines/avalanche/avalanche.h
+++ b/engines/avalanche/avalanche.h
@@ -112,7 +112,6 @@ public:
 	bool canSaveGameStateCurrently() override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool saveGame(const int16 slot, const Common::String &desc);
-	Common::String getSaveFileName(const int slot);
 	bool canLoadGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	bool loadGame(const int16 slot);
diff --git a/engines/bbvs/bbvs.h b/engines/bbvs/bbvs.h
index e0c343a..1d8cfa3 100644
--- a/engines/bbvs/bbvs.h
+++ b/engines/bbvs/bbvs.h
@@ -412,7 +412,6 @@ public:
 	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
 	void savegame(const char *filename, const char *description);
 	void loadgame(const char *filename);
-	const char *getSavegameFilename(int num);
 	bool existsSavegame(int num);
 	static Common::String getSavegameFilename(const Common::String &target, int num);
 	WARN_UNUSED_RESULT static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, SaveHeader &header, bool skipThumbnail = true);
diff --git a/engines/bbvs/saveload.cpp b/engines/bbvs/saveload.cpp
index d09b59b..622d05b 100644
--- a/engines/bbvs/saveload.cpp
+++ b/engines/bbvs/saveload.cpp
@@ -182,23 +182,17 @@ void BbvsEngine::loadgame(const char *filename) {
 }
 
 Common::Error BbvsEngine::loadGameState(int slot) {
-	const char *fileName = getSavegameFilename(slot);
-	loadgame(fileName);
+	Common::String fileName = getSaveStateName(slot);
+	loadgame(fileName.c_str());
 	return Common::kNoError;
 }
 
 Common::Error BbvsEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
-	const char *fileName = getSavegameFilename(slot);
-	savegame(fileName, description.c_str());
+	Common::String fileName = getSaveStateName(slot);
+	savegame(fileName.c_str(), description.c_str());
 	return Common::kNoError;
 }
 
-const char *BbvsEngine::getSavegameFilename(int num) {
-	static Common::String filename;
-	filename = getSavegameFilename(_targetName, num);
-	return filename.c_str();
-}
-
 Common::String BbvsEngine::getSavegameFilename(const Common::String &target, int num) {
 	assert(num >= 0 && num <= 999);
 	return Common::String::format("%s.%03d", target.c_str(), num);
diff --git a/engines/cge/cge.h b/engines/cge/cge.h
index 633f85c..248fd8c 100644
--- a/engines/cge/cge.h
+++ b/engines/cge/cge.h
@@ -133,7 +133,6 @@ private:
 	void writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header);
 	void syncGame(Common::SeekableReadStream *readStream, Common::WriteStream *writeStream, bool tiny);
 	bool savegameExists(int slotNumber);
-	Common::String generateSaveName(int slot);
 public:
 	CGEEngine(OSystem *syst, const ADGameDescription *gameDescription);
 	~CGEEngine() override;
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp
index 7b9ea7a..027a28d 100644
--- a/engines/cge/cge_main.cpp
+++ b/engines/cge/cge_main.cpp
@@ -206,7 +206,7 @@ bool CGEEngine::loadGame(int slotNumber, SavegameHeader *header, bool tiny) {
 
 	} else {
 		// Open up the savegame file
-		Common::String slotName = generateSaveName(slotNumber);
+		Common::String slotName = getSaveStateName(slotNumber);
 		Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName);
 
 		// Read the data into a data buffer
@@ -257,7 +257,7 @@ bool CGEEngine::loadGame(int slotNumber, SavegameHeader *header, bool tiny) {
  * Returns true if a given savegame exists
  */
 bool CGEEngine::savegameExists(int slotNumber) {
-	Common::String slotName = generateSaveName(slotNumber);
+	Common::String slotName = getSaveStateName(slotNumber);
 
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName);
 	bool result = saveFile != NULL;
@@ -265,14 +265,6 @@ bool CGEEngine::savegameExists(int slotNumber) {
 	return result;
 }
 
-/**
- * Support method that generates a savegame name
- * @param slot		Slot number
- */
-Common::String CGEEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 Common::Error CGEEngine::loadGameState(int slot) {
 	// Clear current game activity
 	sceneDown();
@@ -323,7 +315,7 @@ Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc, boo
 
 void CGEEngine::saveGame(int slotNumber, const Common::String &desc) {
 	// Set up the serializer
-	Common::String slotName = generateSaveName(slotNumber);
+	Common::String slotName = getSaveStateName(slotNumber);
 	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(slotName);
 
 	// Write out the ScummVM savegame header
diff --git a/engines/cge2/cge2.h b/engines/cge2/cge2.h
index c60cdf1..e2b9114 100644
--- a/engines/cge2/cge2.h
+++ b/engines/cge2/cge2.h
@@ -146,7 +146,6 @@ private:
 	void init();
 	void deinit();
 
-	Common::String generateSaveName(int slot);
 	void writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header);
 	void saveGame(int slotNumber, const Common::String &desc);
 	bool loadGame(int slotNumber);
diff --git a/engines/cge2/saveload.cpp b/engines/cge2/saveload.cpp
index b93e2c6..493685c 100644
--- a/engines/cge2/saveload.cpp
+++ b/engines/cge2/saveload.cpp
@@ -56,7 +56,7 @@ Common::Error CGE2Engine::saveGameState(int slot, const Common::String &desc, bo
 
 void CGE2Engine::saveGame(int slotNumber, const Common::String &desc) {
 	// Set up the serializer
-	Common::String slotName = generateSaveName(slotNumber);
+	Common::String slotName = getSaveStateName(slotNumber);
 	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(slotName);
 
 	// Write out the ScummVM savegame header
@@ -93,7 +93,7 @@ bool CGE2Engine::loadGame(int slotNumber) {
 	Common::MemoryReadStream *readStream;
 
 	// Open up the savegame file
-	Common::String slotName = generateSaveName(slotNumber);
+	Common::String slotName = getSaveStateName(slotNumber);
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName);
 
 	// Read the data into a data buffer
@@ -278,12 +278,4 @@ void CGE2Engine::syncHeader(Common::Serializer &s) {
 	}
 }
 
-/**
-* Support method that generates a savegame name
-* @param slot		Slot number
-*/
-Common::String CGE2Engine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 } // End of namespace CGE2
diff --git a/engines/cine/cine.h b/engines/cine/cine.h
index b308b0e..fdd6d39 100644
--- a/engines/cine/cine.h
+++ b/engines/cine/cine.h
@@ -128,6 +128,7 @@ public:
 	int getTimerDelay() const;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+	virtual Common::String getSaveStateName(int slot) const override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 
diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp
index 73177a6..6a80899 100644
--- a/engines/cine/detection.cpp
+++ b/engines/cine/detection.cpp
@@ -216,9 +216,7 @@ void CineMetaEngine::removeSaveState(const char *target, int slot) const {
 namespace Cine {
 
 Common::Error CineEngine::loadGameState(int slot) {
-	char saveNameBuffer[256];
-	sprintf(saveNameBuffer, "%s.%1d", _targetName.c_str(), slot);
-	bool gameLoaded = makeLoad(saveNameBuffer);
+	bool gameLoaded = makeLoad(getSaveStateName(slot));
 
 	return gameLoaded ? Common::kNoError : Common::kUnknownError;
 }
@@ -244,15 +242,17 @@ Common::Error CineEngine::saveGameState(int slot, const Common::String &desc, bo
 	delete fHandle;
 
 	// Save game
-	char saveFileName[256];
-	sprintf(saveFileName, "%s.%1d", _targetName.c_str(), slot);
-	makeSave(saveFileName);
+	makeSave(getSaveStateName(slot));
 
 	checkDataDisk(-1);
 
 	return Common::kNoError;
 }
 
+Common::String CineEngine::getSaveStateName(int slot) const {
+	return Common::String::format("%s.%1d", _targetName.c_str(), slot);
+}
+
 bool CineEngine::canLoadGameStateCurrently() {
 	return (!disableSystemMenu && !inMenu);
 }
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
index de2f2b7..a5e3278 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -230,7 +230,7 @@ private:
 	uint16 _mouseSpriteId;
 	Common::Point _mouseOffset;
 
-	Common::String makeSaveGameName(int slot);
+	virtual Common::String getSaveStateName(int slot) const override;
 	Common::String getStringFromConfig(const Common::String &section, const Common::String &key);
 	Common::String getFilename(const Common::String &section, uint id);
 	Common::String mangleFilename(Common::String filename);
diff --git a/engines/composer/saveload.cpp b/engines/composer/saveload.cpp
index bdd67e2..4647606 100644
--- a/engines/composer/saveload.cpp
+++ b/engines/composer/saveload.cpp
@@ -266,12 +266,13 @@ void ComposerEngine::sync<Sprite>(Common::Serializer &ser, Sprite &data, Common:
 		}
 
 }
-Common::String ComposerEngine::makeSaveGameName(int slot) {
-	return (_targetName + Common::String::format(".%02d", slot));
+
+Common::String ComposerEngine::getSaveStateName(int slot) const {
+	return Common::String::format("%s.%02d", _targetName.c_str(), slot);
 }
 
 Common::Error ComposerEngine::loadGameState(int slot) {
-	Common::String filename = makeSaveGameName(slot);
+	Common::String filename = getSaveStateName(slot);
 	Common::InSaveFile *in;
 	if (!(in = _saveFileMan->openForLoading(filename)))
 		return Common::kPathNotFile;
@@ -370,7 +371,7 @@ Common::Error ComposerEngine::loadGameState(int slot) {
 }
 
 Common::Error ComposerEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	Common::String filename = makeSaveGameName(slot);
+	Common::String filename = getSaveStateName(slot);
 	Common::OutSaveFile *out;
 	if (!(out = _saveFileMan->openForSaving(filename)))
 		return Common::kWritingFailed;
diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h
index f6cc19b..16244f8 100644
--- a/engines/cruise/cruise.h
+++ b/engines/cruise/cruise.h
@@ -95,6 +95,7 @@ public:
 	bool canLoadGameStateCurrently() override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
+	Common::String getSaveStateName(int slot) const override { return getSavegameFile(slot); }
 	void syncSoundSettings() override;
 
 	const CRUISEGameDescription *_gameDescription;
diff --git a/engines/cryomni3d/versailles/engine.h b/engines/cryomni3d/versailles/engine.h
index 9020963..d5f02b7 100644
--- a/engines/cryomni3d/versailles/engine.h
+++ b/engines/cryomni3d/versailles/engine.h
@@ -233,6 +233,7 @@ public:
 	bool hasFeature(EngineFeature f) const override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+	Common::String getSaveStateName(int slot) const override;
 
 	Common::String prepareFileName(const Common::String &baseName, const char *extension) const {
 		const char *const extensions[] = { extension, nullptr };
diff --git a/engines/cryomni3d/versailles/saveload.cpp b/engines/cryomni3d/versailles/saveload.cpp
index 2f961f8..c71b6d1 100644
--- a/engines/cryomni3d/versailles/saveload.cpp
+++ b/engines/cryomni3d/versailles/saveload.cpp
@@ -45,6 +45,10 @@ Common::String CryOmni3DEngine_Versailles::getSaveFileName(bool visit, uint save
 	return Common::String::format("%s%s.%04u", _targetName.c_str(), visit ? "_visit" : "", saveNum);
 }
 
+Common::String CryOmni3DEngine_Versailles::getSaveStateName(int slot) const {
+	return Common::String::format("%s.%04u", _targetName.c_str(), slot);
+}
+
 bool CryOmni3DEngine_Versailles::canVisit() const {
 	return Common::File::exists("game0001.sav");
 }
diff --git a/engines/draci/draci.h b/engines/draci/draci.h
index 5214f0b..9ac812b 100644
--- a/engines/draci/draci.h
+++ b/engines/draci/draci.h
@@ -68,6 +68,7 @@ public:
 	void handleEvents();
 
 	static Common::String getSavegameFile(int saveGameIdx);
+	Common::String getSaveStateName(int slot) const override { return getSavegameFile(slot); }
 	Common::Error loadGameState(int slot) override;
 	bool canLoadGameStateCurrently() override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp
index 7250eb9..17b467e 100644
--- a/engines/drascula/saveload.cpp
+++ b/engines/drascula/saveload.cpp
@@ -229,7 +229,7 @@ void DrasculaEngine::saveGame(int slot, const Common::String &desc) {
 	Common::OutSaveFile *out;
 	int l;
 
-	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+	Common::String saveFileName = getSaveStateName(slot);
 	if (!(out = _saveFileMan->openForSaving(saveFileName))) {
 		error("Unable to open the file");
 	}
@@ -271,7 +271,7 @@ bool DrasculaEngine::loadGame(int slot) {
 	if (currentChapter != 1)
 		clearRoom();
 
-	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+	Common::String saveFileName = getSaveStateName(slot);
 	if (!(in = _saveFileMan->openForLoading(saveFileName))) {
 		error("missing savegame file %s", saveFileName.c_str());
 	}
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 10c756f..863b118 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -246,6 +246,9 @@ Common::Error FullpipeEngine::saveGameState(int slot, const Common::String &desc
 		return Common::kUnknownError;
 }
 
+Common::String FullpipeEngine::getSaveStateName(int slot) const {
+	return Common::String::format("fullpipe.s%02d", slot);
+}
 
 Common::Error FullpipeEngine::run() {
 	const Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index db85cf6..5f5fda4 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -357,6 +357,7 @@ public:
 
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &description, bool isAutosave = false) override;
+	virtual Common::String getSaveStateName(int slot) const override;
 
 	bool canLoadGameStateCurrently() override { return true; }
 	bool canSaveGameStateCurrently() override { return _isSaveAllowed; }
diff --git a/engines/gnap/gnap.h b/engines/gnap/gnap.h
index bc52307..3d7ed45 100644
--- a/engines/gnap/gnap.h
+++ b/engines/gnap/gnap.h
@@ -317,7 +317,6 @@ public:
 	int loadSavegame(int savegameNum);
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	Common::Error loadGameState(int slot) override;
-	Common::String generateSaveName(int slot);
 	void synchronize(Common::Serializer &s);
 	void writeSavegameHeader(Common::OutSaveFile *out, GnapSavegameHeader &header);
 	WARN_UNUSED_RESULT static bool readSavegameHeader(Common::InSaveFile *in, GnapSavegameHeader &header, bool skipThumbnail = true);
diff --git a/engines/gnap/menu.cpp b/engines/gnap/menu.cpp
index 58030b4..d3978a0 100644
--- a/engines/gnap/menu.cpp
+++ b/engines/gnap/menu.cpp
@@ -529,7 +529,7 @@ void GnapEngine::updateMenuStatusMainMenu() {
 
 Common::Error GnapEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
-		generateSaveName(slot));
+		getSaveStateName(slot));
 	if (!out)
 		return Common::kCreatingFileFailed;
 
@@ -630,7 +630,7 @@ WARN_UNUSED_RESULT bool GnapEngine::readSavegameHeader(Common::InSaveFile *in, G
 
 Common::Error GnapEngine::loadGameState(int slot) {
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
-		generateSaveName(slot));
+		getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kReadingFailed;
 
@@ -653,10 +653,6 @@ Common::Error GnapEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
-Common::String GnapEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 void GnapEngine::updateMenuStatusSaveGame() {
 #if 0
 	// NOTE:
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
index 5df8ec2..ec04bcb 100644
--- a/engines/hopkins/hopkins.cpp
+++ b/engines/hopkins/hopkins.cpp
@@ -77,10 +77,6 @@ HopkinsEngine::~HopkinsEngine() {
 	delete _animMan;
 }
 
-Common::String HopkinsEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 /**
  * Returns true if it is currently okay to restore a game
  */
diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h
index b6da7cc..9429c2e 100644
--- a/engines/hopkins/hopkins.h
+++ b/engines/hopkins/hopkins.h
@@ -161,7 +161,6 @@ public:
 	const Common::String &getTargetName() const;
 
 	int getRandomNumber(int maxNumber);
-	Common::String generateSaveName(int slotNumber);
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
diff --git a/engines/hopkins/saveload.cpp b/engines/hopkins/saveload.cpp
index 35a8045..ef35518 100644
--- a/engines/hopkins/saveload.cpp
+++ b/engines/hopkins/saveload.cpp
@@ -150,7 +150,8 @@ Common::Error SaveLoadManager::saveGame(int slot, const Common::String &saveName
 	_vm->_globals->_saveData->_mapCarPosY = _vm->_objectsMan->_mapCarPosY;
 
 	/* Create the savegame */
-	Common::OutSaveFile *savefile = g_system->getSavefileManager()->openForSaving(_vm->generateSaveName(slot));
+	Common::OutSaveFile *savefile = g_system->getSavefileManager()->openForSaving(
+		_vm->getSaveStateName(slot));
 	if (!savefile)
 		return Common::kCreatingFileFailed;
 
@@ -176,7 +177,7 @@ Common::Error SaveLoadManager::saveGame(int slot, const Common::String &saveName
 Common::Error SaveLoadManager::loadGame(int slot) {
 	// Try and open the save file for reading
 	Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(
-		_vm->generateSaveName(slot));
+		_vm->getSaveStateName(slot));
 	if (!savefile)
 		return Common::kReadingFailed;
 
@@ -214,7 +215,7 @@ Common::Error SaveLoadManager::loadGame(int slot) {
 WARN_UNUSED_RESULT bool SaveLoadManager::readSavegameHeader(int slot, hopkinsSavegameHeader &header, bool skipThumbnail) {
 	// Try and open the save file for reading
 	Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(
-		_vm->generateSaveName(slot));
+		_vm->getSaveStateName(slot));
 	if (!savefile)
 		return false;
 
diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp
index 7a3538e..a3fa446 100644
--- a/engines/hugo/file.cpp
+++ b/engines/hugo/file.cpp
@@ -311,7 +311,7 @@ bool FileManager::saveGame(const int16 slot, const Common::String &descrip) {
 	if (savegameId < 0)                             // dialog aborted
 		return false;
 
-	Common::String savegameFile = _vm->getSavegameFilename(savegameId);
+	Common::String savegameFile = _vm->getSaveStateName(savegameId);
 	Common::SaveFileManager *saveMan = g_system->getSavefileManager();
 	Common::OutSaveFile *out = saveMan->openForSaving(savegameFile);
 
@@ -407,7 +407,7 @@ bool FileManager::restoreGame(const int16 slot) {
 	if (savegameId < 0)                             // dialog aborted
 		return false;
 
-	Common::String savegameFile = _vm->getSavegameFilename(savegameId);
+	Common::String savegameFile = _vm->getSaveStateName(savegameId);
 	Common::SaveFileManager *saveMan = g_system->getSavefileManager();
 	Common::InSaveFile *in = saveMan->openForLoading(savegameFile);
 
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index 01e7bbd..e706e94 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -742,10 +742,8 @@ void HugoEngine::syncSoundSettings() {
 	_sound->syncVolume();
 }
 
-Common::String HugoEngine::getSavegameFilename(int slot) {
+Common::String HugoEngine::getSaveStateName(int slot) const {
 	return _targetName + Common::String::format("-%02d.SAV", slot);
 }
 
-
-
 } // End of namespace Hugo
diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h
index 6cc74ac..15576ee 100644
--- a/engines/hugo/hugo.h
+++ b/engines/hugo/hugo.h
@@ -288,7 +288,7 @@ public:
 	bool hasFeature(EngineFeature f) const override;
 	const char *getCopyrightString() const;
 
-	Common::String getSavegameFilename(int slot);
+	virtual Common::String getSaveStateName(int slot) const override;
 	uint16 **loadLongArray(Common::SeekableReadStream &in);
 
 	FileManager *_file;
diff --git a/engines/lab/lab.cpp b/engines/lab/lab.cpp
index e7cca24..545c969 100644
--- a/engines/lab/lab.cpp
+++ b/engines/lab/lab.cpp
@@ -178,10 +178,6 @@ Common::Error LabEngine::run() {
 	return Common::kNoError;
 }
 
-Common::String LabEngine::generateSaveFileName(uint slot) {
-	return Common::String::format("%s.%03u", _targetName.c_str(), slot);
-}
-
 void LabEngine::drawStaticMessage(byte index) {
 	_graphics->drawMessage(_resource->getStaticText((StaticText)index), false);
 }
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index 7766805..0151c7f 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -212,7 +212,6 @@ public:
 	uint32 getFeatures() const;
 
 	bool hasFeature(EngineFeature f) const override;
-	Common::String generateSaveFileName(uint slot);
 
 	void changeVolume(int delta);
 	uint16 getDirection() { return _direction; }
diff --git a/engines/lab/savegame.cpp b/engines/lab/savegame.cpp
index 11986dc..82a8063 100644
--- a/engines/lab/savegame.cpp
+++ b/engines/lab/savegame.cpp
@@ -126,7 +126,7 @@ WARN_UNUSED_RESULT bool readSaveGameHeader(Common::InSaveFile *in, SaveGameHeade
 }
 
 bool LabEngine::saveGame(int slot, const Common::String desc) {
-	Common::String fileName = generateSaveFileName(slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::SaveFileManager *saveFileManager = _system->getSavefileManager();
 	Common::OutSaveFile *file = saveFileManager->openForSaving(fileName);
 
@@ -171,7 +171,7 @@ bool LabEngine::saveGame(int slot, const Common::String desc) {
 }
 
 bool LabEngine::loadGame(int slot) {
-	Common::String fileName = generateSaveFileName(slot);
+	Common::String fileName = getSaveStateName(slot);
 	Common::SaveFileManager *saveFileManager = _system->getSavefileManager();
 	Common::InSaveFile *file = saveFileManager->openForLoading(fileName);
 
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index e279cee..687b96a 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -139,7 +139,7 @@ void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
 }
 
 Common::Error MacVentureEngine::loadGameState(int slot) {
-	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+	Common::String saveFileName = getSaveStateName(slot);
 	Common::InSaveFile *file;
 	if(!(file = getSaveFileManager()->openForLoading(saveFileName))) {
 		error("ENGINE: Missing savegame file %s", saveFileName.c_str());
@@ -150,7 +150,7 @@ Common::Error MacVentureEngine::loadGameState(int slot) {
 }
 
 Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+	Common::String saveFileName = getSaveStateName(slot);
 	Common::SaveFileManager *manager = getSaveFileManager();
 	// HACK Get a real name!
 	Common::OutSaveFile *file = manager->openForSaving(saveFileName);
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 0055c52..47ccd05 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -476,7 +476,7 @@ void Game::synchronize(Common::Serializer &s, bool phase1) {
 
 void Game::loadGame(int slotNumber) {
 	_saveFile = g_system->getSavefileManager()->openForLoading(
-		_vm->generateSaveName(slotNumber));
+		_vm->getSaveStateName(slotNumber));
 
 	Common::Serializer s(_saveFile, nullptr);
 
@@ -505,7 +505,7 @@ void Game::loadGame(int slotNumber) {
 
 void Game::saveGame(int slotNumber, const Common::String &saveName) {
 	Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
-		_vm->generateSaveName(slotNumber));
+		_vm->getSaveStateName(slotNumber));
 
 	MADSSavegameHeader header;
 	header._saveName = saveName;
diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
index 9b77245..9b9be0d 100644
--- a/engines/mads/mads.cpp
+++ b/engines/mads/mads.cpp
@@ -200,14 +200,6 @@ void MADSEngine::syncSoundSettings() {
 	loadOptions();
 }
 
-/**
-* Support method that generates a savegame name
-* @param slot		Slot number
-*/
-Common::String MADSEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 Common::Error MADSEngine::loadGameState(int slot) {
 	_game->_loadGameSlot = slot;
 	_game->_scene._currentSceneId = -1;
diff --git a/engines/mads/mads.h b/engines/mads/mads.h
index 5e6e7ae..c6eb59f 100644
--- a/engines/mads/mads.h
+++ b/engines/mads/mads.h
@@ -137,12 +137,6 @@ public:
 	bool canSaveGameStateCurrently() override;
 
 	/**
-	* Support method that generates a savegame name
-	* @param slot		Slot number
-	*/
-	Common::String generateSaveName(int slot);
-
-	/**
 	 * Handles loading a game via the GMM
 	 */
 	Common::Error loadGameState(int slot) override;
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index e1686a6..397c820 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -189,6 +189,9 @@ public:
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+	Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("myst-%03d.mys", slot);
+	}
 	virtual bool canSaveAutosaveCurrently() override;
 
 	bool hasFeature(EngineFeature f) const override;
diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h
index 00298f0..b1bd4c9 100644
--- a/engines/mohawk/riven.h
+++ b/engines/mohawk/riven.h
@@ -105,6 +105,9 @@ public:
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+	Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("riven-%03d.rvn", slot);
+	}
 	bool hasFeature(EngineFeature f) const override;
 	static Common::Array<Common::Keymap *> initKeymaps(const char *target);
 
diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp
index 90bb90a..642ac2e 100644
--- a/engines/mortevielle/mortevielle.cpp
+++ b/engines/mortevielle/mortevielle.cpp
@@ -433,7 +433,7 @@ Common::Error MortevielleEngine::run() {
 	adzon();
 	resetVariables();
 	if (loadSlot != 0)
-		_savegameManager->loadSavegame(generateSaveFilename(loadSlot));
+		_savegameManager->loadSavegame(getSaveStateName(loadSlot));
 
 	// Run the main game loop
 	mainGame();
diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h
index 0b1aa5f..039a553 100644
--- a/engines/mortevielle/mortevielle.h
+++ b/engines/mortevielle/mortevielle.h
@@ -450,7 +450,9 @@ public:
 	Common::Language getOriginalLanguage() const;
 	bool useOriginalData() const;
 	static Common::String generateSaveFilename(const Common::String &target, int slot);
-	Common::String generateSaveFilename(int slot) { return generateSaveFilename(_targetName, slot); }
+	Common::String getSaveStateName(int slot) const override {
+		return generateSaveFilename(_targetName, slot);
+	}
 
 	int getChar();
 	bool keyPressed();
diff --git a/engines/mortevielle/saveload.cpp b/engines/mortevielle/saveload.cpp
index 078338a..d96ecbb 100644
--- a/engines/mortevielle/saveload.cpp
+++ b/engines/mortevielle/saveload.cpp
@@ -147,7 +147,7 @@ Common::Error SavegameManager::saveGame(int n, const Common::String &saveName) {
 	if (g_vm->_saveStruct._currPlace == ROOM26)
 		g_vm->_saveStruct._currPlace = LANDING;
 
-	Common::String filename = _vm->generateSaveFilename(n);
+	Common::String filename = _vm->getSaveStateName(n);
 	f = g_system->getSavefileManager()->openForSaving(filename);
 
 	// Write out the savegame header
@@ -172,11 +172,11 @@ Common::Error SavegameManager::saveGame(int n, const Common::String &saveName) {
 }
 
 Common::Error SavegameManager::loadGame(int slot) {
-	return loadGame(_vm->generateSaveFilename(slot));
+	return loadGame(_vm->getSaveStateName(slot));
 }
 
 Common::Error SavegameManager::saveGame(int slot) {
-	return saveGame(slot, _vm->generateSaveFilename(slot));
+	return saveGame(slot, _vm->getSaveStateName(slot));
 }
 
 void SavegameManager::writeSavegameHeader(Common::OutSaveFile *out, const Common::String &saveName) {
diff --git a/engines/mutationofjb/mutationofjb.cpp b/engines/mutationofjb/mutationofjb.cpp
index 63cbc5d..a5c3a7b 100644
--- a/engines/mutationofjb/mutationofjb.cpp
+++ b/engines/mutationofjb/mutationofjb.cpp
@@ -125,7 +125,7 @@ bool MutationOfJBEngine::canLoadGameStateCurrently() {
 }
 
 Common::Error MutationOfJBEngine::loadGameState(int slot) {
-	const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+	const Common::String saveName = getSaveStateName(slot);
 	Common::InSaveFile *const saveFile = g_system->getSavefileManager()->openForLoading(saveName);
 	if (!saveFile)
 		return Common::kReadingFailed;
@@ -148,8 +148,8 @@ bool MutationOfJBEngine::canSaveGameStateCurrently() {
 }
 
 Common::Error MutationOfJBEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
-	Common::OutSaveFile *const saveFile = g_system->getSavefileManager()->openForSaving(saveName);
+	Common::OutSaveFile *const saveFile = g_system->getSavefileManager()->openForSaving(
+		getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kWritingFailed;
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 1cadda3..d1d64c1 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -125,7 +125,7 @@ public:
 	Common::Error removeGameState(int slot);
 	bool savegame(const char *filename, const char *description);
 	bool loadgame(const char *filename);
-	const char *getSavegameFilename(int num);
+	Common::String getSaveStateName(int slot) const override;
 	static Common::String getSavegameFilename(const Common::String &target, int num);
 	WARN_UNUSED_RESULT static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, SaveHeader &header, bool skipThumbnail = true);
 
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index 0176345..35a48f1 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -130,15 +130,15 @@ bool NeverhoodEngine::loadgame(const char *filename) {
 }
 
 Common::Error NeverhoodEngine::loadGameState(int slot) {
-	const char *fileName = getSavegameFilename(slot);
-	if (!loadgame(fileName))
+	Common::String fileName = getSaveStateName(slot);
+	if (!loadgame(fileName.c_str()))
 		return Common::kReadingFailed;
 	return Common::kNoError;
 }
 
 Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
-	const char *fileName = getSavegameFilename(slot);
-	if (!savegame(fileName, description.c_str()))
+	Common::String fileName = getSaveStateName(slot);
+	if (!savegame(fileName.c_str(), description.c_str()))
 		return Common::kWritingFailed;
 	return Common::kNoError;
 }
@@ -150,10 +150,8 @@ Common::Error NeverhoodEngine::removeGameState(int slot) {
 	return Common::kNoError;
 }
 
-const char *NeverhoodEngine::getSavegameFilename(int num) {
-	static Common::String filename;
-	filename = getSavegameFilename(_targetName, num);
-	return filename.c_str();
+Common::String NeverhoodEngine::getSaveStateName(int slot) const {
+	return getSavegameFilename(_targetName, slot);
 }
 
 Common::String NeverhoodEngine::getSavegameFilename(const Common::String &target, int num) {
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h
index e205535..80da6d0e 100644
--- a/engines/pegasus/pegasus.h
+++ b/engines/pegasus/pegasus.h
@@ -82,6 +82,7 @@ public:
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+
 	static Common::Array<Common::Keymap *> initKeymaps();
 
 	// Base classes
diff --git a/engines/pink/pink.h b/engines/pink/pink.h
index 17db8d8..6d4a922 100644
--- a/engines/pink/pink.h
+++ b/engines/pink/pink.h
@@ -101,6 +101,9 @@ public:
 
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
+	virtual Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("%s.s%02d", _targetName.c_str(), slot);
+	}
 
 	static void pauseEngine(void *engine, bool pause); // for MacWndMgr
 
diff --git a/engines/prince/prince.h b/engines/prince/prince.h
index 6101f25..19a3cac 100644
--- a/engines/prince/prince.h
+++ b/engines/prince/prince.h
@@ -291,7 +291,6 @@ public:
 	void playVideo(Common::String videoFilename);
 
 	WARN_UNUSED_RESULT static bool readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header, bool skipThumbnail = true);
-	Common::String generateSaveName(int slot);
 	void writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header);
 	void syncGame(Common::SeekableReadStream *readStream, Common::WriteStream *writeStream);
 	bool loadGame(int slotNumber);
diff --git a/engines/prince/saveload.cpp b/engines/prince/saveload.cpp
index 3d1465f..9f4f0e9 100644
--- a/engines/prince/saveload.cpp
+++ b/engines/prince/saveload.cpp
@@ -146,7 +146,7 @@ bool PrinceEngine::canLoadGameStateCurrently() {
 
 Common::Error PrinceEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	// Set up the serializer
-	Common::String slotName = generateSaveName(slot);
+	Common::String slotName = getSaveStateName(slot);
 	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(slotName);
 
 	// Write out the ScummVM savegame header
@@ -165,10 +165,6 @@ Common::Error PrinceEngine::saveGameState(int slot, const Common::String &desc,
 	return Common::kNoError;
 }
 
-Common::String PrinceEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 void PrinceEngine::writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header) {
 	// Write out a savegame header
 	out->write(kSavegameStr, kSavegameStrSize + 1);
@@ -435,7 +431,7 @@ bool PrinceEngine::loadGame(int slotNumber) {
 	Common::MemoryReadStream *readStream;
 
 	// Open up the savegame file
-	Common::String slotName = generateSaveName(slotNumber);
+	Common::String slotName = getSaveStateName(slotNumber);
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName);
 
 	// Read the data into a data buffer
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 2754d2e..f69c489 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -481,6 +481,9 @@ public:
 	}
 	void fillSaveList();
 	char *calcSaveFileName(uint slotNumber);
+	virtual Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("%s.s%02u", _targetName.c_str(), slot);
+	}
 
 	SaveFileData *getSaveFile(uint idx);
 	uint getNewSaveSlotNumber() const;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index bc4ac19..70ede16 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -691,6 +691,15 @@ bool SupernovaEngine::deserialize(Common::ReadStream *in, int version) {
 	return true;
 }
 
+Common::String SupernovaEngine::getSaveStateName(int slot) const {
+	if (_MSPart == 1)
+		return Common::String::format("msn_save.%03d", slot);
+	else if (_MSPart == 2)
+		return Common::String::format("ms2_save.%03d", slot);
+
+	return "";
+}
+
 bool SupernovaEngine::loadGame(int slot) {
 	if (slot < 0)
 		return false;
@@ -713,11 +722,7 @@ bool SupernovaEngine::loadGame(int slot) {
 		// continue to try to load it from there.
 	}
 
-	Common::String filename;
-	if (_MSPart == 1)
-		filename = Common::String::format("msn_save.%03d", slot);
-	else if (_MSPart == 2)
-		filename = Common::String::format("ms2_save.%03d", slot);
+	Common::String filename = getSaveStateName(slot);
 	Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
 	if (!savefile)
 		return false;
@@ -780,12 +785,7 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
 		return true;
 	}
 
-	Common::String filename;
-	if (_MSPart == 1)
-		filename = Common::String::format("msn_save.%03d", slot);
-	else if (_MSPart == 2)
-		filename = Common::String::format("ms2_save.%03d", slot);
-
+	Common::String filename = getSaveStateName(slot);
 	Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename);
 	if (!savefile)
 		return false;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 60f552a..0be51cc 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -90,6 +90,7 @@ public:
 
 	Common::Error loadGameStrings();
 	void init();
+	virtual Common::String getSaveStateName(int slot) const override;
 	bool loadGame(int slot);
 	bool saveGame(int slot, const Common::String &description);
 	bool serialize(Common::WriteStream *out);
diff --git a/engines/sword1/sword1.h b/engines/sword1/sword1.h
index f63977f..a4e76e0 100644
--- a/engines/sword1/sword1.h
+++ b/engines/sword1/sword1.h
@@ -112,7 +112,9 @@ protected:
 	bool canLoadGameStateCurrently() override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canSaveGameStateCurrently() override;
-
+	virtual Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("sword1.%03d", slot);
+	}
 private:
 	void delay(int32 amount);
 
diff --git a/engines/sword2/saveload.cpp b/engines/sword2/saveload.cpp
index 05e8b5a..7143421 100644
--- a/engines/sword2/saveload.cpp
+++ b/engines/sword2/saveload.cpp
@@ -49,8 +49,8 @@
 
 namespace Sword2 {
 
-Common::String Sword2Engine::getSaveFileName(uint16 slotNo) {
-	return Common::String::format("%s.%.3d", _targetName.c_str(), slotNo);
+Common::String Sword2Engine::getSaveStateName(int slot) const {
+	return Common::String::format("%s.%.3d", _targetName.c_str(), slot);
 }
 
 /**
@@ -125,7 +125,7 @@ uint32 Sword2Engine::saveGame(uint16 slotNo, const byte *desc) {
 }
 
 uint32 Sword2Engine::saveData(uint16 slotNo, byte *buffer, uint32 bufferSize) {
-	Common::String saveFileName = getSaveFileName(slotNo);
+	Common::String saveFileName = getSaveStateName(slotNo);
 
 	Common::OutSaveFile *out;
 
@@ -203,7 +203,7 @@ uint32 Sword2Engine::restoreGame(uint16 slotNo) {
 }
 
 uint32 Sword2Engine::restoreData(uint16 slotNo, byte *buffer, uint32 bufferSize) {
-	Common::String saveFileName = getSaveFileName(slotNo);
+	Common::String saveFileName = getSaveStateName(slotNo);
 
 	Common::InSaveFile *in;
 
@@ -370,7 +370,7 @@ uint32 Sword2Engine::restoreFromBuffer(byte *buffer, uint32 size) {
  */
 
 uint32 Sword2Engine::getSaveDescription(uint16 slotNo, byte *description) {
-	Common::String saveFileName = getSaveFileName(slotNo);
+	Common::String saveFileName = getSaveStateName(slotNo);
 
 	Common::InSaveFile *in;
 
@@ -393,7 +393,7 @@ bool Sword2Engine::saveExists() {
 }
 
 bool Sword2Engine::saveExists(uint16 slotNo) {
-	Common::String saveFileName = getSaveFileName(slotNo);
+	Common::String saveFileName = getSaveStateName(slotNo);
 	Common::InSaveFile *in;
 
 	if (!(in = _saveFileMan->openForLoading(saveFileName))) {
diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h
index 7e035a7..1a1c774 100644
--- a/engines/sword2/sword2.h
+++ b/engines/sword2/sword2.h
@@ -223,7 +223,7 @@ public:
 	bool saveExists();
 	bool saveExists(uint16 slotNo);
 	uint32 restoreFromBuffer(byte *buffer, uint32 size);
-	Common::String getSaveFileName(uint16 slotNo);
+	virtual Common::String getSaveStateName(int slot) const override;
 	uint32 findBufferSize();
 
 	void startGame();
diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp
index 8499e37..c297ffd 100644
--- a/engines/teenagent/teenagent.cpp
+++ b/engines/teenagent/teenagent.cpp
@@ -225,7 +225,8 @@ void TeenAgentEngine::init() {
 
 Common::Error TeenAgentEngine::loadGameState(int slot) {
 	debug(0, "loading from slot %d", slot);
-	Common::ScopedPtr<Common::InSaveFile> in(_saveFileMan->openForLoading(Common::String::format("teenagent.%02d", slot)));
+	Common::ScopedPtr<Common::InSaveFile> in(_saveFileMan->openForLoading(
+		getSaveStateName(slot)));
 	if (!in)
 		in.reset(_saveFileMan->openForLoading(Common::String::format("teenagent.%d", slot)));
 
@@ -263,9 +264,14 @@ Common::Error TeenAgentEngine::loadGameState(int slot) {
 	return Common::kNoError;
 }
 
+Common::String TeenAgentEngine::getSaveStateName(int slot) const {
+	return Common::String::format("teenagent.%02d", slot);
+}
+
 Common::Error TeenAgentEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	debug(0, "saving to slot %d", slot);
-	Common::ScopedPtr<Common::OutSaveFile> out(_saveFileMan->openForSaving(Common::String::format("teenagent.%02d", slot)));
+	Common::ScopedPtr<Common::OutSaveFile> out(_saveFileMan->openForSaving(
+		getSaveStateName(slot)));
 	if (!out)
 		return Common::kWritingFailed;
 
diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h
index 0906e45..0e00030 100644
--- a/engines/teenagent/teenagent.h
+++ b/engines/teenagent/teenagent.h
@@ -84,9 +84,10 @@ const uint16 kScreenHeight = 200;
 class TeenAgentEngine : public Engine {
 public:
 	TeenAgentEngine(OSystem *system, const ADGameDescription *gd);
-	~TeenAgentEngine() override;
+	~TeenAgentEngine();
 
 	Common::Error run() override;
+	Common::String getSaveStateName(int slot) const override;
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	bool canLoadGameStateCurrently() override { return true; }
diff --git a/engines/titanic/core/project_item.cpp b/engines/titanic/core/project_item.cpp
index 5ba70e9..cdb95d3 100644
--- a/engines/titanic/core/project_item.cpp
+++ b/engines/titanic/core/project_item.cpp
@@ -178,7 +178,7 @@ void CProjectItem::loadGame(int slotId) {
 	// Open either an existing savegame slot or the new game template
 	if (slotId >= 0) {
 		Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
-			g_vm->generateSaveName(slotId));
+			g_vm->getSaveStateName(slotId));
 		file.open(saveFile);
 	} else {
 		Common::File *newFile = new Common::File();
@@ -222,7 +222,7 @@ void CProjectItem::loadGame(int slotId) {
 void CProjectItem::saveGame(int slotId, const CString &desc) {
 	CompressedFile file;
 	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(
-		g_vm->generateSaveName(slotId), false);
+		g_vm->getSaveStateName(slotId), false);
 	file.open(saveFile);
 
 	// Signal the game is being saved
diff --git a/engines/titanic/pet_control/pet_load_save.cpp b/engines/titanic/pet_control/pet_load_save.cpp
index 72770b9..bf71726 100644
--- a/engines/titanic/pet_control/pet_load_save.cpp
+++ b/engines/titanic/pet_control/pet_load_save.cpp
@@ -122,7 +122,7 @@ void CPetLoadSave::resetSlots() {
 
 		// Try and open up the savegame for access
 		Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(
-			g_vm->generateSaveName(idx));
+			g_vm->getSaveStateName(idx));
 
 		if (in) {
 			// Read in the savegame header data
diff --git a/engines/titanic/titanic.cpp b/engines/titanic/titanic.cpp
index b6df256..6afecac 100644
--- a/engines/titanic/titanic.cpp
+++ b/engines/titanic/titanic.cpp
@@ -236,14 +236,10 @@ Common::Error TitanicEngine::saveGameState(int slot, const Common::String &desc,
 	return Common::kNoError;
 }
 
-CString TitanicEngine::generateSaveName(int slot) {
-	return CString::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 CString TitanicEngine::getSavegameName(int slot) {
 	// Try and open up the savegame for access
 	Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(
-		generateSaveName(slot));
+		getSaveStateName(slot));
 
 	if (in) {
 		// Read in the savegame header data
diff --git a/engines/titanic/titanic.h b/engines/titanic/titanic.h
index e1ce596..25eb059 100644
--- a/engines/titanic/titanic.h
+++ b/engines/titanic/titanic.h
@@ -182,12 +182,6 @@ public:
 	double getRandomFloat() { return getRandomNumber(0xfffffffe) * 0.00001525855623540901; } // fffffffe=4294967294 and 0.00001525855623540901 ~= 1/65537.0
 
 	/**
-	 * Support method that generates a savegame name
-	 * @param slot		Slot number
-	 */
-	CString generateSaveName(int slot);
-
-	/**
 	 * Checks whether a savegame exists for the given slot,
 	 * and if it exists, returns it's description
 	 */
diff --git a/engines/tony/tony.cpp b/engines/tony/tony.cpp
index e451ac4..8ae2fe2 100644
--- a/engines/tony/tony.cpp
+++ b/engines/tony/tony.cpp
@@ -543,6 +543,10 @@ Common::String TonyEngine::getSaveStateFileName(int n) {
 	return Common::String::format("tony.%03d", n);
 }
 
+Common::String TonyEngine::getSaveStateName(int slot) const {
+	return getSaveStateFileName(slot);
+}
+
 void TonyEngine::autoSave(CORO_PARAM) {
 	CORO_BEGIN_CONTEXT;
 	Common::String buf;
diff --git a/engines/tony/tony.h b/engines/tony/tony.h
index f357351..6ce0353 100644
--- a/engines/tony/tony.h
+++ b/engines/tony/tony.h
@@ -216,6 +216,7 @@ public:
 	void saveState(int n, const char *name);
 	void loadState(CORO_PARAM, int n);
 	static Common::String getSaveStateFileName(int n);
+	virtual Common::String getSaveStateName(int slot) const override;
 
 	/**
 	 * Get a thumbnail
diff --git a/engines/touche/touche.h b/engines/touche/touche.h
index 2cc1bed..9a7bb1a 100644
--- a/engines/touche/touche.h
+++ b/engines/touche/touche.h
@@ -604,10 +604,13 @@ protected:
 
 	void saveGameStateData(Common::WriteStream *stream);
 	void loadGameStateData(Common::ReadStream *stream);
-	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
+	Common::Error saveGameState(int num, const Common::String &description, bool isAutosave = false) override;
 	Common::Error loadGameState(int num) override;
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
+	Common::String getSaveStateName(int slot) const override {
+		return Common::String::format("%s.%d", _targetName.c_str(), slot);
+	}
 
 	void setupOpcodes();
 	void op_nop();
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index 2c5f9bd..ab83400 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -48,7 +48,7 @@ void BlueForceGame::start() {
 	// Check for a savegame to load straight from the launcher
 	if (ConfMan.hasKey("save_slot")) {
 		slot = ConfMan.getInt("save_slot");
-		Common::String file = g_vm->generateSaveName(slot);
+		Common::String file = g_vm->getSaveStateName(slot);
 		Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file);
 		if (in)
 			delete in;
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
index c656baf..fcfb375 100644
--- a/engines/tsage/ringworld/ringworld_logic.cpp
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -442,7 +442,7 @@ void RingworldGame::start() {
 
 	if (ConfMan.hasKey("save_slot")) {
 		slot = ConfMan.getInt("save_slot");
-		Common::String file = g_vm->generateSaveName(slot);
+		Common::String file = g_vm->getSaveStateName(slot);
 		Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file);
 		if (in)
 			delete in;
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index 654021b..21c6482 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -1130,7 +1130,7 @@ void Ringworld2Game::start() {
 
 	if (ConfMan.hasKey("save_slot")) {
 		slot = ConfMan.getInt("save_slot");
-		Common::String file = g_vm->generateSaveName(slot);
+		Common::String file = g_vm->getSaveStateName(slot);
 		Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file);
 		if (in)
 			delete in;
diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp
index 81bb973..7e88406 100644
--- a/engines/tsage/saveload.cpp
+++ b/engines/tsage/saveload.cpp
@@ -131,7 +131,8 @@ Common::Error Saver::save(int slot, const Common::String &saveName) {
 	_macroSaveFlag = true;
 
 	// Try and create the save file
-	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(g_vm->generateSaveName(slot));
+	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(
+		g_vm->getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kCreatingFileFailed;
 
@@ -181,7 +182,8 @@ Common::Error Saver::restore(int slot) {
 	_unresolvedPtrs.clear();
 
 	// Set up the serializer
-	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(g_vm->generateSaveName(slot));
+	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
+		g_vm->getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kReadingFailed;
 
@@ -352,7 +354,7 @@ void Saver::removeObject(SavedObject *obj) {
  * Returns true if any savegames exist
  */
 bool Saver::savegamesExist() const {
-	Common::String slot1Name = g_vm->generateSaveName(1);
+	Common::String slot1Name = g_vm->getSaveStateName(1);
 
 	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slot1Name);
 	bool result = saveFile != NULL;
diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp
index b93b042..a6da591 100644
--- a/engines/tsage/tsage.cpp
+++ b/engines/tsage/tsage.cpp
@@ -172,14 +172,6 @@ Common::Error TSageEngine::saveGameState(int slot, const Common::String &desc, b
 	return g_saver->save(slot, desc);
 }
 
-/**
- * Support method that generates a savegame name
- * @param slot		Slot number
- */
-Common::String TSageEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 void TSageEngine::syncSoundSettings() {
 	Engine::syncSoundSettings();
 
diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h
index 5fb37bf..8824e5f 100644
--- a/engines/tsage/tsage.h
+++ b/engines/tsage/tsage.h
@@ -81,7 +81,6 @@ public:
 	Common::Error loadGameState(int slot) override;
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
 	void syncSoundSettings() override;
-	Common::String generateSaveName(int slot);
 
 	void initialize();
 	void deinitialize();
diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp
index cd61306..b3aebf1 100644
--- a/engines/voyeur/voyeur.cpp
+++ b/engines/voyeur/voyeur.cpp
@@ -746,10 +746,6 @@ void VoyeurEngine::showEndingNews() {
 
 /*------------------------------------------------------------------------*/
 
-Common::String VoyeurEngine::generateSaveName(int slot) {
-	return Common::String::format("%s.%03d", _targetName.c_str(), slot);
-}
-
 /**
  * Returns true if it is currently okay to restore a game
  */
@@ -774,7 +770,7 @@ Common::Error VoyeurEngine::loadGameState(int slot) {
 
 void VoyeurEngine::loadGame(int slot) {
 	// Open up the save file
-	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(generateSaveName(slot));
+	Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(getSaveStateName(slot));
 	if (!saveFile)
 		return;
 
@@ -808,7 +804,7 @@ void VoyeurEngine::loadGame(int slot) {
  */
 Common::Error VoyeurEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	// Open the save file for writing
-	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(generateSaveName(slot));
+	Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(getSaveStateName(slot));
 	if (!saveFile)
 		return Common::kCreatingFileFailed;
 
diff --git a/engines/voyeur/voyeur.h b/engines/voyeur/voyeur.h
index 99540a6..6ef7924 100644
--- a/engines/voyeur/voyeur.h
+++ b/engines/voyeur/voyeur.h
@@ -205,7 +205,6 @@ public:
 	bool getIsDemo() const;
 
 	int getRandomNumber(int maxNumber);
-	Common::String generateSaveName(int slotNumber);
 	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	Common::Error loadGameState(int slot) override;
diff --git a/engines/wage/saveload.cpp b/engines/wage/saveload.cpp
index dddb49b..95a0fda 100644
--- a/engines/wage/saveload.cpp
+++ b/engines/wage/saveload.cpp
@@ -377,7 +377,7 @@ int WageEngine::saveGame(const Common::String &fileName, const Common::String &d
 
 int WageEngine::loadGame(int slotId) {
 	Common::InSaveFile *data;
-	Common::String fileName = getSavegameFilename(slotId);
+	Common::String fileName = getSaveStateName(slotId);
 
 	debug(9, "WageEngine::loadGame(%d)", slotId);
 	if (!(data = _saveFileMan->openForLoading(fileName))) {
@@ -721,12 +721,6 @@ int WageEngine::loadGame(int slotId) {
 	return 0;
 }
 
-Common::String WageEngine::getSavegameFilename(int16 slotId) const {
-	Common::String saveLoadSlot = _targetName;
-	saveLoadSlot += Common::String::format(".%.3d", slotId);
-	return saveLoadSlot;
-}
-
 Common::Error WageEngine::loadGameState(int slot) {
 	if (loadGame(slot) == 0)
 		return Common::kNoError;
@@ -735,7 +729,7 @@ Common::Error WageEngine::loadGameState(int slot) {
 }
 
 Common::Error WageEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
-	Common::String saveLoadSlot = getSavegameFilename(slot);
+	Common::String saveLoadSlot = getSaveStateName(slot);
 	if (saveGame(saveLoadSlot, description) == 0)
 		return Common::kNoError;
 	else
diff --git a/engines/wage/wage.h b/engines/wage/wage.h
index 2af7b9e..c89119d 100644
--- a/engines/wage/wage.h
+++ b/engines/wage/wage.h
@@ -223,7 +223,6 @@ private:
 	Scene *getSceneByOffset(int offset) const;
 	int saveGame(const Common::String &fileName, const Common::String &descriptionString);
 	int loadGame(int slotId);
-	Common::String getSavegameFilename(int16 slotId) const;
 
 private:
 	const ADGameDescription *_gameDescription;
diff --git a/engines/zvision/file/save_manager.cpp b/engines/zvision/file/save_manager.cpp
index e424dab..ec5e283 100644
--- a/engines/zvision/file/save_manager.cpp
+++ b/engines/zvision/file/save_manager.cpp
@@ -82,7 +82,7 @@ void SaveManager::saveGame(uint slot, const Common::String &saveName, bool useSa
 		return;
 
 	Common::SaveFileManager *saveFileManager = g_system->getSavefileManager();
-	Common::OutSaveFile *file = saveFileManager->openForSaving(_engine->generateSaveFileName(slot));
+	Common::OutSaveFile *file = saveFileManager->openForSaving(_engine->getSaveStateName(slot));
 
 	writeSaveGameHeader(file, saveName, useSaveBuffer);
 
@@ -252,7 +252,7 @@ bool SaveManager::readSaveGameHeader(Common::InSaveFile *in, SaveGameHeader &hea
 }
 
 Common::SeekableReadStream *SaveManager::getSlotFile(uint slot) {
-	Common::SeekableReadStream *saveFile = g_system->getSavefileManager()->openForLoading(_engine->generateSaveFileName(slot));
+	Common::SeekableReadStream *saveFile = g_system->getSavefileManager()->openForLoading(_engine->getSaveStateName(slot));
 	if (saveFile == NULL) {
 		// Try to load standard save file
 		Common::String filename;
diff --git a/engines/zvision/zvision.cpp b/engines/zvision/zvision.cpp
index aa6f73a..2afb744 100644
--- a/engines/zvision/zvision.cpp
+++ b/engines/zvision/zvision.cpp
@@ -364,10 +364,6 @@ void ZVision::pauseEngineIntern(bool pause) {
 	}
 }
 
-Common::String ZVision::generateSaveFileName(uint slot) {
-	return Common::String::format("%s.%03u", _targetName.c_str(), slot);
-}
-
 void ZVision::setRenderDelay(uint delay) {
 	_frameRenderDelay = delay;
 }
diff --git a/engines/zvision/zvision.h b/engines/zvision/zvision.h
index 3469867..31ebaef 100644
--- a/engines/zvision/zvision.h
+++ b/engines/zvision/zvision.h
@@ -220,8 +220,6 @@ public:
 	void playVideo(Video::VideoDecoder &videoDecoder, const Common::Rect &destRect = Common::Rect(0, 0, 0, 0), bool skippable = true, Subtitle *sub = NULL);
 	Video::VideoDecoder *loadAnimation(const Common::String &fileName);
 
-	Common::String generateSaveFileName(uint slot);
-
 	void setRenderDelay(uint);
 	bool canRender();
 	static void fpsTimerCallback(void *refCon);


Commit: 1687427e8e2607bf90e1a72bed899c50282169b4
    https://github.com/scummvm/scummvm/commit/1687427e8e2607bf90e1a72bed899c50282169b4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Mark autosave slots as write protected

If the autosave slot doesn't yet have any file in it, when the
GMM save dialog is open, the autosave slot will show a default
'Autosave' entry which is write-only, to prevent users
accidentally making a savegame in that slot

Changed paths:
    engines/engine.h
    engines/griffon/detection.cpp
    engines/kyra/detection.cpp
    engines/metaengine.cpp
    engines/metaengine.h
    engines/queen/detection.cpp
    engines/tucker/detection.cpp
    gui/saveload-dialog.cpp


diff --git a/engines/engine.h b/engines/engine.h
index 56bb6b4..22a3f67 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -399,6 +399,7 @@ public:
 
 	/**
 	 * Returns the slot that should be used for autosaves
+	 * @note	This should match the meta engine getAutosaveSlot() method
 	 */
 	virtual int getAutosaveSlot() const {
 		return 0;
diff --git a/engines/griffon/detection.cpp b/engines/griffon/detection.cpp
index ec69737..797a483 100644
--- a/engines/griffon/detection.cpp
+++ b/engines/griffon/detection.cpp
@@ -69,6 +69,10 @@ public:
 	}
 
 	bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
+
+	virtual int getAutosaveSlot() const override {
+		return 4;
+	}
 };
 
 bool Griffon::GriffonEngine::hasFeature(EngineFeature f) const {
diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp
index c1ef150..6b345ba 100644
--- a/engines/kyra/detection.cpp
+++ b/engines/kyra/detection.cpp
@@ -183,6 +183,7 @@ public:
 	void removeSaveState(const char *target, int slot) const override;
 	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
 	Common::KeymapArray initKeymaps(const char *target) const override;
+	virtual int getAutosaveSlot() const override { return 999; }
 };
 
 bool KyraMetaEngine::hasFeature(MetaEngineFeature f) const {
diff --git a/engines/metaengine.cpp b/engines/metaengine.cpp
index 3138cfc..fb0e395 100644
--- a/engines/metaengine.cpp
+++ b/engines/metaengine.cpp
@@ -287,6 +287,8 @@ SaveStateList MetaEngine::listSaves(const char *target) const {
 				parseSavegameHeader(&header, &desc);
 
 				desc.setSaveSlot(slotNum);
+				if (slotNum == getAutosaveSlot())
+					desc.setWriteProtectedFlag(true);
 
 				saveList.push_back(desc);
 			}
@@ -298,6 +300,36 @@ SaveStateList MetaEngine::listSaves(const char *target) const {
 	return saveList;
 }
 
+SaveStateList MetaEngine::listSaves(const char *target, bool saveMode) const {
+	SaveStateList saveList = listSaves(target);
+	int autosaveSlot = ConfMan.getInt("autosave_period") ? getAutosaveSlot() : -1;
+	if (!saveMode || autosaveSlot == -1)
+		return saveList;
+
+	// Check to see if an autosave is present
+	for (SaveStateList::iterator it = saveList.begin(); it != saveList.end(); ++it) {
+		int slot = it->getSaveSlot();
+		if (slot == autosaveSlot) {
+			// It has an autosave
+			it->setWriteProtectedFlag(true);
+			return saveList;
+		}
+	}
+
+	// No autosave yet. We want to add a dummy one in so that it can be marked as'
+	// write protected, and thus be prevented from being saved in
+	SaveStateDescriptor desc;
+	desc.setDescription(_("Autosave"));
+	desc.setSaveSlot(autosaveSlot);
+	desc.setWriteProtectedFlag(true);
+
+	saveList.push_back(desc);
+	Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
+
+	return saveList;
+}
+
+
 void MetaEngine::removeSaveState(const char *target, int slot) const {
 	if (!hasFeature(kSavesUseExtendedFormat))
 		return;
@@ -325,6 +357,8 @@ SaveStateDescriptor MetaEngine::querySaveMetaInfos(const char *target, int slot)
 
 		desc.setSaveSlot(slot);
 		desc.setThumbnail(header.thumbnail);
+		if (slot == getAutosaveSlot())
+			desc.setWriteProtectedFlag(true);
 
 		return desc;
 	}
diff --git a/engines/metaengine.h b/engines/metaengine.h
index 4dfcc54..d31c790 100644
--- a/engines/metaengine.h
+++ b/engines/metaengine.h
@@ -152,6 +152,26 @@ public:
 	virtual SaveStateList listSaves(const char *target) const;
 
 	/**
+	 * Return a list of all save states associated with the given target.
+	 *
+	 * This is a wrapper around the basic listSaves virtual method, but which
+	 * has some extra logic for autosave handling
+	 *
+	 * @param target	name of a config manager target
+	 * @param saveMode	If true, getting the list for a save dialog
+	 * @return			a list of save state descriptors
+	 */
+	SaveStateList listSaves(const char *target, bool saveMode) const;
+
+	/**
+	 * Returns the slot number being used for autosaves.
+	 * @note	This should match the engine getAutosaveSlot() method
+	 */
+	virtual int getAutosaveSlot() const {
+		return 0;
+	}
+
+	/**
 	 * Return a list of extra GUI options for the specified target.
 	 * If no target is specified, all of the available custom GUI options are
 	 * Returned for the plugin (used to set default values).
diff --git a/engines/queen/detection.cpp b/engines/queen/detection.cpp
index 61d67c8..44fee6b 100644
--- a/engines/queen/detection.cpp
+++ b/engines/queen/detection.cpp
@@ -501,6 +501,7 @@ public:
 	SaveStateList listSaves(const char *target) const override;
 	int getMaximumSaveSlot() const override { return 99; }
 	void removeSaveState(const char *target, int slot) const override;
+	int getAutosaveSlot() const override { return 99; }
 
 	ADDetectedGame fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const override;
 };
diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp
index e402184..449af94 100644
--- a/engines/tucker/detection.cpp
+++ b/engines/tucker/detection.cpp
@@ -206,6 +206,10 @@ public:
 		return Tucker::kLastSaveSlot;
 	}
 
+	virtual int getAutosaveSlot() const override {
+		return Tucker::kAutoSaveSlot;
+	}
+
 	void removeSaveState(const char *target, int slot) const override {
 		Common::String filename = Tucker::generateGameStateFileName(target, slot);
 		g_system->getSavefileManager()->removeSavefile(filename);
diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp
index af7e627..17e6fd5 100644
--- a/gui/saveload-dialog.cpp
+++ b/gui/saveload-dialog.cpp
@@ -298,7 +298,7 @@ void SaveLoadChooserDialog::updateSaveList() {
 
 void SaveLoadChooserDialog::listSaves() {
 	if (!_metaEngine) return; //very strange
-	_saveList = _metaEngine->listSaves(_target.c_str());
+	_saveList = _metaEngine->listSaves(_target.c_str(), _saveMode);
 
 #if defined(USE_CLOUD) && defined(USE_LIBCURL)
 	//if there is Cloud support, add currently synced files as "locked" saves in the list
@@ -572,7 +572,8 @@ void SaveLoadChooserSimple::updateSelection(bool redraw) {
 		SaveStateDescriptor desc = (_saveList[selItem].getLocked() ? _saveList[selItem] : _metaEngine->querySaveMetaInfos(_target.c_str(), _saveList[selItem].getSaveSlot()));
 
 		isDeletable = desc.getDeletableFlag() && _delSupport;
-		isWriteProtected = desc.getWriteProtectedFlag();
+		isWriteProtected = desc.getWriteProtectedFlag() ||
+			_saveList[selItem].getWriteProtectedFlag();
 		isLocked = desc.getLocked();
 
 		// Don't allow the user to change the description of write protected games


Commit: 510818499d96ee06edd24c511f96c9cbe89774f5
    https://github.com/scummvm/scummvm/commit/510818499d96ee06edd24c511f96c9cbe89774f5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: If an autosave can't be created, try again in 5 minutes

Changed paths:
    engines/engine.cpp


diff --git a/engines/engine.cpp b/engines/engine.cpp
index 377bed4..b0202f0 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -494,8 +494,17 @@ void Engine::handleAutoSave() {
 }
 
 void Engine::saveAutosaveIfEnabled() {
-	if (_autosaveInterval != 0 && canSaveAutosaveCurrently())
-		saveGameState(getAutosaveSlot(), _("Autosave"), true);
+	if (_autosaveInterval != 0) {
+		bool canSave = canSaveAutosaveCurrently();
+
+		if (!canSave || saveGameState(getAutosaveSlot(), _("Autosave"), true).getCode() != Common::kNoError) {
+			// Couldn't autosave at the designated time. Rather than wait until
+			// the next autosave interval, which may be some time, set the next
+			// interval to be in five minutes time
+			_lastAutosaveTime = _system->getMillis() + (5 * 60 * 1000) - _autosaveInterval;
+			return;
+		}
+	}
 
 	// Reset the last autosave time
 	_lastAutosaveTime = _system->getMillis();


Commit: e8abfaf98e1bca48ab1fae630d6b4cd3effcb25c
    https://github.com/scummvm/scummvm/commit/e8abfaf98e1bca48ab1fae630d6b4cd3effcb25c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Added OSD messages for failed autosaves or savegames

Changed paths:
    engines/engine.cpp


diff --git a/engines/engine.cpp b/engines/engine.cpp
index b0202f0..c86e4a1 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -498,9 +498,12 @@ void Engine::saveAutosaveIfEnabled() {
 		bool canSave = canSaveAutosaveCurrently();
 
 		if (!canSave || saveGameState(getAutosaveSlot(), _("Autosave"), true).getCode() != Common::kNoError) {
-			// Couldn't autosave at the designated time. Rather than wait until
-			// the next autosave interval, which may be some time, set the next
-			// interval to be in five minutes time
+			// Couldn't autosave at the designated time
+			if (!canSave)
+				g_system->displayMessageOnOSD(_("Error occurred making autosave"));
+
+			// Set the next autosave interval to be in 5 minutes, rather than whatever
+			// full autosave interval the user has selected
 			_lastAutosaveTime = _system->getMillis() + (5 * 60 * 1000) - _autosaveInterval;
 			return;
 		}


Commit: 91801a9c55c63ff6f4b4f27aeb9a4fa8ba0094e1
    https://github.com/scummvm/scummvm/commit/91801a9c55c63ff6f4b4f27aeb9a4fa8ba0094e1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ULTIMA: Refactor out use of meta engine pointer

Changed paths:
    engines/ultima/detection.cpp
    engines/ultima/detection.h
    engines/ultima/nuvie/nuvie.cpp
    engines/ultima/shared/engine/ultima.cpp
    engines/ultima/shared/engine/ultima.h
    engines/ultima/ultima8/filesys/file_system.cpp


diff --git a/engines/ultima/detection.cpp b/engines/ultima/detection.cpp
index 171b954..cd31491 100644
--- a/engines/ultima/detection.cpp
+++ b/engines/ultima/detection.cpp
@@ -52,24 +52,13 @@ static const PlainGameDescriptor ULTIMA_GAMES[] = {
 
 #include "ultima/detection_tables.h"
 
-namespace Ultima {
-UltimaMetaEngine *g_metaEngine;
-} // End of namespace Ultima
-
-
 UltimaMetaEngine::UltimaMetaEngine() : AdvancedMetaEngine(Ultima::GAME_DESCRIPTIONS,
 	        sizeof(Ultima::UltimaGameDescription), Ultima::ULTIMA_GAMES) {
-	Ultima::g_metaEngine = this;
-
 	static const char *const DIRECTORY_GLOBS[2] = { "usecode", 0 };
 	_maxScanDepth = 2;
 	_directoryGlobs = DIRECTORY_GLOBS;
 }
 
-UltimaMetaEngine::~UltimaMetaEngine() {
-	Ultima::g_metaEngine = nullptr;
-}
-
 bool UltimaMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
 	const Ultima::UltimaGameDescription *gd = (const Ultima::UltimaGameDescription *)desc;
 	if (gd) {
diff --git a/engines/ultima/detection.h b/engines/ultima/detection.h
index 4d592e1..03515b7 100644
--- a/engines/ultima/detection.h
+++ b/engines/ultima/detection.h
@@ -61,7 +61,7 @@ struct UltimaGameDescription {
 class UltimaMetaEngine : public AdvancedMetaEngine {
 public:
 	UltimaMetaEngine();
-	~UltimaMetaEngine() override;
+	~UltimaMetaEngine() override {}
 
 	const char *getEngineId() const override {
 		return "ultima";
@@ -87,8 +87,4 @@ public:
 	SaveStateList listSaves(const char *target) const override;
 };
 
-namespace Ultima {
-extern UltimaMetaEngine *g_metaEngine;
-} // End of namespace Ultima
-
 #endif
diff --git a/engines/ultima/nuvie/nuvie.cpp b/engines/ultima/nuvie/nuvie.cpp
index 39597f2..a756d6c 100644
--- a/engines/ultima/nuvie/nuvie.cpp
+++ b/engines/ultima/nuvie/nuvie.cpp
@@ -293,7 +293,7 @@ bool NuvieEngine::canSaveGameStateCurrently(bool isAutosave) {
 }
 
 Common::Error NuvieEngine::loadGameState(int slot) {
-	Common::String filename = getSaveFilename(slot);
+	Common::String filename = getSaveStateName(slot);
 
 	if (slot == ORIGINAL_SAVE_SLOT) {
 		// For Nuvie, unless a savegame is already present for the slot,
@@ -312,7 +312,7 @@ Common::Error NuvieEngine::loadGameState(int slot) {
 }
 
 Common::Error NuvieEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	Common::String filename = getSaveFilename(slot);
+	Common::String filename = getSaveStateName(slot);
 	if (_savegame->save(filename, desc)) {
 		if (!isAutosave) {
 			// Store which savegame was most recently saved
diff --git a/engines/ultima/shared/engine/ultima.cpp b/engines/ultima/shared/engine/ultima.cpp
index 49b9de4..1f7281d 100644
--- a/engines/ultima/shared/engine/ultima.cpp
+++ b/engines/ultima/shared/engine/ultima.cpp
@@ -97,9 +97,5 @@ Common::FSNode UltimaEngine::getGameDirectory() const {
 	return Common::FSNode(ConfMan.get("path"));
 }
 
-UltimaMetaEngine *UltimaEngine::getMetaEngine() const {
-	return g_metaEngine;
-}
-
 } // End of namespace Shared
 } // End of namespace Ultima
diff --git a/engines/ultima/shared/engine/ultima.h b/engines/ultima/shared/engine/ultima.h
index 8f983d7..1b21b63 100644
--- a/engines/ultima/shared/engine/ultima.h
+++ b/engines/ultima/shared/engine/ultima.h
@@ -62,10 +62,6 @@ protected:
 		return false;
 	}
 
-	/**
-	 * Returns the Ultima meta engine
-	 */
-	UltimaMetaEngine *getMetaEngine() const;
 public:
 	EventsManager *_events;
 public:
@@ -101,13 +97,6 @@ public:
 	}
 
 	/**
-	 * Returns the filename for a savegame given it's slot
-	 */
-	Common::String getSaveFilename(int slotNumber) {
-		return getMetaEngine()->getSavegameFile(slotNumber, _targetName.c_str());
-	}
-
-	/**
 	 * Show a messae in a GUI dialog
 	 */
 	void GUIError(const Common::String &msg);
diff --git a/engines/ultima/ultima8/filesys/file_system.cpp b/engines/ultima/ultima8/filesys/file_system.cpp
index f1573fb..9b0f4e9 100644
--- a/engines/ultima/ultima8/filesys/file_system.cpp
+++ b/engines/ultima/ultima8/filesys/file_system.cpp
@@ -99,7 +99,7 @@ bool FileSystem::rawOpen(Common::SeekableReadStream *&in, const string &fname) {
 	// Handle opening savegames
 	if (name.hasPrefix("@save/")) {
 		int slotNumber = Std::atoi(name.c_str() + 6);
-		Std::string saveFilename = Ultima8Engine::get_instance()->getSaveFilename(slotNumber);
+		Std::string saveFilename = Ultima8Engine::get_instance()->getSaveStateName(slotNumber);
 
 		in = g_system->getSavefileManager()->openForLoading(saveFilename);
 		return in != 0;
@@ -131,7 +131,7 @@ bool FileSystem::rawOpen(Common::WriteStream *&out,  const string &fname) {
 
 	if (name.hasPrefix("@save/")) {
 		int slotNumber = Std::atoi(name.c_str() + 6);
-		Std::string saveFilename = Ultima8Engine::get_instance()->getSaveFilename(slotNumber);
+		Std::string saveFilename = Ultima8Engine::get_instance()->getSaveStateName(slotNumber);
 
 		out = g_system->getSavefileManager()->openForSaving(saveFilename, false);
 		return out != 0;


Commit: 4f26f2c7ef17bf97a27c8f1a934bee1b9396f77c
    https://github.com/scummvm/scummvm/commit/4f26f2c7ef17bf97a27c8f1a934bee1b9396f77c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Autosave won't save over a custom save in it's slot

Changed paths:
    engines/engine.cpp
    engines/engine.h


diff --git a/engines/engine.cpp b/engines/engine.cpp
index c86e4a1..6a7a0df 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -495,13 +495,23 @@ void Engine::handleAutoSave() {
 
 void Engine::saveAutosaveIfEnabled() {
 	if (_autosaveInterval != 0) {
-		bool canSave = canSaveAutosaveCurrently();
+		bool saveFlag = canSaveAutosaveCurrently();
+		Common::String saveName = _("Autosave");
+
+		if (saveFlag) {
+			// First check for an existing savegame in the slot, and if present, if it's an autosave
+			SaveStateDescriptor desc = getMetaEngine().querySaveMetaInfos(
+				_targetName.c_str(), getAutosaveSlot());
+			saveFlag = desc.getSaveSlot() == -1 || desc.getDescription() == saveName;
+		}
 
-		if (!canSave || saveGameState(getAutosaveSlot(), _("Autosave"), true).getCode() != Common::kNoError) {
+		if (saveFlag && saveGameState(getAutosaveSlot(), saveName, true).getCode() != Common::kNoError) {
 			// Couldn't autosave at the designated time
-			if (!canSave)
-				g_system->displayMessageOnOSD(_("Error occurred making autosave"));
+			g_system->displayMessageOnOSD(_("Error occurred making autosave"));
+			saveFlag = false;
+		}
 
+		if (!saveFlag) {
 			// Set the next autosave interval to be in 5 minutes, rather than whatever
 			// full autosave interval the user has selected
 			_lastAutosaveTime = _system->getMillis() + (5 * 60 * 1000) - _autosaveInterval;
@@ -799,3 +809,9 @@ EnginePlugin *Engine::getMetaEnginePlugin() const {
 }
 
 */
+
+MetaEngine &Engine::getMetaEngine() {
+	const Plugin *plugin = EngineMan.findPlugin(ConfMan.get("engineid"));
+	assert(plugin);
+	return plugin->get<MetaEngine>();
+}
diff --git a/engines/engine.h b/engines/engine.h
index 22a3f67..f28cfb0 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -31,6 +31,7 @@
 #include "common/singleton.h"
 
 class OSystem;
+class MetaEngine;
 
 namespace Audio {
 class Mixer;
@@ -323,6 +324,8 @@ public:
 	 */
 	static bool shouldQuit();
 
+	static MetaEngine &getMetaEngine();
+
 	/**
 	 * Pause or resume the engine. This should stop/resume any audio playback
 	 * and other stuff. Called right before the system runs a global dialog


Commit: 233614a2ff50830898d9839d6937de5071439003
    https://github.com/scummvm/scummvm/commit/233614a2ff50830898d9839d6937de5071439003
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
MOHAWK: Re-add missing isAutoSaveAllowed call

Changed paths:
    engines/mohawk/riven.cpp


diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index d4a89c5..c6d66f1 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -748,7 +748,8 @@ void MohawkEngine_Riven::saveGameStateAndDisplayError(int slot, const Common::St
 }
 
 bool MohawkEngine_Riven::canSaveAutosaveCurrently() {
-	return canSaveGameStateCurrently() && !_gameEnded;
+	return canSaveGameStateCurrently() && !_gameEnded &&
+		_saveLoad->isAutoSaveAllowed();
 }
 
 void MohawkEngine_Riven::addZipVisitedCard(uint16 cardId, uint16 cardNameId) {


Commit: 0b81eaab7b0245c2366a5a4fbec928d35d4f7db3
    https://github.com/scummvm/scummvm/commit/0b81eaab7b0245c2366a5a4fbec928d35d4f7db3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Abstract autosave check into SaveStateDescriptor

Changed paths:
    engines/engine.cpp
    engines/savestate.cpp
    engines/savestate.h


diff --git a/engines/engine.cpp b/engines/engine.cpp
index 6a7a0df..a240c29 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -496,16 +496,15 @@ void Engine::handleAutoSave() {
 void Engine::saveAutosaveIfEnabled() {
 	if (_autosaveInterval != 0) {
 		bool saveFlag = canSaveAutosaveCurrently();
-		Common::String saveName = _("Autosave");
 
 		if (saveFlag) {
 			// First check for an existing savegame in the slot, and if present, if it's an autosave
 			SaveStateDescriptor desc = getMetaEngine().querySaveMetaInfos(
 				_targetName.c_str(), getAutosaveSlot());
-			saveFlag = desc.getSaveSlot() == -1 || desc.getDescription() == saveName;
+			saveFlag = desc.getSaveSlot() == -1 || desc.isAutosave();
 		}
 
-		if (saveFlag && saveGameState(getAutosaveSlot(), saveName, true).getCode() != Common::kNoError) {
+		if (saveFlag && saveGameState(getAutosaveSlot(), _("Autosave"), true).getCode() != Common::kNoError) {
 			// Couldn't autosave at the designated time
 			g_system->displayMessageOnOSD(_("Error occurred making autosave"));
 			saveFlag = false;
diff --git a/engines/savestate.cpp b/engines/savestate.cpp
index 90ab4d0..a83c3a2 100644
--- a/engines/savestate.cpp
+++ b/engines/savestate.cpp
@@ -23,16 +23,19 @@
 #include "engines/savestate.h"
 #include "graphics/surface.h"
 #include "common/textconsole.h"
+#include "common/translation.h"
 
 SaveStateDescriptor::SaveStateDescriptor()
 	// FIXME: default to 0 (first slot) or to -1 (invalid slot) ?
 	: _slot(-1), _description(), _isDeletable(true), _isWriteProtected(false),
-	  _isLocked(false), _saveDate(), _saveTime(), _playTime(), _playTimeMSecs(0), _thumbnail() {
+	  _isLocked(false), _saveDate(), _saveTime(), _playTime(), _playTimeMSecs(0),
+	_thumbnail(), _saveType(kSaveTypeUndetermined) {
 }
 
 SaveStateDescriptor::SaveStateDescriptor(int s, const Common::String &d)
 	: _slot(s), _description(d), _isDeletable(true), _isWriteProtected(false),
-	  _isLocked(false), _saveDate(), _saveTime(), _playTime(), _playTimeMSecs(0), _thumbnail() {
+	  _isLocked(false), _saveDate(), _saveTime(), _playTime(), _playTimeMSecs(0),
+	_thumbnail(), _saveType(kSaveTypeUndetermined) {
 }
 
 void SaveStateDescriptor::setThumbnail(Graphics::Surface *t) {
@@ -60,3 +63,15 @@ void SaveStateDescriptor::setPlayTime(uint32 msecs) {
 	uint minutes = msecs / 60000;
 	setPlayTime(minutes / 60, minutes % 60);
 }
+
+void SaveStateDescriptor::setAutosave(bool autosave) {
+	_saveType = autosave ? kSaveTypeAutosave : kSaveTypeRegular;
+}
+
+bool SaveStateDescriptor::isAutosave() const {
+	if (_saveType != kSaveTypeUndetermined) {
+		return _saveType == kSaveTypeAutosave;
+	} else {
+		return _description == _("Autosave");
+	}
+}
diff --git a/engines/savestate.h b/engines/savestate.h
index e91cc9c..cb755b7 100644
--- a/engines/savestate.h
+++ b/engines/savestate.h
@@ -43,6 +43,12 @@ struct Surface;
  * Saves are writable and deletable by default.
  */
 class SaveStateDescriptor {
+private:
+	enum SaveType {
+		kSaveTypeUndetermined,
+		kSaveTypeRegular,
+		kSaveTypeAutosave
+	};
 public:
 	SaveStateDescriptor();
 	SaveStateDescriptor(int s, const Common::String &d);
@@ -185,6 +191,15 @@ public:
 	 */
 	uint32 getPlayTimeMSecs() const { return _playTimeMSecs; }
 
+	/**
+	 * Sets whether the save is an autosave
+	 */
+	void setAutosave(bool autosave);
+
+	/**
+	 * Returns true whether the save is an autosave
+	 */
+	bool isAutosave() const;
 private:
 	/**
 	 * The saveslot id, as it would be passed to the "-x" command line switch.
@@ -237,6 +252,11 @@ private:
 	 * The thumbnail of the save state.
 	 */
 	Common::SharedPtr<Graphics::Surface> _thumbnail;
+
+	/**
+	 * Save file type
+	 */
+	SaveType _saveType;
 };
 
 /** List of savestates. */


Commit: 52b87e7660a1207f0e3212e3cfa0de7350bff17d
    https://github.com/scummvm/scummvm/commit/52b87e7660a1207f0e3212e3cfa0de7350bff17d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
ENGINES: Add an autosave flag to the extended savegame data

Changed paths:
    engines/engine.cpp
    engines/metaengine.cpp
    engines/metaengine.h
    engines/ultima/nuvie/files/nuvie_io_file.cpp


diff --git a/engines/engine.cpp b/engines/engine.cpp
index a240c29..8d88b68 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -707,7 +707,7 @@ Common::Error Engine::saveGameState(int slot, const Common::String &desc, bool i
 
 	Common::Error result = saveGameStream(saveFile, isAutosave);
 	if (result.getCode() == Common::kNoError) {
-		MetaEngine::appendExtendedSave(saveFile, getTotalPlayTime() / 1000, desc);
+		MetaEngine::appendExtendedSave(saveFile, getTotalPlayTime() / 1000, desc, isAutosave);
 
 		saveFile->finalize();
 	}
diff --git a/engines/metaengine.cpp b/engines/metaengine.cpp
index fb0e395..066fd71 100644
--- a/engines/metaengine.cpp
+++ b/engines/metaengine.cpp
@@ -141,7 +141,8 @@ bool MetaEngine::hasFeature(MetaEngineFeature f) const {
 		(f == kSavesUseExtendedFormat);
 }
 
-void MetaEngine::appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playtime, Common::String desc) {
+void MetaEngine::appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playtime,
+		Common::String desc, bool isAutosave) {
 	ExtendedSavegameHeader header;
 
 	uint headerPos = saveFile->pos();
@@ -163,8 +164,10 @@ void MetaEngine::appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playti
 
 	saveFile->writeByte(desc.size());
 	saveFile->writeString(desc);
+	saveFile->writeByte(isAutosave);
 
 	saveScreenThumbnail(saveFile);
+
 	saveFile->writeUint32LE(headerPos);	// Store where the header starts
 
 	saveFile->finalize();
@@ -243,6 +246,9 @@ WARN_UNUSED_RESULT bool MetaEngine::readSavegameHeader(Common::InSaveFile *in, E
 	if (header->description.empty())
 		header->description = header->saveName;
 
+	// Get the flag for whether it's an autosave
+	header->isAutosave = (header->version >= 4) ? in->readByte() : false;
+
 	// Get the thumbnail
 	if (!Graphics::loadThumbnail(*in, header->thumbnail, skipThumbnail)) {
 		in->seek(oldPos, SEEK_SET); // Rewind the file
@@ -357,6 +363,7 @@ SaveStateDescriptor MetaEngine::querySaveMetaInfos(const char *target, int slot)
 
 		desc.setSaveSlot(slot);
 		desc.setThumbnail(header.thumbnail);
+		desc.setAutosave(header.isAutosave);
 		if (slot == getAutosaveSlot())
 			desc.setWriteProtectedFlag(true);
 
diff --git a/engines/metaengine.h b/engines/metaengine.h
index d31c790..5f5c2b8 100644
--- a/engines/metaengine.h
+++ b/engines/metaengine.h
@@ -61,7 +61,7 @@ struct ExtraGuiOption {
 
 typedef Common::Array<ExtraGuiOption> ExtraGuiOptions;
 
-#define EXTENDED_SAVE_VERSION 3
+#define EXTENDED_SAVE_VERSION 4
 
 struct ExtendedSavegameHeader {
 	char id[6];
@@ -72,6 +72,7 @@ struct ExtendedSavegameHeader {
 	uint16 time;
 	uint32 playtime;
 	Graphics::Surface *thumbnail;
+	bool isAutosave;
 
 	ExtendedSavegameHeader() {
 		memset(id, 0, 6);
@@ -80,6 +81,7 @@ struct ExtendedSavegameHeader {
 		time = 0;
 		playtime = 0;
 		thumbnail = nullptr;
+		isAutosave = false;
 	}
 };
 
@@ -340,7 +342,8 @@ public:
 	 */
 	virtual bool hasFeature(MetaEngineFeature f) const;
 
-	static void appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playtime, Common::String desc);
+	static void appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playtime,
+		Common::String desc, bool isAutosave);
 	static void parseSavegameHeader(ExtendedSavegameHeader *header, SaveStateDescriptor *desc);
 	static void fillDummyHeader(ExtendedSavegameHeader *header);
 	static WARN_UNUSED_RESULT bool readSavegameHeader(Common::InSaveFile *in, ExtendedSavegameHeader *header, bool skipThumbnail = true);
diff --git a/engines/ultima/nuvie/files/nuvie_io_file.cpp b/engines/ultima/nuvie/files/nuvie_io_file.cpp
index ed40410..9043059 100644
--- a/engines/ultima/nuvie/files/nuvie_io_file.cpp
+++ b/engines/ultima/nuvie/files/nuvie_io_file.cpp
@@ -154,7 +154,7 @@ void NuvieIOFileWrite::close() {
 	if (_saveFile) {
 		// Writing using savefile interface, so flush out data
 		_saveFile->write(_saveFileData.getData(), _saveFileData.size());
-		MetaEngine::appendExtendedSave(_saveFile, Shared::g_ultima->getTotalPlayTime(), _description);
+		MetaEngine::appendExtendedSave(_saveFile, Shared::g_ultima->getTotalPlayTime(), _description, false);
 
 		_saveFile->finalize();
 		delete _saveFile;


Commit: de5e3e3414f279a486be75844e56ec5dc6a92865
    https://github.com/scummvm/scummvm/commit/de5e3e3414f279a486be75844e56ec5dc6a92865
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
NUVIE: Pass autosave flag to extended savegame header when saving

Changed paths:
    engines/ultima/nuvie/files/nuvie_io_file.cpp
    engines/ultima/nuvie/files/nuvie_io_file.h
    engines/ultima/nuvie/nuvie.cpp
    engines/ultima/nuvie/save/save_game.cpp
    engines/ultima/nuvie/save/save_game.h


diff --git a/engines/ultima/nuvie/files/nuvie_io_file.cpp b/engines/ultima/nuvie/files/nuvie_io_file.cpp
index 9043059..5acfe4f 100644
--- a/engines/ultima/nuvie/files/nuvie_io_file.cpp
+++ b/engines/ultima/nuvie/files/nuvie_io_file.cpp
@@ -114,7 +114,7 @@ bool NuvieIOFileRead::readToBuf(unsigned char *buf, uint32 buf_size) {
 //
 
 NuvieIOFileWrite::NuvieIOFileWrite() : _saveFileData(DisposeAfterUse::YES),
-		_file(nullptr), _saveFile(nullptr) {
+		_file(nullptr), _saveFile(nullptr), _isAutosave(false) {
 }
 
 NuvieIOFileWrite::~NuvieIOFileWrite() {
@@ -126,24 +126,32 @@ bool NuvieIOFileWrite::open(const Common::String &filename) {
 		// We already have an open file
 		return false;
 
-	if (filename.contains("/")) {
-		// It's a relative path, so we open it using a DumpFile
-		if (!_dumpFile.open(filename, true)) {
-			DEBUG(0, LEVEL_ERROR, "Failed opening '%s'\n", filename.c_str());
-			return false;
-		}
+	// Ensure it's a relative path, that we can open for writing using a DumpFile
+	assert(filename.contains("/"));
 
-		_file = &_dumpFile;
-	} else {
-		// Singular file, so open it as a save file
-		_saveFile = g_system->getSavefileManager()->openForSaving(filename, false);
-		assert(_saveFile);
-
-		// Point _file to the _saveFileData member for initial writing,
-		// since save files don't allow seeking
-		_file = &_saveFileData;
+	if (!_dumpFile.open(filename, true)) {
+		DEBUG(0, LEVEL_ERROR, "Failed opening '%s'\n", filename.c_str());
+		return false;
 	}
 
+	_file = &_dumpFile;
+	return true;
+}
+
+bool NuvieIOFileWrite::open(const Common::String &filename, bool isAutosave) {
+	if (isOpen())
+		// We already have an open file
+		return false;
+
+	// Singular file, so open it as a save file
+	_saveFile = g_system->getSavefileManager()->openForSaving(filename, false);
+	assert(_saveFile);
+
+	// Point _file to the _saveFileData member for initial writing,
+	// since save files don't allow seeking
+	_file = &_saveFileData;
+	_isAutosave = isAutosave;
+
 	size = 0;
 	pos = 0;
 
@@ -151,10 +159,12 @@ bool NuvieIOFileWrite::open(const Common::String &filename) {
 }
 
 void NuvieIOFileWrite::close() {
-	if (_saveFile) {
+	if (!isOpen()) {
+		// Nothing needed
+	} else if (_saveFile) {
 		// Writing using savefile interface, so flush out data
 		_saveFile->write(_saveFileData.getData(), _saveFileData.size());
-		MetaEngine::appendExtendedSave(_saveFile, Shared::g_ultima->getTotalPlayTime(), _description, false);
+		MetaEngine::appendExtendedSave(_saveFile, Shared::g_ultima->getTotalPlayTime(), _description, _isAutosave);
 
 		_saveFile->finalize();
 		delete _saveFile;
diff --git a/engines/ultima/nuvie/files/nuvie_io_file.h b/engines/ultima/nuvie/files/nuvie_io_file.h
index 2500cc9..3f8180c 100644
--- a/engines/ultima/nuvie/files/nuvie_io_file.h
+++ b/engines/ultima/nuvie/files/nuvie_io_file.h
@@ -80,6 +80,7 @@ private:
 	Common::OutSaveFile *_saveFile;
 	Common::MemoryWriteStreamDynamic _saveFileData;
 	Common::String _description;
+	bool _isAutosave;
 protected:
 	bool isOpen() const {
 		return _file != nullptr;
@@ -88,6 +89,7 @@ public:
 	NuvieIOFileWrite();
 	~NuvieIOFileWrite() override;
 	bool open(const Common::String &filename) override;
+	bool open(const Common::String &filename, bool isAutosave);
 	void close() override;
 	void seek(uint32 new_pos) override;
 
diff --git a/engines/ultima/nuvie/nuvie.cpp b/engines/ultima/nuvie/nuvie.cpp
index a756d6c..b8281f8 100644
--- a/engines/ultima/nuvie/nuvie.cpp
+++ b/engines/ultima/nuvie/nuvie.cpp
@@ -313,7 +313,7 @@ Common::Error NuvieEngine::loadGameState(int slot) {
 
 Common::Error NuvieEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
 	Common::String filename = getSaveStateName(slot);
-	if (_savegame->save(filename, desc)) {
+	if (_savegame->save(filename, desc, isAutosave)) {
 		if (!isAutosave) {
 			// Store which savegame was most recently saved
 			ConfMan.setInt("latest_save", slot);
diff --git a/engines/ultima/nuvie/save/save_game.cpp b/engines/ultima/nuvie/save/save_game.cpp
index b36f0c3..39c5f81 100644
--- a/engines/ultima/nuvie/save/save_game.cpp
+++ b/engines/ultima/nuvie/save/save_game.cpp
@@ -359,7 +359,7 @@ bool SaveGame::load(const Common::String &filename) {
 	return true;
 }
 
-bool SaveGame::save(const Common::String &filename, const Common::String &save_description) {
+bool SaveGame::save(const Common::String &filename, const Common::String &save_description, bool isAutosave) {
 	uint8 i;
 	NuvieIOFileWrite saveFile;
 	GameId gameType = g_engine->getGameId();
@@ -372,7 +372,7 @@ bool SaveGame::save(const Common::String &filename, const Common::String &save_d
 		config->write();
 	}
 
-	saveFile.open(filename);
+	saveFile.open(filename, isAutosave);
 
 	saveFile.write2(SAVE_VERSION);
 	saveFile.write2(GAME_ID(gameType));
diff --git a/engines/ultima/nuvie/save/save_game.h b/engines/ultima/nuvie/save/save_game.h
index 048c609..ef45d6d 100644
--- a/engines/ultima/nuvie/save/save_game.h
+++ b/engines/ultima/nuvie/save/save_game.h
@@ -81,7 +81,7 @@ public:
 
 	bool check_version(NuvieIOFileRead *loadfile, uint16 gameType);
 
-	bool save(const Common::String &filename, const Common::String &save_description);
+	bool save(const Common::String &filename, const Common::String &save_description, bool isAutosave);
 };
 
 } // End of namespace Nuvie


Commit: 1c8443cac91216ad04de5fc4ecb8028ef2ace9c1
    https://github.com/scummvm/scummvm/commit/1c8443cac91216ad04de5fc4ecb8028ef2ace9c1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
NEWS: Add line for better autosave support

Changed paths:
    NEWS.md


diff --git a/NEWS.md b/NEWS.md
index 95dcbfe..5881192 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -4,6 +4,7 @@ For a more comprehensive changelog of the latest experimental code, see:
 #### 2.2.0 (XXXX-XX-XX)
 
 General:
+   - Autosaves are now supported for all the engines
    - Errors are more likely to open the debugger, and be displayed, then just crash ScummVM
 
  Dreamweb:


Commit: c3c0d04d2a2f97c1f059963a8ed5d921f9f61759
    https://github.com/scummvm/scummvm/commit/c3c0d04d2a2f97c1f059963a8ed5d921f9f61759
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-16T15:44:28-08:00

Commit Message:
MOHAWK: Hook Myst & Riven into SaveStateDescriptor autosave flag

Changed paths:
    engines/mohawk/myst.cpp
    engines/mohawk/myst_state.cpp
    engines/mohawk/riven_saveload.cpp


diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 86a0947..d6946e1 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -967,7 +967,7 @@ Common::Error MohawkEngine_Myst::saveGameState(int slot, const Common::String &d
 		thumbnail = _gfx->getThumbnailForMainMenu();
 	}
 
-	return _gameState->save(slot, desc, thumbnail, false) ? Common::kNoError : Common::kUnknownError;
+	return _gameState->save(slot, desc, thumbnail, isAutosave) ? Common::kNoError : Common::kUnknownError;
 }
 
 bool MohawkEngine_Myst::canSaveAutosaveCurrently() {
diff --git a/engines/mohawk/myst_state.cpp b/engines/mohawk/myst_state.cpp
index 782d83e..edf744c 100644
--- a/engines/mohawk/myst_state.cpp
+++ b/engines/mohawk/myst_state.cpp
@@ -320,10 +320,12 @@ SaveStateDescriptor MystGameState::querySaveMetaInfos(int slot) {
 	}
 
 	// Set the save description
+	desc.setSaveSlot(slot);
 	desc.setDescription(metadata.saveDescription);
 	desc.setSaveDate(metadata.saveYear, metadata.saveMonth, metadata.saveDay);
 	desc.setSaveTime(metadata.saveHour, metadata.saveMinute);
 	desc.setPlayTime(metadata.totalPlayTime);
+	desc.setAutosave(metadata.autoSave);
 	if (metadata.autoSave) // Allow non-saves to be deleted, but not autosaves
 		desc.setDeletableFlag(slot != kAutoSaveSlot);
 
diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp
index ab73ad1..a57ba9e 100644
--- a/engines/mohawk/riven_saveload.cpp
+++ b/engines/mohawk/riven_saveload.cpp
@@ -135,10 +135,12 @@ SaveStateDescriptor RivenSaveLoad::querySaveMetaInfos(const int slot) {
 		return descriptor;
 	}
 
+	descriptor.setSaveSlot(slot);
 	descriptor.setDescription(metadata.saveDescription);
 	descriptor.setPlayTime(metadata.totalPlayTime);
 	descriptor.setSaveDate(metadata.saveYear, metadata.saveMonth, metadata.saveDay);
 	descriptor.setSaveTime(metadata.saveHour, metadata.saveMinute);
+	descriptor.setAutosave(metadata.autoSave);
 
 	delete metaStream;
 




More information about the Scummvm-git-logs mailing list