[Scummvm-git-logs] scummvm master -> 0f54f7b9c14f6304550caf58623bc5cf7044719a

aquadran noreply at scummvm.org
Sun Sep 28 14:26:10 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:
0f54f7b9c1 WINTERMUTE: Restored original engine accessibility - initial support


Commit: 0f54f7b9c14f6304550caf58623bc5cf7044719a
    https://github.com/scummvm/scummvm/commit/0f54f7b9c14f6304550caf58623bc5cf7044719a
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-09-28T16:26:05+02:00

Commit Message:
WINTERMUTE: Restored original engine accessibility - initial support

Changed paths:
  A engines/wintermute/base/base_access_mgr.cpp
  A engines/wintermute/base/base_access_mgr.h
    engines/wintermute/ad/ad_actor.cpp
    engines/wintermute/ad/ad_entity.cpp
    engines/wintermute/ad/ad_game.cpp
    engines/wintermute/ad/ad_game.h
    engines/wintermute/ad/ad_object.cpp
    engines/wintermute/ad/ad_response_box.h
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h
    engines/wintermute/base/base_object.cpp
    engines/wintermute/base/base_object.h
    engines/wintermute/detection.cpp
    engines/wintermute/detection.h
    engines/wintermute/metaengine.cpp
    engines/wintermute/module.mk
    engines/wintermute/ui/ui_button.cpp
    engines/wintermute/ui/ui_edit.cpp
    engines/wintermute/ui/ui_object.cpp
    engines/wintermute/ui/ui_object.h
    engines/wintermute/ui/ui_window.cpp
    engines/wintermute/ui/ui_window.h
    engines/wintermute/wintermute.cpp


diff --git a/engines/wintermute/ad/ad_actor.cpp b/engines/wintermute/ad/ad_actor.cpp
index 54ca3cd1057..fc101a17f72 100644
--- a/engines/wintermute/ad/ad_actor.cpp
+++ b/engines/wintermute/ad/ad_actor.cpp
@@ -39,11 +39,13 @@
 #include "engines/wintermute/base/base_region.h"
 #include "engines/wintermute/base/base_file_manager.h"
 #include "engines/wintermute/base/base_sprite.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/base/scriptables/script.h"
 #include "engines/wintermute/base/scriptables/script_value.h"
 #include "engines/wintermute/base/scriptables/script_stack.h"
 #include "engines/wintermute/base/particles/part_emitter.h"
 #include "engines/wintermute/base/base_engine.h"
+#include "engines/wintermute/platform_osystem.h"
 #include "engines/wintermute/utils/utils.h"
 #include "engines/wintermute/dcgf.h"
 
@@ -589,19 +591,18 @@ bool AdActor::display() {
 	if (_active && _partEmitter) {
 		_partEmitter->display();
 	}
-/*
+
 	// accessibility
-	if (Game->m_AccessMgr->GetActiveObject() == this) {
-		float ScaleX, ScaleY;
-		GetScale(&ScaleX, &ScaleY);
+	if (_game->_accessMgr->getActiveObject() == this) {
+		getScale(&scaleX, &scaleY);
 
 		Common::Rect32 rc;
-		SetRectEmpty(&rc);
-		if (m_CurrentSprite) {
-			m_CurrentSprite->GetBoundingRect(&rc, m_PosX - Game->m_OffsetX, m_PosY - Game->m_OffsetY, ScaleX, ScaleY);
+		BasePlatform::setRectEmpty(&rc);
+		if (_currentSprite) {
+			_currentSprite->getBoundingRect(&rc, _posX - _game->_offsetX, _posY - _game->_offsetY, scaleX, scaleY);
 		}
-		Game->m_AccessMgr->SetHintRect(&rc);
-	}*/
+		_game->_accessMgr->setHintRect(&rc);
+	}
 
 	return STATUS_OK;
 }
diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp
index c9c22b0e259..47c56d7bdbe 100644
--- a/engines/wintermute/ad/ad_entity.cpp
+++ b/engines/wintermute/ad/ad_entity.cpp
@@ -42,6 +42,7 @@
 #include "engines/wintermute/base/base_region.h"
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_surface_storage.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/base/font/base_font_storage.h"
 #include "engines/wintermute/base/font/base_font.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
@@ -587,20 +588,19 @@ bool AdEntity::display() {
 		}
 
 		// accessibility
-		/*if (Game->m_AccessMgr->GetActiveObject() == this) {
-			float ScaleX, ScaleY;
-			GetScale(&ScaleX, &ScaleY);
+		if (_game->_accessMgr->getActiveObject() == this) {
+			getScale(&scaleX, &scaleY);
 
 			Common::Rect32 rc;
-			SetRectEmpty(&rc);
-			if (m_CurrentSprite) {
-				m_CurrentSprite->GetBoundingRect(&rc, m_PosX - Game->m_OffsetX, m_PosY - Game->m_OffsetY, ScaleX, ScaleY);
-			} else if (m_Region) {
-				m_Region->GetBoundingRect(&rc);
-				OffsetRect(&rc, -Game->m_OffsetX, -Game->m_OffsetY);
+			BasePlatform::setRectEmpty(&rc);
+			if (_currentSprite) {
+				_currentSprite->getBoundingRect(&rc, _posX - _game->_offsetX, _posY - _game->_offsetY, scaleX, scaleY);
+			} else if (_region) {
+				_region->getBoundingRect(&rc);
+				BasePlatform::offsetRect(&rc, -_game->_offsetX, -_game->_offsetY);
 			}
-			Game->m_AccessMgr->SetHintRect(&rc);
-		}*/
+			_game->_accessMgr->setHintRect(&rc);
+		}
 	}
 	return STATUS_OK;
 }
diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp
index 76fb76b6268..e2d581da6b7 100644
--- a/engines/wintermute/ad/ad_game.cpp
+++ b/engines/wintermute/ad/ad_game.cpp
@@ -53,6 +53,7 @@
 #include "engines/wintermute/base/base_transition_manager.h"
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_viewport.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/base/particles/part_emitter.h"
 #include "engines/wintermute/base/save_thumb_helper.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
@@ -355,7 +356,7 @@ void AdGame::finishSentences() {
 			}
 		}
 	}
-	//Game->m_AccessMgr->Stop();
+	_game->_accessMgr->stop();
 }
 
 
@@ -2008,20 +2009,20 @@ bool AdGame::displayContent(bool doUpdate, bool displayAll) {
 		}
 
 		if (doUpdate || displayAll) {
-			//m_AccessMgr->DisplayBeforeGUI();
+			_accessMgr->displayBeforeGUI();
 
 			// display normal windows
 			displayWindows(false);
 
-			//m_AccessMgr->DisplayAfterGUI();
+			_accessMgr->displayAfterGUI();
 
 			setActiveObject(_game->_renderer->getObjectAt(p.x, p.y));
 
 			// textual info
-			//if (m_AccessGlobalPaused)
-			//	DisplaySentences(false);
-			//else
-			displaySentences(_state == GAME_FROZEN);
+			if (_accessGlobalPaused)
+				displaySentences(false);
+			else
+				displaySentences(_state == GAME_FROZEN);
 
 			showCursor();
 
@@ -2254,28 +2255,28 @@ bool AdGame::renderShadowGeometry() {
 #endif
 
 //////////////////////////////////////////////////////////////////////////
-/*CBObject *CAdGame::GetNextAccessObject(CBObject *CurrObject) {
-	CBObject *Ret = CBGame::GetNextAccessObject(CurrObject);
-	if (!Ret) {
-		if (m_ResponseBox && m_StateEx == GAME_WAITING_RESPONSE)
-			return m_ResponseBox->GetNextAccessObject(CurrObject);
-		if (m_Scene)
-			return m_Scene->GetNextAccessObject(CurrObject);
+BaseObject *AdGame::getNextAccessObject(BaseObject *currObject) {
+	BaseObject *ret = BaseGame::getNextAccessObject(currObject);
+	if (!ret) {
+		if (_responseBox && _stateEx == GAME_WAITING_RESPONSE)
+			return _responseBox->getNextAccessObject(currObject);
+		if (_scene)
+			return _scene->getNextAccessObject(currObject);
 	}
-	return Ret;
+	return ret;
 }
 
 //////////////////////////////////////////////////////////////////////////
-CBObject *CAdGame::GetPrevAccessObject(CBObject *CurrObject) {
-	CBObject *Ret = CBGame::GetPrevAccessObject(CurrObject);
-	if (!Ret) {
-		if (m_ResponseBox && m_StateEx == GAME_WAITING_RESPONSE)
-			return m_ResponseBox->GetPrevAccessObject(CurrObject);
-		if (m_Scene)
-			return m_Scene->GetPrevAccessObject(CurrObject);
+BaseObject *AdGame::getPrevAccessObject(BaseObject *currObject) {
+	BaseObject *ret = BaseGame::getPrevAccessObject(currObject);
+	if (!ret) {
+		if (_responseBox && _stateEx == GAME_WAITING_RESPONSE)
+			return _responseBox->getPrevAccessObject(currObject);
+		if (_scene)
+			return _scene->getPrevAccessObject(currObject);
 	}
-	return Ret;
-}*/
+	return ret;
+}
 
 //////////////////////////////////////////////////////////////////////////
 bool AdGame::validMouse() {
diff --git a/engines/wintermute/ad/ad_game.h b/engines/wintermute/ad/ad_game.h
index 7b65eed12b7..47f27c8e4c7 100644
--- a/engines/wintermute/ad/ad_game.h
+++ b/engines/wintermute/ad/ad_game.h
@@ -53,8 +53,8 @@ public:
 
 	bool displayDebugInfo() override;
 
-	//virtual CBObject *GetNextAccessObject(CBObject *CurrObject);
-	//virtual CBObject *GetPrevAccessObject(CBObject *CurrObject);
+	virtual BaseObject *getNextAccessObject(BaseObject *currObject) override;
+	virtual BaseObject *getPrevAccessObject(BaseObject *currObject) override;
 
 	virtual bool getLayerSize(int *layerWidth, int *layerHeight, Common::Rect32 *viewport, bool *customViewport) override;
 #ifdef ENABLE_WME3D
diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp
index f823b9083b4..c62d3ee54b2 100644
--- a/engines/wintermute/ad/ad_object.cpp
+++ b/engines/wintermute/ad/ad_object.cpp
@@ -39,6 +39,7 @@
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_sub_frame.h"
 #include "engines/wintermute/base/base_surface_storage.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/base/font/base_font.h"
 #include "engines/wintermute/base/font/base_font_storage.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
@@ -992,8 +993,9 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const
 		delete[] sound;
 	}
 
-	//if (!m_Sentence->m_Sound)
-	//	Game->m_AccessMgr->Speak(m_Sentence->m_Text, TTS_TALK);
+	if (!_sentence->_sound) {
+		_game->_accessMgr->speak(_sentence->_text, TTS_TALK);
+	}
 }
 
 
diff --git a/engines/wintermute/ad/ad_response_box.h b/engines/wintermute/ad/ad_response_box.h
index 7a31a839a87..cb8ed9090fa 100644
--- a/engines/wintermute/ad/ad_response_box.h
+++ b/engines/wintermute/ad/ad_response_box.h
@@ -39,8 +39,8 @@ class UIObject;
 class AdResponse;
 class AdResponseBox : public BaseObject {
 public:
-	BaseObject *getNextAccessObject(BaseObject *CurrObject);
-	BaseObject *getPrevAccessObject(BaseObject *CurrObject);
+	BaseObject *getNextAccessObject(BaseObject *currObject);
+	BaseObject *getPrevAccessObject(BaseObject *currObject);
 	bool getObjects(BaseArray<UIObject *> &objects, bool interactiveOnly);
 
 	bool handleResponse(AdResponse *response);
diff --git a/engines/wintermute/base/base_access_mgr.cpp b/engines/wintermute/base/base_access_mgr.cpp
new file mode 100644
index 00000000000..f1a43f5efaf
--- /dev/null
+++ b/engines/wintermute/base/base_access_mgr.cpp
@@ -0,0 +1,221 @@
+/* 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.
+ * http://dead-code.org/redir.php?target=wme
+ * Copyright (c) 2003-2013 Jan Nedoma and contributors
+ */
+
+#include "engines/wintermute/base/base.h"
+#include "engines/wintermute/base/base_access_mgr.h"
+#include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/gfx/base_renderer.h"
+#include "engines/wintermute/utils/string_util.h"
+#include "engines/wintermute/platform_osystem.h"
+#include "engines/wintermute/dcgf.h"
+
+#include "common/text-to-speech.h"
+
+namespace Wintermute {
+
+//////////////////////////////////////////////////////////////////////////
+BaseAccessMgr::BaseAccessMgr(BaseGame *inGame) : BaseClass(inGame) {
+	_voice = nullptr;
+	_ttsAvailable = false;
+	_activeObject = nullptr;
+	_prevActiveObject = nullptr;
+	BasePlatform::setRectEmpty(&_hintRect);
+	_hintAfterGUI = false;
+	_playingType = TTS_CAPTION;
+	_ctrlPressed = false;
+}
+
+//////////////////////////////////////////////////////////////////////////
+BaseAccessMgr::~BaseAccessMgr() {
+	_activeObject = nullptr; // ref only
+	_ttsAvailable = false;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::initialize() {
+	_ttsAvailable = false;
+
+	if (!_game->_accessTTSEnabled)
+		return true;
+
+	_voice = g_system->getTextToSpeechManager();
+	if (_voice) {
+		_ttsAvailable = true;
+	}
+
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::initLoop() {
+	BasePlatform::setRectEmpty(&_hintRect);
+
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::displayBeforeGUI() {
+	if (!_game->_accessKeyboardEnabled)
+		return true;
+
+	if (!_hintAfterGUI) {
+		return displayInternal();
+	} else {
+		return true;
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::displayAfterGUI() {
+	if (!_game->_accessKeyboardEnabled)
+		return true;
+
+	if (_hintAfterGUI) {
+		return displayInternal();
+	} else {
+		return true;
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::displayInternal() {
+	if (!_ctrlPressed) {
+		return true;
+	}
+
+	if (!BasePlatform::isRectEmpty(&_hintRect)) {
+		_game->_renderer->drawRect(_hintRect.left, _hintRect.top, _hintRect.right, _hintRect.bottom, 0xFFFF0000, 4);
+
+		// reposition mouse pointer
+		if (_game->_accessKeyboardCursorSkip && _activeObject != _prevActiveObject) {
+			_prevActiveObject = _activeObject;
+			Common::Point32 p;
+			p.x = _hintRect.left + (_hintRect.right - _hintRect.left) / 2;
+			p.y = _hintRect.top + (_hintRect.bottom - _hintRect.top) / 2;
+
+			p.x += _game->_renderer->_drawOffsetX;
+			p.y += _game->_renderer->_drawOffsetY;
+
+			p.x = MAX(0, p.x);
+			p.y = MAX(0, p.y);
+			p.x = MIN(_game->_renderer->_width - 1, p.x);
+			p.y = MIN(_game->_renderer->_height - 1, p.y);
+
+			//ClientToScreen(Game->m_Renderer->m_Window, &p);
+			BasePlatform::setCursorPos(p.x, p.y);
+		}
+	}
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::setHintRect(Common::Rect32 *hintRect, bool afterGUI) {
+	if (!hintRect) {
+		BasePlatform::setRectEmpty(&_hintRect);
+	} else {
+		_hintRect = *hintRect;
+	}
+
+	_hintAfterGUI = afterGUI;
+
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::setActiveObject(BaseObject *activeObj) {
+	if (!_game->_accessKeyboardEnabled) {
+		return true;
+	}
+
+	_activeObject = activeObj;
+	if (!activeObj) {
+		_prevActiveObject = nullptr;
+	}
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+BaseObject *BaseAccessMgr::getActiveObject() {
+	return _activeObject;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::speak(const char *str, TTTSType type) {
+	if (!_ttsAvailable) {
+		return true;
+	}
+	if (type == TTS_CAPTION && !_game->_accessTTSCaptions) {
+		return true;
+	}
+	if (type == TTS_TALK && !_game->_accessTTSTalk) {
+		return true;
+	}
+	if (type == TTS_KEYPRESS && !_game->_accessTTSKeypress) {
+		return true;
+	}
+
+	if (!str || !str[0]) {
+		return true;
+	}
+
+	WideString textStr;
+	if (_game->_textEncoding == TEXT_UTF8) {
+		textStr = StringUtil::utf8ToWide(str);
+	} else {
+		textStr = StringUtil::ansiToWide(str, CHARSET_DEFAULT);
+	}
+
+	if (!textStr.empty()) {
+		_playingType = type;
+		return _voice->say(str);
+	} else {
+		return false;
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseAccessMgr::stop() {
+	if (!_ttsAvailable) {
+		return true;
+	}
+	_playingType = TTS_CAPTION;
+	return _voice->stop();
+}
+
+//////////////////////////////////////////////////////////////////////////
+BaseObject *BaseAccessMgr::getNextObject() {
+	_activeObject = _game->getNextAccessObject(_activeObject);
+	return _activeObject;
+}
+
+//////////////////////////////////////////////////////////////////////////
+BaseObject *BaseAccessMgr::getPrevObject() {
+	_activeObject = _game->getPrevAccessObject(_activeObject);
+	return _activeObject;
+}
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_access_mgr.h b/engines/wintermute/base/base_access_mgr.h
new file mode 100644
index 00000000000..3b00b2a4669
--- /dev/null
+++ b/engines/wintermute/base/base_access_mgr.h
@@ -0,0 +1,73 @@
+/* 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.
+ * http://dead-code.org/redir.php?target=wme
+ * Copyright (c) 2003-2013 Jan Nedoma and contributors
+ */
+
+#ifndef WINTERMUTE_BASE_ACCESS_MGR_H
+#define WINTERMUTE_BASE_ACCESS_MGR_H
+
+#include "engines/wintermute/base/base.h"
+#include "engines/wintermute/dctypes.h"
+
+#include "common/rect.h"
+#include "common/text-to-speech.h"
+
+namespace Wintermute {
+
+class BaseObject;
+
+class BaseAccessMgr : public BaseClass {
+public:
+	BaseAccessMgr(BaseGame *inGame);
+	virtual ~BaseAccessMgr();
+
+	bool _ttsAvailable;
+	bool initialize();
+	bool speak(const char *str, TTTSType type);
+	bool stop();
+	BaseObject *getNextObject();
+	BaseObject *getPrevObject();
+
+	bool initLoop();
+	bool displayBeforeGUI();
+	bool displayAfterGUI();
+	bool setHintRect(Common::Rect32 *hintRect = nullptr, bool afterGUI = false);
+	bool setActiveObject(BaseObject *activeObj = nullptr);
+	BaseObject *getActiveObject();
+	bool _ctrlPressed;
+
+private:
+	TTTSType _playingType;
+	bool displayInternal();
+	Common::TextToSpeechManager *_voice;
+	BaseObject *_activeObject;
+	BaseObject *_prevActiveObject;
+	Common::Rect32 _hintRect;
+	bool _hintAfterGUI;
+};
+
+#endif
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 1b496439d06..101719b8efa 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -56,6 +56,7 @@
 #include "engines/wintermute/base/scriptables/script.h"
 #include "engines/wintermute/base/sound/base_sound.h"
 #include "engines/wintermute/base/file/base_savefile_manager_file.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/ext/plugins.h"
 #include "engines/wintermute/video/video_player.h"
 #include "engines/wintermute/video/video_theora_player.h"
@@ -64,6 +65,7 @@
 #include "engines/wintermute/utils/path_util.h"
 #include "engines/wintermute/utils/string_util.h"
 #include "engines/wintermute/ui/ui_window.h"
+#include "engines/wintermute/ui/ui_text.h"
 #include "engines/wintermute/wintermute.h"
 #include "engines/wintermute/platform_osystem.h"
 #include "engines/wintermute/ad/ad_scene.h"
@@ -284,16 +286,16 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_lastCursor = nullptr;
 
 	// accessibility flags
-/*	m_AccessTTSEnabled = false;
-	m_AccessTTSTalk = true;
-	m_AccessTTSCaptions = true;
-	m_AccessTTSKeypress = true;
-	m_AccessKeyboardEnabled = false;
-	m_AccessKeyboardCursorSkip = true;
-	m_AccessKeyboardPause = false;
+	_accessTTSEnabled = false;
+	_accessTTSTalk = true;
+	_accessTTSCaptions = true;
+	_accessTTSKeypress = true;
+	_accessKeyboardEnabled = true;//false;
+	_accessKeyboardCursorSkip = true;
+	_accessKeyboardPause = false;
 
-	m_AccessGlobalPaused = false;
-	m_AccessShieldWin = NULL;*/
+	_accessGlobalPaused = false;
+	_accessShieldWin = nullptr;
 
 	BasePlatform::setRectEmpty(&_mouseLockRect);
 
@@ -355,7 +357,7 @@ BaseGame::~BaseGame() {
 
 	SAFE_DELETE(_renderer);
 	_fileManager = nullptr;
-	//SAFE_DELETE(m_AccessMgr);
+	SAFE_DELETE(_accessMgr);
 
 	SAFE_DELETE(_stringTable);
 
@@ -390,7 +392,7 @@ bool BaseGame::cleanup() {
 
 	_windows.removeAll(); // refs only
 	_focusedWindow = nullptr; // ref only
-	//m_AccessShieldWin = nullptr;
+	_accessShieldWin = nullptr;
 
 	SAFE_DELETE_ARRAY(_saveImageName);
 	SAFE_DELETE_ARRAY(_loadImageName);
@@ -439,8 +441,9 @@ bool BaseGame::cleanup() {
 
 	SAFE_DELETE(_keyboardState);
 
-	//if (m_AccessMgr)
-	//	m_AccessMgr->SetActiveObject(NULL);
+	if (_accessMgr) {
+		_accessMgr->setActiveObject(nullptr);
+	}
 	
 	return STATUS_OK;
 }
@@ -511,10 +514,10 @@ bool BaseGame::initialize1() {
 			break;
 		}
 
-		//m_AccessMgr = new CBAccessMgr(this);
-		//if(m_AccessMgr == nullptr) {
-		//	break;
-		//}
+		_accessMgr = new BaseAccessMgr(this);
+		if (_accessMgr == nullptr) {
+			break;
+		}
 
 		_soundMgr = new BaseSoundMgr(this);
 		if (_soundMgr == nullptr) {
@@ -576,7 +579,7 @@ bool BaseGame::initialize1() {
 		delete _fontStorage;
 		delete _videoPlayer;
 		delete _soundMgr;
-		//delete m_AccessMgr;
+		delete _accessMgr;
 		_fileManager = nullptr;
 		delete _scEngine;
 		return STATUS_FAILED;
@@ -662,8 +665,9 @@ bool BaseGame::initialize3() { // renderer is initialized
 		_indicatorWidth = _renderer->getWidth();
 	}
 
-	//if (m_AccessMgr)
-	//	Game->m_AccessMgr->Initialize();
+	if (_accessMgr) {
+		_game->_accessMgr->initialize();
+	}
 
 	return STATUS_OK;
 }
@@ -747,8 +751,9 @@ bool BaseGame::initLoop() {
 
 	_surfaceStorage->initLoop();
 
-	//if (m_AccessMgr)
-	//	m_AccessMgr->InitLoop();
+	if (_accessMgr) {
+		_accessMgr->initLoop();
+	}
 
 	_fontStorage->initLoop();
 
@@ -3132,8 +3137,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccTTSEnabled
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccTTSEnabled") == 0) {
-		//m_ScValue->SetBool(m_AccessTTSEnabled);
-		_scValue->setBool(false);
+		_scValue->setBool(_accessTTSEnabled);
 		return _scValue;
 	}
 
@@ -3141,8 +3145,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccTTSTalk
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccTTSTalk") == 0) {
-		//m_ScValue->SetBool(m_AccessTTSTalk);
-		_scValue->setBool(false);
+		_scValue->setBool(_accessTTSTalk);
 		return _scValue;
 	}
 
@@ -3150,7 +3153,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccTTSCaptions
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccTTSCaptions") == 0) {
-		_scValue->setBool(false);
+		_scValue->setBool(_accessTTSCaptions);
 		return _scValue;
 	}
 
@@ -3158,7 +3161,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccTTSKeypress
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccTTSKeypress") == 0) {
-		_scValue->setBool(false);
+		_scValue->setBool(_accessTTSKeypress);
 		return _scValue;
 	}
 
@@ -3166,7 +3169,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccKeyboardEnabled
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccKeyboardEnabled") == 0) {
-		_scValue->setBool(false);
+		_scValue->setBool(_accessKeyboardEnabled);
 		return _scValue;
 	}
 
@@ -3174,7 +3177,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccKeyboardCursorSkip
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccKeyboardCursorSkip") == 0) {
-		_scValue->setBool(false);
+		_scValue->setBool(_accessKeyboardCursorSkip);
 		return _scValue;
 	}
 
@@ -3182,7 +3185,7 @@ ScValue *BaseGame::scGetProperty(const char *name) {
 	// AccKeyboardPause
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccKeyboardPause") == 0) {
-		_scValue->setBool(false);
+		_scValue->setBool(_accessKeyboardPause);
 		return _scValue;
 	}
 
@@ -3753,8 +3756,9 @@ bool BaseGame::unregisterObject(BaseObject *object) {
 	}
 
 	// is it active accessibility object?
-	//if (m_AccessMgr && m_AccessMgr->GetActiveObject() == Object)
-	//	m_AccessMgr->SetActiveObject(NULL);
+	if (_accessMgr && _accessMgr->getActiveObject() == object) {
+		_accessMgr->setActiveObject(nullptr);
+	}
 
 	// destroy object
 	for (int32 i = 0; i < _regObjects.getSize(); i++) {
@@ -4318,7 +4322,7 @@ bool BaseGame::loadGame(const char *filename) {
 				displayContent(true, false);
 				//_renderer->flip();
 
-				//accessUnpause();
+				accessUnpause();
 			}
 		}
 	}
@@ -4737,10 +4741,25 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) {
 		_stringTable->persist(persistMgr);
 	}
 
-	//PersistMgr->Transfer(TMEMBER(m_AccessShieldWin));
+	if (persistMgr->checkVersion(1, 10, 1)) {
+		persistMgr->transferPtr(TMEMBER(_accessShieldWin));
+	} else {
+		if (!persistMgr->getIsSaving()) {
+			_accessShieldWin = nullptr;
+		}
+	}
 
+	// initialise to defaults
 	if (!persistMgr->getIsSaving()) {
 		_quitting = false;
+		_accessTTSEnabled = false;
+		_accessTTSTalk = true;
+		_accessTTSCaptions = true;
+		_accessTTSKeypress = true;
+		_accessKeyboardEnabled = false;
+		_accessKeyboardCursorSkip = true;
+		_accessKeyboardPause = false;
+		_accessGlobalPaused = false;
 	}
 
 	return STATUS_OK;
@@ -4816,8 +4835,9 @@ bool BaseGame::handleKeypress(Common::Event *event, bool printable) {
 		return true;
 	}
 
-	//if (HandleAccessKey(Printable, CharCode, KeyData))
-	//	return true;
+	if (handleAccessKey(event, printable)) {
+		return true;
+	}
 
 	_keyboardState->handleKeyPress(event);
 	_keyboardState->readKey(event);
@@ -4846,25 +4866,32 @@ void BaseGame::handleKeyRelease(Common::Event *event) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-/*bool CBGame::HandleAccessKey(bool Printable, DWORD CharCode, DWORD KeyData) {
-	if (m_AccessKeyboardEnabled) {
-		if (CharCode == VK_TAB && (CBUtils::IsKeyDown(VK_CONTROL) || CBUtils::IsKeyDown(VK_RCONTROL))) {
-			CBObject *obj = NULL;
-			if (CBUtils::IsKeyDown(VK_SHIFT) || CBUtils::IsKeyDown(VK_RSHIFT)) {
-				obj = m_AccessMgr->GetPrevObject();
+bool BaseGame::handleAccessKey(Common::Event *event, bool printable) {
+	if (event->kbd.flags & Common::KBD_CTRL) {
+		_accessMgr->_ctrlPressed = event->type == Common::EVENT_KEYDOWN;
+	}
+
+	if (_accessKeyboardEnabled) {
+		if (event->kbd.keycode == Common::KEYCODE_TAB &&
+		   (event->kbd.flags & Common::KBD_CTRL)) {
+			//BaseObject *obj = nullptr;
+			if (event->kbd.flags & Common::KBD_SHIFT) {
+				/*obj = */_accessMgr->getPrevObject();
 			} else {
-				obj = m_AccessMgr->GetNextObject();
+				/*obj = */_accessMgr->getNextObject();
 			}
 			return true;
 		}
 	}
-	if (Printable && m_AccessKeyboardPause) {
-		if (CharCode == VK_SPACE && (CBUtils::IsKeyDown(VK_CONTROL) || CBUtils::IsKeyDown(VK_RCONTROL))) {
-			m_AccessGlobalPaused = !m_AccessGlobalPaused;
-			if (m_AccessGlobalPaused)
-				AccessPause();
-			else
-				AccessUnpause();
+	if (printable && _accessKeyboardPause) {
+		if (event->kbd.keycode == Common::KEYCODE_SPACE &&
+		   (event->kbd.flags & Common::KBD_CTRL)) {
+			_accessGlobalPaused = !_accessGlobalPaused;
+			if (_accessGlobalPaused) {
+				accessPause();
+			} else {
+				accessUnpause();
+			}
 			return true;
 		}
 	}
@@ -4873,46 +4900,46 @@ void BaseGame::handleKeyRelease(Common::Event *event) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-HRESULT CBGame::AccessPause() {
-	m_AccessGlobalPaused = true;
-
-	if (m_AccessShieldWin)
-		UnregisterObject(m_AccessShieldWin);
-
-	m_AccessShieldWin = new CUIWindow(this);
-	m_Windows.Add(m_AccessShieldWin);
-	RegisterObject(m_AccessShieldWin);
-
-	m_AccessShieldWin->m_PosX = m_AccessShieldWin->m_PosY = 0;
-	m_AccessShieldWin->m_Width = m_Renderer->m_Width;
-	m_AccessShieldWin->m_Height = m_Renderer->m_Height;
-
-	CUIText *Sta = new CUIText(Game);
-	Sta->m_Parent = m_AccessShieldWin;
-	m_AccessShieldWin->m_Widgets.Add(Sta);
-	Sta->SetText((char *)m_StringTable->ExpandStatic("/SYSENG0040/Game paused. Press Ctrl+Space to resume."));
-	Sta->m_SharedFonts = true;
-	Sta->m_Font = m_SystemFont;
-	Sta->SizeToFit();
-	Sta->m_PosY = m_AccessShieldWin->m_Height - Sta->m_Height;
-	Sta->m_PosX = (m_AccessShieldWin->m_Width - Sta->m_Width) / 2;
-
-	m_AccessShieldWin->m_Visible = true;
-	m_AccessShieldWin->GoSystemExclusive();
-
-	return S_OK;
+bool BaseGame::accessPause() {
+	_accessGlobalPaused = true;
+
+	if (_accessShieldWin)
+		unregisterObject(_accessShieldWin);
+
+	_accessShieldWin = new UIWindow(this);
+	_windows.add(_accessShieldWin);
+	registerObject(_accessShieldWin);
+
+	_accessShieldWin->_posX = _accessShieldWin->_posY = 0;
+	_accessShieldWin->_width = _renderer->_width;
+	_accessShieldWin->_height = _renderer->_height;
+
+	UIText *sta = new UIText(_game);
+	sta->_parent = _accessShieldWin;
+	_accessShieldWin->_widgets.add(sta);
+	sta->setText(_stringTable->expandStatic("/SYSENG0040/Game paused. Press Ctrl+Space to resume."));
+	sta->_sharedFonts = true;
+	sta->_font = _systemFont;
+	sta->sizeToFit();
+	sta->_posY = _accessShieldWin->_height - sta->_height;
+	sta->_posX = (_accessShieldWin->_width - sta->_width) / 2;
+
+	_accessShieldWin->_visible = true;
+	_accessShieldWin->goSystemExclusive();
+
+	return true;
 }
 
 //////////////////////////////////////////////////////////////////////////
-HRESULT CBGame::AccessUnpause() {
-	m_AccessGlobalPaused = false;
-	if (m_AccessShieldWin) {
-		m_AccessShieldWin->Close();
-		UnregisterObject(m_AccessShieldWin);
-		m_AccessShieldWin = NULL;
+bool BaseGame::accessUnpause() {
+	_accessGlobalPaused = false;
+	if (_accessShieldWin) {
+		_accessShieldWin->close();
+		unregisterObject(_accessShieldWin);
+		_accessShieldWin = nullptr;
 	}
-	return S_OK;
-}*/
+	return true;
+}
 
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::handleMouseWheel(int32 delta) {
@@ -5053,7 +5080,7 @@ bool BaseGame::setActiveObject(BaseObject *obj) {
 	// if (validObject(_activeObject)) _activeObject->applyEvent("MouseLeave");
 	_activeObject = obj;
 	if (_activeObject) {
-		//m_AccessMgr->Speak(m_ActiveObject->GetAccessCaption(), TTS_CAPTION);
+		_accessMgr->speak(_activeObject->getAccessCaption(), TTS_CAPTION);
 		_activeObject->applyEvent("MouseEntry");
 	}
 
@@ -5396,6 +5423,24 @@ bool BaseGame::onActivate(bool activate, bool refreshMouse) {
 	return STATUS_OK;
 }
 
+//////////////////////////////////////////////////////////////////////////
+BaseObject *BaseGame::getNextAccessObject(BaseObject *currObject) {
+	if (_focusedWindow) {
+		return _focusedWindow->getNextAccessObject(currObject);
+	} else {
+		return nullptr;
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+BaseObject* BaseGame::getPrevAccessObject(BaseObject *currObject) {
+	if(_focusedWindow) {
+		return _focusedWindow->getPrevAccessObject(currObject);
+	} else {
+		return nullptr;
+	}
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool BaseGame::onMouseLeftDown() {
 	if (isVideoPlaying()) {
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index 1afe686e849..f43cbaa7add 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -60,6 +60,7 @@ class BaseRegistry;
 class BaseSurfaceStorage;
 class BaseKeyboardState;
 class BaseGameSettings;
+class BaseAccessMgr;
 class ScEngine;
 class SXMath;
 class SXDirectory;
@@ -88,8 +89,8 @@ public:
 	virtual uint32 getAmbientLightColor();
 	virtual bool getFogParams(bool *fogEnabled, uint32 *fogColor, float *start, float *end);
 #endif
-	//virtual CBObject *GetNextAccessObject(CBObject *CurrObject);
-	//virtual CBObject *GetPrevAccessObject(CBObject *CurrObject);
+	virtual BaseObject *getNextAccessObject(BaseObject *currObject);
+	virtual BaseObject *getPrevAccessObject(BaseObject *currObject);
 
 	virtual bool onActivate(bool activate, bool refreshMouse);
 	virtual bool onMouseLeftDown();
@@ -204,7 +205,7 @@ public:
 	bool initialize1();
 	bool initialize2();
 	bool initialize3();
-	//CBAccessMgr *m_AccessMgr;
+	BaseAccessMgr *_accessMgr;
 	BaseFileManager *_fileManager;
 	BaseTransitionMgr *_transMgr;
 
@@ -297,7 +298,7 @@ public:
 	virtual bool getVersion(byte *verMajor, byte *verMinor, byte *extMajor, byte *extMinor);
 	bool handleKeypress(Common::Event *event, bool printable = false) override;
 	virtual void handleKeyRelease(Common::Event *event);
-	//bool HandleAccessKey(bool Printable, DWORD CharCode, DWORD KeyData);
+	bool handleAccessKey(Common::Event *event, bool printable);
 	virtual bool handleCustomActionStart(BaseGameCustomAction action);
 	virtual bool handleCustomActionEnd(BaseGameCustomAction action);
 	int32 _freezeLevel;
@@ -374,19 +375,19 @@ public:
 	BaseArray<BaseObject *> _regObjects;
 
 	// accessibility flags
-/*	bool m_AccessTTSEnabled;
-	bool m_AccessTTSTalk;
-	bool m_AccessTTSCaptions;
-	bool m_AccessTTSKeypress;
-	bool m_AccessKeyboardEnabled;
-	bool m_AccessKeyboardCursorSkip;
-	bool m_AccessKeyboardPause;
-
-	bool m_AccessGlobalPaused;
-
-	CUIWindow *m_AccessShieldWin;
-	HRESULT AccessPause();
-	HRESULT AccessUnpause();*/
+	bool _accessTTSEnabled;
+	bool _accessTTSTalk;
+	bool _accessTTSCaptions;
+	bool _accessTTSKeypress;
+	bool _accessKeyboardEnabled;
+	bool _accessKeyboardCursorSkip;
+	bool _accessKeyboardPause;
+
+	bool _accessGlobalPaused;
+
+	UIWindow *_accessShieldWin;
+	bool accessPause();
+	bool accessUnpause();
 
 public:
 	virtual bool displayContent(bool update = true, bool displayAll = false);
diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp
index 629a6fd828d..b38c9b1498f 100644
--- a/engines/wintermute/base/base_object.cpp
+++ b/engines/wintermute/base/base_object.cpp
@@ -165,7 +165,7 @@ bool BaseObject::cleanup() {
 	_sFXType = SFX_NONE;
 	_sFXParam1 = _sFXParam2 = _sFXParam3 = _sFXParam4 = 0;
 
-	//SAFE_DELETE_ARRAY(m_AccessCaption);
+	SAFE_DELETE_ARRAY(_accessCaption);
 
 	return STATUS_OK;
 }
@@ -830,9 +830,9 @@ ScValue *BaseObject::scGetProperty(const char *name) {
 	// AccCaption
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccCaption") == 0) {
-/*		if (m_AccessCaption)
-			m_ScValue->SetString(m_AccessCaption);
-		else*/
+		if (_accessCaption)
+			_scValue->setString(_accessCaption);
+		else
 			_scValue->setNULL();
 		return _scValue;
 	} else {
@@ -1026,11 +1026,11 @@ bool BaseObject::scSetProperty(const char *name, ScValue *value) {
 	// AccCaption
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "AccCaption") == 0) {
-		/*if (Value->IsNULL()) {
-			SAFE_DELETE_ARRAY(m_AccessCaption);
+		if (value->isNULL()) {
+			SAFE_DELETE_ARRAY(_accessCaption);
 		} else {
-			CBUtils::SetString(&m_AccessCaption, Value->GetString());
-		}*/
+			BaseUtils::setString(&_accessCaption, value->getString());
+		}
 		return STATUS_OK;
 	} else {
 		return BaseScriptHolder::scSetProperty(name, value);
@@ -1145,7 +1145,13 @@ bool BaseObject::persist(BasePersistenceManager *persistMgr) {
 #endif
 
 	persistMgr->transferSint32(TMEMBER_INT(_blendMode));
-	//persistMgr->Transfer(TMEMBER(m_AccessCaption));
+	if (persistMgr->checkVersion(1, 10, 1)) {
+		persistMgr->transferPtr(TMEMBER(_accessCaption));
+	} else {
+		if (!persistMgr->getIsSaving()) {
+			_accessCaption = nullptr;
+		}
+	}
 
 	return STATUS_OK;
 }
@@ -1413,10 +1419,12 @@ bool BaseObject::renderModel() {
 #endif
 
 //////////////////////////////////////////////////////////////////////////
-/*char *CBObject::GetAccessCaption() {
-	if (m_AccessCaption)
-		return m_AccessCaption;
-	else
-		return GetCaption();
-}*/
+const char *BaseObject::getAccessCaption() {
+	if (_accessCaption) {
+		return _accessCaption;
+	} else {
+		return getCaption();
+	}
+}
+
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_object.h b/engines/wintermute/base/base_object.h
index ae59cf01d73..b148ae85ed3 100644
--- a/engines/wintermute/base/base_object.h
+++ b/engines/wintermute/base/base_object.h
@@ -49,7 +49,7 @@ class XModel;
 class BaseObject : public BaseScriptHolder {
 public:
 	char *_accessCaption;
-	//virtual char *GetAccessCaption();
+	virtual const char *getAccessCaption();
 
 	Graphics::TSpriteBlendMode _blendMode;
 #ifdef ENABLE_WME3D
diff --git a/engines/wintermute/detection.cpp b/engines/wintermute/detection.cpp
index 1c4342f2660..8d88ddba6be 100644
--- a/engines/wintermute/detection.cpp
+++ b/engines/wintermute/detection.cpp
@@ -58,9 +58,9 @@ public:
 		// of J.U.L.I.A. when their datafiles sit in the same directory (e.g. in Steam distribution).
 		_flags = kADFlagUseExtraAsHint;
 #ifdef ENABLE_WME3D
-		_guiOptions = GUIO4(GUIO_NOMIDI, GAMEOPTION_SHOW_FPS, GAMEOPTION_BILINEAR, GAMEOPTION_FORCE_2D_RENDERER);
+		_guiOptions = GUIO5(GUIO_NOMIDI, GAMEOPTION_SHOW_FPS, GAMEOPTION_BILINEAR, GAMEOPTION_TTS, GAMEOPTION_FORCE_2D_RENDERER);
 #else
-		_guiOptions = GUIO3(GUIO_NOMIDI, GAMEOPTION_SHOW_FPS, GAMEOPTION_BILINEAR);
+		_guiOptions = GUIO4(GUIO_NOMIDI, GAMEOPTION_SHOW_FPS, GAMEOPTION_BILINEAR, GAMEOPTION_TTS);
 #endif
 		_maxScanDepth = 2;
 		_directoryGlobs = directoryGlobs;
diff --git a/engines/wintermute/detection.h b/engines/wintermute/detection.h
index e02dc3a86df..a22b7081b8c 100644
--- a/engines/wintermute/detection.h
+++ b/engines/wintermute/detection.h
@@ -140,6 +140,7 @@ struct WMEGameDescription {
 #ifdef ENABLE_WME3D
 #define GAMEOPTION_FORCE_2D_RENDERER GUIO_GAMEOPTIONS3
 #endif
+#define GAMEOPTION_TTS               GUIO_GAMEOPTIONS4
 
 } // End of namespace Wintermute
 
diff --git a/engines/wintermute/metaengine.cpp b/engines/wintermute/metaengine.cpp
index 13197455d40..e44ecb97b25 100644
--- a/engines/wintermute/metaengine.cpp
+++ b/engines/wintermute/metaengine.cpp
@@ -74,6 +74,20 @@ static const ADExtraGuiOptionsMap gameGuiOptions[] = {
 	},
 #endif
 
+#ifdef USE_TTS
+	{
+		GAMEOPTION_TTS,
+		{
+			_s("Enable Text to Speech"),
+			_s("Use TTS to read text in the game (if TTS is available)"),
+			"tts_enabled",
+			false,
+			0,
+			0
+		}
+	},
+#endif
+
 	AD_EXTRA_GUI_OPTIONS_TERMINATOR
 };
 
diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk
index 38f64e73b77..17b06c14330 100644
--- a/engines/wintermute/module.mk
+++ b/engines/wintermute/module.mk
@@ -63,8 +63,9 @@ MODULE_OBJS := \
 	base/sound/base_sound.o \
 	base/sound/base_sound_buffer.o \
 	base/sound/base_sound_manager.o \
-	base/base_active_rect.o \
 	base/base.o \
+	base/base_access_mgr.o \
+	base/base_active_rect.o \
 	base/base_dynamic_buffer.o \
 	base/base_engine.o \
 	base/base_fader.o \
diff --git a/engines/wintermute/ui/ui_button.cpp b/engines/wintermute/ui/ui_button.cpp
index 237dcda9a80..fba622eba71 100644
--- a/engines/wintermute/ui/ui_button.cpp
+++ b/engines/wintermute/ui/ui_button.cpp
@@ -36,6 +36,7 @@
 #include "engines/wintermute/base/base_string_table.h"
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_file_manager.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
 #include "engines/wintermute/base/scriptables/script_value.h"
 #include "engines/wintermute/base/scriptables/script.h"
@@ -755,12 +756,11 @@ bool UIButton::display(int offsetX, int offsetY) {
 	}
 	if (_imageHover && _imageHover != image) {
 		_imageHover->reset();
-
-/*	if (Game->m_AccessMgr->GetActiveObject() == this) {
+	}
+	if (_game->_accessMgr->getActiveObject() == this) {
 		Common::Rect32 rc;
-		SetRect(&rc, OffsetX + m_PosX, OffsetY + m_PosY, OffsetX + m_PosX + m_Width, OffsetY + m_PosY + m_Height);
-		Game->m_AccessMgr->SetHintRect(&rc, true);
-	}*/
+		BasePlatform::setRect(&rc, offsetX + _posX, offsetY + _posY, offsetX + _posX + _width, offsetY + _posY + _height);
+		_game->_accessMgr->setHintRect(&rc, true);
 	}
 
 	_press = _hover && _game->_mouseLeftDown && _game->_capturedObject == this;
diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp
index 498541f77ad..c19e9da4531 100644
--- a/engines/wintermute/ui/ui_edit.cpp
+++ b/engines/wintermute/ui/ui_edit.cpp
@@ -39,6 +39,7 @@
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_string_table.h"
 #include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
 #include "engines/wintermute/base/scriptables/script_value.h"
 #include "engines/wintermute/base/scriptables/script_stack.h"
@@ -727,11 +728,11 @@ bool UIEdit::display(int offsetX, int offsetY) {
 
 	_game->_renderer->_rectList.add(new BaseActiveRect(_game, this, nullptr, offsetX + _posX, offsetY + _posY, _width, _height, 100, 100, false));
 
-/*	if (Game->m_AccessMgr->GetActiveObject() == this) {
+	if (_game->_accessMgr->getActiveObject() == this) {
 		Common::Rect32 rc;
-		SetRect(&rc, OffsetX + m_PosX, OffsetY + m_PosY, OffsetX + m_PosX + m_Width, OffsetY + m_PosY + m_Height);
-		Game->m_AccessMgr->SetHintRect(&rc, true);
-	}*/
+		BasePlatform::setRect(&rc, offsetX + _posX, offsetY + _posY, offsetX + _posX + _width, offsetY + _posY + _height);
+		_game->_accessMgr->setHintRect(&rc, true);
+	}
 
 	_game->_textEncoding = OrigEncoding;
 
diff --git a/engines/wintermute/ui/ui_object.cpp b/engines/wintermute/ui/ui_object.cpp
index 71363b89722..d78177ff913 100644
--- a/engines/wintermute/ui/ui_object.cpp
+++ b/engines/wintermute/ui/ui_object.cpp
@@ -639,16 +639,16 @@ bool UIObject::persist(BasePersistenceManager *persistMgr) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-/*char *CUIObject::GetAccessCaption() {
-	if (m_AccessCaption)
-		return m_AccessCaption;
+const char *UIObject::getAccessCaption() {
+	if (_accessCaption)
+		return _accessCaption;
 	else {
-		if (m_Text)
-			return m_Text;
+		if (_text && _text[0])
+			return _text;
 		else
-			return GetCaption();
+			return getCaption();
 	}
-}*/
+}
 
 //////////////////////////////////////////////////////////////////////////
 bool UIObject::saveAsText(BaseDynamicBuffer *buffer, int indent) {
diff --git a/engines/wintermute/ui/ui_object.h b/engines/wintermute/ui/ui_object.h
index 6c482a5809a..158df3e652e 100644
--- a/engines/wintermute/ui/ui_object.h
+++ b/engines/wintermute/ui/ui_object.h
@@ -38,7 +38,7 @@ class UITiledImage;
 class BaseFont;
 class UIObject : public BaseObject {
 public:
-	//virtual char *GetAccessCaption();
+	const char *getAccessCaption() override;
 
 	bool getTotalOffset(int *offsetX, int *offsetY);
 	bool _canFocus;
diff --git a/engines/wintermute/ui/ui_window.cpp b/engines/wintermute/ui/ui_window.cpp
index 04767fecf1b..298758ec6ac 100644
--- a/engines/wintermute/ui/ui_window.cpp
+++ b/engines/wintermute/ui/ui_window.cpp
@@ -46,6 +46,7 @@
 #include "engines/wintermute/base/scriptables/script_stack.h"
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_file_manager.h"
+#include "engines/wintermute/base/base_access_mgr.h"
 #include "engines/wintermute/platform_osystem.h"
 #include "engines/wintermute/dcgf.h"
 
@@ -1349,7 +1350,7 @@ bool UIWindow::goSystemExclusive() {
 
 	makeFreezable(false);
 
-	//Game->m_AccessMgr->SetActiveObject();
+	_game->_accessMgr->setActiveObject();
 	_mode = WINDOW_SYSTEM_EXCLUSIVE;
 	_ready = false;
 	_visible = true;
@@ -1405,50 +1406,50 @@ void UIWindow::makeFreezable(bool freezable) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-/*CBObject *CUIWindow::GetNextAccessObject(CBObject *CurrObject) {
-	CBArray<CUIObject *, CUIObject *> Objects;
-	GetWindowObjects(Objects, true);
+BaseObject *UIWindow::getNextAccessObject(BaseObject *currObject) {
+	BaseArray<UIObject *>objects;
+	getWindowObjects(objects, true);
 
-	if (Objects.GetSize() == 0)
-		return NULL;
+	if (objects.getSize() == 0)
+		return nullptr;
 	else {
-		if (CurrObject != NULL) {
-			for (int i = 0; i < Objects.GetSize(); i++) {
-				if (Objects[i] == CurrObject) {
-					if (i < Objects.GetSize() - 1)
-						return Objects[i + 1];
+		if (currObject != nullptr) {
+			for (int32 i = 0; i < objects.getSize(); i++) {
+				if (objects[i] == currObject) {
+					if (i < objects.getSize() - 1)
+						return objects[i + 1];
 					else
 						break;
 				}
 			}
 		}
-		return Objects[0];
+		return objects[0];
 	}
-	return NULL;
-}*/
+	return nullptr;
+}
 
 //////////////////////////////////////////////////////////////////////////
-/*CBObject *CUIWindow::GetPrevAccessObject(CBObject *CurrObject) {
-	CBArray<CUIObject *, CUIObject *> Objects;
-	GetWindowObjects(Objects, true);
+BaseObject *UIWindow::getPrevAccessObject(BaseObject *currObject) {
+	BaseArray<UIObject *>objects;
+	getWindowObjects(objects, true);
 
-	if (Objects.GetSize() == 0)
+	if (objects.getSize() == 0)
 		return NULL;
 	else {
-		if (CurrObject != NULL) {
-			for (int i = Objects.GetSize() - 1; i >= 0; i--) {
-				if (Objects[i] == CurrObject) {
+		if (currObject != nullptr) {
+			for (int32 i = objects.getSize() - 1; i >= 0; i--) {
+				if (objects[i] == currObject) {
 					if (i > 0)
-						return Objects[i - 1];
+						return objects[i - 1];
 					else
 						break;
 				}
 			}
 		}
-		return Objects[Objects.GetSize() - 1];
+		return objects[objects.getSize() - 1];
 	}
-	return NULL;
-}*/
+	return nullptr;
+}
 
 //////////////////////////////////////////////////////////////////////////
 bool UIWindow::getWindowObjects(BaseArray<UIObject *> &objects, bool interactiveOnly) {
diff --git a/engines/wintermute/ui/ui_window.h b/engines/wintermute/ui/ui_window.h
index 9372e0a8957..62928695928 100644
--- a/engines/wintermute/ui/ui_window.h
+++ b/engines/wintermute/ui/ui_window.h
@@ -38,8 +38,8 @@ class UIButton;
 class BaseViewport;
 class UIWindow : public UIObject {
 public:
-	//CBObject *GetPrevAccessObject(CBObject *CurrObject);
-	//CBObject *GetNextAccessObject(CBObject *CurrObject);
+	BaseObject *getPrevAccessObject(BaseObject *currObject);
+	BaseObject *getNextAccessObject(BaseObject *currObject);
 	bool getWindowObjects(BaseArray<UIObject *> &objects, bool interactiveOnly);
 
 	bool _pauseMusic;
diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp
index d2c7db54957..403bd1c187a 100644
--- a/engines/wintermute/wintermute.cpp
+++ b/engines/wintermute/wintermute.cpp
@@ -193,6 +193,8 @@ int WintermuteEngine::init() {
 
 	_game->initConfManSettings();
 
+	_game->_accessTTSEnabled = ConfMan.getBool("tts_enabled");
+
 	// load general game settings
 	_game->initialize1();
 




More information about the Scummvm-git-logs mailing list