1
0
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:
frutiemax
2022-08-09 21:18:15 -04:00
committed by GitHub
parent e0e7227dae
commit 9cd6c646a9
5 changed files with 53 additions and 25 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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

View File

@@ -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