diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index d0f739970e..2017b60962 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -53,6 +53,7 @@ #include "platform/Crash.h" #include "platform/Platform2.h" #include "platform/platform.h" +#include "ride/TrackData.h" #include "ride/TrackDesignRepository.h" #include "scenario/Scenario.h" #include "scenario/ScenarioRepository.h" @@ -395,6 +396,7 @@ namespace OpenRCT2 } _env->SetBasePath(DIRBASE::RCT2, rct2InstallPath); } + TrackMetaData::Init(); _objectRepository = CreateObjectRepository(_env); _objectManager = CreateObjectManager(*_objectRepository); diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 57e88855ca..560258ba2c 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -12,6 +12,7 @@ #include "Track.h" #include "TrackPaint.h" +#include #include // clang-format off @@ -5127,3 +5128,41 @@ const uint16_t TrackFlags[TrackElemType::Count] = { /* TrackElemType::FlatTrack3x3 */ 0, }; // clang-format on + +namespace OpenRCT2 +{ + namespace TrackMetaData + { + static std::vector _trackElementDescriptors; + void Init() + { + _trackElementDescriptors.clear(); + _trackElementDescriptors.reserve(TrackElemType::Count); + + TrackElementDescriptor desc; + for (int i = 0; i < TrackElemType::Count; i++) + { + desc.AlternativeType = AlternativeTrackTypes[i]; + desc.Block = const_cast(TrackBlocks[i]); + desc.Coordinates = TrackCoordinates[i]; + desc.CurveChain = gTrackCurveChain[i]; + desc.Flags = TrackFlags[i]; + desc.HeightMarkerPositions = TrackHeightMarkerPositions[i]; + desc.MirrorMap = TrackElementMirrorMap[i]; + desc.PieceLength = TrackPieceLengths[i]; + desc.Pricing = TrackPricing[i]; + + for (uint8_t j = 0; j < MaxSequencesPerPiece; j++) + { + desc.SequenceElementAllowedWallEdges[j] = TrackSequenceElementAllowedWallEdges[i][j]; + desc.TrackSequenceProperties[j] = TrackSequenceProperties[i][j]; + } + _trackElementDescriptors.push_back(desc); + } + } + const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t& type) + { + return _trackElementDescriptors[type]; + } + } // namespace TrackMetaData +} // namespace OpenRCT2 diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index ba1dee8ee6..ff61c6efca 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -74,3 +74,29 @@ extern const uint32_t TrackHeightMarkerPositions[TrackElemType::Count]; extern const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][16]; extern const uint16_t TrackFlags[TrackElemType::Count]; + +struct TrackElementDescriptor +{ + rct_track_coordinates Coordinates; + + rct_preview_track* Block; + uint8_t PieceLength; + track_curve_chain CurveChain; + track_type_t AlternativeType; + money32 Pricing; + track_type_t MirrorMap; + uint32_t HeightMarkerPositions; + uint16_t Flags; + + std::array SequenceElementAllowedWallEdges; + std::array TrackSequenceProperties; +}; + +namespace OpenRCT2 +{ + namespace TrackMetaData + { + void Init(); + const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t& type); + } // namespace TrackMetaData +} // namespace OpenRCT2