Close #13626: Refactor RCT2LanguageId to strong enum

This commit is contained in:
Tulio Leao 2020-12-23 01:43:27 -03:00
parent 00483df2f2
commit af0ec60bed
8 changed files with 41 additions and 40 deletions

View File

@ -366,7 +366,7 @@ void rct2_to_utf8_self(char* buffer, size_t length)
{
if (length > 0)
{
auto temp = rct2_to_utf8(buffer, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto temp = rct2_to_utf8(buffer, RCT2LanguageId::EnglishUK);
safe_strcpy(buffer, temp.data(), length);
}
}
@ -377,9 +377,9 @@ void rct2_to_utf8_self(char* buffer, size_t length)
void game_convert_strings_to_utf8()
{
// Scenario details
gScenarioCompletedBy = rct2_to_utf8(gScenarioCompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK);
gScenarioName = rct2_to_utf8(gScenarioName, RCT2_LANGUAGE_ID_ENGLISH_UK);
gScenarioDetails = rct2_to_utf8(gScenarioDetails, RCT2_LANGUAGE_ID_ENGLISH_UK);
gScenarioCompletedBy = rct2_to_utf8(gScenarioCompletedBy, RCT2LanguageId::EnglishUK);
gScenarioName = rct2_to_utf8(gScenarioName, RCT2LanguageId::EnglishUK);
gScenarioDetails = rct2_to_utf8(gScenarioDetails, RCT2LanguageId::EnglishUK);
// News items
game_convert_news_items_to_utf8();

View File

@ -116,13 +116,13 @@ static int32_t GetCodePageForRCT2Language(RCT2LanguageId languageId)
{
switch (languageId)
{
case RCT2_LANGUAGE_ID_JAPANESE:
case RCT2LanguageId::Japanese:
return CODE_PAGE::CP_932;
case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED:
case RCT2LanguageId::ChineseSimplified:
return CODE_PAGE::CP_936;
case RCT2_LANGUAGE_ID_KOREAN:
case RCT2LanguageId::Korean:
return CODE_PAGE::CP_949;
case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL:
case RCT2LanguageId::ChineseTraditional:
return CODE_PAGE::CP_950;
default:
return CODE_PAGE::CP_1252;

View File

@ -46,24 +46,24 @@ enum
LANGUAGE_COUNT
};
enum RCT2LanguageId
enum class 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
EnglishUK,
EnglishUS,
French,
German,
Spanish,
Italian,
Dutch,
Swedish,
Japanese,
Korean,
ChineseSimplified,
ChineseTraditional,
Undefined,
Portuguese,
Blank = 254,
End = 255
};
#define FONT_OPENRCT2_SPRITE NULL

View File

@ -53,10 +53,11 @@ void StringTable::Read(IReadObjectContext* context, OpenRCT2::IStream* stream, O
try
{
RCT2LanguageId rct2LanguageId;
while ((rct2LanguageId = static_cast<RCT2LanguageId>(stream->ReadValue<uint8_t>())) != RCT2_LANGUAGE_ID_END)
while ((rct2LanguageId = static_cast<RCT2LanguageId>(stream->ReadValue<uint8_t>())) != RCT2LanguageId::End)
{
uint8_t languageId = (rct2LanguageId <= RCT2_LANGUAGE_ID_PORTUGUESE) ? RCT2ToOpenRCT2LanguageId[rct2LanguageId]
: static_cast<uint8_t>(LANGUAGE_UNDEFINED);
uint8_t languageId = (EnumValue(rct2LanguageId) <= EnumValue(RCT2LanguageId::Portuguese))
? RCT2ToOpenRCT2LanguageId[EnumValue(rct2LanguageId)]
: static_cast<uint8_t>(LANGUAGE_UNDEFINED);
std::string stringAsWin1252 = stream->ReadStdString();
auto stringAsUtf8 = rct2_to_utf8(stringAsWin1252, rct2LanguageId);

View File

@ -240,7 +240,7 @@ public:
dst->objective_arg_3 = GetBuildTheBestRideId();
}
auto name = rct2_to_utf8(_s4.scenario_name, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto name = rct2_to_utf8(_s4.scenario_name, RCT2LanguageId::EnglishUK);
std::string details;
// TryGetById won't set this property if the scenario is not recognised,
@ -3006,7 +3006,7 @@ private:
const auto originalString = _s4.string_table[(stringId - USER_STRING_START) % 1024];
auto originalStringView = std::string_view(
originalString, GetRCT2StringBufferLen(originalString, USER_STRING_MAX_LENGTH));
auto asUtf8 = rct2_to_utf8(originalStringView, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto asUtf8 = rct2_to_utf8(originalStringView, RCT2LanguageId::EnglishUK);
auto justText = RCT12RemoveFormattingUTF8(asUtf8);
return justText.data();
}

View File

@ -198,9 +198,9 @@ public:
// Some scenarios have their scenario details in UTF-8, due to earlier bugs in OpenRCT2.
if (!IsLikelyUTF8(_s6.info.name) && !IsLikelyUTF8(_s6.info.details))
{
auto temp = rct2_to_utf8(_s6.info.name, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto temp = rct2_to_utf8(_s6.info.name, RCT2LanguageId::EnglishUK);
safe_strcpy(gS6Info.name, temp.data(), sizeof(gS6Info.name));
auto temp2 = rct2_to_utf8(_s6.info.details, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto temp2 = rct2_to_utf8(_s6.info.details, RCT2LanguageId::EnglishUK);
safe_strcpy(gS6Info.details, temp2.data(), sizeof(gS6Info.details));
}
else
@ -1660,7 +1660,7 @@ public:
const auto originalString = _s6.custom_strings[(stringId - USER_STRING_START) % 1024];
auto originalStringView = std::string_view(
originalString, GetRCT2StringBufferLen(originalString, USER_STRING_MAX_LENGTH));
auto asUtf8 = rct2_to_utf8(originalStringView, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto asUtf8 = rct2_to_utf8(originalStringView, RCT2LanguageId::EnglishUK);
auto justText = RCT12RemoveFormattingUTF8(asUtf8);
return justText.data();
}

View File

@ -653,7 +653,7 @@ private:
if (scBasic.CompanyValue > highscore->company_value)
{
SafeFree(highscore->name);
std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK);
std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2LanguageId::EnglishUK);
highscore->name = String::Duplicate(name.c_str());
highscore->company_value = scBasic.CompanyValue;
highscore->timestamp = DATETIME64_MIN;
@ -665,7 +665,7 @@ private:
{
scenario_highscore_entry* highscore = InsertHighscore();
highscore->fileName = String::Duplicate(scBasic.Path);
std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK);
std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2LanguageId::EnglishUK);
highscore->name = String::Duplicate(name.c_str());
highscore->company_value = scBasic.CompanyValue;
highscore->timestamp = DATETIME64_MIN;

View File

@ -25,7 +25,7 @@ TEST_F(Localisation, RCT2_to_UTF8_UK)
{
auto input = "The quick brown fox";
auto expected = u8"The quick brown fox";
auto actual = rct2_to_utf8(input, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto actual = rct2_to_utf8(input, RCT2LanguageId::EnglishUK);
ASSERT_EQ(expected, actual);
}
@ -33,7 +33,7 @@ TEST_F(Localisation, RCT2_to_UTF8_JP)
{
auto input = StringFromHex("ff8374ff8340ff8358ff8367ff8375ff8389ff8345ff8393ff8374ff8348ff8362ff834eff8358");
auto expected = u8"ファストブラウンフォックス";
auto actual = rct2_to_utf8(input, RCT2_LANGUAGE_ID_JAPANESE);
auto actual = rct2_to_utf8(input, RCT2LanguageId::Japanese);
ASSERT_EQ(expected, actual);
}
@ -41,7 +41,7 @@ TEST_F(Localisation, RCT2_to_UTF8_ZH_TW)
{
auto input = StringFromHex("ffa7d6ffb374ffaabaffb4c4ffa6e2ffaab0ffaf57");
auto expected = u8"快速的棕色狐狸";
auto actual = rct2_to_utf8(input, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL);
auto actual = rct2_to_utf8(input, RCT2LanguageId::ChineseTraditional);
ASSERT_EQ(expected, actual);
}
@ -49,7 +49,7 @@ TEST_F(Localisation, RCT2_to_UTF8_PL)
{
auto input = StringFromHex("47F372736b6120446ff76b692054e6637a6f7779");
auto expected = u8"Górska Dołki Tęczowy";
auto actual = rct2_to_utf8(input, RCT2_LANGUAGE_ID_ENGLISH_UK);
auto actual = rct2_to_utf8(input, RCT2LanguageId::EnglishUK);
ASSERT_EQ(expected, actual);
}
@ -58,7 +58,7 @@ TEST_F(Localisation, RCT2_to_UTF8_ZH_TW_PREMATURE_END)
// This string can be found in BATFL.DAT, the last double byte character is missing its second byte.
auto input = StringFromHex("ffa470ffabacffa8aeffbdf8ffa662ffc54bffb944ffa457ffaeb6ffb0caffb76effc2");
auto expected = u8"小型車輛在鐵道上振動搖";
auto actual = rct2_to_utf8(input, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL);
auto actual = rct2_to_utf8(input, RCT2LanguageId::ChineseTraditional);
ASSERT_EQ(expected, actual);
}