Add nullptr checks for get_ride in libopenrct2ui (#9795)

This commit is contained in:
Ted John 2019-08-09 08:06:25 +01:00 committed by GitHub
parent ab7b17fc4e
commit 93789b9034
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 528 additions and 361 deletions

View File

@ -372,18 +372,14 @@ public:
case INTENT_ACTION_INVALIDATE_VEHICLE_WINDOW:
{
rct_vehicle* vehicle = static_cast<rct_vehicle*>(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<rct_vehicle*>(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])

View File

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

View File

@ -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);
if (w->viewport != nullptr)
w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0;
window_invalidate(w);
}

View File

@ -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]);
auto ride = get_ride(w->list_item_positions[i]);
if (ride != nullptr)
{
ride->lifecycle_flags ^= RIDE_LIFECYCLE_INDESTRUCTIBLE;
}
window_invalidate(w);
}
@ -1165,6 +1165,8 @@ 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 != nullptr)
{
if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE)
{
gCurrentFontSpriteBase = stringId == STR_WINDOW_COLOUR_2_STRINGID ? FONT_SPRITE_BASE_MEDIUM_EXTRA_DARK
@ -1177,6 +1179,7 @@ static void window_editor_objective_options_rides_scrollpaint(rct_window* w, rct
ride->FormatNameTo(args);
gfx_draw_string_left(dpi, stringId, args, COLOUR_BLACK, 15, y);
}
}
}
/**

View File

@ -1950,6 +1950,7 @@ 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);
if (ride != nullptr)
ride->FormatNameTo(gCommonFormatArgs + 6);
break;
case SHOP_ITEM_UMBRELLA:
@ -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);
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,14 +1991,17 @@ 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);
if (ride != nullptr)
ride->FormatNameTo(gCommonFormatArgs + 6);
break;
case SHOP_ITEM_PHOTO3:
ride = get_ride(peep->photo3_ride_ref);
if (ride != nullptr)
ride->FormatNameTo(gCommonFormatArgs + 6);
break;
case SHOP_ITEM_PHOTO4:
ride = get_ride(peep->photo4_ride_ref);
if (ride != nullptr)
ride->FormatNameTo(gCommonFormatArgs + 6);
break;
}

View File

@ -1602,10 +1602,12 @@ 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());
if (ride != nullptr)
colourA = RideKeyColours[RideColourKey[ride->type]];
break;
case TILE_ELEMENT_TYPE_TRACK:
ride = get_ride(tileElement->AsTrack()->GetRideIndex());
if (ride != nullptr)
colourA = RideKeyColours[RideColourKey[ride->type]];
break;
}

View File

@ -170,6 +170,8 @@ static void window_maze_construction_close(rct_window* w)
hide_gridlines();
auto ride = get_ride(_currentRideIndex);
if (ride != nullptr)
{
if (ride->overall_view.xy == RCT_XY8_UNDEFINED)
{
int32_t savedPausedState = gGamePaused;
@ -183,6 +185,7 @@ static void window_maze_construction_close(rct_window* w)
intent.putExtra(INTENT_EXTRA_RIDE_ID, ride->id);
context_open_intent(&intent);
}
}
}
static void window_maze_construction_entrance_mouseup(rct_window* w, rct_widgetindex widgetIndex)
@ -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))

View File

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

View File

@ -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<size_t>(VehicleDropdownData.size(), DROPDOWN_ITEMS_MAX_SIZE);
@ -2504,7 +2522,9 @@ static void window_ride_main_update(rct_window* w)
widget_invalidate(w, WIDX_TAB_1);
// Update status
Ride* ride = get_ride(w->number);
auto ride = get_ride(w->number);
if (ride != nullptr)
{
if (!(ride->window_invalidate_flags & RIDE_INVALIDATE_RIDE_MAIN))
{
if (w->ride.view == 0)
@ -2519,14 +2539,15 @@ static void window_ride_main_update(rct_window* w)
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)
&& vehicle->status != VEHICLE_STATUS_TRAVELLING_DODGEMS
&& vehicle->status != VEHICLE_STATUS_TRAVELLING_BOAT)
{
return;
}
}
}
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);
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,26 +5066,26 @@ 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
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(
@ -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);
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,23 +6289,29 @@ 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
{
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);
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,7 +6867,9 @@ static void window_ride_customer_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)
{
ride->FormatNameTo(gCommonFormatArgs);
window_ride_customer_widgets[WIDX_SHOW_GUESTS_THOUGHTS].type = WWT_FLATBTN;
@ -6815,6 +6886,7 @@ static void window_ride_customer_invalidate(rct_window* w)
window_ride_anchor_border_widgets(w);
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10);
}
}
/**

View File

@ -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,9 +1951,13 @@ static void window_ride_construction_mouseup_demolish(rct_window* w)
}
else
{
_stationConstructed = get_ride(w->number)->num_stations != 0;
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);
}
}
});
GameActions::Execute(&trackRemoveAction);
@ -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))

View File

@ -798,153 +798,198 @@ 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 (otherRide != nullptr)
{
auto strB = otherRide->GetName();
if (_strcmpi(strA.c_str(), strB.c_str()) >= 0)
break;
window_bubble_list_item(w, current_list_position);
}
}
break;
}
case INFORMATION_TYPE_POPULARITY:
while (--current_list_position >= 0)
{
auto otherRide = get_ride(w->list_item_positions[current_list_position]);
if (otherRide != nullptr)
{
if (ride->popularity * 4 <= otherRide->popularity * 4)
break;
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 (otherRide != nullptr)
{
if (ride->satisfaction * 5 <= otherRide->satisfaction * 5)
break;
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 (otherRide != nullptr)
{
if (ride->profit <= otherRide->profit)
break;
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 (otherRide != nullptr)
{
if (ride->total_customers <= otherRide->total_customers)
break;
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 (otherRide != nullptr)
{
if (ride->total_profit <= otherRide->total_profit)
break;
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 (otherRide != nullptr)
{
if (ride_customers_per_hour(ride) <= ride_customers_per_hour(otherRide))
break;
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 (otherRide != nullptr)
{
if (ride->build_date <= otherRide->build_date)
break;
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 (otherRide != nullptr)
{
if (ride->income_per_hour <= otherRide->income_per_hour)
break;
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 (otherRide != nullptr)
{
if (ride->upkeep_cost <= otherRide->upkeep_cost)
break;
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 (otherRide != nullptr)
{
if (ride->GetTotalQueueLength() <= otherRide->GetTotalQueueLength())
break;
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 (otherRide != nullptr)
{
if (ride->GetMaxQueueTime() <= otherRide->GetMaxQueueTime())
break;
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 (otherRide != nullptr)
{
if (ride->reliability_percentage <= otherRide->reliability_percentage)
break;
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 (otherRide != nullptr)
{
if (ride->downtime <= otherRide->downtime)
break;
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 (otherRide != nullptr)
{
if (ride->guests_favourite <= otherRide->guests_favourite)
break;
window_bubble_list_item(w, current_list_position);
}
}
break;
}

View File

@ -370,7 +370,7 @@ 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);
if (w->viewport != nullptr)
w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0;
window_invalidate(w);
}

View File

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

View File

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

View File

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