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

sev- noreply at scummvm.org
Sun Nov 13 23:39:53 UTC 2022


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

Summary:
f07270e3ef SAGA: Support Chinese rendering for ITE
1fa22aefd0 SAGA: Support Chinese word wrapping
a143f509b1 SAGA: Change interface layout for Chinese
5b3d7332a7 SAGA: Reserve space for Chinese strings
005c6a91d3 SAGA: Add language data for Chinese ITE
396f14105c SAGA: Replace Chinese floppy language id from Simplified to Traditional
c43e8f2cec SAGA: Fix inconsistencies in big5 variable use
c61ec5664f SAGA: Fix position of asterisk in pointer declaration
e1aa80ec93 SAGA: Add TODOs for missing Chinese strings


Commit: f07270e3ef1387371607ea2ec13881b1af50d66c
    https://github.com/scummvm/scummvm/commit/f07270e3ef1387371607ea2ec13881b1af50d66c
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Support Chinese rendering for ITE

Changed paths:
    engines/saga/font.cpp
    engines/saga/font.h


diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp
index 04d7f614a6f..62c0cb0e2af 100644
--- a/engines/saga/font.cpp
+++ b/engines/saga/font.cpp
@@ -137,7 +137,7 @@ void Font::textDraw(FontId fontId, const char *text, const Common::Point &point,
 	draw(fontId, text, textLength, textPoint, color, effectColor, flags);
 }
 
-DefaultFont::DefaultFont(SagaEngine *vm) : Font(vm), _fontMapping(0) {
+DefaultFont::DefaultFont(SagaEngine *vm) : Font(vm), _fontMapping(0), _chineseFont(nullptr), _chineseFontWidth(0), _chineseFontHeight(0) {
 	int i;
 
 	// Load font module resource context
@@ -152,6 +152,9 @@ DefaultFont::DefaultFont(SagaEngine *vm) : Font(vm), _fontMapping(0) {
 #endif
 		loadFont(&_fonts[i],	_vm->getFontDescription(i)->fontResourceId);
 	}
+
+	if (_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_CHN)
+		loadChineseFontITE("ite.fnt");
 }
 
 DefaultFont::~DefaultFont() {
@@ -168,6 +171,29 @@ DefaultFont::~DefaultFont() {
 		}
 	}
 #endif
+	if (_chineseFont) {
+		delete[] _chineseFont;
+		_chineseFont = nullptr;
+	}
+}
+
+void DefaultFont::loadChineseFontITE(const Common::String& fileName) {
+	Common::File f;
+	if (!f.open(fileName))
+		return;
+	_chineseFontWidth = 16;
+	_chineseFontHeight = 14;
+	_chineseFontIndex = Common::move(Common::Array<int>(0x8000, -1));
+	size_t sz = f.size();
+	_chineseFont = new byte[sz];
+	f.read(_chineseFont, sz);
+	static const int kGlyphSize = 30;
+	for (unsigned i = 0; i < sz / kGlyphSize; i++) {
+		uint16 ch = READ_BE_UINT16(_chineseFont + kGlyphSize * i);
+		if (!(ch & 0x8000))
+			continue;
+		_chineseFontIndex[ch&0x7fff] = kGlyphSize * i + 2;
+	}
 }
 
 void DefaultFont::textDrawRect(FontId fontId, const char *text, const Common::Rect &rect, int color, int effectColor, FontEffectFlags flags) {
@@ -204,7 +230,7 @@ void DefaultFont::textDrawRect(FontId fontId, const char *text, const Common::Re
 	}
 
 	// String won't fit on one line
-	h = getHeight(fontId);
+	h = getHeight(fontId, text);
 	w_total = 0;
 	len_total = 0;
 	wc = 0;
@@ -331,7 +357,7 @@ int DefaultFont::getHeight(FontId fontId, const char *text, int width, FontEffec
 
 	textLength = getStringLength(text);
 	textWidth = getStringWidth(fontId, text, textLength, flags);
-	h = getHeight(fontId);
+	h = getHeight(fontId, text);
 	fitWidth = width;
 
 	textPoint.x = (fitWidth / 2);
@@ -415,6 +441,19 @@ void DefaultFont::draw(FontId fontId, const char *text, size_t count, const Comm
 	}
 }
 
+int DefaultFont::getHeight(FontId fontId, const char *text) {
+	int singleByteHeight = getHeight(fontId);
+	if (!_chineseFont || _chineseFontHeight < singleByteHeight)
+		return singleByteHeight;
+
+	for (const byte* textPointer = (const byte *)text; *textPointer; textPointer++)
+		if (*textPointer & 0x80)
+			return _chineseFontHeight;
+
+	return singleByteHeight;
+}
+
+
 void DefaultFont::outFont(const FontStyle &drawFont, const char *text, size_t count, const Common::Point &point, int color, FontEffectFlags flags) {
 	const byte *textPointer;
 	const byte *c_dataPointer;
@@ -442,59 +481,90 @@ void DefaultFont::outFont(const FontStyle &drawFont, const char *text, size_t co
 	textPointer = (const byte *)text;
 	ct = count;
 
+	byte isBig5 = _chineseFont ? true : false;
+
 	// Draw string one character at a time, maximum of 'draw_str'_ct
 	// characters, or no limit if 'draw_str_ct' is 0
 	for (; *textPointer && (!count || ct); textPointer++, ct--) {
+		int charWidth;
+		int charHeight;
+		int charTracking;
+		int rowLength;
+		const byte *bitmap;
 		c_code = *textPointer & 0xFFU;
 
-		// Translate character
-		if (_fontMapping == 0) {	// Check font mapping debug flag
-			// Default game behavior
-
-			// It seems that this font mapping causes problems with non-english
-			// versions of IHNM, so it has been changed to apply for ITE only.
-			// It doesn't make any difference for the English version of IHNM.
-			// Fixes bug #3405: "IHNM: Spanish font wrong".
-			if (!(flags & kFontDontmap) && _vm->getGameId() == GID_ITE) {
-				if (_vm->getLanguage() != Common::IT_ITA) {
-					c_code = translateChar(c_code);
-				} else {
-					// The in-game fonts of the Italian version should not be mapped.
-					// The ones in the intro are hardcoded and should be mapped normally.
-					if (_vm->_scene->isInIntro())
+		if ((c_code & 0x80) && isBig5) {
+			byte leading = c_code;
+			byte trailing = *++textPointer & 0xFFU;
+			ct--;
+			if (ct == 0 || trailing == 0)
+				break;
+			int idx = _chineseFontIndex[((leading & 0x7f) << 8) | trailing];
+			if (idx < 0) {
+				textPoint.x += _chineseFontWidth;
+				continue;
+			}
+			charWidth = _chineseFontWidth;
+			charHeight = _chineseFontHeight;
+			rowLength = _chineseFontWidth / 8;
+			charTracking = _chineseFontWidth;
+			bitmap = _chineseFont + idx;
+		} else {
+			// Translate character
+			if (_fontMapping == 0) {	// Check font mapping debug flag
+				// Default game behavior
+
+				// It seems that this font mapping causes problems with non-english
+				// versions of IHNM, so it has been changed to apply for ITE only.
+				// It doesn't make any difference for the English version of IHNM.
+				// Fixes bug #3405: "IHNM: Spanish font wrong".
+				if (!(flags & kFontDontmap) && _vm->getGameId() == GID_ITE) {
+					if (_vm->getLanguage() != Common::IT_ITA) {
 						c_code = translateChar(c_code);
+					} else {
+						// The in-game fonts of the Italian version should not be mapped.
+						// The ones in the intro are hardcoded and should be mapped normally.
+						if (_vm->_scene->isInIntro())
+							c_code = translateChar(c_code);
+					}
 				}
+			} else if (_fontMapping == 1) {
+				// Force font mapping
+				c_code = translateChar(c_code);
+			} else {
+				// In all other cases, ignore font mapping
 			}
-		} else if (_fontMapping == 1) {
-			// Force font mapping
-			c_code = translateChar(c_code);
-		} else {
-			// In all other cases, ignore font mapping
-		}
-		assert(c_code < FONT_CHARCOUNT);
+			assert(c_code < FONT_CHARCOUNT);
 
-		// Check if character is defined
-		if ((drawFont.fontCharEntry[c_code].index == 0) && (c_code != FONT_FIRSTCHAR)) {
+			// Check if character is defined
+			if ((drawFont.fontCharEntry[c_code].index == 0) && (c_code != FONT_FIRSTCHAR)) {
 #if FONT_SHOWUNDEFINED
-			// A tab character appears in the IHNM demo instructions screen, so filter
-			// it out here
-			if (c_code == FONT_CH_SPACE || c_code == FONT_CH_TAB) {
+				// A tab character appears in the IHNM demo instructions screen, so filter
+				// it out here
+				if (c_code == FONT_CH_SPACE || c_code == FONT_CH_TAB) {
+					textPoint.x += drawFont.fontCharEntry[c_code].tracking;
+					continue;
+				}
+				c_code = FONT_CH_QMARK;
+#else
+				// Character code is not defined, but advance tracking
+				// ( Not defined if offset is 0, except for 33 ('!') which
+				//   is defined )
 				textPoint.x += drawFont.fontCharEntry[c_code].tracking;
 				continue;
-			}
-			c_code = FONT_CH_QMARK;
-#else
-			// Character code is not defined, but advance tracking
-			// ( Not defined if offset is 0, except for 33 ('!') which
-			//   is defined )
-			textPoint.x += drawFont.fontCharEntry[c_code].tracking;
-			continue;
 #endif
+			}
+
+			charWidth = drawFont.fontCharEntry[c_code].width;
+			charHeight = drawFont.header.charHeight;
+			rowLength = drawFont.header.rowLength;
+			bitmap = &drawFont.font[drawFont.fontCharEntry[c_code].index];
+			charTracking = drawFont.fontCharEntry[c_code].tracking;
 		}
 
 		// Get length of character in bytes
-		c_byte_len = ((drawFont.fontCharEntry[c_code].width - 1) / 8) + 1;
-		rowLimit = (_vm->_gfx->getBackBufferHeight() < (textPoint.y + drawFont.header.charHeight)) ? _vm->_gfx->getBackBufferHeight() : textPoint.y + drawFont.header.charHeight;
+		c_byte_len = ((charWidth - 1) / 8) + 1;
+		rowLimit = (_vm->_gfx->getBackBufferHeight() < (textPoint.y + charHeight)) ? _vm->_gfx->getBackBufferHeight() : textPoint.y + charHeight;
 		charRow = 0;
 
 		for (row = textPoint.y; row < rowLimit; row++, charRow++) {
@@ -512,7 +582,7 @@ void DefaultFont::outFont(const FontStyle &drawFont, const char *text, size_t co
 				break;
 			}
 
-			c_dataPointer = &drawFont.font[charRow * drawFont.header.rowLength + drawFont.fontCharEntry[c_code].index];
+			c_dataPointer = bitmap + charRow * rowLength;
 
 			for (c_byte = 0; c_byte < c_byte_len; c_byte++, c_dataPointer++) {
 				// Check each bit, draw pixel if bit is set
@@ -526,7 +596,7 @@ void DefaultFont::outFont(const FontStyle &drawFont, const char *text, size_t co
 		} // end per-row processing
 
 		// Advance tracking position
-		textPoint.x += drawFont.fontCharEntry[c_code].tracking;
+		textPoint.x += charTracking;
 	} // end per-character processing
 
 	rowLimit = (_vm->_gfx->getBackBufferHeight() < (textPoint.y + drawFont.header.charHeight)) ? _vm->_gfx->getBackBufferHeight() : textPoint.y + drawFont.header.charHeight;
diff --git a/engines/saga/font.h b/engines/saga/font.h
index 373eea43902..dff472db650 100644
--- a/engines/saga/font.h
+++ b/engines/saga/font.h
@@ -217,6 +217,8 @@ class DefaultFont : public Font {
 		 return getFont(fontId)->normal.header.charHeight;
 	 }
 
+	 int getHeight(FontId fontId, const char *text);
+
 	 void validate(FontId fontId) {
 		 if (!valid(fontId)) {
 			 error("Font::validate: Invalid font id");
@@ -235,6 +237,7 @@ class DefaultFont : public Font {
 	 void draw(FontId fontId, const char *text, size_t count, const Common::Point &point, int color, int effectColor, FontEffectFlags flags) override;
 	 void outFont(const FontStyle &drawFont, const char *text, size_t count, const Common::Point &point, int color, FontEffectFlags flags);
 	 void loadFont(FontData *font, uint32 fontResourceId);
+	 void loadChineseFontITE(const Common::String& fileName);
 	 void createOutline(FontData *font);
 
 	 int getByteLen(int numBits) const {
@@ -251,6 +254,11 @@ class DefaultFont : public Font {
 
 	Common::Array<FontData> _fonts;
 	int _fontMapping;
+
+	byte *_chineseFont;
+	Common::Array<int> _chineseFontIndex;
+	int _chineseFontWidth;
+	int _chineseFontHeight;
 };
 
 class SJISFont : public Font {


Commit: 1fa22aefd07161da53622ba97e678b2ccea43eeb
    https://github.com/scummvm/scummvm/commit/1fa22aefd07161da53622ba97e678b2ccea43eeb
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Support Chinese word wrapping

Changed paths:
    engines/saga/font.cpp


diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp
index 62c0cb0e2af..8f314b535b9 100644
--- a/engines/saga/font.cpp
+++ b/engines/saga/font.cpp
@@ -240,8 +240,18 @@ void DefaultFont::textDrawRect(FontId fontId, const char *text, const Common::Re
 	searchPointer = text;
 	endPointer = text + textLength;
 
+	bool isBig5 = !!_chineseFont;
+
 	for (;;) {
-		foundPointer = strchr(searchPointer, ' ');
+		if (isBig5) {
+			if (*searchPointer & 0x80)
+				foundPointer = searchPointer + 2;
+			else if (*searchPointer)
+				foundPointer = searchPointer + 1;
+			else
+				foundPointer = nullptr;
+		} else
+			foundPointer = strchr(searchPointer, ' ');
 		if (foundPointer == nullptr) {
 			// Ran to the end of the buffer
 			len = endPointer - measurePointer;
@@ -301,7 +311,10 @@ void DefaultFont::textDrawRect(FontId fontId, const char *text, const Common::Re
 					effectColor, flags);
 				return;
 			}
-			searchPointer = measurePointer + 1;
+			if (isBig5 && (*measurePointer & 0x80))
+				searchPointer = measurePointer + 2;
+			else
+				searchPointer = measurePointer + 1;
 		}
 	}
 }
@@ -324,9 +337,19 @@ int DefaultFont::getStringWidth(FontId fontId, const char *text, size_t count, F
 	const byte *txt;
 	FontData *font = getFont(fontId);
 	txt = (const byte *) text;
+	byte isBig5 = _chineseFont ? true : false;
 
 	for (ct = count; *txt && (!count || ct > 0); txt++, ct--) {
 		ch = *txt & 0xFFU;
+		if ((ch & 0x80) && isBig5) {
+			byte trailing = *++txt & 0xFFU;
+			ct--;
+			if (ct == 0 || trailing == 0)
+				break;
+			width += _chineseFontWidth;
+			continue;
+		}
+
 		// Translate character
 		ch = translateChar(ch);
 		assert(ch < FONT_CHARCOUNT);


Commit: a143f509b16d72cca10a30afd1b968be82df2ff0
    https://github.com/scummvm/scummvm/commit/a143f509b16d72cca10a30afd1b968be82df2ff0
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Change interface layout for Chinese

This changes the interface to be more in line with the original

Changed paths:
    engines/saga/displayinfo.h
    engines/saga/interface.cpp
    engines/saga/metaengine.cpp


diff --git a/engines/saga/displayinfo.h b/engines/saga/displayinfo.h
index aa84fef506d..920642d5843 100644
--- a/engines/saga/displayinfo.h
+++ b/engines/saga/displayinfo.h
@@ -156,6 +156,29 @@ static PanelButton ITE_MainPanelButtons[] = {
 	{kPanelButtonInventory,	181 + 32*3,27,	27,18,	7,'-',0,	0,0,0}
 };
 
+static PanelButton ITE_MainPanelButtons_ZH[] = {
+	{kPanelButtonVerb,		52,0,	36,14,	kVerbITEWalkTo,'w',0,	0,1,0},
+	{kPanelButtonVerb,		52,14,	36,14,	kVerbITELookAt,'l',0,	2,3,0},
+	{kPanelButtonVerb,		52,28,	36,14,	kVerbITEPickUp,'p',0,	4,5,0},
+	{kPanelButtonVerb,		88,0,	36,14,	kVerbITETalkTo,'t',0,	0,1,0},
+	{kPanelButtonVerb,		88,14,	36,14,	kVerbITEOpen,'o',0,	6,7,0},
+	{kPanelButtonVerb,		88,28,	36,14,	kVerbITEClose,'c',0,	8,9,0},
+	{kPanelButtonVerb,		124,0,	36,14,	kVerbITEUse,'u',0,		10,11,0},
+	{kPanelButtonVerb,		124,14,	36,14,	kVerbITEGive,'g',0,	12,13,0},
+	{kPanelButtonArrow,		306,6,	8,5,	-1,'U',0,			0,4,2},
+	{kPanelButtonArrow,		306,41,	8,5,	1,'D',0,			1,5,3},
+
+	{kPanelButtonInventory,	181 + 32*0,2,	27,18,	0,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*1,2,	27,18,	1,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*2,2,	27,18,	2,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*3,2,	27,18,	3,'-',0,	0,0,0},
+
+	{kPanelButtonInventory,	181 + 32*0,23,	27,18,	4,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*1,23,	27,18,	5,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*2,23,	27,18,	6,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*3,23,	27,18,	7,'-',0,	0,0,0}
+};
+
 static PanelButton ITE_ConversePanelButtons[] = {
 	{kPanelButtonConverseText,	52,6 + ITE_CONVERSE_TEXT_HEIGHT * 0, ITE_CONVERSE_MAX_TEXT_WIDTH,ITE_CONVERSE_TEXT_HEIGHT,	0,'1',0,	0,0,0},
 	{kPanelButtonConverseText,	52,6 + ITE_CONVERSE_TEXT_HEIGHT * 1, ITE_CONVERSE_MAX_TEXT_WIDTH,ITE_CONVERSE_TEXT_HEIGHT,	1,'2',0,	0,0,0},
@@ -276,6 +299,70 @@ static const GameDisplayInfo ITE_DisplayInfo = {
 	ITE_ProtectPanelButtons
 };
 
+static const GameDisplayInfo ITE_DisplayInfo_ZH = {
+	320, 200,		// logical width&height
+
+	35,				// scene path y offset
+	137,			// scene height
+
+	0,				// status x offset
+	137,			// status y offset
+	320,			// status width
+	15,				// status height
+	0,				// status text y offset
+	186,			// status text color
+	15,				// status BG color
+	308,137,		// save reminder pos
+	12,12,			// save reminder w & h
+	6,				// save reminder first sprite number
+	2,				// number of save reminder sprites
+
+	5, 0,			// left portrait x, y offset
+	274, 0,			// right portrait x, y offset
+
+	8, 9,			// inventory Up & Down button indexes
+	2, 4,			// inventory rows, columns
+
+	0, 152,			// main panel offsets
+	ARRAYSIZE(ITE_MainPanelButtons_ZH),
+	ITE_MainPanelButtons_ZH,
+
+	ITE_CONVERSE_MAX_TEXT_WIDTH,
+	ITE_CONVERSE_TEXT_HEIGHT,
+	ITE_CONVERSE_TEXT_LINES,
+	4, 5,			// converse Up & Down button indexes
+	0, 148,			// converse panel offsets
+	ARRAYSIZE(ITE_ConversePanelButtons),
+	ITE_ConversePanelButtons,
+
+	8, 0,			// save file index
+	8,				// optionSaveFileVisible
+	8, 8,			// option panel offsets
+	ARRAYSIZE(ITE_OptionPanelButtons),
+	ITE_OptionPanelButtons,
+
+	64,54,			// quit panel offsets
+	192,38,			// quit panel width & height
+	ARRAYSIZE(ITE_QuitPanelButtons),
+	ITE_QuitPanelButtons,
+
+	74, 53,			// load panel offsets
+	172, 40,		// load panel width & height
+	ARRAYSIZE(ITE_LoadPanelButtons),
+	ITE_LoadPanelButtons,
+
+	2,				// save edit index
+	74, 44,			// save panel offsets
+	172, 58,		// save panel width & height
+	ARRAYSIZE(ITE_SavePanelButtons),
+	ITE_SavePanelButtons,
+
+	0,				// protect edit index
+	74, 44,			// protect panel offsets
+	172, 58,		// protect panel width & height
+	ARRAYSIZE(ITE_ProtectPanelButtons),
+	ITE_ProtectPanelButtons
+};
 
 #if defined(ENABLE_IHNM)
 
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp
index ec914ad7017..e37d84a0860 100644
--- a/engines/saga/interface.cpp
+++ b/engines/saga/interface.cpp
@@ -228,6 +228,19 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) {
 	_mainPanel.x = _vm->getDisplayInfo().mainPanelXOffset;
 	_mainPanel.y = _vm->getDisplayInfo().mainPanelYOffset;
 	_mainPanel.currentButton = nullptr;
+
+	if (_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_CHN) {
+		ByteArray n;
+		static const int kSkipLines = 4;
+		_mainPanel.imageHeight -= kSkipLines;
+		n.resize(_mainPanel.imageHeight * _mainPanel.imageWidth);
+		memcpy(n.getBuffer(), _mainPanel.image.getBuffer() + kSkipLines * _mainPanel.imageWidth, _mainPanel.imageHeight * _mainPanel.imageWidth);
+		// Fill button panel with blue to remove western button outlies. No idea why it was done in the code rather than resource itself
+		for (unsigned y = 0; y < 43; y++)
+			memset(n.getBuffer() + y * _mainPanel.imageWidth + 53, kITEColorBlue89, 114);
+		_mainPanel.image = n;
+	}
+
 	_inventoryUpButton = _mainPanel.getButton(_vm->getDisplayInfo().inventoryUpButtonIndex);
 	_inventoryDownButton = _mainPanel.getButton(_vm->getDisplayInfo().inventoryDownButtonIndex);
 
@@ -758,7 +771,10 @@ void Interface::drawVerbPanel(PanelButton* panelButton) {
 	point.x = _mainPanel.x + panelButton->xOffset;
 	point.y = _mainPanel.y + panelButton->yOffset;
 
-	_vm->_sprite->draw(_mainPanel.sprites, spriteNumber, point, 256);
+	// TODO: Find the correct sprite for Chinese version.
+	if (!(_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_CHN)) {
+		_vm->_sprite->draw(_mainPanel.sprites, spriteNumber, point, 256);
+	}
 
 	drawVerbPanelText(panelButton, textColor, kKnownColorVerbTextShadow);
 }
diff --git a/engines/saga/metaengine.cpp b/engines/saga/metaengine.cpp
index 9a7ae97977f..07601a34d91 100644
--- a/engines/saga/metaengine.cpp
+++ b/engines/saga/metaengine.cpp
@@ -253,6 +253,8 @@ bool SagaEngine::initGame() {
 const GameDisplayInfo &SagaEngine::getDisplayInfo() {
 	switch (_gameDescription->gameId) {
 		case GID_ITE:
+			if (getLanguage() == Common::ZH_CHN)
+				return ITE_DisplayInfo_ZH;
 			return ITE_DisplayInfo;
 #ifdef ENABLE_IHNM
 		case GID_IHNM:


Commit: 5b3d7332a7426ba2680f84cad2acf4fc81cee906
    https://github.com/scummvm/scummvm/commit/5b3d7332a7426ba2680f84cad2acf4fc81cee906
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Reserve space for Chinese strings

Changed paths:
    engines/saga/itedata.cpp
    engines/saga/saga.cpp


diff --git a/engines/saga/itedata.cpp b/engines/saga/itedata.cpp
index ae3e8f74879..a1350da8bdb 100644
--- a/engines/saga/itedata.cpp
+++ b/engines/saga/itedata.cpp
@@ -544,7 +544,29 @@ const char *ITEinterfaceTextStrings[][53] = {
 		"\xE4\xF6\xE2\xFA \xE3\xE5-\xF9\xE9\xE7",
 		"\xEE\xE4 \xFA\xE2\xE5\xE1\xFA\xE5 \xF9\xEC \xF8\xE9\xF3?",
 		"\xE8\xF2\xE9\xF0\xFA \xEE\xF9\xE7\xF7 \xF9\xEE\xE5\xF8"
-	}
+	},
+	// Chinese
+	{
+		// Note that the "Load Successful!" string is never used in ScummVM
+		"Walk to", "Look At", "Pick Up", "Talk to", "Open",
+		"Close", "Use", "Give", "Options", "Test",
+		"Demo", "Help", "Quit Game", "Fast", "Slow",
+		"On", "Off", "Continue Playing", "Load", "Save",
+		"Game Options", "Reading Speed", "Music", "Sound", "Cancel",
+		"Quit", "OK", "Mid", "Click", "10%",
+		"20%", "30%", "40%", "50%", "60%",
+		"70%", "80%", "90%", "Max", "Quit the Game?",
+		"Load Successful!", "Enter Save Game Name", "Give %s to %s", "Use %s with %s",
+		"[New Save Game]",
+		"I can't pick that up.",
+		"I see nothing special about it.",
+		"There's no place to open it.",
+		"There's no opening to close.",
+		"I don't know how to do that.",
+		"Show Dialog",
+		"What is Rif's reply?",
+		"Loading a saved game"
+	},
 };
 
 const RawPoint pieceOrigins[PUZZLE_PIECES] = {
@@ -620,7 +642,13 @@ const char *pieceNames[][PUZZLE_PIECES] = {
 		"\xEE\xE1\xF8\xE2", "\xF6\xE1\xFA", "\xEB\xEC\xE9\xE1\xE4", "\xEE\xEC\xE7\xF6\xE9\xE9\xED", "\xF4\xEC\xF1",
 		"\xE7\xE5\xE8 \xEE\xF9\xE9\xE7\xE4", "\xEE\xF7\xF6\xE5\xF2\xE4", "\xF4\xE8\xE9\xF9 \xF0\xE2\xF8\xE9\xED", "\xF1\xF8\xE8 \xEE\xE9\xE3\xE4", "\xF7\xF8\xE3\xE5\xED",
 		"\xEE\xE6\xEE\xF8\xE4", "\xF1\xF8\xE2\xEC", "\xEE\xF1\xE5\xF8", "\xEE\xF7\xE1\xFA", "\xEE\xE1\xF8\xF9\xFA \xF6\xE1\xF2"
-	}
+	},
+	// Chinese
+	{
+		"screwdriver", "pliers", "c-clamp", "wood clamp", "level",
+		"twine", "wood plane", "claw hammer", "tape measure", "hatchet",
+		"shears", "ruler", "saw", "mallet", "paint brush"
+	},
 };
 
 // hints
@@ -688,7 +716,14 @@ const char *hintStr[][4] = {
 		"\xE1\xE3\xF7\xE5 \xEC\xE0\xE9\xEC\xE5 \xF4\xE9\xF0\xE4 \xE9\xF9 \xE4\xEB\xE9 \xEE\xF2\xE8 \xE7\xFA\xE9\xEB\xE5\xFA \xF9\xF2\xF9\xE5\xE9\xE5\xFA \xEC\xE4\xFA\xE0\xE9\xED \xE5\xE4\xFA\xE7\xE9\xEC\xE5 \xEE\xF9\xED.",
 		"\xE1\xE3\xF7\xE5 \xEB\xEC \xF4\xE9\xF0\xE4 \xE7\xE3\xF9\xE4 \xE5\xEB\xEC \xF6\xE3 \xE7\xE3\xF9 \xE0\xED \xE9\xF9 \xE7\xFA\xE9\xEB\xE4 \xEE\xFA\xE0\xE9\xEE\xE4.",
 		"\xE0\xE9\xF0\xE9 \xF8\xE5\xE0\xE4 \xF9\xE5\xED \xE3\xE1\xF8 \xF9\xE0\xE9\xF0\xE5 \xE1\xEE\xF7\xE5\xEE\xE5."
-	}
+	},
+	// Chinese
+	{
+		"Check which pieces could fit in each corner first.",
+		"Check which corner has the least number of pieces that can fit and start from there.",
+		"Check each new corner and any new side for pieces that fit.",
+		"I don't see anything out of place."
+	},
 };
 
 const char *solicitStr[][NUM_SOLICIT_REPLIES] = {
@@ -766,6 +801,14 @@ const char *solicitStr[][NUM_SOLICIT_REPLIES] = {
 		"\xF4\xF1\xF1! \xF8\xE5\xF6\xE4 \xF8\xEE\xE6?",
 		"\xE0\xF0\xE9 \xE4\xE9\xE9\xFA\xE9 \xF2\xE5\xF9\xE4 \xE6\xE0\xFA \xE0\xE7\xF8\xFA, \xE0\xFA\xE4 \xE9\xE5\xE3\xF2."
 	},
+	// Chinese
+	{
+		"Hey, Fox! Would you like a hint?",
+		"Would you like some help?",
+		"Umm...Umm...",
+		"Psst! want a hint?",
+		"I would have done this differently, you know."
+	},
 };
 
 const char *sakkaStr[][NUM_SAKKA] = {
@@ -822,7 +865,13 @@ const char *sakkaStr[][NUM_SAKKA] = {
 		"\xE4\xE9\xE9, \xE0\xFA\xE4 \xEC\xE0 \xE0\xEE\xE5\xF8 \xEC\xF1\xE9\xE9\xF2 \xEC\xEE\xE5\xF2\xEE\xE3\xE9\xED!",
 		"\xE7\xE1\xF8'\xE4! \xE6\xE4 \xE0\xEE\xE5\xF8 \xEC\xE4\xE9\xE5\xFA \xEE\xE1\xE7\xEF!",
 		"\xE1\xE7\xE9\xE9\xEB\xED, \xE6\xE4 \xEC\xE0 \xEE\xE5\xF4\xE9\xF2 \xE1\xE7\xE5\xF7\xE9\xED!"
-	}
+	},
+	// Chinese
+	{
+		"Hey, you're not supposed to help the applicants!",
+		"Guys! This is supposed to be a test!",
+		"C'mon fellows, that's not in the rules!"
+	},
 };
 
 const char *whineStr[][NUM_WHINES] = {
@@ -899,7 +948,15 @@ const char *whineStr[][NUM_WHINES] = {
 		"\xF0\xE5 \xE8\xE5\xE1...",
 		"\xF0\xF8\xE0\xE4 \xEC\xE9 \xF9\xEC\xE5\xE7 \xE4\xEB\xFA\xE9\xE1\xE4 \xF2\xEC\xE4 \xEC\xEA \xEC\xF8\xE0\xF9, \xF1\xE0\xF7\xE4!",
 		"\xE8\xE5\xE1, \xE0\xF0\xE9 \xEC\xE0 \xE6\xE5\xEB\xF8 \xF9\xE9\xF9 \xE7\xE5\xF7 \xEE\xF4\xE5\xF8\xF9 \xF9\xEE\xFA\xF0\xE2\xE3 \xEC\xF8\xEE\xE6\xE9\xED."
-	}
+	},
+	// Chinese
+	{
+		"Aww, c'mon Sakka!",
+		"One hint won't hurt, will it?",
+		"Sigh...",
+		"I think that clipboard has gone to your head, Sakka!",
+		"Well, I don't recall any specific rule against hinting."
+	},
 };
 
 const char *optionsStr[][4] = {
@@ -966,7 +1023,14 @@ const char *optionsStr[][4] = {
 		"\"\xEB\xEF, \xE0\xF9\xEE\xE7 \xEC\xF8\xEE\xE6 \xE1\xE1\xF7\xF9\xE4.\"",
 		"\"\xEC\xE0, \xFA\xE5\xE3\xE4 \xF8\xE1\xE4, \xE0\xF9\xEE\xE7 \xEC\xF0\xF1\xE5\xFA \xEC\xF4\xFA\xE5\xF8 \xE1\xF2\xF6\xEE\xE9.\"",
 		"\xF0\xF8\xE0\xE4 \xEC\xE9 \xF9\xE4\xEE\xF7\xE5\xED \xF9\xE1\xE5 \xF9\xEE\xFA\xE9 \xE0\xFA \xE4%s \xEC\xE0 \xF0\xEB\xE5\xEF."
-	}
+	},
+	// Chinese
+	{
+		"\"I'll do this puzzle later.\"",
+		"\"Yes, I'd like a hint please.\"",
+		"\"No, thank you, I'd like to try and solve it myself.\"",
+		"I think the %s is in the wrong place."
+	},
 };
 
 const IntroDialogue introDialogueCave1[][4] = {
@@ -1155,7 +1219,27 @@ const IntroDialogue introDialogueCave1[][4] = {
 		3,		// cave voice 3
 		"\xE4\xED \xE9\xE3\xF2\xE5 \xE0\xFA \xF1\xE5\xE3 \xE4\xFA\xF2\xE5\xF4\xE4, \xE0\xFA \xF1\xE5\xE3 \xE4\xE0\xE5\xF9\xF8, \xE5\xF1\xE5\xE3\xE5\xFA \xF0\xE5\xF1\xF4\xE9\xED "
 		"\xEE\xF2\xE1\xF8 \xEC\xEE\xE4 \xF9\xE0\xF0\xE7\xF0\xE5 \xEE\xF1\xE5\xE2\xEC\xE9\xED \xEC\xE3\xEE\xE9\xE9\xEF."
-	} }
+	} },
+	{ { // Chinese
+		0,		// cave voice 0
+		"We see the sky, we see the land, we see the water, "
+		"and we wonder: Are we the only ones?"
+	},
+	{
+		1,		// cave voice 1
+		"Long before we came to exist, the humans ruled the "
+		"Earth."
+	},
+	{
+		2,		// cave voice 2
+		"They made marvelous things, and moved whole "
+		"mountains."
+	},
+	{
+		3,		// cave voice 3
+		"They knew the Secret of Flight, the Secret of "
+		"Happiness, and other secrets beyond our imagining."
+	} },
 };
 
 const IntroDialogue introDialogueCave2[][3] = {
@@ -1292,6 +1376,20 @@ const IntroDialogue introDialogueCave2[][3] = {
 		6,		// cave voice 6
 		"\xE0\xF0\xE7\xF0\xE5 \xE4\xE9\xE9\xF0\xE5 \xEC\xE4\xED \xEC\xE9\xEC\xE3\xE9\xED."
 	} },
+	{ { // Chinese
+		4,		// cave voice 4
+		"The humans also knew the Secret of Life, and they "
+		"used it to give us the Four Great Gifts:"
+	},
+	{
+		5,		// cave voice 5
+		"Thinking minds, feeling hearts, speaking mouths, and "
+		"reaching hands."
+	},
+	{
+		6,		// cave voice 6
+		"We are their children."
+	} },
 };
 
 const IntroDialogue introDialogueCave3[][3] = {
@@ -1426,7 +1524,21 @@ const IntroDialogue introDialogueCave3[][3] = {
 	{
 		9,		// cave voice 9
 		"\xE4\xED \xE0\xE4\xE1\xE5 \xE0\xE5\xFA\xF0\xE5, \xE5\xEB\xF9\xE4\xE9\xE9\xF0\xE5 \xEE\xE5\xEB\xF0\xE9\xED, \xE4\xED \xE1\xE5\xE5\xE3\xE0\xE9 \xE4\xE9\xE5 \xEE\xF2\xF0\xE9\xF7\xE9\xED \xEC\xF0\xE5 \xE0\xFA \xF1\xE5\xE3 \xE4\xE0\xE5\xF9\xF8."
-	} }
+	} },
+	{ { // Chinese
+		7,		// cave voice 7
+		"They taught us how to use our hands, and how to "
+		"speak."
+	},
+	{
+		8,		// cave voice 8
+		"They showed us the joy of using our minds."
+	},
+	{
+		9,		// cave voice 9
+		"They loved us, and when we were ready, they surely "
+		"would have given us the Secret of Happiness."
+	} },
 };
 
 const IntroDialogue introDialogueCave4[][4] = {
@@ -1607,7 +1719,25 @@ const IntroDialogue introDialogueCave4[][4] = {
 	{
 		13,		// cave voice 13
 		"\xE5\xE4\xE0\xED \xF0\xE7\xEC\xE5\xF7 \xF2\xEE\xED \xE0\xFA \xE0\xE5\xFA\xE5 \xE4\xE2\xE5\xF8\xEC \xE1\xE9\xE5\xED \xEE\xEF \xE4\xE9\xEE\xE9\xED?"
-	} }
+	} },
+	{ { // Chinese
+		10,		// cave voice 10
+		"And now we see the sky, the land, and the water that "
+		"we are heirs to, and we wonder: why did they leave?"
+	},
+	{
+		11,		// cave voice 11
+		"Do they live still, in the stars? In the oceans "
+		"depths? In the wind?"
+	},
+	{
+		12,		// cave voice 12
+		"We wonder, was their fate good or evil?"
+	},
+	{
+		13,		// cave voice 13
+		"And will we also share the same fate one day?"
+	} },
 };
 
 const IntroCredit creditsValley[] = {
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index f3c4c77a3bf..497b077c0a6 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -488,6 +488,8 @@ int SagaEngine::getLanguageIndex() {
 		return 6;
 	case Common::HE_ISR:
 		return 7;
+	case Common::ZH_CHN:
+		return 8;
 	default:
 		return 0;
 	}


Commit: 005c6a91d3aeaf31afd00e93267e165106e3b802
    https://github.com/scummvm/scummvm/commit/005c6a91d3aeaf31afd00e93267e165106e3b802
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Add language data for Chinese ITE

Changed paths:
    engines/saga/itedata.cpp
    engines/saga/itedata.h


diff --git a/engines/saga/itedata.cpp b/engines/saga/itedata.cpp
index a1350da8bdb..9b5693f165c 100644
--- a/engines/saga/itedata.cpp
+++ b/engines/saga/itedata.cpp
@@ -548,15 +548,51 @@ const char *ITEinterfaceTextStrings[][53] = {
 	// Chinese
 	{
 		// Note that the "Load Successful!" string is never used in ScummVM
-		"Walk to", "Look At", "Pick Up", "Talk to", "Open",
-		"Close", "Use", "Give", "Options", "Test",
-		"Demo", "Help", "Quit Game", "Fast", "Slow",
-		"On", "Off", "Continue Playing", "Load", "Save",
-		"Game Options", "Reading Speed", "Music", "Sound", "Cancel",
-		"Quit", "OK", "Mid", "Click", "10%",
-		"20%", "30%", "40%", "50%", "60%",
-		"70%", "80%", "90%", "Max", "Quit the Game?",
-		"Load Successful!", "Enter Save Game Name", "Give %s to %s", "Use %s with %s",
+		"\xa8\xab\xa6\x56" /* 走向, Walk to */,
+		"\xac\x64\xac\xdd" /* 查看, Look at */,
+		"\xae\xb3\xb0\x5f" /* æ‹¿èµ·, Pick up */,
+		"\xa5\xe6\xbd\xcd" /* 交談, Talk to */,
+		"\xa5\xb4\xb6\x7d" /* 打開, Open */,
+		"\xc3\xf6\xb3\xac" /* 關閉, Close */,
+		"\xa8\xcf\xa5\xce" /* 使用, Use */,
+		"\xb5\xb9\xbb\x50" /* 給與, Give */,
+		"\xbf\xef\xb6\xb5" /* 選項, Options */,
+		"\xb4\xfa\xb8\xd5" /* 測試, Test */,
+		"\xae\x69\xa5\xdc" /* 展示, Demo */,
+		"\xa8\x44\xa7\x55" /* 求助, Help */,
+		"\xb5\xb2\xa7\xf4" /* 結束, Quit game */,
+		"\xa7\xd6\xb3\x74" /* 快速, Fast */,
+		"\xbd\x77\xba\x43" /* ç·©æ…¢, Slow */,
+		"\xb6\x7d" /* é–‹, On */,
+		"\xc3\xf6" /* 關, Off */,
+		"\xc4\x7e\xc4\xf2\xb9\x43\xc0\xb8" /* 繼續遊戲, Continue Playing */,
+		"\xb8\xfc\xa4\x4a" /* 載入, Load */,
+		"\xc0\x78\xa6\x73" /* 儲存, Save */,
+		"\xb9\x43\xc0\xb8\xbf\xef\xb6\xb5" /* 遊戲選項, Game Options */,
+		"\xb0\x54\xae\xa7\xb3\x74\xab\xd7" /* 訊息速度, Reading Speed */,
+		"\xad\xb5\xbc\xd6" /* 音樂, Music */,
+		"\xad\xb5\xae\xc4" /* 音效, Sound */,
+		"\xa8\xfa\xae\xf8" /* 取消, Cancel */,
+		"\xb5\xb2\xa7\xf4" /* 結束, Quit */,
+		"\xa7\xb9\xb2\xa6" /* 完畢, OK */,
+		"\xa4\xa4\xb5\xa5" /* 中等, Mid */,
+		"\xba\x56\xc1\xe4" /* 敲鍵, Click */,
+		"\xa2\xb0\xa2\xaf\xa2\x48" /* 10% */,
+		"\xa2\xb1\xa2\xaf\xa2\x48" /* 20% */,
+		"\xa2\xb2\xa2\xaf\xa2\x48" /* 30% */,
+		"\xa2\xb3\xa2\xaf\xa2\x48" /* 40% */,
+		"\xa2\xb4\xa2\xaf\xa2\x48" /* 50% */,
+		"\xa2\xb5\xa2\xaf\xa2\x48" /* 60% */,
+		"\xa2\xb6\xa2\xaf\xa2\x48" /* 70% */,
+		"\xa2\xb7\xa2\xaf\xa2\x48" /* 80% */,
+		"\xa2\xb8\xa2\xaf\xa2\x48" /* 90% */,
+		"\xb3\xcc\xa4\x6a" /* 最大, Max */,
+		"\xad\x6e\xb5\xb2\xa7\xf4\xb9\x43\xc0\xb8\xb6\xdc\x3f" /* 要結束遊戲嗎?; Quit the Game? */,
+		"\xb8\xfc\xa4\x4a\xa6\xa8\xa5\x5c" /* 載入成功, Load Successful! */,
+		"\xbd\xd0\xbf\xe9\xa4\x4a\xa6\x73\xc0\xc9\xa6\x57\xba\xd9" /* 請輸入存檔名稱, Enter Save Game Name */,
+
+		"Give %s to %s",
+		"Use %s with %s",
 		"[New Save Game]",
 		"I can't pick that up.",
 		"I see nothing special about it.",
@@ -564,7 +600,7 @@ const char *ITEinterfaceTextStrings[][53] = {
 		"There's no opening to close.",
 		"I don't know how to do that.",
 		"Show Dialog",
-		"What is Rif's reply?",
+		"\xa7\x51\xa4\xd2\xaa\xba\xa6\x5e\xb5\xaa\xac\x4f\xa4\xb0\xbb\xf2\xa1\x48" /* 利夫的回答是什麼?; What is Rif's reply? */,
 		"Loading a saved game"
 	},
 };
@@ -645,9 +681,21 @@ const char *pieceNames[][PUZZLE_PIECES] = {
 	},
 	// Chinese
 	{
-		"screwdriver", "pliers", "c-clamp", "wood clamp", "level",
-		"twine", "wood plane", "claw hammer", "tape measure", "hatchet",
-		"shears", "ruler", "saw", "mallet", "paint brush"
+		"\xc1\xb3\xb5\xb7\xb0\x5f\xa4\x6c" /* 螺絲起子, screwdriver */,
+		"\xb9\x58\xa4\x6c" /* 鉗子, pliers */,
+		"\xa2\xd1\xab\xac\xb9\x58" /* C型鉗, c-clamp */,
+		"\xa4\xec\xb9\x58" /* 木鉗, wood clamp */,
+		"\xa4\xf4\xa5\xad\xbb\xf6" /* 水平儀, level */,
+		"\xb3\xc2\xbd\x75" /* 麻線, twine */,
+		"\xa4\xec\xaa\x4f" /* 木板, wood plane */,
+		"\xa9\xde\xb0\x76\xc2\xf1" /* 拔釘鎚, claw hammer */,
+		"\xa5\xd6\xa4\xd8" /* 皮尺, tape measure */,
+		"\xa9\xf2\xc0\x59" /* æ–§é ­, hatchet */,
+		"\xb0\xc5\xa4\x4d" /* 剪刀, shears */,
+		"\xaa\xbd\xa4\xd8" /* ç›´å°º, ruler */,
+		"\xbf\xf7\xa4\x6c" /* 鋸子, saw */,
+		"\xa4\xec\xba\x6c" /* 木槌, mallet */,
+		"\xaa\x6f\xba\xa3\xa8\xea" /* 油漆刷, paint brush */,
 	},
 };
 
@@ -719,10 +767,10 @@ const char *hintStr[][4] = {
 	},
 	// Chinese
 	{
-		"Check which pieces could fit in each corner first.",
-		"Check which corner has the least number of pieces that can fit and start from there.",
-		"Check each new corner and any new side for pieces that fit.",
-		"I don't see anything out of place."
+		"\xa5\xfd\xac\xdd\xac\xdd\xa8\xba\xa8\xc7\xb8\x48\xa4\xf9\xa5\x69\xa5\x48\xb1\xc6\xa6\x62\xa6\x55\xad\xd3\xa8\xa4\xa1\x45" /* 先看看那些碎片可以排在各個角‧; Check which pieces could fit in each corner first. */,
+		"\xac\xdd\xac\xdd\xa8\xba\xa4\x40\xad\xd3\xa8\xa4\xaf\xe0\xb1\xc6\xb6\x69\xa5\x68\xaa\xba\xb8\x48\xa4\xf9\xb3\xcc\xa4\xd6\xa1\x41\xb4\x4e\xb1\x71\xa8\xba\xad\xd3\xa8\xa4\xb8\xa8\xb6\x7d\xa9\x6c\xa1\x45" /* 看看那一個角能排進去的碎片最少,就從那個角落開始‧; Check which corner has the least number of pieces that can fit and start from there. */,
+		"\xc0\xcb\xac\x64\xa8\x43\xad\xd3\xb7\x73\xa5\x58\xb2\x7b\xaa\xba\xa8\xa4\xa5\x48\xa4\xce\xb7\x73\xa5\x58\xb2\x7b\xaa\xba\xc3\xe4\xa1\x41\xac\xdd\xac\xdd\xa6\xb3\xa8\x53\xa6\xb3\xb8\x48\xa4\xf9\xa7\x6b\xa6\x58\xb8\xd3\xb3\x42" /* 檢查每個新出現的角以及新出現的邊,看看有沒有碎片吻合該處; Check each new corner and any new side for pieces that fit. */,
+		"\xa7\xda\xac\xdd\xa4\xa3\xa5\x58\xa8\xd3\xa6\xb3\xa8\xba\xa4\x40\xb6\xf4\xac\x4f\xa4\xa3\xbe\x41\xa6\x58\xaa\xba\xa1\x45" /* 我看不出來有那一塊是不適合的‧; I don't see anything out of place. */,
 	},
 };
 
@@ -803,11 +851,11 @@ const char *solicitStr[][NUM_SOLICIT_REPLIES] = {
 	},
 	// Chinese
 	{
-		"Hey, Fox! Would you like a hint?",
-		"Would you like some help?",
-		"Umm...Umm...",
-		"Psst! want a hint?",
-		"I would have done this differently, you know."
+		"\xbc\x4b\xa1\x41\xaa\xb0\xaf\x57\xa1\x49\xa7\x41\xbb\xdd\xa4\xa3\xbb\xdd\xad\x6e\xb4\xa3\xa5\xdc\xa1\x48" /* 嘿,狐狸!你需不需要提示?; Hey, Fox! Would you like a hint? */,
+		"\xa7\x41\xbb\xdd\xad\x6e\xc0\xb0\xa7\x55\xb6\xdc\xa1\x48" /* 你需要幫助嗎?; Would you like some help? */,
+		"\xb6\xe2\x2e\x2e\x2e\xb6\xe2\x2e\x2e\x2e" /* å—¯...å—¯...; Umm...Umm... */,
+		"\xb3\xde\xa1\x49\xad\x6e\xa4\xa3\xad\x6e\xb4\xa3\xa5\xdc\xa1\x48" /* 喂!要不要提示?; Psst! want a hint? */,
+		"\xa7\xda\xb7\x7c\xa5\xce\xa4\xa3\xa6\x50\xaa\xba\xa4\xe8\xaa\x6b\xa8\xd3\xb0\xb5\xb3\x6f\xa5\xf3\xa8\xc6\xa1\x45" /* 我會用不同的方法來做這件事‧; I would have done this differently, you know. */,
 	},
 };
 
@@ -868,9 +916,9 @@ const char *sakkaStr[][NUM_SAKKA] = {
 	},
 	// Chinese
 	{
-		"Hey, you're not supposed to help the applicants!",
-		"Guys! This is supposed to be a test!",
-		"C'mon fellows, that's not in the rules!"
+		"\xb3\xde\xa1\x41\xa7\x41\xa4\xa3\xa5\x69\xa5\x48\xc0\xb0\xa7\x55\xc0\xb3\xbc\x78\xaa\xba\xa4\x48\xa1\x49" /* 喂,你不可以幫助應徵的人!; Hey, you're not supposed to help the applicants! */,
+		"\xa6\xd1\xa5\x53\xa1\x41\xb3\x6f\xa5\x69\xac\x4f\xb4\xfa\xc5\xe7\xad\xfe\xa1\x49" /* 老兄,這可是測驗哪!; Guys! This is supposed to be a test! */,
+		"\xa1\x41\xaa\x42\xa4\xcd\xa1\x41\xb3\x6f\xa5\x69\xac\x4f\xa4\xa3\xa6\x58\xb3\x57\xa9\x77\xaa\xba\xb3\xe1\xa1\x49" /* ,朋友,這可是不合規定的喔!; C'mon fellows, that's not in the rules! */
 	},
 };
 
@@ -951,11 +999,11 @@ const char *whineStr[][NUM_WHINES] = {
 	},
 	// Chinese
 	{
-		"Aww, c'mon Sakka!",
-		"One hint won't hurt, will it?",
-		"Sigh...",
-		"I think that clipboard has gone to your head, Sakka!",
-		"Well, I don't recall any specific rule against hinting."
+		"\xbe\xbe\xa1\x41\xa7\x4f\xb3\x6f\xbc\xcb\xa1\x41\xc2\xc4\xa5\x64\xa1\x49" /* 噢,別這樣,薩卡!; Aww, c'mon Sakka! */,
+		"\xa4\x40\xad\xd3\xa4\x70\xb4\xa3\xa5\xdc\xa4\xa3\xb7\x7c\xab\xe7\xbc\xcb\xb9\xc0\xa1\x49" /* 一個小提示不會怎樣嘛!; One hint won't hurt, will it? */,
+		"\xad\xfc\x2e\x2e\x2e" /* 唉...; Sigh... */,
+		"\xa7\xda\xac\xdd\xa7\x41\xac\x4f\xa4\xd3\xb9\x4c\xa9\xf3\xb9\x78\xa9\x54\xa4\x46\xa1\x41\xc2\xc4\xa5\x5b\xa1\x49" /* 我看你是太過於頑固了,薩加!; I think that clipboard has gone to your head, Sakka! */,
+		"\xb6\xe2\xa1\x41\xa7\xda\xa4\xa3\xb0\x4f\xb1\x6f\xa6\xb3\xa8\xba\xb1\xf8\xb3\x57\xa9\x77\xa4\xa3\xad\xe3\xb4\xa3\xa5\xdc\xa1\x45" /* 嗯,我不記得有那條規定不准提示‧; Well, I don't recall any specific rule against hinting. */,
 	},
 };
 
@@ -1026,10 +1074,10 @@ const char *optionsStr[][4] = {
 	},
 	// Chinese
 	{
-		"\"I'll do this puzzle later.\"",
-		"\"Yes, I'd like a hint please.\"",
-		"\"No, thank you, I'd like to try and solve it myself.\"",
-		"I think the %s is in the wrong place."
+		"\xb5\xa5\xa4\x40\xa4\x55\xa7\xda\xa6\x41\xa8\xd3\xb8\xd1\xa8\x4d\xb3\x6f\xad\xd3\xc1\xbc\xc3\x44\xa1\x45" /* 等一下我再來解決這個謎題‧; I'll do this puzzle later. */,
+		"\xbd\xd0\xb5\xb9\xa7\xda\xa4\x40\xa8\xc7\xb4\xa3\xa5\xdc\xa1\x45" /* 請給我一些提示‧; Yes, I'd like a hint please. */,
+		"\xa4\xa3\xa1\x41\xc1\xc2\xc1\xc2\xa7\x41\xa1\x45\xa7\xda\xb7\x51\xb8\xd5\xb8\xd5\xac\xdd\xa6\xdb\xa4\x76\xb8\xd1\xa8\x4d\xb3\x6f\xad\xd3\xb0\xdd\xc3\x44\xa1\x45" /* 不,謝謝你‧我想試試看自己解決這個問題‧; No, thank you, I'd like to try and solve it myself. */,
+		"\xa7\xda\xc4\xb1\xb1\x6f\x25\x73\xa9\xf1\xbf\xf9\xa6\x61\xa4\xe8\xa4\x46\xa1\x45" /* 我覺得%s放錯地方了‧; I think the %s is in the wrong place. */,
 	},
 };
 
@@ -1222,23 +1270,19 @@ const IntroDialogue introDialogueCave1[][4] = {
 	} },
 	{ { // Chinese
 		0,		// cave voice 0
-		"We see the sky, we see the land, we see the water, "
-		"and we wonder: Are we the only ones?"
+		"\xa9\xef\xc0\x59\xb1\xe6\xa4\xd1\x2c\xad\xc1\xad\xba\xa8\xa3\xa6\x61\x2c\xa9\xf1\xb2\xb4\xb1\xe6\xa5\x68\xa7\xf3\xa6\xb3\xa4\x6a\xae\xfc\xaa\x65\xac\x79\x2c\xa7\xda\xad\xcc\xa4\xa3\xb8\x54\xc3\x68\xba\xc3\x3a\xa7\xda\xad\xcc\xac\x4f\xb6\xc8\xa6\x73\xaa\xba\xb1\xda\xc3\xfe\xb6\xdc\xa1\x48" /* 抬頭望天,俯首見地,放眼望去更有大海河流,我們不禁懷疑:我們是僅存的族類嗎?; We see the sky, we see the land, we see the water, */
 	},
 	{
 		1,		// cave voice 1
-		"Long before we came to exist, the humans ruled the "
-		"Earth."
+		"\xab\xdc\xa4\x5b\xab\xdc\xa4\x5b\xa5\x48\xab\x65\x2c\xa7\xda\xad\xcc\xc1\xd9\xa8\x53\xa6\xb3\xa5\x58\xb2\x7b\xaa\xba\xae\xc9\xad\xd4\x2c\xa4\x48\xc3\xfe\xb4\x78\xba\xde\xa4\x46\xa6\x61\xb2\x79\x2e" /* 很久很久以前,我們還沒有出現的時候,人類掌管了地球.; Long before we came to exist, the humans ruled the Earth.  */
 	},
 	{
 		2,		// cave voice 2
-		"They made marvelous things, and moved whole "
-		"mountains."
+		"\xa5\x4c\xad\xcc\xbb\x73\xb3\x79\xaf\xab\xa9\x5f\xaa\xba\xbe\xb9\xa8\xe3\x2c\xa6\xd3\xa5\x42\xb2\xbe\xa5\x68\xa9\xd2\xa6\xb3\xaa\xba\xb0\xaa\xa4\x73\xc2\x4f\xc0\xad\x2e" /* 他們製造神奇的器具,而且移去所有的高山叢嶺.; They made marvelous things, and moved whole mountains. */
 	},
 	{
 		3,		// cave voice 3
-		"They knew the Secret of Flight, the Secret of "
-		"Happiness, and other secrets beyond our imagining."
+		"\xa5\x4c\xad\xcc\xa9\xfa\xa5\xd5\xad\xb8\xa6\xe6\xaa\xba\xaf\xb5\xb1\x4b\x2c\xa7\xd6\xbc\xd6\xaa\xba\xaf\xb5\xb1\x4b\x2c\xa5\x48\xa4\xce\xa8\xe4\xa5\xa6\xa7\xda\xad\xcc\xb5\x4c\xaa\x6b\xb7\x51\xb9\xb3\xaa\xba\xaf\xb5\xb1\x4b\x2e" /* 他們明白飛行的秘密,快樂的秘密,以及其它我們無法想像的秘密.; They knew the Secret of Flight, the Secret of Happiness, and other secrets beyond our imagining. */
 	} },
 };
 
@@ -1378,17 +1422,15 @@ const IntroDialogue introDialogueCave2[][3] = {
 	} },
 	{ { // Chinese
 		4,		// cave voice 4
-		"The humans also knew the Secret of Life, and they "
-		"used it to give us the Four Great Gifts:"
+		"\xa4\x48\xc3\xfe\xa4\x5d\xaa\xbe\xb9\x44\xa5\xcd\xa9\x52\xaa\xba\xaf\xb5\xb1\x4b\x2c\xa6\xd3\xa5\x42\xa7\x51\xa5\xce\xa5\xa6\xb5\xb9\xa4\x46\xa7\xda\xad\xcc\xa5\x7c\xa4\x6a\xa4\xd1\xbd\xe1\xa1\x47" /* 人類也知道生命的秘密,而且利用它給了我們四大天賦:; The humans also knew the Secret of Life, and they used it to give us the Four Great Gifts: */
 	},
 	{
 		5,		// cave voice 5
-		"Thinking minds, feeling hearts, speaking mouths, and "
-		"reaching hands."
+		"\xaf\xe0\xab\xe4\xaf\xe0\xb7\x51\xaa\xba\xb7\x4e\xa7\xd3\x2c\xb7\x50\xa8\xfc\xb1\xd3\xbe\x55\xaa\xba\xa4\xdf\xc6\x46\x2c\x20\xaf\xe0\xbb\xa1\xb5\xbd\xb9\x44\xaa\xba\xa4\x66\xa6\xde\x2c\xa5\x48\xa4\xce\xc6\x46\xa5\xa9\xa4\xe8\xab\x4b\xaa\xba\xc2\xf9\xa4\xe2\x2e" /* 能思能想的意志,感受敏銳的心靈, 能說善道的口舌,以及靈巧方便的雙手.; Thinking minds, feeling hearts, speaking mouths, and reaching hands. */
 	},
 	{
 		6,		// cave voice 6
-		"We are their children."
+		"\xa7\xda\xad\xcc\xac\x4f\xa5\x4c\xad\xcc\xaa\xba\xa4\x6c\xae\x5d\x2e" /* 我們是他們的子孫.; We are their children. */
 	} },
 };
 
@@ -1527,17 +1569,15 @@ const IntroDialogue introDialogueCave3[][3] = {
 	} },
 	{ { // Chinese
 		7,		// cave voice 7
-		"They taught us how to use our hands, and how to "
-		"speak."
+		"\xa5\x4c\xad\xcc\xb1\xd0\xbe\xc9\xa7\xda\xad\xcc\xa6\x70\xa6\xf3\xa8\xcf\xa5\xce\xc2\xf9\xa4\xe2\x2c\xc1\xd9\xa6\xb3\xbb\xa1\xb8\xdc\xaa\xba\xa4\xe8\xaa\x6b\x2e" /* 他們教導我們如何使用雙手,還有說話的方法.; They taught us how to use our hands, and how to speak. */
 	},
 	{
 		8,		// cave voice 8
-		"They showed us the joy of using our minds."
+		"\xa5\x4c\xad\xcc\xa8\xcf\xa7\xda\xad\xcc\xa9\xfa\xa5\xd5\xa8\xcf\xa5\xce\xb7\x4e\xa7\xd3\xaa\xba\xb3\xdf\xae\xae\x2e" /* 他們使我們明白使用意志的喜悅.; They showed us the joy of using our minds.  */
 	},
 	{
 		9,		// cave voice 9
-		"They loved us, and when we were ready, they surely "
-		"would have given us the Secret of Happiness."
+		"\xa5\x4c\xad\xcc\xb7\x52\xc5\x40\xa7\xda\xad\xcc\x2c\xb5\xa5\xa7\xda\xad\xcc\xb9\x77\xb3\xc6\xa6\x6e\xa4\x46\x2c\xa5\x4c\xad\xcc\xa4\x40\xa9\x77\xb7\x7c\xa7\x69\xb6\x44\xa7\xda\xad\xcc\xa7\xd6\xbc\xd6\xaa\xba\xaf\xb5\xb1\x4b\x2e" /* 他們愛護我們,等我們預備好了,他們一定會告訴我們快樂的秘密.; They loved us, and when we were ready, they surely would have given us the Secret of Happiness.  */
 	} },
 };
 
@@ -1722,21 +1762,19 @@ const IntroDialogue introDialogueCave4[][4] = {
 	} },
 	{ { // Chinese
 		10,		// cave voice 10
-		"And now we see the sky, the land, and the water that "
-		"we are heirs to, and we wonder: why did they leave?"
+		"\xb5\x4d\xa6\xd3\xb2\x7b\xa6\x62\xa7\xda\xad\xcc\xac\xdd\xa8\xa3\xa7\xda\xad\xcc\xa9\xd2\xc4\x7e\xa9\xd3\xaa\xba\xa4\xd1\xaa\xc5\xa1\x42\xa4\x6a\xa6\x61\x2c\xa5\x48\xa4\xce\xae\xfc\xac\x76\x2c\xa7\xda\xad\xcc\xa4\x5d\xa6\x6e\xa9\x5f\xa1\x47\xa4\x48\xc3\xfe\xac\xb0\xa4\xb0\xbb\xf2\xc2\xf7\xb6\x7d\xa4\x46\xa1\x48" /* 然而現在我們看見我們所繼承的天空、大地,以及海洋,我們也好奇:人類為什麼離開了?; And now we see the sky, the land, and the water that we are heirs to, and we wonder: why did they leave?  */
 	},
 	{
 		11,		// cave voice 11
-		"Do they live still, in the stars? In the oceans "
-		"depths? In the wind?"
+		"\xa5\x4c\xad\xcc\xac\x4f\xa4\xa3\xac\x4f\xa4\xb4\xb5\x4d\xa6\xed\xa6\x62\xa4\xd1\xa4\x57\xaa\xba\xac\x50\xb2\x79\xb8\xcc\xa1\x48\xa6\xed\xa6\x62\xae\xfc\xac\x76\xaa\xba\xb2\x60\xb3\x42\xa1\x48\xc1\xd9\xac\x4f\xa9\x7e\xa6\xed\xa6\x62\xad\xb7\xa4\xa4\xa1\x48" /* 他們是不是仍然住在天上的星球裡?住在海洋的深處?還是居住在風中?; Do they live still, in the stars? In the oceans depths? In the wind?  */
 	},
 	{
 		12,		// cave voice 12
-		"We wonder, was their fate good or evil?"
+		"\xa7\xda\xad\xcc\xb7\x51\xaa\xbe\xb9\x44\xa1\x47\xa5\x4c\xad\xcc\xaa\xba\xa9\x52\xb9\x42\xac\x4f\xa6\x6e\xac\x4f\xc3\x61\xa1\x48" /* 我們想知道:他們的命運是好是壞?; We wonder, was their fate good or evil?  */
 	},
 	{
 		13,		// cave voice 13
-		"And will we also share the same fate one day?"
+		"\xac\x4f\xa4\xa3\xac\x4f\xb1\x4e\xa8\xd3\xa7\xda\xad\xcc\xa4\x5d\xb7\x7c\xbe\x44\xb9\x4a\xa6\x50\xbc\xcb\xaa\xba\xa9\x52\xb9\x42\xa1\x48" /* 是不是將來我們也會遭遇同樣的命運? And will we also share the same fate one day?  */
 	} },
 };
 
@@ -1749,6 +1787,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xEE\xF4\xE9\xF7"},
 	// "Продюсер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xCF\xF0\xEE\xE4\xFE\xF1\xE5\xF0"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xbb\x73\xa7\x40\xc1\x60\xba\xca" /* 製作總監 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
@@ -1757,6 +1796,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	// "Уолтер Хохбрюкнер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD3\xEE\xEB\xF2\xE5\xF0 \xD5\xEE\xF5\xE1\xF0\xFE\xEA\xED\xE5\xF0"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsHeader, "Executive Producer"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsHeader, "Ausf\201hrender Produzent"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsHeader, "Produttore Esecutivo"},
@@ -1765,6 +1805,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xEE\xF4\xE9\xF7 \xE1\xF4\xE5\xF2\xEC"},
 	// "Исполнительный продюсер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xC8\xF1\xEF\xEE\xEB\xED\xE8\xF2\xE5\xEB\xFC\xED\xFB\xE9 \xEF\xF0\xEE\xE4\xFE\xF1\xE5\xF0"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb0\xf5\xa6\xe6\xbb\x73\xa7\x40" /* 執行製作 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Robert McNally"},
@@ -1773,6 +1814,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	// "Роберт Макнелли"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD0\xEE\xE1\xE5\xF0\xF2 \xCC\xE0\xEA\xED\xE5\xEB\xEB\xE8"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	{Common::UNK_LANG, kITECreditsWyrmKeep, kITECreditsHeader, "2nd Executive Producer"},
 	{Common::EN_ANY, kITECreditsNotWyrmKeep, kITECreditsHeader, "Publisher"},
 	{Common::DE_DEU, kITECreditsNotWyrmKeep, kITECreditsHeader, "Herausgeber"},
@@ -1782,6 +1824,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsNotWyrmKeep, kITECreditsHeader, "\xF2\xF8\xE9\xEB\xE4"},
 	// "Издатель"
 	{Common::RU_RUS, kITECreditsNotWyrmKeep, kITECreditsHeader, "\xC8\xE7\xE4\xE0\xF2\xE5\xEB\xFC"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xa5\x58\xab\x7e\xa4\x48" /* 出品人 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
@@ -1789,7 +1832,8 @@ const IntroCredit creditsValley[] = {
 	{Common::JA_JPN, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	// "Джон Ван Канегем"
-	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xC4\xE6\xEE\xED \xC2\xE0\xED \xCA\xE0\xED\xE5\xE3\xE5\xEC"}
+	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xC4\xE6\xEE\xED \xC2\xE0\xED \xCA\xE0\xED\xE5\xE3\xE5\xEC"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 };
 
 const IntroCredit creditsTreeHouse1[] = {
@@ -1801,6 +1845,7 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xF2\xE9\xF6\xE5\xE1 \xE4\xEE\xF9\xE7\xF7"},
 	// "Дизайн игры"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xC4\xE8\xE7\xE0\xE9\xED \xE8\xE3\xF0\xFB"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb9\x43\xc0\xb8\xb3\x5d\xad\x70" /* 遊戲設計 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
@@ -1809,6 +1854,7 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	// "Талин, Джо Пирс, Роберт Макнелли"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD2\xE0\xEB\xE8\xED, \xC4\xE6\xEE \xCF\xE8\xF0\xF1, \xD0\xEE\xE1\xE5\xF0\xF2 \xCC\xE0\xEA\xED\xE5\xEB\xEB\xE8"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "and Carolly Hauksdottir"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "und Carolly Hauksdottir"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "e Carolly Hauksdottir"},
@@ -1817,6 +1863,7 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "and Carolly Hauksdottir"},
 	// "и Кэролли Хёйхсдоттир"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xE8 \xCA\xFD\xF0\xEE\xEB\xEB\xE8 \xD5\xB8\xE9\xF5\xF1\xE4\xEE\xF2\xF2\xE8\xF0"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "\xa4\xce Carolly Hauksdottir" /* 及 Carolly Hauksdottir */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsHeader, "Screenplay and Dialog"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Robert Leh, Len Wein, and Bill Rotsler"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsHeader, "Geschichte und Dialoge"},
@@ -1833,12 +1880,17 @@ const IntroCredit creditsTreeHouse1[] = {
 	// "Сценарий и диалоги"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xD1\xF6\xE5\xED\xE0\xF0\xE8\xE9 \xE8 \xE4\xE8\xE0\xEB\xEE\xE3\xE8"},
 	// "Роберт Ле, Лен Уэйн и Билл Ротслер"
-	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD0\xEE\xE1\xE5\xF0\xF2 \xCB\xE5, \xCB\xE5\xED \xD3\xFD\xE9\xED \xE8 \xC1\xE8\xEB\xEB \xD0\xEE\xF2\xF1\xEB\xE5\xF0"}
+	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD0\xEE\xE1\xE5\xF0\xF2 \xCB\xE5, \xCB\xE5\xED \xD3\xFD\xE9\xED \xE8 \xC1\xE8\xEB\xEB \xD0\xEE\xF2\xF1\xEB\xE5\xF0"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb5\x65\xad\xb1\xa4\xce\xb9\xef\xa5\xd5" /* 畫面及對白 */},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Robert Leh, Len Wein"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "\xa4\xce Bill Rotsler" /*  及 Bill Rotsler */},
 };
 
 const IntroCredit creditsTreeHouse2[] = {
 	{Common::UNK_LANG, kITECreditsWyrmKeep, kITECreditsHeader, "Art Direction"},
 	{Common::UNK_LANG, kITECreditsWyrmKeep, kITECreditsText, "Allison Hershey"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xac\xfc\xa4\x75\xab\xfc\xbe\xc9" /* 美工指導 */},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Allison Hershey"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsHeader, "Art"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsHeader, "Grafiken"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsHeader, "Grafica"},
@@ -1905,6 +1957,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xF4\xE9\xFA\xE5\xE7"},
 	// "Программирование"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xCF\xF0\xEE\xE3\xF0\xE0\xEC\xEC\xE8\xF0\xEE\xE2\xE0\xED\xE8\xE5"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb5\x7b\xa6\xa1\xb3\x5d\xad\x70" /* 程式設計 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Talin, Walter Hochbrueckner,"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Talin, Walter Hochbrueckner,"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Talin, Walter Hochbrueckner,"},
@@ -1921,6 +1974,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Joe Burks and Robert Wiggins"},
 	// "Джо Буркс и Роберт Виггинс"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xC4\xE6\xEE \xC1\xF3\xF0\xEA\xF1 \xE8 \xD0\xEE\xE1\xE5\xF0\xF2 \xC2\xE8\xE3\xE3\xE8\xED\xF1"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Joe Burks \xa4\xce Robert Wiggins" /* Joe Burks 及 Robert Wiggins */},
 	{Common::EN_ANY, kITECreditsPCCD | kITECreditsWyrmKeep, kITECreditsHeader, "Additional Programming"},
 	{Common::FR_FRA, kITECreditsPCCD | kITECreditsWyrmKeep, kITECreditsHeader, "Programmeur Additionnel"},
 	{Common::HE_ISR, kITECreditsPCCD | kITECreditsWyrmKeep, kITECreditsHeader, "\xF4\xE9\xFA\xE5\xE7 \xF0\xE5\xF1\xF3"},
@@ -1941,6 +1995,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xEE\xE5\xE6\xE9\xF7\xE4 \xE5\xF6\xEC\xE9\xEC\xE9\xED"},
 	// "Музыка и звук"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xCC\xF3\xE7\xFB\xEA\xE0 \xE8 \xE7\xE2\xF3\xEA"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xCC\xF3\xE7\xFB\xEA\xE0 \xE8 \xE7\xE2\xF3\xEA" "\xad\xb5\xbc\xd6\xa4\xce\xad\xb5\xae\xc4" /* 音樂及音效 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Matt Nathan"},
@@ -1948,7 +2003,8 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::JA_JPN, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	// "Мэтт Натан"
-	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xCC\xFD\xF2\xF2 \xCD\xE0\xF2\xE0\xED"}
+	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xCC\xFD\xF2\xF2 \xCD\xE0\xF2\xE0\xED"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 };
 
 const IntroCredit creditsFairePath2[] = {
@@ -1960,12 +2016,14 @@ const IntroCredit creditsFairePath2[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xE1\xE9\xEE\xE5\xE9"},
 	// "Директор проекта"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xC4\xE8\xF0\xE5\xEA\xF2\xEE\xF0 \xEF\xF0\xEE\xE5\xEA\xF2\xE0"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb9\x43\xc0\xb8\xbe\xc9\xba\x74" /* 遊戲導演 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::FR_FRA, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::JA_JPN, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Talin"},
+	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Talin"},
 	// "Талин"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD2\xE0\xEB\xE8\xED"},
 	{Common::FR_FRA, kITECreditsAny, kITECreditsHeader, "Traduction Francaise"},
diff --git a/engines/saga/itedata.h b/engines/saga/itedata.h
index a74eb0e4f33..103890b67b8 100644
--- a/engines/saga/itedata.h
+++ b/engines/saga/itedata.h
@@ -137,11 +137,11 @@ extern const IntroDialogue introDialogueCave2[][3];
 extern const IntroDialogue introDialogueCave3[][3];
 extern const IntroDialogue introDialogueCave4[][4];
 
-extern const IntroCredit creditsValley[43];
-extern const IntroCredit creditsTreeHouse1[36];
-extern const IntroCredit creditsTreeHouse2[51];
-extern const IntroCredit creditsFairePath1[45];
-extern const IntroCredit creditsFairePath2[21];
+extern const IntroCredit creditsValley[49];
+extern const IntroCredit creditsTreeHouse1[42];
+extern const IntroCredit creditsTreeHouse2[53];
+extern const IntroCredit creditsFairePath1[49];
+extern const IntroCredit creditsFairePath2[23];
 extern const IntroCredit creditsTent[6];
 
 } // End of namespace Saga


Commit: 396f14105cede9f2e027bd6e178c0a71dc31d4e7
    https://github.com/scummvm/scummvm/commit/396f14105cede9f2e027bd6e178c0a71dc31d4e7
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Replace Chinese floppy language id from Simplified to Traditional

Changed paths:
    engines/saga/detection_tables.h
    engines/saga/font.cpp
    engines/saga/interface.cpp
    engines/saga/itedata.cpp
    engines/saga/metaengine.cpp
    engines/saga/saga.cpp


diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h
index 48154e9ffa7..76643f99be0 100644
--- a/engines/saga/detection_tables.h
+++ b/engines/saga/detection_tables.h
@@ -1178,7 +1178,7 @@ static const SAGAGameDescription gameDescriptions[] = {
 				{"scripts.rsc",	GAME_SCRIPTFILE,					"516f7330f8410057b834424ea719d1ef", 281071},
 				AD_LISTEND
 			},
-			Common::ZH_CHN,
+			Common::ZH_TWN,
 			Common::kPlatformDOS,
 			ADGF_NO_FLAGS,
 			GUIO1(GUIO_NOSPEECH)
diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp
index 8f314b535b9..e70b26c64f6 100644
--- a/engines/saga/font.cpp
+++ b/engines/saga/font.cpp
@@ -153,7 +153,7 @@ DefaultFont::DefaultFont(SagaEngine *vm) : Font(vm), _fontMapping(0), _chineseFo
 		loadFont(&_fonts[i],	_vm->getFontDescription(i)->fontResourceId);
 	}
 
-	if (_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_CHN)
+	if (_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_TWN)
 		loadChineseFontITE("ite.fnt");
 }
 
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp
index e37d84a0860..a876a1a8a87 100644
--- a/engines/saga/interface.cpp
+++ b/engines/saga/interface.cpp
@@ -229,7 +229,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) {
 	_mainPanel.y = _vm->getDisplayInfo().mainPanelYOffset;
 	_mainPanel.currentButton = nullptr;
 
-	if (_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_CHN) {
+	if (_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_TWN) {
 		ByteArray n;
 		static const int kSkipLines = 4;
 		_mainPanel.imageHeight -= kSkipLines;
@@ -772,7 +772,7 @@ void Interface::drawVerbPanel(PanelButton* panelButton) {
 	point.y = _mainPanel.y + panelButton->yOffset;
 
 	// TODO: Find the correct sprite for Chinese version.
-	if (!(_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_CHN)) {
+	if (!(_vm->getGameId() == GID_ITE && _vm->getLanguage() == Common::ZH_TWN)) {
 		_vm->_sprite->draw(_mainPanel.sprites, spriteNumber, point, 256);
 	}
 
diff --git a/engines/saga/itedata.cpp b/engines/saga/itedata.cpp
index 9b5693f165c..47f04bca53f 100644
--- a/engines/saga/itedata.cpp
+++ b/engines/saga/itedata.cpp
@@ -1787,7 +1787,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xEE\xF4\xE9\xF7"},
 	// "Продюсер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xCF\xF0\xEE\xE4\xFE\xF1\xE5\xF0"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xbb\x73\xa7\x40\xc1\x60\xba\xca" /* 製作總監 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xbb\x73\xa7\x40\xc1\x60\xba\xca" /* 製作總監 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
@@ -1796,7 +1796,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	// "Уолтер Хохбрюкнер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD3\xEE\xEB\xF2\xE5\xF0 \xD5\xEE\xF5\xE1\xF0\xFE\xEA\xED\xE5\xF0"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Walter Hochbrueckner"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsHeader, "Executive Producer"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsHeader, "Ausf\201hrender Produzent"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsHeader, "Produttore Esecutivo"},
@@ -1805,7 +1805,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xEE\xF4\xE9\xF7 \xE1\xF4\xE5\xF2\xEC"},
 	// "Исполнительный продюсер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xC8\xF1\xEF\xEE\xEB\xED\xE8\xF2\xE5\xEB\xFC\xED\xFB\xE9 \xEF\xF0\xEE\xE4\xFE\xF1\xE5\xF0"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb0\xf5\xa6\xe6\xbb\x73\xa7\x40" /* 執行製作 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xb0\xf5\xa6\xe6\xbb\x73\xa7\x40" /* 執行製作 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Robert McNally"},
@@ -1814,7 +1814,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	// "Роберт Макнелли"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD0\xEE\xE1\xE5\xF0\xF2 \xCC\xE0\xEA\xED\xE5\xEB\xEB\xE8"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Robert McNally"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Robert McNally"},
 	{Common::UNK_LANG, kITECreditsWyrmKeep, kITECreditsHeader, "2nd Executive Producer"},
 	{Common::EN_ANY, kITECreditsNotWyrmKeep, kITECreditsHeader, "Publisher"},
 	{Common::DE_DEU, kITECreditsNotWyrmKeep, kITECreditsHeader, "Herausgeber"},
@@ -1824,7 +1824,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsNotWyrmKeep, kITECreditsHeader, "\xF2\xF8\xE9\xEB\xE4"},
 	// "Издатель"
 	{Common::RU_RUS, kITECreditsNotWyrmKeep, kITECreditsHeader, "\xC8\xE7\xE4\xE0\xF2\xE5\xEB\xFC"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xa5\x58\xab\x7e\xa4\x48" /* 出品人 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xa5\x58\xab\x7e\xa4\x48" /* 出品人 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
@@ -1833,7 +1833,7 @@ const IntroCredit creditsValley[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 	// "Джон Ван Канегем"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xC4\xE6\xEE\xED \xC2\xE0\xED \xCA\xE0\xED\xE5\xE3\xE5\xEC"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Jon Van Caneghem"},
 };
 
 const IntroCredit creditsTreeHouse1[] = {
@@ -1845,7 +1845,7 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xF2\xE9\xF6\xE5\xE1 \xE4\xEE\xF9\xE7\xF7"},
 	// "Дизайн игры"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xC4\xE8\xE7\xE0\xE9\xED \xE8\xE3\xF0\xFB"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb9\x43\xc0\xb8\xb3\x5d\xad\x70" /* 遊戲設計 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xb9\x43\xc0\xb8\xb3\x5d\xad\x70" /* 遊戲設計 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
@@ -1854,7 +1854,7 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	// "Талин, Джо Пирс, Роберт Макнелли"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD2\xE0\xEB\xE8\xED, \xC4\xE6\xEE \xCF\xE8\xF0\xF1, \xD0\xEE\xE1\xE5\xF0\xF2 \xCC\xE0\xEA\xED\xE5\xEB\xEB\xE8"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Talin, Joe Pearce, Robert McNally"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "and Carolly Hauksdottir"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "und Carolly Hauksdottir"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "e Carolly Hauksdottir"},
@@ -1863,7 +1863,7 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "and Carolly Hauksdottir"},
 	// "и Кэролли Хёйхсдоттир"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xE8 \xCA\xFD\xF0\xEE\xEB\xEB\xE8 \xD5\xB8\xE9\xF5\xF1\xE4\xEE\xF2\xF2\xE8\xF0"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "\xa4\xce Carolly Hauksdottir" /* 及 Carolly Hauksdottir */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "\xa4\xce Carolly Hauksdottir" /* 及 Carolly Hauksdottir */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsHeader, "Screenplay and Dialog"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Robert Leh, Len Wein, and Bill Rotsler"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsHeader, "Geschichte und Dialoge"},
@@ -1881,16 +1881,16 @@ const IntroCredit creditsTreeHouse1[] = {
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xD1\xF6\xE5\xED\xE0\xF0\xE8\xE9 \xE8 \xE4\xE8\xE0\xEB\xEE\xE3\xE8"},
 	// "Роберт Ле, Лен Уэйн и Билл Ротслер"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD0\xEE\xE1\xE5\xF0\xF2 \xCB\xE5, \xCB\xE5\xED \xD3\xFD\xE9\xED \xE8 \xC1\xE8\xEB\xEB \xD0\xEE\xF2\xF1\xEB\xE5\xF0"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb5\x65\xad\xb1\xa4\xce\xb9\xef\xa5\xd5" /* 畫面及對白 */},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Robert Leh, Len Wein"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "\xa4\xce Bill Rotsler" /*  及 Bill Rotsler */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xb5\x65\xad\xb1\xa4\xce\xb9\xef\xa5\xd5" /* 畫面及對白 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Robert Leh, Len Wein"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "\xa4\xce Bill Rotsler" /*  及 Bill Rotsler */},
 };
 
 const IntroCredit creditsTreeHouse2[] = {
 	{Common::UNK_LANG, kITECreditsWyrmKeep, kITECreditsHeader, "Art Direction"},
 	{Common::UNK_LANG, kITECreditsWyrmKeep, kITECreditsText, "Allison Hershey"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xac\xfc\xa4\x75\xab\xfc\xbe\xc9" /* 美工指導 */},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Allison Hershey"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xac\xfc\xa4\x75\xab\xfc\xbe\xc9" /* 美工指導 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Allison Hershey"},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsHeader, "Art"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsHeader, "Grafiken"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsHeader, "Grafica"},
@@ -1957,7 +1957,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xF4\xE9\xFA\xE5\xE7"},
 	// "Программирование"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xCF\xF0\xEE\xE3\xF0\xE0\xEC\xEC\xE8\xF0\xEE\xE2\xE0\xED\xE8\xE5"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb5\x7b\xa6\xa1\xb3\x5d\xad\x70" /* 程式設計 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xb5\x7b\xa6\xa1\xb3\x5d\xad\x70" /* 程式設計 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Talin, Walter Hochbrueckner,"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Talin, Walter Hochbrueckner,"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Talin, Walter Hochbrueckner,"},
@@ -1974,7 +1974,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Joe Burks and Robert Wiggins"},
 	// "Джо Буркс и Роберт Виггинс"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xC4\xE6\xEE \xC1\xF3\xF0\xEA\xF1 \xE8 \xD0\xEE\xE1\xE5\xF0\xF2 \xC2\xE8\xE3\xE3\xE8\xED\xF1"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Joe Burks \xa4\xce Robert Wiggins" /* Joe Burks 及 Robert Wiggins */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Joe Burks \xa4\xce Robert Wiggins" /* Joe Burks 及 Robert Wiggins */},
 	{Common::EN_ANY, kITECreditsPCCD | kITECreditsWyrmKeep, kITECreditsHeader, "Additional Programming"},
 	{Common::FR_FRA, kITECreditsPCCD | kITECreditsWyrmKeep, kITECreditsHeader, "Programmeur Additionnel"},
 	{Common::HE_ISR, kITECreditsPCCD | kITECreditsWyrmKeep, kITECreditsHeader, "\xF4\xE9\xFA\xE5\xE7 \xF0\xE5\xF1\xF3"},
@@ -1995,7 +1995,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xEE\xE5\xE6\xE9\xF7\xE4 \xE5\xF6\xEC\xE9\xEC\xE9\xED"},
 	// "Музыка и звук"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xCC\xF3\xE7\xFB\xEA\xE0 \xE8 \xE7\xE2\xF3\xEA"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xCC\xF3\xE7\xFB\xEA\xE0 \xE8 \xE7\xE2\xF3\xEA" "\xad\xb5\xbc\xd6\xa4\xce\xad\xb5\xae\xc4" /* 音樂及音效 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xCC\xF3\xE7\xFB\xEA\xE0 \xE8 \xE7\xE2\xF3\xEA" "\xad\xb5\xbc\xd6\xa4\xce\xad\xb5\xae\xc4" /* 音樂及音效 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Matt Nathan"},
@@ -2004,7 +2004,7 @@ const IntroCredit creditsFairePath1[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 	// "Мэтт Натан"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xCC\xFD\xF2\xF2 \xCD\xE0\xF2\xE0\xED"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Matt Nathan"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Matt Nathan"},
 };
 
 const IntroCredit creditsFairePath2[] = {
@@ -2016,14 +2016,14 @@ const IntroCredit creditsFairePath2[] = {
 	{Common::HE_ISR, kITECreditsAny, kITECreditsHeader, "\xE1\xE9\xEE\xE5\xE9"},
 	// "Директор проекта"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsHeader, "\xC4\xE8\xF0\xE5\xEA\xF2\xEE\xF0 \xEF\xF0\xEE\xE5\xEA\xF2\xE0"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsHeader, "\xb9\x43\xc0\xb8\xbe\xc9\xba\x74" /* 遊戲導演 */},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsHeader, "\xb9\x43\xc0\xb8\xbe\xc9\xba\x74" /* 遊戲導演 */},
 	{Common::EN_ANY, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::DE_DEU, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::IT_ITA, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::FR_FRA, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::JA_JPN, kITECreditsAny, kITECreditsText, "Talin"},
 	{Common::HE_ISR, kITECreditsAny, kITECreditsText, "Talin"},
-	{Common::ZH_CHN, kITECreditsAny, kITECreditsText, "Talin"},
+	{Common::ZH_TWN, kITECreditsAny, kITECreditsText, "Talin"},
 	// "Талин"
 	{Common::RU_RUS, kITECreditsAny, kITECreditsText, "\xD2\xE0\xEB\xE8\xED"},
 	{Common::FR_FRA, kITECreditsAny, kITECreditsHeader, "Traduction Francaise"},
diff --git a/engines/saga/metaengine.cpp b/engines/saga/metaengine.cpp
index 07601a34d91..043f69700f4 100644
--- a/engines/saga/metaengine.cpp
+++ b/engines/saga/metaengine.cpp
@@ -253,7 +253,7 @@ bool SagaEngine::initGame() {
 const GameDisplayInfo &SagaEngine::getDisplayInfo() {
 	switch (_gameDescription->gameId) {
 		case GID_ITE:
-			if (getLanguage() == Common::ZH_CHN)
+			if (getLanguage() == Common::ZH_TWN)
 				return ITE_DisplayInfo_ZH;
 			return ITE_DisplayInfo;
 #ifdef ENABLE_IHNM
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index 497b077c0a6..6a1f9e9a0d4 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -488,7 +488,7 @@ int SagaEngine::getLanguageIndex() {
 		return 6;
 	case Common::HE_ISR:
 		return 7;
-	case Common::ZH_CHN:
+	case Common::ZH_TWN:
 		return 8;
 	default:
 		return 0;


Commit: c43e8f2cec921b063bb2dd4d25e7bb368ce148d4
    https://github.com/scummvm/scummvm/commit/c43e8f2cec921b063bb2dd4d25e7bb368ce148d4
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Fix inconsistencies in big5 variable use

Changed paths:
    engines/saga/font.cpp


diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp
index e70b26c64f6..30d60095210 100644
--- a/engines/saga/font.cpp
+++ b/engines/saga/font.cpp
@@ -337,7 +337,7 @@ int DefaultFont::getStringWidth(FontId fontId, const char *text, size_t count, F
 	const byte *txt;
 	FontData *font = getFont(fontId);
 	txt = (const byte *) text;
-	byte isBig5 = _chineseFont ? true : false;
+	bool isBig5 = !!_chineseFont;
 
 	for (ct = count; *txt && (!count || ct > 0); txt++, ct--) {
 		ch = *txt & 0xFFU;
@@ -504,7 +504,7 @@ void DefaultFont::outFont(const FontStyle &drawFont, const char *text, size_t co
 	textPointer = (const byte *)text;
 	ct = count;
 
-	byte isBig5 = _chineseFont ? true : false;
+	bool isBig5 = !!_chineseFont;
 
 	// Draw string one character at a time, maximum of 'draw_str'_ct
 	// characters, or no limit if 'draw_str_ct' is 0


Commit: c61ec5664fb2c904e6eb8c436e0c0121dff5e80f
    https://github.com/scummvm/scummvm/commit/c61ec5664fb2c904e6eb8c436e0c0121dff5e80f
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Fix position of asterisk in pointer declaration

Changed paths:
    engines/saga/font.cpp


diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp
index 30d60095210..59d62a2d806 100644
--- a/engines/saga/font.cpp
+++ b/engines/saga/font.cpp
@@ -469,7 +469,7 @@ int DefaultFont::getHeight(FontId fontId, const char *text) {
 	if (!_chineseFont || _chineseFontHeight < singleByteHeight)
 		return singleByteHeight;
 
-	for (const byte* textPointer = (const byte *)text; *textPointer; textPointer++)
+	for (const byte *textPointer = (const byte *)text; *textPointer; textPointer++)
 		if (*textPointer & 0x80)
 			return _chineseFontHeight;
 


Commit: e1aa80ec9389921c526a393828c5742d8e70f0e3
    https://github.com/scummvm/scummvm/commit/e1aa80ec9389921c526a393828c5742d8e70f0e3
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-14T00:39:47+01:00

Commit Message:
SAGA: Add TODOs for missing Chinese strings

Changed paths:
    engines/saga/itedata.cpp


diff --git a/engines/saga/itedata.cpp b/engines/saga/itedata.cpp
index 47f04bca53f..ec569db07a6 100644
--- a/engines/saga/itedata.cpp
+++ b/engines/saga/itedata.cpp
@@ -591,17 +591,17 @@ const char *ITEinterfaceTextStrings[][53] = {
 		"\xb8\xfc\xa4\x4a\xa6\xa8\xa5\x5c" /* 載入成功, Load Successful! */,
 		"\xbd\xd0\xbf\xe9\xa4\x4a\xa6\x73\xc0\xc9\xa6\x57\xba\xd9" /* 請輸入存檔名稱, Enter Save Game Name */,
 
-		"Give %s to %s",
-		"Use %s with %s",
+		"Give %s to %s", // TODO: Find string for this
+		"Use %s with %s", // TODO: Find string for this
 		"[New Save Game]",
-		"I can't pick that up.",
-		"I see nothing special about it.",
-		"There's no place to open it.",
-		"There's no opening to close.",
-		"I don't know how to do that.",
-		"Show Dialog",
+		"I can't pick that up.", // TODO: Find string for this
+		"I see nothing special about it.", // TODO: Find string for this
+		"There's no place to open it.", // TODO: Find string for this
+		"There's no opening to close.", // TODO: Find string for this
+		"I don't know how to do that.", // TODO: Find string for this
+		"Show Dialog", // TODO: Find string for this
 		"\xa7\x51\xa4\xd2\xaa\xba\xa6\x5e\xb5\xaa\xac\x4f\xa4\xb0\xbb\xf2\xa1\x48" /* 利夫的回答是什麼?; What is Rif's reply? */,
-		"Loading a saved game"
+		"Loading a saved game" // TODO: Find string for this
 	},
 };
 




More information about the Scummvm-git-logs mailing list