From 2b2e617086576ae515a44685500957c846bf54c7 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Mon, 11 Dec 2017 19:29:25 +0100 Subject: [PATCH] Use OpenRCT2 language ID in SetString, avoid mixups --- src/openrct2/localisation/Language.cpp | 8 ++--- src/openrct2/localisation/LanguagePack.h | 20 ------------ src/openrct2/localisation/language.h | 24 +++++++++++++-- src/openrct2/object/StringTable.cpp | 39 ++++++++++++++++++------ 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/src/openrct2/localisation/Language.cpp b/src/openrct2/localisation/Language.cpp index a566b86a0a..6669720169 100644 --- a/src/openrct2/localisation/Language.cpp +++ b/src/openrct2/localisation/Language.cpp @@ -154,7 +154,7 @@ void language_close_all() constexpr rct_string_id NONSTEX_BASE_STRING_ID = 3463; constexpr uint16 MAX_OBJECT_CACHED_STRINGS = 2048; -static wchar_t convert_specific_language_character_to_unicode(sint32 languageId, wchar_t codepoint) +static wchar_t convert_specific_language_character_to_unicode(RCT2LanguageId languageId, wchar_t codepoint) { switch (languageId) { case RCT2_LANGUAGE_ID_KOREAN: @@ -168,7 +168,7 @@ static wchar_t convert_specific_language_character_to_unicode(sint32 languageId, } } -static utf8 * convert_multibyte_charset(const char * src, size_t srcMaxSize, sint32 languageId) +static utf8 * convert_multibyte_charset(const char * src, size_t srcMaxSize, RCT2LanguageId languageId) { constexpr char CODEPOINT_DOUBLEBYTE = (char)(uint8)0xFF; @@ -200,7 +200,7 @@ static utf8 * convert_multibyte_charset(const char * src, size_t srcMaxSize, sin return sb.StealString(); } -static bool rct2_language_is_multibyte_charset(sint32 languageId) +static bool rct2_language_is_multibyte_charset(RCT2LanguageId languageId) { switch (languageId) { case RCT2_LANGUAGE_ID_KOREAN: @@ -213,7 +213,7 @@ static bool rct2_language_is_multibyte_charset(sint32 languageId) } } -utf8 *rct2_language_string_to_utf8(const char *src, size_t srcSize, sint32 languageId) +utf8 * rct2_language_string_to_utf8(const char *src, size_t srcSize, RCT2LanguageId languageId) { if (rct2_language_is_multibyte_charset(languageId)) { diff --git a/src/openrct2/localisation/LanguagePack.h b/src/openrct2/localisation/LanguagePack.h index bd3af0d56f..1a8ce87690 100644 --- a/src/openrct2/localisation/LanguagePack.h +++ b/src/openrct2/localisation/LanguagePack.h @@ -20,26 +20,6 @@ #include "../common.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_JAPANESE, - 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_BLANK = 254, - RCT2_LANGUAGE_ID_END = 255 -}; - interface ILanguagePack { virtual ~ILanguagePack() = default; diff --git a/src/openrct2/localisation/language.h b/src/openrct2/localisation/language.h index 9057e44c00..751b0680c0 100644 --- a/src/openrct2/localisation/language.h +++ b/src/openrct2/localisation/language.h @@ -46,6 +46,26 @@ enum { LANGUAGE_COUNT }; +typedef enum RCT2LanguageId +{ + 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_JAPANESE, + 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_BLANK = 254, + RCT2_LANGUAGE_ID_END = 255 +} RCT2LanguageId; + #define FONT_OPENRCT2_SPRITE NULL #ifdef __cplusplus @@ -61,7 +81,7 @@ typedef struct language_descriptor { #else void * font_family; #endif - uint8 rct2_original_id; + RCT2LanguageId rct2_original_id; } language_descriptor; #ifdef __cplusplus @@ -93,7 +113,7 @@ sint32 utf8_length(const utf8 *text); wchar_t *utf8_to_widechar(const utf8 *src); utf8 *widechar_to_utf8(const wchar_t *src); -utf8 *rct2_language_string_to_utf8(const char *src, size_t srcSize, sint32 languageId); +utf8 *rct2_language_string_to_utf8(const char *src, size_t srcSize, RCT2LanguageId languageId); bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds); rct_string_id language_allocate_object_string(const utf8 * target); void language_free_object_string(rct_string_id stringId); diff --git a/src/openrct2/object/StringTable.cpp b/src/openrct2/object/StringTable.cpp index 255dfdb604..3be1ca802c 100644 --- a/src/openrct2/object/StringTable.cpp +++ b/src/openrct2/object/StringTable.cpp @@ -22,6 +22,24 @@ #include "Object.h" #include "StringTable.h" +static const uint8 RCT2ToOpenRCT2LanguageId[] = +{ + LANGUAGE_ENGLISH_UK, + LANGUAGE_ENGLISH_US, + LANGUAGE_FRENCH, + LANGUAGE_GERMAN, + LANGUAGE_SPANISH, + LANGUAGE_ITALIAN, + LANGUAGE_DUTCH, + LANGUAGE_SWEDISH, + LANGUAGE_JAPANESE, + LANGUAGE_KOREAN, + LANGUAGE_CHINESE_SIMPLIFIED, + LANGUAGE_CHINESE_TRADITIONAL, + LANGUAGE_UNDEFINED, + LANGUAGE_PORTUGUESE_BR, +}; + static bool StringIsBlank(utf8 * str) { for (utf8 * ch = str; *ch != '\0'; ch++) @@ -46,19 +64,23 @@ void StringTable::Read(IReadObjectContext * context, IStream * stream, uint8 id) { try { - uint8 languageId; - while ((languageId = stream->ReadValue()) != RCT2_LANGUAGE_ID_END) + RCT2LanguageId rct2LanguageId; + while ((rct2LanguageId = (RCT2LanguageId)stream->ReadValue()) != RCT2_LANGUAGE_ID_END) { + uint8 languageId = + (rct2LanguageId <= RCT2_LANGUAGE_ID_PORTUGUESE) ? + RCT2ToOpenRCT2LanguageId[rct2LanguageId] : + LANGUAGE_UNDEFINED; StringTableEntry entry; entry.Id = id; entry.LanguageId = languageId; std::string stringAsWin1252 = stream->ReadStdString(); - utf8 * stringAsUtf8 = rct2_language_string_to_utf8(stringAsWin1252.c_str(), stringAsWin1252.size(), languageId); + utf8 * stringAsUtf8 = rct2_language_string_to_utf8(stringAsWin1252.c_str(), stringAsWin1252.size(), rct2LanguageId); if (StringIsBlank(stringAsUtf8)) { - entry.LanguageId = RCT2_LANGUAGE_ID_BLANK; + entry.LanguageId = LANGUAGE_UNDEFINED; } String::Trim(stringAsUtf8); @@ -97,21 +119,20 @@ void StringTable::Sort() return _strcmpi(a.Text, b.Text) < 0; } - uint8 currentLanguage = LanguagesDescriptors[gCurrentLanguage].rct2_original_id; - if (a.LanguageId == currentLanguage) + if (a.LanguageId == gCurrentLanguage) { return true; } - if (b.LanguageId == currentLanguage) + if (b.LanguageId == gCurrentLanguage) { return false; } - if (a.LanguageId == RCT2_LANGUAGE_ID_ENGLISH_UK) + if (a.LanguageId == LANGUAGE_ENGLISH_UK) { return true; } - if (b.LanguageId == RCT2_LANGUAGE_ID_ENGLISH_UK) + if (b.LanguageId == LANGUAGE_ENGLISH_UK) { return false; }