1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 20:43:04 +01:00

Refactor the ride type to entry map (#10967)

Use C++ vectors and allow larger ride entry indices (> 256)
This commit is contained in:
Ted John
2020-03-20 17:07:31 +00:00
committed by GitHub
parent 4cc2bc469a
commit c89cecb2b5
9 changed files with 126 additions and 159 deletions

View File

@@ -19,6 +19,7 @@
#include "Object.h"
#include "ObjectList.h"
#include "ObjectRepository.h"
#include "RideObject.h"
#include "SceneryGroupObject.h"
#include "SmallSceneryObject.h"
#include "WallObject.h"
@@ -35,6 +36,10 @@ class ObjectManager final : public IObjectManager
private:
IObjectRepository& _objectRepository;
std::vector<Object*> _loadedObjects;
std::array<std::vector<uint16_t>, RIDE_TYPE_COUNT> _rideTypeToObjectMap;
// Used to return a safe empty vector back from GetAllRideEntries, can be removed when std::span is available
std::vector<uint16_t> _nullRideTypeEntries;
public:
explicit ObjectManager(IObjectRepository& objectRepository)
@@ -287,6 +292,16 @@ public:
}
}
const std::vector<uint16_t>& GetAllRideEntries(uint8_t rideType) override
{
if (rideType >= RIDE_TYPE_COUNT)
{
// Return an empty vector
return _nullRideTypeEntries;
}
return _rideTypeToObjectMap[rideType];
}
private:
Object* LoadObject(const std::string& name)
{
@@ -642,7 +657,33 @@ private:
void ResetTypeToRideEntryIndexMap()
{
reset_type_to_ride_entry_index_map(*this);
// Clear all ride objects
for (auto& v : _rideTypeToObjectMap)
{
v.clear();
}
// Build object lists
auto maxRideObjects = static_cast<size_t>(object_entry_group_counts[OBJECT_TYPE_RIDE]);
for (size_t i = 0; i < maxRideObjects; i++)
{
auto rideObject = static_cast<RideObject*>(GetLoadedObject(OBJECT_TYPE_RIDE, i));
if (rideObject != nullptr)
{
const auto entry = static_cast<rct_ride_entry*>(rideObject->GetLegacyData());
if (entry != nullptr)
{
for (auto rideType : entry->ride_type)
{
if (rideType < _rideTypeToObjectMap.size())
{
auto& v = _rideTypeToObjectMap[rideType];
v.push_back(static_cast<uint16_t>(i));
}
}
}
}
}
}
static void ReportMissingObject(const rct_object_entry* entry)