diff --git a/src/openrct2/ride/RideAudio.cpp b/src/openrct2/ride/RideAudio.cpp index 7df021f764..12772d415e 100644 --- a/src/openrct2/ride/RideAudio.cpp +++ b/src/openrct2/ride/RideAudio.cpp @@ -283,13 +283,13 @@ namespace OpenRCT2::RideAudio } } - static std::pair RideMusicGetTrackOffsetLength(const Ride& ride) + std::pair RideMusicGetTrackOffsetLength_Circus(const Ride& ride) { - if (ride.type == RIDE_TYPE_CIRCUS) - { - return { 1378, 12427456 }; - } + return { 1378, 12427456 }; + } + std::pair RideMusicGetTrackOffsetLength_Default(const Ride& ride) + { auto& objManager = GetContext()->GetObjectManager(); auto musicObj = static_cast(objManager.GetLoadedObject(ObjectType::Music, ride.music)); if (musicObj != nullptr) @@ -304,6 +304,12 @@ namespace OpenRCT2::RideAudio return { 0, 0 }; } + static std::pair RideMusicGetTrackOffsetLength(const Ride& ride) + { + const auto& rtd = ride.GetRideTypeDescriptor(); + return rtd.MusicTrackOffsetLength(ride); + } + static void RideUpdateMusicPosition(Ride& ride) { auto [trackOffset, trackLength] = RideMusicGetTrackOffsetLength(ride); diff --git a/src/openrct2/ride/RideAudio.h b/src/openrct2/ride/RideAudio.h index aee993fe0d..4966289306 100644 --- a/src/openrct2/ride/RideAudio.h +++ b/src/openrct2/ride/RideAudio.h @@ -12,6 +12,7 @@ #include "../Identifiers.h" #include +#include struct CoordsXYZ; struct Ride; @@ -40,4 +41,7 @@ namespace OpenRCT2::RideAudio void DefaultStartRideMusicChannel(const ViewportRideMusicInstance& instance); void CircusStartRideMusicChannel(const ViewportRideMusicInstance& instance); + + std::pair RideMusicGetTrackOffsetLength_Circus(const Ride& ride); + std::pair RideMusicGetTrackOffsetLength_Default(const Ride& ride); } // namespace OpenRCT2::RideAudio diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index 632c1064db..fce70de999 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -161,6 +161,7 @@ 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); +using MusicTrackOffsetLengthFunc = std::pair (*)(const Ride& ride); enum class RideConstructionWindowContext : uint8_t { @@ -230,6 +231,8 @@ struct RideTypeDescriptor RideUpdateMeasurementsSpecialElementsFunc UpdateMeasurementsSpecialElements = RideUpdateMeasurementsSpecialElements_Default; + MusicTrackOffsetLengthFunc MusicTrackOffsetLength = OpenRCT2::RideAudio::RideMusicGetTrackOffsetLength_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/gentle/meta/Circus.h b/src/openrct2/ride/gentle/meta/Circus.h index ad4e491487..e84de20e72 100644 --- a/src/openrct2/ride/gentle/meta/Circus.h +++ b/src/openrct2/ride/gentle/meta/Circus.h @@ -54,5 +54,10 @@ constexpr const RideTypeDescriptor CircusRTD = SET_FIELD(StartRideMusic, OpenRCT2::RideAudio::CircusStartRideMusicChannel), SET_FIELD(DesignCreateMode, TrackDesignCreateMode::Default), SET_FIELD(MusicUpdateFunction, CircusMusicUpdate), + SET_FIELD(Classification,RideClassification::Ride), + SET_FIELD(UpdateLeaveEntrance,PeepUpdateRideLeaveEntranceDefault), + SET_FIELD(ConstructionWindowContext, RideConstructionWindowContext::Default), + SET_FIELD(UpdateMeasurementsSpecialElements, RideUpdateMeasurementsSpecialElements_Default), + SET_FIELD(MusicTrackOffsetLength, OpenRCT2::RideAudio::RideMusicGetTrackOffsetLength_Circus), }; // clang-format on