[Scummvm-git-logs] scummvm master -> 6a3663bd72ef64fbd3a0a3c79d11d5fccee11516

aquadran noreply at scummvm.org
Thu Sep 4 16:15:33 UTC 2025


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

Summary:
6a3663bd72 WINTERMUTE: Move back code to original place


Commit: 6a3663bd72ef64fbd3a0a3c79d11d5fccee11516
    https://github.com/scummvm/scummvm/commit/6a3663bd72ef64fbd3a0a3c79d11d5fccee11516
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-09-04T18:15:27+02:00

Commit Message:
WINTERMUTE: Move back code to original place

Changed paths:
  R engines/wintermute/base/base_game_settings.cpp
  R engines/wintermute/base/base_game_settings.h
  R engines/wintermute/base/saveload.cpp
  R engines/wintermute/base/saveload.h
    engines/wintermute/ad/ad_game.cpp
    engines/wintermute/ad/ad_node_state.cpp
    engines/wintermute/ad/ad_object.cpp
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h
    engines/wintermute/base/base_object.cpp
    engines/wintermute/base/base_persistence_manager.cpp
    engines/wintermute/base/base_string_table.h
    engines/wintermute/base/gfx/base_renderer.cpp
    engines/wintermute/base/gfx/base_renderer.h
    engines/wintermute/base/gfx/base_renderer3d.cpp
    engines/wintermute/base/gfx/base_renderer3d.h
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/save_thumb_helper.cpp
    engines/wintermute/module.mk
    engines/wintermute/system/sys_class_registry.cpp
    engines/wintermute/ui/ui_button.cpp
    engines/wintermute/ui/ui_edit.cpp
    engines/wintermute/ui/ui_text.cpp
    engines/wintermute/ui/ui_window.cpp
    engines/wintermute/video/subtitle_card.cpp
    engines/wintermute/wintermute.cpp


diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp
index baa5c5ae9aa..225aced9864 100644
--- a/engines/wintermute/ad/ad_game.cpp
+++ b/engines/wintermute/ad/ad_game.cpp
@@ -54,7 +54,7 @@
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_viewport.h"
 #include "engines/wintermute/base/particles/part_emitter.h"
-#include "engines/wintermute/base/saveload.h"
+#include "engines/wintermute/base/save_thumb_helper.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
 #include "engines/wintermute/base/scriptables/script_engine.h"
 #include "engines/wintermute/base/scriptables/script.h"
@@ -459,7 +459,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 			const char *mm = "interface\\system\\mainmenu.window";
 			const char *fn = obj->getFilename();
 			if (fn && strcmp(fn, mm) == 0) {
-				deleteSaveThumbnail();
+				SAFE_DELETE(_cachedThumbnail);
 			}
 		}
 
@@ -570,7 +570,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 			if (res) {
 				res->_iD = id;
 				res->setText(text);
-				expandStringByStringTable(&res->_text);
+				_stringTable->expand(&res->_text);
 
 				if (!val1->isNULL()) {
 					res->setIcon(val1->getString());
@@ -2107,7 +2107,12 @@ bool AdGame::displayContent(bool doUpdate, bool displayAll) {
 			_inventoryBox->display();
 		if (_stateEx == GAME_WAITING_RESPONSE)
 			_responseBox->display();
-		_renderer->displayIndicator();
+#ifdef ENABLE_FOXTAIL
+		if (BaseEngine::instance().isFoxTail())
+			displayIndicatorFoxTail();
+		else
+#endif
+		displayIndicator();
 
 
 		if (doUpdate || displayAll) {
diff --git a/engines/wintermute/ad/ad_node_state.cpp b/engines/wintermute/ad/ad_node_state.cpp
index 6ca8212bad8..dbbb6e14a9a 100644
--- a/engines/wintermute/ad/ad_node_state.cpp
+++ b/engines/wintermute/ad/ad_node_state.cpp
@@ -113,7 +113,7 @@ void AdNodeState::setCaption(const char *caption, int caseVal) {
 	size_t captionSize = strlen(caption) + 1;
 	_caption[caseVal - 1] = new char[captionSize];
 	Common::strcpy_s(_caption[caseVal - 1], captionSize, caption);
-	_game->expandStringByStringTable(&_caption[caseVal - 1]);
+	_game->_stringTable->expand(&_caption[caseVal - 1]);
 }
 
 
diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp
index db2afd5c4cf..a7fbc3f5ec6 100644
--- a/engines/wintermute/ad/ad_object.cpp
+++ b/engines/wintermute/ad/ad_object.cpp
@@ -886,7 +886,7 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const
 	SAFE_DELETE(_sentence->_sound);
 
 	_sentence->setText(text);
-	_game->expandStringByStringTable(&_sentence->_text);
+	_game->_stringTable->expand(&_sentence->_text);
 	_sentence->setStances(stances);
 	_sentence->_duration = duration;
 	_sentence->_align = align;
@@ -898,7 +898,7 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const
 	// try to locate speech file automatically
 	bool deleteSound = false;
 	if (!sound) {
-		char *key = _game->getKeyFromStringTable(text);
+		char *key = _game->_stringTable->getKey(text);
 		if (key) {
 			sound = ((AdGame *)_game)->findSpeechFile(key);
 			delete[] key;
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index c5ffb4266db..73fee43af34 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -28,7 +28,6 @@
 #include "engines/wintermute/dcgf.h"
 #include "engines/wintermute/base/base_engine.h"
 #include "engines/wintermute/base/base_game.h"
-#include "engines/wintermute/base/base_game_settings.h"
 #include "engines/wintermute/base/base_fader.h"
 #include "engines/wintermute/base/base_file_manager.h"
 #include "engines/wintermute/base/font/base_font.h"
@@ -38,6 +37,7 @@
 #include "engines/wintermute/base/gfx/base_renderer3d.h"
 #endif
 #include "engines/wintermute/base/gfx/base_image.h"
+#include "engines/wintermute/base/gfx/base_surface.h"
 #include "engines/wintermute/base/base_keyboard_state.h"
 #include "engines/wintermute/base/base_parser.h"
 #include "engines/wintermute/base/base_quick_msg.h"
@@ -48,7 +48,6 @@
 #include "engines/wintermute/base/base_viewport.h"
 #include "engines/wintermute/base/base_region.h"
 #include "engines/wintermute/base/base_surface_storage.h"
-#include "engines/wintermute/base/saveload.h"
 #include "engines/wintermute/base/save_thumb_helper.h"
 #include "engines/wintermute/base/scriptables/script_ext_array.h"
 #include "engines/wintermute/base/scriptables/script_value.h"
@@ -67,6 +66,8 @@
 #include "engines/wintermute/ui/ui_window.h"
 #include "engines/wintermute/wintermute.h"
 #include "engines/wintermute/platform_osystem.h"
+#include "engines/wintermute/ad/ad_scene.h"
+
 #include "base/version.h"
 #include "common/config-manager.h"
 #include "common/savefile.h"
@@ -84,6 +85,7 @@
 #ifdef ENABLE_WME3D
 #include "graphics/renderer.h"
 #include "engines/util.h"
+#include "engines/wintermute/base/gfx/xmodel.h"
 #if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS)
 #include "graphics/opengl/context.h"
 #endif
@@ -170,11 +172,24 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_useD3D = false;
 #endif
 
+	_stringTable = new BaseStringTable(this);
+
 	for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) {
 		_music[i] = nullptr;
 		_musicStartTime[i] = 0;
 	}
 
+	_settingsResWidth = 800;
+	_settingsResHeight = 600;
+	_settingsRequireAcceleration = false;
+	_settingsRequireSound = false;
+	_settingsTLMode = 0;
+	_settingsAllowWindowed = true;
+	_settingsGameFile = nullptr;
+	_settingsAllowAdvanced = false;
+	_settingsAllowAccessTab = true;
+	_settingsAllowAboutTab = true;
+	_settingsAllowDesktopRes = false;
 
 	_editorForceScripts = false;
 	_editorAlwaysRegister = false;
@@ -188,6 +203,7 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_scheduledLoadSlot = -1;
 
 	_personalizedSave = false;
+	_compressedSavegames = true;
 
 	_editorMode = false;
 
@@ -212,6 +228,17 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_thumbnailWidth = kThumbnailWidth;
 	_thumbnailHeight = kThumbnailHeight2;
 
+	_indicatorDisplay = false;
+	_indicatorColor = BYTETORGBA(255, 0, 0, 128);
+	_indicatorProgress = 0;
+	_indicatorX = -1;
+	_indicatorY = -1;
+	_indicatorWidth = -1;
+	_indicatorHeight = 8;
+	_richSavedGames = false;
+	_savedGameExt = "dsv";
+
+
 	_musicCrossfadeRunning = false;
 	_musicCrossfadeStartTime = 0;
 	_musicCrossfadeLength = 0;
@@ -221,6 +248,15 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_musicCrossfadeVolume1 = 0;
 	_musicCrossfadeVolume2 = 100;
 
+	_loadImageName = "";
+	_saveImageName = "";
+	_saveLoadImage = nullptr;
+
+	_saveImageX = _saveImageY = 0;
+	_loadImageX = _loadImageY = 0;
+
+	_hasDrawnSaveLoadImage = false;
+
 #ifdef ENABLE_WME3D
 	_maxShadowType = SHADOW_STENCIL;
 	_supportsRealTimeShadows = false;
@@ -277,8 +313,6 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_autoSaveSlot = 999;
 	_cursorHidden = false;
 
-	_settings = new BaseGameSettings(this);
-
 #ifdef ENABLE_HEROCRAFT
 	_rndHc = new Common::RandomSource("HeroCraft");
 #endif
@@ -297,6 +331,10 @@ BaseGame::~BaseGame() {
 
 	cleanup();
 
+	SAFE_DELETE_ARRAY(_settingsGameFile);
+	SAFE_DELETE(_cachedThumbnail);
+
+	SAFE_DELETE(_saveLoadImage);
 	SAFE_DELETE(_mathClass);
 	SAFE_DELETE(_directoryClass);
 
@@ -311,7 +349,8 @@ BaseGame::~BaseGame() {
 
 	SAFE_DELETE(_renderer);
 	//SAFE_DELETE(m_AccessMgr);
-	SAFE_DELETE(_settings);
+
+	SAFE_DELETE(_stringTable);
 
 #ifdef ENABLE_HEROCRAFT
 	SAFE_DELETE(_rndHc);
@@ -326,8 +365,6 @@ BaseGame::~BaseGame() {
 bool BaseGame::cleanup() {
 	SAFE_DELETE(_loadingIcon);
 
-	deleteSaveThumbnail();
-
 	_engineLogCallback = nullptr;
 	_engineLogCallbackData = nullptr;
 
@@ -440,13 +477,9 @@ bool BaseGame::initConfManSettings() {
 //////////////////////////////////////////////////////////////////////
 bool BaseGame::initRenderer() {
 	bool windowedMode = !ConfMan.getBool("fullscreen");
-	return _renderer->initRenderer(_settings->getResWidth(), _settings->getResHeight(), windowedMode);
+	return _renderer->initRenderer(_settingsResWidth, _settingsResHeight, windowedMode);
 }
 
-//////////////////////////////////////////////////////////////////////
-bool BaseGame::loadGameSettingsFile() {
-	return loadFile(_settings->getGameFile());
-}
 
 //////////////////////////////////////////////////////////////////////
 bool BaseGame::initialize1() {
@@ -564,13 +597,13 @@ bool BaseGame::initialize2() { // we know whether we are going to be accelerated
 	bool force2dRenderer = _force2dRenderer && !_playing3DGame;
 #if defined(USE_OPENGL_SHADERS)
 	if (!force2dRenderer && matchingRendererType == Graphics::kRendererTypeOpenGLShaders) {
-		initGraphics3d(_settings->getResWidth(), _settings->getResHeight());
+		initGraphics3d(_settingsResWidth, _settingsResHeight);
 		_renderer3D = makeOpenGL3DShaderRenderer(this);
 	}
 #endif // defined(USE_OPENGL_SHADERS)
 #if defined(USE_OPENGL_GAME)
 	if (!force2dRenderer && matchingRendererType == Graphics::kRendererTypeOpenGL) {
-		initGraphics3d(_settings->getResWidth(), _settings->getResHeight());
+		initGraphics3d(_settingsResWidth, _settingsResHeight);
 		_renderer3D = makeOpenGL3DRenderer(this);
 	}
 #endif // defined(USE_OPENGL)
@@ -602,9 +635,13 @@ bool BaseGame::initialize2() { // we know whether we are going to be accelerated
 bool BaseGame::initialize3() { // renderer is initialized
 	_posX = _renderer->getWidth() / 2;
 	_posY = _renderer->getHeight() / 2;
-	_renderer->initIndicator();
 
-	//if(m_AccessMgr) Game->m_AccessMgr->Initialize();
+	if (_indicatorY == -1)
+		_indicatorY = _renderer->getHeight() - _indicatorHeight;
+	if (_indicatorX == -1)
+		_indicatorX = 0;
+	if (_indicatorWidth == -1)
+		_indicatorWidth = _renderer->getWidth();
 
 	return STATUS_OK;
 }
@@ -886,17 +923,6 @@ bool BaseGame::loadBuffer(char *buffer, bool complete) {
 	TOKEN_TABLE(COMPAT_KILL_METHOD_THREADS)
 	TOKEN_TABLE_END
 
-	// Declare a few variables necessary for moving data from these settings over to the renderer:
-	// The values are the same as the defaults set in BaseRenderer.
-	int loadImageX = 0;
-	int loadImageY = 0;
-	int saveImageX = 0;
-	int saveImageY = 0;
-	int indicatorX = -1;
-	int indicatorY = -1;
-	int indicatorWidth = -1;
-	int indicatorHeight = 8;
-	uint32 indicatorColor = BYTETORGBA(255, 0, 0, 128);
 	Common::String loadImageName = "";
 	Common::String saveImageName = "";
 
@@ -1022,26 +1048,26 @@ bool BaseGame::loadBuffer(char *buffer, bool complete) {
 			break;
 
 		case TOKEN_INDICATOR_X:
-			parser.scanStr(params, "%d", &indicatorX);
+			parser.scanStr(params, "%d", &_indicatorX);
 			break;
 
 		case TOKEN_INDICATOR_Y:
-			parser.scanStr(params, "%d", &indicatorY);
+			parser.scanStr(params, "%d", &_indicatorY);
 			break;
 
 		case TOKEN_INDICATOR_COLOR: {
 			int r, g, b, a;
 			parser.scanStr(params, "%d,%d,%d,%d", &r, &g, &b, &a);
-			indicatorColor = BYTETORGBA(r, g, b, a);
+			_indicatorColor = BYTETORGBA(r, g, b, a);
 		}
 		break;
 
 		case TOKEN_INDICATOR_WIDTH:
-			parser.scanStr(params, "%d", &indicatorWidth);
+			parser.scanStr(params, "%d", &_indicatorWidth);
 			break;
 
 		case TOKEN_INDICATOR_HEIGHT:
-			parser.scanStr(params, "%d", &indicatorHeight);
+			parser.scanStr(params, "%d", &_indicatorHeight);
 			break;
 
 		case TOKEN_SAVE_IMAGE:
@@ -1049,11 +1075,11 @@ bool BaseGame::loadBuffer(char *buffer, bool complete) {
 			break;
 
 		case TOKEN_SAVE_IMAGE_X:
-			parser.scanStr(params, "%d", &saveImageX);
+			parser.scanStr(params, "%d", &_saveImageX);
 			break;
 
 		case TOKEN_SAVE_IMAGE_Y:
-			parser.scanStr(params, "%d", &saveImageY);
+			parser.scanStr(params, "%d", &_saveImageY);
 			break;
 
 		case TOKEN_LOAD_IMAGE:
@@ -1061,11 +1087,11 @@ bool BaseGame::loadBuffer(char *buffer, bool complete) {
 			break;
 
 		case TOKEN_LOAD_IMAGE_X:
-			parser.scanStr(params, "%d", &loadImageX);
+			parser.scanStr(params, "%d", &_loadImageX);
 			break;
 
 		case TOKEN_LOAD_IMAGE_Y:
-			parser.scanStr(params, "%d", &loadImageY);
+			parser.scanStr(params, "%d", &_loadImageY);
 			break;
 
 		case TOKEN_LOCAL_SAVE_DIR:
@@ -1081,11 +1107,6 @@ bool BaseGame::loadBuffer(char *buffer, bool complete) {
 		}
 	}
 
-	_renderer->setIndicator(indicatorWidth, indicatorHeight, indicatorX, indicatorY, indicatorColor);
-	_renderer->initIndicator(); // In case we just reset the values.
-	_renderer->setSaveImage(saveImageName.c_str(), saveImageX, saveImageY);
-	_renderer->setLoadingScreen(loadImageName.c_str(), loadImageX, loadImageY);
-
 	if (!_systemFont) {
 		_systemFont = _game->_fontStorage->addFont("system_font.fnt");
 	}
@@ -1171,7 +1192,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			clearOld = val->getBool();
 		}
 
-		if (DID_FAIL(_settings->loadStringTable(filename, clearOld))) {
+		if (DID_FAIL(_stringTable->loadFile(filename, clearOld))) {
 			stack->pushBool(false);
 		} else {
 			stack->pushBool(true);
@@ -1249,7 +1270,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		size_t strSize = strlen(val->getString()) + 1;
 		char *str = new char[strSize];
 		Common::strcpy_s(str, strSize, val->getString());
-		expandStringByStringTable(&str);
+		_stringTable->expand(&str);
 		stack->pushString(str);
 		delete[] str;
 		return STATUS_OK;
@@ -1495,7 +1516,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			return STATUS_OK;
 		}
 
-		_musicCrossfadeStartTime = _game->_liveTimer;
+		_musicCrossfadeStartTime = _liveTimer;
 		_musicCrossfadeChannel1 = channel1;
 		_musicCrossfadeChannel2 = channel2;
 		_musicCrossfadeLength = fadeLength;
@@ -1808,7 +1829,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	else if (strcmp(name, "IsSaveSlotUsed") == 0) {
 		stack->correctParams(1);
 		int slot = stack->pop()->getInt();
-		stack->pushBool(SaveLoad::isSaveSlotUsed(slot));
+		stack->pushBool(isSaveSlotUsed(slot));
 		return STATUS_OK;
 	}
 
@@ -1818,7 +1839,8 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	else if (strcmp(name, "GetSaveSlotDescription") == 0) {
 		stack->correctParams(1);
 		int slot = stack->pop()->getInt();
-		Common::String desc = SaveLoad::getSaveSlotDescription(slot);
+		Common::String desc;
+		getSaveSlotDescription(slot, desc);
 		stack->pushString(desc.c_str());
 		return STATUS_OK;
 	}
@@ -1836,7 +1858,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		int slot = stack->pop()->getInt();
 
 		TimeDate time;
-		SaveLoad::getSaveSlotTimestamp(slot, &time);
+		getSaveSlotTimestamp(slot, &time);
 		stack->pushInt(time.tm_sec);
 		stack->pushInt(time.tm_min);
 		stack->pushInt(time.tm_hour);
@@ -1847,7 +1869,8 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		BaseScriptable *date = makeSXDate(_game, stack);
 		stack->pushNative(date, false);
 
-		Common::String desc = SaveLoad::getSaveSlotDescription(slot);
+		Common::String desc;
+		getSaveSlotDescription(slot, desc);
 		stack->pushString(desc.c_str());
 
 		BaseScriptable *obj;
@@ -1885,7 +1908,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	else if (strcmp(name, "EmptySaveSlot") == 0) {
 		stack->correctParams(1);
 		int slot = stack->pop()->getInt();
-		SaveLoad::emptySaveSlot(slot);
+		emptySaveSlot(slot);
 		stack->pushNULL();
 		return STATUS_OK;
 	}
@@ -2066,7 +2089,11 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		// Thus, we get black screenshots when saving game from in-game menus
 		// Let's take & keep screenshot before entering main menu
 		if (duration == 750 && BaseEngine::instance().getGameId() == "corrosion") {
-			storeSaveThumbnail();
+			SAFE_DELETE(_cachedThumbnail);
+			_cachedThumbnail = new SaveThumbHelper(this);
+			if (DID_FAIL(_cachedThumbnail->storeThumbnail())) {
+				SAFE_DELETE(_cachedThumbnail);
+			}
 		}
 
 		bool system = (strcmp(name, "SystemFadeOut") == 0 || strcmp(name, "SystemFadeOutAsync") == 0);
@@ -2226,13 +2253,13 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	else if (strcmp(name, "SetLoadingScreen") == 0) {
 		stack->correctParams(3);
 		ScValue *val = stack->pop();
-		int loadImageX = stack->pop()->getInt();
-		int loadImageY = stack->pop()->getInt();
+		_loadImageX = stack->pop()->getInt();
+		_loadImageY = stack->pop()->getInt();
 
 		if (val->isNULL()) {
-			_renderer->setLoadingScreen(NULL, loadImageX, loadImageY);
+			_saveImageName = "";
 		} else {
-			_renderer->setLoadingScreen(val->getString(), loadImageX, loadImageY);
+			_loadImageName = val->getString();
 		}
 		stack->pushNULL();
 		return STATUS_OK;
@@ -2244,13 +2271,13 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	else if (strcmp(name, "SetSavingScreen") == 0) {
 		stack->correctParams(3);
 		ScValue *val = stack->pop();
-		int saveImageX = stack->pop()->getInt();
-		int saveImageY = stack->pop()->getInt();
+		_saveImageX = stack->pop()->getInt();
+		_saveImageY = stack->pop()->getInt();
 
 		if (val->isNULL()) {
-			_renderer->setSaveImage(NULL, saveImageX, saveImageY);
+			_saveImageName = "";
 		} else {
-			_renderer->setSaveImage(val->getString(), saveImageX, saveImageY);
+			_loadImageName = val->getString();
 		}
 		stack->pushNULL();
 		return STATUS_OK;
@@ -2415,7 +2442,14 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "StoreSaveThumbnail") == 0) {
 		stack->correctParams(0);
-		stack->pushBool(storeSaveThumbnail());
+		SAFE_DELETE(_cachedThumbnail);
+		_cachedThumbnail = new SaveThumbHelper(this);
+		if (DID_FAIL(_cachedThumbnail->storeThumbnail())) {
+			SAFE_DELETE(_cachedThumbnail);
+			stack->pushBool(false);
+		} else
+			stack->pushBool(true);
+
 		return STATUS_OK;
 	}
 
@@ -2424,8 +2458,9 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "DeleteSaveThumbnail") == 0) {
 		stack->correctParams(0);
-		deleteSaveThumbnail();
+		SAFE_DELETE(_cachedThumbnail);
 		stack->pushNULL();
+
 		return STATUS_OK;
 	}
 
@@ -4129,12 +4164,52 @@ bool BaseGame::showCursor() {
 	return STATUS_FAILED;
 }
 
-
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::saveGame(int32 slot, const char *desc, bool quickSave) {
-	return SaveLoad::saveGame(slot, desc, quickSave, _game);
-}
+	Common::String filename;
+	getSaveSlotFilename(slot, filename);
+
+	_game->LOG(0, "Saving game '%s'...", filename.c_str());
 
+	pluginEvents().applyEvent(WME_EVENT_GAME_BEFORE_SAVE, nullptr);
+	applyEvent("BeforeSave", true);
+
+	bool ret;
+
+	_indicatorDisplay = true;
+	_indicatorProgress = 0;
+	_hasDrawnSaveLoadImage = false;
+
+	BasePersistenceManager *pm = new BasePersistenceManager();
+	if (DID_SUCCEED(ret = pm->initSave(desc))) {
+		if (!quickSave) {
+			SAFE_DELETE(_saveLoadImage);
+			if (_saveImageName.size())
+				_saveLoadImage = _game->_renderer->createSurface();
+			if (!_saveLoadImage || DID_FAIL(_saveLoadImage->create(_saveImageName, true, 0, 0, 0))) {
+				SAFE_DELETE(_saveLoadImage);
+			}
+		}
+		if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->saveTable(_game, pm, quickSave))) {
+			if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->saveInstances(_game, pm, quickSave))) {
+				pm->putDWORD(BaseEngine::instance().getRandomSource()->getSeed());
+				if (DID_SUCCEED(ret = pm->saveFile(filename))) {
+					ConfMan.setInt("most_recent_saveslot", slot);
+					ConfMan.flushToDisk();
+				}
+			}
+		}
+	}
+
+	delete pm;
+	_indicatorDisplay = false;
+
+	_renderer->endSaveLoad();
+
+	SAFE_DELETE(_saveLoadImage);
+
+	return ret;
+}
 
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::loadGame(uint32 slot) {
@@ -4143,15 +4218,124 @@ bool BaseGame::loadGame(uint32 slot) {
 	_loading = false;
 	_scheduledLoadSlot = -1;
 
-	Common::String filename = SaveLoad::getSaveSlotFilename(slot);
+	Common::String filename;
+	getSaveSlotFilename(slot, filename);
 
 	return loadGame(filename.c_str());
 }
 
-
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::loadGame(const char *filename) {
-	return SaveLoad::loadGame(filename, _game);
+	LOG(0, "Loading game '%s'...", filename);
+
+	bool ret;
+
+	stopVideo();
+	SAFE_DELETE(_saveLoadImage);
+	if (_loadImageName.size()) {
+		_saveLoadImage = _game->_renderer->createSurface();
+
+		if (!_saveLoadImage || DID_FAIL(_saveLoadImage->create(_loadImageName, true, 0, 0, 0))) {
+			SAFE_DELETE(_saveLoadImage);
+		}
+	}
+
+	_loadInProgress = true;
+	_indicatorDisplay = true;
+	_indicatorProgress = 0;
+	_hasDrawnSaveLoadImage = false;
+
+	pluginEvents().clearEvents();
+
+	BasePersistenceManager *pm = new BasePersistenceManager();
+	if (DID_SUCCEED(ret = pm->initLoad(filename))) {
+		//if (DID_SUCCEED(ret = cleanup())) {
+		if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->loadTable(_game, pm))) {
+			if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->loadInstances(_game, pm))) {
+				// Restore random-seed:
+				BaseEngine::instance().getRandomSource()->setSeed(pm->getDWORD());
+
+				// data initialization after load
+				initAfterLoad();
+
+				pluginEvents().applyEvent(WME_EVENT_GAME_AFTER_LOAD, nullptr);
+				applyEvent("AfterLoad", true);
+
+				displayContent(true, false);
+				//_renderer->flip();
+
+				//accessUnpause();
+			}
+		}
+	}
+
+	_indicatorDisplay = false;
+	delete pm;
+	_loadInProgress = false;
+
+	_renderer->endSaveLoad();
+
+	SAFE_DELETE(_saveLoadImage);
+
+	//BaseEngine::LOG(0, "Load end %d", BaseUtils::GetUsedMemMB());
+
+	// AdGame:
+	if (DID_SUCCEED(ret)) {
+		SystemClassRegistry::getInstance()->enumInstances(afterLoadRegion, "AdRegion", nullptr);
+	}
+	return ret;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::initAfterLoad() {
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadRegion,   "BaseRegion",   nullptr);
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadSubFrame, "BaseSubFrame", nullptr);
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadSound,    "BaseSound",    nullptr);
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadFont,     "BaseFontTT",   nullptr);
+#ifdef ENABLE_WME3D
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadXModel,   "XModel",       nullptr);
+#endif
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadScript,   "ScScript",     nullptr);
+	// AdGame:
+	SystemClassRegistry::getInstance()->enumInstances(afterLoadScene,    "AdScene",      nullptr);
+	return STATUS_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadScene(void *scene, void *data) {
+	((AdScene *)scene)->afterLoad();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadRegion(void *region, void *data) {
+	((BaseRegion *)region)->createRegion();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadSubFrame(void *subframe, void *data) {
+	((BaseSubFrame *)subframe)->setSurfaceSimple();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadSound(void *sound, void *data) {
+	((BaseSound *)sound)->setSoundSimple();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadFont(void *font, void *data) {
+	((BaseFont *)font)->afterLoad();
+}
+
+#ifdef ENABLE_WME3D
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadXModel(void *model, void *data) {
+	((XModel *)model)->initializeSimple();
+}
+#endif
+
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::afterLoadScript(void *script, void *data) {
+	((ScScript *)script)->afterLoad();
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -4190,8 +4374,7 @@ bool BaseGame::playMusic(int channel, const char *filename, bool looping, uint32
 		return STATUS_FAILED;
 	}
 
-	delete _music[channel];
-	_music[channel] = nullptr;
+	SAFE_DELETE(_music[channel]);
 
 	_music[channel] = new BaseSound(_game);
 	if (_music[channel] && DID_SUCCEED(_music[channel]->setSound(filename, Audio::Mixer::kMusicSoundType, true))) {
@@ -4277,7 +4460,7 @@ bool BaseGame::updateMusicCrossfade() {
 	if (!_musicCrossfadeRunning) {
 		return STATUS_OK;
 	}
-	if (_game->_state == GAME_FROZEN) {
+	if (_state == GAME_FROZEN) {
 		return STATUS_OK;
 	}
 
@@ -4344,6 +4527,133 @@ bool BaseGame::updateMusicCrossfade() {
 	return STATUS_OK;
 }
 
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::loadSettings(const char *filename) {
+	TOKEN_TABLE_START(commands)
+	TOKEN_TABLE(SETTINGS)
+	TOKEN_TABLE(GAME)
+	TOKEN_TABLE(STRING_TABLE)
+	TOKEN_TABLE(RESOLUTION)
+	TOKEN_TABLE(REQUIRE_3D_ACCELERATION)
+	TOKEN_TABLE(REQUIRE_SOUND)
+	TOKEN_TABLE(HWTL_MODE)
+	TOKEN_TABLE(ALLOW_WINDOWED_MODE)
+	TOKEN_TABLE(ALLOW_ACCESSIBILITY_TAB)
+	TOKEN_TABLE(ALLOW_ABOUT_TAB)
+	TOKEN_TABLE(ALLOW_ADVANCED)
+	TOKEN_TABLE(ALLOW_DESKTOP_RES)
+	TOKEN_TABLE(REGISTRY_PATH)
+	TOKEN_TABLE(RICH_SAVED_GAMES)
+	TOKEN_TABLE(SAVED_GAME_EXT)
+	TOKEN_TABLE(GUID)
+	TOKEN_TABLE_END
+
+	char *origBuffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename);
+	if (origBuffer == nullptr) {
+		BaseEngine::LOG(0, "BaseGame::LoadSettings failed for file '%s'", filename);
+		return STATUS_FAILED;
+	}
+
+	bool ret = STATUS_OK;
+
+	char *buffer = origBuffer;
+	char *params;
+	int cmd;
+	BaseParser parser;
+
+	if (parser.getCommand(&buffer, commands, &params) != TOKEN_SETTINGS) {
+		BaseEngine::LOG(0, "'SETTINGS' keyword expected in game settings file.");
+		return STATUS_FAILED;
+	}
+	buffer = params;
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
+		switch (cmd) {
+			case TOKEN_GAME: {
+				SAFE_DELETE_ARRAY(_settingsGameFile);
+				size_t gameFileSize = strlen(params) + 1;
+				_settingsGameFile = new char[gameFileSize];
+				Common::strcpy_s(_settingsGameFile, gameFileSize, params);
+				break;
+			}
+
+			case TOKEN_STRING_TABLE:
+				if (DID_FAIL(_stringTable->loadFile(params))) {
+					cmd = PARSERR_GENERIC;
+				}
+				break;
+
+			case TOKEN_RESOLUTION:
+				parser.scanStr(params, "%d,%d", &_settingsResWidth, &_settingsResHeight);
+				break;
+
+			case TOKEN_REQUIRE_3D_ACCELERATION:
+				parser.scanStr(params, "%b", &_settingsRequireAcceleration);
+				break;
+
+			case TOKEN_REQUIRE_SOUND:
+				parser.scanStr(params, "%b", &_settingsRequireSound);
+				break;
+
+			case TOKEN_HWTL_MODE:
+				parser.scanStr(params, "%d", &_settingsTLMode);
+				break;
+
+			case TOKEN_ALLOW_WINDOWED_MODE:
+				parser.scanStr(params, "%b", &_settingsAllowWindowed);
+				break;
+
+			case TOKEN_ALLOW_DESKTOP_RES:
+				parser.scanStr(params, "%b", &_settingsAllowDesktopRes);
+				break;
+
+			case TOKEN_ALLOW_ADVANCED:
+				parser.scanStr(params, "%b", &_settingsAllowAdvanced);
+				break;
+
+			case TOKEN_ALLOW_ACCESSIBILITY_TAB:
+				parser.scanStr(params, "%b", &_settingsAllowAccessTab);
+				break;
+
+			case TOKEN_ALLOW_ABOUT_TAB:
+				parser.scanStr(params, "%b", &_settingsAllowAboutTab);
+				break;
+
+			case TOKEN_REGISTRY_PATH:
+				//BaseEngine::instance().getRegistry()->setBasePath(params);
+				break;
+
+			case TOKEN_RICH_SAVED_GAMES:
+				parser.scanStr(params, "%b", &_richSavedGames);
+				break;
+
+			case TOKEN_SAVED_GAME_EXT:
+				_savedGameExt = params;
+				break;
+
+			case TOKEN_GUID:
+				break;
+
+			default:
+				break;
+		}
+	}
+	if (cmd == PARSERR_TOKENNOTFOUND) {
+		BaseEngine::LOG(0, "Syntax error in game settings '%s'", filename);
+		ret = STATUS_FAILED;
+	}
+	if (cmd == PARSERR_GENERIC) {
+		BaseEngine::LOG(0, "Error loading game settings '%s'", filename);
+		ret = STATUS_FAILED;
+	}
+
+	_settingsAllowWindowed = true;
+	_compressedSavegames = true;
+
+	delete[] origBuffer;
+
+	return ret;
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::persist(BasePersistenceManager *persistMgr) {
 	if (!persistMgr->getIsSaving()) {
@@ -4410,7 +4720,12 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) {
 	persistMgr->transferUint32(TMEMBER(_liveTimerDelta));
 	persistMgr->transferUint32(TMEMBER(_liveTimerLast));
 
-	_renderer->persistSaveLoadImages(persistMgr);
+	persistMgr->transferString(TMEMBER(_loadImageName));
+	persistMgr->transferString(TMEMBER(_saveImageName));
+	persistMgr->transferSint32(TMEMBER(_saveImageX));
+	persistMgr->transferSint32(TMEMBER(_saveImageY));
+	persistMgr->transferSint32(TMEMBER(_loadImageX));
+	persistMgr->transferSint32(TMEMBER(_loadImageY));
 
 #ifdef ENABLE_WME3D
 	if (BaseEngine::instance().getFlags() & GF_3D) {
@@ -4440,8 +4755,9 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) {
 	persistMgr->transferBool(TMEMBER(_cursorHidden));
 
 	if (persistMgr->checkVersion(1, 3, 1)) {
-		_settings->persist(persistMgr);
+		_stringTable->persist(persistMgr);
 	}
+
 	//PersistMgr->Transfer(TMEMBER(m_AccessShieldWin));
 
 	if (!persistMgr->getIsSaving()) {
@@ -4635,6 +4951,59 @@ void BaseGame::setWindowTitle() {
 	}
 }
 
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::getSaveSlotFilename(int slot, Common::String &filename) {
+	BasePersistenceManager *pm = new BasePersistenceManager();
+	if (pm) {
+		filename = pm->getFilenameForSlot(slot);
+		delete pm;
+		debugC(kWintermuteDebugSaveGame, "getSaveSlotFileName(%d) = %s", slot, filename.c_str());
+	}
+
+	return STATUS_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::getSaveSlotDescription(int slot, Common::String &description) {
+	Common::String filename;
+	getSaveSlotFilename(slot, filename);
+	BasePersistenceManager *pm = new BasePersistenceManager();
+	if (!pm)
+		return STATUS_FAILED;
+		
+	if (DID_FAIL(pm->initLoad(filename))) {
+		delete pm;
+		return STATUS_FAILED;
+	}
+
+	description = pm->_savedDescription;
+	delete pm;
+
+	return STATUS_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::isSaveSlotUsed(int slot) {
+	Common::String filename;
+	getSaveSlotFilename(slot, filename);
+	BasePersistenceManager *pm = new BasePersistenceManager();
+	bool ret = pm->getSaveExists(slot);
+	delete pm;
+
+	return ret;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::emptySaveSlot(int slot) {
+	Common::String filename;
+	getSaveSlotFilename(slot, filename);
+	BasePersistenceManager *pm = new BasePersistenceManager();
+
+	((WintermuteEngine *)g_engine)->getSaveFileMan()->removeSavefile(pm->getFilenameForSlot(slot));
+	delete pm;
+
+	return STATUS_OK;
+}
 
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::setActiveObject(BaseObject *obj) {
@@ -4783,7 +5152,39 @@ bool BaseGame::displayContent(bool doUpdate, bool displayAll) {
 bool BaseGame::displayContentSimple() {
 	// clear screen
 	_renderer->clear();
-	_renderer->displayIndicator();
+
+	if (_indicatorDisplay) {
+#ifdef ENABLE_FOXTAIL
+		if (BaseEngine::instance().isFoxTail())
+			displayIndicatorFoxTail();
+		else
+#endif
+		displayIndicator();
+	}
+
+	return STATUS_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::displayIndicator() {
+	if (_saveLoadImage && !_hasDrawnSaveLoadImage) {
+		Common::Rect32 rc;
+		BasePlatform::setRect(&rc, 0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight());
+		if (_loadInProgress)
+			_saveLoadImage->displayTrans(_loadImageX, _loadImageY, rc);
+		else
+			_saveLoadImage->displayTrans(_saveImageX, _saveImageY, rc);
+		_renderer->flip();
+		_hasDrawnSaveLoadImage = true;
+	}
+
+	// Original whole condition seems has typo with '&&' instead '||' for first part.
+	// Added _indicatorProgress to avoid draw on 0 progress
+	if (!_indicatorDisplay || !_indicatorProgress || _indicatorWidth <= 0 || _indicatorHeight <= 0)
+		return STATUS_OK;
+	int curWidth = (int)(_indicatorWidth * (float)((float)_indicatorProgress / 100.0f));
+	_renderer->fillRect(_indicatorX, _indicatorY, curWidth, _indicatorHeight, _indicatorColor);
+	_renderer->indicatorFlip(_indicatorX, _indicatorY, curWidth, _indicatorHeight);
 
 	return STATUS_OK;
 }
@@ -4830,8 +5231,7 @@ bool BaseGame::restoreDeviceObjects() {
 
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::setWaitCursor(const char *filename) {
-	delete _cursorNoninteractive;
-	_cursorNoninteractive = nullptr;
+	SAFE_DELETE(_cursorNoninteractive);
 
 	_cursorNoninteractive = new BaseSprite(_game);
 	if (!_cursorNoninteractive || DID_FAIL(_cursorNoninteractive->loadFile(filename))) {
@@ -4883,23 +5283,6 @@ bool BaseGame::renderShadowGeometry() {
 	return STATUS_OK;
 }
 
-//////////////////////////////////////////////////////////////////////////
-bool BaseGame::storeSaveThumbnail() {
-	delete _cachedThumbnail;
-	_cachedThumbnail = new SaveThumbHelper(this);
-	if (DID_FAIL(_cachedThumbnail->storeThumbnail())) {
-		deleteSaveThumbnail();
-		return false;
-	}
-	return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void BaseGame::deleteSaveThumbnail() {
-	SAFE_DELETE(_cachedThumbnail);
-}
-
-
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::onActivate(bool activate, bool refreshMouse) {
@@ -5229,14 +5612,15 @@ bool BaseGame::getFogParams(bool *fogEnabled, uint32 *, float *, float *) {
 #endif
 
 //////////////////////////////////////////////////////////////////////////
-void BaseGame::miniUpdate() { // TODO: Is this really necessary, it used to update sound, but the mixer does that now.
+bool BaseGame::miniUpdate() {
 	if (!_miniUpdateEnabled) {
-		return;
+		return true;
 	}
 
 	if (g_system->getMillis() - _lastMiniUpdate > 200) {
 		_lastMiniUpdate = g_system->getMillis();
 	}
+	return true;
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -5244,6 +5628,14 @@ bool BaseGame::onScriptShutdown(ScScript *script) {
 	return STATUS_OK;
 }
 
+//////////////////////////////////////////////////////////////////////////
+void BaseGame::setIndicatorVal(int value) {
+	bool redisplay = (_indicatorProgress != value);
+	_indicatorProgress = value;
+	if (redisplay)
+		displayIndicator();
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::isLeftDoubleClick() {
 	return isDoubleClick(0);
@@ -5302,25 +5694,6 @@ AnsiString BaseGame::getDeviceType() const {
 	return "computer";
 }
 
-//////////////////////////////////////////////////////////////////////////
-bool BaseGame::loadSettings(const char *filename) {
-	return _settings->loadSettings(filename);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void BaseGame::expandStringByStringTable(char **str) const {
-	_settings->expandStringByStringTable(str);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void BaseGame::expandStringByStringTable(Common::String &str) const {
-	_settings->expandStringByStringTable(str);
-}
-
-char *BaseGame::getKeyFromStringTable(const char *str) const {
-	return _settings->getKeyFromStringTable(str);
-}
-
 #ifdef ENABLE_HEROCRAFT
 uint8 BaseGame::getFilePartChecksumHc(const char *filename, uint32 begin, uint32 end) {
 	if (begin >= end) {
@@ -5355,6 +5728,44 @@ uint8 BaseGame::getFilePartChecksumHc(const char *filename, uint32 begin, uint32
 }
 #endif
 
+#ifdef ENABLE_FOXTAIL
+//////////////////////////////////////////////////////////////////////////
+bool BaseGame::displayIndicatorFoxTail() {
+	_renderer->clear();
+
+	// Original whole condition seems has typo with '&&' instead '||' for first part.
+	// Added _indicatorProgress to avoid draw on 0 progress
+	if (!_indicatorDisplay || !_indicatorProgress || _indicatorWidth <= 0 || _indicatorHeight <= 0)
+		return STATUS_OK;
+	int curWidth = (int)(_indicatorWidth * (float)((float)_indicatorProgress / 100.0f));
+	_renderer->fillRect(_indicatorX, _indicatorY, curWidth, _indicatorHeight, _indicatorColor);
+
+	if (_saveLoadImage) {
+		Common::Rect32 rc;
+		BasePlatform::setRect(&rc, 0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight());
+		if (_loadInProgress)
+			_saveLoadImage->displayTrans(_loadImageX, _loadImageY, rc);
+		else
+			_saveLoadImage->displayTrans(_saveImageX, _saveImageY, rc);
+		_renderer->flip();
+	}
+	_renderer->forcedFlip();
+
+	return STATUS_OK;
+}
+#endif
+
+void BaseGame::getSaveSlotTimestamp(int slot, TimeDate *time) {
+	memset(time, 0, sizeof(TimeDate));
+	Common::String filename;
+	getSaveSlotFilename(slot, filename);
+	BasePersistenceManager *pm = new BasePersistenceManager();
+	if ((pm->initLoad(filename))) {
+		*time = pm->getSavedTimestamp();
+	}
+	delete pm;
+}
+
 Common::String BaseGame::readRegistryString(const Common::String &key, const Common::String &initValue) const {
 	// Game specific hacks:
 	Common::String result = initValue;
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index 2bcb928ff45..7c0f71d507b 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -30,6 +30,7 @@
 
 #include "engines/wintermute/base/base_object.h"
 #include "engines/wintermute/base/base_game_custom_actions.h"
+#include "engines/wintermute/base/base_string_table.h"
 #include "engines/wintermute/ext/plugin_event.h"
 #include "engines/wintermute/persistent.h"
 #include "engines/wintermute/coll_templ.h"
@@ -107,7 +108,7 @@ public:
 	bool _autorunDisabled;
 	uint32 _lastMiniUpdate;
 	bool _miniUpdateEnabled;
-	virtual void miniUpdate();
+	virtual bool miniUpdate();
 
 	void getMousePos(Common::Point32 *Pos);
 	Common::Rect32 _mouseLockRect;
@@ -143,10 +144,34 @@ public:
 	bool setMaxShadowType(TShadowType maxShadowType);
 	virtual TShadowType getMaxShadowType(BaseObject *object = nullptr);
 
+	bool _indicatorDisplay;
+	uint32 _indicatorColor;
+	int32 _indicatorProgress;
+	int32 _indicatorX;
+	int32 _indicatorY;
+	int32 _indicatorWidth;
+	int32 _indicatorHeight;
+
+	Common::String _savedGameExt;
+	bool _richSavedGames;
+
 	int32 _editorResolutionWidth;
 	int32 _editorResolutionHeight;
 #endif
 
+	Common::String _loadImageName;
+	Common::String _saveImageName;
+	int32 _saveImageX;
+	int32 _saveImageY;
+	int32 _loadImageX;
+	int32 _loadImageY;
+	BaseSurface *_saveLoadImage;
+	bool _hasDrawnSaveLoadImage;
+
+	bool displayIndicator();
+#ifdef ENABLE_FOXTAIL
+	bool displayIndicatorFoxTail();
+#endif
 	uint32 _thumbnailWidth;
 	uint32 _thumbnailHeight;
 
@@ -171,11 +196,8 @@ public:
 	uint32 _deltaTime;
 	BaseFont *_systemFont;
 	BaseFont *_videoFont;
-
-	// Init-functions:
 	bool initConfManSettings();
 	bool initRenderer();
-	bool loadGameSettingsFile();
 	bool initialize1();
 	bool initialize2();
 	bool initialize3();
@@ -214,13 +236,19 @@ public:
 	bool _mouseLeftDown;
 	bool _mouseRightDown;
 	bool _mouseMidlleDown;
-	// String Table
-	void expandStringByStringTable(char **str) const;
-	void expandStringByStringTable(Common::String &str) const;
-	char *getKeyFromStringTable(const char *str) const;
-
-	BaseGameSettings *_settings;
-
+	BaseStringTable *_stringTable;
+
+	int _settingsResWidth;
+	int _settingsResHeight;
+	bool _settingsRequireAcceleration;
+	bool _settingsAllowWindowed;
+	bool _settingsAllowAdvanced;
+	bool _settingsAllowAccessTab;
+	bool _settingsAllowAboutTab;
+	bool _settingsRequireSound;
+	bool _settingsAllowDesktopRes;
+	int32 _settingsTLMode;
+	char *_settingsGameFile;
 	BaseFader *_fader;
 	bool _suppressScriptErrors;
 
@@ -250,10 +278,15 @@ public:
 	bool _videoSubtitles;
 	bool _subtitles; // RO
 	uint32 _musicStartTime[NUM_MUSIC_CHANNELS];
+	bool _compressedSavegames;
 	int32 _scheduledLoadSlot;
 	bool _loading;
 	bool _personalizedSave;
-
+	static bool emptySaveSlot(int slot);
+	static bool isSaveSlotUsed(int slot);
+	static bool getSaveSlotDescription(int slot, Common::String &desc);
+	static void getSaveSlotTimestamp(int slot, TimeDate *time);
+	static bool getSaveSlotFilename(int slot, Common::String &desc);
 	void setWindowTitle();
 	bool handleMouseWheel(int32 delta) override;
 	bool _quitting;
@@ -272,8 +305,16 @@ public:
 	bool _loadInProgress;
 	UIWindow *_focusedWindow;
 	bool _editorForceScripts;
-
+	static void afterLoadScene(void *scene, void *data);
+	static void afterLoadRegion(void *region, void *data);
+	static void afterLoadSubFrame(void *subframe, void *data);
+	static void afterLoadSound(void *sound, void *data);
+#ifdef ENABLE_WME3D
+	static void afterLoadXModel(void *model, void *data);
+#endif
+	static void afterLoadScript(void *script, void *data);
 	static void invalidateValues(void *value, void *data);
+	static void afterLoadFont(void *font, void *data);
 	bool loadSettings(const char *filename);
 	bool resumeMusic(int channel);
 	bool setMusicStartTime(int channel, uint32 time);
@@ -360,8 +401,8 @@ public:
 
 	BaseSprite *_lastCursor;
 	bool drawCursor(BaseSprite *Cursor);
-	bool storeSaveThumbnail();
-	void deleteSaveThumbnail();
+
+	virtual bool initAfterLoad();
 
 	SaveThumbHelper *_cachedThumbnail;
 
@@ -400,6 +441,7 @@ public:
 	BaseGameMusic *_musicSystem;
 	Common::String _targetName;
 
+	void setIndicatorVal(int value);
 	bool getBilinearFiltering() { return _bilinearFiltering; }
 	void addMem(int32 bytes);
 
diff --git a/engines/wintermute/base/base_game_settings.cpp b/engines/wintermute/base/base_game_settings.cpp
deleted file mode 100644
index 5643c56ad04..00000000000
--- a/engines/wintermute/base/base_game_settings.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * This file is based on WME Lite.
- * http://dead-code.org/redir.php?target=wmelite
- * Copyright (c) 2011 Jan Nedoma
- */
-
-#include "engines/wintermute/base/base_game_settings.h"
-#include "engines/wintermute/base/base_engine.h"
-#include "engines/wintermute/base/base_file_manager.h"
-#include "engines/wintermute/base/base_string_table.h"
-#include "engines/wintermute/base/base_parser.h"
-#include "engines/wintermute/wintypes.h"
-
-namespace Wintermute {
-
-BaseGameSettings::BaseGameSettings(BaseGame *gameRef) {
-	_resWidth = 800;
-	_resHeight = 600;
-	_requireAcceleration = false;
-	_requireSound = false;
-	_TLMode = 0;
-	_allowWindowed = true;
-	_gameFile = nullptr;
-	_allowAdvanced = false;
-	_allowAccessTab = true;
-	_allowAboutTab = true;
-	_allowDesktopRes = false;
-
-	_compressedSavegames = true;
-	_richSavedGames = false;
-	_savedGameExt = "dsv";
-
-	_stringTable = new BaseStringTable(gameRef);
-}
-
-BaseGameSettings::~BaseGameSettings() {
-	delete[] _gameFile;
-	_gameFile = nullptr;
-	delete _stringTable;
-	_stringTable = nullptr;
-}
-
-TOKEN_DEF_START
-TOKEN_DEF(GAME)
-TOKEN_DEF(STRING_TABLE)
-TOKEN_DEF(RESOLUTION)
-TOKEN_DEF(SETTINGS)
-TOKEN_DEF(REQUIRE_3D_ACCELERATION)
-TOKEN_DEF(REQUIRE_SOUND)
-TOKEN_DEF(HWTL_MODE)
-TOKEN_DEF(ALLOW_WINDOWED_MODE)
-TOKEN_DEF(ALLOW_ACCESSIBILITY_TAB)
-TOKEN_DEF(ALLOW_ABOUT_TAB)
-TOKEN_DEF(ALLOW_ADVANCED)
-TOKEN_DEF(ALLOW_DESKTOP_RES)
-TOKEN_DEF(REGISTRY_PATH)
-TOKEN_DEF(RICH_SAVED_GAMES)
-TOKEN_DEF(SAVED_GAME_EXT)
-TOKEN_DEF(GUID)
-TOKEN_DEF_END
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseGameSettings::loadSettings(const char *filename) {
-	TOKEN_TABLE_START(commands)
-	TOKEN_TABLE(SETTINGS)
-	TOKEN_TABLE(GAME)
-	TOKEN_TABLE(STRING_TABLE)
-	TOKEN_TABLE(RESOLUTION)
-	TOKEN_TABLE(REQUIRE_3D_ACCELERATION)
-	TOKEN_TABLE(REQUIRE_SOUND)
-	TOKEN_TABLE(HWTL_MODE)
-	TOKEN_TABLE(ALLOW_WINDOWED_MODE)
-	TOKEN_TABLE(ALLOW_ACCESSIBILITY_TAB)
-	TOKEN_TABLE(ALLOW_ABOUT_TAB)
-	TOKEN_TABLE(ALLOW_ADVANCED)
-	TOKEN_TABLE(ALLOW_DESKTOP_RES)
-	TOKEN_TABLE(REGISTRY_PATH)
-	TOKEN_TABLE(RICH_SAVED_GAMES)
-	TOKEN_TABLE(SAVED_GAME_EXT)
-	TOKEN_TABLE(GUID)
-	TOKEN_TABLE_END
-
-
-	char *origBuffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename);
-	if (origBuffer == nullptr) {
-		BaseEngine::LOG(0, "BaseGame::LoadSettings failed for file '%s'", filename);
-		return STATUS_FAILED;
-	}
-
-	bool ret = STATUS_OK;
-
-	char *buffer = origBuffer;
-	char *params;
-	int cmd;
-	BaseParser parser;
-
-	if (parser.getCommand(&buffer, commands, &params) != TOKEN_SETTINGS) {
-		BaseEngine::LOG(0, "'SETTINGS' keyword expected in game settings file.");
-		return STATUS_FAILED;
-	}
-	buffer = params;
-	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
-		switch (cmd) {
-			case TOKEN_GAME: {
-				delete[] _gameFile;
-				size_t gameFileSize = strlen(params) + 1;
-				_gameFile = new char[gameFileSize];
-				Common::strcpy_s(_gameFile, gameFileSize, params);
-				break;
-			}
-			case TOKEN_STRING_TABLE:
-				if (DID_FAIL(_stringTable->loadFile(params))) {
-					cmd = PARSERR_GENERIC;
-				}
-				break;
-
-			case TOKEN_RESOLUTION:
-				parser.scanStr(params, "%d,%d", &_resWidth, &_resHeight);
-				break;
-
-			case TOKEN_REQUIRE_3D_ACCELERATION:
-				parser.scanStr(params, "%b", &_requireAcceleration);
-				break;
-
-			case TOKEN_REQUIRE_SOUND:
-				parser.scanStr(params, "%b", &_requireSound);
-				break;
-
-			case TOKEN_HWTL_MODE:
-				parser.scanStr(params, "%d", &_TLMode);
-				break;
-
-			case TOKEN_ALLOW_WINDOWED_MODE:
-				parser.scanStr(params, "%b", &_allowWindowed);
-				break;
-
-			case TOKEN_ALLOW_DESKTOP_RES:
-				parser.scanStr(params, "%b", &_allowDesktopRes);
-				break;
-
-			case TOKEN_ALLOW_ADVANCED:
-				parser.scanStr(params, "%b", &_allowAdvanced);
-				break;
-
-			case TOKEN_ALLOW_ACCESSIBILITY_TAB:
-				parser.scanStr(params, "%b", &_allowAccessTab);
-				break;
-
-			case TOKEN_ALLOW_ABOUT_TAB:
-				parser.scanStr(params, "%b", &_allowAboutTab);
-				break;
-
-			case TOKEN_REGISTRY_PATH:
-				//BaseEngine::instance().getRegistry()->setBasePath(params);
-				break;
-
-			case TOKEN_RICH_SAVED_GAMES:
-				parser.scanStr(params, "%b", &_richSavedGames);
-				break;
-
-			case TOKEN_SAVED_GAME_EXT:
-				_savedGameExt = params;
-				break;
-
-			case TOKEN_GUID:
-				break;
-
-			default:
-				break;
-		}
-	}
-	if (cmd == PARSERR_TOKENNOTFOUND) {
-		BaseEngine::LOG(0, "Syntax error in game settings '%s'", filename);
-		ret = STATUS_FAILED;
-	}
-	if (cmd == PARSERR_GENERIC) {
-		BaseEngine::LOG(0, "Error loading game settings '%s'", filename);
-		ret = STATUS_FAILED;
-	}
-
-	_allowWindowed = true; // TODO: These two settings should probably be cleaned out altogether.
-	_compressedSavegames = true;
-
-	delete[] origBuffer;
-
-	return ret;
-}
-
-bool BaseGameSettings::loadStringTable(const char *filename, bool clearOld) {
-	return _stringTable->loadFile(filename, clearOld);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void BaseGameSettings::expandStringByStringTable(char **str) const {
-	_stringTable->expand(str);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void BaseGameSettings::expandStringByStringTable(Common::String &str) const {
-	_stringTable->expand(str);
-}
-
-char *BaseGameSettings::getKeyFromStringTable(const char *str) const {
-	return _stringTable->getKey(str);
-}
-
-bool BaseGameSettings::persist(BasePersistenceManager *persistMgr) {
-	return _stringTable->persist(persistMgr);
-}
-
-} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_game_settings.h b/engines/wintermute/base/base_game_settings.h
deleted file mode 100644
index aa0b9ef4a2f..00000000000
--- a/engines/wintermute/base/base_game_settings.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * This file is based on WME Lite.
- * http://dead-code.org/redir.php?target=wmelite
- * Copyright (c) 2011 Jan Nedoma
- */
-
-#ifndef WINTERMUTE_BASE_GAME_SETTINGS_H
-#define WINTERMUTE_BASE_GAME_SETTINGS_H
-
-#include "common/str.h"
-
-namespace Wintermute {
-class BaseStringTable;
-class BaseGame;
-class BasePersistenceManager;
-class BaseGameSettings {
-public:
-	const char *getGameFile() const { return (_gameFile ? _gameFile : "default.game"); }
-	int getResWidth() const { return _resWidth; }
-	int getResHeight() const { return _resHeight; }
-
-	BaseGameSettings(BaseGame *gameRef);
-	~BaseGameSettings();
-	bool loadSettings(const char *filename);
-	bool loadStringTable(const char *filename, bool clearOld);
-	void expandStringByStringTable(char **str) const;
-	void expandStringByStringTable(Common::String &str) const;
-	char *getKeyFromStringTable(const char *str) const;
-
-	bool persist(BasePersistenceManager *persistMgr);
-private:
-	char *_gameFile;
-	int _resWidth;
-	int _resHeight;
-	BaseStringTable *_stringTable;
-// Not ever used:
-	int _TLMode;
-	bool _compressedSavegames;
-	Common::String _savedGameExt;
-	bool _requireAcceleration;
-	bool _allowWindowed;
-	bool _allowAdvanced;
-	bool _allowAccessTab;
-	bool _allowAboutTab;
-	bool _requireSound;
-	bool _allowDesktopRes;
-// TODO: This can probably be removed completely:
-	bool _richSavedGames;
-};
-
-} // End of namespace Wintermute
-
-#endif
diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp
index 656db26245d..b99231dae95 100644
--- a/engines/wintermute/base/base_object.cpp
+++ b/engines/wintermute/base/base_object.cpp
@@ -182,7 +182,7 @@ void BaseObject::setCaption(const char *caption, int caseVal) {
 	size_t captionSize = strlen(caption) + 1;
 	_caption[caseVal - 1] = new char[captionSize];
 	Common::strcpy_s(_caption[caseVal - 1], captionSize, caption);
-	_game->expandStringByStringTable(&_caption[caseVal - 1]);
+	_game->_stringTable->expand(&_caption[caseVal - 1]);
 }
 
 
diff --git a/engines/wintermute/base/base_persistence_manager.cpp b/engines/wintermute/base/base_persistence_manager.cpp
index 188b98a576f..62eba017b78 100644
--- a/engines/wintermute/base/base_persistence_manager.cpp
+++ b/engines/wintermute/base/base_persistence_manager.cpp
@@ -232,8 +232,7 @@ bool BasePersistenceManager::initSave(const Common::String &desc) {
 		if (!_game->_cachedThumbnail) {
 			_game->_cachedThumbnail = new SaveThumbHelper(_game);
 			if (DID_FAIL(_game->_cachedThumbnail->storeThumbnail(true))) {
-				delete _game->_cachedThumbnail;
-				_game->_cachedThumbnail = nullptr;
+				SAFE_DELETE(_game->_cachedThumbnail);
 			}
 		}
 
diff --git a/engines/wintermute/base/base_string_table.h b/engines/wintermute/base/base_string_table.h
index adab3210f61..ffe1c3b600a 100644
--- a/engines/wintermute/base/base_string_table.h
+++ b/engines/wintermute/base/base_string_table.h
@@ -38,10 +38,10 @@ class BasePersistenceManager;
 
 class BaseStringTable : public BaseClass {
 public:
+	const char *expandStatic(const char *string) const;
 	bool loadFile(const char *filename, bool deleteAll = true);
 	void expand(char **str) const;
 	void expand(Common::String &str) const;
-	const char *expandStatic(const char *string) const;
 	bool addString(const char *key, const char *val, bool reportDuplicities = true);
 	BaseStringTable(BaseGame *inGame);
 	~BaseStringTable() override;
@@ -51,6 +51,7 @@ public:
 private:
 	Common::Array<Common::String> _filenames;
 	typedef Common::HashMap<Common::String, Common::String>::const_iterator StringsIter;
+
 	void replaceExpand(char *key, char *newStr, size_t newStrSize) const;
 };
 
diff --git a/engines/wintermute/base/gfx/base_renderer.cpp b/engines/wintermute/base/gfx/base_renderer.cpp
index 8cbf52f7f2f..399007638b0 100644
--- a/engines/wintermute/base/gfx/base_renderer.cpp
+++ b/engines/wintermute/base/gfx/base_renderer.cpp
@@ -51,24 +51,6 @@ BaseRenderer::BaseRenderer(BaseGame *inGame) : BaseClass(inGame) {
 	_windowed = true;
 	_forceAlphaColor = 0x00;
 
-	_indicatorDisplay = false;
-	_indicatorColor = BYTETORGBA(255, 0, 0, 128);
-	_indicatorProgress = 0;
-	_indicatorX = -1;
-	_indicatorY = -1;
-	_indicatorWidth = -1;
-	_indicatorHeight = 8;
-	_indicatorWidthDrawn = 0;
-
-	_loadImageName = "";
-	_saveImageName = "";
-	_saveLoadImage = nullptr;
-	_loadInProgress = false;
-	_hasDrawnSaveLoadImage = false;
-
-	_saveImageX = _saveImageY = 0;
-	_loadImageX = _loadImageY = 0;
-
 	_width = _height = _bPP = 0;
 	BasePlatform::setRectEmpty(&_monitorRect);
 
@@ -80,7 +62,6 @@ BaseRenderer::BaseRenderer(BaseGame *inGame) : BaseClass(inGame) {
 BaseRenderer::~BaseRenderer() {
 	deleteRectList();
 	unclipCursor();
-	SAFE_DELETE(_saveLoadImage);
 }
 
 //////////////////////////////////////////////////////////////////////
@@ -147,7 +128,6 @@ void BaseRenderer::deleteRectList() {
 	_rectList.removeAll();
 }
 
-//////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////
 bool BaseRenderer::initRenderer(int width, int height, bool windowed) {
 	return STATUS_FAILED;
@@ -179,99 +159,6 @@ bool BaseRenderer::fillRect(int x, int y, int w, int h, uint32 color) {
 	return STATUS_FAILED;
 }
 
-//////////////////////////////////////////////////////////////////////////
-void BaseRenderer::initIndicator() {
-	if (_indicatorY == -1) {
-		_indicatorY = _height - _indicatorHeight;
-	}
-	if (_indicatorX == -1) {
-		_indicatorX = 0;
-	}
-	if (_indicatorWidth == -1) {
-		_indicatorWidth = _width;
-	}
-}
-
-void BaseRenderer::setIndicator(int width, int height, int x, int y, uint32 color) {
-	_indicatorWidth = width;
-	_indicatorHeight = height;
-	_indicatorX = x;
-	_indicatorY = y;
-	_indicatorColor = color;
-}
-
-void BaseRenderer::setIndicatorVal(int value) {
-	bool redisplay = (_indicatorProgress != value);
-	_indicatorProgress = value;
-	if (redisplay)
-		displayIndicator();
-}
-
-void BaseRenderer::setLoadingScreen(const char *filename, int x, int y) {
-	if (filename == nullptr) {
-		_saveImageName = "";
-	} else {
-		_loadImageName = filename;
-	}
-	_loadImageX = x;
-	_loadImageY = y;
-}
-
-void BaseRenderer::setSaveImage(const char *filename, int x, int y) {
-	if (filename == nullptr) {
-		_saveImageName = "";
-	} else {
-		_saveImageName = filename;
-	}
-	_saveImageX = x;
-	_saveImageY = y;
-}
-
-void BaseRenderer::initSaveLoad(bool isSaving, bool quickSave) {
-	_indicatorDisplay = true;
-	_indicatorProgress = 0;
-	_hasDrawnSaveLoadImage = false;
-
-	if (isSaving && !quickSave) {
-		SAFE_DELETE(_saveLoadImage);
-		if (_saveImageName.size()) {
-			_saveLoadImage = createSurface();
-
-			if (!_saveLoadImage || DID_FAIL(_saveLoadImage->create(_saveImageName, true, 0, 0, 0))) {
-				SAFE_DELETE(_saveLoadImage);
-			}
-		}
-	} else {
-		SAFE_DELETE(_saveLoadImage);
-		if (_loadImageName.size()) {
-			_saveLoadImage = createSurface();
-
-			if (!_saveLoadImage || DID_FAIL(_saveLoadImage->create(_loadImageName, true, 0, 0, 0))) {
-				SAFE_DELETE(_saveLoadImage);
-			}
-		}
-		_loadInProgress = true;
-	}
-}
-
-void BaseRenderer::endSaveLoad() {
-	_loadInProgress = false;
-	_indicatorDisplay = false;
-	_indicatorWidthDrawn = 0;
-
-	SAFE_DELETE(_saveLoadImage);
-}
-
-void BaseRenderer::persistSaveLoadImages(BasePersistenceManager *persistMgr) {
-	persistMgr->transferString(TMEMBER(_loadImageName));
-	persistMgr->transferString(TMEMBER(_saveImageName));
-	persistMgr->transferSint32(TMEMBER(_saveImageX));
-	persistMgr->transferSint32(TMEMBER(_saveImageY));
-	persistMgr->transferSint32(TMEMBER(_loadImageX));
-	persistMgr->transferSint32(TMEMBER(_loadImageY));
-}
-
-//////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 bool BaseRenderer::setViewport(int left, int top, int right, int bottom) {
 	return STATUS_FAILED;
@@ -336,55 +223,4 @@ bool BaseRenderer::pointInViewport(Common::Point32 *p) {
 	return true;
 }
 
-//////////////////////////////////////////////////////////////////////////
-bool BaseRenderer::displayIndicator() {
-	if (!_indicatorDisplay || !_indicatorProgress) {
-		return STATUS_OK;
-	}
-
-#ifdef ENABLE_FOXTAIL
-	if (BaseEngine::instance().isFoxTail()) {
-		_hasDrawnSaveLoadImage = false;
-		clear();
-		displaySaveloadRect();
-		displaySaveloadImage();
-		forcedFlip();
-		return STATUS_OK;
-	}
-#endif
-
-	displaySaveloadImage();
-	displaySaveloadRect();
-	indicatorFlip();
-	return STATUS_OK;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseRenderer::displaySaveloadImage() {
-	if (_saveLoadImage && !_hasDrawnSaveLoadImage) {
-		Common::Rect32 rc;
-		BasePlatform::setRect(&rc, 0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight());
-		if (_loadInProgress) {
-			_saveLoadImage->displayTrans(_loadImageX, _loadImageY, rc);
-		} else {
-			_saveLoadImage->displayTrans(_saveImageX, _saveImageY, rc);
-		}
-		flip();
-		_hasDrawnSaveLoadImage = true;
-	}
-
-	return STATUS_OK;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseRenderer::displaySaveloadRect() {
-	if ((!_indicatorDisplay && _indicatorWidth <= 0) || _indicatorHeight <= 0) {
-		return STATUS_OK;
-	}
-	int curWidth = (int)(_indicatorWidth * (float)((float)_indicatorProgress / 100.0f));
-	fillRect(_indicatorX, _indicatorY, curWidth, _indicatorHeight, _indicatorColor);
-	_indicatorWidthDrawn = curWidth;
-	return STATUS_OK;
-}
-
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h
index 8e75c6be5f9..68d6a995b1e 100644
--- a/engines/wintermute/base/gfx/base_renderer.h
+++ b/engines/wintermute/base/gfx/base_renderer.h
@@ -110,9 +110,9 @@ public:
 	virtual bool flip() = 0;
 	/**
 	 * Special flip for the indicator drawn during save/load
-	 * essentially, just copies the region defined by the _indicator-variables.
+	 * essentially, just copies the region defined by the indicator rectangle.
 	 */
-	virtual bool indicatorFlip() = 0;
+	virtual bool indicatorFlip(int32 x, int32 y, int32 width, int32 height) = 0;
 	virtual bool forcedFlip() = 0;
 	virtual void initLoop();
 	virtual bool setup2D(bool force = false);
@@ -172,41 +172,12 @@ public:
 	bool isReady() const { return _ready; }
 	bool isWindowed() const { return _windowed; }
 	int32 getBPP() const { return _bPP; }
-
-
-	// Indicator & Save/Load-related functions
-	void initIndicator();
-	void setIndicatorVal(int value);
-	void setIndicator(int width, int height, int x, int y, uint32 color);
-	void persistSaveLoadImages(BasePersistenceManager *persistMgr);
-	void initSaveLoad(bool isSaving, bool quickSave = false);
-	virtual void endSaveLoad();
-	void setLoadingScreen(const char *filename, int x, int y);
-	void setSaveImage(const char *filename, int x, int y);
-
-	bool displayIndicator();
-
 	int32 getWidth() const { return _width; }
 	int32 getHeight() const { return _height; }
+
+	virtual void endSaveLoad() {};
+
 	bool _windowed;
-	Common::String _loadImageName;
-	Common::String _saveImageName;
-	int32 _saveImageX;
-	int32 _saveImageY;
-	int32 _loadImageX;
-	int32 _loadImageY;
-	BaseSurface *_saveLoadImage;
-	bool _hasDrawnSaveLoadImage;
-
-	int32 _indicatorWidthDrawn;
-	uint32 _indicatorColor;
-	int32 _indicatorX;
-	int32 _indicatorY;
-	int32 _indicatorWidth;
-	int32 _indicatorHeight;
-	bool _loadInProgress;
-	bool _indicatorDisplay;
-	int32 _indicatorProgress;
 
 	Common::Rect32 _windowRect;
 	Common::Rect32 _viewportRect;
@@ -217,8 +188,6 @@ public:
 	int32 _width;
 
 	BaseArray<BaseActiveRect *> _rectList;
-	bool displaySaveloadImage();
-	bool displaySaveloadRect();
 };
 
 BaseRenderer *makeOSystemRenderer(BaseGame *inGame); // Implemented in BRenderSDL.cpp
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index d326acab684..72febbda6a8 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -141,7 +141,7 @@ bool BaseRenderer3D::flip() {
 	return true;
 }
 
-bool BaseRenderer3D::indicatorFlip() {
+bool BaseRenderer3D::indicatorFlip(int32 x, int32 y, int32 width, int32 height) {
 	flip();
 	return true;
 }
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index 90030abf659..4e4ae5b5883 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -146,7 +146,7 @@ public:
 	virtual void postfilter() = 0;
 	virtual void setPostfilter(PostFilter postFilter) = 0;
 	bool flip() override;
-	bool indicatorFlip() override;
+	bool indicatorFlip(int32 x, int32 y, int32 width, int32 height) override;
 	bool forcedFlip() override;
 	virtual bool setViewport3D(DXViewport *viewport) = 0;
 
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index 3becf6e6861..143717ff615 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -131,9 +131,9 @@ bool BaseRenderOSystem::initRenderer(int width, int height, bool windowed) {
 	return STATUS_OK;
 }
 
-bool BaseRenderOSystem::indicatorFlip() {
-	if (_indicatorWidthDrawn > 0 && _indicatorHeight > 0) {
-		g_system->copyRectToScreen(_renderSurface->getBasePtr(_indicatorX, _indicatorY), _renderSurface->pitch, _indicatorX, _indicatorY, _indicatorWidthDrawn, _indicatorHeight);
+bool BaseRenderOSystem::indicatorFlip(int32 x, int32 y, int32 width, int32 height) {
+	if (width > 0 && height > 0) {
+		g_system->copyRectToScreen(_renderSurface->getBasePtr(x, y), _renderSurface->pitch, x, y, width, height);
 		g_system->updateScreen();
 	}
 	return STATUS_OK;
@@ -450,7 +450,7 @@ void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket, Common::Rect *dstR
 bool BaseRenderOSystem::fillRect(int x, int y, int w, int h, uint32 color) {
 	// This function isn't used outside of indicator-displaying, and thus quite unused in
 	// BaseRenderOSystem when dirty-rects are enabled.
-	if (!_disableDirtyRects && !_indicatorDisplay) {
+	if (!_disableDirtyRects && !_game->_indicatorDisplay) {
 		error("BaseRenderOSystem::fillRect - doesn't work for dirty rects yet");
 	}
 
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 971fac9f481..168db6a2458 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -69,7 +69,7 @@ public:
 
 	bool initRenderer(int width, int height, bool windowed) override;
 	bool flip() override;
-	bool indicatorFlip() override;
+	bool indicatorFlip(int32 x, int32 y, int32 width, int32 height) override;
 	bool forcedFlip() override;
 	bool clear() override;
 	Graphics::PixelFormat getPixelFormat() const override;
diff --git a/engines/wintermute/base/save_thumb_helper.cpp b/engines/wintermute/base/save_thumb_helper.cpp
index aa5919cbb07..d8e80aacda9 100644
--- a/engines/wintermute/base/save_thumb_helper.cpp
+++ b/engines/wintermute/base/save_thumb_helper.cpp
@@ -29,6 +29,8 @@
 #include "engines/wintermute/base/gfx/base_image.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
 #include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/dcgf.h"
+
 #include "graphics/scaler.h"
 
 namespace Wintermute {
@@ -41,10 +43,8 @@ SaveThumbHelper::SaveThumbHelper(BaseGame *inGame) : _game(inGame) {
 
 //////////////////////////////////////////////////////////////////////////
 SaveThumbHelper::~SaveThumbHelper() {
-	delete _thumbnail;
-	_thumbnail = nullptr;
-	delete _scummVMThumb;
-	_scummVMThumb = nullptr;
+	SAFE_DELETE(_thumbnail);
+	SAFE_DELETE(_scummVMThumb);
 }
 
 BaseImage *SaveThumbHelper::storeThumb(bool doFlip, int width, int height) {
@@ -67,11 +67,9 @@ BaseImage *SaveThumbHelper::storeThumb(bool doFlip, int width, int height) {
 
 //////////////////////////////////////////////////////////////////////////
 bool SaveThumbHelper::storeThumbnail(bool doFlip) {
-	delete _thumbnail;
-	_thumbnail = nullptr;
+	SAFE_DELETE(_thumbnail);
 
 	if (_game->_thumbnailWidth > 0 && _game->_thumbnailHeight > 0) {
-
 		_thumbnail = storeThumb(doFlip, _game->_thumbnailWidth, _game->_thumbnailHeight);
 		if (!_thumbnail) {
 			return STATUS_FAILED;
@@ -83,8 +81,7 @@ bool SaveThumbHelper::storeThumbnail(bool doFlip) {
 
 //////////////////////////////////////////////////////////////////////////
 bool SaveThumbHelper::storeScummVMThumbNail(bool doFlip) {
-	delete _scummVMThumb;
-	_scummVMThumb = nullptr;
+	SAFE_DELETE(_scummVMThumb);
 
 	_scummVMThumb = storeThumb(doFlip, kThumbnailWidth, kThumbnailHeight2);
 	if (!_scummVMThumb) {
diff --git a/engines/wintermute/base/saveload.cpp b/engines/wintermute/base/saveload.cpp
deleted file mode 100644
index e0504deb5cc..00000000000
--- a/engines/wintermute/base/saveload.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * This file is based on WME Lite.
- * http://dead-code.org/redir.php?target=wmelite
- * Copyright (c) 2011 Jan Nedoma
- */
-
-#include "engines/wintermute/base/base_persistence_manager.h"
-#include "engines/wintermute/wintermute.h"
-#include "engines/wintermute/base/saveload.h"
-#include "engines/wintermute/ad/ad_scene.h"
-#include "engines/wintermute/base/base_engine.h"
-#include "engines/wintermute/base/base_game.h" // Temporary
-#include "engines/wintermute/base/base_region.h"
-#include "engines/wintermute/base/base_sub_frame.h"
-#include "engines/wintermute/base/font/base_font.h"
-#include "engines/wintermute/base/gfx/base_renderer.h"
-#include "engines/wintermute/base/sound/base_sound.h"
-#include "engines/wintermute/base/scriptables/script.h"
-#ifdef ENABLE_WME3D
-#include "engines/wintermute/base/gfx/xmodel.h"
-#endif
-
-#include "common/savefile.h"
-#include "common/config-manager.h"
-
-namespace Wintermute {
-
-bool SaveLoad::loadGame(const Common::String &filename, BaseGame *gameRef) {
-	gameRef->LOG(0, "Loading game '%s'...", filename.c_str());
-
-	bool ret;
-
-	gameRef->stopVideo();
-	gameRef->_renderer->initSaveLoad(false);
-
-	gameRef->_loadInProgress = true;
-	gameRef->pluginEvents().clearEvents();
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	if (DID_SUCCEED(ret = pm->initLoad(filename))) {
-		//if (DID_SUCCEED(ret = cleanup())) {
-		if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->loadTable(gameRef,  pm))) {
-			if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->loadInstances(gameRef,  pm))) {
-				// Restore random-seed:
-				BaseEngine::instance().getRandomSource()->setSeed(pm->getDWORD());
-
-				// data initialization after load
-				SaveLoad::initAfterLoad();
-
-				gameRef->pluginEvents().applyEvent(WME_EVENT_GAME_AFTER_LOAD, nullptr);
-				gameRef->applyEvent("AfterLoad", true);
-
-				gameRef->displayContent(true, false);
-				//_renderer->flip();
-			}
-		}
-	}
-
-	delete pm;
-	gameRef->_loadInProgress = false;
-
-	gameRef->_renderer->endSaveLoad();
-
-	//BaseEngine::LOG(0, "Load end %d", BaseUtils::GetUsedMemMB());
-	// AdGame:
-	if (DID_SUCCEED(ret)) {
-		SystemClassRegistry::getInstance()->enumInstances(SaveLoad::afterLoadRegion, "AdRegion", nullptr);
-	}
-	return ret;
-}
-
-bool SaveLoad::saveGame(int slot, const char *desc, bool quickSave, BaseGame *gameRef) {
-	Common::String filename = SaveLoad::getSaveSlotFilename(slot);
-
-	gameRef->LOG(0, "Saving game '%s'...", filename.c_str());
-
-	gameRef->pluginEvents().applyEvent(WME_EVENT_GAME_BEFORE_SAVE, nullptr);
-	gameRef->applyEvent("BeforeSave", true);
-
-	bool ret;
-
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	if (DID_SUCCEED(ret = pm->initSave(desc))) {
-		gameRef->_renderer->initSaveLoad(true, quickSave); // TODO: The original code inited the indicator before the conditionals
-		if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->saveTable(gameRef,  pm, quickSave))) {
-			if (DID_SUCCEED(ret = SystemClassRegistry::getInstance()->saveInstances(gameRef,  pm, quickSave))) {
-				pm->putDWORD(BaseEngine::instance().getRandomSource()->getSeed());
-				if (DID_SUCCEED(ret = pm->saveFile(filename))) {
-					ConfMan.setInt("most_recent_saveslot", slot);
-					ConfMan.flushToDisk();
-				}
-			}
-		}
-	}
-
-	delete pm;
-
-	gameRef->_renderer->endSaveLoad();
-
-	return ret;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool SaveLoad::initAfterLoad() {
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadRegion,   "BaseRegion",   nullptr);
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadSubFrame, "BaseSubFrame", nullptr);
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadSound,    "BaseSound",    nullptr);
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadFont,     "BaseFontTT",   nullptr);
-#ifdef ENABLE_WME3D
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadXModel,   "XModel",       nullptr);
-#endif
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadScript,   "ScScript",     nullptr);
-	// AdGame:
-	SystemClassRegistry::getInstance()->enumInstances(afterLoadScene,    "AdScene",      nullptr);
-	return STATUS_OK;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadScene(void *scene, void *data) {
-	((AdScene *)scene)->afterLoad();
-}
-
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadRegion(void *region, void *data) {
-	((BaseRegion *)region)->createRegion();
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadSubFrame(void *subframe, void *data) {
-	((BaseSubFrame *)subframe)->setSurfaceSimple();
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadSound(void *sound, void *data) {
-	((BaseSound *)sound)->setSoundSimple();
-}
-
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadFont(void *font, void *data) {
-	((BaseFont *)font)->afterLoad();
-}
-
-#ifdef ENABLE_WME3D
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadXModel(void *model, void *data) {
-	((XModel *)model)->initializeSimple();
-}
-#endif
-
-//////////////////////////////////////////////////////////////////////////
-void SaveLoad::afterLoadScript(void *script, void *data) {
-	((ScScript *)script)->afterLoad();
-}
-
-Common::String SaveLoad::getSaveSlotFilename(int slot) {
-	Common::String filename;
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	if (pm) {
-		filename = pm->getFilenameForSlot(slot);
-		delete pm;
-	}
-	debugC(kWintermuteDebugSaveGame, "getSaveSlotFileName(%d) = %s", slot, filename.c_str());
-	return filename;
-}
-
-Common::String SaveLoad::getSaveSlotDescription(int slot) {
-	Common::String description;
-	Common::String filename = getSaveSlotFilename(slot);
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	if ((pm->initLoad(filename))) {
-		description = pm->_savedDescription;
-	}
-	delete pm;
-	return description;
-}
-
-void SaveLoad::getSaveSlotTimestamp(int slot, TimeDate *time) {
-	memset(time, 0, sizeof(TimeDate));
-	Common::String filename = getSaveSlotFilename(slot);
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	if ((pm->initLoad(filename))) {
-		*time = pm->getSavedTimestamp();
-	}
-	delete pm;
-}
-
-bool SaveLoad::isSaveSlotUsed(int slot) {
-	Common::String filename = getSaveSlotFilename(slot);
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	bool ret = pm->getSaveExists(slot);
-	delete pm;
-	return ret;
-}
-
-bool SaveLoad::emptySaveSlot(int slot) {
-	Common::String filename = getSaveSlotFilename(slot);
-	BasePersistenceManager *pm = new BasePersistenceManager();
-	((WintermuteEngine *)g_engine)->getSaveFileMan()->removeSavefile(pm->getFilenameForSlot(slot));
-	delete pm;
-	return true;
-}
-
-
-} // End of namespace Wintermute
diff --git a/engines/wintermute/base/saveload.h b/engines/wintermute/base/saveload.h
deleted file mode 100644
index 228ebffa0bc..00000000000
--- a/engines/wintermute/base/saveload.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * This file is based on WME Lite.
- * http://dead-code.org/redir.php?target=wmelite
- * Copyright (c) 2011 Jan Nedoma
- */
-
-#ifndef WINTERMUTE_SAVEGAME_H
-#define WINTERMUTE_SAVEGAME_H
-
-#include "common/str.h"
-
-namespace Wintermute {
-class BaseGame;
-class SaveLoad {
-public:
-	static bool emptySaveSlot(int slot);
-	static bool isSaveSlotUsed(int slot);
-	static Common::String getSaveSlotDescription(int slot);
-	static void getSaveSlotTimestamp(int slot, TimeDate *time);
-	static Common::String getSaveSlotFilename(int slot);
-
-	static bool loadGame(const Common::String &filename, BaseGame *gameRef);
-	static bool saveGame(int slot, const char *desc, bool quickSave, BaseGame *gameRef);
-	static bool initAfterLoad();
-	static void afterLoadScene(void *scene, void *data);
-	static void afterLoadRegion(void *region, void *data);
-private:
-	static void afterLoadSubFrame(void *subframe, void *data);
-	static void afterLoadSound(void *sound, void *data);
-	static void afterLoadFont(void *font, void *data);
-#ifdef ENABLE_WME3D
-	static void afterLoadXModel(void *model, void *data);
-#endif
-	static void afterLoadScript(void *script, void *data);
-};
-
-} // End of namespace Wintermute
-
-#endif
diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk
index 5b082a9e0be..22f51ef08b3 100644
--- a/engines/wintermute/module.mk
+++ b/engines/wintermute/module.mk
@@ -71,7 +71,6 @@ MODULE_OBJS := \
 	base/base_file_manager.o \
 	base/base_frame.o \
 	base/base_game.o \
-	base/base_game_settings.o \
 	base/base_keyboard_state.o \
 	base/base_named_object.o \
 	base/base_object.o \
@@ -88,7 +87,6 @@ MODULE_OBJS := \
 	base/base_surface_storage.o \
 	base/base_transition_manager.o \
 	base/base_viewport.o \
-	base/saveload.o \
 	base/save_thumb_helper.o \
 	ext/dll_dlltest.o \
 	ext/dll_geturl.o \
diff --git a/engines/wintermute/system/sys_class_registry.cpp b/engines/wintermute/system/sys_class_registry.cpp
index 2adf94d6f36..cc6b49713db 100644
--- a/engines/wintermute/system/sys_class_registry.cpp
+++ b/engines/wintermute/system/sys_class_registry.cpp
@@ -201,7 +201,7 @@ bool SystemClassRegistry::saveTable(BaseGame *gameRef, BasePersistenceManager *p
 		counter++;
 
 		if (!quickSave) {
-			gameRef->_renderer->setIndicatorVal((int)(50.0f / (float)((float)_classes.size() / (float)counter)));
+			gameRef->setIndicatorVal((int)(50.0f / (float)((float)_classes.size() / (float)counter)));
 		}
 
 		(it->_value)->saveTable(gameRef,  persistMgr);
@@ -233,7 +233,7 @@ bool SystemClassRegistry::loadTable(BaseGame *gameRef, BasePersistenceManager *p
 	uint32 numClasses = persistMgr->getDWORD();
 
 	for (uint32 i = 0; i < numClasses; i++) {
-		gameRef->_renderer->setIndicatorVal((int)(50.0f / (float)((float)numClasses / (float)(i + 1))));
+		gameRef->setIndicatorVal((int)(50.0f / (float)((float)numClasses / (float)(i + 1))));
 
 		Common::String className = persistMgr->getStringObj();
 
@@ -276,7 +276,7 @@ bool SystemClassRegistry::saveInstances(BaseGame *gameRef, BasePersistenceManage
 
 		if (!quickSave) {
 			if (counter % 20 == 0) {
-				gameRef->_renderer->setIndicatorVal((int)(50.0f + 50.0f / (float)((float)_classes.size() / (float)counter)));
+				gameRef->setIndicatorVal((int)(50.0f + 50.0f / (float)((float)_classes.size() / (float)counter)));
 			}
 		}
 		gameRef->miniUpdate();
@@ -294,7 +294,7 @@ bool SystemClassRegistry::loadInstances(BaseGame *gameRef, BasePersistenceManage
 
 	for (int i = 0; i < numInstances; i++) {
 		if (i % 20 == 0) {
-			gameRef->_renderer->setIndicatorVal((int)(50.0f + 50.0f / (float)((float)numInstances / (float)(i + 1))));
+			gameRef->setIndicatorVal((int)(50.0f + 50.0f / (float)((float)numInstances / (float)(i + 1))));
 		}
 
 		checkHeader("<INSTANCE_HEAD>", persistMgr);
diff --git a/engines/wintermute/ui/ui_button.cpp b/engines/wintermute/ui/ui_button.cpp
index 6e39e5ec2df..b7a32a79ac5 100644
--- a/engines/wintermute/ui/ui_button.cpp
+++ b/engines/wintermute/ui/ui_button.cpp
@@ -372,7 +372,7 @@ bool UIButton::loadBuffer(char *buffer, bool complete) {
 
 		case TOKEN_TEXT:
 			setText(params);
-			_game->expandStringByStringTable(&_text);
+			_game->_stringTable->expand(&_text);
 			break;
 
 		case TOKEN_TEXT_ALIGN:
diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp
index d1abb4e4b81..b4cc72b5f96 100644
--- a/engines/wintermute/ui/ui_edit.cpp
+++ b/engines/wintermute/ui/ui_edit.cpp
@@ -229,7 +229,7 @@ bool UIEdit::loadBuffer(char *buffer, bool complete) {
 
 		case TOKEN_TEXT:
 			setText(params);
-			_game->expandStringByStringTable(&_text);
+			_game->_stringTable->expand(&_text);
 			break;
 
 		case TOKEN_X:
diff --git a/engines/wintermute/ui/ui_text.cpp b/engines/wintermute/ui/ui_text.cpp
index 1a6e94cb8c3..6001dff26a9 100644
--- a/engines/wintermute/ui/ui_text.cpp
+++ b/engines/wintermute/ui/ui_text.cpp
@@ -228,7 +228,7 @@ bool UIText::loadBuffer(char *buffer, bool complete) {
 
 		case TOKEN_TEXT:
 			setText(params);
-			_game->expandStringByStringTable(&_text);
+			_game->_stringTable->expand(&_text);
 			break;
 
 		case TOKEN_TEXT_ALIGN:
diff --git a/engines/wintermute/ui/ui_window.cpp b/engines/wintermute/ui/ui_window.cpp
index e69c1688f10..5dbebeb42a5 100644
--- a/engines/wintermute/ui/ui_window.cpp
+++ b/engines/wintermute/ui/ui_window.cpp
@@ -421,7 +421,7 @@ bool UIWindow::loadBuffer(char *buffer, bool complete) {
 
 		case TOKEN_TITLE:
 			setText(params);
-			_game->expandStringByStringTable(&_text);
+			_game->_stringTable->expand(&_text);
 			break;
 
 		case TOKEN_TITLE_ALIGN:
diff --git a/engines/wintermute/video/subtitle_card.cpp b/engines/wintermute/video/subtitle_card.cpp
index 47ffefe4d0c..b49f8b486ad 100644
--- a/engines/wintermute/video/subtitle_card.cpp
+++ b/engines/wintermute/video/subtitle_card.cpp
@@ -38,7 +38,7 @@ SubtitleCard::SubtitleCard(BaseGame *inGame,
 	        _startFrame(startFrame),
 	        _endFrame(endFrame) {
 	_text = text;
-	_game->expandStringByStringTable(_text);
+	_game->_stringTable->expand(_text);
 }
 
 uint32 SubtitleCard::getStartFrame() const {
diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp
index b77f4ed845f..7d56752fc7d 100644
--- a/engines/wintermute/wintermute.cpp
+++ b/engines/wintermute/wintermute.cpp
@@ -243,7 +243,7 @@ int WintermuteEngine::init() {
 	// load game
 	uint32 dataInitStart = g_system->getMillis();
 
-	if (DID_FAIL(_game->loadGameSettingsFile())) {
+	if (DID_FAIL(_game->loadFile(_game->_settingsGameFile ? _game->_settingsGameFile : "default.game"))) {
 		_game->LOG(ret, "Error loading game file. Exiting.");
 		delete _game;
 		_game = nullptr;




More information about the Scummvm-git-logs mailing list