mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-23 06:44:38 +01:00
Add UpdateMeasurementsSpecialElements field to RTD (#17659)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user