From 9cd6c646a9b63233e61305e1a51b16769c36afcd Mon Sep 17 00:00:00 2001 From: frutiemax Date: Tue, 9 Aug 2022 21:18:15 -0400 Subject: [PATCH] Add UpdateMeasurementsSpecialElements field to RTD (#17659) --- src/openrct2/ride/RideData.h | 4 ++ src/openrct2/ride/Vehicle.cpp | 57 +++++++++++-------- src/openrct2/ride/Vehicle.h | 4 ++ src/openrct2/ride/coaster/meta/WaterCoaster.h | 6 ++ src/openrct2/ride/gentle/meta/MiniGolf.h | 7 +++ 5 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index 1757c0a0a1..1f68b2eb5f 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -32,6 +32,7 @@ #include "ShopItem.h" #include "Track.h" #include "TrackPaint.h" +#include "Vehicle.h" enum class ResearchCategory : uint8_t; @@ -157,6 +158,7 @@ using RideMusicUpdateFunction = void (*)(Ride*); using PeepUpdateRideLeaveEntranceFunc = void (*)(Guest*, Ride*, CoordsXYZD&); using StartRideMusicFunction = void (*)(const OpenRCT2::RideAudio::ViewportRideMusicInstance&); using LightFXAddLightsMagicVehicleFunction = void (*)(const Vehicle* vehicle); +using RideUpdateMeasurementsSpecialElementsFunc = void (*)(Ride* ride, const track_type_t trackType); struct RideTypeDescriptor { @@ -216,6 +218,8 @@ struct RideTypeDescriptor PeepUpdateRideLeaveEntranceFunc UpdateLeaveEntrance = PeepUpdateRideLeaveEntranceDefault; + RideUpdateMeasurementsSpecialElementsFunc UpdateMeasurementsSpecialElements = RideUpdateMeasurementsSpecialElements_Default; + bool HasFlag(uint64_t flag) const; void GetAvailableTrackPieces(RideTrackGroup& res) const; bool SupportsTrackPiece(const uint64_t trackPiece) const; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 5d76e42bc4..9b7f5ab642 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1416,6 +1416,36 @@ bool Vehicle::OpenRestraints() return restraintsOpen; } +void RideUpdateMeasurementsSpecialElements_Default(Ride* ride, const track_type_t trackType) +{ + const auto& ted = GetTrackElementDescriptor(trackType); + uint16_t trackFlags = ted.Flags; + if (trackFlags & TRACK_ELEM_FLAG_NORMAL_TO_INVERSION) + { + if (ride->inversions < OpenRCT2::Limits::MaxInversions) + ride->inversions++; + } +} + +void RideUpdateMeasurementsSpecialElements_MiniGolf(Ride* ride, const track_type_t trackType) +{ + const auto& ted = GetTrackElementDescriptor(trackType); + uint16_t trackFlags = ted.Flags; + if (trackFlags & TRACK_ELEM_FLAG_IS_GOLF_HOLE) + { + if (ride->holes < OpenRCT2::Limits::MaxGolfHoles) + ride->holes++; + } +} + +void RideUpdateMeasurementsSpecialElements_WaterCoaster(Ride* ride, const track_type_t trackType) +{ + if (trackType >= TrackElemType::FlatCovered && trackType <= TrackElemType::RightQuarterTurn3TilesCovered) + { + ride->special_track_elements |= RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; + } +} + /** * * rct2: 0x006D6D1F @@ -1520,13 +1550,8 @@ void Vehicle::UpdateMeasurements() curRide->testing_flags &= ~RIDE_TESTING_POWERED_LIFT; } - if (curRide->type == RIDE_TYPE_WATER_COASTER) - { - if (trackElemType >= TrackElemType::FlatCovered && trackElemType <= TrackElemType::RightQuarterTurn3TilesCovered) - { - curRide->special_track_elements |= RIDE_ELEMENT_TUNNEL_SPLASH_OR_RAPIDS; - } - } + const auto& rtd = curRide->GetRideTypeDescriptor(); + rtd.UpdateMeasurementsSpecialElements(curRide, trackElemType); switch (trackElemType) { @@ -1550,7 +1575,6 @@ void Vehicle::UpdateMeasurements() const auto& ted = GetTrackElementDescriptor(trackElemType); uint16_t trackFlags = ted.Flags; - uint32_t testingFlags = curRide->testing_flags; if (testingFlags & RIDE_TESTING_TURN_LEFT && trackFlags & TRACK_ELEM_FLAG_TURN_LEFT) { @@ -1688,23 +1712,6 @@ void Vehicle::UpdateMeasurements() curRide->start_drop_height = z / COORDS_Z_STEP; } - if (curRide->type == RIDE_TYPE_MINI_GOLF) - { - if (trackFlags & TRACK_ELEM_FLAG_IS_GOLF_HOLE) - { - if (curRide->holes < OpenRCT2::Limits::MaxGolfHoles) - curRide->holes++; - } - } - else - { - if (trackFlags & TRACK_ELEM_FLAG_NORMAL_TO_INVERSION) - { - if (curRide->inversions < OpenRCT2::Limits::MaxInversions) - curRide->inversions++; - } - } - if (trackFlags & TRACK_ELEM_FLAG_HELIX) { uint8_t helixes = ride_get_helix_sections(curRide); diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index f6036906e5..e78865de69 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -522,6 +522,10 @@ Vehicle* try_get_vehicle(EntityId spriteIndex); void vehicle_update_all(); void vehicle_sounds_update(); +void RideUpdateMeasurementsSpecialElements_Default(Ride* ride, const track_type_t trackType); +void RideUpdateMeasurementsSpecialElements_MiniGolf(Ride* ride, const track_type_t trackType); +void RideUpdateMeasurementsSpecialElements_WaterCoaster(Ride* ride, const track_type_t trackType); + extern Vehicle* gCurrentVehicle; extern StationIndex _vehicleStationIndex; extern uint32_t _vehicleMotionTrackFlags; diff --git a/src/openrct2/ride/coaster/meta/WaterCoaster.h b/src/openrct2/ride/coaster/meta/WaterCoaster.h index f7794b4271..46a3cbac11 100644 --- a/src/openrct2/ride/coaster/meta/WaterCoaster.h +++ b/src/openrct2/ride/coaster/meta/WaterCoaster.h @@ -55,5 +55,11 @@ constexpr const RideTypeDescriptor WaterCoasterRTD = SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "water_coaster"), SET_FIELD(LightFXAddLightsMagicVehicle, LightFxAddLightsMagicVehicle_BoatHire), + SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), + SET_FIELD(DesignCreateMode, TrackDesignCreateMode::Default), + SET_FIELD(MusicUpdateFunction, DefaultMusicUpdate), + SET_FIELD(Classification, RideClassification::Ride), + SET_FIELD(UpdateLeaveEntrance, PeepUpdateRideLeaveEntranceDefault), + SET_FIELD(UpdateMeasurementsSpecialElements, RideUpdateMeasurementsSpecialElements_WaterCoaster), }; // clang-format on diff --git a/src/openrct2/ride/gentle/meta/MiniGolf.h b/src/openrct2/ride/gentle/meta/MiniGolf.h index 6525772a11..75e39c05ee 100644 --- a/src/openrct2/ride/gentle/meta/MiniGolf.h +++ b/src/openrct2/ride/gentle/meta/MiniGolf.h @@ -52,5 +52,12 @@ constexpr const RideTypeDescriptor MiniGolfRTD = SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_MINI_GOLF_TRACK, SPR_RIDE_DESIGN_PREVIEW_MINI_GOLF_SUPPORTS }), SET_FIELD(ColourKey, RideColourKey::Ride), SET_FIELD(Name, "mini_golf"), + SET_FIELD(LightFXAddLightsMagicVehicle, nullptr), + SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::DefaultStartRideMusicChannel), + SET_FIELD(DesignCreateMode, TrackDesignCreateMode::Default), + SET_FIELD(MusicUpdateFunction, DefaultMusicUpdate), + SET_FIELD(Classification, RideClassification::Ride), + SET_FIELD(UpdateLeaveEntrance, PeepUpdateRideLeaveEntranceDefault), + SET_FIELD(UpdateMeasurementsSpecialElements, RideUpdateMeasurementsSpecialElements_MiniGolf), }; // clang-format on