From 32d588d765a168550aa236c3a1db462d5235ed86 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 5 Dec 2017 18:57:14 +0000 Subject: [PATCH] Fix toilets image loading --- src/openrct2/drawing/Drawing.h | 1 + src/openrct2/drawing/Sprite.cpp | 22 ++++++++++++++++++++++ src/openrct2/object/ObjectFactory.cpp | 17 ++++------------- src/openrct2/object/RideObject.cpp | 26 ++++++++++++-------------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index b240e59843..2346351e8d 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -339,6 +339,7 @@ void scrolling_text_initialise_bitmaps(); sint32 scrolling_text_setup(struct paint_session * session, rct_string_id stringId, uint16 scroll, uint16 scrollingMode); rct_size16 FASTCALL gfx_get_sprite_size(uint32 image_id); +size_t g1_calculate_data_size(const rct_g1_element * g1); void mask_scalar(sint32 width, sint32 height, const uint8 * RESTRICT maskSrc, const uint8 * RESTRICT colourSrc, uint8 * RESTRICT dst, sint32 maskWrap, sint32 colourWrap, sint32 dstWrap); diff --git a/src/openrct2/drawing/Sprite.cpp b/src/openrct2/drawing/Sprite.cpp index 0fc7f5c991..28cf83e38d 100644 --- a/src/openrct2/drawing/Sprite.cpp +++ b/src/openrct2/drawing/Sprite.cpp @@ -858,3 +858,25 @@ rct_size16 FASTCALL gfx_get_sprite_size(uint32 image_id) return size; } +size_t g1_calculate_data_size(const rct_g1_element * g1) +{ + if (g1->flags & G1_FLAG_RLE_COMPRESSION) + { + uint16 * offsets = (uint16 *)g1->offset; + uint8 * ptr = g1->offset + offsets[g1->height - 1]; + bool endOfLine = false; + do + { + uint8 chunk0 = *ptr++; + ptr++; // offset + uint8 chunkSize = chunk0 & 0x7F; + ptr += chunkSize; + endOfLine = (chunk0 & 0x80) != 0; + } while (!endOfLine); + return ptr - g1->offset; + } + else + { + return g1->width * g1->height; + } +} diff --git a/src/openrct2/object/ObjectFactory.cpp b/src/openrct2/object/ObjectFactory.cpp index e3fe8b2c98..b499f931e3 100644 --- a/src/openrct2/object/ObjectFactory.cpp +++ b/src/openrct2/object/ObjectFactory.cpp @@ -219,22 +219,13 @@ namespace ObjectFactory auto objectType = std::string(json_string_value(jObjectType)); if (objectType == "ride") { - std::string objectName; - const char * id = json_string_value(json_object_get(jRoot, "id")); - - if (String::Equals(id, "rct1.icecr")) - { - objectName = "#RCT1ICE"; - } - else - { - objectName = "#RCT1TOI"; - } + auto id = json_string_value(json_object_get(jRoot, "id")); + auto originalId = json_string_value(json_object_get(jRoot, "originalId")); rct_object_entry entry = { 0 }; - memcpy(entry.name, objectName.c_str(), 8); + memcpy(entry.name, originalId, 8); result = new RideObject(entry); - auto readContext = ReadObjectContext(objectName.c_str()); + auto readContext = ReadObjectContext(id); result->ReadJson(&readContext, jRoot); if (readContext.WasError()) { diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 5f604122e2..b11419e840 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -537,8 +537,8 @@ uint8 RideObject::CalculateNumHorizontalFrames(const rct_ride_entry_vehicle * ve void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) { printf("RideObject::ReadJson(context, root)\n"); - const char * rideType = json_string_value(json_object_get(json_object_get(root, "properties"), "type")); - const char * category = json_string_value(json_object_get(json_object_get(root, "properties"), "category")); + auto rideType = json_string_value(json_object_get(json_object_get(root, "properties"), "type")); + auto category = json_string_value(json_object_get(json_object_get(root, "properties"), "category")); sint32 previewImg = 0; sint32 imageStart = 0; @@ -562,9 +562,7 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) _legacyType.ride_type[1] = RIDE_TYPE_NULL; _legacyType.ride_type[2] = RIDE_TYPE_NULL; - - - if (String::Equals(rideType, "stall")) + if (String::Equals(category, "stall")) { _legacyType.category[0] = RIDE_CATEGORY_SHOP; _legacyType.category[1] = RIDE_CATEGORY_SHOP; @@ -586,18 +584,18 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) if (is_csg_loaded()) { - auto g1 = *(gfx_get_g1_element(previewImg)); - //auto g12 = *(gfx_get_g1_element(previewImg + 1)); - g1.x_offset = 0; - g1.y_offset = 0; - for (size_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) { - imageTable->AddImage(&g1, 0x4000); //(size_t)(g12.offset - g1.offset)); + auto g1 = gfx_get_g1_element(previewImg); + imageTable->AddImage(g1, g1_calculate_data_size(g1)); + } + for (int i = 0; i < 6; i++) + { + auto g1 = gfx_get_g1_element(imageStart + i); + imageTable->AddImage(g1, g1_calculate_data_size(g1)); } - rct_ride_entry_vehicle * vehicle0 = &_legacyType.vehicles[0]; - vehicle0->flags |= VEHICLE_SPRITE_FLAG_FLAT; - vehicle0->base_image_id = imageStart; + vehicle0->sprite_flags |= VEHICLE_SPRITE_FLAG_FLAT; + vehicle0->base_image_id = 0; } }