Fix toilets image loading

This commit is contained in:
Ted John 2017-12-05 18:57:14 +00:00 committed by Gymnasiast
parent ad21e962ee
commit 32d588d765
4 changed files with 39 additions and 27 deletions

View File

@ -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); 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); 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, void mask_scalar(sint32 width, sint32 height, const uint8 * RESTRICT maskSrc, const uint8 * RESTRICT colourSrc,
uint8 * RESTRICT dst, sint32 maskWrap, sint32 colourWrap, sint32 dstWrap); uint8 * RESTRICT dst, sint32 maskWrap, sint32 colourWrap, sint32 dstWrap);

View File

@ -858,3 +858,25 @@ rct_size16 FASTCALL gfx_get_sprite_size(uint32 image_id)
return size; 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;
}
}

View File

@ -219,22 +219,13 @@ namespace ObjectFactory
auto objectType = std::string(json_string_value(jObjectType)); auto objectType = std::string(json_string_value(jObjectType));
if (objectType == "ride") if (objectType == "ride")
{ {
std::string objectName; auto id = json_string_value(json_object_get(jRoot, "id"));
const char * id = json_string_value(json_object_get(jRoot, "id")); auto originalId = json_string_value(json_object_get(jRoot, "originalId"));
if (String::Equals(id, "rct1.icecr"))
{
objectName = "#RCT1ICE";
}
else
{
objectName = "#RCT1TOI";
}
rct_object_entry entry = { 0 }; rct_object_entry entry = { 0 };
memcpy(entry.name, objectName.c_str(), 8); memcpy(entry.name, originalId, 8);
result = new RideObject(entry); result = new RideObject(entry);
auto readContext = ReadObjectContext(objectName.c_str()); auto readContext = ReadObjectContext(id);
result->ReadJson(&readContext, jRoot); result->ReadJson(&readContext, jRoot);
if (readContext.WasError()) if (readContext.WasError())
{ {

View File

@ -537,8 +537,8 @@ uint8 RideObject::CalculateNumHorizontalFrames(const rct_ride_entry_vehicle * ve
void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) void RideObject::ReadJson(IReadObjectContext * context, const json_t * root)
{ {
printf("RideObject::ReadJson(context, root)\n"); printf("RideObject::ReadJson(context, root)\n");
const char * rideType = json_string_value(json_object_get(json_object_get(root, "properties"), "type")); auto 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 category = json_string_value(json_object_get(json_object_get(root, "properties"), "category"));
sint32 previewImg = 0; sint32 previewImg = 0;
sint32 imageStart = 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[1] = RIDE_TYPE_NULL;
_legacyType.ride_type[2] = RIDE_TYPE_NULL; _legacyType.ride_type[2] = RIDE_TYPE_NULL;
if (String::Equals(category, "stall"))
if (String::Equals(rideType, "stall"))
{ {
_legacyType.category[0] = RIDE_CATEGORY_SHOP; _legacyType.category[0] = RIDE_CATEGORY_SHOP;
_legacyType.category[1] = 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()) 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++) 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]; rct_ride_entry_vehicle * vehicle0 = &_legacyType.vehicles[0];
vehicle0->flags |= VEHICLE_SPRITE_FLAG_FLAT; vehicle0->sprite_flags |= VEHICLE_SPRITE_FLAG_FLAT;
vehicle0->base_image_id = imageStart; vehicle0->base_image_id = 0;
} }
} }