1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Fix #14217: Crash in large_scenery_paint()

This commit is contained in:
Michael Steenbeek
2021-03-07 00:08:51 +01:00
committed by GitHub
parent 64807147e6
commit 9d1643d3ce
5 changed files with 28 additions and 3 deletions

View File

@@ -274,3 +274,11 @@ std::vector<rct_large_scenery_text_glyph> LargeSceneryObject::ReadJsonGlyphs(jso
}
return glyphs;
}
const rct_large_scenery_tile* LargeSceneryObject::GetTileForSequence(uint8_t SequenceIndex) const
{
if (SequenceIndex >= _tiles.size())
return nullptr;
return &_tiles[SequenceIndex];
}

View File

@@ -40,6 +40,7 @@ public:
void Unload() override;
void DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int32_t height) const override;
const rct_large_scenery_tile* GetTileForSequence(uint8_t SequenceIndex) const;
private:
static std::vector<rct_large_scenery_tile> ReadTiles(OpenRCT2::IStream* stream);

View File

@@ -11,6 +11,7 @@
#include "../../config/Config.h"
#include "../../interface/Viewport.h"
#include "../../localisation/Localisation.h"
#include "../../object/LargeSceneryObject.h"
#include "../../ride/Ride.h"
#include "../../ride/TrackDesign.h"
#include "../../util/Util.h"
@@ -27,7 +28,7 @@
// 6B8172:
static void large_scenery_paint_supports(
paint_session* session, uint8_t direction, uint16_t height, const TileElement* tileElement, uint32_t dword_F4387C,
rct_large_scenery_tile* tile)
const rct_large_scenery_tile* tile)
{
if (tile->flags & LARGE_SCENERY_TILE_FLAG_NO_SUPPORTS)
{
@@ -227,12 +228,19 @@ void large_scenery_paint(paint_session* session, uint8_t direction, uint16_t hei
}
session->InteractionType = ViewportInteractionItem::LargeScenery;
uint32_t sequenceNum = tileElement->AsLargeScenery()->GetSequenceIndex();
rct_scenery_entry* entry = tileElement->AsLargeScenery()->GetEntry();
const LargeSceneryObject* object = tileElement->AsLargeScenery()->GetObject();
if (object == nullptr)
return;
const rct_scenery_entry* entry = tileElement->AsLargeScenery()->GetEntry();
if (entry == nullptr)
return;
uint32_t image_id = (sequenceNum << 2) + entry->image + 4 + direction;
rct_large_scenery_tile* tile = &entry->large_scenery.tiles[sequenceNum];
const rct_large_scenery_tile* tile = object->GetTileForSequence(sequenceNum);
if (tile == nullptr)
return;
uint32_t dword_F4387C = 0;
image_id |= SPRITE_ID_PALETTE_COLOUR_2(
tileElement->AsLargeScenery()->GetPrimaryColour(), tileElement->AsLargeScenery()->GetSecondaryColour());

View File

@@ -11,6 +11,7 @@
#include "../Context.h"
#include "../common.h"
#include "../object/LargeSceneryObject.h"
#include "../object/ObjectManager.h"
#include "../world/Banner.h"
#include "TileElement.h"
@@ -79,6 +80,11 @@ rct_scenery_entry* LargeSceneryElement::GetEntry() const
return get_large_scenery_entry(GetEntryIndex());
}
const LargeSceneryObject* LargeSceneryElement::GetObject() const
{
return static_cast<const LargeSceneryObject*>(object_entry_get_object(ObjectType::LargeScenery, GetEntryIndex()));
}
uint8_t LargeSceneryElement::GetSequenceIndex() const
{
return SequenceIndex;

View File

@@ -19,6 +19,7 @@ struct Banner;
struct CoordsXY;
struct rct_scenery_entry;
struct rct_footpath_entry;
class LargeSceneryObject;
class TerrainSurfaceObject;
class TerrainEdgeObject;
using track_type_t = uint16_t;
@@ -492,6 +493,7 @@ public:
ObjectEntryIndex GetEntryIndex() const;
void SetEntryIndex(ObjectEntryIndex newIndex);
rct_scenery_entry* GetEntry() const;
const LargeSceneryObject* GetObject() const;
uint8_t GetSequenceIndex() const;
void SetSequenceIndex(uint8_t newIndex);