[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 ¤tAnimData = _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