Example #1
0
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);
}
Example #2
0
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 {
Example #3
0
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 {