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

mgerhardy martin.gerhardy at gmail.com
Fri Apr 9 13:08:37 UTC 2021


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

Summary:
87bc213fc1 TWINE: removed playerName array from gamestate
8420729fd7 TWINE: renamed and refactored text input methods
8289072496 TWINE: added highres option to advanced menu
b8ac7f46b7 TWINE: added wall collision option to adv menu
59a538c3da TWINE: allow to toggle options with enter, too
c211ed15b6 TWINE: updated volume menu
0bad9e9b7a TWINE: use color constant


Commit: 87bc213fc1c2aa12170703d2f701bf6f0516fec0
    https://github.com/scummvm/scummvm/commit/87bc213fc1c2aa12170703d2f701bf6f0516fec0
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T07:17:40+02:00

Commit Message:
TWINE: removed playerName array from gamestate

this is already in the menuoptions class

Changed paths:
    engines/twine/scene/gamestate.cpp
    engines/twine/scene/gamestate.h
    engines/twine/scene/scene.cpp


diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index 6c4caacf0a..67eef9e5eb 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -53,7 +53,6 @@ GameState::GameState(TwinEEngine *engine) : _engine(engine) {
 	clearGameFlags();
 	Common::fill(&inventoryFlags[0], &inventoryFlags[NUM_INVENTORY_ITEMS], 0);
 	Common::fill(&holomapFlags[0], &holomapFlags[NUM_LOCATIONS], 0);
-	playerName[0] = '\0';
 	Common::fill(&gameChoices[0], &gameChoices[10], 0);
 }
 
@@ -162,11 +161,11 @@ bool GameState::loadGame(Common::SeekableReadStream *file) {
 	int playerNameIdx = 0;
 	do {
 		const byte c = file->readByte();
-		playerName[playerNameIdx++] = c;
+		_engine->_menuOptions->playerName[playerNameIdx++] = c;
 		if (c == '\0') {
 			break;
 		}
-		if (playerNameIdx >= ARRAYSIZE(playerName)) {
+		if (playerNameIdx >= ARRAYSIZE(_engine->_menuOptions->playerName)) {
 			warning("Failed to load savegame. Invalid playername.");
 			return false;
 		}
@@ -229,8 +228,8 @@ bool GameState::loadGame(Common::SeekableReadStream *file) {
 
 bool GameState::saveGame(Common::WriteStream *file) {
 	debug(2, "Save game");
-	if (playerName[0] == '\0') {
-		Common::strlcpy(playerName, "TwinEngineSave", sizeof(playerName));
+	if (_engine->_menuOptions->playerName[0] == '\0') {
+		Common::strlcpy(_engine->_menuOptions->playerName, "TwinEngineSave", sizeof(_engine->_menuOptions->playerName));
 	}
 
 	int32 sceneIdx = _engine->_scene->currentSceneIdx;
@@ -242,7 +241,7 @@ bool GameState::saveGame(Common::WriteStream *file) {
 	}
 
 	file->writeByte(0x03);
-	file->writeString(playerName);
+	file->writeString(_engine->_menuOptions->playerName);
 	file->writeByte('\0');
 	file->writeByte(NUM_GAME_FLAGS);
 	for (uint8 i = 0; i < NUM_GAME_FLAGS; ++i) {
diff --git a/engines/twine/scene/gamestate.h b/engines/twine/scene/gamestate.h
index 96802ae4cc..831edf869b 100644
--- a/engines/twine/scene/gamestate.h
+++ b/engines/twine/scene/gamestate.h
@@ -211,7 +211,6 @@ public:
 
 	uint8 holomapFlags[NUM_LOCATIONS]; // GV14
 
-	char playerName[30] {};
 	char sceneName[30] {};
 
 	int32 gameChoices[10];  // inGameMenuData
diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index 540ce7fc60..30191d6586 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -481,8 +481,7 @@ void Scene::changeScene() {
 	if (_engine->isLBA1() && currentSceneIdx >= LBA1SceneId::Citadel_Island_Prison && currentSceneIdx < LBA1SceneId::SceneIdMax) {
 		snprintf(_engine->_gameState->sceneName, sizeof(_engine->_gameState->sceneName), "%i %s", currentSceneIdx, _engine->_holomap->getLocationName(currentSceneIdx));
 	} else {
-		const char *pName = _engine->_gameState->playerName;
-		snprintf(_engine->_gameState->sceneName, sizeof(_engine->_gameState->sceneName), "%i %s", currentSceneIdx, pName);
+		snprintf(_engine->_gameState->sceneName, sizeof(_engine->_gameState->sceneName), "%i", currentSceneIdx);
 	}
 	debug(2, "Entering scene %s (came from %i)", _engine->_gameState->sceneName, previousSceneIdx);
 


Commit: 8420729fd7078e44b406b74189a06f35de74b4c7
    https://github.com/scummvm/scummvm/commit/8420729fd7078e44b406b74189a06f35de74b4c7
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T07:26:36+02:00

Commit Message:
TWINE: renamed and refactored text input methods

Changed paths:
    engines/twine/menu/menuoptions.cpp
    engines/twine/menu/menuoptions.h
    engines/twine/scene/gamestate.cpp


diff --git a/engines/twine/menu/menuoptions.cpp b/engines/twine/menu/menuoptions.cpp
index 42fcde228e..396696bf56 100644
--- a/engines/twine/menu/menuoptions.cpp
+++ b/engines/twine/menu/menuoptions.cpp
@@ -211,7 +211,7 @@ void MenuOptions::drawSelectableCharacters() {
 	_engine->copyBlockPhys(dirtyRect);
 }
 
-void MenuOptions::drawPlayerName(int32 centerx, int32 top, int32 type) {
+void MenuOptions::drawInputText(int32 centerx, int32 top, int32 type, const char *text) {
 	const int32 left = 10;
 	const int right = _engine->width() - left;
 	const int bottom = top + PLASMA_HEIGHT;
@@ -225,7 +225,7 @@ void MenuOptions::drawPlayerName(int32 centerx, int32 top, int32 type) {
 	_engine->_menu->drawBox(rect);
 	_engine->_interface->drawTransparentBox(rectBox, 3);
 
-	_engine->_text->drawText(centerx - _engine->_text->getTextSize(playerName) / 2, top + 6, playerName);
+	_engine->_text->drawText(centerx - _engine->_text->getTextSize(text) / 2, top + 6, text);
 	_engine->copyBlockPhys(rect);
 }
 
@@ -249,8 +249,8 @@ public:
 	}
 };
 
-bool MenuOptions::enterPlayerName(int32 textIdx) {
-	playerName[0] = '\0'; // TODO: read from settings?
+bool MenuOptions::enterText(int32 textIdx, char *textTargetBuf, size_t bufSize) {
+	textTargetBuf[0] = '\0';
 	_engine->_text->initTextBank(TextBankId::Options_and_menus);
 	char buffer[256];
 	_engine->_text->getMenuText(textIdx, buffer, sizeof(buffer));
@@ -277,27 +277,27 @@ bool MenuOptions::enterPlayerName(int32 textIdx) {
 				if (_engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					if (_onScreenKeyboardLeaveViaOkButton) {
 						if (_onScreenKeyboardX == ONSCREENKEYBOARD_WIDTH - 1 && _onScreenKeyboardY == ONSCREENKEYBOARD_HEIGHT - 1) {
-							if (playerName[0] == '\0') {
+							if (textTargetBuf[0] == '\0') {
 								continue;
 							}
 							return true;
 						}
-						const size_t size = strlen(playerName);
+						const size_t size = strlen(textTargetBuf);
 						if (_onScreenKeyboardX == ONSCREENKEYBOARD_WIDTH - 2 && _onScreenKeyboardY == ONSCREENKEYBOARD_HEIGHT - 1) {
 							if (size >= 1) {
-								playerName[size - 1] = '\0';
+								textTargetBuf[size - 1] = '\0';
 							}
 							continue;
 						}
 						const char chr = allowedCharIndex[_onScreenKeyboardX + _onScreenKeyboardY * ONSCREENKEYBOARD_WIDTH];
-						playerName[size] = chr;
-						playerName[size + 1] = '\0';
-						if (size + 1 >= sizeof(playerName) - 1) {
+						textTargetBuf[size] = chr;
+						textTargetBuf[size + 1] = '\0';
+						if (size + 1 >= bufSize - 1) {
 							return true;
 						}
 						continue;
 					}
-					if (playerName[0] == '\0') {
+					if (textTargetBuf[0] == '\0') {
 						continue;
 					}
 
@@ -319,22 +319,22 @@ bool MenuOptions::enterPlayerName(int32 textIdx) {
 
 				break;
 			case Common::EVENT_KEYDOWN: {
-				const size_t size = strlen(playerName);
+				const size_t size = strlen(textTargetBuf);
 				if (!Common::isPrint(event.kbd.ascii)) {
 					if (event.kbd.keycode == Common::KEYCODE_BACKSPACE) {
 						if (size >= 1) {
-							playerName[size - 1] = '\0';
+							textTargetBuf[size - 1] = '\0';
 							_onScreenKeyboardLeaveViaOkButton = false;
 						}
 					}
 					continue;
 				}
-				if (size >= sizeof(playerName) - 1) {
+				if (size >= bufSize - 1) {
 					return true;
 				}
 				if (strchr(allowedCharIndex, event.kbd.ascii)) {
-					playerName[size] = event.kbd.ascii;
-					playerName[size + 1] = '\0';
+					textTargetBuf[size] = event.kbd.ascii;
+					textTargetBuf[size + 1] = '\0';
 					_onScreenKeyboardLeaveViaOkButton = false;
 				}
 
@@ -347,7 +347,7 @@ bool MenuOptions::enterPlayerName(int32 textIdx) {
 		if (_engine->shouldQuit()) {
 			break;
 		}
-		drawPlayerName(halfScreenWidth, 100, 1);
+		drawInputText(halfScreenWidth, 100, 1, textTargetBuf);
 		drawSelectableCharacters();
 	}
 	return false;
@@ -356,7 +356,7 @@ bool MenuOptions::enterPlayerName(int32 textIdx) {
 bool MenuOptions::newGameMenu() {
 	_engine->_screens->copyScreen(_engine->workVideoBuffer, _engine->frontVideoBuffer);
 	_engine->flip();
-	if (!enterPlayerName(TextId::kEnterYourName)) {
+	if (!enterText(TextId::kEnterYourName, saveGameName, sizeof(saveGameName))) {
 		return false;
 	}
 	_engine->_gameState->initEngineVars();
diff --git a/engines/twine/menu/menuoptions.h b/engines/twine/menu/menuoptions.h
index a5aff64261..646320923a 100644
--- a/engines/twine/menu/menuoptions.h
+++ b/engines/twine/menu/menuoptions.h
@@ -44,9 +44,9 @@ private:
 
 	void setOnScreenKeyboard(int x, int y);
 
-	bool enterPlayerName(int32 textIdx);
+	bool enterText(int32 textIdx, char *textTargetBuf, size_t bufSize);
 	void drawSelectableCharacters();
-	void drawPlayerName(int32 centerx, int32 top, int32 type);
+	void drawInputText(int32 centerx, int32 top, int32 type, const char *text);
 	void drawSelectableCharacter(int32 x, int32 y, Common::Rect &dirtyRect);
 	int chooseSave(int textIdx, bool showEmptySlots = false);
 
@@ -57,7 +57,7 @@ public:
 	void showCredits();
 	bool canShowCredits = false;
 
-	char playerName[32] {'\0'};
+	char saveGameName[32] {'\0'};
 
 	/** Main menu new game options */
 	bool newGameMenu();
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index 67eef9e5eb..cb7867f82d 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -161,11 +161,11 @@ bool GameState::loadGame(Common::SeekableReadStream *file) {
 	int playerNameIdx = 0;
 	do {
 		const byte c = file->readByte();
-		_engine->_menuOptions->playerName[playerNameIdx++] = c;
+		_engine->_menuOptions->saveGameName[playerNameIdx++] = c;
 		if (c == '\0') {
 			break;
 		}
-		if (playerNameIdx >= ARRAYSIZE(_engine->_menuOptions->playerName)) {
+		if (playerNameIdx >= ARRAYSIZE(_engine->_menuOptions->saveGameName)) {
 			warning("Failed to load savegame. Invalid playername.");
 			return false;
 		}
@@ -228,8 +228,8 @@ bool GameState::loadGame(Common::SeekableReadStream *file) {
 
 bool GameState::saveGame(Common::WriteStream *file) {
 	debug(2, "Save game");
-	if (_engine->_menuOptions->playerName[0] == '\0') {
-		Common::strlcpy(_engine->_menuOptions->playerName, "TwinEngineSave", sizeof(_engine->_menuOptions->playerName));
+	if (_engine->_menuOptions->saveGameName[0] == '\0') {
+		Common::strlcpy(_engine->_menuOptions->saveGameName, "TwinEngineSave", sizeof(_engine->_menuOptions->saveGameName));
 	}
 
 	int32 sceneIdx = _engine->_scene->currentSceneIdx;
@@ -241,7 +241,7 @@ bool GameState::saveGame(Common::WriteStream *file) {
 	}
 
 	file->writeByte(0x03);
-	file->writeString(_engine->_menuOptions->playerName);
+	file->writeString(_engine->_menuOptions->saveGameName);
 	file->writeByte('\0');
 	file->writeByte(NUM_GAME_FLAGS);
 	for (uint8 i = 0; i < NUM_GAME_FLAGS; ++i) {


Commit: 8289072496a3c8a8a2339df2d7f3ccd23d78abe8
    https://github.com/scummvm/scummvm/commit/8289072496a3c8a8a2339df2d7f3ccd23d78abe8
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T10:43:03+02:00

Commit Message:
TWINE: added highres option to advanced menu

also use enum class for TextId and TextBankId

Changed paths:
    engines/twine/POTFILES
    engines/twine/debugger/console.cpp
    engines/twine/holomap.cpp
    engines/twine/holomap.h
    engines/twine/menu/menu.cpp
    engines/twine/menu/menu.h
    engines/twine/menu/menuoptions.cpp
    engines/twine/menu/menuoptions.h
    engines/twine/parser/text.cpp
    engines/twine/parser/text.h
    engines/twine/renderer/redraw.cpp
    engines/twine/resources/resources.cpp
    engines/twine/resources/resources.h
    engines/twine/scene/actor.cpp
    engines/twine/scene/actor.h
    engines/twine/scene/gamestate.cpp
    engines/twine/scene/gamestate.h
    engines/twine/scene/scene.cpp
    engines/twine/scene/scene.h
    engines/twine/script/script_life_v1.cpp
    engines/twine/shared.h
    engines/twine/text.cpp
    engines/twine/text.h
    engines/twine/twine.cpp


diff --git a/engines/twine/POTFILES b/engines/twine/POTFILES
index 58e35e612f..0e7d0a726d 100644
--- a/engines/twine/POTFILES
+++ b/engines/twine/POTFILES
@@ -1 +1,2 @@
 engines/twine/metaengine.cpp
+engines/twine/parser/text.cpp
diff --git a/engines/twine/debugger/console.cpp b/engines/twine/debugger/console.cpp
index 36a95de5c5..0021635343 100644
--- a/engines/twine/debugger/console.cpp
+++ b/engines/twine/debugger/console.cpp
@@ -304,7 +304,7 @@ bool TwinEConsole::doListMenuText(int argc, const char **argv) {
 	_engine->_text->initTextBank(TextBankId::Inventory_Intro_and_Holomap);
 	for (int32 i = 0; i < 1000; ++i) {
 		char buf[256];
-		if (_engine->_text->getMenuText(i, buf, sizeof(buf))) {
+		if (_engine->_text->getMenuText((TextId)i, buf, sizeof(buf))) {
 			debugPrintf("%4i: %s\n", i, buf);
 		}
 	}
diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index f58d6985e9..68709e1dbc 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -67,7 +67,7 @@ bool Holomap::loadLocations() {
 		_locations[i].angle.x = ClampAngle(stream.readSint16LE());
 		_locations[i].angle.y = ClampAngle(stream.readSint16LE());
 		_locations[i].angle.z = ClampAngle(stream.readSint16LE());
-		_locations[i].textIndex = stream.readUint16LE();
+		_locations[i].textIndex = (TextId)stream.readUint16LE();
 
 		if (_engine->_text->getMenuText(_locations[i].textIndex, _locations[i].name, sizeof(_locations[i].name))) {
 			debug(2, "Scene %i: %s", i, _locations[i].name);
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index 1107e7638d..c4b8462b6f 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -46,7 +46,7 @@ private:
 
 	struct Location {
 		IVec3 angle;
-		uint16 textIndex = 0;
+		TextId textIndex = TextId::kNone;
 		char name[30] = "";
 	};
 
diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 8f1ac503a9..3ef39f068a 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -65,7 +65,8 @@ enum _MenuButtonTypes {
 	kAggressiveMode = 6,
 	kPolygonDetails = 7,
 	kShadowSettings = 8,
-	kSceneryZoom = 9
+	kSceneryZoom = 9,
+	kHighResolution = 10
 };
 }
 
@@ -120,6 +121,7 @@ static MenuSettings createAdvancedOptionsMenu() {
 	settings.addButton(TextId::kDetailsPolygonsHigh, MenuButtonTypes::kPolygonDetails);
 	settings.addButton(TextId::kDetailsShadowHigh, MenuButtonTypes::kShadowSettings);
 	settings.addButton(TextId::kSceneryZoomOn, MenuButtonTypes::kSceneryZoom);
+	settings.addButton(TextId::kCustomHighResOptionOn, MenuButtonTypes::kHighResolution);
 	return settings;
 }
 
@@ -147,7 +149,7 @@ static MenuSettings createVolumeMenu() {
 
 const char *MenuSettings::getButtonText(Text *text, int buttonIndex) {
 	if (_buttonTexts[buttonIndex].empty()) {
-		const int32 textId = getButtonTextId(buttonIndex);
+		const TextId textId = getButtonTextId(buttonIndex);
 		char dialText[256] = "";
 		text->getMenuText(textId, dialText, sizeof(dialText));
 		_buttonTexts[buttonIndex] = dialText;
@@ -359,6 +361,15 @@ int16 Menu::drawButtons(MenuSettings *menuSettings, bool hover) {
 					menuSettings->setButtonTextId(i, TextId::kNoSceneryZoom);
 				}
 				break;
+			case MenuButtonTypes::kHighResolution: {
+				const bool highRes = ConfMan.getBool("usehighres");
+				if (highRes) {
+					menuSettings->setButtonTextId(i, TextId::kCustomHighResOptionOn);
+				} else {
+					menuSettings->setButtonTextId(i, TextId::kCustomHighResOptionOff);
+				}
+				break;
+			}
 			default:
 				break;
 			}
@@ -467,6 +478,12 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 					_engine->cfgfile.SceZoom = !_engine->cfgfile.SceZoom;
 				}
 				break;
+			case MenuButtonTypes::kHighResolution:
+				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+					const bool highRes = ConfMan.getBool("usehighres");
+					ConfMan.setBool("usehighres", !highRes);
+				}
+				break;
 			default:
 				break;
 			}
@@ -552,9 +569,9 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 		}
 		if (_engine->_input->toggleActionIfActive(TwinEActionType::UIAbort)) {
 			for (int i = 0; i < menuSettings->getButtonCount(); ++i) {
-				const int16 textId = menuSettings->getButtonTextId(i);
+				const TextId textId = menuSettings->getButtonTextId(i);
 				if (textId == TextId::kReturnMenu || textId == TextId::kReturnGame || textId == TextId::kContinue) {
-					return textId;
+					return (int32)textId;
 				}
 			}
 			startMillis = loopMillis;
@@ -575,7 +592,7 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 		}
 	} while (!_engine->_input->toggleActionIfActive(TwinEActionType::UIEnter));
 
-	return menuSettings->getActiveButtonTextId();
+	return (int32)menuSettings->getActiveButtonTextId();
 }
 
 int32 Menu::advoptionsMenu() {
@@ -585,15 +602,15 @@ int32 Menu::advoptionsMenu() {
 	ScopedCursor scoped(_engine);
 	for (;;) {
 		switch (processMenu(&advOptionsMenuState)) {
-		case TextId::kReturnMenu: {
+		case (int32)TextId::kReturnMenu: {
 			return 0;
 		}
 		case kQuitEngine:
 			return kQuitEngine;
-		case TextId::kBehaviourAggressiveManual:
-		case TextId::kDetailsPolygonsHigh:
-		case TextId::kDetailsShadowHigh:
-		case TextId::kSceneryZoomOn:
+		case (int32)TextId::kBehaviourAggressiveManual:
+		case (int32)TextId::kDetailsPolygonsHigh:
+		case (int32)TextId::kDetailsShadowHigh:
+		case (int32)TextId::kSceneryZoomOn:
 		default:
 			warning("Unknown menu button handled");
 			break;
@@ -610,12 +627,12 @@ int32 Menu::savemanageMenu() {
 	ScopedCursor scoped(_engine);
 	for (;;) {
 		switch (processMenu(&saveManageMenuState)) {
-		case TextId::kReturnMenu:
+		case (int32)TextId::kReturnMenu:
 			return 0;
-		case TextId::kCreateSaveGame:
+		case (int32)TextId::kCreateSaveGame:
 			_engine->_menuOptions->saveGameMenu();
 			break;
-		case TextId::kDeleteSaveGame:
+		case (int32)TextId::kDeleteSaveGame:
 			_engine->_menuOptions->deleteSaveMenu();
 			break;
 		case kQuitEngine:
@@ -636,18 +653,18 @@ int32 Menu::volumeMenu() {
 	ScopedCursor scoped(_engine);
 	for (;;) {
 		switch (processMenu(&volumeMenuState)) {
-		case TextId::kReturnMenu:
+		case (int32)TextId::kReturnMenu:
 			return 0;
-		case TextId::kSaveSettings:
+		case (int32)TextId::kSaveSettings:
 			ConfMan.flushToDisk();
 			break;
 		case kQuitEngine:
 			return kQuitEngine;
-		case TextId::kMusicVolume:
-		case TextId::kSoundVolume:
-		case TextId::kCDVolume:
-		case TextId::kLineInVolume:
-		case TextId::kMasterVolume:
+		case (int32)TextId::kMusicVolume:
+		case (int32)TextId::kSoundVolume:
+		case (int32)TextId::kCDVolume:
+		case (int32)TextId::kLineInVolume:
+		case (int32)TextId::kMasterVolume:
 		default:
 			warning("Unknown menu button handled");
 			break;
@@ -676,17 +693,17 @@ int32 Menu::optionsMenu() {
 	ScopedCursor scoped(_engine);
 	for (;;) {
 		switch (processMenu(&optionsMenuState)) {
-		case TextId::kReturnGame:
-		case TextId::kReturnMenu: {
+		case (int32)TextId::kReturnGame:
+		case (int32)TextId::kReturnMenu: {
 			return 0;
 		}
-		case TextId::kVolumeSettings: {
+		case (int32)TextId::kVolumeSettings: {
 			checkMenuQuit(volumeMenu()) break;
 		}
-		case TextId::kSaveManage: {
+		case (int32)TextId::kSaveManage: {
 			checkMenuQuit(savemanageMenu()) break;
 		}
-		case TextId::kAdvanced: {
+		case (int32)TextId::kAdvanced: {
 			checkMenuQuit(advoptionsMenu()) break;
 		}
 		case kQuitEngine:
@@ -741,19 +758,19 @@ EngineState Menu::run() {
 
 	ScopedCursor scoped(_engine);
 	switch (processMenu(&mainMenuState)) {
-	case TextId::kNewGame: {
+	case (int32)TextId::kNewGame: {
 		if (_engine->_menuOptions->newGameMenu()) {
 			return EngineState::GameLoop;
 		}
 		break;
 	}
-	case TextId::kContinueGame: {
+	case (int32)TextId::kContinueGame: {
 		if (_engine->_menuOptions->continueGameMenu()) {
 			return EngineState::LoadedGame;
 		}
 		break;
 	}
-	case TextId::kOptions: {
+	case (int32)TextId::kOptions: {
 		optionsMenu();
 		break;
 	}
@@ -761,7 +778,7 @@ EngineState Menu::run() {
 		_engine->_screens->loadMenuImage();
 		break;
 	}
-	case TextId::kQuit:
+	case (int32)TextId::kQuit:
 	case kQuitEngine:
 		debug("quit the game");
 		return EngineState::QuitGame;
@@ -789,13 +806,13 @@ int32 Menu::giveupMenu() {
 		_engine->_text->initTextBank(TextBankId::Options_and_menus);
 		menuId = processMenu(localMenu);
 		switch (menuId) {
-		case TextId::kContinue:
+		case (int32)TextId::kContinue:
 			_engine->_sound->resumeSamples();
 			break;
-		case TextId::kGiveUp:
+		case (int32)TextId::kGiveUp:
 			_engine->_gameState->giveUp();
 			return 1;
-		case TextId::kCreateSaveGame:
+		case (int32)TextId::kCreateSaveGame:
 			_engine->_menuOptions->saveGameMenu();
 			break;
 		case kQuitEngine:
@@ -804,7 +821,7 @@ int32 Menu::giveupMenu() {
 			warning("Unknown menu button handled: %i", menuId);
 		}
 		_engine->_text->initSceneTextBank();
-	} while (menuId != TextId::kGiveUp && menuId != TextId::kContinue && menuId != TextId::kCreateSaveGame);
+	} while (menuId != (int32)TextId::kGiveUp && menuId != (int32)TextId::kContinue && menuId != (int32)TextId::kCreateSaveGame);
 
 	return 0;
 }
@@ -1022,7 +1039,7 @@ void Menu::processBehaviourMenu() {
 
 	_engine->_screens->copyScreen(_engine->frontVideoBuffer, _engine->workVideoBuffer);
 
-	int32 tmpTextBank = _engine->_scene->sceneTextBank;
+	TextBankId tmpTextBank = _engine->_scene->sceneTextBank;
 	_engine->_scene->sceneTextBank = TextBankId::None;
 
 	_engine->_text->initTextBank(TextBankId::Options_and_menus);
@@ -1228,9 +1245,9 @@ void Menu::processInventoryMenu() {
 		if (updateItemText) {
 			_engine->_text->initInventoryDialogueBox();
 			if (inventorySelectedItem < NUM_INVENTORY_ITEMS && _engine->_gameState->hasItem((InventoryItems)inventorySelectedItem) && !_engine->_gameState->inventoryDisabled()) {
-				_engine->_text->initInventoryText(inventorySelectedItem);
+				_engine->_text->initInventoryText((InventoryItems)inventorySelectedItem);
 			} else {
-				_engine->_text->initInventoryText(NUM_INVENTORY_ITEMS);
+				_engine->_text->initInventoryText(InventoryItems::MaxInventoryItems);
 			}
 			textState = ProgressiveTextState::ContinueRunning;
 			updateItemText = false;
diff --git a/engines/twine/menu/menu.h b/engines/twine/menu/menu.h
index b4315d76dc..81336f92d5 100644
--- a/engines/twine/menu/menu.h
+++ b/engines/twine/menu/menu.h
@@ -54,8 +54,8 @@ private:
 	int8 _activeButtonIdx = 0;
 
 public:
-	int16 getButtonTextId(int buttonIndex) const {
-		return _settings[MenuSettings_FirstButton + buttonIndex * 2];
+	TextId getButtonTextId(int buttonIndex) const {
+		return (TextId)_settings[MenuSettings_FirstButton + buttonIndex * 2];
 	}
 
 	void reset() {
@@ -77,16 +77,16 @@ public:
 		_settings[MenuSettings_CurrentLoadedButton] = buttonIdx;
 	}
 
-	void setActiveButtonTextId(int16 textIndex) {
+	void setActiveButtonTextId(TextId textIndex) {
 		setButtonTextId(getActiveButton(), textIndex);
 	}
 
-	void setButtonTextId(int16 buttonIdx, int16 textIndex) {
-		_settings[MenuSettings_FirstButton + buttonIdx * 2] = textIndex;
+	void setButtonTextId(int16 buttonIdx, TextId textIndex) {
+		_settings[MenuSettings_FirstButton + buttonIdx * 2] = (int16)textIndex;
 		_buttonTexts[buttonIdx].clear();
 	}
 
-	int16 getActiveButtonTextId() const {
+	TextId getActiveButtonTextId() const {
 		return getButtonTextId(getActiveButton());
 	}
 
@@ -112,14 +112,14 @@ public:
 		return _settings[MenuSettings_NumberOfButtons];
 	}
 
-	void setTextBankId(int16 textBankIndex) {
-		_settings[MenuSettings_HeaderEnd] = textBankIndex;
+	void setTextBankId(TextBankId textBankIndex) {
+		_settings[MenuSettings_HeaderEnd] = (int16)textBankIndex;
 	}
 
-	void addButton(int16 textId, int16 state = 0) {
+	void addButton(TextId textId, int16 state = 0) {
 		const int16 i = _settings[MenuSettings_NumberOfButtons];
 		_settings[i * 2 + MenuSettings_FirstButtonState] = state;
-		_settings[i * 2 + MenuSettings_FirstButton] = textId;
+		_settings[i * 2 + MenuSettings_FirstButton] = (int16)textId;
 		++_settings[MenuSettings_NumberOfButtons];
 	}
 
diff --git a/engines/twine/menu/menuoptions.cpp b/engines/twine/menu/menuoptions.cpp
index 396696bf56..f2746c7f52 100644
--- a/engines/twine/menu/menuoptions.cpp
+++ b/engines/twine/menu/menuoptions.cpp
@@ -249,7 +249,7 @@ public:
 	}
 };
 
-bool MenuOptions::enterText(int32 textIdx, char *textTargetBuf, size_t bufSize) {
+bool MenuOptions::enterText(TextId textIdx, char *textTargetBuf, size_t bufSize) {
 	textTargetBuf[0] = '\0';
 	_engine->_text->initTextBank(TextBankId::Options_and_menus);
 	char buffer[256];
@@ -364,7 +364,7 @@ bool MenuOptions::newGameMenu() {
 	return true;
 }
 
-int MenuOptions::chooseSave(int textIdx, bool showEmptySlots) {
+int MenuOptions::chooseSave(TextId textIdx, bool showEmptySlots) {
 	const SaveStateList &savegames = _engine->getSaveSlots();
 	if (savegames.empty() && !showEmptySlots) {
 		return -1;
@@ -394,7 +394,7 @@ int MenuOptions::chooseSave(int textIdx, bool showEmptySlots) {
 		const int32 id = _engine->_menu->processMenu(&saveFiles);
 		switch (id) {
 		case kQuitEngine:
-		case TextId::kReturnMenu:
+		case (int32)TextId::kReturnMenu:
 			return -1;
 		default:
 			const int16 slot = saveFiles.getButtonState(id);
diff --git a/engines/twine/menu/menuoptions.h b/engines/twine/menu/menuoptions.h
index 646320923a..f62c5b26ce 100644
--- a/engines/twine/menu/menuoptions.h
+++ b/engines/twine/menu/menuoptions.h
@@ -44,11 +44,11 @@ private:
 
 	void setOnScreenKeyboard(int x, int y);
 
-	bool enterText(int32 textIdx, char *textTargetBuf, size_t bufSize);
+	bool enterText(TextId textIdx, char *textTargetBuf, size_t bufSize);
 	void drawSelectableCharacters();
 	void drawInputText(int32 centerx, int32 top, int32 type, const char *text);
 	void drawSelectableCharacter(int32 x, int32 y, Common::Rect &dirtyRect);
-	int chooseSave(int textIdx, bool showEmptySlots = false);
+	int chooseSave(TextId textIdx, bool showEmptySlots = false);
 
 public:
 	MenuOptions(TwinEEngine *engine) : _engine(engine) {}
diff --git a/engines/twine/parser/text.cpp b/engines/twine/parser/text.cpp
index f4e360ea0d..955244f13f 100644
--- a/engines/twine/parser/text.cpp
+++ b/engines/twine/parser/text.cpp
@@ -23,12 +23,13 @@
 #include "twine/parser/text.h"
 #include "common/debug.h"
 #include "common/util.h"
+#include "common/translation.h"
 #include "twine/resources/hqr.h"
 
 namespace TwinE {
 
-bool TextData::loadFromHQR(const char *name, int textBankId, int language, int entryCount) {
-	const int langIdx = textBankId * 2 + (entryCount * language);
+bool TextData::loadFromHQR(const char *name, TextBankId textBankId, int language, int entryCount) {
+	const int langIdx = (int)textBankId * 2 + (entryCount * language);
 	Common::SeekableReadStream *indexStream = HQR::makeReadStream(name, langIdx + 0);
 	Common::SeekableReadStream *offsetStream = HQR::makeReadStream(name, langIdx + 1);
 	if (indexStream == nullptr || offsetStream == nullptr) {
@@ -38,13 +39,13 @@ bool TextData::loadFromHQR(const char *name, int textBankId, int language, int e
 		return false;
 	}
 
-	_texts[textBankId].clear();
+	_texts[(int)textBankId].clear();
 
 	const int numIdxEntries = indexStream->size() / 2;
-	_texts[textBankId].reserve(numIdxEntries);
+	_texts[(int)textBankId].reserve(numIdxEntries);
 
 	for (int entry = 0; entry < numIdxEntries; ++entry) {
-		const uint16 textIdx = indexStream->readUint16LE();
+		const TextId textIdx = (TextId)indexStream->readUint16LE();
 		const uint16 start = offsetStream->readUint16LE();
 		const int32 offsetPos = offsetStream->pos();
 		const uint16 end = offsetStream->readUint16LE();
@@ -54,8 +55,8 @@ bool TextData::loadFromHQR(const char *name, int textBankId, int language, int e
 			const char c = (char)offsetStream->readByte();
 			result += c;
 		}
-		_texts[textBankId].push_back(TextEntry{result, entry, textIdx});
-		debug(5, "index: %i (bank %i), text: %s", textIdx, textBankId, result.c_str());
+		_texts[(int)textBankId].push_back(TextEntry{result, entry, textIdx});
+		debug(5, "index: %i (bank %i), text: %s", (int)textIdx, (int)textBankId, result.c_str());
 		offsetStream->seek(offsetPos);
 		if (end >= offsetStream->size()) {
 			break;
@@ -63,18 +64,23 @@ bool TextData::loadFromHQR(const char *name, int textBankId, int language, int e
 	}
 	delete indexStream;
 	delete offsetStream;
+
+	// custom texts that are not included in the original game
+	_texts[(int)TextBankId::Options_and_menus].push_back(TextEntry{_sc("High resolution on", "Options menu"), -1, TextId::kCustomHighResOptionOn});
+	_texts[(int)TextBankId::Options_and_menus].push_back(TextEntry{_sc("High resolution off", "Options menu"), -1, TextId::kCustomHighResOptionOff});
+
 	return true;
 }
 
-const TextEntry *TextData::getText(int textBankId, int textIndex) const {
-	const Common::Array<TextEntry> &entries = _texts[textBankId];
+const TextEntry *TextData::getText(TextBankId textBankId, TextId textIndex) const {
+	const Common::Array<TextEntry> &entries = _texts[(int)textBankId];
 	const int32 size = entries.size();
 	for (int32 i = 0; i < size; ++i) {
 		if (entries[i].textIndex == textIndex) {
 			return &entries[i];
 		}
 	}
-	debug(1, "Failed to find text entry for bank id %i with text index %i", textBankId, textIndex);
+	debug(1, "Failed to find text entry for bank id %i with text index %i", (int)textBankId, (int)textIndex);
 	return nullptr;
 }
 
diff --git a/engines/twine/parser/text.h b/engines/twine/parser/text.h
index 53b680782f..cd60462c25 100644
--- a/engines/twine/parser/text.h
+++ b/engines/twine/parser/text.h
@@ -35,7 +35,7 @@ class TextEntry {
 public:
 	Common::String string;	/**< The real string behind the text id */
 	int index;				/**< The index in the text index hqr file. This is also the index in the corresponding vox hqr file */
-	int textIndex;			/**< The text identifier */
+	TextId textIndex;			/**< The text identifier */
 };
 
 class TextData {
@@ -43,9 +43,9 @@ private:
 	// 30 is the max for lba2, lba1 uses 28
 	Common::Array<TextEntry> _texts[30];
 public:
-	bool loadFromHQR(const char *name, int textBankId, int language, int entryCount);
+	bool loadFromHQR(const char *name, TextBankId textBankId, int language, int entryCount);
 
-	const TextEntry *getText(int textBankId, int textIndex) const;
+	const TextEntry *getText(TextBankId textBankId, TextId textIndex) const;
 };
 
 } // End of namespace TwinE
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index a210315b04..97498308ac 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -633,7 +633,7 @@ void Redraw::renderOverlays() {
 			}
 			case OverlayType::koText: {
 				char text[256];
-				_engine->_text->getMenuText(overlay->info0, text, sizeof(text));
+				_engine->_text->getMenuText((TextId)overlay->info0, text, sizeof(text));
 
 				const int32 textLength = _engine->_text->getTextSize(text);
 				const int32 textHeight = 48;
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index 6a05ac6b1c..d94895e892 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -206,14 +206,14 @@ void Resources::initResources() {
 
 	const int32 textEntryCount = _engine->isLBA1() ? 28 : 30;
 	for (int32 i = 0; i < textEntryCount / 2; ++i) {
-		if (!_textData.loadFromHQR(Resources::HQR_TEXT_FILE, i, _engine->cfgfile.LanguageId, textEntryCount)) {
+		if (!_textData.loadFromHQR(Resources::HQR_TEXT_FILE, (TextBankId)i, _engine->cfgfile.LanguageId, textEntryCount)) {
 			error("HQR ERROR: Parsing textbank %i failed", i);
 		}
 	}
 	debug("Loaded %i text banks", textEntryCount / 2);
 }
 
-const TextEntry *Resources::getText(int textBankId, int index) const {
+const TextEntry *Resources::getText(TextBankId textBankId, TextId index) const {
 	return _textData.getText(textBankId, index);
 }
 
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 188a87aa13..e47b5515f6 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -204,7 +204,7 @@ public:
 
 	const Trajectory *getTrajectory(int index) const;
 
-	const TextEntry *getText(int textBankId, int index) const;
+	const TextEntry *getText(TextBankId textBankId, TextId index) const;
 
 	// main palette
 	static constexpr const char *HQR_RESS_FILE = "ress.hqr";
diff --git a/engines/twine/scene/actor.cpp b/engines/twine/scene/actor.cpp
index f88256d747..65b6448890 100644
--- a/engines/twine/scene/actor.cpp
+++ b/engines/twine/scene/actor.cpp
@@ -140,12 +140,12 @@ void Actor::initSpriteActor(int32 actorIdx) {
 	}
 }
 
-int32 Actor::getTextIdForBehaviour() const {
+TextId Actor::getTextIdForBehaviour() const {
 	if (heroBehaviour == HeroBehaviourType::kAggressive && autoAggressive) {
 		return TextId::kBehaviourAggressiveAuto;
 	}
 	// the other values are matching the text ids
-	return (int32)heroBehaviour;
+	return (TextId)(int32)heroBehaviour;
 }
 
 int32 Actor::initBody(BodyType bodyIdx, int32 actorIdx, ActorBoundingBox &actorBoundingBox) {
diff --git a/engines/twine/scene/actor.h b/engines/twine/scene/actor.h
index 1fc5790e7a..448e6f441d 100644
--- a/engines/twine/scene/actor.h
+++ b/engines/twine/scene/actor.h
@@ -318,7 +318,7 @@ public:
 	/** Load hero 3D body and animations */
 	void loadHeroEntities();
 
-	int32 getTextIdForBehaviour() const;
+	TextId getTextIdForBehaviour() const;
 
 	/**
 	 * Set hero behaviour
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index cb7867f82d..15ea608f1f 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -53,7 +53,7 @@ GameState::GameState(TwinEEngine *engine) : _engine(engine) {
 	clearGameFlags();
 	Common::fill(&inventoryFlags[0], &inventoryFlags[NUM_INVENTORY_ITEMS], 0);
 	Common::fill(&holomapFlags[0], &holomapFlags[NUM_LOCATIONS], 0);
-	Common::fill(&gameChoices[0], &gameChoices[10], 0);
+	Common::fill(&gameChoices[0], &gameChoices[10], TextId::kNone);
 }
 
 void GameState::initEngineProjections() {
@@ -302,7 +302,7 @@ void GameState::setGameFlag(uint8 index, uint8 value) {
 	}
 }
 
-void GameState::processFoundItem(int32 item) {
+void GameState::processFoundItem(InventoryItems item) {
 	ScopedEngineFreeze freeze(_engine);
 	_engine->_grid->centerOnActor(_engine->_scene->sceneHero);
 
@@ -355,7 +355,7 @@ void GameState::processFoundItem(int32 item) {
 
 	ProgressiveTextState textState = ProgressiveTextState::ContinueRunning;
 
-	_engine->_text->initVoxToPlayTextId(item);
+	_engine->_text->initVoxToPlayTextId((TextId)item);
 
 	const int32 bodyAnimIdx = _engine->_animations->getBodyAnimIndex(AnimationTypes::kFoundItem);
 	const AnimData &currentAnimData = _engine->_resources->animData[bodyAnimIdx];
@@ -446,11 +446,11 @@ void GameState::processFoundItem(int32 item) {
 	_engine->_scene->sceneHero->animTimerData = tmpAnimTimer;
 }
 
-void GameState::processGameChoices(int32 choiceIdx) {
+void GameState::processGameChoices(TextId choiceIdx) {
 	_engine->_screens->copyScreen(_engine->frontVideoBuffer, _engine->workVideoBuffer);
 
 	_gameChoicesSettings.reset();
-	_gameChoicesSettings.setTextBankId(_engine->_scene->sceneTextBank + TextBankId::Citadel_Island);
+	_gameChoicesSettings.setTextBankId((TextBankId)((int)_engine->_scene->sceneTextBank + (int)TextBankId::Citadel_Island));
 
 	// filled via script
 	for (int32 i = 0; i < numChoices; i++) {
diff --git a/engines/twine/scene/gamestate.h b/engines/twine/scene/gamestate.h
index 831edf869b..80bd0e4acc 100644
--- a/engines/twine/scene/gamestate.h
+++ b/engines/twine/scene/gamestate.h
@@ -32,38 +32,6 @@
 
 namespace TwinE {
 
-enum InventoryItems {
-	kiHolomap = 0,
-	kiMagicBall = 1,
-	kiUseSabre = 2,
-	kiGawleysHorn = 3,
-	kiTunic = 4,
-	kiBookOfBu = 5,
-	kSendellsMedallion = 6,
-	kFlaskOfClearWater = 7,
-	kRedCard = 8,
-	kBlueCard = 9,
-	kIDCard = 10,
-	kMrMiesPass = 11,
-	kiProtoPack = 12,
-	kSnowboard = 13,
-	kiPinguin = 14,
-	kGasItem = 15,
-	kPirateFlag = 16,
-	kMagicFlute = 17,
-	kSpaceGuitar = 18,
-	kHairDryer = 19,
-	kAncesteralKey = 20,
-	kBottleOfSyrup = 21,
-	kEmptyBottle = 22,
-	kFerryTicket = 23,
-	kKeypad = 24,
-	kCoffeeCan = 25,
-	kiBonusList = 26,
-	kiCloverLeaf = 27,
-	MaxInventoryItems = 28
-};
-
 /** Magicball strength*/
 enum MagicballStrengthType {
 	kNoBallStrength = 2,
@@ -213,9 +181,9 @@ public:
 
 	char sceneName[30] {};
 
-	int32 gameChoices[10];  // inGameMenuData
+	TextId gameChoices[10];  // inGameMenuData
 	int32 numChoices = 0;   // numOfOptionsInChoice
-	int32 choiceAnswer = 0; // inGameMenuAnswer
+	TextId choiceAnswer = TextId::kNone; // inGameMenuAnswer
 
 	/** Initialize all engine variables */
 	void initEngineVars();
@@ -223,13 +191,13 @@ public:
 	/** Initialize engine 3D projections */
 	void initEngineProjections();
 
-	void processFoundItem(int32 item);
+	void processFoundItem(InventoryItems item);
 
 	void giveUp();
 	bool loadGame(Common::SeekableReadStream *file);
 	bool saveGame(Common::WriteStream *file);
 
-	void processGameChoices(int32 choiceIdx);
+	void processGameChoices(TextId choiceIdx);
 
 	void processGameoverAnimation();
 };
diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index 30191d6586..d9970c8dfc 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -149,7 +149,7 @@ void Scene::setBonusParameterFlags(ActorStruct *act, uint16 bonusFlags) {
 
 bool Scene::loadSceneLBA2() {
 	Common::MemoryReadStream stream(currentScene, _currentSceneSize);
-	sceneTextBank = stream.readByte();
+	sceneTextBank = (TextBankId)stream.readByte();
 	_currentGameOverScene = stream.readByte();
 	stream.skip(4);
 
@@ -281,7 +281,7 @@ bool Scene::loadSceneLBA1() {
 	Common::MemoryReadStream stream(currentScene, _currentSceneSize);
 
 	// load scene ambience properties
-	sceneTextBank = stream.readByte();
+	sceneTextBank = (TextBankId)stream.readByte();
 	_currentGameOverScene = stream.readByte();
 	stream.skip(4);
 
diff --git a/engines/twine/scene/scene.h b/engines/twine/scene/scene.h
index c7db090a92..75cf4b0891 100644
--- a/engines/twine/scene/scene.h
+++ b/engines/twine/scene/scene.h
@@ -26,7 +26,7 @@
 #include "common/scummsys.h"
 #include "common/util.h"
 #include "twine/scene/actor.h"
-#include "twine/text.h"
+#include "twine/shared.h"
 
 namespace TwinE {
 
@@ -75,7 +75,7 @@ struct ZoneStruct {
 
 		/** show a text (e.g. when reading a sign) */
 		struct {
-			int32 textIdx;   /*!< text index in the current active text bank */
+			TextId textIdx;   /*!< text index in the current active text bank */
 			int32 textColor; /*!< text color (see @c ActorStruct::talkColor) */
 		} DisplayText;
 		struct {
@@ -178,7 +178,7 @@ public:
 
 	int32 holomapTrajectory = -1;
 
-	int32 sceneTextBank = TextBankId::None;
+	TextBankId sceneTextBank = TextBankId::None;
 	int32 alphaLight = ANGLE_0;
 	int32 betaLight = ANGLE_0;
 
diff --git a/engines/twine/script/script_life_v1.cpp b/engines/twine/script/script_life_v1.cpp
index 55783f5015..c6bdf2ae5f 100644
--- a/engines/twine/script/script_life_v1.cpp
+++ b/engines/twine/script/script_life_v1.cpp
@@ -41,6 +41,7 @@
 #include "twine/renderer/screens.h"
 #include "twine/resources/resources.h"
 #include "twine/scene/scene.h"
+#include "twine/shared.h"
 #include "twine/text.h"
 #include "twine/twine.h"
 
@@ -347,7 +348,7 @@ static int32 processLifeConditions(TwinEEngine *engine, LifeScriptContext &ctx)
 	}
 	case kcCHOICE:
 		conditionValueSize = 2;
-		engine->_scene->currentScriptValue = engine->_gameState->choiceAnswer;
+		engine->_scene->currentScriptValue = (int16)engine->_gameState->choiceAnswer;
 		break;
 	case kcFUEL:
 		engine->_scene->currentScriptValue = engine->_gameState->inventoryNumGas;
@@ -646,7 +647,7 @@ static int32 lSET_TRACK_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x19
  */
 static int32 lMESSAGE(TwinEEngine *engine, LifeScriptContext &ctx) {
-	const int32 textIdx = ctx.stream.readSint16LE();
+	const TextId textIdx = (TextId)ctx.stream.readSint16LE();
 
 	engine->freezeTime();
 	if (engine->_text->showDialogueBubble) {
@@ -902,7 +903,7 @@ static int32 lRESTORE_L_TRACK(TwinEEngine *engine, LifeScriptContext &ctx) {
  */
 static int32 lMESSAGE_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
 	const int32 otherActorIdx = ctx.stream.readByte();
-	const int32 textIdx = ctx.stream.readSint16LE();
+	const TextId textIdx = (TextId)ctx.stream.readSint16LE();
 
 	engine->freezeTime();
 	if (engine->_text->showDialogueBubble) {
@@ -931,7 +932,7 @@ static int32 lINC_CHAPTER(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x2E
  */
 static int32 lFOUND_OBJECT(TwinEEngine *engine, LifeScriptContext &ctx) {
-	const int32 item = ctx.stream.readByte();
+	const InventoryItems item = (InventoryItems)ctx.stream.readByte();
 
 	engine->_gameState->processFoundItem(item);
 	engine->_redraw->redrawEngineActions(true);
@@ -1249,7 +1250,7 @@ static int32 lSET_USED_INVENTORY(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x44
  */
 static int32 lADD_CHOICE(TwinEEngine *engine, LifeScriptContext &ctx) {
-	int32 choiceIdx = ctx.stream.readSint16LE();
+	TextId choiceIdx = (TextId)ctx.stream.readSint16LE();
 	engine->_gameState->gameChoices[engine->_gameState->numChoices++] = choiceIdx;
 	return 0;
 }
@@ -1259,7 +1260,7 @@ static int32 lADD_CHOICE(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x45
  */
 static int32 lASK_CHOICE(TwinEEngine *engine, LifeScriptContext &ctx) {
-	int32 choiceIdx = ctx.stream.readSint16LE();
+	TextId choiceIdx = (TextId)ctx.stream.readSint16LE();
 
 	engine->freezeTime();
 	if (engine->_text->showDialogueBubble) {
@@ -1279,7 +1280,7 @@ static int32 lASK_CHOICE(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x46
  */
 static int32 lBIG_MESSAGE(TwinEEngine *engine, LifeScriptContext &ctx) {
-	int32 textIdx = ctx.stream.readSint16LE();
+	TextId textIdx = (TextId)ctx.stream.readSint16LE();
 
 	engine->freezeTime();
 	engine->_text->textClipFull();
@@ -1363,9 +1364,9 @@ static int32 lSET_GRM(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x4D
  */
 static int32 lSAY_MESSAGE(TwinEEngine *engine, LifeScriptContext &ctx) {
-	int16 textEntry = ctx.stream.readSint16LE();
+	TextId textEntry = (TextId)ctx.stream.readSint16LE();
 
-	engine->_redraw->addOverlay(OverlayType::koText, textEntry, 0, 0, ctx.actorIdx, OverlayPosType::koFollowActor, 2);
+	engine->_redraw->addOverlay(OverlayType::koText, (int16)textEntry, 0, 0, ctx.actorIdx, OverlayPosType::koFollowActor, 2);
 
 	ScopedEngineFreeze scoped(engine);
 	engine->_text->initVoxToPlayTextId(textEntry);
@@ -1379,9 +1380,9 @@ static int32 lSAY_MESSAGE(TwinEEngine *engine, LifeScriptContext &ctx) {
  */
 static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
 	int32 otherActorIdx = ctx.stream.readByte();
-	int16 textEntry = ctx.stream.readSint16LE();
+	TextId textEntry = (TextId)ctx.stream.readSint16LE();
 
-	engine->_redraw->addOverlay(OverlayType::koText, textEntry, 0, 0, otherActorIdx, OverlayPosType::koFollowActor, 2);
+	engine->_redraw->addOverlay(OverlayType::koText, (int16)textEntry, 0, 0, otherActorIdx, OverlayPosType::koFollowActor, 2);
 
 	ScopedEngineFreeze scoped(engine);
 	engine->_text->initVoxToPlayTextId(textEntry);
@@ -1536,7 +1537,7 @@ static int32 lBUBBLE_OFF(TwinEEngine *engine, LifeScriptContext &ctx) {
  */
 static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
 	const int32 otherActorIdx = ctx.stream.readByte();
-	const int32 choiceIdx = ctx.stream.readSint16LE();
+	const TextId choiceIdx = (TextId)ctx.stream.readSint16LE();
 
 	engine->freezeTime();
 	if (engine->_text->showDialogueBubble) {
@@ -1708,12 +1709,12 @@ static int32 lPROJ_3D(TwinEEngine *engine, LifeScriptContext &ctx) {
  * @note Opcode @c 0x67
  */
 static int32 lTEXT(TwinEEngine *engine, LifeScriptContext &ctx) {
-	int32 textIdx = ctx.stream.readSint16LE();
+	TextId textIdx = (TextId)ctx.stream.readSint16LE();
 
 	const int32 textHeight = 40;
 	if (lTextYPos < engine->height() - textHeight) {
 		if (engine->cfgfile.Version == USA_VERSION) {
-			if (!textIdx) {
+			if (textIdx == TextId::kBehaviourNormal) {
 				textIdx = TextId::kSaveSettings;
 			}
 		}
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index c97fbb6459..d9f0614ab1 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -405,6 +405,115 @@ enum LBA1SceneId {
 	SceneIdMax = 120
 };
 
+// lba
+enum class TextBankId : int16 {
+	None = -1,
+	Options_and_menus = 0,
+	Credits = 1,
+	Inventory_Intro_and_Holomap = 2,
+	Citadel_Island = 3,
+	Principal_Island = 4,
+	White_Leaf_Desert = 5,
+	Proxima_Island = 6,
+	Rebellion_Island = 7,
+	Hamalayi_mountains_southern_range = 8,
+	Hamalayi_mountains_northern_range = 9,
+	Tippet_Island = 10,
+	Brundle_Island = 11,
+	Fortress_Island = 12,
+	Polar_Island = 13
+};
+
+/** menu text ids */
+enum class TextId : int16 {
+	kNone = -1,
+	kBehaviourNormal = 0,
+	kBehaviourSporty = 1,
+	kBehaviourAggressiveManual = 2,
+	kBehaviourHiding = 3,
+	kBehaviourAggressiveAuto = 4,
+	kUseProtopack = 5,
+	kSendell = 6,
+	kMusicVolume = 10,
+	kSoundVolume = 11,
+	kCDVolume = 12,
+	kLineInVolume = 13,
+	kMasterVolume = 14,
+	kReturnGame = 15,
+	kSaveSettings = 16,
+	kNewGame = 20,
+	kContinueGame = 21,
+	kQuit = 22,
+	kOptions = 23,
+	kDelete = 24,
+	kReturnMenu = 26,
+	kGiveUp = 27,
+	kContinue = 28,
+	kVolumeSettings = 30,
+	kDetailsPolygonsHigh = 31,
+	kDetailsShadowHigh = 32,
+	//kSceneryZoomOn = 33, // duplicate with 133 - TODO check if this is the same in all languages
+	kCreateNewPlayer = 40,
+	kCreateSaveGame = 41,
+	kEnterYourName = 42,
+	kPlayerAlreadyExists = 43,
+	kEnterYourNewName = 44,
+	kDeleteSaveGame = 45,
+	kSaveManage = 46,
+	kAdvanced = 47,
+	kDelete2 = 48, // difference between 24 and 48?
+	kTransferVoices = 49,
+	kPleaseWaitWhileVoicesAreSaved = 50,
+	kRemoveProtoPack = 105,
+	kDetailsPolygonsMiddle = 131,
+	kShadowsFigures = 132,
+	kSceneryZoomOn = 133,
+	kIntroText1 = 150,
+	kIntroText2 = 151,
+	kIntroText3 = 152,
+	kBookOfBu = 161,
+	kBonusList = 162,
+	kDetailsPolygonsLow = 231,
+	kShadowsDisabled = 232,
+	kNoSceneryZoom = 233,
+
+	// custom strings (not originally included in the game)
+	kCustomHighResOptionOn = -2,
+	kCustomHighResOptionOff = -3
+};
+
+enum InventoryItems {
+	kiHolomap = 0,
+	kiMagicBall = 1,
+	kiUseSabre = 2,
+	kiGawleysHorn = 3,
+	kiTunic = 4,
+	kiBookOfBu = 5,
+	kSendellsMedallion = 6,
+	kFlaskOfClearWater = 7,
+	kRedCard = 8,
+	kBlueCard = 9,
+	kIDCard = 10,
+	kMrMiesPass = 11,
+	kiProtoPack = 12,
+	kSnowboard = 13,
+	kiPinguin = 14,
+	kGasItem = 15,
+	kPirateFlag = 16,
+	kMagicFlute = 17,
+	kSpaceGuitar = 18,
+	kHairDryer = 19,
+	kAncesteralKey = 20,
+	kBottleOfSyrup = 21,
+	kEmptyBottle = 22,
+	kFerryTicket = 23,
+	kKeypad = 24,
+	kCoffeeCan = 25,
+	kiBonusList = 26,
+	kiCloverLeaf = 27,
+	MaxInventoryItems = 28
+};
+
 // lba2 does from 0 to 0x1000
 // lba1 angles
 // TODO: wrap in a class to be able to handle lba1 and lba2
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index 6bfd181b60..1fe4fbf2bd 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -38,6 +38,7 @@
 #include "twine/renderer/screens.h"
 #include "twine/resources/hqr.h"
 #include "twine/resources/resources.h"
+#include "twine/scene/gamestate.h"
 #include "twine/scene/scene.h"
 #include "twine/twine.h"
 
@@ -55,7 +56,7 @@ Text::Text(TwinEEngine *engine) : _engine(engine) {
 Text::~Text() {
 }
 
-void Text::initVoxBank(int32 bankIdx) {
+void Text::initVoxBank(TextBankId bankIdx) {
 	static const char *LanguageSuffixTypes[] = {
 	    "sys",
 	    "cre",
@@ -73,17 +74,17 @@ void Text::initVoxBank(int32 bankIdx) {
 	    "010", // Polar Island voices
 	    "011"  //
 	};
-	if (bankIdx < 0 || bankIdx >= ARRAYSIZE(LanguageSuffixTypes)) {
-		error("bankIdx is out of bounds: %i", bankIdx);
+	if ((int)bankIdx < 0 || (int)bankIdx >= ARRAYSIZE(LanguageSuffixTypes)) {
+		error("bankIdx is out of bounds: %i", (int)bankIdx);
 	}
 	// get the correct vox hqr file
-	currentVoxBankFile = Common::String::format("%s%s" VOX_EXT, LanguageTypes[_engine->cfgfile.LanguageId].id, LanguageSuffixTypes[bankIdx]);
+	currentVoxBankFile = Common::String::format("%s%s" VOX_EXT, LanguageTypes[_engine->cfgfile.LanguageId].id, LanguageSuffixTypes[(int)bankIdx]);
 	// TODO: loop through other languages and take the scummvm settings regarding voices into account...
 
 	// TODO check the rest to reverse
 }
 
-bool Text::initVoxToPlayTextId(int textId) {
+bool Text::initVoxToPlayTextId(TextId textId) {
 	const TextEntry *text = _engine->_resources->getText(_currentBankIdx, textId);
 	return initVoxToPlay(text);
 }
@@ -148,7 +149,7 @@ bool Text::stopVox(const TextEntry *text) {
 	return true;
 }
 
-void Text::initTextBank(int32 bankIdx) {
+void Text::initTextBank(TextBankId bankIdx) {
 	// don't load if we already have the dialogue text bank loaded
 	if (bankIdx == _currentBankIdx) {
 		return;
@@ -159,7 +160,7 @@ void Text::initTextBank(int32 bankIdx) {
 }
 
 void Text::initSceneTextBank() {
-	initTextBank(_engine->_scene->sceneTextBank + TextBankId::Citadel_Island);
+	initTextBank((TextBankId)((int)_engine->_scene->sceneTextBank + (int)TextBankId::Citadel_Island));
 }
 
 void Text::drawCharacter(int32 x, int32 y, uint8 character) {
@@ -293,16 +294,16 @@ void Text::initInventoryDialogueBox() {
 	_fadeInCharactersPos = 0;
 }
 
-void Text::initInventoryText(int index) {
+void Text::initInventoryText(InventoryItems index) {
 	// 100 if the offset for the inventory item descriptions
-	initText(100 + index);
+	initText((TextId)(100 + (int)index));
 }
 
-void Text::initItemFoundText(int index) {
-	initText(100 + index);
+void Text::initItemFoundText(InventoryItems index) {
+	initText((TextId)(100 + (int)index));
 }
 
-void Text::initText(int32 index) {
+void Text::initText(TextId index) {
 	if (!getText(index)) {
 		_hasValidTextHandle = false;
 		return;
@@ -579,9 +580,9 @@ ProgressiveTextState Text::updateProgressiveText() {
 	return ProgressiveTextState::ContinueRunning;
 }
 
-bool Text::displayText(int32 index, bool showText, bool playVox, bool loop) {
+bool Text::displayText(TextId index, bool showText, bool playVox, bool loop) {
 	debug(3, "displayText(index = %i, showText = %s, playVox = %s)",
-		index, showText ? "true" : "false", playVox ? "true" : "false");
+		(int)index, showText ? "true" : "false", playVox ? "true" : "false");
 	if (playVox) {
 		const TextEntry *textEntry = _engine->_resources->getText(_currentBankIdx, index);
 		// get right VOX entry index
@@ -655,7 +656,7 @@ bool Text::displayText(int32 index, bool showText, bool playVox, bool loop) {
 	return aborted;
 }
 
-bool Text::drawTextProgressive(int32 index, bool playVox, bool loop) {
+bool Text::drawTextProgressive(TextId index, bool playVox, bool loop) {
 	_engine->exitSceneryView();
 	_engine->_interface->saveClip();
 	_engine->_interface->resetClip();
@@ -688,7 +689,7 @@ void Text::setTextCrossColor(int32 stopColor, int32 startColor, int32 stepSize)
 	_dialTextBufferSize = ((startColor - stopColor) + 1) / stepSize;
 }
 
-bool Text::getText(int32 index) {
+bool Text::getText(TextId index) {
 	const TextEntry *textEntry = _engine->_resources->getText(_currentBankIdx, index);
 	if (textEntry == nullptr) {
 		return false;
@@ -699,11 +700,11 @@ bool Text::getText(int32 index) {
 	// RECHECK: this was added for vox playback
 	currDialTextEntry = textEntry;
 
-	debug(3, "text for bank %i with index %i (currIndex: %i): %s", _currentBankIdx, textEntry->index, textEntry->textIndex, _currDialTextPtr);
+	debug(3, "text for bank %i with index %i (currIndex: %i): %s", (int)_currentBankIdx, textEntry->index, (int)textEntry->textIndex, _currDialTextPtr);
 	return true;
 }
 
-bool Text::getMenuText(int32 index, char *text, uint32 textSize) {
+bool Text::getMenuText(TextId index, char *text, uint32 textSize) {
 	if (index == _currMenuTextIndex) {
 		if (_currMenuTextBank == _engine->_scene->sceneTextBank) {
 			Common::strlcpy(text, _currMenuTextBuffer, textSize);
@@ -753,11 +754,11 @@ void Text::textClipSmall() {
 	_dialTextBoxMaxX = _engine->width() - 2 * margin - 2 * PADDING;
 }
 
-void Text::drawAskQuestion(int32 index) {
+void Text::drawAskQuestion(TextId index) {
 	displayText(index, true, true, true);
 }
 
-void Text::drawHolomapLocation(int32 index) {
+void Text::drawHolomapLocation(TextId index) {
 	textClipSmall();
 	setFontCrossColor(COLOR_WHITE);
 	_engine->_interface->drawFilledRect(_dialTextBox, COLOR_BLACK);
diff --git a/engines/twine/text.h b/engines/twine/text.h
index 8500d5f00f..9f76df7809 100644
--- a/engines/twine/text.h
+++ b/engines/twine/text.h
@@ -26,87 +26,12 @@
 #include "common/scummsys.h"
 #include "common/str.h"
 #include "common/rect.h"
+#include "twine/shared.h"
 
 namespace TwinE {
 
 class TextEntry;
 
-// lba
-namespace TextBankId {
-enum _TextBankId {
-	None = -1,
-	Options_and_menus = 0,
-	Credits = 1,
-	Inventory_Intro_and_Holomap = 2,
-	Citadel_Island = 3,
-	Principal_Island = 4,
-	White_Leaf_Desert = 5,
-	Proxima_Island = 6,
-	Rebellion_Island = 7,
-	Hamalayi_mountains_southern_range = 8,
-	Hamalayi_mountains_northern_range = 9,
-	Tippet_Island = 10,
-	Brundle_Island = 11,
-	Fortress_Island = 12,
-	Polar_Island = 13
-};
-}
-
-/** menu text ids */
-namespace TextId {
-enum _TextId {
-	kBehaviourNormal = 0,
-	kBehaviourSporty = 1,
-	kBehaviourAggressiveManual = 2,
-	kBehaviourHiding = 3,
-	kBehaviourAggressiveAuto = 4,
-	kUseProtopack = 5,
-	kSendell = 6,
-	kMusicVolume = 10,
-	kSoundVolume = 11,
-	kCDVolume = 12,
-	kLineInVolume = 13,
-	kMasterVolume = 14,
-	kReturnGame = 15,
-	kSaveSettings = 16,
-	kNewGame = 20,
-	kContinueGame = 21,
-	kQuit = 22,
-	kOptions = 23,
-	kDelete = 24,
-	kReturnMenu = 26,
-	kGiveUp = 27,
-	kContinue = 28,
-	kVolumeSettings = 30,
-	kDetailsPolygonsHigh = 31,
-	kDetailsShadowHigh = 32,
-	//kSceneryZoomOn = 33, // duplicate with 133 - TODO check if this is the same in all languages
-	kCreateNewPlayer = 40,
-	kCreateSaveGame = 41,
-	kEnterYourName = 42,
-	kPlayerAlreadyExists = 43,
-	kEnterYourNewName = 44,
-	kDeleteSaveGame = 45,
-	kSaveManage = 46,
-	kAdvanced = 47,
-	kDelete2 = 48, // difference between 24 and 48?
-	kTransferVoices = 49,
-	kPleaseWaitWhileVoicesAreSaved = 50,
-	kRemoveProtoPack = 105,
-	kDetailsPolygonsMiddle = 131,
-	kShadowsFigures = 132,
-	kSceneryZoomOn = 133,
-	kIntroText1 = 150,
-	kIntroText2 = 151,
-	kIntroText3 = 152,
-	kBookOfBu = 161,
-	kBonusList = 162,
-	kDetailsPolygonsLow = 231,
-	kShadowsDisabled = 232,
-	kNoSceneryZoom = 233
-};
-}
-
 #define TEXT_MAX_FADE_IN_CHR 32
 
 #define COLOR_BLACK 0
@@ -134,7 +59,7 @@ class TwinEEngine;
 class Text {
 private:
 	TwinEEngine *_engine;
-	void initVoxBank(int32 bankIdx);
+	void initVoxBank(TextBankId bankIdx);
 	/**
 	 * Draw a certain character in the screen
 	 * @param x X coordinate in screen
@@ -171,10 +96,8 @@ private:
 	 */
 	void fadeInCharacters(int32 counter, int32 fontColor);
 
-	// RECHECK THIS LATER
-	int32 _currentBankIdx = TextBankId::None; // textVar1
+	TextBankId _currentBankIdx = TextBankId::None;
 
-	// TODO: refactor all this variables and related functions
 	char _progressiveTextBuffer[256] {'\0'};
 	const char *_currentTextPosition = nullptr;
 
@@ -199,8 +122,8 @@ private:
 	int32 _currDialTextSize = 0;
 
 	char _currMenuTextBuffer[256];
-	int32 _currMenuTextBank = TextBankId::None;
-	int32 _currMenuTextIndex = -1;
+	TextBankId _currMenuTextBank = TextBankId::None;
+	TextId _currMenuTextIndex = TextId::kNone;
 
 	/** Pixel size between dialogue text */
 	int32 _dialSpaceBetween = 0;
@@ -227,7 +150,7 @@ private:
 	int32 _dialTextBoxLines = 0; // dialogueBoxParam1
 	int32 _dialTextBoxMaxX = 0; // dialogueBoxParam2
 
-	bool displayText(int32 index, bool showText, bool playVox, bool loop);
+	bool displayText(TextId index, bool showText, bool playVox, bool loop);
 public:
 	Text(TwinEEngine *engine);
 	~Text();
@@ -252,9 +175,9 @@ public:
 	 * Initialize dialogue
 	 * @param bankIdx Text bank index
 	 */
-	void initTextBank(int32 bankIdx);
+	void initTextBank(TextBankId bankIdx);
 	void initSceneTextBank();
-	inline int textBank() const {
+	inline TextBankId textBank() const {
 		return _currentBankIdx;
 	}
 
@@ -266,7 +189,7 @@ public:
 	 */
 	void drawText(int32 x, int32 y, const char *dialogue);
 
-	bool drawTextProgressive(int32 index, bool playVox = true, bool loop = true);
+	bool drawTextProgressive(TextId index, bool playVox = true, bool loop = true);
 
 	/**
 	 * Gets dialogue text width size
@@ -279,9 +202,9 @@ public:
 	void initDialogueBox();
 	void initInventoryDialogueBox();
 
-	void initText(int32 index);
-	void initInventoryText(int index);
-	void initItemFoundText(int index);
+	void initText(TextId index);
+	void initInventoryText(InventoryItems index);
+	void initItemFoundText(InventoryItems index);
 	void fadeInRemainingChars();
 	ProgressiveTextState updateProgressiveText();
 
@@ -317,7 +240,7 @@ public:
 	 * @sa initTextBank()
 	 * @param index dialogue index
 	 */
-	bool getText(int32 index);
+	bool getText(TextId index);
 
 	/**
 	 * Gets menu dialogue text
@@ -325,19 +248,19 @@ public:
 	 * @param text dialogue text buffer to display
 	 * @param textSize The size of the text buffer
 	 */
-	bool getMenuText(int32 index, char *text, uint32 textSize);
+	bool getMenuText(TextId index, char *text, uint32 textSize);
 
 	void textClipFull();
 	void textClipSmall();
 
-	void drawAskQuestion(int32 index);
-	void drawHolomapLocation(int32 index);
+	void drawAskQuestion(TextId index);
+	void drawHolomapLocation(TextId index);
 
 	bool playVox(const TextEntry *text);
 	bool playVoxSimple(const TextEntry *text);
 	bool stopVox(const TextEntry *text);
 	bool initVoxToPlay(const TextEntry *text);
-	bool initVoxToPlayTextId(int textId);
+	bool initVoxToPlayTextId(TextId index);
 };
 
 } // namespace TwinE
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index c21a2d62b2..03d2812b36 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -225,15 +225,15 @@ Common::Error TwinEEngine::run() {
 	debug("The original Little Big Adventure game is:");
 	debug("(c) 1994 by Adeline Software International, All Rights Reserved.");
 
+	ConfMan.registerDefault("usehighres", false);
+
 	syncSoundSettings();
 	int32 w = ORIGINAL_WIDTH;
 	int32 h = ORIGINAL_HEIGHT;
-	if (ConfMan.hasKey("usehighres")) {
-		const bool highRes = ConfMan.getBool("usehighres");
-		if (highRes) {
-			w = 1024;
-			h = 768;
-		}
+	const bool highRes = ConfMan.getBool("usehighres");
+	if (highRes) {
+		w = 1024;
+		h = 768;
 	}
 
 	initGraphics(w, h);


Commit: b8ac7f46b74fafe035875b20528136ad0cb96b60
    https://github.com/scummvm/scummvm/commit/b8ac7f46b74fafe035875b20528136ad0cb96b60
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T10:50:05+02:00

Commit Message:
TWINE: added wall collision option to adv menu

Changed paths:
    engines/twine/menu/menu.cpp
    engines/twine/parser/text.cpp
    engines/twine/shared.h
    engines/twine/twine.cpp


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 3ef39f068a..514c2a27ff 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -66,7 +66,8 @@ enum _MenuButtonTypes {
 	kPolygonDetails = 7,
 	kShadowSettings = 8,
 	kSceneryZoom = 9,
-	kHighResolution = 10
+	kHighResolution = 10,
+	kWallCollision = 11
 };
 }
 
@@ -122,6 +123,7 @@ static MenuSettings createAdvancedOptionsMenu() {
 	settings.addButton(TextId::kDetailsShadowHigh, MenuButtonTypes::kShadowSettings);
 	settings.addButton(TextId::kSceneryZoomOn, MenuButtonTypes::kSceneryZoom);
 	settings.addButton(TextId::kCustomHighResOptionOn, MenuButtonTypes::kHighResolution);
+	settings.addButton(TextId::kCustomWallCollisionOff, MenuButtonTypes::kWallCollision);
 	return settings;
 }
 
@@ -362,14 +364,21 @@ int16 Menu::drawButtons(MenuSettings *menuSettings, bool hover) {
 				}
 				break;
 			case MenuButtonTypes::kHighResolution: {
-				const bool highRes = ConfMan.getBool("usehighres");
-				if (highRes) {
+				if (ConfMan.getBool("usehighres")) {
 					menuSettings->setButtonTextId(i, TextId::kCustomHighResOptionOn);
 				} else {
 					menuSettings->setButtonTextId(i, TextId::kCustomHighResOptionOff);
 				}
 				break;
 			}
+			case MenuButtonTypes::kWallCollision: {
+				if (ConfMan.getBool("wallcollision")) {
+					menuSettings->setButtonTextId(i, TextId::kCustomWallCollisionOn);
+				} else {
+					menuSettings->setButtonTextId(i, TextId::kCustomWallCollisionOff);
+				}
+				break;
+			}
 			default:
 				break;
 			}
@@ -484,6 +493,12 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 					ConfMan.setBool("usehighres", !highRes);
 				}
 				break;
+			case MenuButtonTypes::kWallCollision:
+				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+					const bool highRes = ConfMan.getBool("wallcollision");
+					ConfMan.setBool("wallcollision", !highRes);
+				}
+				break;
 			default:
 				break;
 			}
diff --git a/engines/twine/parser/text.cpp b/engines/twine/parser/text.cpp
index 955244f13f..d55a9cd065 100644
--- a/engines/twine/parser/text.cpp
+++ b/engines/twine/parser/text.cpp
@@ -68,6 +68,8 @@ bool TextData::loadFromHQR(const char *name, TextBankId textBankId, int language
 	// custom texts that are not included in the original game
 	_texts[(int)TextBankId::Options_and_menus].push_back(TextEntry{_sc("High resolution on", "Options menu"), -1, TextId::kCustomHighResOptionOn});
 	_texts[(int)TextBankId::Options_and_menus].push_back(TextEntry{_sc("High resolution off", "Options menu"), -1, TextId::kCustomHighResOptionOff});
+	_texts[(int)TextBankId::Options_and_menus].push_back(TextEntry{_sc("Wall collision on", "Options menu"), -1, TextId::kCustomWallCollisionOn});
+	_texts[(int)TextBankId::Options_and_menus].push_back(TextEntry{_sc("Wall collision off", "Options menu"), -1, TextId::kCustomWallCollisionOff});
 
 	return true;
 }
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index d9f0614ab1..6f3e2600db 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -479,7 +479,9 @@ enum class TextId : int16 {
 
 	// custom strings (not originally included in the game)
 	kCustomHighResOptionOn = -2,
-	kCustomHighResOptionOff = -3
+	kCustomHighResOptionOff = -3,
+	kCustomWallCollisionOn = -4,
+	kCustomWallCollisionOff = -5
 };
 
 enum InventoryItems {
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 03d2812b36..6f1b6be80b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -226,6 +226,7 @@ Common::Error TwinEEngine::run() {
 	debug("(c) 1994 by Adeline Software International, All Rights Reserved.");
 
 	ConfMan.registerDefault("usehighres", false);
+	ConfMan.registerDefault("wallcollision", false);
 
 	syncSoundSettings();
 	int32 w = ORIGINAL_WIDTH;


Commit: 59a538c3dab978ab67aaaec397c6ed0041d4fbeb
    https://github.com/scummvm/scummvm/commit/59a538c3dab978ab67aaaec397c6ed0041d4fbeb
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T13:56:33+02:00

Commit Message:
TWINE: allow to toggle options with enter, too

Changed paths:
    engines/twine/menu/menu.cpp


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 514c2a27ff..ff000b27b1 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -460,7 +460,7 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 		if (menuSettings == &advOptionsMenuState) {
 			switch (id) {
 			case MenuButtonTypes::kAggressiveMode:
-				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					_engine->_actor->autoAggressive = !_engine->_actor->autoAggressive;
 				}
 				break;
@@ -468,7 +468,7 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft)) {
 					_engine->cfgfile.PolygonDetails--;
 					_engine->cfgfile.PolygonDetails %= 3;
-				} else if (_engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+				} else if (_engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					_engine->cfgfile.PolygonDetails++;
 					_engine->cfgfile.PolygonDetails %= 3;
 				}
@@ -477,24 +477,24 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft)) {
 					_engine->cfgfile.ShadowMode--;
 					_engine->cfgfile.ShadowMode %= 3;
-				} else if (_engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+				} else if (_engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					_engine->cfgfile.ShadowMode++;
 					_engine->cfgfile.ShadowMode %= 3;
 				}
 				break;
 			case MenuButtonTypes::kSceneryZoom:
-				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					_engine->cfgfile.SceZoom = !_engine->cfgfile.SceZoom;
 				}
 				break;
 			case MenuButtonTypes::kHighResolution:
-				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					const bool highRes = ConfMan.getBool("usehighres");
 					ConfMan.setBool("usehighres", !highRes);
 				}
 				break;
 			case MenuButtonTypes::kWallCollision:
-				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) {
+				if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight) || _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter)) {
 					const bool highRes = ConfMan.getBool("wallcollision");
 					ConfMan.setBool("wallcollision", !highRes);
 				}


Commit: c211ed15b6c5ab14c6cc715eea6841ae065d572a
    https://github.com/scummvm/scummvm/commit/c211ed15b6c5ab14c6cc715eea6841ae065d572a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T14:13:27+02:00

Commit Message:
TWINE: updated volume menu

Changed paths:
    engines/twine/menu/menu.cpp
    engines/twine/script/script_life_v1.cpp
    engines/twine/shared.h


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index ff000b27b1..f1e258cb64 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -60,14 +60,13 @@ enum _MenuButtonTypes {
 	kMusicVolume = 1,
 	kSoundVolume = 2,
 	kCDVolume = 3,
-	kLineVolume = 4,
-	kMasterVolume = 5,
-	kAggressiveMode = 6,
-	kPolygonDetails = 7,
-	kShadowSettings = 8,
-	kSceneryZoom = 9,
-	kHighResolution = 10,
-	kWallCollision = 11
+	kSpeechVolume = 4,
+	kAggressiveMode = 5,
+	kPolygonDetails = 6,
+	kShadowSettings = 7,
+	kSceneryZoom = 8,
+	kHighResolution = 9,
+	kWallCollision = 10
 };
 }
 
@@ -141,9 +140,7 @@ static MenuSettings createVolumeMenu() {
 	settings.addButton(TextId::kMusicVolume, MenuButtonTypes::kMusicVolume);
 	settings.addButton(TextId::kSoundVolume, MenuButtonTypes::kSoundVolume);
 	settings.addButton(TextId::kCDVolume, MenuButtonTypes::kCDVolume);
-	settings.addButton(TextId::kLineInVolume, MenuButtonTypes::kLineVolume);
-	settings.addButton(TextId::kMasterVolume, MenuButtonTypes::kMasterVolume);
-	settings.addButton(TextId::kSaveSettings);
+	settings.addButton(TextId::kSpeechVolume, MenuButtonTypes::kSpeechVolume);
 	return settings;
 }
 
@@ -254,7 +251,7 @@ void Menu::drawBox(int32 left, int32 top, int32 right, int32 bottom, int32 color
 
 void Menu::drawButtonGfx(const MenuSettings *menuSettings, const Common::Rect &rect, int32 buttonId, const char *dialText, bool hover) {
 	if (hover) {
-		if (menuSettings == &volumeMenuState && buttonId <= MenuButtonTypes::kMasterVolume && buttonId >= MenuButtonTypes::kMusicVolume) {
+		if (menuSettings == &volumeMenuState && buttonId <= MenuButtonTypes::kSpeechVolume && buttonId >= MenuButtonTypes::kMusicVolume) {
 			int32 newWidth = 0;
 			switch (buttonId) {
 			case MenuButtonTypes::kMusicVolume: {
@@ -272,16 +269,11 @@ void Menu::drawButtonGfx(const MenuSettings *menuSettings, const Common::Rect &r
 				newWidth = _engine->_screens->crossDot(rect.left, rect.right, Audio::Mixer::kMaxMixerVolume, status.volume);
 				break;
 			}
-			case MenuButtonTypes::kLineVolume: {
+			case MenuButtonTypes::kSpeechVolume: {
 				const int volume = _engine->_system->getMixer()->getVolumeForSoundType(Audio::Mixer::kSpeechSoundType);
 				newWidth = _engine->_screens->crossDot(rect.left, rect.right, Audio::Mixer::kMaxMixerVolume, volume);
 				break;
 			}
-			case MenuButtonTypes::kMasterVolume: {
-				const int volume = _engine->_system->getMixer()->getVolumeForSoundType(Audio::Mixer::kPlainSoundType);
-				newWidth = _engine->_screens->crossDot(rect.left, rect.right, Audio::Mixer::kMaxMixerVolume, volume);
-				break;
-			}
 			}
 
 			processPlasmaEffect(rect, 80);
@@ -513,6 +505,7 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 					volume += 4;
 				}
 				_engine->_music->musicVolume(volume);
+				ConfMan.setInt("music_volume", mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType));
 				break;
 			}
 			case MenuButtonTypes::kSoundVolume: {
@@ -522,7 +515,9 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 				} else if (_engine->_input->isActionActive(TwinEActionType::UIRight)) {
 					volume += 4;
 				}
+
 				mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, volume);
+				ConfMan.setInt("sfx_volume", mixer->getVolumeForSoundType(Audio::Mixer::kSFXSoundType));
 				break;
 			}
 			case MenuButtonTypes::kCDVolume: {
@@ -536,7 +531,7 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 				_engine->_system->getAudioCDManager()->setVolume(status.volume);
 				break;
 			}
-			case MenuButtonTypes::kLineVolume: {
+			case MenuButtonTypes::kSpeechVolume: {
 				int volume = mixer->getVolumeForSoundType(Audio::Mixer::kSpeechSoundType);
 				if (_engine->_input->isActionActive(TwinEActionType::UILeft)) {
 					volume -= 4;
@@ -544,16 +539,7 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 					volume += 4;
 				}
 				mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume);
-				break;
-			}
-			case MenuButtonTypes::kMasterVolume: {
-				int volume = mixer->getVolumeForSoundType(Audio::Mixer::kPlainSoundType);
-				if (_engine->_input->isActionActive(TwinEActionType::UILeft)) {
-					volume -= 4;
-				} else if (_engine->_input->isActionActive(TwinEActionType::UIRight)) {
-					volume += 4;
-				}
-				mixer->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, volume);
+				ConfMan.setInt("speech_volume", mixer->getVolumeForSoundType(Audio::Mixer::kSpeechSoundType));
 				break;
 			}
 			default:
@@ -670,16 +656,12 @@ int32 Menu::volumeMenu() {
 		switch (processMenu(&volumeMenuState)) {
 		case (int32)TextId::kReturnMenu:
 			return 0;
-		case (int32)TextId::kSaveSettings:
-			ConfMan.flushToDisk();
-			break;
 		case kQuitEngine:
 			return kQuitEngine;
 		case (int32)TextId::kMusicVolume:
 		case (int32)TextId::kSoundVolume:
 		case (int32)TextId::kCDVolume:
-		case (int32)TextId::kLineInVolume:
-		case (int32)TextId::kMasterVolume:
+		case (int32)TextId::kSpeechVolume:
 		default:
 			warning("Unknown menu button handled");
 			break;
diff --git a/engines/twine/script/script_life_v1.cpp b/engines/twine/script/script_life_v1.cpp
index c6bdf2ae5f..2faef8bcb7 100644
--- a/engines/twine/script/script_life_v1.cpp
+++ b/engines/twine/script/script_life_v1.cpp
@@ -1714,6 +1714,7 @@ static int32 lTEXT(TwinEEngine *engine, LifeScriptContext &ctx) {
 	const int32 textHeight = 40;
 	if (lTextYPos < engine->height() - textHeight) {
 		if (engine->cfgfile.Version == USA_VERSION) {
+			// TODO: these are most likely not the menu text ids - but from a different text bank
 			if (textIdx == TextId::kBehaviourNormal) {
 				textIdx = TextId::kSaveSettings;
 			}
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index 6f3e2600db..9cfff336bd 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -437,7 +437,7 @@ enum class TextId : int16 {
 	kMusicVolume = 10,
 	kSoundVolume = 11,
 	kCDVolume = 12,
-	kLineInVolume = 13,
+	kSpeechVolume = 13,
 	kMasterVolume = 14,
 	kReturnGame = 15,
 	kSaveSettings = 16,


Commit: 0bad9e9b7a396ea59f969fef50e4bdfb175e4379
    https://github.com/scummvm/scummvm/commit/0bad9e9b7a396ea59f969fef50e4bdfb175e4379
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-04-09T15:06:47+02:00

Commit Message:
TWINE: use color constant

Changed paths:
    engines/twine/menu/menu.cpp
    engines/twine/text.h


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index f1e258cb64..465660252e 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -56,7 +56,7 @@ namespace TwinE {
 static const uint32 kPlasmaEffectFilesize = 262176;
 
 namespace MenuButtonTypes {
-enum _MenuButtonTypes {
+enum MenuButtonTypesEnum {
 	kMusicVolume = 1,
 	kSoundVolume = 2,
 	kCDVolume = 3,
@@ -276,13 +276,13 @@ void Menu::drawButtonGfx(const MenuSettings *menuSettings, const Common::Rect &r
 			}
 			}
 
-			processPlasmaEffect(rect, 80);
+			processPlasmaEffect(rect, COLOR_80);
 			if (!(_engine->getRandomNumber() % 5)) {
 				plasmaEffectPtr[_engine->getRandomNumber() % 140 * 10 + 1900] = 255;
 			}
-			_engine->_interface->drawFilledRect(Common::Rect(newWidth, rect.top, rect.right, rect.bottom), COLOR_RED);
+			_engine->_interface->drawFilledRect(Common::Rect(newWidth, rect.top, rect.right, rect.bottom), COLOR_68);
 		} else {
-			processPlasmaEffect(rect, 64);
+			processPlasmaEffect(rect, COLOR_64);
 			if (!(_engine->getRandomNumber() % 5)) {
 				plasmaEffectPtr[_engine->getRandomNumber() % PLASMA_WIDTH * 10 + 6400] = 255;
 			}
@@ -1171,7 +1171,7 @@ void Menu::processInventoryMenu() {
 
 	_engine->_renderer->setLightVector(ANGLE_315, ANGLE_334, ANGLE_0);
 
-	inventorySelectedColor = COLOR_RED;
+	inventorySelectedColor = COLOR_68;
 
 	if (_engine->_gameState->inventoryNumLeafs > 0) {
 		_engine->_gameState->giveItem(InventoryItems::kiCloverLeaf);
diff --git a/engines/twine/text.h b/engines/twine/text.h
index 9f76df7809..e5f643ca27 100644
--- a/engines/twine/text.h
+++ b/engines/twine/text.h
@@ -38,10 +38,22 @@ class TextEntry;
 #define COLOR_BRIGHT_BLUE 4
 #define COLOR_9 9
 #define COLOR_14 14
-#define COLOR_RED 68
-#define COLOR_73 73
+// color 1 = yellow
+// color 2 - 15 = white
+// color 16 - 19 = brown
+// color 20 - 24 = orange to yellow
+// color 25 orange
+// color 26 - 30 = bright gray or white
+#define COlOR_31 31 // green dark
+#define COlOR_47 47 // green bright
+#define COLOR_48 48 // brown dark
+#define COLOR_63 63 // brown bright
+#define COLOR_64 64 // blue dark
+#define COLOR_68 68 // blue
+#define COLOR_73 73 // blue
 #define COLOR_75 75
-#define COLOR_79 79
+#define COLOR_79 79 // blue bright
+#define COLOR_80 80
 #define COLOR_91 91
 #define COLOR_BRIGHT_BLUE2 69
 #define COLOR_WHITE 15




More information about the Scummvm-git-logs mailing list