diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index eedddfa164..0fb3c14f9d 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -19,6 +19,7 @@ #include #include #include "../core/IStream.hpp" +#include "../core/Math.hpp" #include "../core/Memory.hpp" #include "../core/String.hpp" #include "../core/Util.hpp" @@ -35,14 +36,6 @@ using namespace OpenRCT2; -RideObject::~RideObject() -{ - for (auto &peepLoadingPosition : _peepLoadingPositions) - { - Memory::Free(peepLoadingPosition); - } -} - void RideObject::ReadLegacy(IReadObjectContext * context, IStream * stream) { stream->Seek(8, STREAM_SEEK_CURRENT); @@ -105,8 +98,10 @@ void RideObject::ReadLegacy(IReadObjectContext * context, IStream * stream) { numPeepLoadingPositions = stream->ReadValue(); } - _peepLoadingPositions[i] = stream->ReadArray(numPeepLoadingPositions); - _peepLoadingPositionsCount[i] = numPeepLoadingPositions; + + auto data = stream->ReadArray(numPeepLoadingPositions); + _peepLoadingPositions[i] = std::vector(data, data + numPeepLoadingPositions); + Memory::Free(data); } GetImageTable().Read(context, stream); @@ -288,8 +283,8 @@ void RideObject::Load() set_vehicle_type_image_max_sizes(vehicleEntry, num_images); } } - vehicleEntry->peep_loading_positions = _peepLoadingPositions[i]; - vehicleEntry->peep_loading_positions_count = _peepLoadingPositionsCount[i]; + vehicleEntry->peep_loading_positions = _peepLoadingPositions[i].data(); + vehicleEntry->peep_loading_positions_count = (uint16)_peepLoadingPositions[i].size(); } } } @@ -600,6 +595,38 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) auto availableTrackPieces = ObjectJsonHelpers::GetJsonStringArray(json_object_get(properties, "availableTrackPieces")); _presetColours = ReadJsonCarColours(json_object_get(properties, "carColours")); + + + // Get loading positions + auto loadingPositions = json_object_get(properties, "loadingPositions"); + auto numLoadingPositions = std::min(json_array_size(loadingPositions), 4); + for (size_t i = 0; i < numLoadingPositions; i++) + { + auto positions = json_array_get(loadingPositions, i); + auto numPositions = json_array_size(positions); + if (numPositions > 0 && numPositions <= std::numeric_limits::max()) + { + std::vector positionData; + if (numPositions < 255) + { + positionData.push_back(static_cast(numPositions)); + } + else + { + positionData.push_back(-1); + positionData.push_back(static_cast(numPositions & 0xFF)); + positionData.push_back(static_cast(numPositions >> 8)); + } + + for (size_t j = 0; j < numPositions; j++) + { + auto pos = json_integer_value(json_array_get(positions, j)); + pos = Math::Clamp(std::numeric_limits::min(), pos, std::numeric_limits::max()); + positionData.push_back(pos); + } + _peepLoadingPositions[i] = std::move(positionData); + } + } } _legacyType.flags |= ObjectJsonHelpers::GetFlags(properties, { diff --git a/src/openrct2/object/RideObject.h b/src/openrct2/object/RideObject.h index fb920f1d54..cc4b83088d 100644 --- a/src/openrct2/object/RideObject.h +++ b/src/openrct2/object/RideObject.h @@ -25,12 +25,10 @@ class RideObject final : public Object private: rct_ride_entry _legacyType = { }; vehicle_colour_preset_list _presetColours = { 0 }; - sint8 * _peepLoadingPositions[4] = { nullptr }; - uint16 _peepLoadingPositionsCount[4] = { 0 }; + std::vector _peepLoadingPositions[4]; public: explicit RideObject(const rct_object_entry &entry) : Object(entry) { } - ~RideObject(); void * GetLegacyData() override { return &_legacyType; }