Return image and string table by reference

This commit is contained in:
Ted John 2017-12-11 13:06:59 +00:00 committed by Gymnasiast
parent c3f075d18c
commit ec446ac9d6
16 changed files with 95 additions and 86 deletions

View File

@ -31,12 +31,12 @@ void BannerObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_legacyType.banner.scenery_tab_id = stream->ReadValue<uint8>();
stream->Seek(1, STREAM_SEEK_CURRENT);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
rct_object_entry sgEntry = stream->ReadValue<rct_object_entry>();
SetPrimarySceneryGroup(&sgEntry);
GetImageTable()->Read(context, stream);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.large_scenery.price <= 0)
@ -61,15 +61,15 @@ void BannerObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
void BannerObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.name = language_allocate_object_string(GetName());
_legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
}
void BannerObject::Unload()
{
language_free_object_string(_legacyType.name);
gfx_object_free_images(_legacyType.image, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image, GetImageTable().GetCount());
_legacyType.name = 0;
_legacyType.image = 0;

View File

@ -27,8 +27,8 @@ void EntranceObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_legacyType.scrolling_mode = stream->ReadValue<uint8>();
_legacyType.text_height = stream->ReadValue<uint8>();
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetImageTable()->Read(context, stream);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
GetImageTable().Read(context, stream);
// Fix issue #1705: The Medieval entrance from Time Twister has a straight banner,
// but scrolls its text as if it a curved one.
@ -41,15 +41,15 @@ void EntranceObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
void EntranceObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.string_idx = language_allocate_object_string(GetName());
_legacyType.image_id = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image_id = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
}
void EntranceObject::Unload()
{
language_free_object_string(_legacyType.string_idx);
gfx_object_free_images(_legacyType.image_id, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image_id, GetImageTable().GetCount());
_legacyType.string_idx = 0;
_legacyType.image_id = 0;
@ -72,6 +72,6 @@ void EntranceObject::ReadJson(IReadObjectContext * context, const json_t * root)
_legacyType.scrolling_mode = json_integer_value(json_object_get(properties, "scrollingMode"));
_legacyType.text_height = json_integer_value(json_object_get(properties, "textHeight"));
ObjectJsonHelpers::LoadStrings(root, *GetStringTable());
ObjectJsonHelpers::LoadImages(root, *GetImageTable());
ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable());
}

View File

@ -34,12 +34,12 @@ void FootpathItemObject::ReadLegacy(IReadObjectContext * context, IStream * stre
_legacyType.path_bit.scenery_tab_id = stream->ReadValue<uint8>();
stream->Seek(1, STREAM_SEEK_CURRENT);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
rct_object_entry sgEntry = stream->ReadValue<rct_object_entry>();
SetPrimarySceneryGroup(&sgEntry);
GetImageTable()->Read(context, stream);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.large_scenery.price <= 0)
@ -64,9 +64,9 @@ void FootpathItemObject::ReadLegacy(IReadObjectContext * context, IStream * stre
void FootpathItemObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.name = language_allocate_object_string(GetName());
_legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.path_bit.scenery_tab_id = 0xFF;
}
@ -74,7 +74,7 @@ void FootpathItemObject::Load()
void FootpathItemObject::Unload()
{
language_free_object_string(_legacyType.name);
gfx_object_free_images(_legacyType.image, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image, GetImageTable().GetCount());
_legacyType.name = 0;
_legacyType.image = 0;
@ -162,6 +162,6 @@ void FootpathItemObject::ReadJson(IReadObjectContext * context, const json_t * r
{ "isAllowedOnSlope", PATH_BIT_FLAG_DONT_ALLOW_ON_SLOPE },
{ "isTelevision", PATH_BIT_FLAG_IS_QUEUE_SCREEN }});
ObjectJsonHelpers::LoadStrings(root, *GetStringTable());
ObjectJsonHelpers::LoadImages(root, *GetImageTable());
ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable());
}

View File

@ -29,8 +29,8 @@ void FootpathObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_legacyType.scrolling_mode = stream->ReadValue<uint8>();
stream->Seek(1, STREAM_SEEK_CURRENT);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetImageTable()->Read(context, stream);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.support_type >= FOOTPATH_ENTRY_SUPPORT_TYPE_COUNT)
@ -41,16 +41,16 @@ void FootpathObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
void FootpathObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.string_idx = language_allocate_object_string(GetName());
_legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.bridge_image = _legacyType.image + 109;
}
void FootpathObject::Unload()
{
language_free_object_string(_legacyType.string_idx);
gfx_object_free_images(_legacyType.image, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image, GetImageTable().GetCount());
_legacyType.string_idx = 0;
_legacyType.image = 0;
@ -82,6 +82,6 @@ void FootpathObject::ReadJson(IReadObjectContext * context, const json_t * root)
{ "hasElevatedPathImages", FOOTPATH_ENTRY_FLAG_HAS_PATH_BASE_SPRITE },
{ "editorOnly", FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR } });
ObjectJsonHelpers::LoadStrings(root, *GetStringTable());
ObjectJsonHelpers::LoadImages(root, *GetImageTable());
ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable());
}

View File

@ -31,6 +31,9 @@ private:
std::vector<rct_g1_element> _entries;
public:
ImageTable() = default;
ImageTable(const ImageTable &) = delete;
ImageTable & operator=(const ImageTable &) = delete;
~ImageTable();
void Read(IReadObjectContext * context, IStream * stream);

View File

@ -33,7 +33,7 @@ void LargeSceneryObject::ReadLegacy(IReadObjectContext * context, IStream * stre
_legacyType.large_scenery.scrolling_mode = stream->ReadValue<uint8>();
stream->Seek(4, STREAM_SEEK_CURRENT);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
rct_object_entry sgEntry = stream->ReadValue<rct_object_entry>();
SetPrimarySceneryGroup(&sgEntry);
@ -47,7 +47,7 @@ void LargeSceneryObject::ReadLegacy(IReadObjectContext * context, IStream * stre
_tiles = ReadTiles(stream);
GetImageTable()->Read(context, stream);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.large_scenery.price <= 0)
@ -67,9 +67,9 @@ void LargeSceneryObject::ReadLegacy(IReadObjectContext * context, IStream * stre
void LargeSceneryObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.name = language_allocate_object_string(GetName());
_baseImageId = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_baseImageId = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.image = _baseImageId;
_legacyType.large_scenery.tiles = _tiles.data();
@ -91,7 +91,7 @@ void LargeSceneryObject::Load()
void LargeSceneryObject::Unload()
{
language_free_object_string(_legacyType.name);
gfx_object_free_images(_baseImageId, GetImageTable()->GetCount());
gfx_object_free_images(_baseImageId, GetImageTable().GetCount());
_legacyType.name = 0;
_legacyType.image = 0;

View File

@ -71,7 +71,7 @@ std::string Object::GetString(uint8 index) const
auto sz = GetOverrideString(index);
if (sz.empty())
{
sz = GetStringTable()->GetString(index);
sz = GetStringTable().GetString(index);
}
return sz;
}

View File

@ -111,17 +111,6 @@ struct rct_object_filters {
assert_struct_size(rct_object_filters, 3);
#pragma pack(pop)
enum OBJ_STRING_ID : uint8
{
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,
OBJ_STRING_ID_SCENARIO_DETAILS = 2,
OBJ_STRING_ID_CAPACITY = 2,
};
interface IStream;
struct ObjectRepositoryItem;
struct rct_drawpixelinfo;
@ -148,9 +137,9 @@ private:
ImageTable _imageTable;
protected:
StringTable * GetStringTable() { return &_stringTable; }
const StringTable * GetStringTable() const { return &_stringTable; }
ImageTable * GetImageTable() { return &_imageTable; }
StringTable & GetStringTable() { return _stringTable; }
const StringTable & GetStringTable() const { return _stringTable; }
ImageTable & GetImageTable() { return _imageTable; }
std::string GetOverrideString(uint8 index) const;
std::string GetString(uint8 index) const;
@ -182,7 +171,7 @@ public:
virtual void SetRepositoryItem(ObjectRepositoryItem * item) const { }
const ImageTable * GetImageTable() const { return &_imageTable; }
const ImageTable & GetImageTable() const { return _imageTable; }
rct_object_entry GetScgWallsHeader();
rct_object_entry GetScgPathXHeader();

View File

@ -108,9 +108,9 @@ namespace ObjectJsonHelpers
auto objectsPath = env->GetDirectoryPath(DIRBASE::RCT2, DIRID::OBJECT);
auto objectPath = Path::Combine(objectsPath, name);
auto obj = ObjectFactory::CreateObjectFromLegacyFile(objectPath.c_str());
auto imgTable = static_cast<const Object *>(obj)->GetImageTable();
auto numImages = imgTable->GetCount();
auto images = imgTable->GetImages();
auto &imgTable = static_cast<const Object *>(obj)->GetImageTable();
auto numImages = imgTable.GetCount();
auto images = imgTable.GetImages();
for (uint32 i = start; i < Math::Min(numImages, end); i++)
{
auto g1 = images[i];

View File

@ -78,9 +78,9 @@ void RideObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_legacyType.shop_item = stream->ReadValue<uint8>();
_legacyType.shop_item_secondary = stream->ReadValue<uint8>();
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_DESCRIPTION);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_CAPACITY);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_DESCRIPTION);
GetStringTable().Read(context, stream, OBJ_STRING_ID_CAPACITY);
// Read preset colours, by default there are 32
_presetColours.count = stream->ReadValue<uint8>();
@ -110,7 +110,7 @@ void RideObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_peepLoadingPositionsCount[i] = numPeepLoadingPositions;
}
GetImageTable()->Read(context, stream);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.excitement_multiplier > 75)
@ -131,11 +131,11 @@ void RideObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
void RideObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.naming.name = language_allocate_object_string(GetName());
_legacyType.naming.description = language_allocate_object_string(GetDescription());
_legacyType.capacity = language_allocate_object_string(GetCapacity());
_legacyType.images_offset = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.images_offset = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.vehicle_preset_list = &_presetColours;
sint32 cur_vehicle_images_offset = _legacyType.images_offset + MAX_RIDE_TYPES_PER_RIDE_ENTRY;
@ -300,7 +300,7 @@ void RideObject::Unload()
language_free_object_string(_legacyType.naming.name);
language_free_object_string(_legacyType.naming.description);
language_free_object_string(_legacyType.capacity);
gfx_object_free_images(_legacyType.images_offset, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.images_offset, GetImageTable().GetCount());
_legacyType.naming.name = 0;
_legacyType.naming.description = 0;
@ -730,6 +730,6 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root)
vehicle0->sprite_flags |= VEHICLE_SPRITE_FLAG_FLAT;
vehicle0->base_image_id = 0;
ObjectJsonHelpers::LoadStrings(root, *GetStringTable());
ObjectJsonHelpers::LoadImages(root, *GetImageTable());
ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable());
}

View File

@ -40,16 +40,16 @@ void SceneryGroupObject::ReadLegacy(IReadObjectContext * context, IStream * stre
void SceneryGroupObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.name = language_allocate_object_string(GetName());
_legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.entry_count = 0;
}
void SceneryGroupObject::Unload()
{
language_free_object_string(_legacyType.name);
gfx_object_free_images(_legacyType.image, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image, GetImageTable().GetCount());
_legacyType.name = 0;
_legacyType.image = 0;

View File

@ -39,7 +39,7 @@ void SmallSceneryObject::ReadLegacy(IReadObjectContext * context, IStream * stre
_legacyType.small_scenery.num_frames = stream->ReadValue<uint16>();
_legacyType.small_scenery.scenery_tab_id = 0xFF;
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
rct_object_entry sgEntry = stream->ReadValue<rct_object_entry>();
SetPrimarySceneryGroup(&sgEntry);
@ -49,7 +49,7 @@ void SmallSceneryObject::ReadLegacy(IReadObjectContext * context, IStream * stre
_frameOffsets = ReadFrameOffsets(stream);
}
GetImageTable()->Read(context, stream);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.small_scenery.price <= 0)
@ -69,9 +69,9 @@ void SmallSceneryObject::ReadLegacy(IReadObjectContext * context, IStream * stre
void SmallSceneryObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.name = language_allocate_object_string(GetName());
_legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.small_scenery.scenery_tab_id = 0xFF;
@ -86,7 +86,7 @@ void SmallSceneryObject::Load()
void SmallSceneryObject::Unload()
{
language_free_object_string(_legacyType.name);
gfx_object_free_images(_legacyType.image, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image, GetImageTable().GetCount());
_legacyType.name = 0;
_legacyType.image = 0;

View File

@ -25,14 +25,14 @@ void StexObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_legacyType.var_06 = stream->ReadValue<uint8>();
stream->Seek(1, STREAM_SEEK_CURRENT);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_SCENARIO_NAME);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_PARK_NAME);
GetStringTable()->Read(context, stream, OBJ_STRING_ID_SCENARIO_DETAILS);
GetStringTable().Read(context, stream, OBJ_STRING_ID_SCENARIO_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_PARK_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_SCENARIO_DETAILS);
}
void StexObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.scenario_name = language_allocate_object_string(GetScenarioName());
_legacyType.park_name = language_allocate_object_string(GetParkName());
_legacyType.details = language_allocate_object_string(GetScenarioDetails());
@ -64,15 +64,15 @@ std::string StexObject::GetName() const
std::string StexObject::GetScenarioName() const
{
return GetStringTable()->GetString(OBJ_STRING_ID_SCENARIO_NAME);
return GetStringTable().GetString(OBJ_STRING_ID_SCENARIO_NAME);
}
std::string StexObject::GetScenarioDetails() const
{
return GetStringTable()->GetString(OBJ_STRING_ID_SCENARIO_DETAILS);
return GetStringTable().GetString(OBJ_STRING_ID_SCENARIO_DETAILS);
}
std::string StexObject::GetParkName() const
{
return GetStringTable()->GetString(OBJ_STRING_ID_PARK_NAME);
return GetStringTable().GetString(OBJ_STRING_ID_PARK_NAME);
}

View File

@ -19,14 +19,27 @@
#include <string>
#include <vector>
#include "../common.h"
#include "../localisation/Language.h"
interface IReadObjectContext;
interface IStream;
enum OBJ_STRING_ID : uint8
{
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,
OBJ_STRING_ID_SCENARIO_DETAILS = 2,
OBJ_STRING_ID_CAPACITY = 2,
OBJ_STRING_ID_VEHICLE_NAME = 3,
};
struct StringTableEntry
{
uint8 Id;
uint8 LanguageId;
uint8 Id = OBJ_STRING_ID_UNKNOWN;
uint8 LanguageId = LANGUAGE_UNDEFINED;
std::string Text;
};
@ -36,6 +49,10 @@ private:
std::vector<StringTableEntry> _strings;
public:
StringTable() = default;
StringTable(const StringTable &) = delete;
StringTable & operator=(const StringTable &) = delete;
void Read(IReadObjectContext * context, IStream * stream, uint8 id);
void Sort();
std::string GetString(uint8 id) const;

View File

@ -31,12 +31,12 @@ void WallObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
_legacyType.wall.scenery_tab_id = stream->ReadValue<uint8>();
_legacyType.wall.scrolling_mode = stream->ReadValue<uint8>();
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
rct_object_entry sgEntry = stream->ReadValue<rct_object_entry>();
SetPrimarySceneryGroup(&sgEntry);
GetImageTable()->Read(context, stream);
GetImageTable().Read(context, stream);
// Validate properties
if (_legacyType.wall.price <= 0)
@ -47,15 +47,15 @@ void WallObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
void WallObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.name = language_allocate_object_string(GetName());
_legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
}
void WallObject::Unload()
{
language_free_object_string(_legacyType.name);
gfx_object_free_images(_legacyType.image, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image, GetImageTable().GetCount());
_legacyType.name = 0;
_legacyType.image = 0;

View File

@ -25,15 +25,15 @@ void WaterObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
stream->Seek(14, STREAM_SEEK_CURRENT);
_legacyType.flags = stream->ReadValue<uint16>();
GetStringTable()->Read(context, stream, OBJ_STRING_ID_NAME);
GetImageTable()->Read(context, stream);
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
GetImageTable().Read(context, stream);
}
void WaterObject::Load()
{
GetStringTable()->Sort();
GetStringTable().Sort();
_legacyType.string_idx = language_allocate_object_string(GetName());
_legacyType.image_id = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount());
_legacyType.image_id = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount());
_legacyType.palette_index_1 = _legacyType.image_id + 1;
_legacyType.palette_index_2 = _legacyType.image_id + 4;
@ -42,7 +42,7 @@ void WaterObject::Load()
void WaterObject::Unload()
{
gfx_object_free_images(_legacyType.image_id, GetImageTable()->GetCount());
gfx_object_free_images(_legacyType.image_id, GetImageTable().GetCount());
language_free_object_string(_legacyType.string_idx);
_legacyType.string_idx = 0;