diff --git a/src/openrct2-ui/windows/MazeConstruction.cpp b/src/openrct2-ui/windows/MazeConstruction.cpp index a4af05dbba..316ed3e7cb 100644 --- a/src/openrct2-ui/windows/MazeConstruction.cpp +++ b/src/openrct2-ui/windows/MazeConstruction.cpp @@ -291,7 +291,7 @@ static void window_maze_construction_mousedown(rct_window* w, rct_widgetindex wi */ static void window_maze_construction_update(rct_window* w) { - Ride* ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); if (ride == nullptr || ride->status != RIDE_STATUS_CLOSED) { window_close(w); diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 6f8fac53ea..16992ab5a6 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1418,7 +1418,9 @@ static void window_ride_draw_tab_images(rct_drawpixelinfo* dpi, rct_window* w) static void window_ride_disable_tabs(rct_window* w) { uint32_t disabled_tabs = 0; - Ride* ride = get_ride(w->number & 0xFF); + auto ride = get_ride(w->number & 0xFF); + if (ride == nullptr) + return; uint8_t ride_type = ride->type; // ecx @@ -1851,7 +1853,10 @@ static void window_ride_init_viewport(rct_window* w) if (w->page != WINDOW_RIDE_PAGE_MAIN) return; - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + int32_t eax = w->viewport_focus_coordinates.var_480 - 1; union @@ -3602,7 +3607,6 @@ static void window_ride_operating_update(rct_window* w) static void window_ride_operating_invalidate(rct_window* w) { rct_widget* widgets; - Ride* ride; rct_string_id format, caption, tooltip; widgets = window_ride_page_widgets[w->page]; @@ -3614,7 +3618,9 @@ static void window_ride_operating_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; ride->FormatNameTo(gCommonFormatArgs); @@ -3865,13 +3871,12 @@ static void window_ride_operating_paint(rct_window* w, rct_drawpixelinfo* dpi) */ static void window_ride_locate_mechanic(rct_window* w) { - Ride* ride; - Peep* mechanic; - - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; // First check if there is a mechanic assigned - mechanic = ride_get_assigned_mechanic(ride); + Peep* mechanic = ride_get_assigned_mechanic(ride); // Otherwise find the closest mechanic if (mechanic == nullptr) @@ -4732,13 +4737,10 @@ static void window_ride_colour_tooldrag(rct_window* w, rct_widgetindex widgetInd */ static void window_ride_colour_invalidate(rct_window* w) { - rct_widget* widgets; - rct_ride_entry* rideEntry; - Ride* ride; TrackColour trackColour; vehicle_colour vehicleColour; - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -4747,8 +4749,13 @@ static void window_ride_colour_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - ride = get_ride(w->number); - rideEntry = ride->GetRideEntry(); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; w->widgets[WIDX_TITLE].text = STR_ARG_16_STRINGID; ride->FormatNameTo(gCommonFormatArgs + 16); @@ -5655,7 +5662,10 @@ static void window_ride_measurements_paint(rct_window* w, rct_drawpixelinfo* dpi } else { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + int32_t x = w->x + window_ride_measurements_widgets[WIDX_PAGE_BACKGROUND].left + 4; int32_t y = w->y + window_ride_measurements_widgets[WIDX_PAGE_BACKGROUND].top + 4; @@ -6895,7 +6905,6 @@ static void window_ride_customer_invalidate(rct_window* w) */ static void window_ride_customer_paint(rct_window* w, rct_drawpixelinfo* dpi) { - Ride* ride; int32_t x, y; uint8_t shopItem; int16_t popularity, satisfaction, queueTime, age; @@ -6905,7 +6914,10 @@ static void window_ride_customer_paint(rct_window* w, rct_drawpixelinfo* dpi) window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + x = w->x + window_ride_customer_widgets[WIDX_PAGE_BACKGROUND].left + 4; y = w->y + window_ride_customer_widgets[WIDX_PAGE_BACKGROUND].top + 4; diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 888db0fd6f..713e718b7a 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -703,7 +703,10 @@ static void window_ride_construction_resize(rct_window* w) w->enabled_widgets |= (1 << WIDX_CONSTRUCT); } - Ride* ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; + int32_t rideType = ride_get_alternative_type(ride); uint64_t disabledWidgets = 0; @@ -1246,7 +1249,9 @@ static void window_ride_construction_resize(rct_window* w) */ static void window_ride_construction_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - Ride* ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; window_ride_construction_update_enabled_track_pieces(); switch (widgetIndex) @@ -2673,7 +2678,6 @@ void sub_6C94D8() */ static void window_ride_construction_update_map_selection() { - Ride* ride; int32_t trackType, trackDirection, x, y; map_invalidate_map_selection_tiles(); @@ -2705,9 +2709,12 @@ static void window_ride_construction_update_map_selection() break; } - ride = get_ride(_currentRideIndex); - window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); - map_invalidate_map_selection_tiles(); + auto ride = get_ride(_currentRideIndex); + if (ride != nullptr) + { + window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); + map_invalidate_map_selection_tiles(); + } } /** @@ -2716,11 +2723,12 @@ static void window_ride_construction_update_map_selection() */ static void window_ride_construction_update_possible_ride_configurations() { - Ride* ride; int32_t trackType; int32_t edi; - ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; _currentlyShowingBrakeOrBoosterSpeed = false; if (_currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE) @@ -2818,8 +2826,10 @@ static void window_ride_construction_update_possible_ride_configurations() */ static void window_ride_construction_update_widgets(rct_window* w) { - ride_id_t rideIndex = _currentRideIndex; - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; + int32_t rideType = ride_get_alternative_type(ride); w->hold_down_widgets = 0; @@ -3464,7 +3474,6 @@ static void ride_construction_set_brakes_speed(int32_t brakesSpeed) void ride_construction_toolupdate_construct(int32_t screenX, int32_t screenY) { int32_t x, y, z; - Ride* ride; const rct_preview_track* trackBlock; map_invalidate_map_selection_tiles(); @@ -3502,7 +3511,9 @@ void ride_construction_toolupdate_construct(int32_t screenX, int32_t screenY) return; } _currentTrackPieceType = trackType; - ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; // Re-using this other code, very slight difference from original // - Original code checks for MSB mask instead of 255 on trackPart->var_00 diff --git a/src/openrct2/actions/LandSetHeightAction.hpp b/src/openrct2/actions/LandSetHeightAction.hpp index be3a099da1..4ccc374f71 100644 --- a/src/openrct2/actions/LandSetHeightAction.hpp +++ b/src/openrct2/actions/LandSetHeightAction.hpp @@ -257,7 +257,7 @@ private: if (tileElement->GetType() == TILE_ELEMENT_TYPE_TRACK) { ride_id_t rideIndex = tileElement->AsTrack()->GetRideIndex(); - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); if (ride != nullptr) { rct_ride_entry* rideEntry = ride->GetRideEntry(); diff --git a/src/openrct2/actions/MazeSetTrackAction.hpp b/src/openrct2/actions/MazeSetTrackAction.hpp index 0a20b6cf27..7a12b7e38a 100644 --- a/src/openrct2/actions/MazeSetTrackAction.hpp +++ b/src/openrct2/actions/MazeSetTrackAction.hpp @@ -154,7 +154,7 @@ public: return res; } - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr || ride->type == RIDE_CRASH_TYPE_NONE) { res->Error = GA_ERROR::NO_CLEARANCE; diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.hpp b/src/openrct2/actions/RideEntranceExitPlaceAction.hpp index 7d37a0a129..7dbe2c6d05 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.hpp +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.hpp @@ -60,7 +60,7 @@ public: return MakeResult(GA_ERROR::NO_FREE_ELEMENTS, errorTitle); } - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid game command for ride %d", (int32_t)_rideIndex); @@ -140,7 +140,7 @@ public: // When in known station num mode rideIndex is known and z is unknown auto errorTitle = _isExit ? STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION : STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION; - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid game command for ride %d", (int32_t)_rideIndex); diff --git a/src/openrct2/actions/RideEntranceExitRemoveAction.hpp b/src/openrct2/actions/RideEntranceExitRemoveAction.hpp index 44cf69d825..baee24f922 100644 --- a/src/openrct2/actions/RideEntranceExitRemoveAction.hpp +++ b/src/openrct2/actions/RideEntranceExitRemoveAction.hpp @@ -110,7 +110,7 @@ public: GameActionResult::Ptr Execute() const override { - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid ride id %d for entrance/exit removal", (int32_t)_rideIndex); diff --git a/src/openrct2/actions/RideSetAppearanceAction.hpp b/src/openrct2/actions/RideSetAppearanceAction.hpp index bda3232938..4d5edadde8 100644 --- a/src/openrct2/actions/RideSetAppearanceAction.hpp +++ b/src/openrct2/actions/RideSetAppearanceAction.hpp @@ -108,7 +108,7 @@ public: GameActionResult::Ptr Execute() const override { - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid game command, ride_id = %u", uint32_t(_rideIndex)); diff --git a/src/openrct2/actions/RideSetPriceAction.hpp b/src/openrct2/actions/RideSetPriceAction.hpp index 5f5ed9cd25..0a239bbdfe 100644 --- a/src/openrct2/actions/RideSetPriceAction.hpp +++ b/src/openrct2/actions/RideSetPriceAction.hpp @@ -79,7 +79,7 @@ public: GameActionResult::Ptr res = std::make_unique(); res->ExpenditureType = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS; - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid game command, ride_id = %u", uint32_t(_rideIndex)); diff --git a/src/openrct2/actions/RideSetSetting.hpp b/src/openrct2/actions/RideSetSetting.hpp index 725cf3e82e..bd514bbeb2 100644 --- a/src/openrct2/actions/RideSetSetting.hpp +++ b/src/openrct2/actions/RideSetSetting.hpp @@ -165,7 +165,7 @@ public: GameActionResult::Ptr Execute() const override { - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid ride: #%d.", (int32_t)_rideIndex); diff --git a/src/openrct2/actions/RideSetVehiclesAction.hpp b/src/openrct2/actions/RideSetVehiclesAction.hpp index 04120166a7..f53f700a74 100644 --- a/src/openrct2/actions/RideSetVehiclesAction.hpp +++ b/src/openrct2/actions/RideSetVehiclesAction.hpp @@ -131,7 +131,7 @@ public: GameActionResult::Ptr Execute() const override { auto errTitle = SetVehicleTypeErrorTitle[_type]; - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid game command, ride_id = %u", uint32_t(_rideIndex)); diff --git a/src/openrct2/actions/TrackPlaceAction.hpp b/src/openrct2/actions/TrackPlaceAction.hpp index bce9e895b8..5f18761fdd 100644 --- a/src/openrct2/actions/TrackPlaceAction.hpp +++ b/src/openrct2/actions/TrackPlaceAction.hpp @@ -87,7 +87,7 @@ public: GameActionResult::Ptr Query() const override { - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid ride for track placement, rideIndex = %d", (int32_t)_rideIndex); @@ -400,7 +400,7 @@ public: GameActionResult::Ptr Execute() const override { - Ride* ride = get_ride(_rideIndex); + auto ride = get_ride(_rideIndex); if (ride == nullptr) { log_warning("Invalid ride for track placement, rideIndex = %d", (int32_t)_rideIndex); diff --git a/src/openrct2/actions/TrackRemoveAction.hpp b/src/openrct2/actions/TrackRemoveAction.hpp index 5ad20a6b4b..f65bff9b85 100644 --- a/src/openrct2/actions/TrackRemoveAction.hpp +++ b/src/openrct2/actions/TrackRemoveAction.hpp @@ -126,7 +126,7 @@ public: ride_id_t rideIndex = tileElement->AsTrack()->GetRideIndex(); auto trackType = tileElement->AsTrack()->GetTrackType(); - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); if (ride == nullptr) { log_warning("Ride not found. ride index = %d.", rideIndex); @@ -322,7 +322,7 @@ public: auto trackType = tileElement->AsTrack()->GetTrackType(); bool isLiftHill = tileElement->AsTrack()->HasChain(); - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); if (ride == nullptr) { log_warning("Ride not found. ride index = %d.", rideIndex); diff --git a/src/openrct2/actions/WallPlaceAction.hpp b/src/openrct2/actions/WallPlaceAction.hpp index 888093cc15..9a610aea66 100644 --- a/src/openrct2/actions/WallPlaceAction.hpp +++ b/src/openrct2/actions/WallPlaceAction.hpp @@ -501,7 +501,7 @@ private: int32_t trackType = trackElement->GetTrackType(); int32_t sequence = trackElement->GetSequenceIndex(); int32_t direction = (_edge - trackElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; - Ride* ride = get_ride(trackElement->GetRideIndex()); + auto ride = get_ride(trackElement->GetRideIndex()); if (ride == nullptr) { return false; diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 6fc6dbbe7c..0371295ecc 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -208,7 +208,7 @@ static int32_t cc_rides(InteractiveConsole& console, const arguments_t& argv) } else { - Ride* ride = get_ride(ride_index); + auto ride = get_ride(ride_index); if (mode <= 0 || mode > (RIDE_MODE_COUNT - 1)) { console.WriteFormatLine("Invalid ride mode."); diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index 763033a37b..97929ec97c 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -791,13 +791,15 @@ void Guest::Tick128UpdateGuest(int32_t index) if (time_on_ride > 22) { - Ride* ride = get_ride(current_ride); + auto ride = get_ride(current_ride); + if (ride != nullptr) + { + PeepThoughtType thought_type = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE) + ? PEEP_THOUGHT_TYPE_GET_OUT + : PEEP_THOUGHT_TYPE_GET_OFF; - PeepThoughtType thought_type = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE) - ? PEEP_THOUGHT_TYPE_GET_OUT - : PEEP_THOUGHT_TYPE_GET_OFF; - - InsertNewThought(thought_type, current_ride); + InsertNewThought(thought_type, current_ride); + } } } } @@ -1755,7 +1757,9 @@ loc_69B221: */ void Guest::OnEnterRide(ride_id_t rideIndex) { - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; // Calculate how satisfying the ride is for the peep. Can range from -140 to +105. int16_t satisfaction = peep_calculate_ride_satisfaction(this, ride); @@ -2991,25 +2995,28 @@ static PeepThoughtType peep_assess_surroundings(int16_t centre_x, int16_t centre break; case TILE_ELEMENT_TYPE_TRACK: ride = get_ride(tileElement->AsTrack()->GetRideIndex()); - if (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC && ride->status != RIDE_STATUS_CLOSED - && !(ride->lifecycle_flags & (RIDE_LIFECYCLE_BROKEN_DOWN | RIDE_LIFECYCLE_CRASHED))) + if (ride != nullptr) { - if (ride->type == RIDE_TYPE_MERRY_GO_ROUND) + if (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC && ride->status != RIDE_STATUS_CLOSED + && !(ride->lifecycle_flags & (RIDE_LIFECYCLE_BROKEN_DOWN | RIDE_LIFECYCLE_CRASHED))) { - nearby_music |= 1; - break; - } + if (ride->type == RIDE_TYPE_MERRY_GO_ROUND) + { + nearby_music |= 1; + break; + } - if (ride->music == MUSIC_STYLE_ORGAN) - { - nearby_music |= 1; - break; - } + if (ride->music == MUSIC_STYLE_ORGAN) + { + nearby_music |= 1; + break; + } - if (ride->type == RIDE_TYPE_DODGEMS) - { - // Dodgems drown out music? - nearby_music |= 2; + if (ride->type == RIDE_TYPE_DODGEMS) + { + // Dodgems drown out music? + nearby_music |= 2; + } } } break; @@ -3956,7 +3963,9 @@ static void peep_update_ride_no_free_vehicle_rejoin_queue(Peep* peep, Ride* ride */ void Guest::UpdateRideFreeVehicleCheck() { - Ride* ride = get_ride(current_ride); + auto ride = get_ride(current_ride); + if (ride == nullptr) + return; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_VEHICLES)) { @@ -4127,7 +4136,9 @@ void Guest::UpdateRideEnterVehicle() */ void Guest::UpdateRideLeaveVehicle() { - Ride* ride = get_ride(current_ride); + auto ride = get_ride(current_ride); + if (ride == nullptr) + return; rct_vehicle* vehicle = GET_VEHICLE(ride->vehicles[current_train]); uint8_t ride_station = vehicle->current_station; @@ -4898,7 +4909,10 @@ void Guest::UpdateRideMazePathfinding() return; } - Ride* ride = get_ride(current_ride); + auto ride = get_ride(current_ride); + if (ride == nullptr) + return; + if (var_37 == 16) { peep_update_ride_prepare_for_exit(this); diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index e36029a68b..06239c4549 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -1232,7 +1232,7 @@ void peep_problem_warnings_update() break; } ride = get_ride(peep->guest_heading_to_ride_id); - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) + if (ride != nullptr && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) hunger_counter++; break; @@ -1243,7 +1243,7 @@ void peep_problem_warnings_update() break; } ride = get_ride(peep->guest_heading_to_ride_id); - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_SELLS_DRINKS)) + if (ride != nullptr && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_SELLS_DRINKS)) thirst_counter++; break; @@ -1254,7 +1254,7 @@ void peep_problem_warnings_update() break; } ride = get_ride(peep->guest_heading_to_ride_id); - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_BATHROOM)) + if (ride != nullptr && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_BATHROOM)) bathroom_counter++; break; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index aa0a53de30..71c732463d 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -547,7 +547,7 @@ private: { for (size_t i = 0; i < std::size(_s4.rides); i++) { - rct1_ride* ride = &_s4.rides[i]; + auto ride = &_s4.rides[i]; if (ride->type != RCT1_RIDE_TYPE_NULL) { if (RCT1::RideTypeUsesVehicles(ride->type)) diff --git a/src/openrct2/ride/CableLift.cpp b/src/openrct2/ride/CableLift.cpp index ba96db2d76..b3212ceecb 100644 --- a/src/openrct2/ride/CableLift.cpp +++ b/src/openrct2/ride/CableLift.cpp @@ -222,7 +222,10 @@ static void cable_lift_update_arriving(rct_vehicle* vehicle) static bool sub_6DF01A_loop(rct_vehicle* vehicle) { - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return false; + for (; vehicle->remaining_distance >= 13962; _vehicleUnkF64E10++) { uint8_t trackType = vehicle->track_type >> 2; @@ -302,7 +305,10 @@ static bool sub_6DF01A_loop(rct_vehicle* vehicle) static bool sub_6DF21B_loop(rct_vehicle* vehicle) { - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return false; + for (; vehicle->remaining_distance < 0; _vehicleUnkF64E10++) { uint16_t trackProgress = vehicle->track_progress - 1; diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index a6b8690c36..572ca1af48 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -324,8 +324,11 @@ static void track_paint_util_draw_station_impl( paint_session* session, ride_id_t rideIndex, uint8_t direction, uint16_t height, uint16_t coverHeight, const TileElement* tileElement, int32_t fenceOffsetA, int32_t fenceOffsetB) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + LocationXY16 position = session->MapPosition; - Ride* ride = get_ride(rideIndex); auto stationObj = ride_get_station_object(ride); const bool hasGreenLight = tileElement->AsTrack()->HasGreenLight(); @@ -529,8 +532,11 @@ void track_paint_util_draw_station_inverted( paint_session* session, ride_id_t rideIndex, uint8_t direction, int32_t height, const TileElement* tileElement, uint8_t stationVariant) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + LocationXY16 position = session->MapPosition; - Ride* ride = get_ride(rideIndex); auto stationObj = ride_get_station_object(ride); const bool hasGreenLight = tileElement->AsTrack()->HasGreenLight(); diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index b00c5825f8..ca5cf172b6 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1518,9 +1518,9 @@ static bool vehicle_open_restraints(rct_vehicle* vehicle) */ static void vehicle_update_measurements(rct_vehicle* vehicle) { - Ride* ride; - - ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return; if (vehicle->status == VEHICLE_STATUS_TRAVELLING_BOAT) { @@ -2236,7 +2236,9 @@ static void vehicle_update_waiting_for_passengers(rct_vehicle* vehicle) { vehicle->velocity = 0; - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return; if (vehicle->sub_state == 0) { @@ -2484,7 +2486,10 @@ static void vehicle_update_dodgems_mode(rct_vehicle* vehicle) */ static void vehicle_update_waiting_to_depart(rct_vehicle* vehicle) { - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return; + bool shouldBreak = false; if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { @@ -2916,13 +2921,16 @@ static bool vehicle_can_depart_synchronised(rct_vehicle* vehicle) /* Here all the of sync-ed stations are from the same ride */ ride = get_ride(rideId); - for (int32_t i = 0; i < ride->num_vehicles; i++) + if (ride != nullptr) { - rct_vehicle* v = GET_VEHICLE(ride->vehicles[i]); - if (v->status != VEHICLE_STATUS_WAITING_TO_DEPART && v->velocity != 0) + for (int32_t i = 0; i < ride->num_vehicles; i++) { - // Here at least one vehicle on the ride is moving. - return false; + rct_vehicle* v = GET_VEHICLE(ride->vehicles[i]); + if (v->status != VEHICLE_STATUS_WAITING_TO_DEPART && v->velocity != 0) + { + // Here at least one vehicle on the ride is moving. + return false; + } } } @@ -3188,12 +3196,13 @@ static void vehicle_update_departing_boat_hire(rct_vehicle* vehicle) */ static void vehicle_update_departing(rct_vehicle* vehicle) { - Ride* ride = get_ride(vehicle->ride); - rct_ride_entry* rideEntry = get_ride_entry(vehicle->ride_subtype); - if (rideEntry == nullptr) - { + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return; + + auto rideEntry = get_ride_entry(vehicle->ride_subtype); + if (rideEntry == nullptr) return; - } if (vehicle->sub_state == 0) { @@ -3673,8 +3682,8 @@ static void vehicle_update_travelling(rct_vehicle* vehicle) { vehicle_check_if_missing(vehicle); - Ride* ride = get_ride(vehicle->ride); - if (_vehicleBreakdown == 0 && ride->mode == RIDE_MODE_ROTATING_LIFT) + auto ride = get_ride(vehicle->ride); + if (ride == nullptr || (_vehicleBreakdown == 0 && ride->mode == RIDE_MODE_ROTATING_LIFT)) return; if (vehicle->sub_state == 2) @@ -3849,9 +3858,11 @@ static void vehicle_update_travelling(rct_vehicle* vehicle) */ static void vehicle_update_arriving(rct_vehicle* vehicle) { - uint8_t unkF64E35 = 1; - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return; + uint8_t unkF64E35 = 1; switch (ride->mode) { case RIDE_MODE_SWING: @@ -6258,7 +6269,10 @@ int32_t vehicle_is_used_in_pairs(const rct_vehicle* vehicle) static int32_t vehicle_update_motion_dodgems(rct_vehicle* vehicle) { _vehicleMotionTrackFlags = 0; - Ride* ride = get_ride(vehicle->ride); + + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return _vehicleMotionTrackFlags; int32_t nextVelocity = vehicle->velocity + vehicle->acceleration; if (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN) @@ -7262,23 +7276,26 @@ static void vehicle_update_additional_animation(rct_vehicle* vehicle) ah &= 0x02; if (al != ah) { - Ride* ride = get_ride(vehicle->ride); - if (!ride_has_station_shelter(ride) - || (vehicle->status != VEHICLE_STATUS_MOVING_TO_END_OF_STATION - && vehicle->status != VEHICLE_STATUS_ARRIVING)) + auto ride = get_ride(vehicle->ride); + if (ride != nullptr) { - int32_t index = vehicle->sprite_direction >> 1; - if (vehicle->vehicle_sprite_type == 2) + if (!ride_has_station_shelter(ride) + || (vehicle->status != VEHICLE_STATUS_MOVING_TO_END_OF_STATION + && vehicle->status != VEHICLE_STATUS_ARRIVING)) { - index += 16; + int32_t index = vehicle->sprite_direction >> 1; + if (vehicle->vehicle_sprite_type == 2) + { + index += 16; + } + if (vehicle->vehicle_sprite_type == 6) + { + index += 32; + } + steam_particle_create( + vehicle->x + SteamParticleOffsets[index].x, vehicle->y + SteamParticleOffsets[index].y, + vehicle->z + SteamParticleOffsets[index].z); } - if (vehicle->vehicle_sprite_type == 6) - { - index += 32; - } - steam_particle_create( - vehicle->x + SteamParticleOffsets[index].x, vehicle->y + SteamParticleOffsets[index].y, - vehicle->z + SteamParticleOffsets[index].z); } } vehicle->Invalidate(); @@ -8694,7 +8711,10 @@ static int32_t vehicle_update_track_motion_mini_golf(rct_vehicle* vehicle, int32 { registers regs = {}; - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return 0; + rct_ride_entry* rideEntry = get_ride_entry(vehicle->ride_subtype); rct_ride_entry_vehicle* vehicleEntry = vehicle_get_vehicle_entry(vehicle); @@ -9558,7 +9578,10 @@ int32_t vehicle_update_track_motion(rct_vehicle* vehicle, int32_t* outStation) { registers regs = {}; - Ride* ride = get_ride(vehicle->ride); + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return 0; + rct_ride_entry* rideEntry = get_ride_entry(vehicle->ride_subtype); rct_ride_entry_vehicle* vehicleEntry = vehicle_get_vehicle_entry(vehicle); diff --git a/src/openrct2/ride/coaster/AirPoweredVerticalCoaster.cpp b/src/openrct2/ride/coaster/AirPoweredVerticalCoaster.cpp index 0857ec3a3b..99047ba44a 100644 --- a/src/openrct2/ride/coaster/AirPoweredVerticalCoaster.cpp +++ b/src/openrct2/ride/coaster/AirPoweredVerticalCoaster.cpp @@ -216,8 +216,9 @@ static void air_powered_vertical_rc_track_station( wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr); - Ride* ride = get_ride(rideIndex); - track_paint_util_draw_station_platform(session, ride, direction, height, 5, tileElement); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + track_paint_util_draw_station_platform(session, ride, direction, height, 5, tileElement); paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_6); diff --git a/src/openrct2/ride/coaster/BolligerMabillardTrack.cpp b/src/openrct2/ride/coaster/BolligerMabillardTrack.cpp index cda0732c84..680a35b980 100644 --- a/src/openrct2/ride/coaster/BolligerMabillardTrack.cpp +++ b/src/openrct2/ride/coaster/BolligerMabillardTrack.cpp @@ -105,8 +105,9 @@ void bolliger_mabillard_track_station( track_paint_util_draw_station_metal_supports_2( session, direction, height, session->TrackColours[SCHEME_SUPPORTS], supportType); - Ride* ride = get_ride(rideIndex); - track_paint_util_draw_station_platform(session, ride, direction, height, 9, tileElement); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + track_paint_util_draw_station_platform(session, ride, direction, height, 9, tileElement); paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_6); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); diff --git a/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp b/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp index 50aec667dc..fc454cf27a 100644 --- a/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp @@ -131,29 +131,32 @@ static void multi_dimension_rc_track_station( } track_paint_util_draw_station_metal_supports_2(session, direction, height, session->TrackColours[SCHEME_SUPPORTS], 11); - Ride* ride = get_ride(rideIndex); - auto stationObj = ride_get_station_object(ride); - bool hasFence; - if (direction == 0 || direction == 2) + auto ride = get_ride(rideIndex); + if (ride != nullptr) { - hasFence = track_paint_util_has_fence(EDGE_NW, position, tileElement, ride, session->CurrentRotation); - track_paint_util_draw_station_covers(session, EDGE_NW, hasFence, stationObj, height); - } - else - { - hasFence = track_paint_util_has_fence(EDGE_NE, position, tileElement, ride, session->CurrentRotation); - track_paint_util_draw_station_covers(session, EDGE_NE, hasFence, stationObj, height); - } + auto stationObj = ride_get_station_object(ride); + bool hasFence; + if (direction == 0 || direction == 2) + { + hasFence = track_paint_util_has_fence(EDGE_NW, position, tileElement, ride, session->CurrentRotation); + track_paint_util_draw_station_covers(session, EDGE_NW, hasFence, stationObj, height); + } + else + { + hasFence = track_paint_util_has_fence(EDGE_NE, position, tileElement, ride, session->CurrentRotation); + track_paint_util_draw_station_covers(session, EDGE_NE, hasFence, stationObj, height); + } - if (direction == 0 || direction == 2) - { - hasFence = track_paint_util_has_fence(EDGE_SE, position, tileElement, ride, session->CurrentRotation); - track_paint_util_draw_station_covers(session, EDGE_SE, hasFence, stationObj, height); - } - else - { - hasFence = track_paint_util_has_fence(EDGE_SW, position, tileElement, ride, session->CurrentRotation); - track_paint_util_draw_station_covers(session, EDGE_SW, hasFence, stationObj, height); + if (direction == 0 || direction == 2) + { + hasFence = track_paint_util_has_fence(EDGE_SE, position, tileElement, ride, session->CurrentRotation); + track_paint_util_draw_station_covers(session, EDGE_SE, hasFence, stationObj, height); + } + else + { + hasFence = track_paint_util_has_fence(EDGE_SW, position, tileElement, ride, session->CurrentRotation); + track_paint_util_draw_station_covers(session, EDGE_SW, hasFence, stationObj, height); + } } paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_6); diff --git a/src/openrct2/ride/coaster/ReverseFreefallCoaster.cpp b/src/openrct2/ride/coaster/ReverseFreefallCoaster.cpp index 6323b42c7d..d9405be1d2 100644 --- a/src/openrct2/ride/coaster/ReverseFreefallCoaster.cpp +++ b/src/openrct2/ride/coaster/ReverseFreefallCoaster.cpp @@ -219,7 +219,6 @@ static void paint_reverse_freefall_rc_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { - Ride* ride = get_ride(rideIndex); uint32_t imageId; if (direction == 0 || direction == 2) @@ -251,7 +250,9 @@ static void paint_reverse_freefall_rc_station( paint_util_push_tunnel_right(session, height, TUNNEL_6); } - track_paint_util_draw_station_platform(session, ride, direction, height, 5, tileElement); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + track_paint_util_draw_station_platform(session, ride, direction, height, 5, tileElement); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(session, height + 32, 0x20); diff --git a/src/openrct2/ride/gentle/CircusShow.cpp b/src/openrct2/ride/gentle/CircusShow.cpp index 59c70454d7..a31575ac40 100644 --- a/src/openrct2/ride/gentle/CircusShow.cpp +++ b/src/openrct2/ride/gentle/CircusShow.cpp @@ -59,16 +59,19 @@ static void paint_circus_show( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_SUPPORTS], height, fenceSpritesRope, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_SUPPORTS], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/gentle/CrookedHouse.cpp b/src/openrct2/ride/gentle/CrookedHouse.cpp index f89b283619..4d0e1f8c5b 100644 --- a/src/openrct2/ride/gentle/CrookedHouse.cpp +++ b/src/openrct2/ride/gentle/CrookedHouse.cpp @@ -69,16 +69,19 @@ static void paint_crooked_house( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/gentle/Dodgems.cpp b/src/openrct2/ride/gentle/Dodgems.cpp index 924ed4454e..9603a2cf00 100644 --- a/src/openrct2/ride/gentle/Dodgems.cpp +++ b/src/openrct2/ride/gentle/Dodgems.cpp @@ -43,7 +43,6 @@ static void paint_dodgems( uint8_t relativeTrackSequence = track_map_4x4[direction][trackSequence]; int32_t edges = edges_4x4[relativeTrackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -51,9 +50,13 @@ static void paint_dodgems( uint32_t imageId = SPR_DODGEMS_FLOOR | session->TrackColours[SCHEME_SUPPORTS]; sub_98197C(session, imageId, 0, 0, 30, 30, 1, height, 1, 1, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_SUPPORTS], height, dodgems_fence_sprites, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_SUPPORTS], height, dodgems_fence_sprites, + session->CurrentRotation); + } switch (direction) { diff --git a/src/openrct2/ride/gentle/FerrisWheel.cpp b/src/openrct2/ride/gentle/FerrisWheel.cpp index a6ec174c69..33438a0e57 100644 --- a/src/openrct2/ride/gentle/FerrisWheel.cpp +++ b/src/openrct2/ride/gentle/FerrisWheel.cpp @@ -155,7 +155,6 @@ static void paint_ferris_wheel( edges = edges_1x4_ne_sw[relativeTrackSequence]; } - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -165,26 +164,30 @@ static void paint_ferris_wheel( uint32_t imageId; uint8_t rotation = session->CurrentRotation; uint32_t colourFlags = session->TrackColours[SCHEME_MISC]; - if (edges & EDGE_NW && track_paint_util_has_fence(EDGE_NW, position, tileElement, ride, rotation)) + auto ride = get_ride(rideIndex); + if (ride != nullptr) { - imageId = SPR_FENCE_ROPE_NW | colourFlags; - sub_98199C(session, imageId, 0, 0, 32, 1, 7, height, 0, 2, height + 2); - } - if (edges & EDGE_NE && track_paint_util_has_fence(EDGE_NE, position, tileElement, ride, rotation)) - { - imageId = SPR_FENCE_ROPE_NE | colourFlags; - sub_98199C(session, imageId, 0, 0, 1, 32, 7, height, 2, 0, height + 2); - } - if (edges & EDGE_SE && track_paint_util_has_fence(EDGE_SE, position, tileElement, ride, rotation)) - { - // Bound box is slightly different from track_paint_util_paint_fences - imageId = SPR_FENCE_ROPE_SE | colourFlags; - sub_98197C(session, imageId, 0, 0, 28, 1, 7, height, 0, 29, height + 3); - } - if (edges & EDGE_SW && track_paint_util_has_fence(EDGE_SW, position, tileElement, ride, rotation)) - { - imageId = SPR_FENCE_ROPE_SW | colourFlags; - sub_98197C(session, imageId, 0, 0, 1, 32, 7, height, 30, 0, height + 2); + if (edges & EDGE_NW && track_paint_util_has_fence(EDGE_NW, position, tileElement, ride, rotation)) + { + imageId = SPR_FENCE_ROPE_NW | colourFlags; + sub_98199C(session, imageId, 0, 0, 32, 1, 7, height, 0, 2, height + 2); + } + if (edges & EDGE_NE && track_paint_util_has_fence(EDGE_NE, position, tileElement, ride, rotation)) + { + imageId = SPR_FENCE_ROPE_NE | colourFlags; + sub_98199C(session, imageId, 0, 0, 1, 32, 7, height, 2, 0, height + 2); + } + if (edges & EDGE_SE && track_paint_util_has_fence(EDGE_SE, position, tileElement, ride, rotation)) + { + // Bound box is slightly different from track_paint_util_paint_fences + imageId = SPR_FENCE_ROPE_SE | colourFlags; + sub_98197C(session, imageId, 0, 0, 28, 1, 7, height, 0, 29, height + 3); + } + if (edges & EDGE_SW && track_paint_util_has_fence(EDGE_SW, position, tileElement, ride, rotation)) + { + imageId = SPR_FENCE_ROPE_SW | colourFlags; + sub_98197C(session, imageId, 0, 0, 1, 32, 7, height, 30, 0, height + 2); + } } switch (relativeTrackSequence) diff --git a/src/openrct2/ride/gentle/FlyingSaucers.cpp b/src/openrct2/ride/gentle/FlyingSaucers.cpp index df97d22ce6..54c8fca3ff 100644 --- a/src/openrct2/ride/gentle/FlyingSaucers.cpp +++ b/src/openrct2/ride/gentle/FlyingSaucers.cpp @@ -39,7 +39,6 @@ static void paint_flying_saucers( uint8_t relativeTrackSequence = track_map_4x4[direction][trackSequence]; int32_t edges = edges_4x4[relativeTrackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -47,9 +46,13 @@ static void paint_flying_saucers( uint32_t imageId = SPR_FLYING_SAUCERS_FLOOR | session->TrackColours[SCHEME_TRACK]; sub_98197C(session, imageId, 0, 0, 30, 30, 1, height, 1, 1, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, flying_saucers_fence_sprites, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, + flying_saucers_fence_sprites, session->CurrentRotation); + } paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(session, height + 48, 0x20); diff --git a/src/openrct2/ride/gentle/HauntedHouse.cpp b/src/openrct2/ride/gentle/HauntedHouse.cpp index 08a3cf8e63..a5b9d9a379 100644 --- a/src/openrct2/ride/gentle/HauntedHouse.cpp +++ b/src/openrct2/ride/gentle/HauntedHouse.cpp @@ -100,16 +100,19 @@ static void paint_haunted_house( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/gentle/MerryGoRound.cpp b/src/openrct2/ride/gentle/MerryGoRound.cpp index 0bcd25d1b3..e26c80d9f0 100644 --- a/src/openrct2/ride/gentle/MerryGoRound.cpp +++ b/src/openrct2/ride/gentle/MerryGoRound.cpp @@ -110,16 +110,19 @@ static void paint_merry_go_round( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/gentle/MiniGolf.cpp b/src/openrct2/ride/gentle/MiniGolf.cpp index 1cb7634544..46f86753b5 100644 --- a/src/openrct2/ride/gentle/MiniGolf.cpp +++ b/src/openrct2/ride/gentle/MiniGolf.cpp @@ -673,8 +673,11 @@ static void paint_mini_golf_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + LocationXY16 position = session->MapPosition; - Ride* ride = get_ride(rideIndex); auto stationObj = ride_get_station_object(ride); uint32_t imageId; bool hasFence; diff --git a/src/openrct2/ride/gentle/ObservationTower.cpp b/src/openrct2/ride/gentle/ObservationTower.cpp index 694a2242ce..c454ad1f47 100644 --- a/src/openrct2/ride/gentle/ObservationTower.cpp +++ b/src/openrct2/ride/gentle/ObservationTower.cpp @@ -84,7 +84,6 @@ static void paint_observation_tower_base( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -92,9 +91,13 @@ static void paint_observation_tower_base( uint32_t imageId = SPR_FLOOR_METAL_B | session->TrackColours[SCHEME_SUPPORTS]; sub_98197C(session, imageId, 0, 0, 32, 32, 1, height, 0, 0, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, fenceSpritesMetalB, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, fenceSpritesMetalB, + session->CurrentRotation); + } if (trackSequence == 0) { diff --git a/src/openrct2/ride/gentle/SpaceRings.cpp b/src/openrct2/ride/gentle/SpaceRings.cpp index 1d582fdd81..e248132ac5 100644 --- a/src/openrct2/ride/gentle/SpaceRings.cpp +++ b/src/openrct2/ride/gentle/SpaceRings.cpp @@ -87,10 +87,13 @@ static void paint_space_rings( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; uint32_t imageId; diff --git a/src/openrct2/ride/gentle/SpiralSlide.cpp b/src/openrct2/ride/gentle/SpiralSlide.cpp index 943ede9acc..fb5b8954d9 100644 --- a/src/openrct2/ride/gentle/SpiralSlide.cpp +++ b/src/openrct2/ride/gentle/SpiralSlide.cpp @@ -198,7 +198,6 @@ static void paint_spiral_slide( trackSequence = track_map_2x2[direction][trackSequence]; int32_t edges = edges_2x2[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -207,9 +206,13 @@ static void paint_spiral_slide( uint32_t imageId = ((direction & 1) ? SPIRAL_SLIDE_BASE_B : SPIRAL_SLIDE_BASE_A) | session->TrackColours[SCHEME_SUPPORTS]; sub_98197C(session, imageId, 0, 0, 32, 32, 1, height, 0, 0, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, spiral_slide_fence_sprites, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, + spiral_slide_fence_sprites, session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/thrill/3dCinema.cpp b/src/openrct2/ride/thrill/3dCinema.cpp index 62ff01e77c..940efb3a98 100644 --- a/src/openrct2/ride/thrill/3dCinema.cpp +++ b/src/openrct2/ride/thrill/3dCinema.cpp @@ -59,16 +59,19 @@ static void paint_3d_cinema( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/thrill/Enterprise.cpp b/src/openrct2/ride/thrill/Enterprise.cpp index 0a8cb47c50..48d60f6721 100644 --- a/src/openrct2/ride/thrill/Enterprise.cpp +++ b/src/openrct2/ride/thrill/Enterprise.cpp @@ -81,10 +81,13 @@ static void paint_enterprise( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + trackSequence = track_map_4x4[direction][trackSequence]; int32_t edges = edges_4x4[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_MISC], nullptr); diff --git a/src/openrct2/ride/thrill/GoKarts.cpp b/src/openrct2/ride/thrill/GoKarts.cpp index c5f1b4fa93..9f3a5774a8 100644 --- a/src/openrct2/ride/thrill/GoKarts.cpp +++ b/src/openrct2/ride/thrill/GoKarts.cpp @@ -347,8 +347,11 @@ static void paint_go_karts_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + LocationXY16 position = session->MapPosition; - Ride* ride = get_ride(rideIndex); auto stationObj = ride_get_station_object(ride); bool hasFence; diff --git a/src/openrct2/ride/thrill/LaunchedFreefall.cpp b/src/openrct2/ride/thrill/LaunchedFreefall.cpp index 8a157f64b1..eb18536da6 100644 --- a/src/openrct2/ride/thrill/LaunchedFreefall.cpp +++ b/src/openrct2/ride/thrill/LaunchedFreefall.cpp @@ -93,7 +93,6 @@ static void paint_launched_freefall_base( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -101,9 +100,13 @@ static void paint_launched_freefall_base( uint32_t imageId = SPR_FLOOR_METAL | session->TrackColours[SCHEME_SUPPORTS]; sub_98197C(session, imageId, 0, 0, 32, 32, 1, height, 0, 0, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, - launched_freefall_fence_sprites, session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, + launched_freefall_fence_sprites, session->CurrentRotation); + } if (trackSequence == 0) { diff --git a/src/openrct2/ride/thrill/MagicCarpet.cpp b/src/openrct2/ride/thrill/MagicCarpet.cpp index f799350792..5009460093 100644 --- a/src/openrct2/ride/thrill/MagicCarpet.cpp +++ b/src/openrct2/ride/thrill/MagicCarpet.cpp @@ -244,21 +244,24 @@ static void paint_magic_carpet( break; } - Ride* ride = get_ride(rideIndex); - switch (relativeTrackSequence) + auto ride = get_ride(rideIndex); + if (ride != nullptr) { - case 3: - paint_magic_carpet_structure(session, ride, direction, -48, height); - break; - case 0: - paint_magic_carpet_structure(session, ride, direction, -16, height); - break; - case 2: - paint_magic_carpet_structure(session, ride, direction, 16, height); - break; - case 1: - paint_magic_carpet_structure(session, ride, direction, 48, height); - break; + switch (relativeTrackSequence) + { + case 3: + paint_magic_carpet_structure(session, ride, direction, -48, height); + break; + case 0: + paint_magic_carpet_structure(session, ride, direction, -16, height); + break; + case 2: + paint_magic_carpet_structure(session, ride, direction, 16, height); + break; + case 1: + paint_magic_carpet_structure(session, ride, direction, 48, height); + break; + } } paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); diff --git a/src/openrct2/ride/thrill/MotionSimulator.cpp b/src/openrct2/ride/thrill/MotionSimulator.cpp index 3695676d9d..de79d4b833 100644 --- a/src/openrct2/ride/thrill/MotionSimulator.cpp +++ b/src/openrct2/ride/thrill/MotionSimulator.cpp @@ -137,14 +137,18 @@ static void paint_motionsimulator( trackSequence = track_map_2x2[direction][trackSequence]; int32_t edges = edges_2x2[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = { session->MapPosition.x, session->MapPosition.y }; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_SUPPORTS], height, fenceSpritesRope, - session->CurrentRotation); + + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_SUPPORTS], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/thrill/PirateShip.cpp b/src/openrct2/ride/thrill/PirateShip.cpp index 4c20195a2a..7ba39aa09a 100644 --- a/src/openrct2/ride/thrill/PirateShip.cpp +++ b/src/openrct2/ride/thrill/PirateShip.cpp @@ -170,8 +170,11 @@ static void paint_pirate_ship( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + uint8_t relativeTrackSequence = track_map_1x5[direction][trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; uint32_t imageId; diff --git a/src/openrct2/ride/thrill/RotoDrop.cpp b/src/openrct2/ride/thrill/RotoDrop.cpp index bebfc4fb1e..32c773ae63 100644 --- a/src/openrct2/ride/thrill/RotoDrop.cpp +++ b/src/openrct2/ride/thrill/RotoDrop.cpp @@ -102,7 +102,6 @@ static void paint_roto_drop_base( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_MISC], nullptr); @@ -110,9 +109,13 @@ static void paint_roto_drop_base( uint32_t imageId = SPR_FLOOR_METAL_B | session->TrackColours[SCHEME_SUPPORTS]; sub_98197C(session, imageId, 0, 0, 32, 32, 1, height, 0, 0, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, fenceSpritesMetalB, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, fenceSpritesMetalB, + session->CurrentRotation); + } if (trackSequence == 0) { diff --git a/src/openrct2/ride/thrill/SwingingInverterShip.cpp b/src/openrct2/ride/thrill/SwingingInverterShip.cpp index eb70df3f6d..e126165a35 100644 --- a/src/openrct2/ride/thrill/SwingingInverterShip.cpp +++ b/src/openrct2/ride/thrill/SwingingInverterShip.cpp @@ -126,9 +126,6 @@ static void paint_swinging_inverter_ship( const TileElement* tileElement) { uint8_t relativeTrackSequence = track_map_1x4[direction][trackSequence]; - - Ride* ride = get_ride(rideIndex); - uint32_t imageId; if (relativeTrackSequence != 1 && relativeTrackSequence != 3) @@ -168,20 +165,24 @@ static void paint_swinging_inverter_ship( } } - switch (relativeTrackSequence) + auto ride = get_ride(rideIndex); + if (ride != nullptr) { - case 1: - paint_swinging_inverter_ship_structure(session, ride, direction, 48, height + 7); - break; - case 2: - paint_swinging_inverter_ship_structure(session, ride, direction, 16, height + 7); - break; - case 0: - paint_swinging_inverter_ship_structure(session, ride, direction, -16, height + 7); - break; - case 3: - paint_swinging_inverter_ship_structure(session, ride, direction, -48, height + 7); - break; + switch (relativeTrackSequence) + { + case 1: + paint_swinging_inverter_ship_structure(session, ride, direction, 48, height + 7); + break; + case 2: + paint_swinging_inverter_ship_structure(session, ride, direction, 16, height + 7); + break; + case 0: + paint_swinging_inverter_ship_structure(session, ride, direction, -16, height + 7); + break; + case 3: + paint_swinging_inverter_ship_structure(session, ride, direction, -48, height + 7); + break; + } } paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); diff --git a/src/openrct2/ride/thrill/TopSpin.cpp b/src/openrct2/ride/thrill/TopSpin.cpp index f3527ce196..4c0186ac35 100644 --- a/src/openrct2/ride/thrill/TopSpin.cpp +++ b/src/openrct2/ride/thrill/TopSpin.cpp @@ -45,6 +45,10 @@ static void top_spin_paint_vehicle( paint_session* session, int8_t al, int8_t cl, ride_id_t rideIndex, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + uint16_t boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ; // As we will be drawing a vehicle we need to backup the tileElement that // is assigned to the drawings. @@ -52,7 +56,6 @@ static void top_spin_paint_vehicle( height += 3; - Ride* ride = get_ride(rideIndex); rct_ride_entry* rideEntry = get_ride_entry(ride->subtype); rct_vehicle* vehicle = nullptr; @@ -249,16 +252,19 @@ static void paint_top_spin( trackSequence = track_map_3x3[direction][trackSequence]; int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_MISC], nullptr); track_paint_util_paint_floor(session, edges, session->TrackColours[SCHEME_TRACK], height, floorSpritesCork); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_MISC], height, fenceSpritesRope, + session->CurrentRotation); + } switch (trackSequence) { diff --git a/src/openrct2/ride/thrill/Twist.cpp b/src/openrct2/ride/thrill/Twist.cpp index a3e0ac979a..0e76bf5928 100644 --- a/src/openrct2/ride/thrill/Twist.cpp +++ b/src/openrct2/ride/thrill/Twist.cpp @@ -81,10 +81,13 @@ static void paint_twist( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + trackSequence = track_map_3x3[direction][trackSequence]; const uint8_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; uint32_t imageId; diff --git a/src/openrct2/ride/transport/Lift.cpp b/src/openrct2/ride/transport/Lift.cpp index d3eacb4b94..792731774b 100644 --- a/src/openrct2/ride/transport/Lift.cpp +++ b/src/openrct2/ride/transport/Lift.cpp @@ -73,15 +73,18 @@ static void paint_lift_base( } int32_t edges = edges_3x3[trackSequence]; - Ride* ride = get_ride(rideIndex); LocationXY16 position = session->MapPosition; uint32_t imageId = SPR_FLOOR_METAL_B | session->TrackColours[SCHEME_SUPPORTS]; sub_98197C(session, imageId, 0, 0, 32, 32, 1, height, 0, 0, height); - track_paint_util_paint_fences( - session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, fenceSpritesMetalB, - session->CurrentRotation); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + track_paint_util_paint_fences( + session, edges, position, tileElement, ride, session->TrackColours[SCHEME_TRACK], height, fenceSpritesMetalB, + session->CurrentRotation); + } int32_t blockedSegments = 0; switch (trackSequence) diff --git a/src/openrct2/ride/water/BoatHire.cpp b/src/openrct2/ride/water/BoatHire.cpp index a96fcf2276..6ff6a8bf42 100644 --- a/src/openrct2/ride/water/BoatHire.cpp +++ b/src/openrct2/ride/water/BoatHire.cpp @@ -63,8 +63,11 @@ static void paint_boat_hire_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + LocationXY16 position = session->MapPosition; - Ride* ride = get_ride(rideIndex); auto stationObj = ride_get_station_object(ride); if (direction & 1) diff --git a/src/openrct2/ride/water/RiverRapids.cpp b/src/openrct2/ride/water/RiverRapids.cpp index ccb28bd6ff..cdaefc8f36 100644 --- a/src/openrct2/ride/water/RiverRapids.cpp +++ b/src/openrct2/ride/water/RiverRapids.cpp @@ -321,10 +321,10 @@ static void paint_river_rapids_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { - Ride* ride = get_ride(rideIndex); - paint_river_rapids_track_flat(session, rideIndex, trackSequence, direction, height, tileElement); - track_paint_util_draw_station_platform(session, ride, direction, height, 12, tileElement); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + track_paint_util_draw_station_platform(session, ride, direction, height, 12, tileElement); paint_util_set_general_support_height(session, height + 32, 0x20); } diff --git a/src/openrct2/ride/water/SplashBoats.cpp b/src/openrct2/ride/water/SplashBoats.cpp index 9a3ac2a625..ba238ccdc3 100644 --- a/src/openrct2/ride/water/SplashBoats.cpp +++ b/src/openrct2/ride/water/SplashBoats.cpp @@ -783,8 +783,6 @@ static void paint_splash_boats_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { - Ride* ride = get_ride(rideIndex); - if (direction & 1) { uint32_t imageId = (direction == 1 ? SPR_SPLASH_BOATS_FLAT_TOP_NW_SE : SPR_SPLASH_BOATS_FLAT_TOP_SE_NW) @@ -806,7 +804,9 @@ static void paint_splash_boats_station( wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr); - track_paint_util_draw_station_platform(session, ride, direction, height, 7, tileElement); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + track_paint_util_draw_station_platform(session, ride, direction, height, 7, tileElement); paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_6); diff --git a/src/openrct2/ride/water/SubmarineRide.cpp b/src/openrct2/ride/water/SubmarineRide.cpp index 576f5ab0d2..48c88fc791 100644 --- a/src/openrct2/ride/water/SubmarineRide.cpp +++ b/src/openrct2/ride/water/SubmarineRide.cpp @@ -82,8 +82,11 @@ static void submarine_ride_paint_track_station( paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height, const TileElement* tileElement) { + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; + LocationXY16 position = session->MapPosition; - Ride* ride = get_ride(rideIndex); auto stationObj = ride_get_station_object(ride); int32_t heightLower = height - 16; uint32_t imageId; diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 0d1c135039..404b1d0143 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -667,8 +667,7 @@ void scenario_remove_trackless_rides(rct_s6_data* s6) ride_all_has_any_track_elements(rideHasTrack); for (int32_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++) { - rct2_ride* ride = &s6->rides[i]; - + auto ride = &s6->rides[i]; if (rideHasTrack[i] || ride->type == RIDE_TYPE_NULL) { continue; diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index 0730b5d980..da42d4e16e 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -271,7 +271,9 @@ bool window_ride_construction_update_state( liftHillAndAlternativeState |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; } - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return true; if (_enabledRidePieces & (1ULL << TRACK_SLOPE_STEEP_LONG)) { @@ -403,9 +405,8 @@ bool window_ride_construction_update_state( void window_ride_construction_do_entrance_exit_check() { - rct_window* w = window_find_by_class(WC_RIDE_CONSTRUCTION); - Ride* ride = get_ride(_currentRideIndex); - + auto w = window_find_by_class(WC_RIDE_CONSTRUCTION); + auto ride = get_ride(_currentRideIndex); if (w == nullptr || ride == nullptr) { return; @@ -430,7 +431,7 @@ void window_ride_construction_do_entrance_exit_check() void window_ride_construction_do_station_check() { - Ride* ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); if (ride != nullptr) { _stationConstructed = ride->num_stations != 0; diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 3b5c2c09ed..64cfb0029e 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -1484,8 +1484,8 @@ bool map_can_construct_with_clear_at( crossingMode == 2 && canBuildCrossing && tileElement->GetType() == TILE_ELEMENT_TYPE_TRACK && tileElement->base_height == zLow && tileElement->AsTrack()->GetTrackType() == TRACK_ELEM_FLAT) { - Ride* ride = get_ride(tileElement->AsTrack()->GetRideIndex()); - if (ride->type == RIDE_TYPE_MINIATURE_RAILWAY) + auto ride = get_ride(tileElement->AsTrack()->GetRideIndex()); + if (ride != nullptr && ride->type == RIDE_TYPE_MINIATURE_RAILWAY) { continue; } diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index 9a3a74b279..9b8efdf5d3 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -241,22 +241,26 @@ GameActionResult::Ptr tile_inspector_rotate_element_at(CoordsXY loc, int32_t ele tileElement->SetDirection(newRotation); // Update ride's known entrance/exit rotation - Ride* ride = get_ride(tileElement->AsEntrance()->GetRideIndex()); - uint8_t stationIndex = tileElement->AsEntrance()->GetStationIndex(); - auto entrance = ride_get_entrance_location(ride, stationIndex); - auto exit = ride_get_exit_location(ride, stationIndex); - uint8_t entranceType = tileElement->AsEntrance()->GetEntranceType(); - uint8_t z = tileElement->base_height; + auto ride = get_ride(tileElement->AsEntrance()->GetRideIndex()); + if (ride != nullptr) + { + auto stationIndex = tileElement->AsEntrance()->GetStationIndex(); + auto entrance = ride_get_entrance_location(ride, stationIndex); + auto exit = ride_get_exit_location(ride, stationIndex); + uint8_t entranceType = tileElement->AsEntrance()->GetEntranceType(); + uint8_t z = tileElement->base_height; - // Make sure this is the correct entrance or exit - if (entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE && entrance.x == loc.x / 32 && entrance.y == loc.y / 32 - && entrance.z == z) - { - ride_set_entrance_location(ride, stationIndex, { entrance.x, entrance.y, entrance.z, newRotation }); - } - else if (entranceType == ENTRANCE_TYPE_RIDE_EXIT && exit.x == loc.x / 32 && exit.y == loc.y / 32 && exit.z == z) - { - ride_set_exit_location(ride, stationIndex, { exit.x, exit.y, exit.z, newRotation }); + // Make sure this is the correct entrance or exit + if (entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE && entrance.x == loc.x / 32 && entrance.y == loc.y / 32 + && entrance.z == z) + { + ride_set_entrance_location(ride, stationIndex, { entrance.x, entrance.y, entrance.z, newRotation }); + } + else if ( + entranceType == ENTRANCE_TYPE_RIDE_EXIT && exit.x == loc.x / 32 && exit.y == loc.y / 32 && exit.z == z) + { + ride_set_exit_location(ride, stationIndex, { exit.x, exit.y, exit.z, newRotation }); + } } break; } @@ -426,19 +430,23 @@ GameActionResult::Ptr tile_inspector_any_base_height_offset( if (entranceType != ENTRANCE_TYPE_PARK_ENTRANCE) { // Update the ride's known entrance or exit height - Ride* ride = get_ride(tileElement->AsEntrance()->GetRideIndex()); - uint8_t entranceIndex = tileElement->AsEntrance()->GetStationIndex(); - auto entrance = ride_get_entrance_location(ride, entranceIndex); - auto exit = ride_get_exit_location(ride, entranceIndex); - uint8_t z = tileElement->base_height; + auto ride = get_ride(tileElement->AsEntrance()->GetRideIndex()); + if (ride != nullptr) + { + auto entranceIndex = tileElement->AsEntrance()->GetStationIndex(); + auto entrance = ride_get_entrance_location(ride, entranceIndex); + auto exit = ride_get_exit_location(ride, entranceIndex); + uint8_t z = tileElement->base_height; - // Make sure this is the correct entrance or exit - if (entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE && entrance.x == loc.x / 32 && entrance.y == loc.y / 32 - && entrance.z == z) - ride_set_entrance_location( - ride, entranceIndex, { entrance.x, entrance.y, z + heightOffset, entrance.direction }); - else if (entranceType == ENTRANCE_TYPE_RIDE_EXIT && exit.x == loc.x / 32 && exit.y == loc.y / 32 && exit.z == z) - ride_set_exit_location(ride, entranceIndex, { exit.x, exit.y, z + heightOffset, exit.direction }); + // Make sure this is the correct entrance or exit + if (entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE && entrance.x == loc.x / 32 && entrance.y == loc.y / 32 + && entrance.z == z) + ride_set_entrance_location( + ride, entranceIndex, { entrance.x, entrance.y, z + heightOffset, entrance.direction }); + else if ( + entranceType == ENTRANCE_TYPE_RIDE_EXIT && exit.x == loc.x / 32 && exit.y == loc.y / 32 && exit.z == z) + ride_set_exit_location(ride, entranceIndex, { exit.x, exit.y, z + heightOffset, exit.direction }); + } } } @@ -671,8 +679,7 @@ GameActionResult::Ptr tile_inspector_entrance_make_usable(CoordsXY loc, int32_t if (entranceElement == nullptr || entranceElement->GetType() != TILE_ELEMENT_TYPE_ENTRANCE) return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); - Ride* ride = get_ride(entranceElement->AsEntrance()->GetRideIndex()); - + auto ride = get_ride(entranceElement->AsEntrance()->GetRideIndex()); if (ride == nullptr) return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); @@ -750,9 +757,12 @@ GameActionResult::Ptr tile_inspector_track_base_height_offset( int16_t originY = loc.y; int16_t originZ = trackElement->base_height * 8; uint8_t rotation = trackElement->GetDirection(); - ride_id_t rideIndex = trackElement->AsTrack()->GetRideIndex(); - Ride* ride = get_ride(rideIndex); - const rct_preview_track* trackBlock = get_track_def_from_ride(ride, type); + auto rideIndex = trackElement->AsTrack()->GetRideIndex(); + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); + + auto trackBlock = get_track_def_from_ride(ride, type); trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection(); @@ -851,9 +861,12 @@ GameActionResult::Ptr tile_inspector_track_set_chain( int16_t originY = loc.y; int16_t originZ = trackElement->base_height * 8; uint8_t rotation = trackElement->GetDirection(); - ride_id_t rideIndex = trackElement->AsTrack()->GetRideIndex(); - Ride* ride = get_ride(rideIndex); - const rct_preview_track* trackBlock = get_track_def_from_ride(ride, type); + auto rideIndex = trackElement->AsTrack()->GetRideIndex(); + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); + + auto trackBlock = get_track_def_from_ride(ride, type); trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection();