1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-20 13:33:02 +01:00

Load loading positions from JSON and convert to vector

This commit is contained in:
Ted John
2017-12-21 00:39:26 +00:00
committed by Gymnasiast
parent 7190894ec6
commit aec6da1420
2 changed files with 40 additions and 15 deletions

View File

@@ -19,6 +19,7 @@
#include <algorithm>
#include <unordered_map>
#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<uint16>();
}
_peepLoadingPositions[i] = stream->ReadArray<sint8>(numPeepLoadingPositions);
_peepLoadingPositionsCount[i] = numPeepLoadingPositions;
auto data = stream->ReadArray<sint8>(numPeepLoadingPositions);
_peepLoadingPositions[i] = std::vector<sint8>(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<size_t>(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<uint16>::max())
{
std::vector<sint8> positionData;
if (numPositions < 255)
{
positionData.push_back(static_cast<sint8>(numPositions));
}
else
{
positionData.push_back(-1);
positionData.push_back(static_cast<sint8>(numPositions & 0xFF));
positionData.push_back(static_cast<sint8>(numPositions >> 8));
}
for (size_t j = 0; j < numPositions; j++)
{
auto pos = json_integer_value(json_array_get(positions, j));
pos = Math::Clamp<sint64>(std::numeric_limits<sint8>::min(), pos, std::numeric_limits<sint8>::max());
positionData.push_back(pos);
}
_peepLoadingPositions[i] = std::move(positionData);
}
}
}
_legacyType.flags |= ObjectJsonHelpers::GetFlags<uint32>(properties, {

View File

@@ -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<sint8> _peepLoadingPositions[4];
public:
explicit RideObject(const rct_object_entry &entry) : Object(entry) { }
~RideObject();
void * GetLegacyData() override { return &_legacyType; }