From c244791edad3e3d16399bee18477de8a5c03551e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 16:55:26 +0100 Subject: [PATCH 1/8] Refactor ride_find_track_gap() to Ride::FindTrackGap() --- src/openrct2/ride/Ride.cpp | 33 +++++++++++++------------- src/openrct2/ride/Ride.h | 3 ++- src/openrct2/ride/RideConstruction.cpp | 4 ++-- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 754465e3a3..8457582940 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -732,31 +732,31 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra * bx result y * esi input / output map element */ -int32_t ride_find_track_gap(const Ride* ride, CoordsXYE* input, CoordsXYE* output) +bool Ride::FindTrackGap(const CoordsXYE& input, CoordsXYE* output) const { - if (ride == nullptr || input == nullptr || input->element == nullptr || input->element->GetType() != TileElementType::Track) - return 0; + if (input.element == nullptr || input.element->GetType() != TileElementType::Track) + return false; - const auto& rtd = ride->GetRideTypeDescriptor(); + const auto& rtd = GetRideTypeDescriptor(); if (rtd.HasFlag(RIDE_TYPE_FLAG_IS_MAZE)) - return 0; + return false; rct_window* w = window_find_by_class(WindowClass::RideConstruction); - if (w != nullptr && _rideConstructionState != RideConstructionState::State0 && _currentRideIndex == ride->id) + if (w != nullptr && _rideConstructionState != RideConstructionState::State0 && _currentRideIndex == id) { ride_construction_invalidate_current_track(); } bool moveSlowIt = true; track_circuit_iterator it = {}; - track_circuit_iterator_begin(&it, *input); + track_circuit_iterator_begin(&it, input); track_circuit_iterator slowIt = it; while (track_circuit_iterator_next(&it)) { if (!track_is_connected_by_shape(it.last.element, it.current.element)) { *output = it.current; - return 1; + return true; } // #2081: prevent an infinite loop moveSlowIt = !moveSlowIt; @@ -766,17 +766,17 @@ int32_t ride_find_track_gap(const Ride* ride, CoordsXYE* input, CoordsXYE* outpu if (track_circuit_iterators_match(&it, &slowIt)) { *output = it.current; - return 1; + return true; } } } if (!it.looped) { *output = it.last; - return 1; + return true; } - return 0; + return false; } void Ride::FormatStatusTo(Formatter& ft) const @@ -3824,7 +3824,7 @@ void Ride::ConstructMissingEntranceOrExit() const CoordsXYE trackElement; ride_try_get_origin_element(this, &trackElement); - ride_find_track_gap(this, &trackElement, &trackElement); + FindTrackGap(trackElement, &trackElement); int32_t ok = ride_modify(trackElement); if (ok == 0) { @@ -3930,8 +3930,7 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) if (mode == RideMode::ContinuousCircuit || IsBlockSectioned()) { - if (ride_find_track_gap(this, &trackElement, &problematicTrackElement) - && (newStatus != RideStatus::Simulating || IsBlockSectioned())) + if (FindTrackGap(trackElement, &problematicTrackElement) && (newStatus != RideStatus::Simulating || IsBlockSectioned())) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_TRACK_IS_NOT_A_COMPLETE_CIRCUIT }; @@ -3971,7 +3970,7 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) if (mode == RideMode::StationToStation) { - if (!ride_find_track_gap(this, &trackElement, &problematicTrackElement)) + if (!FindTrackGap(trackElement, &problematicTrackElement)) { return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; } @@ -4067,7 +4066,7 @@ ResultWithMessage Ride::Open(bool isApplying) if (mode == RideMode::Race || mode == RideMode::ContinuousCircuit || IsBlockSectioned()) { - if (ride_find_track_gap(this, &trackElement, &problematicTrackElement)) + if (FindTrackGap(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_TRACK_IS_NOT_A_COMPLETE_CIRCUIT }; @@ -4107,7 +4106,7 @@ ResultWithMessage Ride::Open(bool isApplying) if (mode == RideMode::StationToStation) { - if (!ride_find_track_gap(this, &trackElement, &problematicTrackElement)) + if (!FindTrackGap(trackElement, &problematicTrackElement)) { return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; } diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 439038e070..fdf4360c3a 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -397,6 +397,8 @@ public: bool HasRecolourableShopItems() const; bool HasStation() const; + + bool FindTrackGap(const CoordsXYE& input, CoordsXYE* output) const; }; void UpdateSpiralSlide(Ride& ride); void UpdateChairlift(Ride& ride); @@ -1009,7 +1011,6 @@ void ride_update_favourited_stat(); void ride_check_all_reachable(); bool ride_try_get_origin_element(const Ride* ride, CoordsXYE* output); -int32_t ride_find_track_gap(const Ride* ride, CoordsXYE* input, CoordsXYE* output); void ride_construct(Ride* ride); void ride_clear_blocked_tiles(Ride* ride); Staff* ride_get_mechanic(Ride* ride); diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index c2c7267c10..b9bb4099db 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -135,7 +135,7 @@ void ride_construct(Ride* ride) CoordsXYE trackElement; if (ride_try_get_origin_element(ride, &trackElement)) { - ride_find_track_gap(ride, &trackElement, &trackElement); + ride->FindTrackGap(trackElement, &trackElement); rct_window* w = window_get_main(); if (w != nullptr && ride_modify(trackElement)) @@ -1035,7 +1035,7 @@ bool ride_modify(const CoordsXYE& input) if (ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS)) { CoordsXYE endOfTrackElement{}; - if (ride_find_track_gap(ride, &tileElement, &endOfTrackElement)) + if (ride->FindTrackGap(tileElement, &endOfTrackElement)) tileElement = endOfTrackElement; } From 7f34d626f91453da3b085a5644ad27eafe998cdb Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 17:07:26 +0100 Subject: [PATCH 2/8] Remove leftover symbol ride_remove_vehicles() --- src/openrct2/ride/Ride.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index fdf4360c3a..655e8e3751 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -1101,6 +1101,5 @@ void ride_clear_leftover_entrances(Ride* ride); std::vector GetTracklessRides(); -void ride_remove_vehicles(Ride* ride); void CircusMusicUpdate(Ride* ride); void DefaultMusicUpdate(Ride* ride); From d0ae004b8f6d7daa184a51d8eecf9f23abcb2ba8 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 17:08:02 +0100 Subject: [PATCH 3/8] Remove unused symbol ride_reset_all_names() --- src/openrct2/ride/Ride.cpp | 8 -------- src/openrct2/ride/Ride.h | 2 -- 2 files changed, 10 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 8457582940..1a54e61af8 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -5322,14 +5322,6 @@ void Ride::Crash(uint8_t vehicleIndex) } } -void ride_reset_all_names() -{ - for (auto& ride : GetRideManager()) - { - ride.SetNameToDefault(); - } -} - // Gets the approximate value of customers per hour for this ride. Multiplies ride_customers_in_last_5_minutes() by 12. uint32_t ride_customers_per_hour(const Ride* ride) { diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 655e8e3751..b6a5819fda 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -1076,8 +1076,6 @@ money32 set_operating_setting_nested(RideId rideId, RideSetSetting setting, uint void UpdateGhostTrackAndArrow(); -void ride_reset_all_names(); - uint32_t ride_customers_per_hour(const Ride* ride); uint32_t ride_customers_in_last_5_minutes(const Ride* ride); From a4f7ca4682c41c044765d183fcc2d54fd3876726 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 17:16:34 +0100 Subject: [PATCH 4/8] Refactor ride_construct() to RideConstructionStart() --- src/openrct2-ui/interface/ViewportInteraction.cpp | 2 +- src/openrct2-ui/ride/Construction.cpp | 3 ++- src/openrct2-ui/windows/Ride.cpp | 2 +- src/openrct2/ride/Ride.h | 1 - src/openrct2/ride/RideConstruction.cpp | 8 ++++---- src/openrct2/ride/RideConstruction.h | 2 ++ 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index e0683f44ae..19d2272f91 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -559,7 +559,7 @@ bool ViewportInteractionRightClick(const ScreenCoordsXY& screenCoords) auto ride = get_ride(vehicle->ride); if (ride != nullptr) { - ride_construct(ride); + RideConstructionStart(*ride); } } } diff --git a/src/openrct2-ui/ride/Construction.cpp b/src/openrct2-ui/ride/Construction.cpp index 2de17ef496..dcd5e74052 100644 --- a/src/openrct2-ui/ride/Construction.cpp +++ b/src/openrct2-ui/ride/Construction.cpp @@ -11,6 +11,7 @@ #include #include +#include #include /** @@ -30,7 +31,7 @@ void ride_construct_new(RideSelection listItem) return; const auto rideIndex = result->GetData(); auto ride = get_ride(rideIndex); - ride_construct(ride); + RideConstructionStart(*ride); }); GameActions::Execute(&gameAction); diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 35fd148cdf..cf969e6e2a 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1639,7 +1639,7 @@ static void WindowRideMainMouseup(rct_window* w, WidgetIndex widgetIndex) auto ride = get_ride(w->rideId); if (ride != nullptr) { - ride_construct(ride); + RideConstructionStart(*ride); if (window_find_by_number(WindowClass::RideConstruction, ride->id.ToUnderlying()) != nullptr) { window_close(*w); diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index b6a5819fda..bb8441dd53 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -1011,7 +1011,6 @@ void ride_update_favourited_stat(); void ride_check_all_reachable(); bool ride_try_get_origin_element(const Ride* ride, CoordsXYE* output); -void ride_construct(Ride* ride); void ride_clear_blocked_tiles(Ride* ride); Staff* ride_get_mechanic(Ride* ride); Staff* ride_get_assigned_mechanic(Ride* ride); diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index b9bb4099db..e227efe599 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -130,12 +130,12 @@ static rct_window* ride_create_or_find_construction_window(RideId rideIndex) * * rct2: 0x006B4857 */ -void ride_construct(Ride* ride) +void RideConstructionStart(Ride& ride) { CoordsXYE trackElement; - if (ride_try_get_origin_element(ride, &trackElement)) + if (ride_try_get_origin_element(&ride, &trackElement)) { - ride->FindTrackGap(trackElement, &trackElement); + ride.FindTrackGap(trackElement, &trackElement); rct_window* w = window_get_main(); if (w != nullptr && ride_modify(trackElement)) @@ -143,7 +143,7 @@ void ride_construct(Ride* ride) } else { - ride_initialise_construction_window(ride); + ride_initialise_construction_window(&ride); } } diff --git a/src/openrct2/ride/RideConstruction.h b/src/openrct2/ride/RideConstruction.h index 731616754e..0802aa45f9 100644 --- a/src/openrct2/ride/RideConstruction.h +++ b/src/openrct2/ride/RideConstruction.h @@ -92,3 +92,5 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC bool ride_select_backwards_from_front(); bool ride_select_forwards_from_back(); + +void RideConstructionStart(Ride& ride); From 4923847f39f90957ea9046f0fd36a278e0e1cf62 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 17:34:00 +0100 Subject: [PATCH 5/8] Refactor ride track checking code to use constrefs --- src/openrct2/ride/Ride.cpp | 46 ++++++++++++++++++------------------- src/openrct2/ride/Track.cpp | 8 +++---- src/openrct2/ride/Track.h | 4 ++-- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 1a54e61af8..5e4a5a378c 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -2721,12 +2721,12 @@ static ResultWithMessage RideCheckBlockBrakes(const CoordsXYE& input, CoordsXYE* * @returns true if an inversion track piece is found, otherwise false. * rct2: 0x006CB149 */ -static bool ride_check_track_contains_inversions(CoordsXYE* input, CoordsXYE* output) +static bool ride_check_track_contains_inversions(const CoordsXYE& input, CoordsXYE* output) { - if (input->element == nullptr) + if (input.element == nullptr) return false; - const auto* trackElement = input->element->AsTrack(); + const auto* trackElement = input.element->AsTrack(); if (trackElement == nullptr) return false; @@ -2747,7 +2747,7 @@ static bool ride_check_track_contains_inversions(CoordsXYE* input, CoordsXYE* ou bool moveSlowIt = true; track_circuit_iterator it, slowIt; - track_circuit_iterator_begin(&it, *input); + track_circuit_iterator_begin(&it, input); slowIt = it; while (track_circuit_iterator_next(&it)) @@ -2781,12 +2781,12 @@ static bool ride_check_track_contains_inversions(CoordsXYE* input, CoordsXYE* ou * @returns true if a banked track piece is found, otherwise false. * rct2: 0x006CB1D3 */ -static bool ride_check_track_contains_banked(CoordsXYE* input, CoordsXYE* output) +static bool ride_check_track_contains_banked(const CoordsXYE& input, CoordsXYE* output) { - if (input->element == nullptr) + if (input.element == nullptr) return false; - const auto* trackElement = input->element->AsTrack(); + const auto* trackElement = input.element->AsTrack(); if (trackElement == nullptr) return false; @@ -2807,7 +2807,7 @@ static bool ride_check_track_contains_banked(CoordsXYE* input, CoordsXYE* output bool moveSlowIt = true; track_circuit_iterator it, slowIt; - track_circuit_iterator_begin(&it, *input); + track_circuit_iterator_begin(&it, input); slowIt = it; while (track_circuit_iterator_next(&it)) @@ -2838,18 +2838,18 @@ static bool ride_check_track_contains_banked(CoordsXYE* input, CoordsXYE* output * * rct2: 0x006CB25D */ -static int32_t ride_check_station_length(CoordsXYE* input, CoordsXYE* output) +static int32_t ride_check_station_length(const CoordsXYE& input, CoordsXYE* output) { rct_window* w = window_find_by_class(WindowClass::RideConstruction); if (w != nullptr && _rideConstructionState != RideConstructionState::State0 - && _currentRideIndex == input->element->AsTrack()->GetRideIndex()) + && _currentRideIndex == input.element->AsTrack()->GetRideIndex()) { ride_construction_invalidate_current_track(); } - output->x = input->x; - output->y = input->y; - output->element = input->element; + output->x = input.x; + output->y = input.y; + output->element = input.element; track_begin_end trackBeginEnd; while (track_block_get_previous(*output, &trackBeginEnd)) { @@ -2893,11 +2893,11 @@ static int32_t ride_check_station_length(CoordsXYE* input, CoordsXYE* output) * * rct2: 0x006CB2DA */ -static bool ride_check_start_and_end_is_station(CoordsXYE* input) +static bool ride_check_start_and_end_is_station(const CoordsXYE& input) { CoordsXYE trackBack, trackFront; - RideId rideIndex = input->element->AsTrack()->GetRideIndex(); + RideId rideIndex = input.element->AsTrack()->GetRideIndex(); auto ride = get_ride(rideIndex); if (ride == nullptr) return false; @@ -3952,7 +3952,7 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) rct_ride_entry* rideType = get_ride_entry(subtype); if (rideType->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) { - if (ride_check_track_contains_inversions(&trackElement, &problematicTrackElement)) + if (ride_check_track_contains_inversions(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; @@ -3960,7 +3960,7 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) } if (rideType->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) { - if (ride_check_track_contains_banked(&trackElement, &problematicTrackElement)) + if (ride_check_track_contains_banked(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; @@ -3975,13 +3975,13 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; } - if (!ride_check_station_length(&trackElement, &problematicTrackElement)) + if (!ride_check_station_length(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_STATION_NOT_LONG_ENOUGH }; } - if (!ride_check_start_and_end_is_station(&trackElement)) + if (!ride_check_start_and_end_is_station(trackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; @@ -4088,7 +4088,7 @@ ResultWithMessage Ride::Open(bool isApplying) rct_ride_entry* rideEntry = get_ride_entry(subtype); if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) { - if (ride_check_track_contains_inversions(&trackElement, &problematicTrackElement)) + if (ride_check_track_contains_inversions(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; @@ -4096,7 +4096,7 @@ ResultWithMessage Ride::Open(bool isApplying) } if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) { - if (ride_check_track_contains_banked(&trackElement, &problematicTrackElement)) + if (ride_check_track_contains_banked(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; @@ -4111,13 +4111,13 @@ ResultWithMessage Ride::Open(bool isApplying) return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; } - if (!ride_check_station_length(&trackElement, &problematicTrackElement)) + if (!ride_check_station_length(trackElement, &problematicTrackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_STATION_NOT_LONG_ENOUGH }; } - if (!ride_check_start_and_end_is_station(&trackElement)) + if (!ride_check_start_and_end_is_station(trackElement)) { ride_scroll_to_track_error(problematicTrackElement); return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index 2f2bcb1d05..9269b56855 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -482,13 +482,13 @@ bool track_circuit_iterators_match(const track_circuit_iterator* firstIt, const && firstIt->current.x == secondIt->current.x && firstIt->current.y == secondIt->current.y); } -void track_get_back(CoordsXYE* input, CoordsXYE* output) +void track_get_back(const CoordsXYE& input, CoordsXYE* output) { CoordsXYE lastTrack; track_begin_end currentTrack; bool result; - lastTrack = *input; + lastTrack = input; do { result = track_block_get_previous(lastTrack, ¤tTrack); @@ -502,13 +502,13 @@ void track_get_back(CoordsXYE* input, CoordsXYE* output) *output = lastTrack; } -void track_get_front(CoordsXYE* input, CoordsXYE* output) +void track_get_front(const CoordsXYE& input, CoordsXYE* output) { CoordsXYE lastTrack, currentTrack; int32_t z, direction; bool result; - lastTrack = *input; + lastTrack = input; do { result = track_block_get_next(&lastTrack, ¤tTrack, &z, &direction); diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index c8fd0f4e6b..c9b98449ae 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -619,8 +619,8 @@ bool track_circuit_iterator_previous(track_circuit_iterator* it); bool track_circuit_iterator_next(track_circuit_iterator* it); bool track_circuit_iterators_match(const track_circuit_iterator* firstIt, const track_circuit_iterator* secondIt); -void track_get_back(CoordsXYE* input, CoordsXYE* output); -void track_get_front(CoordsXYE* input, CoordsXYE* output); +void track_get_back(const CoordsXYE& input, CoordsXYE* output); +void track_get_front(const CoordsXYE& input, CoordsXYE* output); bool track_element_is_covered(track_type_t trackElementType); bool track_type_is_station(track_type_t trackType); From 89ed11666450829653501aa8344298f0f24207cb Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 17:38:33 +0100 Subject: [PATCH 6/8] Create Ride::ChangeStatusCheckTrackValidity() to reduce codedup Co-authored-by: spacek531 --- src/openrct2/ride/Ride.cpp | 160 +++++++++++++++---------------------- src/openrct2/ride/Ride.h | 2 + 2 files changed, 66 insertions(+), 96 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 5e4a5a378c..e7db272b5a 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -3937,55 +3937,10 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) } } - if (IsBlockSectioned()) + auto message = ChangeStatusCheckTrackValidity(trackElement); + if (!message.Successful) { - auto blockBrakeCheck = RideCheckBlockBrakes(trackElement, &problematicTrackElement); - if (!blockBrakeCheck.Successful) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, blockBrakeCheck.Message }; - } - } - - if (subtype != OBJECT_ENTRY_INDEX_NULL && !gCheatsEnableAllDrawableTrackPieces) - { - rct_ride_entry* rideType = get_ride_entry(subtype); - if (rideType->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) - { - if (ride_check_track_contains_inversions(trackElement, &problematicTrackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; - } - } - if (rideType->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) - { - if (ride_check_track_contains_banked(trackElement, &problematicTrackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; - } - } - } - - if (mode == RideMode::StationToStation) - { - if (!FindTrackGap(trackElement, &problematicTrackElement)) - { - return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; - } - - if (!ride_check_station_length(trackElement, &problematicTrackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_STATION_NOT_LONG_ENOUGH }; - } - - if (!ride_check_start_and_end_is_station(trackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; - } + return message; } if (isApplying) @@ -4073,55 +4028,10 @@ ResultWithMessage Ride::Open(bool isApplying) } } - if (IsBlockSectioned()) + auto message = ChangeStatusCheckTrackValidity(trackElement); + if (!message.Successful) { - auto blockBrakeCheck = RideCheckBlockBrakes(trackElement, &problematicTrackElement); - if (!blockBrakeCheck.Successful) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, blockBrakeCheck.Message }; - } - } - - if (subtype != OBJECT_ENTRY_INDEX_NULL && !gCheatsEnableAllDrawableTrackPieces) - { - rct_ride_entry* rideEntry = get_ride_entry(subtype); - if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) - { - if (ride_check_track_contains_inversions(trackElement, &problematicTrackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; - } - } - if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) - { - if (ride_check_track_contains_banked(trackElement, &problematicTrackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; - } - } - } - - if (mode == RideMode::StationToStation) - { - if (!FindTrackGap(trackElement, &problematicTrackElement)) - { - return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; - } - - if (!ride_check_station_length(trackElement, &problematicTrackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_STATION_NOT_LONG_ENOUGH }; - } - - if (!ride_check_start_and_end_is_station(trackElement)) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; - } + return message; } if (isApplying) @@ -5926,3 +5836,61 @@ std::vector GetTracklessRides() } return result; } + +ResultWithMessage Ride::ChangeStatusCheckTrackValidity(const CoordsXYE& trackElement) +{ + CoordsXYE problematicTrackElement = {}; + + if (IsBlockSectioned()) + { + auto blockBrakeCheck = RideCheckBlockBrakes(trackElement, &problematicTrackElement); + if (!blockBrakeCheck.Successful) + { + ride_scroll_to_track_error(problematicTrackElement); + return { false, blockBrakeCheck.Message }; + } + } + + if (subtype != OBJECT_ENTRY_INDEX_NULL && !gCheatsEnableAllDrawableTrackPieces) + { + rct_ride_entry* rideEntry = get_ride_entry(subtype); + if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) + { + if (ride_check_track_contains_inversions(trackElement, &problematicTrackElement)) + { + ride_scroll_to_track_error(problematicTrackElement); + return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; + } + } + if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) + { + if (ride_check_track_contains_banked(trackElement, &problematicTrackElement)) + { + ride_scroll_to_track_error(problematicTrackElement); + return { false, STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN }; + } + } + } + + if (mode == RideMode::StationToStation) + { + if (!FindTrackGap(trackElement, &problematicTrackElement)) + { + return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; + } + + if (!ride_check_station_length(trackElement, &problematicTrackElement)) + { + ride_scroll_to_track_error(problematicTrackElement); + return { false, STR_STATION_NOT_LONG_ENOUGH }; + } + + if (!ride_check_start_and_end_is_station(trackElement)) + { + ride_scroll_to_track_error(problematicTrackElement); + return { false, STR_RIDE_MUST_START_AND_END_WITH_STATIONS }; + } + } + + return { true }; +} diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index bb8441dd53..1090ec952f 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -309,6 +309,8 @@ private: void ChainQueues() const; void ConstructMissingEntranceOrExit() const; + ResultWithMessage ChangeStatusCheckTrackValidity(const CoordsXYE& trackElement); + public: bool CanBreakDown() const; RideClassification GetClassification() const; From e91d22b2037ca9d1adae4b2df838fcb491cec801 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 17:52:49 +0100 Subject: [PATCH 7/8] Use constrefs in a few extra ride functions --- src/openrct2/ride/Ride.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index e7db272b5a..56d2dfd091 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -2936,10 +2936,10 @@ static bool ride_check_start_and_end_is_station(const CoordsXYE& input) * station or the last track piece from the end of the direction. * rct2: 0x006B4D39 */ -static void ride_set_boat_hire_return_point(Ride* ride, CoordsXYE* startElement) +static void ride_set_boat_hire_return_point(Ride& ride, const CoordsXYE& startElement) { int32_t trackType = -1; - auto returnPos = *startElement; + auto returnPos = startElement; int32_t startX = returnPos.x; int32_t startY = returnPos.y; track_begin_end trackBeginEnd; @@ -2961,22 +2961,22 @@ static void ride_set_boat_hire_return_point(Ride* ride, CoordsXYE* startElement) trackType = returnPos.element->AsTrack()->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); int32_t elementReturnDirection = ted.Coordinates.rotation_begin; - ride->boat_hire_return_direction = returnPos.element->GetDirectionWithOffset(elementReturnDirection); - ride->boat_hire_return_position = TileCoordsXY{ returnPos }; + ride.boat_hire_return_direction = returnPos.element->GetDirectionWithOffset(elementReturnDirection); + ride.boat_hire_return_position = TileCoordsXY{ returnPos }; } /** * * rct2: 0x006B4D39 */ -static void ride_set_maze_entrance_exit_points(Ride* ride) +static void ride_set_maze_entrance_exit_points(Ride& ride) { // Needs room for an entrance and an exit per station, plus one position for the list terminator. TileCoordsXYZD positions[(OpenRCT2::Limits::MaxStationsPerRide * 2) + 1]; // Create a list of all the entrance and exit positions TileCoordsXYZD* position = positions; - for (const auto& station : ride->GetStations()) + for (const auto& station : ride.GetStations()) { if (!station.Entrance.IsNull()) { @@ -3018,9 +3018,9 @@ static void ride_set_maze_entrance_exit_points(Ride* ride) * Opens all block brakes of a ride. * rct2: 0x006B4E6B */ -static void RideOpenBlockBrakes(CoordsXYE* startElement) +static void RideOpenBlockBrakes(const CoordsXYE& startElement) { - CoordsXYE currentElement = *startElement; + CoordsXYE currentElement = startElement; do { auto trackType = currentElement.element->AsTrack()->GetTrackType(); @@ -3037,14 +3037,14 @@ static void RideOpenBlockBrakes(CoordsXYE* startElement) break; } } while (track_block_get_next(¤tElement, ¤tElement, nullptr, nullptr) - && currentElement.element != startElement->element); + && currentElement.element != startElement.element); } /** * * rct2: 0x006B4D26 */ -static void ride_set_start_finish_points(RideId rideIndex, CoordsXYE* startElement) +static void ride_set_start_finish_points(RideId rideIndex, const CoordsXYE& startElement) { auto ride = get_ride(rideIndex); if (ride == nullptr) @@ -3052,9 +3052,9 @@ static void ride_set_start_finish_points(RideId rideIndex, CoordsXYE* startEleme const auto& rtd = ride->GetRideTypeDescriptor(); if (rtd.HasFlag(RIDE_TYPE_FLAG_IS_MAZE)) - ride_set_maze_entrance_exit_points(ride); + ride_set_maze_entrance_exit_points(*ride); else if (ride->type == RIDE_TYPE_BOAT_HIRE) - ride_set_boat_hire_return_point(ride, startElement); + ride_set_boat_hire_return_point(*ride, startElement); if (ride->IsBlockSectioned() && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { @@ -3944,7 +3944,7 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) } if (isApplying) - ride_set_start_finish_points(id, &trackElement); + ride_set_start_finish_points(id, trackElement); const auto& rtd = GetRideTypeDescriptor(); if (!rtd.HasFlag(RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) @@ -4035,7 +4035,7 @@ ResultWithMessage Ride::Open(bool isApplying) } if (isApplying) - ride_set_start_finish_points(id, &trackElement); + ride_set_start_finish_points(id, trackElement); if (!GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { From 3329da538bea92b9d441782fb7c508bf1c044509 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 17 Dec 2022 18:01:31 +0100 Subject: [PATCH 8/8] Create Ride::ChangeStatusCreateVehicles() to reduce codedup Co-authored-by: spacek531 --- src/openrct2/ride/Ride.cpp | 71 +++++++++++++++----------------------- src/openrct2/ride/Ride.h | 1 + 2 files changed, 29 insertions(+), 43 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 56d2dfd091..a3c1bfb978 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -3943,28 +3943,7 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) return message; } - if (isApplying) - ride_set_start_finish_points(id, trackElement); - - const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) - { - const auto createVehicleResult = CreateVehicles(trackElement, isApplying); - if (!createVehicleResult.Successful) - { - return { false, createVehicleResult.Message }; - } - } - - if (rtd.HasFlag(RIDE_TYPE_FLAG_ALLOW_CABLE_LIFT_HILL) && (lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED) - && !(lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT)) - { - const auto createCableLiftResult = ride_create_cable_lift(id, isApplying); - if (!createCableLiftResult.Successful) - return { false, createCableLiftResult.Message }; - } - - return { true }; + return ChangeStatusCreateVehicles(isApplying, trackElement); } /** * @@ -4034,27 +4013,7 @@ ResultWithMessage Ride::Open(bool isApplying) return message; } - if (isApplying) - ride_set_start_finish_points(id, trackElement); - - if (!GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) - { - const auto createVehicleResult = CreateVehicles(trackElement, isApplying); - if (!createVehicleResult.Successful) - { - return { false, createVehicleResult.Message }; - } - } - - if ((GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_ALLOW_CABLE_LIFT_HILL)) - && (lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED) && !(lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT)) - { - const auto createCableLiftResult = ride_create_cable_lift(id, isApplying); - if (!createCableLiftResult.Successful) - return { false, createCableLiftResult.Message }; - } - - return { true }; + return ChangeStatusCreateVehicles(isApplying, trackElement); } /** @@ -5894,3 +5853,29 @@ ResultWithMessage Ride::ChangeStatusCheckTrackValidity(const CoordsXYE& trackEle return { true }; } + +ResultWithMessage Ride::ChangeStatusCreateVehicles(bool isApplying, const CoordsXYE& trackElement) +{ + if (isApplying) + ride_set_start_finish_points(id, trackElement); + + const auto& rtd = GetRideTypeDescriptor(); + if (!rtd.HasFlag(RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) + { + const auto createVehicleResult = CreateVehicles(trackElement, isApplying); + if (!createVehicleResult.Successful) + { + return { false, createVehicleResult.Message }; + } + } + + if (rtd.HasFlag(RIDE_TYPE_FLAG_ALLOW_CABLE_LIFT_HILL) && (lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED) + && !(lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT)) + { + const auto createCableLiftResult = ride_create_cable_lift(id, isApplying); + if (!createCableLiftResult.Successful) + return { false, createCableLiftResult.Message }; + } + + return { true }; +} diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 1090ec952f..a607a21793 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -310,6 +310,7 @@ private: void ConstructMissingEntranceOrExit() const; ResultWithMessage ChangeStatusCheckTrackValidity(const CoordsXYE& trackElement); + ResultWithMessage ChangeStatusCreateVehicles(bool isApplying, const CoordsXYE& trackElement); public: bool CanBreakDown() const;