diff --git a/src/openrct2/object/LargeSceneryObject.cpp b/src/openrct2/object/LargeSceneryObject.cpp index e4fa485d78..1b4cb19e31 100644 --- a/src/openrct2/object/LargeSceneryObject.cpp +++ b/src/openrct2/object/LargeSceneryObject.cpp @@ -24,6 +24,34 @@ #include #include +static rct_large_scenery_text ReadLegacy3DFont(OpenRCT2::IStream& stream) +{ + rct_large_scenery_text _3dFontLegacy = {}; + _3dFontLegacy.offset[0].x = stream.ReadValue(); + _3dFontLegacy.offset[0].y = stream.ReadValue(); + _3dFontLegacy.offset[1].x = stream.ReadValue(); + _3dFontLegacy.offset[1].y = stream.ReadValue(); + _3dFontLegacy.max_width = stream.ReadValue(); + stream.ReadValue(); + _3dFontLegacy.flags = stream.ReadValue(); + _3dFontLegacy.num_images = stream.ReadValue(); + + auto ReadLegacyTextGlyph = [&stream]() { + rct_large_scenery_text_glyph glyph{}; + glyph.image_offset = stream.ReadValue(); + glyph.width = stream.ReadValue(); + glyph.height = stream.ReadValue(); + stream.ReadValue(); + return glyph; + }; + + for (size_t i = 0; i < std::size(_3dFontLegacy.glyphs); ++i) + { + _3dFontLegacy.glyphs[i] = ReadLegacyTextGlyph(); + } + return _3dFontLegacy; +} + void LargeSceneryObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStream* stream) { stream->Seek(6, OpenRCT2::STREAM_SEEK_CURRENT); @@ -43,8 +71,7 @@ void LargeSceneryObject::ReadLegacy(IReadObjectContext* context, OpenRCT2::IStre if (_legacyType.flags & LARGE_SCENERY_FLAG_3D_TEXT) { - rct_large_scenery_text _3dFontLegacy = {}; - stream->Read(&_3dFontLegacy); + rct_large_scenery_text _3dFontLegacy = ReadLegacy3DFont(*stream); _3dFont = std::make_unique(_3dFontLegacy); _legacyType.text = _3dFont.get(); } @@ -129,11 +156,21 @@ void LargeSceneryObject::DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int3 std::vector LargeSceneryObject::ReadTiles(OpenRCT2::IStream* stream) { auto tiles = std::vector(); + + auto ReadLegacyTile = [&stream]() { + rct_large_scenery_tile tile{}; + tile.x_offset = stream->ReadValue(); + tile.y_offset = stream->ReadValue(); + tile.z_offset = stream->ReadValue(); + tile.z_clearance = stream->ReadValue(); + tile.flags = stream->ReadValue(); + return tile; + }; + while (stream->ReadValue() != 0xFFFF) { stream->Seek(-2, OpenRCT2::STREAM_SEEK_CURRENT); - auto tile = stream->ReadValue(); - tiles.push_back(std::move(tile)); + tiles.push_back(ReadLegacyTile()); } tiles.push_back({ -1, -1, -1, 255, 0xFFFF }); return tiles; diff --git a/src/openrct2/world/Scenery.h b/src/openrct2/world/Scenery.h index e38847d194..65ddf4c4ef 100644 --- a/src/openrct2/world/Scenery.h +++ b/src/openrct2/world/Scenery.h @@ -39,7 +39,6 @@ struct rct_large_scenery_tile // CCCC WWWW 0SS0 0000 uint16_t flags; }; -assert_struct_size(rct_large_scenery_tile, 9); enum { @@ -54,7 +53,6 @@ struct rct_large_scenery_text_glyph uint8_t height; uint8_t pad_3; }; -assert_struct_size(rct_large_scenery_text_glyph, 4); struct rct_large_scenery_text { @@ -68,7 +66,6 @@ struct rct_large_scenery_text uint8_t num_images; // 0xD rct_large_scenery_text_glyph glyphs[256]; // 0xE }; -assert_struct_size(rct_large_scenery_text, 14 + 4 * 256); enum LARGE_SCENERY_TEXT_FLAGS {