Common::String EngineState::getLanguageString(const char *str, kLanguage lang) const { kLanguage secondLang = K_LANG_NONE; const char *seeker = str; while (*seeker) { if ((*seeker == '%') || (*seeker == '#')) { secondLang = charToLanguage(*(seeker + 1)); if (secondLang != K_LANG_NONE) break; } seeker++; } if ((secondLang == K_LANG_JAPANESE) && (*(seeker + 1) == 'J')) { // FIXME: Add Kanji support lang = K_LANG_ENGLISH; } if (secondLang == lang) return Common::String(seeker + 2); if (seeker) return Common::String(str, seeker - str); else return Common::String(str); }
Common::String SciEngine::getSciLanguageString(const Common::String &str, kLanguage lang, kLanguage *lang2) const { kLanguage secondLang = K_LANG_NONE; const char *seeker = str.c_str(); while (*seeker) { if ((*seeker == '%') || (*seeker == '#')) { secondLang = charToLanguage(*(seeker + 1)); if (secondLang != K_LANG_NONE) break; } ++seeker; } // Return the secondary language found in the string if (lang2) *lang2 = secondLang; if (secondLang == lang) { if (*(++seeker) == 'J') { // Japanese including Kanji, displayed with system font // Convert half-width characters to full-width equivalents Common::String fullWidth; byte c; while ((c = *(++seeker))) { uint16 mappedChar = s_halfWidthSJISMap[c]; if (mappedChar) { fullWidth += mappedChar >> 8; fullWidth += mappedChar & 0xFF; } else { // Copy double-byte character char c2 = *(++seeker); if (!c2) { error("SJIS character %02X is missing second byte", c); break; } fullWidth += c; fullWidth += c2; } } return fullWidth; } else {
Common::String SciEngine::getSciLanguageString(const Common::String &str, kLanguage requestedLanguage, kLanguage *secondaryLanguage, uint16 *languageSplitter) const { kLanguage foundLanguage = K_LANG_NONE; const byte *textPtr = (byte *)str.c_str(); byte curChar = 0; byte curChar2 = 0; while (1) { curChar = *textPtr; if (!curChar) break; if ((curChar == '%') || (curChar == '#')) { curChar2 = *(textPtr + 1); foundLanguage = charToLanguage(curChar2); if (foundLanguage != K_LANG_NONE) { // Return language splitter if (languageSplitter) *languageSplitter = curChar | ( curChar2 << 8 ); // Return the secondary language found in the string if (secondaryLanguage) *secondaryLanguage = foundLanguage; break; } } textPtr++; } if (foundLanguage == requestedLanguage) { if (curChar2 == 'J') { // Japanese including Kanji, displayed with system font // Convert half-width characters to full-width equivalents Common::String fullWidth; uint16 mappedChar; textPtr += 2; // skip over language splitter while (1) { curChar = *textPtr; switch (curChar) { case 0: // Terminator NUL return fullWidth; case '\\': // "\n", "\N", "\r" and "\R" were overwritten with SPACE + 0x0D in PC-9801 SSCI // inside GetLongest() (text16). We do it here, because it's much cleaner and // we have to process the text here anyway. // Occurs for example in Police Quest 2 intro curChar2 = *(textPtr + 1); switch (curChar2) { case 'n': case 'N': case 'r': case 'R': fullWidth += ' '; fullWidth += 0x0D; // CR textPtr += 2; continue; } } textPtr++; mappedChar = s_halfWidthSJISMap[curChar]; if (mappedChar) { fullWidth += mappedChar >> 8; fullWidth += mappedChar & 0xFF; } else { // Copy double-byte character curChar2 = *(textPtr++); if (!curChar) { error("SJIS character %02X is missing second byte", curChar); break; } fullWidth += curChar; fullWidth += curChar2; } } } else {