diff --git a/src/openrct2/localisation/Language.cpp b/src/openrct2/localisation/Language.cpp index d1ab538d8f..caba5e3289 100644 --- a/src/openrct2/localisation/Language.cpp +++ b/src/openrct2/localisation/Language.cpp @@ -83,6 +83,20 @@ void utf8_remove_format_codes(utf8 * text, bool allowcolours) *dstCh = 0; } +uint8 language_get_id_from_locale(const char * locale) +{ + uint8 i = 0; + for (const auto &langDesc : LanguagesDescriptors) + { + if (String::Equals(locale, langDesc.locale)) + { + return i; + } + i++; + } + return LANGUAGE_UNDEFINED; +} + const char * language_get_string(rct_string_id id) { const char * result = nullptr; diff --git a/src/openrct2/localisation/Language.h b/src/openrct2/localisation/Language.h index 9bccd0be60..2188080e0b 100644 --- a/src/openrct2/localisation/Language.h +++ b/src/openrct2/localisation/Language.h @@ -94,6 +94,7 @@ extern const utf8 BlackLeftArrowString[]; extern const utf8 BlackRightArrowString[]; extern const utf8 CheckBoxMarkString[]; +uint8 language_get_id_from_locale(const char * locale); const char *language_get_string(rct_string_id id); bool language_open(sint32 id); void language_close_all(); diff --git a/src/openrct2/object/EntranceObject.cpp b/src/openrct2/object/EntranceObject.cpp index 814a34fedf..7f84072a16 100644 --- a/src/openrct2/object/EntranceObject.cpp +++ b/src/openrct2/object/EntranceObject.cpp @@ -68,16 +68,10 @@ void EntranceObject::DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint32 h void EntranceObject::ReadJson(IReadObjectContext * context, const json_t * root) { - // Strings - auto stringTable = GetStringTable(); - auto jsonStrings = json_object_get(root, "strings"); - auto jsonName = json_object_get(jsonStrings, "name"); - stringTable->SetString(0, 0, json_string_value(json_object_get(jsonName, "en-GB"))); - auto properties = json_object_get(root, "properties"); _legacyType.scrolling_mode = json_integer_value(json_object_get(properties, "scrollingMode")); _legacyType.text_height = json_integer_value(json_object_get(properties, "textHeight")); - auto imageTable = GetImageTable(); - ObjectJsonHelpers::LoadImages(root, *imageTable); + ObjectJsonHelpers::LoadStrings(root, *GetStringTable()); + ObjectJsonHelpers::LoadImages(root, *GetImageTable()); } diff --git a/src/openrct2/object/FootpathItemObject.cpp b/src/openrct2/object/FootpathItemObject.cpp index 0d72d79d56..0586a6354c 100644 --- a/src/openrct2/object/FootpathItemObject.cpp +++ b/src/openrct2/object/FootpathItemObject.cpp @@ -137,12 +137,6 @@ static uint8 ParseCursor(const std::string &s) void FootpathItemObject::ReadJson(IReadObjectContext * context, const json_t * root) { - // Strings - auto stringTable = GetStringTable(); - auto jsonStrings = json_object_get(root, "strings"); - auto jsonName = json_object_get(jsonStrings, "name"); - stringTable->SetString(0, 0, json_string_value(json_object_get(jsonName, "en-GB"))); - auto properties = json_object_get(root, "properties"); _legacyType.path_bit.draw_type = ParseDrawType(ObjectJsonHelpers::GetString(json_object_get(properties, "renderAs"))); _legacyType.path_bit.tool_id = ParseCursor(ObjectJsonHelpers::GetString(json_object_get(properties, "cursor"))); @@ -185,6 +179,6 @@ void FootpathItemObject::ReadJson(IReadObjectContext * context, const json_t * r } _legacyType.path_bit.flags = flags; - auto imageTable = GetImageTable(); - ObjectJsonHelpers::LoadImages(root, *imageTable); + ObjectJsonHelpers::LoadStrings(root, *GetStringTable()); + ObjectJsonHelpers::LoadImages(root, *GetImageTable()); } diff --git a/src/openrct2/object/FootpathObject.cpp b/src/openrct2/object/FootpathObject.cpp index 992a0249cd..4d5befd9b7 100644 --- a/src/openrct2/object/FootpathObject.cpp +++ b/src/openrct2/object/FootpathObject.cpp @@ -72,12 +72,6 @@ static uint8 ParseSupportType(const std::string &s) void FootpathObject::ReadJson(IReadObjectContext * context, const json_t * root) { - // Strings - auto stringTable = GetStringTable(); - auto jsonStrings = json_object_get(root, "strings"); - auto jsonName = json_object_get(jsonStrings, "name"); - stringTable->SetString(0, 0, json_string_value(json_object_get(jsonName, "en-GB"))); - auto properties = json_object_get(root, "properties"); _legacyType.support_type = ParseSupportType(ObjectJsonHelpers::GetString(json_object_get(properties, "supportType"))); _legacyType.scrolling_mode = json_integer_value(json_object_get(properties, "scrollingMode")); @@ -97,6 +91,6 @@ void FootpathObject::ReadJson(IReadObjectContext * context, const json_t * root) _legacyType.flags |= FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR; } - auto imageTable = GetImageTable(); - ObjectJsonHelpers::LoadImages(root, *imageTable); + ObjectJsonHelpers::LoadStrings(root, *GetStringTable()); + ObjectJsonHelpers::LoadImages(root, *GetImageTable()); } diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index c00101254e..fb437c56e0 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -111,9 +111,10 @@ struct rct_object_filters { assert_struct_size(rct_object_filters, 3); #pragma pack(pop) -enum OBJ_STRING_ID +enum OBJ_STRING_ID : uint8 { - OBJ_STRING_ID_NAME, + OBJ_STRING_ID_UNKNOWN = 255, + OBJ_STRING_ID_NAME = 0, OBJ_STRING_ID_DESCRIPTION, OBJ_STRING_ID_SCENARIO_NAME = 0, OBJ_STRING_ID_PARK_NAME = 1, diff --git a/src/openrct2/object/ObjectJsonHelpers.cpp b/src/openrct2/object/ObjectJsonHelpers.cpp index 51cf3bf325..286cb325e1 100644 --- a/src/openrct2/object/ObjectJsonHelpers.cpp +++ b/src/openrct2/object/ObjectJsonHelpers.cpp @@ -14,16 +14,19 @@ *****************************************************************************/ #pragma endregion +#pragma warning(disable : 4706) // assignment within conditional expression + #include "../Context.h" +#include "../core/Math.hpp" #include "../core/Memory.hpp" #include "../core/Path.hpp" #include "../core/String.hpp" +#include "../localisation/language.h" #include "../PlatformEnvironment.h" #include "../sprites.h" #include "Object.h" #include "ObjectFactory.h" #include "ObjectJsonHelpers.h" -#include "../core/Math.hpp" using namespace OpenRCT2; @@ -168,6 +171,40 @@ namespace ObjectJsonHelpers return result; } + static uint8 ParseStringId(const std::string &s) + { + if (s == "name") return OBJ_STRING_ID_NAME; + if (s == "description") return OBJ_STRING_ID_DESCRIPTION; + if (s == "capacity") return OBJ_STRING_ID_CAPACITY; + if (s == "vehicleName") return OBJ_STRING_ID_VEHICLE_NAME; + return OBJ_STRING_ID_UNKNOWN; + } + + void LoadStrings(const json_t * root, StringTable &stringTable) + { + auto jsonStrings = json_object_get(root, "strings"); + const char * key; + json_t * jlanguages; + json_object_foreach(jsonStrings, key, jlanguages) + { + auto stringId = ParseStringId(key); + if (stringId != OBJ_STRING_ID_UNKNOWN) + { + const char * locale; + json_t * jstring; + json_object_foreach(jlanguages, locale, jstring) + { + auto langId = language_get_id_from_locale(locale); + if (langId != LANGUAGE_UNDEFINED) + { + auto string = json_string_value(jstring); + stringTable.SetString(stringId, langId, string); + } + } + } + } + } + void LoadImages(const json_t * root, ImageTable &imageTable) { auto jsonImages = json_object_get(root, "images"); diff --git a/src/openrct2/object/ObjectJsonHelpers.h b/src/openrct2/object/ObjectJsonHelpers.h index 76f8f20077..866fada431 100644 --- a/src/openrct2/object/ObjectJsonHelpers.h +++ b/src/openrct2/object/ObjectJsonHelpers.h @@ -22,11 +22,13 @@ #include "../core/Json.hpp" #include "../drawing/drawing.h" #include "ImageTable.h" +#include "StringTable.h" namespace ObjectJsonHelpers { bool GetBoolean(const json_t * obj, const std::string &name, bool defaultValue = false); std::string GetString(const json_t * value); std::vector GetJsonStringArray(const json_t * arr); + void LoadStrings(const json_t * root, StringTable &stringTable); void LoadImages(const json_t * root, ImageTable &imageTable); }; diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 58aecd13c8..7ca4546567 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -726,22 +726,10 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) _legacyType.shop_item_secondary = ParseShopItem(rideSells[1]); } - _legacyType.flags |= RIDE_ENTRY_FLAG_SEPARATE_RIDE; - - auto stringTable = GetStringTable(); - auto jsonStrings = json_object_get(root, "strings"); - auto jsonName = json_object_get(jsonStrings, "name"); - auto jsonDescription = json_object_get(jsonStrings, "description"); - - stringTable->SetString(0, 0, json_string_value(json_object_get(jsonName, "en-GB"))); - stringTable->SetString(1, 0, json_string_value(json_object_get(jsonDescription, "en-GB"))); - stringTable->SetString(2, 0, "Capacity"); - stringTable->SetString(3, 0, "Vehicle"); - - auto imageTable = GetImageTable(); - ObjectJsonHelpers::LoadImages(root, *imageTable); - rct_ride_entry_vehicle * vehicle0 = &_legacyType.vehicles[0]; vehicle0->sprite_flags |= VEHICLE_SPRITE_FLAG_FLAT; vehicle0->base_image_id = 0; + + ObjectJsonHelpers::LoadStrings(root, *GetStringTable()); + ObjectJsonHelpers::LoadImages(root, *GetImageTable()); } diff --git a/src/openrct2/object/StringTable.cpp b/src/openrct2/object/StringTable.cpp index 5b7ee08dd3..521124a7ae 100644 --- a/src/openrct2/object/StringTable.cpp +++ b/src/openrct2/object/StringTable.cpp @@ -97,7 +97,7 @@ std::string StringTable::GetString(uint8 id) const return string.Text; } } - return nullptr; + return std::string(); } void StringTable::SetString(uint8 id, uint8 language, const std::string &text)