diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index d897f0f641..38ab63a8ed 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -372,18 +372,14 @@ public: case INTENT_ACTION_INVALIDATE_VEHICLE_WINDOW: { - rct_vehicle* vehicle = static_cast(intent.GetPointerExtra(INTENT_EXTRA_VEHICLE)); - int32_t viewVehicleIndex; - Ride* ride; - rct_window* w; - - w = window_find_by_number(WC_RIDE, vehicle->ride); + auto vehicle = static_cast(intent.GetPointerExtra(INTENT_EXTRA_VEHICLE)); + auto w = window_find_by_number(WC_RIDE, vehicle->ride); if (w == nullptr) return; - ride = get_ride(vehicle->ride); - viewVehicleIndex = w->ride.view - 1; - if (viewVehicleIndex < 0 || viewVehicleIndex >= ride->num_vehicles) + auto ride = get_ride(vehicle->ride); + auto viewVehicleIndex = w->ride.view - 1; + if (ride == nullptr || viewVehicleIndex < 0 || viewVehicleIndex >= ride->num_vehicles) return; if (vehicle->sprite_index != ride->vehicles[viewVehicleIndex]) diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index ab2b561784..e59a274ae0 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -231,7 +231,7 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter return info->type = VIEWPORT_INTERACTION_ITEM_NONE; ride = get_ride(sprite->vehicle.ride); - if (ride->status == RIDE_STATUS_CLOSED) + if (ride != nullptr && ride->status == RIDE_STATUS_CLOSED) { set_map_tooltip_format_arg(0, rct_string_id, STR_MAP_TOOLTIP_STRINGID_CLICK_TO_MODIFY); ride->FormatNameTo(gMapTooltipFormatArgs + 2); @@ -246,6 +246,9 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter return info->type = VIEWPORT_INTERACTION_ITEM_NONE; ride = get_ride(tile_element_get_ride_index(tileElement)); + if (ride == nullptr) + return info->type = VIEWPORT_INTERACTION_ITEM_NONE; + if (ride->status != RIDE_STATUS_CLOSED) return info->type; diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index 4e2734f1b3..896284193f 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -354,6 +354,7 @@ static void window_banner_viewport_rotate(rct_window* w) w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); - w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; + if (w->viewport != nullptr) + w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; window_invalidate(w); } diff --git a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp index 1e474795c7..6e788ad76b 100644 --- a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp +++ b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp @@ -1068,15 +1068,15 @@ static void window_editor_objective_options_rides_scrollgetheight( */ static void window_editor_objective_options_rides_scrollmousedown(rct_window* w, int32_t scrollIndex, int32_t x, int32_t y) { - Ride* ride; - int32_t i; - - i = y / 12; + auto i = y / 12; if (i < 0 || i >= w->no_list_items) return; - ride = get_ride(w->list_item_positions[i]); - ride->lifecycle_flags ^= RIDE_LIFECYCLE_INDESTRUCTIBLE; + auto ride = get_ride(w->list_item_positions[i]); + if (ride != nullptr) + { + ride->lifecycle_flags ^= RIDE_LIFECYCLE_INDESTRUCTIBLE; + } window_invalidate(w); } @@ -1165,17 +1165,20 @@ static void window_editor_objective_options_rides_scrollpaint(rct_window* w, rct // Checkbox mark auto ride = get_ride(w->list_item_positions[i]); - if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) + if (ride != nullptr) { - gCurrentFontSpriteBase = stringId == STR_WINDOW_COLOUR_2_STRINGID ? FONT_SPRITE_BASE_MEDIUM_EXTRA_DARK - : FONT_SPRITE_BASE_MEDIUM_DARK; - gfx_draw_string(dpi, (char*)CheckBoxMarkString, w->colours[1] & 0x7F, 2, y); - } + if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) + { + gCurrentFontSpriteBase = stringId == STR_WINDOW_COLOUR_2_STRINGID ? FONT_SPRITE_BASE_MEDIUM_EXTRA_DARK + : FONT_SPRITE_BASE_MEDIUM_DARK; + gfx_draw_string(dpi, (char*)CheckBoxMarkString, w->colours[1] & 0x7F, 2, y); + } - // Ride name - uint32_t args[32]{}; - ride->FormatNameTo(args); - gfx_draw_string_left(dpi, stringId, args, COLOUR_BLACK, 15, y); + // Ride name + uint32_t args[32]{}; + ride->FormatNameTo(args); + gfx_draw_string_left(dpi, stringId, args, COLOUR_BLACK, 15, y); + } } } diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index a80cb0cf56..cf92eb438f 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -1950,7 +1950,8 @@ static rct_string_id window_guest_inventory_format_item(Peep* peep, int32_t item break; case SHOP_ITEM_PHOTO: ride = get_ride(peep->photo1_ride_ref); - ride->FormatNameTo(gCommonFormatArgs + 6); + if (ride != nullptr) + ride->FormatNameTo(gCommonFormatArgs + 6); break; case SHOP_ITEM_UMBRELLA: set_format_arg(0, uint32_t, SPRITE_ID_PALETTE_COLOUR_1(peep->umbrella_colour) | ShopItems[item].Image); @@ -1965,8 +1966,11 @@ static rct_string_id window_guest_inventory_format_item(Peep* peep, int32_t item break; case VOUCHER_TYPE_RIDE_FREE: ride = get_ride(peep->voucher_arguments); - set_format_arg(6, rct_string_id, STR_PEEP_INVENTORY_VOUCHER_RIDE_FREE); - ride->FormatNameTo(gCommonFormatArgs + 8); + if (ride != nullptr) + { + set_format_arg(6, rct_string_id, STR_PEEP_INVENTORY_VOUCHER_RIDE_FREE); + ride->FormatNameTo(gCommonFormatArgs + 8); + } break; case VOUCHER_TYPE_PARK_ENTRY_HALF_PRICE: set_format_arg(6, rct_string_id, STR_PEEP_INVENTORY_VOUCHER_PARK_ENTRY_HALF_PRICE); @@ -1987,15 +1991,18 @@ static rct_string_id window_guest_inventory_format_item(Peep* peep, int32_t item break; case SHOP_ITEM_PHOTO2: ride = get_ride(peep->photo2_ride_ref); - ride->FormatNameTo(gCommonFormatArgs + 6); + if (ride != nullptr) + ride->FormatNameTo(gCommonFormatArgs + 6); break; case SHOP_ITEM_PHOTO3: ride = get_ride(peep->photo3_ride_ref); - ride->FormatNameTo(gCommonFormatArgs + 6); + if (ride != nullptr) + ride->FormatNameTo(gCommonFormatArgs + 6); break; case SHOP_ITEM_PHOTO4: ride = get_ride(peep->photo4_ride_ref); - ride->FormatNameTo(gCommonFormatArgs + 6); + if (ride != nullptr) + ride->FormatNameTo(gCommonFormatArgs + 6); break; } diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index f07aae2153..24ad8cd311 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -1602,11 +1602,13 @@ static uint16_t map_window_get_pixel_colour_ride(CoordsXY c) if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_PARK_ENTRANCE) break; ride = get_ride(tileElement->AsEntrance()->GetRideIndex()); - colourA = RideKeyColours[RideColourKey[ride->type]]; + if (ride != nullptr) + colourA = RideKeyColours[RideColourKey[ride->type]]; break; case TILE_ELEMENT_TYPE_TRACK: ride = get_ride(tileElement->AsTrack()->GetRideIndex()); - colourA = RideKeyColours[RideColourKey[ride->type]]; + if (ride != nullptr) + colourA = RideKeyColours[RideColourKey[ride->type]]; break; } } while (!(tileElement++)->IsLastForTile()); diff --git a/src/openrct2-ui/windows/MazeConstruction.cpp b/src/openrct2-ui/windows/MazeConstruction.cpp index fd60714c79..a4af05dbba 100644 --- a/src/openrct2-ui/windows/MazeConstruction.cpp +++ b/src/openrct2-ui/windows/MazeConstruction.cpp @@ -170,18 +170,21 @@ static void window_maze_construction_close(rct_window* w) hide_gridlines(); auto ride = get_ride(_currentRideIndex); - if (ride->overall_view.xy == RCT_XY8_UNDEFINED) + if (ride != nullptr) { - int32_t savedPausedState = gGamePaused; - gGamePaused = 0; - ride_action_modify(ride, RIDE_MODIFY_DEMOLISH, GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); - gGamePaused = savedPausedState; - } - else - { - auto intent = Intent(WC_RIDE); - intent.putExtra(INTENT_EXTRA_RIDE_ID, ride->id); - context_open_intent(&intent); + if (ride->overall_view.xy == RCT_XY8_UNDEFINED) + { + int32_t savedPausedState = gGamePaused; + gGamePaused = 0; + ride_action_modify(ride, RIDE_MODIFY_DEMOLISH, GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED); + gGamePaused = savedPausedState; + } + else + { + auto intent = Intent(WC_RIDE); + intent.putExtra(INTENT_EXTRA_RIDE_ID, ride->id); + context_open_intent(&intent); + } } } @@ -376,8 +379,8 @@ static void window_maze_construction_entrance_tooldown(int32_t x, int32_t y, rct audio_play_sound_at_location(SoundId::PlaceItem, result->Position.x, result->Position.y, result->Position.z); - Ride* ride = get_ride(rideIndex); - if (ride_are_all_possible_entrances_and_exits_built(ride)) + auto ride = get_ride(rideIndex); + if (ride != nullptr && ride_are_all_possible_entrances_and_exits_built(ride)) { tool_cancel(); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_NO_TRACK)) diff --git a/src/openrct2-ui/windows/NewCampaign.cpp b/src/openrct2-ui/windows/NewCampaign.cpp index 389865c347..37a0c789e2 100644 --- a/src/openrct2-ui/windows/NewCampaign.cpp +++ b/src/openrct2-ui/windows/NewCampaign.cpp @@ -94,19 +94,31 @@ static uint8_t window_new_campaign_shop_items[64]; static int32_t ride_value_compare(const void* a, const void* b) { - Ride *rideA, *rideB; + auto valueA = 0; + auto rideA = get_ride(*((uint8_t*)a)); + if (rideA != nullptr) + valueA = rideA->value; - rideA = get_ride(*((uint8_t*)a)); - rideB = get_ride(*((uint8_t*)b)); - return rideB->value - rideA->value; + auto valueB = 0; + auto rideB = get_ride(*((uint8_t*)b)); + if (rideB != nullptr) + valueB = rideB->value; + + return valueB - valueA; } static int32_t ride_name_compare(const void* a, const void* b) { + std::string rideAName; auto rideA = get_ride(*((uint8_t*)a)); + if (rideA != nullptr) + rideAName = rideA->GetName(); + + std::string rideBName; auto rideB = get_ride(*((uint8_t*)b)); - auto rideAName = rideA->GetName(); - auto rideBName = rideB->GetName(); + if (rideB != nullptr) + rideBName = rideB->GetName(); + return _strcmpi(rideAName.c_str(), rideBName.c_str()); } diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index ddd43940e3..6f8fac53ea 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1323,9 +1323,14 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo* dpi, rct_window* w) x = (widget->right - widget->left) / 2; y = (widget->bottom - widget->top) - 12; - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; - rct_ride_entry* rideEntry = ride->GetRideEntry(); if (rideEntry->flags & RIDE_ENTRY_FLAG_VEHICLE_TAB_SCALE_HALF) { clipDPI.zoom_level = 1; @@ -1689,6 +1694,8 @@ rct_window* window_ride_open_vehicle(rct_vehicle* vehicle) rct_vehicle* headVehicle = vehicle_get_head(vehicle); uint16_t headVehicleSpriteIndex = headVehicle->sprite_index; auto ride = get_ride(headVehicle->ride); + if (ride == nullptr) + return nullptr; // Get view index int32_t view = 1; @@ -2109,7 +2116,9 @@ static void window_ride_main_resize(rct_window* w) static void window_ride_show_view_dropdown(rct_window* w, rct_widget* widget) { rct_widget* dropdownWidget = widget - 1; - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; int32_t numItems = 1; if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_VEHICLES)) @@ -2222,6 +2231,9 @@ static void window_ride_show_open_dropdown(rct_window* w, rct_widget* widget) { RideStatusDropdownInfo info; info.Ride = get_ride(w->number); + if (info.Ride == nullptr) + return; + info.CurrentStatus = info.Ride->status; info.DefaultStatus = window_ride_get_next_default_status(info.Ride); window_ride_set_dropdown(info, RIDE_STATUS_CLOSED, STR_CLOSE_RIDE); @@ -2259,7 +2271,10 @@ static void populate_ride_type_dropdown() static void window_ride_show_ride_type_dropdown(rct_window* w, rct_widget* widget) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + populate_ride_type_dropdown(); for (size_t i = 0; i < RideDropdownData.size(); i++) @@ -2364,7 +2379,10 @@ static void populate_vehicle_type_dropdown(Ride* ride) static void window_ride_show_vehicle_type_dropdown(rct_window* w, rct_widget* widget) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + populate_vehicle_type_dropdown(ride); size_t numItems = std::min(VehicleDropdownData.size(), DROPDOWN_ITEMS_MAX_SIZE); @@ -2504,29 +2522,32 @@ static void window_ride_main_update(rct_window* w) widget_invalidate(w, WIDX_TAB_1); // Update status - Ride* ride = get_ride(w->number); - if (!(ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_MAIN)) + auto ride = get_ride(w->number); + if (ride != nullptr) { - if (w->ride.view == 0) - return; - - if (w->ride.view <= ride->num_vehicles) + if (!(ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_MAIN)) { - int32_t vehicleIndex = w->ride.view - 1; - uint16_t vehicleSpriteIndex = ride->vehicles[vehicleIndex]; - if (vehicleSpriteIndex == SPRITE_INDEX_NULL) + if (w->ride.view == 0) return; - rct_vehicle* vehicle = &(get_sprite(vehicleSpriteIndex)->vehicle); - if (vehicle->status != VEHICLE_STATUS_TRAVELLING && vehicle->status != VEHICLE_STATUS_TRAVELLING_CABLE_LIFT - && vehicle->status != VEHICLE_STATUS_TRAVELLING_DODGEMS && vehicle->status != VEHICLE_STATUS_TRAVELLING_BOAT) + if (w->ride.view <= ride->num_vehicles) { - return; + int32_t vehicleIndex = w->ride.view - 1; + uint16_t vehicleSpriteIndex = ride->vehicles[vehicleIndex]; + if (vehicleSpriteIndex == SPRITE_INDEX_NULL) + return; + + rct_vehicle* vehicle = &(get_sprite(vehicleSpriteIndex)->vehicle); + if (vehicle->status != VEHICLE_STATUS_TRAVELLING && vehicle->status != VEHICLE_STATUS_TRAVELLING_CABLE_LIFT + && vehicle->status != VEHICLE_STATUS_TRAVELLING_DODGEMS + && vehicle->status != VEHICLE_STATUS_TRAVELLING_BOAT) + { + return; + } } } + ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_MAIN; } - - ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_MAIN; widget_invalidate(w, WIDX_STATUS); } @@ -2573,7 +2594,10 @@ static void window_ride_main_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + w->disabled_widgets &= ~((1 << WIDX_DEMOLISH) | (1 << WIDX_CONSTRUCTION)); if (ride->lifecycle_flags & (RIDE_LIFECYCLE_INDESTRUCTIBLE | RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK)) w->disabled_widgets |= (1 << WIDX_DEMOLISH); @@ -2718,13 +2742,14 @@ static rct_string_id window_ride_get_status_overall_view(rct_window* w, void* ar */ static rct_string_id window_ride_get_status_vehicle(rct_window* w, void* arguments) { - Ride* ride; rct_vehicle* vehicle; int32_t vehicleIndex; uint16_t vehicleSpriteIndex; rct_string_id stringId; - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return 0; vehicleIndex = w->ride.view - 1; vehicleSpriteIndex = ride->vehicles[vehicleIndex]; @@ -2774,7 +2799,10 @@ static rct_string_id window_ride_get_status_vehicle(rct_window* w, void* argumen */ static rct_string_id window_ride_get_status_station(rct_window* w, void* arguments) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return STR_NONE; + int32_t count = w->ride.view - ride->num_vehicles - 1; int32_t stationIndex = -1; rct_string_id stringId = 0; @@ -2822,13 +2850,12 @@ static rct_string_id window_ride_get_status_station(rct_window* w, void* argumen */ static rct_string_id window_ride_get_status(rct_window* w, void* arguments) { - Ride* ride = get_ride(w->number); - + auto ride = get_ride(w->number); if (w->ride.view == 0) return window_ride_get_status_overall_view(w, arguments); - if (w->ride.view <= ride->num_vehicles) + if (ride != nullptr && w->ride.view <= ride->num_vehicles) return window_ride_get_status_vehicle(w, arguments); - if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) + if (ride != nullptr && ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) return window_ride_get_status_overall_view(w, arguments); return window_ride_get_status_station(w, arguments); } @@ -2839,7 +2866,6 @@ static rct_string_id window_ride_get_status(rct_window* w, void* arguments) */ static void window_ride_main_paint(rct_window* w, rct_drawpixelinfo* dpi) { - Ride* ride; rct_widget* widget; rct_string_id stringId; @@ -2855,7 +2881,10 @@ static void window_ride_main_paint(rct_window* w, rct_drawpixelinfo* dpi) } // View dropdown - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + stringId = STR_OVERALL_VIEW; if (w->ride.view != 0) { @@ -2930,7 +2959,9 @@ static void window_ride_vehicle_resize(rct_window* w) */ static void window_ride_vehicle_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; switch (widgetIndex) { @@ -3000,7 +3031,6 @@ static void window_ride_vehicle_update(rct_window* w) static void window_ride_vehicle_invalidate(rct_window* w) { rct_widget* widgets; - Ride* ride; rct_ride_entry* rideEntry; rct_string_id stringId; int32_t carsPerTrain; @@ -3014,7 +3044,10 @@ static void window_ride_vehicle_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; + rideEntry = ride->GetRideEntry(); w->widgets[WIDX_TITLE].text = STR_ARG_20_STRINGID; @@ -3101,19 +3134,19 @@ static void window_ride_vehicle_invalidate(rct_window* w) */ static void window_ride_vehicle_paint(rct_window* w, rct_drawpixelinfo* dpi) { - Ride* ride; - rct_ride_entry* rideEntry; - int32_t x, y; - int16_t factor; - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); - ride = get_ride(w->number); - rideEntry = ride->GetRideEntry(); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; - x = w->x + 8; - y = w->y + 64; + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; + + int32_t x = w->x + 8; + int32_t y = w->y + 64; // Description y += gfx_draw_string_left_wrapped(dpi, &rideEntry->naming.description, x, y, 300, STR_BLACK_STRING, COLOUR_BLACK); @@ -3123,7 +3156,7 @@ static void window_ride_vehicle_paint(rct_window* w, rct_drawpixelinfo* dpi) gfx_draw_string_left(dpi, STR_CAPACITY, &rideEntry->capacity, COLOUR_BLACK, x, y); // Excitement Factor - factor = rideEntry->excitement_multiplier; + auto factor = rideEntry->excitement_multiplier; if (factor > 0) { y += LIST_ROW_HEIGHT; @@ -3171,7 +3204,10 @@ static rct_vehicle_paintinfo _sprites_to_draw[144]; */ static void window_ride_vehicle_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + rct_ride_entry* rideEntry = ride->GetRideEntry(); // Background @@ -3261,7 +3297,9 @@ static void window_ride_vehicle_scrollpaint(rct_window* w, rct_drawpixelinfo* dp */ static void window_ride_mode_tweak_increase(rct_window* w) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; uint8_t maxValue = RideProperties[ride->type].max_value; uint8_t minValue = gCheatsFastLiftHill ? 0 : RideProperties[ride->type].min_value; @@ -3283,7 +3321,9 @@ static void window_ride_mode_tweak_increase(rct_window* w) */ static void window_ride_mode_tweak_decrease(rct_window* w) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; uint8_t maxValue = RideProperties[ride->type].max_value; uint8_t minValue = gCheatsFastLiftHill ? 0 : RideProperties[ride->type].min_value; @@ -3305,12 +3345,13 @@ static void window_ride_mode_tweak_decrease(rct_window* w) static void window_ride_mode_dropdown(rct_window* w, rct_widget* widget) { rct_widget* dropdownWidget; - Ride* ride; const uint8_t *availableModes, *mode; int32_t i, numAvailableModes; dropdownWidget = widget - 1; - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; // Seek to available modes for this ride availableModes = ride_seek_available_modes(ride); @@ -3349,13 +3390,12 @@ static void window_ride_mode_dropdown(rct_window* w, rct_widget* widget) */ static void window_ride_load_dropdown(rct_window* w, rct_widget* widget) { - rct_widget* dropdownWidget; - int32_t i; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; - dropdownWidget = widget - 1; - Ride* ride = get_ride(w->number); - - for (i = 0; i < 5; i++) + auto dropdownWidget = widget - 1; + for (auto i = 0; i < 5; i++) { gDropdownItemsFormat[i] = STR_DROPDOWN_MENU_LABEL; gDropdownItemsArgs[i] = VehicleLoadNames[i]; @@ -3373,9 +3413,9 @@ static void window_ride_load_dropdown(rct_window* w, rct_widget* widget) */ static void window_ride_operating_mouseup(rct_window* w, rct_widgetindex widgetIndex) { - Ride* ride; - - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; switch (widgetIndex) { @@ -3431,9 +3471,11 @@ static void window_ride_operating_resize(rct_window* w) */ static void window_ride_operating_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - Ride* ride = get_ride(w->number); - uint8_t upper_bound, lower_bound; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + uint8_t upper_bound, lower_bound; switch (widgetIndex) { case WIDX_MODE_TWEAK_INCREASE: @@ -3511,22 +3553,23 @@ static void window_ride_operating_mousedown(rct_window* w, rct_widgetindex widge */ static void window_ride_operating_dropdown(rct_window* w, rct_widgetindex widgetIndex, int32_t dropdownIndex) { - Ride* ride; - const uint8_t* availableModes; - if (dropdownIndex == -1) return; - ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; switch (widgetIndex) { case WIDX_MODE_DROPDOWN: + { // Seek to available modes for this ride - availableModes = ride_seek_available_modes(ride); - - set_operating_setting(w->number, RideSetSetting::Mode, availableModes[dropdownIndex]); + auto availableModes = ride_seek_available_modes(ride); + if (availableModes != nullptr) + set_operating_setting(w->number, RideSetSetting::Mode, availableModes[dropdownIndex]); break; + } case WIDX_LOAD_DROPDOWN: set_operating_setting( w->number, RideSetSetting::Departure, (ride->depart_flags & ~RIDE_DEPART_WAIT_FOR_LOAD_MASK) | dropdownIndex); @@ -3540,14 +3583,12 @@ static void window_ride_operating_dropdown(rct_window* w, rct_widgetindex widget */ static void window_ride_operating_update(rct_window* w) { - Ride* ride; - w->frame_no++; window_event_invalidate_call(w); widget_invalidate(w, WIDX_TAB_3); - ride = get_ride(w->number); - if (ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_OPERATING) + auto ride = get_ride(w->number); + if (ride != nullptr && ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_OPERATING) { ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_OPERATING; window_invalidate(w); @@ -3791,13 +3832,12 @@ static void window_ride_operating_invalidate(rct_window* w) */ static void window_ride_operating_paint(rct_window* w, rct_drawpixelinfo* dpi) { - Ride* ride; - uint16_t blockSections; - 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; // Horizontal rule between mode settings and depart settings gfx_fill_rect_inset( @@ -3808,7 +3848,7 @@ static void window_ride_operating_paint(rct_window* w, rct_drawpixelinfo* dpi) // Number of block sections if (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED) { - blockSections = ride->num_block_brakes + ride->num_stations; + auto blockSections = ride->num_block_brakes + ride->num_stations; gfx_draw_string_left( dpi, STR_BLOCK_SECTIONS, &blockSections, COLOUR_BLACK, w->x + 21, ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED ? w->y + 89 : w->y + 61); @@ -3916,12 +3956,13 @@ static void window_ride_maintenance_resize(rct_window* w) */ static void window_ride_maintenance_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - Ride* ride = get_ride(w->number); - rct_ride_entry* rideEntry = get_ride_entry(ride->subtype); - if (rideEntry == nullptr) - { + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) return; - } rct_widget* dropdownWidget = widget; int32_t j, num_items; @@ -4023,9 +4064,13 @@ static void window_ride_maintenance_dropdown(rct_window* w, rct_widgetindex widg if (dropdownIndex == -1) return; - rct_vehicle* vehicle; - Ride* ride = get_ride(w->number); - rct_ride_entry* rideEntry = get_ride_entry(ride->subtype); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; switch (widgetIndex) { @@ -4036,6 +4081,7 @@ static void window_ride_maintenance_dropdown(rct_window* w, rct_widgetindex widg case WIDX_FORCE_BREAKDOWN: if (dropdownIndex == 0) { + rct_vehicle* vehicle; switch (ride->breakdown_reason_pending) { case BREAKDOWN_SAFETY_CUT_OUT: @@ -4118,14 +4164,12 @@ static void window_ride_maintenance_dropdown(rct_window* w, rct_widgetindex widg */ static void window_ride_maintenance_update(rct_window* w) { - Ride* ride; - w->frame_no++; window_event_invalidate_call(w); widget_invalidate(w, WIDX_TAB_4); - ride = get_ride(w->number); - if (ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_MAINTENANCE) + auto ride = get_ride(w->number); + if (ride != nullptr && ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_MAINTENANCE) { ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_MAINTENANCE; window_invalidate(w); @@ -4138,9 +4182,7 @@ static void window_ride_maintenance_update(rct_window* w) */ static void window_ride_maintenance_invalidate(rct_window* w) { - rct_widget* widgets; - - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -4149,7 +4191,9 @@ static void window_ride_maintenance_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; ride->FormatNameTo(gCommonFormatArgs); @@ -4188,7 +4232,9 @@ static void window_ride_maintenance_paint(rct_window* w, rct_drawpixelinfo* dpi) window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; // Locate mechanic button image rct_widget* widget = &window_ride_maintenance_widgets[WIDX_LOCATE_MECHANIC]; @@ -4422,18 +4468,20 @@ static void window_ride_colour_resize(rct_window* w) */ static void window_ride_colour_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - Ride* ride; - uint16_t colourSchemeIndex; vehicle_colour vehicleColour; - rct_widget* dropdownWidget; - rct_ride_entry* rideEntry; int32_t i, numItems; rct_string_id stringId; - ride = get_ride(w->number); - rideEntry = ride->GetRideEntry(); - colourSchemeIndex = w->ride_colour; - dropdownWidget = widget - 1; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; + + auto colourSchemeIndex = w->ride_colour; + auto dropdownWidget = widget - 1; switch (widgetIndex) { @@ -4912,11 +4960,10 @@ static void window_ride_colour_paint(rct_window* w, rct_drawpixelinfo* dpi) // TODO: This should use lists and identified sprites rct_drawpixelinfo clippedDpi; rct_widget* widget; - Ride* ride; - rct_ride_entry* rideEntry; - ride = get_ride(w->number); - rideEntry = ride->GetRideEntry(); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -4931,7 +4978,8 @@ static void window_ride_colour_paint(rct_window* w, rct_drawpixelinfo* dpi) auto trackColour = ride_get_track_colour(ride, w->ride_colour); // - if (rideEntry->shop_item == SHOP_ITEM_NONE) + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr || rideEntry->shop_item == SHOP_ITEM_NONE) { int32_t x = w->x + widget->left; int32_t y = w->y + widget->top; @@ -5018,27 +5066,27 @@ static void window_ride_colour_paint(rct_window* w, rct_drawpixelinfo* dpi) */ static void window_ride_colour_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex) { - Ride* ride; - rct_ride_entry* rideEntry; - rct_widget* vehiclePreviewWidget; - int32_t trainCarIndex, x, y, spriteIndex; - vehicle_colour vehicleColour; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; - ride = get_ride(w->number); - rideEntry = ride->GetRideEntry(); - vehiclePreviewWidget = &window_ride_colour_widgets[WIDX_VEHICLE_PREVIEW]; - vehicleColour = ride_get_vehicle_colour(ride, w->vehicleIndex); + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; + + auto vehiclePreviewWidget = &window_ride_colour_widgets[WIDX_VEHICLE_PREVIEW]; + auto vehicleColour = ride_get_vehicle_colour(ride, w->vehicleIndex); // Background colour gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, PALETTE_INDEX_12); // ? - x = (vehiclePreviewWidget->right - vehiclePreviewWidget->left) / 2; - y = vehiclePreviewWidget->bottom - vehiclePreviewWidget->top - 15; + int32_t x = (vehiclePreviewWidget->right - vehiclePreviewWidget->left) / 2; + int32_t y = vehiclePreviewWidget->bottom - vehiclePreviewWidget->top - 15; // ? - trainCarIndex = (ride->colour_scheme_type & 3) == RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR ? w->vehicleIndex - : rideEntry->tab_vehicle; + auto trainCarIndex = (ride->colour_scheme_type & 3) == RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR ? w->vehicleIndex + : rideEntry->tab_vehicle; rct_ride_entry_vehicle* rideVehicleEntry = &rideEntry->vehicles[ride_entry_get_vehicle_at_position( ride->subtype, ride->num_cars_per_train, trainCarIndex)]; @@ -5046,7 +5094,7 @@ static void window_ride_colour_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi y += rideVehicleEntry->tab_height; // Draw the coloured spinning vehicle - spriteIndex = (rideVehicleEntry->flags & VEHICLE_ENTRY_FLAG_11) ? w->frame_no / 4 : w->frame_no / 2; + uint32_t spriteIndex = (rideVehicleEntry->flags & VEHICLE_ENTRY_FLAG_11) ? w->frame_no / 4 : w->frame_no / 2; spriteIndex &= rideVehicleEntry->rotation_frame_mask; spriteIndex *= rideVehicleEntry->base_num_frames; spriteIndex += rideVehicleEntry->base_image_id; @@ -5076,10 +5124,12 @@ static uint8_t window_ride_current_music_style_order[42]; */ static void window_ride_toggle_music(rct_window* w) { - Ride* ride = get_ride(w->number); - - int32_t activateMusic = (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC) ? 0 : 1; - set_operating_setting(w->number, RideSetSetting::Music, activateMusic); + auto ride = get_ride(w->number); + if (ride != nullptr) + { + int32_t activateMusic = (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC) ? 0 : 1; + set_operating_setting(w->number, RideSetSetting::Music, activateMusic); + } } /** @@ -5127,14 +5177,13 @@ static void window_ride_music_resize(rct_window* w) */ static void window_ride_music_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - rct_widget* dropdownWidget; - int32_t i; - if (widgetIndex != WIDX_MUSIC_DROPDOWN) return; - dropdownWidget = widget - 1; - Ride* ride = get_ride(w->number); + auto dropdownWidget = widget - 1; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; int32_t numItems = 0; if (ride->type == RIDE_TYPE_MERRY_GO_ROUND) @@ -5152,7 +5201,7 @@ static void window_ride_music_mousedown(rct_window* w, rct_widgetindex widgetInd window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_2; } - for (i = 0; i < numItems; i++) + for (auto i = 0; i < numItems; i++) { gDropdownItemsFormat[i] = STR_DROPDOWN_MENU_LABEL; gDropdownItemsArgs[i] = MusicStyleNames[window_ride_current_music_style_order[i]]; @@ -5162,7 +5211,7 @@ static void window_ride_music_mousedown(rct_window* w, rct_widgetindex widgetInd w->x + dropdownWidget->left, w->y + dropdownWidget->top, dropdownWidget->bottom - dropdownWidget->top + 1, w->colours[1], 0, DROPDOWN_FLAG_STAY_OPEN, numItems, widget->right - dropdownWidget->left); - for (i = 0; i < numItems; i++) + for (auto i = 0; i < numItems; i++) { if (window_ride_current_music_style_order[i] == ride->music) { @@ -5203,10 +5252,7 @@ static void window_ride_music_update(rct_window* w) */ static void window_ride_music_invalidate(rct_window* w) { - rct_widget* widgets; - int32_t isMusicActivated; - - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -5215,14 +5261,17 @@ static void window_ride_music_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + ride->FormatNameTo(gCommonFormatArgs); // Set selected music window_ride_music_widgets[WIDX_MUSIC].text = MusicStyleNames[ride->music]; // Set music activated - isMusicActivated = ride->lifecycle_flags & (RIDE_LIFECYCLE_MUSIC); + auto isMusicActivated = (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC) != 0; if (isMusicActivated) { w->pressed_widgets |= (1 << WIDX_PLAY_MUSIC); @@ -5417,7 +5466,9 @@ static void window_ride_measurements_mousedown(rct_window* w, rct_widgetindex wi if (widgetIndex != WIDX_SAVE_TRACK_DESIGN) return; - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; gDropdownItemsFormat[0] = STR_SAVE_TRACK_DESIGN_ITEM; gDropdownItemsFormat[1] = STR_SAVE_TRACK_DESIGN_WITH_SCENERY_ITEM; @@ -5531,9 +5582,7 @@ static void window_ride_measurements_toolabort(rct_window* w, rct_widgetindex wi */ static void window_ride_measurements_invalidate(rct_window* w) { - rct_widget* widgets; - - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -5542,7 +5591,10 @@ static void window_ride_measurements_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + ride->FormatNameTo(gCommonFormatArgs); window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].tooltip = STR_SAVE_TRACK_DESIGN_NOT_POSSIBLE; @@ -5976,11 +6028,7 @@ static void window_ride_graphs_tooltip(rct_window* w, rct_widgetindex widgetInde */ static void window_ride_graphs_invalidate(rct_window* w) { - rct_widget* widgets; - Ride* ride; - int32_t x, y; - - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -5989,7 +6037,10 @@ static void window_ride_graphs_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); // Set pressed graph button type @@ -6012,8 +6063,8 @@ static void window_ride_graphs_invalidate(rct_window* w) } // Anchor graph widget - x = w->width - 4; - y = w->height - 18; + auto x = w->width - 4; + auto y = w->height - 18; window_ride_graphs_widgets[WIDX_GRAPH].right = x; window_ride_graphs_widgets[WIDX_GRAPH].bottom = y; @@ -6238,22 +6289,28 @@ static void update_same_price_throughout_flags(uint32_t shop_item) */ static void window_ride_income_toggle_primary_price(rct_window* w) { - Ride* ride; - rct_ride_entry* rideEntry; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + uint32_t shop_item; - - ride = get_ride(w->number); - rideEntry = get_ride_entry(ride->subtype); - if (ride->type == RIDE_TYPE_TOILETS) { shop_item = SHOP_ITEM_ADMISSION; } else { - shop_item = rideEntry->shop_item; - if (shop_item == 0xFFFF) + auto rideEntry = get_ride_entry(ride->subtype); + if (rideEntry != nullptr) + { + shop_item = rideEntry->shop_item; + if (shop_item == 0xFFFF) + return; + } + else + { return; + } } update_same_price_throughout_flags(shop_item); @@ -6268,14 +6325,15 @@ static void window_ride_income_toggle_primary_price(rct_window* w) */ static void window_ride_income_toggle_secondary_price(rct_window* w) { - Ride* ride; - rct_ride_entry* rideEntry; - uint32_t shop_item; + auto ride = get_ride(w->number); + if (ride == nullptr) + return; - ride = get_ride(w->number); - rideEntry = get_ride_entry(ride->subtype); + auto rideEntry = get_ride_entry(ride->subtype); + if (rideEntry == nullptr) + return; - shop_item = rideEntry->shop_item_secondary; + auto shop_item = rideEntry->shop_item_secondary; if (shop_item == SHOP_ITEM_NONE) shop_item = RidePhotoItems[ride->type]; @@ -6300,7 +6358,10 @@ static void window_ride_income_increase_primary_price(rct_window* w) if (!window_ride_income_can_modify_primary_price(w)) return; - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + money16 price = ride->price; if (price < MONEY(20, 00)) price++; @@ -6317,7 +6378,10 @@ static void window_ride_income_decrease_primary_price(rct_window* w) if (!window_ride_income_can_modify_primary_price(w)) return; - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; + money16 price = ride->price; if (price > MONEY(0, 00)) price--; @@ -6327,7 +6391,10 @@ static void window_ride_income_decrease_primary_price(rct_window* w) static money16 window_ride_income_get_secondary_price(rct_window* w) { - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return 0; + money16 price = ride->price_secondary; return price; } @@ -6340,10 +6407,13 @@ static void window_ride_income_set_secondary_price(rct_window* w, money16 price) static bool window_ride_income_can_modify_primary_price(rct_window* w) { - Ride* ride = get_ride(w->number); - rct_ride_entry* rideEntry = get_ride_entry(ride->subtype); + auto ride = get_ride(w->number); + if (ride == nullptr) + return false; - return park_ride_prices_unlocked() || ride->type == RIDE_TYPE_TOILETS || rideEntry->shop_item != SHOP_ITEM_NONE; + auto rideEntry = ride->GetRideEntry(); + return park_ride_prices_unlocked() || ride->type == RIDE_TYPE_TOILETS + || (rideEntry != nullptr && rideEntry->shop_item != SHOP_ITEM_NONE); } /** @@ -6402,11 +6472,13 @@ static void window_ride_income_mouseup(rct_window* w, rct_widgetindex widgetInde if (!window_ride_income_can_modify_primary_price(w)) return; - Ride* ride = get_ride(w->number); - - money_to_string((money32)ride->price, _moneyInputText, MONEY_STRING_MAXLENGTH, true); - window_text_input_raw_open( - w, WIDX_PRIMARY_PRICE, STR_ENTER_NEW_VALUE, STR_ENTER_NEW_VALUE, _moneyInputText, MONEY_STRING_MAXLENGTH); + auto ride = get_ride(w->number); + if (ride != nullptr) + { + money_to_string((money32)ride->price, _moneyInputText, MONEY_STRING_MAXLENGTH, true); + window_text_input_raw_open( + w, WIDX_PRIMARY_PRICE, STR_ENTER_NEW_VALUE, STR_ENTER_NEW_VALUE, _moneyInputText, MONEY_STRING_MAXLENGTH); + } break; } case WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK: @@ -6465,14 +6537,12 @@ static void window_ride_income_mousedown(rct_window* w, rct_widgetindex widgetIn */ static void window_ride_income_update(rct_window* w) { - Ride* ride; - w->frame_no++; window_event_invalidate_call(w); widget_invalidate(w, WIDX_TAB_9); - ride = get_ride(w->number); - if (ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_INCOME) + auto ride = get_ride(w->number); + if (ride != nullptr && ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_INCOME) { ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_INCOME; window_invalidate(w); @@ -6509,11 +6579,7 @@ static void window_ride_income_textinput(rct_window* w, rct_widgetindex widgetIn */ static void window_ride_income_invalidate(rct_window* w) { - rct_widget* widgets; - rct_ride_entry* rideEntry; - int32_t primaryItem, secondaryItem; - - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -6522,12 +6588,16 @@ static void window_ride_income_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - Ride* ride = get_ride(w->number); + auto ride = get_ride(w->number); + if (ride == nullptr) + return; w->widgets[WIDX_TITLE].text = STR_ARG_14_STRINGID; ride->FormatNameTo(gCommonFormatArgs + 14); - rideEntry = ride->GetRideEntry(); + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return; // Primary item w->pressed_widgets &= ~(1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); @@ -6554,7 +6624,7 @@ static void window_ride_income_invalidate(rct_window* w) if (ridePrimaryPrice == 0) window_ride_income_widgets[WIDX_PRIMARY_PRICE].text = STR_FREE; - primaryItem = SHOP_ITEM_ADMISSION; + uint8_t primaryItem = SHOP_ITEM_ADMISSION; if (ride->type == RIDE_TYPE_TOILETS || ((primaryItem = rideEntry->shop_item) != SHOP_ITEM_NONE)) { window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_CHECKBOX; @@ -6566,7 +6636,7 @@ static void window_ride_income_invalidate(rct_window* w) } // Get secondary item - secondaryItem = RidePhotoItems[ride->type]; + auto secondaryItem = RidePhotoItems[ride->type]; if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO)) { if ((secondaryItem = rideEntry->shop_item_secondary) != SHOP_ITEM_NONE) @@ -6615,8 +6685,6 @@ static void window_ride_income_invalidate(rct_window* w) */ static void window_ride_income_paint(rct_window* w, rct_drawpixelinfo* dpi) { - Ride* ride; - rct_ride_entry* rideEntry; rct_string_id stringId; money32 profit, costPerHour; int32_t x, y, primaryItem, secondaryItem; @@ -6624,8 +6692,13 @@ static void window_ride_income_paint(rct_window* w, rct_drawpixelinfo* dpi) window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, 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; x = w->x + window_ride_income_widgets[WIDX_PAGE_BACKGROUND].left + 4; y = w->y + window_ride_income_widgets[WIDX_PAGE_BACKGROUND].top + 33; @@ -6764,8 +6837,6 @@ static void window_ride_customer_resize(rct_window* w) */ static void window_ride_customer_update(rct_window* w) { - Ride* ride; - w->var_492++; if (w->var_492 >= 24) w->var_492 = 0; @@ -6773,8 +6844,8 @@ static void window_ride_customer_update(rct_window* w) window_event_invalidate_call(w); widget_invalidate(w, WIDX_TAB_10); - ride = get_ride(w->number); - if (ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_CUSTOMER) + auto ride = get_ride(w->number); + if (ride != nullptr && ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_CUSTOMER) { ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_CUSTOMER; window_invalidate(w); @@ -6787,9 +6858,7 @@ static void window_ride_customer_update(rct_window* w) */ static void window_ride_customer_invalidate(rct_window* w) { - rct_widget* widgets; - - widgets = window_ride_page_widgets[w->page]; + auto widgets = window_ride_page_widgets[w->page]; if (w->widgets != widgets) { w->widgets = widgets; @@ -6798,23 +6867,26 @@ static void window_ride_customer_invalidate(rct_window* w) window_ride_set_pressed_tab(w); - Ride* ride = get_ride(w->number); - ride->FormatNameTo(gCommonFormatArgs); - - window_ride_customer_widgets[WIDX_SHOW_GUESTS_THOUGHTS].type = WWT_FLATBTN; - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + auto ride = get_ride(w->number); + if (ride != nullptr) { - window_ride_customer_widgets[WIDX_SHOW_GUESTS_ON_RIDE].type = WWT_EMPTY; - window_ride_customer_widgets[WIDX_SHOW_GUESTS_QUEUING].type = WWT_EMPTY; - } - else - { - window_ride_customer_widgets[WIDX_SHOW_GUESTS_ON_RIDE].type = WWT_FLATBTN; - window_ride_customer_widgets[WIDX_SHOW_GUESTS_QUEUING].type = WWT_FLATBTN; - } + ride->FormatNameTo(gCommonFormatArgs); - window_ride_anchor_border_widgets(w); - window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); + window_ride_customer_widgets[WIDX_SHOW_GUESTS_THOUGHTS].type = WWT_FLATBTN; + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + { + window_ride_customer_widgets[WIDX_SHOW_GUESTS_ON_RIDE].type = WWT_EMPTY; + window_ride_customer_widgets[WIDX_SHOW_GUESTS_QUEUING].type = WWT_EMPTY; + } + else + { + window_ride_customer_widgets[WIDX_SHOW_GUESTS_ON_RIDE].type = WWT_FLATBTN; + window_ride_customer_widgets[WIDX_SHOW_GUESTS_QUEUING].type = WWT_FLATBTN; + } + + window_ride_anchor_border_widgets(w); + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); + } } /** diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 1794868de9..888db0fd6f 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -522,8 +522,9 @@ rct_window* window_ride_construction_open() ride_id_t rideIndex = _currentRideIndex; close_ride_window_for_construction(rideIndex); - rct_window* w; - Ride* ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return nullptr; _stationConstructed = ride->num_stations != 0; _deferClose = false; @@ -533,7 +534,7 @@ rct_window* window_ride_construction_open() return context_open_window_view(WV_MAZE_CONSTRUCTION); } - w = window_create(0, 29, 166, 394, &window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_NO_AUTO_CLOSE); + auto w = window_create(0, 29, 166, 394, &window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_NO_AUTO_CLOSE); w->widgets = window_ride_construction_widgets; w->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | (1ULL << WIDX_LEFT_CURVE_SMALL) @@ -1950,8 +1951,12 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) } else { - _stationConstructed = get_ride(w->number)->num_stations != 0; - window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type); + auto ride = get_ride(w->number); + if (ride != nullptr) + { + _stationConstructed = ride->num_stations != 0; + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type); + } } }); @@ -1980,7 +1985,7 @@ static void window_ride_construction_entrance_click(rct_window* w) if (tool_set(w, WIDX_ENTRANCE, TOOL_CROSSHAIR)) { auto ride = get_ride(_currentRideIndex); - if (!ride_try_get_origin_element(ride, nullptr)) + if (ride != nullptr && !ride_try_get_origin_element(ride, nullptr)) { ride_initialise_construction_window(ride); } @@ -2037,7 +2042,9 @@ static void window_ride_construction_exit_click(rct_window* w) */ static void window_ride_construction_update(rct_window* w) { - Ride* ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; // Close construction window if ride is not closed, // editing ride while open will cause many issues until properly handled @@ -2338,12 +2345,11 @@ static void window_ride_construction_draw_track_piece( rct_window* w, rct_drawpixelinfo* dpi, ride_id_t rideIndex, int32_t trackType, int32_t trackDirection, int32_t unknown, int32_t width, int32_t height) { - const rct_preview_track* trackBlock; - Ride* ride; + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; - ride = get_ride(rideIndex); - - trackBlock = get_track_def_from_ride(ride, trackType); + auto trackBlock = get_track_def_from_ride(ride, trackType); while ((trackBlock + 1)->index != 0xFF) trackBlock++; @@ -2395,13 +2401,12 @@ static void sub_6CBCE2( rct_drawpixelinfo* dpi, ride_id_t rideIndex, int32_t trackType, int32_t trackDirection, int32_t edx, int32_t originX, int32_t originY, int32_t originZ) { - Ride* ride; - const rct_preview_track* trackBlock; - paint_session* session = paint_session_alloc(dpi, 0); trackDirection &= 3; - ride = get_ride(rideIndex); + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return; int16_t preserveMapSizeUnits = gMapSizeUnits; int16_t preserveMapSizeMinus2 = gMapSizeMinus2; @@ -2413,7 +2418,7 @@ static void sub_6CBCE2( gMapSize = 256; gMapSizeMaxXY = (256 * 32) - 1; - trackBlock = get_track_def_from_ride(ride, trackType); + auto trackBlock = get_track_def_from_ride(ride, trackType); while (trackBlock->index != 255) { auto quarterTile = trackBlock->var_08.Rotate(trackDirection); @@ -2518,14 +2523,16 @@ void window_ride_construction_update_active_elements_impl() */ void window_ride_construction_update_enabled_track_pieces() { - Ride* ride = get_ride(_currentRideIndex); - rct_ride_entry* rideEntry = ride->GetRideEntry(); - int32_t rideType = (_currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE) ? RideData4[ride->type].alternate_type - : ride->type; + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; + auto rideEntry = ride->GetRideEntry(); if (rideEntry == nullptr) return; + int32_t rideType = (_currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE) ? RideData4[ride->type].alternate_type + : ride->type; if (gCheatsEnableAllDrawableTrackPieces) { _enabledRidePieces = RideTypePossibleTrackConfigurations[rideType]; @@ -3362,14 +3369,14 @@ static void window_ride_construction_show_special_track_dropdown(rct_window* w, rct_string_id trackPieceStringId = RideConfigurationStringIds[trackPiece]; if (trackPieceStringId == STR_RAPIDS) { - Ride* ride = get_ride(_currentRideIndex); - if (ride->type == RIDE_TYPE_CAR_RIDE) + auto ride = get_ride(_currentRideIndex); + if (ride != nullptr && ride->type == RIDE_TYPE_CAR_RIDE) trackPieceStringId = STR_LOG_BUMPS; } if (trackPieceStringId == STR_SPINNING_CONTROL_TOGGLE_TRACK) { - Ride* ride = get_ride(_currentRideIndex); - if (ride->type != RIDE_TYPE_STEEL_WILD_MOUSE) + auto ride = get_ride(_currentRideIndex); + if (ride != nullptr && ride->type != RIDE_TYPE_STEEL_WILD_MOUSE) trackPieceStringId = STR_BOOSTER; } gDropdownItemsFormat[i] = trackPieceStringId; @@ -3755,7 +3762,10 @@ void ride_construction_tooldown_construct(int32_t screenX, int32_t screenY) tool_cancel(); - Ride* ride = get_ride(_currentRideIndex); + auto ride = get_ride(_currentRideIndex); + if (ride == nullptr) + return; + if (_trackPlaceZ == 0) { const rct_preview_track* trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); @@ -3927,8 +3937,8 @@ static void ride_construction_tooldown_entrance_exit(int32_t screenX, int32_t sc audio_play_sound_at_location(SoundId::PlaceItem, result->Position.x, result->Position.y, result->Position.z); - Ride* ride = get_ride(gRideEntranceExitPlaceRideIndex); - if (ride_are_all_possible_entrances_and_exits_built(ride)) + auto ride = get_ride(gRideEntranceExitPlaceRideIndex); + if (ride != nullptr && ride_are_all_possible_entrances_and_exits_built(ride)) { tool_cancel(); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_NO_TRACK)) diff --git a/src/openrct2-ui/windows/RideList.cpp b/src/openrct2-ui/windows/RideList.cpp index 63fd250119..202dbf4f1e 100644 --- a/src/openrct2-ui/windows/RideList.cpp +++ b/src/openrct2-ui/windows/RideList.cpp @@ -798,11 +798,14 @@ void window_ride_list_refresh_list(rct_window* w) while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - auto strB = otherRide->GetName(); - if (_strcmpi(strA.c_str(), strB.c_str()) >= 0) - break; + if (otherRide != nullptr) + { + auto strB = otherRide->GetName(); + if (_strcmpi(strA.c_str(), strB.c_str()) >= 0) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; } @@ -810,140 +813,182 @@ void window_ride_list_refresh_list(rct_window* w) while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->popularity * 4 <= otherRide->popularity * 4) - break; + if (otherRide != nullptr) + { + if (ride->popularity * 4 <= otherRide->popularity * 4) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_SATISFACTION: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->satisfaction * 5 <= otherRide->satisfaction * 5) - break; + if (otherRide != nullptr) + { + if (ride->satisfaction * 5 <= otherRide->satisfaction * 5) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_PROFIT: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->profit <= otherRide->profit) - break; + if (otherRide != nullptr) + { + if (ride->profit <= otherRide->profit) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_TOTAL_CUSTOMERS: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->total_customers <= otherRide->total_customers) - break; + if (otherRide != nullptr) + { + if (ride->total_customers <= otherRide->total_customers) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_TOTAL_PROFIT: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->total_profit <= otherRide->total_profit) - break; + if (otherRide != nullptr) + { + if (ride->total_profit <= otherRide->total_profit) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_CUSTOMERS: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride_customers_per_hour(ride) <= ride_customers_per_hour(otherRide)) - break; + if (otherRide != nullptr) + { + if (ride_customers_per_hour(ride) <= ride_customers_per_hour(otherRide)) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_AGE: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->build_date <= otherRide->build_date) - break; + if (otherRide != nullptr) + { + if (ride->build_date <= otherRide->build_date) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_INCOME: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->income_per_hour <= otherRide->income_per_hour) - break; + if (otherRide != nullptr) + { + if (ride->income_per_hour <= otherRide->income_per_hour) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_RUNNING_COST: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->upkeep_cost <= otherRide->upkeep_cost) - break; + if (otherRide != nullptr) + { + if (ride->upkeep_cost <= otherRide->upkeep_cost) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_QUEUE_LENGTH: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->GetTotalQueueLength() <= otherRide->GetTotalQueueLength()) - break; + if (otherRide != nullptr) + { + if (ride->GetTotalQueueLength() <= otherRide->GetTotalQueueLength()) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_QUEUE_TIME: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->GetMaxQueueTime() <= otherRide->GetMaxQueueTime()) - break; + if (otherRide != nullptr) + { + if (ride->GetMaxQueueTime() <= otherRide->GetMaxQueueTime()) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_RELIABILITY: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->reliability_percentage <= otherRide->reliability_percentage) - break; + if (otherRide != nullptr) + { + if (ride->reliability_percentage <= otherRide->reliability_percentage) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_DOWN_TIME: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->downtime <= otherRide->downtime) - break; + if (otherRide != nullptr) + { + if (ride->downtime <= otherRide->downtime) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; case INFORMATION_TYPE_GUESTS_FAVOURITE: while (--current_list_position >= 0) { auto otherRide = get_ride(w->list_item_positions[current_list_position]); - if (ride->guests_favourite <= otherRide->guests_favourite) - break; + if (otherRide != nullptr) + { + if (ride->guests_favourite <= otherRide->guests_favourite) + break; - window_bubble_list_item(w, current_list_position); + window_bubble_list_item(w, current_list_position); + } } break; } diff --git a/src/openrct2-ui/windows/Sign.cpp b/src/openrct2-ui/windows/Sign.cpp index 5ebb84db46..dab9883dcb 100644 --- a/src/openrct2-ui/windows/Sign.cpp +++ b/src/openrct2-ui/windows/Sign.cpp @@ -370,8 +370,8 @@ static void window_sign_viewport_rotate(rct_window* w) viewport_create( w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); - - w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; + if (w->viewport != nullptr) + w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; window_invalidate(w); } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 6fea408d8d..b8f8872b85 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -4416,12 +4416,19 @@ static rct_vehicle* vehicle_create_car( ride_id_t rideIndex, int32_t vehicleEntryIndex, int32_t carIndex, int32_t vehicleIndex, int32_t x, int32_t y, int32_t z, int32_t* remainingDistance, TileElement* tileElement) { - Ride* ride = get_ride(rideIndex); - rct_ride_entry* rideEntry = get_ride_entry(ride->subtype); - rct_ride_entry_vehicle* vehicleEntry = &rideEntry->vehicles[vehicleEntryIndex]; - int32_t edx; + auto ride = get_ride(rideIndex); + if (ride == nullptr) + return nullptr; + + auto rideEntry = ride->GetRideEntry(); + if (rideEntry == nullptr) + return nullptr; + + auto vehicleEntry = &rideEntry->vehicles[vehicleEntryIndex]; + auto vehicle = &create_sprite(SPRITE_IDENTIFIER_VEHICLE)->vehicle; + if (vehicle == nullptr) + return nullptr; - rct_vehicle* vehicle = &create_sprite(SPRITE_IDENTIFIER_VEHICLE)->vehicle; vehicle->sprite_identifier = SPRITE_IDENTIFIER_VEHICLE; vehicle->ride = rideIndex; vehicle->ride_subtype = ride->subtype; @@ -4429,7 +4436,7 @@ static rct_vehicle* vehicle_create_car( vehicle->vehicle_type = vehicleEntryIndex; vehicle->type = carIndex == 0 ? VEHICLE_TYPE_HEAD : VEHICLE_TYPE_TAIL; vehicle->var_44 = ror32(vehicleEntry->spacing, 10) & 0xFFFF; - edx = vehicleEntry->spacing >> 1; + auto edx = vehicleEntry->spacing >> 1; *remainingDistance -= edx; vehicle->remaining_distance = *remainingDistance; if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_GO_KART)) @@ -4615,9 +4622,11 @@ static train_ref vehicle_create_train( { for (int32_t carIndex = 0; carIndex < ride->num_cars_per_train; carIndex++) { - const uint8_t vehicle = ride_entry_get_vehicle_at_position(ride->subtype, ride->num_cars_per_train, carIndex); - rct_vehicle* car = vehicle_create_car( - rideIndex, vehicle, carIndex, vehicleIndex, x, y, z, remainingDistance, tileElement); + auto vehicle = ride_entry_get_vehicle_at_position(ride->subtype, ride->num_cars_per_train, carIndex); + auto car = vehicle_create_car(rideIndex, vehicle, carIndex, vehicleIndex, x, y, z, remainingDistance, tileElement); + if (car == nullptr) + break; + if (carIndex == 0) { train.head = car; diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index f8bb671c56..afe3ca12dc 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -1147,12 +1147,15 @@ int32_t track_get_actual_bank_2(int32_t rideType, bool isInverted, int32_t bank) int32_t track_get_actual_bank_3(rct_vehicle* vehicle, TileElement* tileElement) { + auto trackType = tileElement->AsTrack()->GetTrackType(); + auto bankStart = TrackDefinitions[trackType].bank_start; + auto ride = get_ride(tileElement->AsTrack()->GetRideIndex()); + if (ride == nullptr) + return bankStart; + bool isInverted = ((vehicle->update_flags & VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES) > 0) ^ tileElement->AsTrack()->IsInverted(); - int32_t trackType = tileElement->AsTrack()->GetTrackType(); - int32_t rideType = get_ride(tileElement->AsTrack()->GetRideIndex())->type; - int32_t bankStart = TrackDefinitions[trackType].bank_start; - return track_get_actual_bank_2(rideType, isInverted, bankStart); + return track_get_actual_bank_2(ride->type, isInverted, bankStart); } bool track_element_is_station(TileElement* trackElement) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 34fe6ade9f..b00c5825f8 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1933,9 +1933,6 @@ static SoundIdVolume sub_6D7AC0(SoundId currentSoundId, uint8_t currentVolume, S */ static void vehicle_update(rct_vehicle* vehicle) { - Ride* ride; - rct_ride_entry* rideEntry; - // The cable lift uses the ride type of NULL if (vehicle->ride_subtype == RIDE_TYPE_NULL) { @@ -1943,11 +1940,14 @@ static void vehicle_update(rct_vehicle* vehicle) return; } - rideEntry = get_ride_entry(vehicle->ride_subtype); + auto rideEntry = get_ride_entry(vehicle->ride_subtype); + if (rideEntry == nullptr) + return; - rct_ride_entry_vehicle* vehicleEntry = &rideEntry->vehicles[vehicle->vehicle_type]; + auto ride = get_ride(vehicle->ride); + if (ride == nullptr) + return; - ride = get_ride(vehicle->ride); if (vehicle->update_flags & VEHICLE_UPDATE_FLAG_TESTING) vehicle_update_measurements(vehicle); @@ -1955,6 +1955,7 @@ static void vehicle_update(rct_vehicle* vehicle) if (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN)) { _vehicleBreakdown = ride->breakdown_reason_pending; + auto vehicleEntry = &rideEntry->vehicles[vehicle->vehicle_type]; if ((vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED) && ride->breakdown_reason_pending == BREAKDOWN_SAFETY_CUT_OUT) { if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_WATER_RIDE)