diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index f4dc609711..976261de7b 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -365,4 +365,13 @@ void language_free_object_string(rct_string_id 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); +} + } diff --git a/src/localisation/language.h b/src/localisation/language.h index 0a6823f4e3..153dd1481a 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -82,5 +82,6 @@ utf8 *widechar_to_utf8(const wchar_t *src); 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); +rct_string_id language_get_object_override_string_id(const char * identifier, uint8 index); #endif diff --git a/src/object/BannerObject.cpp b/src/object/BannerObject.cpp index 99fcf16ec3..73eac1caf4 100644 --- a/src/object/BannerObject.cpp +++ b/src/object/BannerObject.cpp @@ -84,9 +84,3 @@ void BannerObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId + 0, x - 12, y + 8, 0); gfx_draw_sprite(dpi, imageId + 1, x - 12, y + 8, 0); } - -const utf8 * BannerObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} diff --git a/src/object/BannerObject.h b/src/object/BannerObject.h index a7dc09d218..4ef47e405c 100644 --- a/src/object/BannerObject.h +++ b/src/object/BannerObject.h @@ -39,6 +39,4 @@ public: void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi) const override; - - const utf8 * GetName() const override; }; diff --git a/src/object/EntranceObject.cpp b/src/object/EntranceObject.cpp index da81343e1b..0469a3b0f1 100644 --- a/src/object/EntranceObject.cpp +++ b/src/object/EntranceObject.cpp @@ -63,9 +63,3 @@ void EntranceObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId + 0, x + 0, y + 28, 0); gfx_draw_sprite(dpi, imageId + 2, x + 32, y + 44, 0); } - -const utf8 * EntranceObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} diff --git a/src/object/EntranceObject.h b/src/object/EntranceObject.h index cb370e8c0d..9da64b57f5 100644 --- a/src/object/EntranceObject.h +++ b/src/object/EntranceObject.h @@ -38,6 +38,4 @@ public: void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi) const override; - - const utf8 * GetName() const override; }; diff --git a/src/object/FootpathItemObject.cpp b/src/object/FootpathItemObject.cpp index 0852ed1a49..dfcec859d9 100644 --- a/src/object/FootpathItemObject.cpp +++ b/src/object/FootpathItemObject.cpp @@ -81,9 +81,3 @@ void FootpathItemObject::DrawPreview(rct_drawpixelinfo * dpi) const int y = dpi->height / 2; gfx_draw_sprite(dpi, _legacyType.image, x - 22, y - 24, 0); } - -const utf8 * FootpathItemObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} diff --git a/src/object/FootpathItemObject.h b/src/object/FootpathItemObject.h index 6aabe8b58c..e3812781a9 100644 --- a/src/object/FootpathItemObject.h +++ b/src/object/FootpathItemObject.h @@ -39,6 +39,4 @@ public: void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi) const override; - - const utf8 * GetName() const override; }; diff --git a/src/object/FootpathObject.cpp b/src/object/FootpathObject.cpp index b7bfe4c928..8cc43bacbf 100644 --- a/src/object/FootpathObject.cpp +++ b/src/object/FootpathObject.cpp @@ -70,9 +70,3 @@ void FootpathObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, _legacyType.image + 71, x - 49, y - 17, 0); gfx_draw_sprite(dpi, _legacyType.image + 72, x + 4, y - 17, 0); } - -const utf8 * FootpathObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} diff --git a/src/object/FootpathObject.h b/src/object/FootpathObject.h index 6bf997e6e1..7000c8776d 100644 --- a/src/object/FootpathObject.h +++ b/src/object/FootpathObject.h @@ -38,6 +38,4 @@ public: void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi) const override; - - const utf8 * GetName() const override; }; diff --git a/src/object/LargeSceneryObject.cpp b/src/object/LargeSceneryObject.cpp index 94e1679d10..a51918eadf 100644 --- a/src/object/LargeSceneryObject.cpp +++ b/src/object/LargeSceneryObject.cpp @@ -128,12 +128,6 @@ void LargeSceneryObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId, x, y, 0); } -const utf8 * LargeSceneryObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} - rct_large_scenery_tile * LargeSceneryObject::ReadTiles(IStream * stream) { auto tiles = std::vector(); diff --git a/src/object/LargeSceneryObject.h b/src/object/LargeSceneryObject.h index 00d67c3dbb..5f28210852 100644 --- a/src/object/LargeSceneryObject.h +++ b/src/object/LargeSceneryObject.h @@ -44,8 +44,6 @@ public: void DrawPreview(rct_drawpixelinfo * dpi) const override; - const utf8 * GetName() const override; - private: static rct_large_scenery_tile * ReadTiles(IStream * stream); }; diff --git a/src/object/Object.cpp b/src/object/Object.cpp index decc2e977f..90f11bcd16 100644 --- a/src/object/Object.cpp +++ b/src/object/Object.cpp @@ -14,9 +14,58 @@ *****************************************************************************/ #pragma endregion +#include "../core/Memory.hpp" +#include "../core/String.hpp" #include "Object.h" +extern "C" +{ + #include "../localisation/localisation.h" +} + +enum OBJ_STRING_ID +{ + OBJ_STRING_ID_NAME, +}; + Object::Object(const rct_object_entry &entry) { _objectEntry = entry; + + char name[9] = { 0 }; + Memory::Copy(name, entry.name, 8); + _identifier = String::Duplicate(name); +} + +Object::~Object() +{ + Memory::Free(_identifier); +} + +const utf8 * Object::GetOverrideString(uint8 index) const +{ + const char * identifier = GetIdentifier(); + rct_string_id stringId = language_get_object_override_string_id(identifier, index); + + const utf8 * result = nullptr; + if (stringId != STR_NONE) + { + result = language_get_string(stringId); + } + return result; +} + +const utf8 * Object::GetString(uint8 index) const +{ + const utf8 * sz = GetOverrideString(index); + if (sz == nullptr) + { + sz = GetStringTable()->GetString(index); + } + return sz != nullptr ? sz : ""; +} + +const utf8 * Object::GetName() const +{ + return GetString(OBJ_STRING_ID_NAME); } diff --git a/src/object/Object.h b/src/object/Object.h index 4485858988..b1e84eb377 100644 --- a/src/object/Object.h +++ b/src/object/Object.h @@ -40,6 +40,7 @@ interface IReadObjectContext class Object { private: + char * _identifier; rct_object_entry _objectEntry; StringTable _stringTable; ImageTable _imageTable; @@ -49,11 +50,15 @@ protected: const StringTable * GetStringTable() const { return &_stringTable; } ImageTable * GetImageTable() { return &_imageTable; } + const utf8 * GetOverrideString(uint8 index) const; + const utf8 * GetString(uint8 index) const; + public: explicit Object(const rct_object_entry &entry); - virtual ~Object() { } + virtual ~Object(); // Legacy data structures + const char * GetIdentifier() const { return _identifier; } const rct_object_entry * GetObjectEntry() const { return &_objectEntry; } virtual void * GetLegacyData() abstract; @@ -64,7 +69,7 @@ public: virtual void DrawPreview(rct_drawpixelinfo * dpi) const { } virtual uint8 GetObjectType() const { return _objectEntry.flags & 0x0F; } - virtual const utf8 * GetName() const abstract; + virtual const utf8 * GetName() const; virtual void SetRepositoryItem(ObjectRepositoryItem * item) const { } }; diff --git a/src/object/RideObject.cpp b/src/object/RideObject.cpp index 58f55fb273..6904fcc7b9 100644 --- a/src/object/RideObject.cpp +++ b/src/object/RideObject.cpp @@ -334,22 +334,14 @@ void RideObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId, 0, 0, 0); } -const utf8 * RideObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} - const utf8 * RideObject::GetDescription() const { - const utf8 * description = GetStringTable()->GetString(OBJ_STRING_ID_DESCRIPTION); - return description != nullptr ? description : ""; + return GetString(OBJ_STRING_ID_DESCRIPTION); } const utf8 * RideObject::GetCapacity() const { - const utf8 * capacity = GetStringTable()->GetString(OBJ_STRING_ID_CAPACITY); - return capacity != nullptr ? capacity : ""; + return GetString(OBJ_STRING_ID_CAPACITY); } void RideObject::SetRepositoryItem(ObjectRepositoryItem * item) const diff --git a/src/object/RideObject.h b/src/object/RideObject.h index 2f8d0f097a..02c4094ea4 100644 --- a/src/object/RideObject.h +++ b/src/object/RideObject.h @@ -42,7 +42,6 @@ public: void DrawPreview(rct_drawpixelinfo * dpi) const override; - const utf8 * GetName() const override; const utf8 * GetDescription() const; const utf8 * GetCapacity() const; diff --git a/src/object/SceneryGroupObject.cpp b/src/object/SceneryGroupObject.cpp index 74b2df8148..2976d6c2a9 100644 --- a/src/object/SceneryGroupObject.cpp +++ b/src/object/SceneryGroupObject.cpp @@ -97,12 +97,6 @@ void SceneryGroupObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId, x - 15, y - 14, 0); } -const utf8 * SceneryGroupObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} - void SceneryGroupObject::SetRepositoryItem(ObjectRepositoryItem * item) const { Memory::Free(item->ThemeObjects); diff --git a/src/object/SceneryGroupObject.h b/src/object/SceneryGroupObject.h index a8715fc309..af4df3cd44 100644 --- a/src/object/SceneryGroupObject.h +++ b/src/object/SceneryGroupObject.h @@ -44,8 +44,6 @@ public: void DrawPreview(rct_drawpixelinfo * dpi) const override; - const utf8 * GetName() const override; - void SetRepositoryItem(ObjectRepositoryItem * item) const override; private: diff --git a/src/object/SmallSceneryObject.cpp b/src/object/SmallSceneryObject.cpp index 6c39059b79..ccb335da01 100644 --- a/src/object/SmallSceneryObject.cpp +++ b/src/object/SmallSceneryObject.cpp @@ -152,13 +152,6 @@ void SmallSceneryObject::DrawPreview(rct_drawpixelinfo * dpi) const } } - -const utf8 * SmallSceneryObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} - uint8 * SmallSceneryObject::ReadVar10(IStream * stream) { uint8 b; diff --git a/src/object/SmallSceneryObject.h b/src/object/SmallSceneryObject.h index 173b0025fb..36a14111ea 100644 --- a/src/object/SmallSceneryObject.h +++ b/src/object/SmallSceneryObject.h @@ -42,8 +42,6 @@ public: void DrawPreview(rct_drawpixelinfo * dpi) const override; - const utf8 * GetName() const override; - private: static uint8 * ReadVar10(IStream * stream); }; diff --git a/src/object/WallObject.cpp b/src/object/WallObject.cpp index 5a7276aac4..233c62dd3d 100644 --- a/src/object/WallObject.cpp +++ b/src/object/WallObject.cpp @@ -105,9 +105,3 @@ void WallObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId, x, y, 0); } } - -const utf8 * WallObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} diff --git a/src/object/WallObject.h b/src/object/WallObject.h index 5dce93e816..dc538c6405 100644 --- a/src/object/WallObject.h +++ b/src/object/WallObject.h @@ -39,6 +39,4 @@ public: void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi) const override; - - const utf8 * GetName() const override; }; diff --git a/src/object/WaterObject.cpp b/src/object/WaterObject.cpp index a35d45121a..41e7e32d6d 100644 --- a/src/object/WaterObject.cpp +++ b/src/object/WaterObject.cpp @@ -64,9 +64,3 @@ void WaterObject::DrawPreview(rct_drawpixelinfo * dpi) const int y = dpi->height / 2; gfx_draw_string_centred(dpi, 3326, x, y, 0, nullptr); } - -const utf8 * WaterObject::GetName() const -{ - const utf8 * name = GetStringTable()->GetString(OBJ_STRING_ID_NAME); - return name != nullptr ? name : ""; -} diff --git a/src/object/WaterObject.h b/src/object/WaterObject.h index b0531ac4ae..151daf42cc 100644 --- a/src/object/WaterObject.h +++ b/src/object/WaterObject.h @@ -38,6 +38,4 @@ public: void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi) const override; - - const utf8 * GetName() const override; };