[Scummvm-git-logs] scummvm master -> de0a322adbbf56a4bc6c7d7c6b5c4c82bec929cd

bluegr noreply at scummvm.org
Tue Apr 22 07:52:05 UTC 2025


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

Summary:
72fcc8fbfd SKY: Add support for hebrew translation
7d70f76ce3 SKY: Detect fanmade hebrew version
b6f202c3e6 SKY: Display right aligned text
de0a322adb SKY: Use cleaner iteration syntax


Commit: 72fcc8fbfd796b5cb9c6342d582e1827e7f1d4fb
    https://github.com/scummvm/scummvm/commit/72fcc8fbfd796b5cb9c6342d582e1827e7f1d4fb
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2025-04-22T10:52:00+03:00

Commit Message:
SKY: Add support for hebrew translation

Changed paths:
    engines/sky/control.cpp
    engines/sky/control.h
    engines/sky/detection.cpp
    engines/sky/sky.cpp
    engines/sky/sky.h
    engines/sky/skydefs.h
    engines/sky/text.cpp


diff --git a/engines/sky/control.cpp b/engines/sky/control.cpp
index de19396c04b..14e6b6541ea 100644
--- a/engines/sky/control.cpp
+++ b/engines/sky/control.cpp
@@ -568,6 +568,11 @@ uint16 Control::handleClick(ConResource *pButton) {
 		strncpy(restart, "Hobaq irpa?", 50);
 	}
 
+	if (Common::parseLanguage(ConfMan.get("language")) == Common::HE_ISR) {
+		strncpy(quitDos, "\x89\x96\x89\x80\x84 \x80\x8c SOD?", 50);
+		strncpy(restart, "\x84\x9a\x87\x8c\x84 \x8e\x87\x83\x99?", 50);
+	}
+
 	switch (pButton->_onClick) {
 	case DO_NOTHING:
 		return 0;
@@ -1624,6 +1629,9 @@ void Control::showGameQuitMsg() {
 	} else if (SkyEngine::_systemVars->language == SKY_CHINESE_TRADITIONAL) { // Not translated in original
 		_skyText->displayText(_quitTexts[0], sizeof(_quitTexts[0]), textBuf1, true, 320, 255);
 		_skyText->displayText(_quitTexts[1], sizeof(_quitTexts[1]), textBuf2, true, 320, 255);
+	} else if (Common::parseLanguage(ConfMan.get("language")) == Common::HE_ISR) {
+		_skyText->displayText(_quitTexts[SKY_HEBREW * 2 + 0], sizeof(_quitTexts[SKY_HEBREW * 2 + 0]), textBuf1, true, 320, 255);
+		_skyText->displayText(_quitTexts[SKY_HEBREW * 2 + 1], sizeof(_quitTexts[SKY_HEBREW * 2 + 1]), textBuf2, true, 320, 255);
 	} else {
 		_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 0], sizeof(_quitTexts[SkyEngine::_systemVars->language * 2 + 0]), textBuf1, true, 320, 255);
 		_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 1], sizeof(_quitTexts[SkyEngine::_systemVars->language * 2 + 1]), textBuf2, true, 320, 255);
@@ -1648,7 +1656,7 @@ void Control::showGameQuitMsg() {
 	free(textBuf2);
 }
 
-char Control::_quitTexts[18][35] = {
+char Control::_quitTexts[20][45] = {
 	"Game over player one",
 	"BE VIGILANT",
 	"Das Spiel ist aus.",
@@ -1666,7 +1674,9 @@ char Control::_quitTexts[18][35] = {
 	"Game over player one",
 	"BE VIGILANT",
 	"Irpa okohseha, irpok 1",
-	"JYD\x96 JDITELEH"
+	"JYD\x96 JDITELEH",
+	"\x84\x8E\x99\x87\x97 \x90\x82\x8e\x98 \x99\x87\x97\x8F \x8E\x91\x94\x98 \x80\x87\x9A",
+	"\x84\x89\x85 \x92\x98\x90\x89\x89\x8D"
 };
 
 uint8 Control::_crossImg[594] = {
diff --git a/engines/sky/control.h b/engines/sky/control.h
index b3cb5d326ca..2a32cbe8487 100644
--- a/engines/sky/control.h
+++ b/engines/sky/control.h
@@ -296,7 +296,7 @@ private:
 
 	ControlStatus *_statusBar;
 
-	static char _quitTexts[18][35];
+	static char _quitTexts[20][45];
 	static uint8 _crossImg[594];
 };
 
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index 33fab820e9b..426fb3ff55d 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -192,7 +192,7 @@ DetectedGames SkyMetaEngineDetection::detectGames(const Common::FSList &fslist,
 			game = DetectedGame(getName(), skySetting.gameId, skySetting.description, lang, Common::kPlatformDOS, extra);
 			game.setGUIOptions(sv->guioptions);
 		} else {
-			game = DetectedGame(getName(), skySetting.gameId, skySetting.description);
+			game = DetectedGame(getName(), skySetting.gameId, skySetting.description, lang);
 		}
 
 		if (lang == Common::Language::UNK_LANG) {
diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp
index eb4e8b64a33..003d78d49af 100644
--- a/engines/sky/sky.cpp
+++ b/engines/sky/sky.cpp
@@ -85,6 +85,7 @@ SkyEngine::SkyEngine(OSystem *syst)
 	_systemVars->currentMusic   = 0;
 	_systemVars->pastIntro      = false;
 	_systemVars->paused         = false;
+	_systemVars->textDirRTL     = false;
 
 	memset (_chineseTraditionalOffsets, 0, sizeof(_chineseTraditionalOffsets));
 	_chineseTraditionalBlock = nullptr;
@@ -428,6 +429,9 @@ Common::Error SkyEngine::init() {
 	case Common::ZH_TWN:
 		_systemVars->language = SKY_CHINESE_TRADITIONAL;
 		break;
+	case Common::HE_ISR:
+		_systemVars->textDirRTL = true;
+		break;
 
 	default:
 		_systemVars->language = SKY_ENGLISH;
diff --git a/engines/sky/sky.h b/engines/sky/sky.h
index a67cd023529..51fcc649d0d 100644
--- a/engines/sky/sky.h
+++ b/engines/sky/sky.h
@@ -49,6 +49,7 @@ struct SystemVars {
 	uint16 currentMusic;
 	bool pastIntro;
 	bool paused;
+	bool textDirRTL;
 };
 
 class Sound;
diff --git a/engines/sky/skydefs.h b/engines/sky/skydefs.h
index 57a49b15506..4788fb4687f 100644
--- a/engines/sky/skydefs.h
+++ b/engines/sky/skydefs.h
@@ -45,6 +45,7 @@ namespace Sky {
 #define SKY_PORTUGUESE	6
 #define SKY_SPANISH		7
 #define SKY_RUSSIAN		8
+#define SKY_HEBREW		9
 // Special treatment
 #define SKY_CHINESE_TRADITIONAL	0x7f
 
diff --git a/engines/sky/text.cpp b/engines/sky/text.cpp
index 6f4455dd93f..aa3915e4c34 100644
--- a/engines/sky/text.cpp
+++ b/engines/sky/text.cpp
@@ -357,6 +357,8 @@ DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, bool
 	uint32 *centerTblPtr = centerTable;
 
 	do {
+		Common::String line("");
+
 		byte *lineEnd = curDest + pixelWidth;
 		if (center) {
 			uint32 width = (pixelWidth - *centerTblPtr) >> 1;
@@ -379,10 +381,20 @@ DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, bool
 				textChar = '?';
 			}
 
-			makeGameCharacter(textChar - 0x20, _characterSet, curDest, color, pixelWidth);
+			line += textChar - 0x20;
 			textChar = *curPos++;
 		}
 
+		if (_vm->_systemVars->textDirRTL) {
+			for (int i = line.size() - 1; i >= 0; --i) {
+				makeGameCharacter(line[i], _characterSet, curDest, color, pixelWidth);
+			}
+		} else {
+			for (auto it = line.begin(); it != line.end(); ++it) {
+				makeGameCharacter(*it, _characterSet, curDest, color, pixelWidth);
+			}
+		}
+
 		prevDest = curDest = prevDest + dtLineSize;	//start of last line + start of next
 
 	} while (textChar >= 10);


Commit: 7d70f76ce3a8662ff56048128c5dcace0c4c77b9
    https://github.com/scummvm/scummvm/commit/7d70f76ce3a8662ff56048128c5dcace0c4c77b9
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2025-04-22T10:52:00+03:00

Commit Message:
SKY: Detect fanmade hebrew version

Changed paths:
    engines/sky/detection.cpp


diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index 426fb3ff55d..a23f057a74c 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -140,7 +140,7 @@ DetectedGames SkyMetaEngineDetection::detectGames(const Common::FSList &fslist,
 				if (dataDisk.open(*file)) {
 					hasSkyDsk = true;
 					dataDiskSize = dataDisk.size();
-					if (dataDiskSize == 73123264)
+					if (dataDiskSize == 73123264 || dataDiskSize == 75893200)
 						dataDiskHeadMD5 = Common::computeStreamMD5AsString(dataDisk, 5000);
 				}
 			}
@@ -185,6 +185,8 @@ DetectedGames SkyMetaEngineDetection::detectGames(const Common::FSList &fslist,
 		Common::Language lang = Common::Language::UNK_LANG;
 		if (dataDiskSize == 73123264 && dataDiskHeadMD5 == "886d6faecd97488be09b73f4f87b92d9")
 			lang = Common::Language::RU_RUS;
+		if (dataDiskSize == 75893200 && dataDiskHeadMD5 == "886d6faecd97488be09b73f4f87b92d9")
+			lang = Common::Language::HE_ISR;
 
 		if (sv->dinnerTableEntries) {
 			Common::String extra = Common::String::format("v0.0%d %s", sv->version, sv->extraDesc);


Commit: b6f202c3e6bf9cc7bcfc357f5658034f0e95b6e2
    https://github.com/scummvm/scummvm/commit/b6f202c3e6bf9cc7bcfc357f5658034f0e95b6e2
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2025-04-22T10:52:00+03:00

Commit Message:
SKY: Display right aligned text

Changed paths:
    engines/sky/control.cpp
    engines/sky/intro.cpp
    engines/sky/logic.cpp
    engines/sky/text.cpp
    engines/sky/text.h


diff --git a/engines/sky/control.cpp b/engines/sky/control.cpp
index 14e6b6541ea..db438a086d6 100644
--- a/engines/sky/control.cpp
+++ b/engines/sky/control.cpp
@@ -176,7 +176,7 @@ void ControlStatus::setToText(const char *newText) {
 		_statusText->flushForRedraw();
 		free(_textData);
 	}
-	DisplayedText disText = _skyText->displayText(tmpLine, sizeof(tmpLine), NULL, true, STATUS_WIDTH, 255);
+	DisplayedText disText = _skyText->displayText(tmpLine, sizeof(tmpLine), NULL, Graphics::kTextAlignCenter, STATUS_WIDTH, 255);
 	_textData = (DataFileHeader *)disText.textData;
 	_statusText->setSprite(_textData);
 	_statusText->drawToScreen(WITH_MASK);
@@ -184,7 +184,7 @@ void ControlStatus::setToText(const char *newText) {
 
 void ControlStatus::setToText(uint16 textNum) {
 	free(_textData);
-	DisplayedText disText = _skyText->displayText(textNum, NULL, true, STATUS_WIDTH, 255);
+	DisplayedText disText = _skyText->displayText(textNum, NULL, Graphics::kTextAlignCenter, STATUS_WIDTH, 255);
 	_textData = (DataFileHeader *)disText.textData;
 	_statusText->setSprite(_textData);
 	_statusText->drawToScreen(WITH_MASK);
@@ -359,6 +359,9 @@ void Control::buttonControl(ConResource *pButton) {
 	if (Common::parseLanguage(ConfMan.get("language")) == Common::RU_RUS)
 		strncpy(autoSave, "Zarpyzit/ abtocoxpahehie", 50);
 
+	if (Common::parseLanguage(ConfMan.get("language")) == Common::HE_ISR)
+		strncpy(autoSave, "\x99\x87\x86\x85\x98 \x99\x8e\x89\x98\x84 \x80\x85\x88\x85\x8e\x88\x89\x9a", 50);
+
 	if (pButton == NULL) {
 		free(_textSprite);
 		_textSprite = NULL;
@@ -373,9 +376,9 @@ void Control::buttonControl(ConResource *pButton) {
 		if (pButton->_text) {
 			DisplayedText textRes;
 			if (pButton->_text == 0xFFFF) // text for autosave button
-				textRes = _skyText->displayText(autoSave, sizeof(autoSave), NULL, false, PAN_LINE_WIDTH, 255);
+				textRes = _skyText->displayText(autoSave, sizeof(autoSave), NULL, Graphics::kTextAlignLeft, PAN_LINE_WIDTH, 255);
 			else
-				textRes = _skyText->displayText(pButton->_text, NULL, false, PAN_LINE_WIDTH, 255);
+				textRes = _skyText->displayText(pButton->_text, NULL, Graphics::kTextAlignLeft, PAN_LINE_WIDTH, 255);
 			_textSprite = (DataFileHeader *)textRes.textData;
 			_text->setSprite(_textSprite);
 		} else
@@ -655,7 +658,7 @@ bool Control::getYesNo(char *text, uint bufSize) {
 
 	_yesNo->drawToScreen(WITH_MASK);
 	if (text) {
-		DisplayedText dlgLtm = _skyText->displayText(text, bufSize, NULL, true, _yesNo->_spriteData->s_width - 8, 37);
+		DisplayedText dlgLtm = _skyText->displayText(text, bufSize, NULL, Graphics::kTextAlignCenter, _yesNo->_spriteData->s_width - 8, 37);
 		dlgTextDat = (DataFileHeader *)dlgLtm.textData;
 		textY = MPNL_Y + 44 + (28 - dlgTextDat->s_height) / 2;
 	} else
@@ -1072,7 +1075,7 @@ void Control::setUpGameSprites(const Common::StringArray &saveGameNames, DataFil
 	char cursorChar[2] = "-";
 	DisplayedText textSpr;
 	if (!nameSprites[MAX_ON_SCREEN]) {
-		textSpr = _skyText->displayText(cursorChar, sizeof(cursorChar), NULL, false, 15, 0);
+		textSpr = _skyText->displayText(cursorChar, sizeof(cursorChar), NULL, Graphics::kTextAlignLeft, 15, 0);
 		nameSprites[MAX_ON_SCREEN] = (DataFileHeader *)textSpr.textData;
 	}
 	for (uint16 cnt = 0; cnt < MAX_ON_SCREEN; cnt++) {
@@ -1080,10 +1083,10 @@ void Control::setUpGameSprites(const Common::StringArray &saveGameNames, DataFil
 
 		if (firstNum + cnt == selectedGame) {
 			Common::sprintf_s(nameBuf, "%3d: %s", firstNum + cnt + 1, dirtyString.c_str());
-			textSpr = _skyText->displayText(nameBuf, sizeof(nameBuf), NULL, false, PAN_LINE_WIDTH, 0);
+			textSpr = _skyText->displayText(nameBuf, sizeof(nameBuf), NULL, Graphics::kTextAlignStart, PAN_LINE_WIDTH, 0);
 		} else {
 			Common::sprintf_s(nameBuf, "%3d: %s", firstNum + cnt + 1, saveGameNames[firstNum + cnt].c_str());
-			textSpr = _skyText->displayText(nameBuf, sizeof(nameBuf), NULL, false, PAN_LINE_WIDTH, 37);
+			textSpr = _skyText->displayText(nameBuf, sizeof(nameBuf), NULL, Graphics::kTextAlignStart, PAN_LINE_WIDTH, 37);
 		}
 		nameSprites[cnt] = (DataFileHeader *)textSpr.textData;
 		if (firstNum + cnt == selectedGame) {
@@ -1624,17 +1627,17 @@ void Control::showGameQuitMsg() {
 	screenData = _skyScreen->giveCurrent();
 
 	if (Common::parseLanguage(ConfMan.get("language")) == Common::RU_RUS) {
-		_skyText->displayText(_quitTexts[8 * 2 + 0], sizeof(_quitTexts[8 * 2 + 0]), textBuf1, true, 320, 255);
-		_skyText->displayText(_quitTexts[8 * 2 + 1], sizeof(_quitTexts[8 * 2 + 1]), textBuf2, true, 320, 255);
+		_skyText->displayText(_quitTexts[8 * 2 + 0], sizeof(_quitTexts[8 * 2 + 0]), textBuf1, Graphics::kTextAlignCenter, 320, 255);
+		_skyText->displayText(_quitTexts[8 * 2 + 1], sizeof(_quitTexts[8 * 2 + 1]), textBuf2, Graphics::kTextAlignCenter, 320, 255);
 	} else if (SkyEngine::_systemVars->language == SKY_CHINESE_TRADITIONAL) { // Not translated in original
-		_skyText->displayText(_quitTexts[0], sizeof(_quitTexts[0]), textBuf1, true, 320, 255);
-		_skyText->displayText(_quitTexts[1], sizeof(_quitTexts[1]), textBuf2, true, 320, 255);
+		_skyText->displayText(_quitTexts[0], sizeof(_quitTexts[0]), textBuf1, Graphics::kTextAlignCenter, 320, 255);
+		_skyText->displayText(_quitTexts[1], sizeof(_quitTexts[1]), textBuf2, Graphics::kTextAlignCenter, 320, 255);
 	} else if (Common::parseLanguage(ConfMan.get("language")) == Common::HE_ISR) {
-		_skyText->displayText(_quitTexts[SKY_HEBREW * 2 + 0], sizeof(_quitTexts[SKY_HEBREW * 2 + 0]), textBuf1, true, 320, 255);
-		_skyText->displayText(_quitTexts[SKY_HEBREW * 2 + 1], sizeof(_quitTexts[SKY_HEBREW * 2 + 1]), textBuf2, true, 320, 255);
+		_skyText->displayText(_quitTexts[SKY_HEBREW * 2 + 0], sizeof(_quitTexts[SKY_HEBREW * 2 + 0]), textBuf1, Graphics::kTextAlignCenter, 320, 255);
+		_skyText->displayText(_quitTexts[SKY_HEBREW * 2 + 1], sizeof(_quitTexts[SKY_HEBREW * 2 + 1]), textBuf2, Graphics::kTextAlignCenter, 320, 255);
 	} else {
-		_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 0], sizeof(_quitTexts[SkyEngine::_systemVars->language * 2 + 0]), textBuf1, true, 320, 255);
-		_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 1], sizeof(_quitTexts[SkyEngine::_systemVars->language * 2 + 1]), textBuf2, true, 320, 255);
+		_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 0], sizeof(_quitTexts[SkyEngine::_systemVars->language * 2 + 0]), textBuf1, Graphics::kTextAlignCenter, 320, 255);
+		_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 1], sizeof(_quitTexts[SkyEngine::_systemVars->language * 2 + 1]), textBuf2, Graphics::kTextAlignCenter, 320, 255);
 	}
 	uint8 *curLine1 = textBuf1 + sizeof(DataFileHeader);
 	uint8 *curLine2 = textBuf2 + sizeof(DataFileHeader);
diff --git a/engines/sky/intro.cpp b/engines/sky/intro.cpp
index 4014d2d4b96..f134065be31 100644
--- a/engines/sky/intro.cpp
+++ b/engines/sky/intro.cpp
@@ -845,7 +845,7 @@ bool Intro::commandFlirt(uint16 *&data) {
 			uint16 command = *data++;
 			switch (command) {
 			case IC_PREPARE_TEXT:
-				_skyText->displayText(*data++, _textBuf, true, INTRO_TEXT_WIDTH, 255);
+				_skyText->displayText(*data++, _textBuf, Graphics::kTextAlignCenter, INTRO_TEXT_WIDTH, 255);
 				break;
 			case IC_SHOW_TEXT:
 				((DataFileHeader *)_textBuf)->s_x = *data++;
diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp
index 3694137b717..c9e0b1c6764 100644
--- a/engines/sky/logic.cpp
+++ b/engines/sky/logic.cpp
@@ -1751,7 +1751,7 @@ bool Logic::fnChooser(uint32 a, uint32 b, uint32 c) {
 	while (*p) {
 		uint32 textNum = *p++;
 
-		DisplayedText lowText = _skyText->lowTextManager(textNum, GAME_SCREEN_WIDTH, 0, 241, 0);
+		DisplayedText lowText = _skyText->lowTextManager(textNum, GAME_SCREEN_WIDTH, 0, 241, Graphics::kTextAlignStart);
 
 		uint8 *data = lowText.textData;
 
@@ -2367,7 +2367,7 @@ bool Logic::fnBlankScreen(uint32 a, uint32 b, uint32 c) {
 }
 
 bool Logic::fnPrintCredit(uint32 a, uint32 b, uint32 c) {
-	DisplayedText creditText = _skyText->lowTextManager(a, 240, 0, 248, true);
+	DisplayedText creditText = _skyText->lowTextManager(a, 240, 0, 248, Graphics::kTextAlignCenter);
 	Compact *credCompact = _skyCompact->fetchCpt(creditText.compactNum);
 	credCompact->xcood = 168;
 	if ((a == 558) && (c == 215))
@@ -2379,7 +2379,7 @@ bool Logic::fnPrintCredit(uint32 a, uint32 b, uint32 c) {
 }
 
 bool Logic::fnLookAt(uint32 a, uint32 b, uint32 c) {
-	DisplayedText textInfo = _skyText->lowTextManager(a, 240, 0, 248, true);
+	DisplayedText textInfo = _skyText->lowTextManager(a, 240, 0, 248, Graphics::kTextAlignCenter);
 	Compact *textCpt = _skyCompact->fetchCpt(textInfo.compactNum);
 	textCpt->xcood = 168;
 	textCpt->ycood = (uint16)c;
@@ -2409,7 +2409,7 @@ bool Logic::fnLincTextModule(uint32 textPos, uint32 textNo, uint32 buttonAction)
 	if (buttonAction < 10)
 		_scriptVariables[LINC_DIGIT_0 + buttonAction] = textNo;
 
-	DisplayedText text = _skyText->lowTextManager(textNo, 220, 0, 215, false);
+	DisplayedText text = _skyText->lowTextManager(textNo, SkyEngine::_systemVars->textDirRTL ? 175 : 220, 0, 215, Graphics::kTextAlignStart);
 
 	Compact *textCpt = _skyCompact->fetchCpt(text.compactNum);
 
@@ -2529,7 +2529,7 @@ void Logic::stdSpeak(Compact *target, uint32 textNum, uint32 animNum, uint32 bas
 		// form the text sprite, if player wants subtitles or
 		// if we couldn't find the speech file
 		DisplayedText textInfo;
-		textInfo = _skyText->lowTextManager(textNum, FIXED_TEXT_WIDTH, 0, (uint8)target->spColor, true);
+		textInfo = _skyText->lowTextManager(textNum, FIXED_TEXT_WIDTH, 0, (uint8)target->spColor, Graphics::kTextAlignCenter);
 		Compact *textCompact = _skyCompact->fetchCpt(textInfo.compactNum);
 		target->spTextId = textInfo.compactNum;	//So we know what text to kill
 		byte *textGfx = textInfo.textData;
diff --git a/engines/sky/text.cpp b/engines/sky/text.cpp
index aa3915e4c34..7b1c921afa5 100644
--- a/engines/sky/text.cpp
+++ b/engines/sky/text.cpp
@@ -104,7 +104,7 @@ void Text::fnSetFont(uint32 fontNr) {
 void Text::fnTextModule(uint32 textInfoId, uint32 textNo) {
 	fnSetFont(1);
 	uint16* msgData = (uint16 *)_skyCompact->fetchCpt(textInfoId);
-	DisplayedText textId = lowTextManager(textNo, msgData[1], msgData[2], 209, false);
+	DisplayedText textId = lowTextManager(textNo, msgData[1], msgData[2], 209, Graphics::kTextAlignStart);
 	Logic::_scriptVariables[RESULT] = textId.compactNum;
 	Compact *textCompact = _skyCompact->fetchCpt(textId.compactNum);
 	textCompact->xcood = msgData[3];
@@ -193,7 +193,7 @@ void Text::getText(uint32 textNr) { //load text #"textNr" into textBuffer
 
 void Text::fnPointerText(uint32 pointedId, uint16 mouseX, uint16 mouseY) {
 	Compact *ptrComp = _skyCompact->fetchCpt(pointedId);
-	DisplayedText text = lowTextManager(ptrComp->cursorText, TEXT_MOUSE_WIDTH, L_CURSOR, 242, false);
+	DisplayedText text = lowTextManager(ptrComp->cursorText, TEXT_MOUSE_WIDTH, L_CURSOR, 242, Graphics::kTextAlignLeft);
 	Logic::_scriptVariables[CURSOR_ID] = text.compactNum;
 	if (Logic::_scriptVariables[MENU]) {
 		_mouseOfsY = TOP_LEFT_Y - 2;
@@ -244,14 +244,14 @@ char Text::getTextChar(uint8 **data, uint32 *bitPos) {
 	}
 }
 
-DisplayedText Text::displayText(uint32 textNum, uint8 *dest, bool center, uint16 pixelWidth, uint8 color) {
+DisplayedText Text::displayText(uint32 textNum, uint8 *dest, Graphics::TextAlign align, uint16 pixelWidth, uint8 color) {
 	//Render text into buffer *dest
 	getText(textNum);
-	return displayText(_textBuffer, sizeof(_textBuffer), dest, center, pixelWidth, color);
+	return displayText(_textBuffer, sizeof(_textBuffer), dest, align, pixelWidth, color);
 }
 
 // TODO: Don't use caller-supplied buffer for editing operations
-DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, bool center, uint16 pixelWidth, uint8 color) {
+DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, Graphics::TextAlign align, uint16 pixelWidth, uint8 color) {
 	//Render text pointed to by *textPtr in buffer *dest
 	uint32 centerTable[10];
 	uint16 lineWidth = 0;
@@ -286,7 +286,7 @@ DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, bool
 			curPos++;
 			lineWidth += Graphics::Big5Font::kChineseTraditionalWidth;
 		} else {
-			if ((_curCharSet == 1) && (textChar >= 0x80))
+			if ((_curCharSet == 1) && (textChar >= 0x80) && !SkyEngine::_systemVars->textDirRTL)
 				textChar = 0x20;
 
 			textChar -= 0x20;
@@ -356,14 +356,19 @@ DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, bool
 	byte *prevDest = curDest;
 	uint32 *centerTblPtr = centerTable;
 
+	align = Graphics::convertTextAlignH(align, _vm->_systemVars->textDirRTL);
+
 	do {
 		Common::String line("");
 
 		byte *lineEnd = curDest + pixelWidth;
-		if (center) {
+		if (align == Graphics::kTextAlignCenter) {
 			uint32 width = (pixelWidth - *centerTblPtr) >> 1;
 			centerTblPtr++;
 			curDest += width;
+		} else if (align == Graphics::kTextAlignRight) {
+			curDest += pixelWidth - *centerTblPtr - 1;
+			centerTblPtr++;
 		}
 
 		textChar = (uint8)*curPos++;
@@ -443,9 +448,9 @@ void Text::makeGameCharacter(uint8 textChar, uint8 *charSetPtr, uint8 *&dest, ui
 	dest = startPos + charWidth + _dtCharSpacing * 2 - 1;
 }
 
-DisplayedText Text::lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, bool center) {
+DisplayedText Text::lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, Graphics::TextAlign align) {
 	getText(textNum);
-	DisplayedText textInfo = displayText(_textBuffer, sizeof(_textBuffer), NULL, center, width, color);
+	DisplayedText textInfo = displayText(_textBuffer, sizeof(_textBuffer), NULL, align, width, color);
 
 	uint32 compactNum = FIRST_TEXT_COMPACT;
 	Compact *cpt = _skyCompact->fetchCpt(compactNum);
diff --git a/engines/sky/text.h b/engines/sky/text.h
index d1312e07cc3..86409ed637d 100644
--- a/engines/sky/text.h
+++ b/engines/sky/text.h
@@ -24,6 +24,7 @@
 
 
 #include "common/scummsys.h"
+#include "graphics/font.h"
 #include "sky/sky.h"
 
 namespace Sky {
@@ -49,9 +50,9 @@ class Text {
 public:
 	Text(SkyEngine *vm, Disk *skyDisk, SkyCompact *skyCompact);
 	~Text();
-	struct DisplayedText displayText(uint32 textNum, uint8 *dest, bool center, uint16 pixelWidth, uint8 color);
-	struct DisplayedText displayText(char *textPtr, uint32 bufLen, uint8 *dest, bool center, uint16 pixelWidth, uint8 color);
-	struct DisplayedText lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, bool center);
+	struct DisplayedText displayText(uint32 textNum, uint8 *dest, Graphics::TextAlign align, uint16 pixelWidth, uint8 color);
+	struct DisplayedText displayText(char *textPtr, uint32 bufLen, uint8 *dest, Graphics::TextAlign align, uint16 pixelWidth, uint8 color);
+	struct DisplayedText lowTextManager(uint32 textNum, uint16 width, uint16 logicNum, uint8 color, Graphics::TextAlign align);
 	void fnSetFont(uint32 fontNr);
 	void fnTextModule(uint32 textInfoId, uint32 textNo);
 	void fnPointerText(uint32 pointedId, uint16 mouseX, uint16 mouseY);


Commit: de0a322adbbf56a4bc6c7d7c6b5c4c82bec929cd
    https://github.com/scummvm/scummvm/commit/de0a322adbbf56a4bc6c7d7c6b5c4c82bec929cd
Author: Niv Baehr (bloop93 at gmail.com)
Date: 2025-04-22T10:52:00+03:00

Commit Message:
SKY: Use cleaner iteration syntax

Co-authored-by: Filippos Karapetis <bluegr at gmail.com>

Changed paths:
    engines/sky/text.cpp


diff --git a/engines/sky/text.cpp b/engines/sky/text.cpp
index 7b1c921afa5..048d5edfac5 100644
--- a/engines/sky/text.cpp
+++ b/engines/sky/text.cpp
@@ -395,8 +395,8 @@ DisplayedText Text::displayText(char *textPtr, uint32 bufLen, uint8 *dest, Graph
 				makeGameCharacter(line[i], _characterSet, curDest, color, pixelWidth);
 			}
 		} else {
-			for (auto it = line.begin(); it != line.end(); ++it) {
-				makeGameCharacter(*it, _characterSet, curDest, color, pixelWidth);
+			for (auto &c : line) {
+				makeGameCharacter(c, _characterSet, curDest, color, pixelWidth);
 			}
 		}
 




More information about the Scummvm-git-logs mailing list