diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 329e677d77..a7b907e86d 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -30,79 +30,79 @@ extern "C" { #include "localisation.h" enum { - RCT2_LANGUAGE_ID_ENGLISH_UK, - RCT2_LANGUAGE_ID_ENGLISH_US, - RCT2_LANGUAGE_ID_FRENCH, - RCT2_LANGUAGE_ID_GERMAN, - RCT2_LANGUAGE_ID_SPANISH, - RCT2_LANGUAGE_ID_ITALIAN, - RCT2_LANGUAGE_ID_DUTCH, - RCT2_LANGUAGE_ID_SWEDISH, - RCT2_LANGUAGE_ID_8, - RCT2_LANGUAGE_ID_KOREAN, - RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED, - RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL, - RCT2_LANGUAGE_ID_12, - RCT2_LANGUAGE_ID_PORTUGUESE, - RCT2_LANGUAGE_ID_END = 255 + RCT2_LANGUAGE_ID_ENGLISH_UK, + RCT2_LANGUAGE_ID_ENGLISH_US, + RCT2_LANGUAGE_ID_FRENCH, + RCT2_LANGUAGE_ID_GERMAN, + RCT2_LANGUAGE_ID_SPANISH, + RCT2_LANGUAGE_ID_ITALIAN, + RCT2_LANGUAGE_ID_DUTCH, + RCT2_LANGUAGE_ID_SWEDISH, + RCT2_LANGUAGE_ID_8, + RCT2_LANGUAGE_ID_KOREAN, + RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED, + RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL, + RCT2_LANGUAGE_ID_12, + RCT2_LANGUAGE_ID_PORTUGUESE, + RCT2_LANGUAGE_ID_END = 255 }; static TTFFontSetDescriptor TTFFontMSGothic = {{ - { "msgothic.ttc", "MS PGothic", 9, 1, 0, 15, nullptr }, - { "msgothic.ttc", "MS PGothic", 12, 1, 0, 17, nullptr }, - { "msgothic.ttc", "MS PGothic", 12, 1, 0, 17, nullptr }, - { "msgothic.ttc", "MS PGothic", 13, 1, 0, 20, nullptr }, + { "msgothic.ttc", "MS PGothic", 9, 1, 0, 15, nullptr }, + { "msgothic.ttc", "MS PGothic", 12, 1, 0, 17, nullptr }, + { "msgothic.ttc", "MS PGothic", 12, 1, 0, 17, nullptr }, + { "msgothic.ttc", "MS PGothic", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontMingLiu = {{ - { "msjh.ttc", "JhengHei", 9, -1, -3, 6, nullptr }, - { "mingliu.ttc", "MingLiU", 11, 1, 1, 12, nullptr }, - { "mingliu.ttc", "MingLiU", 12, 1, 0, 12, nullptr }, - { "mingliu.ttc", "MingLiU", 13, 1, 0, 20, nullptr }, + { "msjh.ttc", "JhengHei", 9, -1, -3, 6, nullptr }, + { "mingliu.ttc", "MingLiU", 11, 1, 1, 12, nullptr }, + { "mingliu.ttc", "MingLiU", 12, 1, 0, 12, nullptr }, + { "mingliu.ttc", "MingLiU", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontSimSun = {{ - { "msyh.ttc", "YaHei", 9, -1, -3, 6, nullptr }, - { "simsun.ttc", "SimSun", 11, 1, -1, 14, nullptr }, - { "simsun.ttc", "SimSun", 12, 1, -2, 14, nullptr }, - { "simsun.ttc", "SimSun", 13, 1, 0, 20, nullptr }, + { "msyh.ttc", "YaHei", 9, -1, -3, 6, nullptr }, + { "simsun.ttc", "SimSun", 11, 1, -1, 14, nullptr }, + { "simsun.ttc", "SimSun", 12, 1, -2, 14, nullptr }, + { "simsun.ttc", "SimSun", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontGulim = {{ - { "gulim.ttc", "Gulim", 11, 1, 0, 15, nullptr }, - { "gulim.ttc", "Gulim", 12, 1, 0, 17, nullptr }, - { "gulim.ttc", "Gulim", 12, 1, 0, 17, nullptr }, - { "gulim.ttc", "Gulim", 13, 1, 0, 20, nullptr }, + { "gulim.ttc", "Gulim", 11, 1, 0, 15, nullptr }, + { "gulim.ttc", "Gulim", 12, 1, 0, 17, nullptr }, + { "gulim.ttc", "Gulim", 12, 1, 0, 17, nullptr }, + { "gulim.ttc", "Gulim", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontArial = {{ - { "arial.ttf", "Arial", 8, 0, -1, 6, nullptr }, - { "arial.ttf", "Arial", 10, 0, -1, 12, nullptr }, - { "arial.ttf", "Arial", 11, 0, -1, 12, nullptr }, - { "arial.ttf", "Arial", 12, 0, -1, 20, nullptr }, + { "arial.ttf", "Arial", 8, 0, -1, 6, nullptr }, + { "arial.ttf", "Arial", 10, 0, -1, 12, nullptr }, + { "arial.ttf", "Arial", 11, 0, -1, 12, nullptr }, + { "arial.ttf", "Arial", 12, 0, -1, 20, nullptr }, }}; const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { - { "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED - { "en-GB", "English (UK)", "English (UK)", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_ENGLISH_UK - { "en-US", "English (US)", "English (US)", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_US }, // LANGUAGE_ENGLISH_US - { "de-DE", "German", "Deutsch", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_GERMAN }, // LANGUAGE_GERMAN - { "nl-NL", "Dutch", "Nederlands", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_DUTCH }, // LANGUAGE_DUTCH - { "fr-FR", "French", "Fran\xC3\xA7" "ais", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_FRENCH }, // LANGUAGE_FRENCH - { "hu-HU", "Hungarian", "Magyar", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_HUNGARIAN - { "pl-PL", "Polish", "Polski", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_POLISH - { "es-ES", "Spanish", "Espa\xC3\xB1ol", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SPANISH }, // LANGUAGE_SPANISH - { "sv-SE", "Swedish", "Svenska", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH - { "it-IT", "Italian", "Italiano", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN - { "pt-BR", "Portuguese (BR)", "Portugu\xC3\xAAs (BR)", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGUESE }, // LANGUAGE_PORTUGUESE_BR - { "zh-TW", "Chinese (Traditional)", "Chinese (Traditional)", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL - { "zh-CN", "Chinese (Simplified)", "Chinese (Simplified)", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED - { "fi-FI", "Finnish", "Suomi", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH - { "ko-KR", "Korean", "Korean", &TTFFontGulim, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN - { "ru-RU", "Russian", "Russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN - { "cs-CZ", "Czech", "Czech", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_CZECH - { "ja-JP", "Japanese", "Japanese", &TTFFontMSGothic, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_JAPANESE - { "nb-NO", "Norwegian", "Norsk", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK, }, // LANGUAGE_NORWEGIAN + { "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED + { "en-GB", "English (UK)", "English (UK)", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_ENGLISH_UK + { "en-US", "English (US)", "English (US)", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_US }, // LANGUAGE_ENGLISH_US + { "de-DE", "German", "Deutsch", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_GERMAN }, // LANGUAGE_GERMAN + { "nl-NL", "Dutch", "Nederlands", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_DUTCH }, // LANGUAGE_DUTCH + { "fr-FR", "French", "Fran\xC3\xA7" "ais", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_FRENCH }, // LANGUAGE_FRENCH + { "hu-HU", "Hungarian", "Magyar", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_HUNGARIAN + { "pl-PL", "Polish", "Polski", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_POLISH + { "es-ES", "Spanish", "Espa\xC3\xB1ol", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SPANISH }, // LANGUAGE_SPANISH + { "sv-SE", "Swedish", "Svenska", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH + { "it-IT", "Italian", "Italiano", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN + { "pt-BR", "Portuguese (BR)", "Portugu\xC3\xAAs (BR)", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGUESE }, // LANGUAGE_PORTUGUESE_BR + { "zh-TW", "Chinese (Traditional)", "Chinese (Traditional)", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL + { "zh-CN", "Chinese (Simplified)", "Chinese (Simplified)", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED + { "fi-FI", "Finnish", "Suomi", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH + { "ko-KR", "Korean", "Korean", &TTFFontGulim, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN + { "ru-RU", "Russian", "Russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN + { "cs-CZ", "Czech", "Czech", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_CZECH + { "ja-JP", "Japanese", "Japanese", &TTFFontMSGothic, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_JAPANESE + { "nb-NO", "Norwegian", "Norsk", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK, }, // LANGUAGE_NORWEGIAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; @@ -111,132 +111,132 @@ bool gUseTrueTypeFont = false; ILanguagePack *_languageFallback = nullptr; ILanguagePack *_languageCurrent = nullptr; -const utf8 BlackUpArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB2, (utf8)0x00 }; -const utf8 BlackDownArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xBC, (utf8)0x00 }; -const utf8 BlackLeftArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x97, (utf8)0x80, (utf8)0x00 }; -const utf8 BlackRightArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB6, (utf8)0x00 }; -const utf8 CheckBoxMarkString[] = { (utf8)0xE2, (utf8)0x9C, (utf8)0x93, (utf8)0x00 }; +const utf8 BlackUpArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB2, (utf8)0x00 }; +const utf8 BlackDownArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xBC, (utf8)0x00 }; +const utf8 BlackLeftArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x97, (utf8)0x80, (utf8)0x00 }; +const utf8 BlackRightArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB6, (utf8)0x00 }; +const utf8 CheckBoxMarkString[] = { (utf8)0xE2, (utf8)0x9C, (utf8)0x93, (utf8)0x00 }; void utf8_remove_format_codes(utf8 *text, bool allowcolours) { - utf8 *dstCh = text; - utf8 *ch = text; - int codepoint; - while ((codepoint = utf8_get_next(ch, (const utf8**)&ch)) != 0) { - if (!utf8_is_format_code(codepoint) || (allowcolours && utf8_is_colour_code(codepoint))) { - dstCh = utf8_write_codepoint(dstCh, codepoint); - } - } - *dstCh = 0; + utf8 *dstCh = text; + utf8 *ch = text; + int codepoint; + while ((codepoint = utf8_get_next(ch, (const utf8**)&ch)) != 0) { + if (!utf8_is_format_code(codepoint) || (allowcolours && utf8_is_colour_code(codepoint))) { + dstCh = utf8_write_codepoint(dstCh, codepoint); + } + } + *dstCh = 0; } const char *language_get_string(rct_string_id id) { - const char *openrctString = nullptr; + const char *openrctString = nullptr; - if (id == STR_NONE) - return nullptr; + if (id == STR_NONE) + return nullptr; - if (_languageCurrent != nullptr) - openrctString = _languageCurrent->GetString(id); - if (openrctString == nullptr && _languageFallback != nullptr) - openrctString = _languageFallback->GetString(id); - if (openrctString == nullptr) - openrctString = "(undefined string)"; + if (_languageCurrent != nullptr) + openrctString = _languageCurrent->GetString(id); + if (openrctString == nullptr && _languageFallback != nullptr) + openrctString = _languageFallback->GetString(id); + if (openrctString == nullptr) + openrctString = "(undefined string)"; - return openrctString; + return openrctString; } bool language_open(int id) { - char filename[MAX_PATH]; - char dataPath[MAX_PATH]; + char filename[MAX_PATH]; + char dataPath[MAX_PATH]; - language_close_all(); - if (id == LANGUAGE_UNDEFINED) - return false; + language_close_all(); + if (id == LANGUAGE_UNDEFINED) + return false; - platform_get_openrct_data_path(dataPath, sizeof(dataPath)); - if (id != LANGUAGE_ENGLISH_UK) { - safe_strcpy(filename, dataPath, MAX_PATH); - safe_strcat_path(filename, "language", MAX_PATH); - safe_strcat_path(filename, LanguagesDescriptors[LANGUAGE_ENGLISH_UK].locale, MAX_PATH); - path_append_extension(filename, ".txt", MAX_PATH); - _languageFallback = LanguagePackFactory::FromFile(LANGUAGE_ENGLISH_UK, filename); - } + platform_get_openrct_data_path(dataPath, sizeof(dataPath)); + if (id != LANGUAGE_ENGLISH_UK) { + safe_strcpy(filename, dataPath, MAX_PATH); + safe_strcat_path(filename, "language", MAX_PATH); + safe_strcat_path(filename, LanguagesDescriptors[LANGUAGE_ENGLISH_UK].locale, MAX_PATH); + path_append_extension(filename, ".txt", MAX_PATH); + _languageFallback = LanguagePackFactory::FromFile(LANGUAGE_ENGLISH_UK, filename); + } - safe_strcpy(filename, dataPath, MAX_PATH); - safe_strcat_path(filename, "language", MAX_PATH); - safe_strcat_path(filename, LanguagesDescriptors[id].locale, MAX_PATH); - path_append_extension(filename, ".txt", MAX_PATH); - _languageCurrent = LanguagePackFactory::FromFile(id, filename); - if (_languageCurrent != nullptr) { - gCurrentLanguage = id; + safe_strcpy(filename, dataPath, MAX_PATH); + safe_strcat_path(filename, "language", MAX_PATH); + safe_strcat_path(filename, LanguagesDescriptors[id].locale, MAX_PATH); + path_append_extension(filename, ".txt", MAX_PATH); + _languageCurrent = LanguagePackFactory::FromFile(id, filename); + if (_languageCurrent != nullptr) { + gCurrentLanguage = id; - if (LanguagesDescriptors[id].font == FONT_OPENRCT2_SPRITE) { - ttf_dispose(); - gUseTrueTypeFont = false; - gCurrentTTFFontSet = nullptr; - } else { - if (!String::IsNullOrEmpty(gConfigFonts.file_name)) { - static TTFFontSetDescriptor TTFFontCustom = {{ - { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_tiny, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_tiny, nullptr }, - { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_small, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_small, nullptr }, - { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_medium, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_medium, nullptr }, - { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_big, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_big, nullptr }, - }}; - ttf_dispose(); - gUseTrueTypeFont = true; - gCurrentTTFFontSet = &TTFFontCustom; - - bool font_initialised = ttf_initialise(); - if (!font_initialised) { - log_warning("Unable to initialise configured TrueType font -- falling back to Language default."); - } else { - // Objects and their localized strings need to be refreshed - GetObjectManager()->ResetObjects(); - return true; - } - } - ttf_dispose(); - gUseTrueTypeFont = true; - gCurrentTTFFontSet = LanguagesDescriptors[id].font; - bool font_initialised = ttf_initialise(); + if (LanguagesDescriptors[id].font == FONT_OPENRCT2_SPRITE) { + ttf_dispose(); + gUseTrueTypeFont = false; + gCurrentTTFFontSet = nullptr; + } else { + if (!String::IsNullOrEmpty(gConfigFonts.file_name)) { + static TTFFontSetDescriptor TTFFontCustom = {{ + { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_tiny, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_tiny, nullptr }, + { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_small, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_small, nullptr }, + { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_medium, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_medium, nullptr }, + { gConfigFonts.file_name, gConfigFonts.font_name, gConfigFonts.size_big, gConfigFonts.x_offset, gConfigFonts.y_offset, gConfigFonts.height_big, nullptr }, + }}; + ttf_dispose(); + gUseTrueTypeFont = true; + gCurrentTTFFontSet = &TTFFontCustom; + + bool font_initialised = ttf_initialise(); + if (!font_initialised) { + log_warning("Unable to initialise configured TrueType font -- falling back to Language default."); + } else { + // Objects and their localized strings need to be refreshed + GetObjectManager()->ResetObjects(); + return true; + } + } + ttf_dispose(); + gUseTrueTypeFont = true; + gCurrentTTFFontSet = LanguagesDescriptors[id].font; + bool font_initialised = ttf_initialise(); - // Have we tried Arial yet? - if (!font_initialised && gCurrentTTFFontSet != &TTFFontArial) { - log_warning("Unable to initialise prefered TrueType font -- falling back to Arial."); - gCurrentTTFFontSet = &TTFFontArial; - font_initialised = ttf_initialise(); - } + // Have we tried Arial yet? + if (!font_initialised && gCurrentTTFFontSet != &TTFFontArial) { + log_warning("Unable to initialise prefered TrueType font -- falling back to Arial."); + gCurrentTTFFontSet = &TTFFontArial; + font_initialised = ttf_initialise(); + } - // Fall back to sprite font. - if (!font_initialised) { - log_warning("Falling back to sprite font."); - gUseTrueTypeFont = false; - gCurrentTTFFontSet = nullptr; - return false; - } - } + // Fall back to sprite font. + if (!font_initialised) { + log_warning("Falling back to sprite font."); + gUseTrueTypeFont = false; + gCurrentTTFFontSet = nullptr; + return false; + } + } - // Objects and their localized strings need to be refreshed - GetObjectManager()->ResetObjects(); - return true; - } + // Objects and their localized strings need to be refreshed + GetObjectManager()->ResetObjects(); + return true; + } - return 0; + return 0; } void language_close_all() { - SafeDelete(_languageFallback); - SafeDelete(_languageCurrent); - gCurrentLanguage = LANGUAGE_UNDEFINED; + SafeDelete(_languageFallback); + SafeDelete(_languageCurrent); + gCurrentLanguage = LANGUAGE_UNDEFINED; } -#define STEX_BASE_STRING_ID 3447 -#define NONSTEX_BASE_STRING_ID 3463 -#define MAX_OBJECT_CACHED_STRINGS 2048 +#define STEX_BASE_STRING_ID 3447 +#define NONSTEX_BASE_STRING_ID 3463 +#define MAX_OBJECT_CACHED_STRINGS 2048 /* rct2: 0x0098DA16 */ uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; @@ -245,81 +245,81 @@ utf8 *_cachedObjectStrings[MAX_OBJECT_CACHED_STRINGS] = { nullptr }; static void utf8_trim_string(utf8 *text) { - utf8 *src = text; - utf8 *dst = text; - utf8 *last = text; - int codepoint; + utf8 *src = text; + utf8 *dst = text; + utf8 *last = text; + int codepoint; - // Trim left - while ((codepoint = utf8_get_next(src, (const utf8**)&src)) != 0) { - if (codepoint != ' ') { - dst = utf8_write_codepoint(dst, codepoint); - last = dst; - break; - } - } - if (codepoint != 0) { - // Trim right - while ((codepoint = utf8_get_next(src, (const utf8**)&src)) != 0) { - dst = utf8_write_codepoint(dst, codepoint); - if (codepoint != ' ') { - last = dst; - } - } - } - *last = 0; + // Trim left + while ((codepoint = utf8_get_next(src, (const utf8**)&src)) != 0) { + if (codepoint != ' ') { + dst = utf8_write_codepoint(dst, codepoint); + last = dst; + break; + } + } + if (codepoint != 0) { + // Trim right + while ((codepoint = utf8_get_next(src, (const utf8**)&src)) != 0) { + dst = utf8_write_codepoint(dst, codepoint); + if (codepoint != ' ') { + last = dst; + } + } + } + *last = 0; } static wchar_t convert_specific_language_character_to_unicode(int languageId, wchar_t codepoint) { - switch (languageId) { - case RCT2_LANGUAGE_ID_KOREAN: - return codepoint; - case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL: - return encoding_convert_big5_to_unicode(codepoint); - case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED: - return encoding_convert_gb2312_to_unicode(codepoint); - default: - return codepoint; - } + switch (languageId) { + case RCT2_LANGUAGE_ID_KOREAN: + return codepoint; + case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL: + return encoding_convert_big5_to_unicode(codepoint); + case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED: + return encoding_convert_gb2312_to_unicode(codepoint); + default: + return codepoint; + } } static utf8 *convert_multibyte_charset(const char *src, int languageId) { - size_t reservedLength = (strlen(src) * 4) + 1; - utf8 *buffer = (utf8*)malloc(reservedLength); - utf8 *dst = buffer; - for (const uint8 *ch = (const uint8*)src; *ch != 0;) { - if (*ch == 0xFF) { - ch++; - uint8 a = *ch++; - uint8 b = *ch++; - uint16 codepoint = (a << 8) | b; + size_t reservedLength = (strlen(src) * 4) + 1; + utf8 *buffer = (utf8*)malloc(reservedLength); + utf8 *dst = buffer; + for (const uint8 *ch = (const uint8*)src; *ch != 0;) { + if (*ch == 0xFF) { + ch++; + uint8 a = *ch++; + uint8 b = *ch++; + uint16 codepoint = (a << 8) | b; - codepoint = convert_specific_language_character_to_unicode(languageId, codepoint); - dst = utf8_write_codepoint(dst, codepoint); - } else { - dst = utf8_write_codepoint(dst, *ch++); - } - } - *dst++ = 0; - size_t actualLength = (size_t)(dst - buffer); - buffer = (utf8*)realloc(buffer, actualLength); + codepoint = convert_specific_language_character_to_unicode(languageId, codepoint); + dst = utf8_write_codepoint(dst, codepoint); + } else { + dst = utf8_write_codepoint(dst, *ch++); + } + } + *dst++ = 0; + size_t actualLength = (size_t)(dst - buffer); + buffer = (utf8*)realloc(buffer, actualLength); - return buffer; + return buffer; } static bool rct2_language_is_multibyte_charset(int languageId) { - switch (languageId) { - case RCT2_LANGUAGE_ID_KOREAN: - case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL: - case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED: - case RCT2_LANGUAGE_ID_8: - return true; - default: - return false; - } + switch (languageId) { + case RCT2_LANGUAGE_ID_KOREAN: + case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL: + case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED: + case RCT2_LANGUAGE_ID_8: + return true; + default: + return false; + } } utf8 *rct2_language_string_to_utf8(const char *src, int languageId) @@ -333,54 +333,54 @@ utf8 *rct2_language_string_to_utf8(const char *src, int languageId) bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds) { - outStringIds[0] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 0); - outStringIds[1] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 1); - outStringIds[2] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 2); - return - outStringIds[0] != STR_NONE || - outStringIds[1] != STR_NONE || - outStringIds[2] != STR_NONE; + outStringIds[0] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 0); + outStringIds[1] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 1); + outStringIds[2] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 2); + return + outStringIds[0] != STR_NONE || + outStringIds[1] != STR_NONE || + outStringIds[2] != STR_NONE; } -static bool _availableObjectStringIdsInitialised = false; -static std::stack _availableObjectStringIds; +static bool _availableObjectStringIdsInitialised = false; +static std::stack _availableObjectStringIds; rct_string_id language_allocate_object_string(const utf8 * target) { - if (!_availableObjectStringIdsInitialised) - { - _availableObjectStringIdsInitialised = true; - for (rct_string_id stringId = NONSTEX_BASE_STRING_ID + MAX_OBJECT_CACHED_STRINGS; stringId >= NONSTEX_BASE_STRING_ID; stringId--) - { - _availableObjectStringIds.push(stringId); - } - } - - rct_string_id stringId = _availableObjectStringIds.top(); - _availableObjectStringIds.pop(); - _languageCurrent->SetString(stringId, target); - return stringId; + if (!_availableObjectStringIdsInitialised) + { + _availableObjectStringIdsInitialised = true; + for (rct_string_id stringId = NONSTEX_BASE_STRING_ID + MAX_OBJECT_CACHED_STRINGS; stringId >= NONSTEX_BASE_STRING_ID; stringId--) + { + _availableObjectStringIds.push(stringId); + } + } + + rct_string_id stringId = _availableObjectStringIds.top(); + _availableObjectStringIds.pop(); + _languageCurrent->SetString(stringId, target); + return stringId; } void language_free_object_string(rct_string_id stringId) { - if (stringId != 0) - { - if (_languageCurrent != nullptr) - { - _languageCurrent->SetString(stringId, nullptr); - } - _availableObjectStringIds.push(stringId); - } + if (stringId != 0) + { + if (_languageCurrent != nullptr) + { + _languageCurrent->SetString(stringId, nullptr); + } + _availableObjectStringIds.push(stringId); + } } rct_string_id language_get_object_override_string_id(const char * identifier, uint8 index) { - if (_languageCurrent == nullptr) - { - return STR_NONE; - } - return _languageCurrent->GetObjectOverrideStringId(identifier, index); + if (_languageCurrent == nullptr) + { + return STR_NONE; + } + return _languageCurrent->GetObjectOverrideStringId(identifier, index); } }