SCUMM: (GUI) - modify dialogs for CJK font support

This replaces the fixed vertical coordinates with coordinates based on the font
height (taken from the original CJK DIG interpreter).

It also influences the appearance of the non-CJK dialog, but not necessarily for
the worse (and the one we had is again different from the one in the original
7.3.5/7.5.0 interpreters, so there really is not one definite dialog).

There is more in this commit, like:
- clippint the save names at the end of the line
- getting rid of all sprintfs and similiar cleanup to be better in line with our
coding conventions.
This commit is contained in:
athrxx
2022-09-08 19:10:42 +02:00
parent af45365e4f
commit 71f73fd8ae
5 changed files with 154 additions and 156 deletions
+141 -142
View File
@@ -144,7 +144,8 @@ Common::KeyState ScummEngine::showBannerAndPause(int bannerId, int32 waitTime, c
// Take all the necessary measurements for the box which
// will contain the string...
bool isCOMIDemo = (_game.id == GID_CMI && (_game.features & GF_DEMO) != 0);
bannerMsgHeight = (isCOMIDemo ? getGUIStringHeight("ABC \x80\x78 \xb0\x78") : getGUIStringHeight(bannerMsg)) + 5;
bannerMsgHeight = ((_game.id == GID_DIG || isCOMIDemo) ? getGUIStringHeight("ABC \x80\x78 \xb0\x78") : getGUIStringHeight(bannerMsg)) + 5;
bannerMsgWidth = getGUIStringWidth(bannerMsg);
if (bannerMsgWidth < 100)
bannerMsgWidth = 100;
@@ -171,7 +172,7 @@ Common::KeyState ScummEngine::showBannerAndPause(int bannerId, int32 waitTime, c
startingPointX = 156 - roundedWidth;
startingPointY = ((_game.version < 7) ? 80 : _screenHeight / 2 - 10);
xPos = roundedWidth + 163 + ((_game.version < 7) ? 1 : 0);
yPos = -12;
yPos = 1 - bannerMsgHeight; // For the normal font this will end up as -12, for CJK modes it will be appropriately adjusted.
bannerSaveYStart = startingPointY - ((_game.version < 7) ? 2 : 0);
}
@@ -311,7 +312,7 @@ Common::KeyState ScummEngine::showOldStyleBannerAndPause(const char *msg, int co
drawBox(0, startingPointY, _screenWidth - 1, startingPointY + bannerMsgHeight, 0);
drawBox(0, startingPointY, _screenWidth - 1, startingPointY, color);
drawBox(0, startingPointY + bannerMsgHeight, _screenWidth - 1, startingPointY + bannerMsgHeight, color);
drawGUIText(bannerMsg, _screenWidth / 2, startingPointY + 2, _screenWidth - 1, color, true);
drawGUIText(bannerMsg, 0, _screenWidth / 2, startingPointY + 2, color, true);
ScummEngine::drawDirtyScreenParts();
// Wait until the engine receives a new Keyboard or Mouse input,
@@ -445,7 +446,7 @@ void ScummEngine::drawInternalGUIControl(int id, bool highlightColor) {
int x, y, textXPos, textYPos;
int textColor, fillColor;
int boxSizeX, boxSizeY;
int offset = (_game.version == 8) ? 2 : 1;
int offset = (_game.version == 8 || _game.id == GID_DIG) ? 2 : 1;
int topComp = (_game.version < 8) ? _screenTop : 0;
bool centerFlag;
@@ -530,27 +531,17 @@ void ScummEngine::drawInternalGUIControl(int id, bool highlightColor) {
textXPos = 160;
textYPos = 82;
} else {
textHeight = getGUIStringHeight(ctrl->label);
textHeight = getGUIStringHeight(ctrl->label.c_str());
if (centerFlag)
textXPos = relCentX + (x - ctrl->relativeCenterX) / 2;
else
textXPos = relCentX + 2;
if (_game.version == 8) {
textYPos = relCentY + ((y - relCentY) - textHeight) / 2 + 1;
} else {
int yOffset = 8;
if ((_game.id == GID_DIG && _useCJKMode) &&
(((byte)ctrl->label[0] >= 128 && (byte)ctrl->label[0] <= 159) ||
((byte)ctrl->label[0] >= 224 && (byte)ctrl->label[0] <= 253))) {
yOffset = 16;
}
textYPos = relCentY + (y - yOffset - relCentY + 2) / 2;
}
if (_game.version == 8 || _game.id == GID_DIG)
textYPos = relCentY + (y - relCentY - textHeight) / 2 + 1;
else
textYPos = relCentY + (y - 8 - relCentY + 2) / 2;
}
// Finally, choose the color and draw the text message
@@ -559,10 +550,7 @@ void ScummEngine::drawInternalGUIControl(int id, bool highlightColor) {
else
textColor = ctrl->normalTextColor;
if (ctrl->label)
Common::strlcpy(buttonString, ctrl->label, sizeof(buttonString));
else
Common::strlcpy(buttonString, "null button", sizeof(buttonString));
Common::strlcpy(buttonString, ctrl->label.c_str(), sizeof(buttonString));
if (_mainMenuSavegameLabel == id && _menuPage == GUI_PAGE_SAVE) {
Common::strlcat(buttonString, "_", sizeof(buttonString));
@@ -570,7 +558,12 @@ void ScummEngine::drawInternalGUIControl(int id, bool highlightColor) {
int tmpRight = _string[5].right;
_string[5].right = _screenWidth - 1;
drawGUIText(buttonString, textXPos, textYPos, _screenWidth - 1, textColor, centerFlag);
// The original CJK DIG interpreter limits the clipping to the save slots. Other elements
// seem to (theoretically) be allowed to draw text wherever they want...
bool isSaveSlot = (id >= 1 && id <= 9);
Common::Rect clipRect(relCentX, relCentY, x, y);
drawGUIText(buttonString, isSaveSlot ? &clipRect : 0, textXPos, textYPos, textColor, centerFlag);
_string[5].right = tmpRight;
// Restore the previous charset
@@ -678,7 +671,7 @@ void ScummEngine_v7::queryQuit() {
drawInternalGUIControl(0, 0);
// The text is drawn as a separate entity
drawTextImmediately((const byte *)msgLabelPtr, 320, 200, getBannerColor(32), 1, (TextStyleFlags) true);
drawTextImmediately((const byte *)msgLabelPtr, &_defaultTextClipRect, 320, 200, getBannerColor(32), 1, (TextStyleFlags) true);
// Now set up and draw the Yes and No buttons...
if (getGUIStringWidth(noLabelPtr) <= getGUIStringWidth(yesLabelPtr)) {
@@ -853,6 +846,7 @@ const char *ScummEngine_v8::getGUIString(int stringId) {
const char *ScummEngine_v7::getGUIString(int stringId) {
InfoDialog d(this, 0);
int resStringId = -1;
resStringId = VAR(stringId);
switch (stringId) {
case gsPause:
@@ -971,10 +965,14 @@ const char *ScummEngine_v7::getGUIString(int stringId) {
return _emptyMsg;
}
if (resStringId > 0)
return d.getPlainEngineString(resStringId);
else
return _emptyMsg;
const char *res = (resStringId > 0) ? d.getPlainEngineString(resStringId) : _emptyMsg;
if (_game.id == GID_DIG) {
convertMessageToString((const byte*)res, _guiStringTransBuff, 512);
res = (const char*)_guiStringTransBuff;
}
return res;
}
int ScummEngine_v7::getGUIStringHeight(const char *str) {
@@ -985,8 +983,8 @@ int ScummEngine_v7::getGUIStringWidth(const char *str) {
return _textV7->getStringWidth(str);
}
void ScummEngine_v7::drawGUIText(const char *buttonString, int textXPos, int textYPos, int rightRectClip, int textColor, bool centerFlag) {
drawTextImmediately((const byte *)buttonString, textXPos, textYPos, textColor, 1, (TextStyleFlags)centerFlag);
void ScummEngine_v7::drawGUIText(const char *buttonString, Common::Rect *clipRect, int textXPos, int textYPos, int textColor, bool centerFlag) {
drawTextImmediately((const byte *)buttonString, clipRect, textXPos, textYPos, textColor, 1, (TextStyleFlags)centerFlag);
}
int ScummEngine_v7::getMusicVolume() {
@@ -1208,7 +1206,6 @@ int ScummEngine::getSFXVolume() {
return CLIP<int>(_mixer->getVolumeForSoundType(Audio::Mixer::kSFXSoundType) / 2, 0, 127);
}
void ScummEngine::queryQuit() {
char msgLabelPtr[512];
char localizedYesKey;
@@ -1276,32 +1273,32 @@ void ScummEngine::fillSavegameLabels() {
Common::String name;
int curSaveSlot;
bool isLoomVga = (_game.id == GID_LOOM && _game.version == 4);
_savegameNames.clear();
for (int i = 0; i < 9; i++) {
curSaveSlot = i + (isLoomVga ? _firstSaveStateOfList : _curDisplayedSaveSlotPage * 9);
if (_game.version > 4 || (_game.version == 4 && _game.id == GID_LOOM)) {
sprintf(_savegameNames[i].label, "%2d. ", curSaveSlot + 1);
} else {
_savegameNames[i].label[0] = '\0';
}
if (availSaves[curSaveSlot]) {
if (_game.version > 4 || (_game.version == 4 && _game.id == GID_LOOM)) {
if (availSaves[curSaveSlot]) {
if (getSavegameName(curSaveSlot, name)) {
sprintf(_savegameNames[i].label, "%2d. %s", curSaveSlot + 1, name.c_str());
_savegameNames.push_back(Common::String::format("%2d. %s", curSaveSlot + 1, name.c_str()));
} else {
// The original printed "WARNING... old savegame", but we do support old savegames :-)
sprintf(_savegameNames[i].label, "%2d. WARNING: wrong save version", curSaveSlot + 1);
_savegameNames.push_back(Common::String::format("%2d. WARNING: wrong save version", curSaveSlot + 1));
}
} else {
_savegameNames.push_back(Common::String::format("%2d. ", curSaveSlot + 1));
}
} else {
if (availSaves[curSaveSlot]) {
if (getSavegameName(curSaveSlot, name)) {
sprintf(_savegameNames[i].label, "%s", name.c_str());
_savegameNames.push_back(Common::String::format("%s", name.c_str()));
} else {
// The original printed "WARNING... old savegame", but we do support old savegames :-)
sprintf(_savegameNames[i].label, "%s", "WARNING: wrong save version");
_savegameNames.push_back(Common::String::format("%s", "WARNING: wrong save version"));
}
} else {
_savegameNames.push_back(Common::String());
}
}
}
}
@@ -1353,19 +1350,20 @@ bool ScummEngine::userWriteLabelRoutine(Common::KeyState &ks, bool &leftMsClicke
}
// Handle special key presses
int curLen = strlen(_savegameNames[_mainMenuSavegameLabel - 1].label);
int curLen = _savegameNames[_mainMenuSavegameLabel - 1].size();
if (ks.keycode == Common::KEYCODE_BACKSPACE) {
// Prevent the user from deleting the header (" 1. ")
if (curLen > firstChar) {
_savegameNames[_mainMenuSavegameLabel - 1].label[curLen - 1] = '\0';
_savegameNames[_mainMenuSavegameLabel - 1].deleteLastChar();
_internalGUIControls[_mainMenuSavegameLabel].label = _savegameNames[_mainMenuSavegameLabel - 1];
drawInternalGUIControl(_mainMenuSavegameLabel, 1);
ScummEngine::drawDirtyScreenParts();
_system->updateScreen();
}
} else if (ks.ascii >= 32 && ks.ascii <= 122) { // Handle characters
if (curLen < 39) {
_savegameNames[_mainMenuSavegameLabel - 1].label[curLen] = ks.ascii;
_savegameNames[_mainMenuSavegameLabel - 1].label[curLen + 1] = '\0';
_savegameNames[_mainMenuSavegameLabel - 1] += (char)ks.ascii;
_internalGUIControls[_mainMenuSavegameLabel].label = _savegameNames[_mainMenuSavegameLabel - 1];
drawInternalGUIControl(_mainMenuSavegameLabel, 1);
ScummEngine::drawDirtyScreenParts();
_system->updateScreen();
@@ -1616,7 +1614,7 @@ void ScummEngine::showMainMenu() {
bool ScummEngine::executeMainMenuOperation(int op, int mouseX, int mouseY, bool &hasLoadedState) {
char saveScreenTitle[512];
char formattedString[512];
Common::String formattedString;
int curSlot;
bool isLoomVga = (_game.id == GID_LOOM && _game.version == 4);
size_t labelSkip = (_game.version == 4 && _game.id != GID_LOOM) ? 0 : 4;
@@ -1648,17 +1646,17 @@ bool ScummEngine::executeMainMenuOperation(int op, int mouseX, int mouseY, bool
case GUI_CTRL_OK_BUTTON:
if (_menuPage == GUI_PAGE_SAVE) {
// We check for an empty label since v4 might generate that...
if (_mainMenuSavegameLabel > 0 && _savegameNames[_mainMenuSavegameLabel - 1].label[labelSkip] != '\0') {
if (_mainMenuSavegameLabel > 0 && !_savegameNames[_mainMenuSavegameLabel - 1].substr(labelSkip).empty()) {
convertMessageToString((const byte *)getGUIString(gsSaving), (byte *)saveScreenTitle, sizeof(saveScreenTitle));
sprintf(formattedString, saveScreenTitle, &_savegameNames[_mainMenuSavegameLabel - 1].label[labelSkip]);
drawMainMenuTitle(formattedString);
formattedString = Common::String::format(saveScreenTitle, _savegameNames[_mainMenuSavegameLabel - 1].substr(labelSkip).c_str());
drawMainMenuTitle(formattedString.c_str());
ScummEngine::drawDirtyScreenParts();
_system->updateScreen();
waitForTimer(60);
Common::String dummyString;
_saveLoadDescription = &_savegameNames[_mainMenuSavegameLabel - 1].label[labelSkip];
_saveLoadDescription = _savegameNames[_mainMenuSavegameLabel - 1].substr(labelSkip);
curSlot = _mainMenuSavegameLabel + (isLoomVga ? _firstSaveStateOfList : _curDisplayedSaveSlotPage * 9);
if (canWriteGame(curSlot)) {
@@ -1699,15 +1697,15 @@ bool ScummEngine::executeMainMenuOperation(int op, int mouseX, int mouseY, bool
} else if (_menuPage == GUI_PAGE_LOAD) {
if (_mainMenuSavegameLabel > 0) {
convertMessageToString((const byte *)getGUIString(gsLoading), (byte *)saveScreenTitle, sizeof(saveScreenTitle));
sprintf(formattedString, saveScreenTitle, &_savegameNames[_mainMenuSavegameLabel - 1].label[labelSkip]);
formattedString = Common::String::format(saveScreenTitle, _savegameNames[_mainMenuSavegameLabel - 1].substr(labelSkip).c_str());
if (strlen(_savegameNames[_mainMenuSavegameLabel - 1].label) == labelSkip) {
if (_savegameNames[_mainMenuSavegameLabel - 1].size() == labelSkip) {
drawMainMenuControls();
ScummEngine::drawDirtyScreenParts();
break;
}
drawMainMenuTitle(formattedString);
drawMainMenuTitle(formattedString.c_str());
ScummEngine::drawDirtyScreenParts();
_system->updateScreen();
@@ -1792,6 +1790,11 @@ bool ScummEngine::executeMainMenuOperation(int op, int mouseX, int mouseY, bool
_mainMenuSavegameLabel = 0;
fillSavegameLabels();
// Update the control labels with the newly changed savegame names
for (int i = GUI_CTRL_FIRST_SG; i <= GUI_CTRL_LAST_SG; i++)
_internalGUIControls[i].label = _savegameNames[i - 1];
drawMainMenuControls();
ScummEngine::drawDirtyScreenParts();
} else {
@@ -1996,7 +1999,7 @@ void ScummEngine_v4::setUpMainMenuControls() {
yConstant - 56 + j,
-206,
-9,
_savegameNames[i - 1].label, 0, 0);
_savegameNames[i - 1].c_str(), 0, 0);
}
}
}
@@ -2193,20 +2196,23 @@ void ScummEngine::setUpMainMenuControls() {
yConstant - 45 + j,
210 - (isLoomVGA ? 10 : 0),
-9,
_savegameNames[i - 1].label, 0, 0);
_savegameNames[i - 1].c_str(), 0, 0);
}
}
}
void ScummEngine_v6::setUpMainMenuControls() {
int yComponentV7, yConstantV7, yConstant2V7, yConstantV6;
int yConstantV6;
// V7 auxiliary constants
yComponentV7 = (_game.id == GID_DIG && _useCJKMode) ? 130 : 121;
yConstantV7 = _screenHeight / 2 - ((yComponentV7 - 1) / 2);
yConstant2V7 = _screenHeight / 2 + ((yComponentV7 - 1) / 2);
int cid = _charset->getCurID();
_charset->setCurID(1);
int lh = getGUIStringHeight("ABC \x80\x78 \xb0\x78");
_charset->setCurID(cid);
int yCntr = _screenHeight / 2;
int calculatedHeight = (110 + lh) / 2;
// V6 ausiliary constant
// V6 auxiliary constant
yConstantV6 = _virtscr[kMainVirtScreen].topline + (_virtscr[kMainVirtScreen].h / 2);
for (int i = 0; i < ARRAYSIZE(_internalGUIControls); i++) {
@@ -2224,9 +2230,9 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(4),
(_game.version == 7 ? 16 : 20),
(_game.version == 7 ? yConstantV7 : yConstantV6 - 60),
(_game.version == 7 ? yCntr - calculatedHeight : yConstantV6 - 60),
(_game.version == 7 ? 303 : 300),
(_game.version == 7 ? yConstant2V7 : yConstantV6 + 60),
(_game.version == 7 ? yCntr + calculatedHeight : yConstantV6 + 60),
_emptyMsg, 1, 1);
// Inner box
@@ -2240,7 +2246,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(7),
(_game.version == 7 ? 22 : 26),
(_game.version == 7 ? yConstantV7 + ((_game.id == GID_DIG && _useCJKMode) ? 21 : 13) : yConstantV6 - 47),
(_game.version == 7 ? yCntr - calculatedHeight + lh + 4 : yConstantV6 - 47),
(_game.version == 7 ? -183 : -176),
-102,
_emptyMsg, 1, 1);
@@ -2322,7 +2328,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(10),
getBannerColor(12),
(_game.version == 7 ? 108 : 102),
(_game.version == 7 ? yConstantV7 + 25 : yConstantV6 - 39),
(_game.version == 7 ? yCntr - calculatedHeight + 25 : yConstantV6 - 39),
-90,
-12,
_uncheckedBox, 1, 1);
@@ -2338,7 +2344,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(10),
getBannerColor(12),
(_game.version == 7 ? 108 : 102),
(_game.version == 7 ? yConstantV7 + 43 : yConstantV6 - 25),
(_game.version == 7 ? yCntr - calculatedHeight + 43 : yConstantV6 - 25),
-90,
-12,
_uncheckedBox, 1, 1);
@@ -2354,7 +2360,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(10),
getBannerColor(12),
(_game.version == 7 ? 108 : 102),
(_game.version == 7 ? yConstantV7 + 61 : yConstantV6 - 11),
(_game.version == 7 ? yCntr - calculatedHeight + 61 : yConstantV6 - 11),
-90,
-12,
_uncheckedBox, 1, 1);
@@ -2371,7 +2377,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(11),
getBannerColor(12),
(_game.version == 7 ? 108 : 102),
(_game.version == 7 ? yConstantV7 + 85 : yConstantV6 + 17),
(_game.version == 7 ? yCntr - calculatedHeight + 85 : yConstantV6 + 17),
-12,
-12,
_uncheckedBox, 1, 1);
@@ -2387,9 +2393,9 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(10),
getBannerColor(12),
(_game.version == 7 ? 108 : 102),
(_game.version == 7 ? yConstantV7 + 99 : yConstantV6 + 31),
(_game.version == 7 ? yCntr - calculatedHeight + 99 : yConstantV6 + 31),
-90,
-12,
-(lh + 4),
_uncheckedBox, 1, 1);
// Save button
@@ -2403,15 +2409,12 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(7),
(_game.version == 7 ? 235 : 232),
(_game.version == 7 ? yConstantV7 + 37 : yConstantV6 - 23),
(_game.version == 7 ? yCntr - calculatedHeight + 30 : yConstantV6 - 23),
-60,
((_game.id == GID_DIG && _useCJKMode) ? -18 : -12),
-(lh + 4),
getGUIString(gsSave), 1, 1);
// Load button
int loadButtonAnchorY = yConstantV7 +
((_game.id == GID_DIG && _useCJKMode) ? 18 : 12)
+ 40;
setUpInternalGUIControl(GUI_CTRL_LOAD_BUTTON,
getBannerColor(4),
getBannerColor(5),
@@ -2422,15 +2425,12 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(7),
(_game.version == 7 ? 235 : 232),
(_game.version == 7 ? loadButtonAnchorY : yConstantV6 - 8),
(_game.version == 7 ? yCntr - calculatedHeight + lh + 37 : yConstantV6 - 8),
-60,
((_game.id == GID_DIG && _useCJKMode) ? -18 : -12),
-(lh + 4),
getGUIString(gsLoad), 1, 1);
// Play button
int playButtonAnchorY = yConstantV7 +
2 * ((_game.id == GID_DIG && _useCJKMode) ? 18 : 12)
+ 43;
setUpInternalGUIControl(GUI_CTRL_PLAY_BUTTON,
getBannerColor(4),
getBannerColor(5),
@@ -2441,15 +2441,12 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(7),
(_game.version == 7 ? 235 : 232),
(_game.version == 7 ? playButtonAnchorY : yConstantV6 + 7),
(_game.version == 7 ? yCntr - calculatedHeight + lh * 2 + 44 : yConstantV6 + 7),
-60,
((_game.id == GID_DIG && _useCJKMode) ? -18 : -12),
-(lh + 4),
getGUIString(gsPlay), 1, 1);
// Quit button
int quitButtonAnchorY = yConstantV7 +
3 * ((_game.id == GID_DIG && _useCJKMode) ? 18 : 12)
+ 46;
setUpInternalGUIControl(GUI_CTRL_QUIT_BUTTON,
getBannerColor(4),
getBannerColor(5),
@@ -2460,9 +2457,9 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(7),
(_game.version == 7 ? 235 : 232),
(_game.version == 7 ? quitButtonAnchorY : yConstantV6 + 22),
(_game.version == 7 ? yCntr - calculatedHeight + lh * 3 + 51 : yConstantV6 + 22),
-60,
((_game.id == GID_DIG && _useCJKMode) ? -18 : -12),
-(lh + 4),
getGUIString(gsQuit), 1, 1);
}
@@ -2478,7 +2475,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(11),
getBannerColor(12),
(_game.version == 7 ? 209 : 206),
(_game.version == 7 ? yConstantV7 + ((_game.id == GID_DIG && _useCJKMode) ? 25 : 17) : yConstantV6 - 43),
(_game.version == 7 ? yCntr - calculatedHeight + lh + 8: yConstantV6 - 43),
-16,
-47,
_arrowUp, 1, 1);
@@ -2494,7 +2491,7 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(11),
getBannerColor(12),
(_game.version == 7 ? 209 : 206),
(_game.version == 7 ? yConstantV7 + ((_game.id == GID_DIG && _useCJKMode) ? 75 : 67) : yConstantV6 + 7),
(_game.version == 7 ? yCntr - calculatedHeight + lh + 58 : yConstantV6 + 7),
-16,
-45,
_arrowDown, 1, 1);
@@ -2503,7 +2500,6 @@ void ScummEngine_v6::setUpMainMenuControls() {
if (_menuPage == GUI_PAGE_SAVE || _menuPage == GUI_PAGE_LOAD) {
if (_menuPage == GUI_PAGE_SAVE) {
// OK button
int okButtonAnchorY = ((_game.id == GID_DIG && _useCJKMode) ? 18 : 12) + yConstantV7 + 40;
setUpInternalGUIControl(GUI_CTRL_OK_BUTTON,
getBannerColor(4),
getBannerColor(5),
@@ -2514,9 +2510,9 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(6),
getBannerColor(7),
(_game.version == 7 ? 235 : 232),
(_game.version == 7 ? okButtonAnchorY : yConstantV6 - 8),
(_game.version == 7 ? yCntr - calculatedHeight + lh + 37: yConstantV6 - 8),
-60,
((_game.id == GID_DIG && _useCJKMode) ? -18 : -12),
-(lh + 4),
getGUIString(gsOK), 1, 1);
}
@@ -2524,16 +2520,13 @@ void ScummEngine_v6::setUpMainMenuControls() {
int cancelButtonAnchorY;
if (_menuPage == GUI_PAGE_LOAD) {
if (_game.version == 7) {
cancelButtonAnchorY = _screenHeight / 2 +
(((_game.id == GID_DIG && _useCJKMode) ? 10 : 7) - yComponentV7 / 2) +
((_game.id == GID_DIG && _useCJKMode) ? 18 : 12) +
40;
cancelButtonAnchorY = yCntr - calculatedHeight + (lh + 7) / 2 + lh + 37;
} else {
cancelButtonAnchorY = yConstantV6 - 1;
}
} else {
if (_game.version == 7) {
cancelButtonAnchorY = yConstantV7 + 43 + 2 * ((_game.id == GID_DIG && _useCJKMode) ? 18 : 12);
cancelButtonAnchorY = yCntr - calculatedHeight + lh * 2 + 44;
} else {
cancelButtonAnchorY = yConstantV6 + 7;
}
@@ -2550,12 +2543,11 @@ void ScummEngine_v6::setUpMainMenuControls() {
(_game.version == 7 ? 235 : 232),
cancelButtonAnchorY,
-60,
((_game.id == GID_DIG && _useCJKMode) ? -18 : -12),
-(lh + 4),
getGUIString(gsCancel), 1, 1);
// Savegame names
for (int i = GUI_CTRL_FIRST_SG, j = 11; i <= GUI_CTRL_LAST_SG; i++, j += 11) {
int curSaveLabelAnchorY = yConstantV7 + j + ((_game.id == GID_DIG && _useCJKMode) ? 12 : 4);
setUpInternalGUIControl(i,
getBannerColor(9),
getBannerColor(10),
@@ -2566,10 +2558,10 @@ void ScummEngine_v6::setUpMainMenuControls() {
getBannerColor(11),
getBannerColor(12),
(_game.version == 7 ? 24 : 28),
(_game.version == 7 ? curSaveLabelAnchorY : yConstantV6 + j - 56),
(_game.version == 7 ? yCntr - calculatedHeight + j + lh - 5 : yConstantV6 + j - 56),
(_game.version == 7 ? -179 : -172),
-9,
_savegameNames[i - 1].label, 0, 0);
_savegameNames[i - 1].c_str(), 0, 0);
}
}
}
@@ -2622,7 +2614,6 @@ void ScummEngine::drawMainMenuControls() {
drawInternalGUIControl(i, 0);
}
if (_game.version > 4 || (_game.version == 4 && _game.id == GID_LOOM)) {
drawInternalGUIControl(GUI_CTRL_ARROW_UP_BUTTON, 0); // Arrow up button
drawInternalGUIControl(GUI_CTRL_ARROW_DOWN_BUTTON, 0); // Arrow down button
@@ -2648,16 +2639,20 @@ void ScummEngine::updateMainMenuControls() {
if ((_game.variant && !strcmp(_game.variant, "Floppy")) || _game.version < 6)
return;
int cid = _charset->getCurID();
_charset->setCurID(1);
int lh = getGUIStringHeight("ABC \x80\x78 \xb0\x78");
_charset->setCurID(cid);
char msg[256];
int yComponentV7, yConstantV7, yConstantV6;
// V7 auxiliary constants
int yCntr = _screenHeight / 2;
int calculatedHeight = (110 + lh) / 2;
int textColor = getBannerColor(2);
// V7 ausiliary constants
yComponentV7 = (_game.id == GID_DIG && _useCJKMode) ? 130 : 121;
yConstantV7 = _screenHeight / 2 - ((yComponentV7 - 1) / 2);
// V6 ausiliary constant
yConstantV6 = _virtscr[kMainVirtScreen].topline + (_virtscr[kMainVirtScreen].h / 2);
// V6 auxiliary constant
int yConstantV6 = _virtscr[kMainVirtScreen].topline + (_virtscr[kMainVirtScreen].h / 2);
strncpy(_mainMenuMusicSlider, "\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v", sizeof(_mainMenuMusicSlider));
strncpy(_mainMenuSpeechSlider, "\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v", sizeof(_mainMenuSpeechSlider));
@@ -2710,54 +2705,54 @@ void ScummEngine::updateMainMenuControls() {
// not rendered in the other games, so adjust that...
if (_game.id == GID_FT) {
convertMessageToString((const byte *)getGUIString(gsSpooledMusic), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 19, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 19, textColor, false);
convertMessageToString((const byte *)getGUIString(gsMusic), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 33, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 33, textColor, false);
convertMessageToString((const byte *)getGUIString(gsVoice), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 47, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 47, textColor, false);
} else {
convertMessageToString((const byte *)getGUIString(gsMusic), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 25, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 25, textColor, false);
convertMessageToString((const byte *)getGUIString(gsVoice), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 43, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 43, textColor, false);
}
convertMessageToString((const byte *)getGUIString(gsSfx), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 61, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 61, textColor, false);
convertMessageToString((const byte *)getGUIString(gsDisplayText), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 88, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 88, textColor, false);
convertMessageToString((const byte *)getGUIString(gsTextSpeed), (byte *)msg, sizeof(msg));
drawGUIText(msg, 29, yConstantV7 + 102, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 29, yCntr - calculatedHeight + 102, textColor, false);
drawLine(23, yConstantV7 + 77, 204, yConstantV7 + 77, getBannerColor(17));
drawLine(23, yConstantV7 + 78, 204, yConstantV7 + 78, getBannerColor(4));
drawLine(23, yConstantV7 + 79, 204, yConstantV7 + 79, getBannerColor(4));
drawLine(23, yConstantV7 + 80, 204, yConstantV7 + 80, getBannerColor(18));
drawLine(23, yCntr - calculatedHeight + 77, 204, yCntr - calculatedHeight + 77, getBannerColor(17));
drawLine(23, yCntr - calculatedHeight + 78, 204, yCntr - calculatedHeight + 78, getBannerColor(4));
drawLine(23, yCntr - calculatedHeight + 79, 204, yCntr - calculatedHeight + 79, getBannerColor(4));
drawLine(23, yCntr - calculatedHeight + 80, 204, yCntr - calculatedHeight + 80, getBannerColor(18));
// The following line is from the Aaron Giles' interpreter of FT, based on the first DOS version;
// for some reason it doesn't get displayed in the DOS version, and it also overflows
// onto the internal panel lines, so let's just not draw it...
// drawLine(24, yConstantV7 + 81, 204, yConstantV7 + 81, getBannerColor(4));
// drawLine(24, yCntr - calculatedHeight + 81, 204, yCntr - calculatedHeight + 81, getBannerColor(4));
} else {
convertMessageToString((const byte *)getGUIString(gsMusic), (byte *)msg, sizeof(msg));
drawGUIText(msg, 33, yConstantV6 - 36, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 33, yConstantV6 - 36, textColor, false);
convertMessageToString((const byte *)getGUIString(gsVoice), (byte *)msg, sizeof(msg));
drawGUIText(msg, 33, yConstantV6 - 22, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 33, yConstantV6 - 22, textColor, false);
convertMessageToString((const byte *)getGUIString(gsSfx), (byte *)msg, sizeof(msg));
drawGUIText(msg, 33, yConstantV6 - 8, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 33, yConstantV6 - 8, textColor, false);
convertMessageToString((const byte *)getGUIString(gsDisplayText), (byte *)msg, sizeof(msg));
drawGUIText(msg, 33, yConstantV6 + 19, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 33, yConstantV6 + 19, textColor, false);
convertMessageToString((const byte *)getGUIString(gsTextSpeed), (byte *)msg, sizeof(msg));
drawGUIText(msg, 33, yConstantV6 + 34, _screenWidth - 1, textColor, false);
drawGUIText(msg, 0, 33, yConstantV6 + 34, textColor, false);
drawLine(27, yConstantV6 + 8, 201, yConstantV6 + 8, getBannerColor(17));
drawLine(27, yConstantV6 + 9, 201, yConstantV6 + 9, getBannerColor(4));
@@ -2787,34 +2782,38 @@ void ScummEngine::drawMainMenuTitle(const char *title) {
}
if (_game.id == GID_DIG) {
int yComponent = _useCJKMode ? 130 : 121;
int cid = _charset->getCurID();
_charset->setCurID(1);
int lh = getGUIStringHeight("ABC \x80\x78 \xb0\x78");
_charset->setCurID(cid);
int yCntr = _screenHeight / 2;
int calculatedHeight = (110 + lh) / 2;
drawBox(18,
_screenHeight / 2 - ((yComponent - 1) / 2) + _screenTop + 4,
yCntr - calculatedHeight + _screenTop + 4,
301,
_screenHeight / 2 - ((yComponent - 1) / 2) + _screenTop + 12,
yCntr - calculatedHeight + _screenTop + 3 + lh,
boxColor);
drawGUIText(title,
drawGUIText(title, 0,
159,
_screenHeight / 2 - ((yComponent - 1) / 2) + 4,
_screenWidth - 1,
yCntr - calculatedHeight + 4,
stringColor,
true);
} else if (_game.version == 7) {
drawBox(18, _screenTop + 44, 301, _screenTop + 52, boxColor);
drawGUIText(title, 159, 44, _screenWidth - 1, stringColor, true);
drawGUIText(title, 0, 159, 44, stringColor, true);
} else if (_game.version == 4) {
if (_game.id == GID_LOOM) {
drawBox(22, yConstantV6 - 57, 298, yConstantV6 - 49, boxColor);
drawGUIText(title, 160, yConstantV6 - 57, _screenWidth - 1, stringColor, true);
drawGUIText(title, 0, 160, yConstantV6 - 57, stringColor, true);
} else {
drawBox(21, yConstantV6 - 55, 299, yConstantV6 - 47, boxColor);
drawGUIText(title, 160, yConstantV6 - 55, _screenWidth - 1, stringColor, true);
drawGUIText(title, 0, 160, yConstantV6 - 55, stringColor, true);
}
} else {
drawBox(22, yConstantV6 - 56, 298, yConstantV6 - 48, boxColor);
drawGUIText(title, 160, yConstantV6 - 56, _screenWidth - 1, stringColor, true);
drawGUIText(title, 0, 160, yConstantV6 - 56, stringColor, true);
}
ScummEngine::drawDirtyScreenParts();
@@ -2829,12 +2828,12 @@ int ScummEngine::getGUIStringWidth(const char *str) {
return _charset->getStringWidth(0, (const byte *)str);
}
void ScummEngine::drawGUIText(const char *buttonString, int textXPos, int textYPos, int rightRectClip, int textColor, bool centerFlag) {
void ScummEngine::drawGUIText(const char *buttonString, Common::Rect *clipRect, int textXPos, int textYPos, int textColor, bool centerFlag) {
int tmpRight = _string[5].right;
_string[5].xpos = textXPos;
_string[5].ypos = textYPos;
_string[5].right = rightRectClip;
_string[5].right = clipRect ? clipRect->right : _screenWidth - 1;
_string[5].center = centerFlag;
_string[5].color = textColor;
_string[5].charset = 1;
+4 -3
View File
@@ -164,8 +164,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
setTimerAndShakeFrequency();
memset(_savegameNames, 0, sizeof(_savegameNames));
camera.reset();
memset(_colorCycle, 0, sizeof(_colorCycle));
memset(_colorUsedByCycle, 0, sizeof(_colorUsedByCycle));
@@ -810,7 +808,9 @@ ScummEngine_v7::ScummEngine_v7(OSystem *syst, const DetectorResult &dr)
_textV7 = NULL;
_newTextRenderStyle = (_game.version == 8 || _language == Common::JA_JPN || _language == Common::KO_KOR || _language == Common::ZH_TWN);
_defaultTextClipRect = Common::Rect(_screenWidth, _screenHeight);
_wrappedTextClipRect = _newTextRenderStyle ? Common::Rect(10, 10, _screenWidth - 10, _screenHeight - 10) : Common::Rect(_screenWidth, _screenHeight);
_wrappedTextClipRect = _newTextRenderStyle ? Common::Rect(10, 10, _screenWidth - 10, _screenHeight - 10) : Common::Rect(_screenWidth, _screenHeight);
_guiStringTransBuff = new byte[512];
_game.features |= GF_NEW_COSTUMES;
}
@@ -823,6 +823,7 @@ ScummEngine_v7::~ScummEngine_v7() {
delete _insane;
delete _textV7;
delete[] _guiStringTransBuff;
free(_languageBuffer);
free(_languageIndex);
+3 -7
View File
@@ -446,14 +446,10 @@ struct InternalGUIControl {
int highlightedTextColor;
int highlightedFillColor;
bool centerText;
const char *label;
Common::String label;
bool doubleLinesFlag;
};
struct GUISaveGameLabel {
char label[40];
};
/**
* Base class for all SCUMM engines.
*/
@@ -622,7 +618,7 @@ protected:
const char _arrowUp[2] = {'\x18', '\0'};
const char _arrowDown[2] = {'\x19', '\0'};
GUISaveGameLabel _savegameNames[9];
Common::StringArray _savegameNames;
int _menuPage = 0;
int _mainMenuSavegameLabel = 1;
int _curDisplayedSaveSlotPage = 0;
@@ -673,7 +669,7 @@ protected:
void waitForBannerInput(int32 waitTime, Common::KeyState &ks, bool &leftBtnClicked, bool &rightBtnClicked);
virtual int getGUIStringHeight(const char *str);
virtual int getGUIStringWidth(const char *str);
virtual void drawGUIText(const char *buttonString, int textXPos, int textYPos, int rightRectClip, int textColor, bool centerFlag);
virtual void drawGUIText(const char *buttonString, Common::Rect *clipRect, int textXPos, int textYPos, int textColor, bool centerFlag);
void getSliderString(int stringId, int value, char *sliderString, int size);
virtual int getMusicVolume();
virtual int getSpeechVolume();
+4 -2
View File
@@ -133,7 +133,7 @@ protected:
void createTextRenderer(GlyphRenderer_v7 *gr) override;
void enqueueText(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags);
void drawTextImmediately(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags);
void drawTextImmediately(const byte *text, Common::Rect *clipRect, int x, int y, byte color, byte charset, TextStyleFlags flags);
void drawBlastTexts() override;
void showMessageDialog(const byte *msg) override;
@@ -147,7 +147,7 @@ protected:
const char *getGUIString(int stringId) override;
int getGUIStringHeight(const char *str) override;
int getGUIStringWidth(const char *str) override;
void drawGUIText(const char *buttonString, int textXPos, int textYPos, int rightRectClip, int textColor, bool centerFlag) override;
void drawGUIText(const char *buttonString, Common::Rect *clipRect, int textXPos, int textYPos, int textColor, bool centerFlag) override;
int getMusicVolume() override;
int getSpeechVolume() override;
int getSFXVolume() override;
@@ -179,6 +179,8 @@ protected:
int _blastTextQueuePos;
BlastText _blastTextQueue[50];
byte *_guiStringTransBuff = nullptr;
};
+2 -2
View File
@@ -436,11 +436,11 @@ void ScummEngine_v7::enqueueText(const byte *text, int x, int y, byte color, byt
bt.flags = flags;
}
void ScummEngine_v7::drawTextImmediately(const byte *text, int x, int y, byte color, byte charset, TextStyleFlags flags) {
void ScummEngine_v7::drawTextImmediately(const byte *text, Common::Rect *clipRect, int x, int y, byte color, byte charset, TextStyleFlags flags) {
// This function allows for a string to be immediately
// drawn on the screen without having to enqueueing it.
byte msg[256];
Common::Rect rect = _defaultTextClipRect;
Common::Rect rect = clipRect ? *clipRect : _defaultTextClipRect;
int effX = x;
TextStyleFlags effFlags = flags;
VirtScreen *vs = &_virtscr[kMainVirtScreen];