From 10c1c29c118442782e27b983423844a816997a54 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 9 Jun 2015 20:18:04 -0400 Subject: [PATCH 1/5] Can now force ride breakdowns --- data/language/english_uk.txt | 8 ++ src/ride/ride.c | 6 +- src/ride/ride.h | 2 + src/windows/ride.c | 166 ++++++++++++++++++++++++++++++----- 4 files changed, 155 insertions(+), 27 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 13b3347245..943b40619f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3618,3 +3618,11 @@ STR_5281 :{SMALLFONT}{BLACK}Features STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{MEDIUMFONT}{BLACK}Makes guests explode +STR_5287 :Ride is already broken down +STR_5288 :Ride is closed +STR_5289 :No breakdowns available for this ride +STR_5290 :Fix ride +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown diff --git a/src/ride/ride.c b/src/ride/ride.c index 8c340cb58b..7711c75350 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -134,7 +134,7 @@ static int ride_get_new_breakdown_problem(rct_ride *ride); static void ride_inspection_update(rct_ride *ride); static void ride_mechanic_status_update(int rideIndex, int mechanicStatus); static void ride_music_update(int rideIndex); -static void ride_prepare_breakdown(int rideIndex, int breakdownReason); +void ride_prepare_breakdown(int rideIndex, int breakdownReason); static void ride_shop_connected(rct_ride* ride, int ride_idx); static void ride_spiral_slide_update(rct_ride *ride); static void ride_update(int rideIndex); @@ -1655,7 +1655,7 @@ static int ride_get_new_breakdown_problem(rct_ride *ride) return -1; // If brakes failure is disabled, also take it out of the equation (see above comment why) - if(gConfigCheat.disable_brakes_failure) + if (gConfigCheat.disable_brakes_failure) return -1; monthsOld = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint8) - ride->build_date; @@ -1669,7 +1669,7 @@ static int ride_get_new_breakdown_problem(rct_ride *ride) * * rct2: 0x006B7348 */ -static void ride_prepare_breakdown(int rideIndex, int breakdownReason) +void ride_prepare_breakdown(int rideIndex, int breakdownReason) { int i; rct_ride *ride; diff --git a/src/ride/ride.h b/src/ride/ride.h index 2e174b5a6c..12899f1f67 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -802,6 +802,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par void ride_set_map_tooltip(rct_map_element *mapElement); int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint16 sampleRate, uint32 position, uint8 *tuneId); void ride_music_update_final(); +void ride_prepare_breakdown(int rideIndex, int breakdownReason); rct_map_element *ride_get_station_start_track_element(rct_ride *ride, int stationIndex); rct_map_element *ride_get_station_exit_element(rct_ride *ride, int x, int y, int z); void ride_set_status(int rideIndex, int status); @@ -814,6 +815,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); int get_var_10E_unk_3(rct_ride* ride); diff --git a/src/windows/ride.c b/src/windows/ride.c index ba2d5bee07..9fb8e75cf2 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -124,6 +124,7 @@ enum { WIDX_INSPECTION_INTERVAL = 14, WIDX_INSPECTION_INTERVAL_DROPDOWN, WIDX_LOCATE_MECHANIC, + WIDX_FORCE_BREAKDOWN, WIDX_TRACK_PREVIEW = 14, WIDX_TRACK_COLOUR_SCHEME, @@ -306,6 +307,7 @@ static rct_widget window_ride_maintenance_widgets[] = { { WWT_DROPDOWN, 1, 107, 308, 71, 82, 0, STR_SELECT_HOW_OFTEN_A_MECHANIC_SHOULD_CHECK_THIS_RIDE }, { WWT_DROPDOWN_BUTTON, 1, 297, 307, 72, 81, 876, STR_SELECT_HOW_OFTEN_A_MECHANIC_SHOULD_CHECK_THIS_RIDE }, { WWT_FLATBTN, 1, 289, 312, 108, 131, 0xFFFFFFFF, STR_LOCATE_NEAREST_AVAILABLE_MECHANIC_TIP }, + { WWT_FLATBTN, 1, 265, 288, 108, 131, SPR_NO_ENTRY, 5292 }, { WIDGETS_END }, }; @@ -492,7 +494,7 @@ const uint64 window_ride_page_enabled_widgets[] = { 0x0000000003FDBFF4, 0x00000000001EFFF4, 0x0000019E777DBFF4, - 0x000000000001FFF4, + 0x000000000003FFF4, 0x00000003F37F3FF4, 0x000000000001FFF4, 0x000000000007FFF4, @@ -3396,30 +3398,94 @@ static void window_ride_maintenance_resize() */ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) { + rct_ride *ride; + rct_ride_type *ride_type; rct_widget *dropdownWidget; - int i; + int i, j, num_items; + uint8 breakdownReason; + + dropdownWidget = widget; - if (widgetIndex != WIDX_INSPECTION_INTERVAL_DROPDOWN) - return; + ride = GET_RIDE(w->number); + ride_type = gRideTypeList[ride->subtype]; - dropdownWidget = widget - 1; - rct_ride *ride = GET_RIDE(w->number); + switch (widgetIndex) { + case WIDX_INSPECTION_INTERVAL_DROPDOWN: + dropdownWidget--; + for (i = 0; i < 7; i++) { + gDropdownItemsFormat[i] = 1142; + gDropdownItemsArgs[i] = STR_EVERY_10_MINUTES + i; + } + window_dropdown_show_text_custom_width( + w->x + dropdownWidget->left, + w->y + dropdownWidget->top, + dropdownWidget->bottom - dropdownWidget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + 7, + widget->right - dropdownWidget->left + ); - for (i = 0; i < 7; i++) { - gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = STR_EVERY_10_MINUTES + i; + gDropdownItemsChecked = (1 << ride->inspection_interval); + break; + + case WIDX_FORCE_BREAKDOWN: + num_items = 1; + for (j = 0; j < 3; j++) { + if (ride_type->ride_type[j] != 0xFF) + break; + } + gDropdownItemsFormat[0] = 1142; + gDropdownItemsArgs[0] = 5290; + for (i = 0; i < 8; i++) { + if (RideAvailableBreakdowns[ride_type->ride_type[j]] & (uint8)(1 << i)) { + if (i == BREAKDOWN_BRAKES_FAILURE && (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED)) { + if (ride->num_vehicles != 1) + continue; + } + gDropdownItemsFormat[num_items] = 1142; + gDropdownItemsArgs[num_items] = STR_SAFETY_CUT_OUT + i; + num_items++; + } + } + if (num_items <= 1) { + window_error_open(5289, STR_NONE); + } + else { + window_dropdown_show_text( + w->x + dropdownWidget->left, + w->y + dropdownWidget->top, + dropdownWidget->bottom - dropdownWidget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items + ); + + breakdownReason = ride->breakdown_reason_pending; + //if (breakdownReason == BREAKDOWN_NONE) + // breakdownReason = ride->breakdown_reason; + num_items = 1; + if (breakdownReason != BREAKDOWN_NONE && (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING))) { + for (i = 0; i < 8; i++) { + if (RideAvailableBreakdowns[ride_type->ride_type[j]] & (uint8)(1 << i)) { + if (i == BREAKDOWN_BRAKES_FAILURE && (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED)) { + if (ride->num_vehicles != 1) + continue; + } + if (i == breakdownReason) { + gDropdownItemsChecked = (1 << num_items); + break; + } + gDropdownItemsFormat[num_items] = 1142; + gDropdownItemsArgs[num_items] = STR_SAFETY_CUT_OUT + i; + num_items++; + } + } + } + } + break; } - window_dropdown_show_text_custom_width( - w->x + dropdownWidget->left, - w->y + dropdownWidget->top, - dropdownWidget->bottom - dropdownWidget->top + 1, - w->colours[1], - DROPDOWN_FLAG_STAY_OPEN, - 7, - widget->right - dropdownWidget->left - ); - - gDropdownItemsChecked = (1 << ride->inspection_interval); + } /** @@ -3430,17 +3496,61 @@ static void window_ride_maintenance_dropdown() { rct_window *w; rct_ride *ride; + rct_ride_type *ride_type; short widgetIndex, dropdownIndex; + int i, j, num_items; window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_INSPECTION_INTERVAL_DROPDOWN || dropdownIndex == -1) + if (dropdownIndex == -1) return; - + ride = GET_RIDE(w->number); + ride_type = gRideTypeList[ride->subtype]; + + switch (widgetIndex) { + case WIDX_INSPECTION_INTERVAL_DROPDOWN: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_CHANGE_OPERATING_MODE; + game_do_command(0, (dropdownIndex << 8) | 1, 0, (5 << 8) | w->number, GAME_COMMAND_SET_RIDE_SETTING, 0, 0); + break; + + case WIDX_FORCE_BREAKDOWN: + if (dropdownIndex == 0) { + ride->lifecycle_flags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN); + window_invalidate_by_number(WC_RIDE, w->number); + break; + } + if (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN | RIDE_LIFECYCLE_CRASHED)) { + window_error_open(5291, 5287); + } + else if (ride->status == RIDE_STATUS_CLOSED) { + window_error_open(5291, 5288); + } + else { + num_items = 0; + for (j = 0; j < 3; j++) { + if (ride_type->ride_type[j] != 0xFF) + break; + } + for (i = 0; i < 8; i++) { + if (RideAvailableBreakdowns[ride_type->ride_type[j]] & (uint8)(1 << i)) { + if (i == BREAKDOWN_BRAKES_FAILURE && (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED)) { + if (ride->num_vehicles != 1) + continue; + } + if (num_items == (dropdownIndex - 1)) + break; + num_items++; + } + } + ride_prepare_breakdown(w->number, i); + //ride_breakdown_status_update(w->number); + //ride_inspection_update(ride); + //gForceRideBreakdown[w->number] = i + 1; + } + break; + } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_CHANGE_OPERATING_MODE; - game_do_command(0, (dropdownIndex << 8) | 1, 0, (5 << 8) | w->number, GAME_COMMAND_SET_RIDE_SETTING, 0, 0); } /** @@ -3490,6 +3600,14 @@ static void window_ride_maintenance_invalidate() window_ride_anchor_border_widgets(w); window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); + + if (gConfigGeneral.debugging_tools) { + window_ride_maintenance_widgets[WIDX_FORCE_BREAKDOWN].type = WWT_FLATBTN; + } + else { + window_ride_maintenance_widgets[WIDX_FORCE_BREAKDOWN].type = WWT_EMPTY; + + } } /** From e7332b2d9463e816b3327c962f64da050155fc02 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 9 Jun 2015 22:43:14 -0400 Subject: [PATCH 2/5] Fixed maintenance bar --- src/windows/ride.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index 0b34992697..feee0c5d63 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3342,7 +3342,7 @@ static void window_ride_maintenance_draw_bar(rct_window *w, rct_drawpixelinfo *d value = ((186 * ((value * 2) & 0xFF)) >> 8) & 0xFF; if (value > 2) { - gfx_fill_rect_inset(dpi, x + 2, y + 1, x + value + 1, y + 8, unk, 0); + gfx_fill_rect_inset(dpi, x + 2, y + 1, x + value + 1, y + 7, unk, 0); } } @@ -3448,7 +3448,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc num_items++; } } - if (num_items <= 1) { + if (num_items == 1) { window_error_open(5289, STR_NONE); } else { @@ -3460,11 +3460,9 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc DROPDOWN_FLAG_STAY_OPEN, num_items ); - - breakdownReason = ride->breakdown_reason_pending; - //if (breakdownReason == BREAKDOWN_NONE) - // breakdownReason = ride->breakdown_reason; + num_items = 1; + breakdownReason = ride->breakdown_reason_pending; if (breakdownReason != BREAKDOWN_NONE && (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING))) { for (i = 0; i < 8; i++) { if (RideAvailableBreakdowns[ride_type->ride_type[j]] & (uint8)(1 << i)) { @@ -3516,6 +3514,8 @@ static void window_ride_maintenance_dropdown() case WIDX_FORCE_BREAKDOWN: if (dropdownIndex == 0) { + // This doesn't work for all breakdown types. + //We'll need to decompile the peep_fixing function to figure out how to solve this. ride->lifecycle_flags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN); window_invalidate_by_number(WC_RIDE, w->number); break; @@ -3527,7 +3527,7 @@ static void window_ride_maintenance_dropdown() window_error_open(5291, 5288); } else { - num_items = 0; + num_items = 1; for (j = 0; j < 3; j++) { if (ride_type->ride_type[j] != 0xFF) break; @@ -3538,15 +3538,12 @@ static void window_ride_maintenance_dropdown() if (ride->num_vehicles != 1) continue; } - if (num_items == (dropdownIndex - 1)) + if (num_items == dropdownIndex) break; num_items++; } } ride_prepare_breakdown(w->number, i); - //ride_breakdown_status_update(w->number); - //ride_inspection_update(ride); - //gForceRideBreakdown[w->number] = i + 1; } break; } From 98501a51f3300a49faa29bfe2419c9dce6f92c99 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 9 Jun 2015 23:05:43 -0400 Subject: [PATCH 3/5] Fix Ride is greyed out when it doesn't work --- src/windows/dropdown.c | 1 + src/windows/dropdown.h | 1 + src/windows/ride.c | 11 ++++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index d993f2fd48..f8581cf490 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -54,6 +54,7 @@ uint16 gDropdownItemsFormat[64]; sint64 gDropdownItemsArgs[64]; // Replaces 0x009DED38 uint32 gDropdownItemsChecked; +uint32 *gDropdownItemsDisabled = RCT2_ADDRESS(0x009DED34, uint32); static void window_dropdown_emptysub() { } static void window_dropdown_paint(); diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index e2285714e2..c26f140197 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -36,6 +36,7 @@ extern int gDropdownNumItems; extern uint16 gDropdownItemsFormat[64]; extern sint64 gDropdownItemsArgs[64]; extern uint32 gDropdownItemsChecked; +extern uint32 *gDropdownItemsDisabled; void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items); void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colour, uint8 flags, int num_items, int width); diff --git a/src/windows/ride.c b/src/windows/ride.c index feee0c5d63..df0b243a67 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3463,7 +3463,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc num_items = 1; breakdownReason = ride->breakdown_reason_pending; - if (breakdownReason != BREAKDOWN_NONE && (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING))) { + if (breakdownReason != BREAKDOWN_NONE && (ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING)) { for (i = 0; i < 8; i++) { if (RideAvailableBreakdowns[ride_type->ride_type[j]] & (uint8)(1 << i)) { if (i == BREAKDOWN_BRAKES_FAILURE && (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED)) { @@ -3480,6 +3480,15 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc } } } + + if ((ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) == 0 || + breakdownReason == BREAKDOWN_VEHICLE_MALFUNCTION || + breakdownReason == BREAKDOWN_RESTRAINTS_STUCK_CLOSED || + breakdownReason == BREAKDOWN_RESTRAINTS_STUCK_OPEN || + breakdownReason == BREAKDOWN_DOORS_STUCK_CLOSED || + breakdownReason == BREAKDOWN_DOORS_STUCK_OPEN) { + *gDropdownItemsDisabled = (1 << 0); + } } break; } From 32b79ea216c4cc4e7136ba234a1f81dd1f474078 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 9 Jun 2015 23:17:08 -0400 Subject: [PATCH 4/5] Fix ride works for all breakdown types --- src/windows/ride.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index df0b243a67..ad2ac44a48 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3481,12 +3481,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc } } - if ((ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) == 0 || - breakdownReason == BREAKDOWN_VEHICLE_MALFUNCTION || - breakdownReason == BREAKDOWN_RESTRAINTS_STUCK_CLOSED || - breakdownReason == BREAKDOWN_RESTRAINTS_STUCK_OPEN || - breakdownReason == BREAKDOWN_DOORS_STUCK_CLOSED || - breakdownReason == BREAKDOWN_DOORS_STUCK_OPEN) { + if ((ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) == 0) { *gDropdownItemsDisabled = (1 << 0); } } @@ -3504,6 +3499,7 @@ static void window_ride_maintenance_dropdown() rct_window *w; rct_ride *ride; rct_ride_type *ride_type; + rct_vehicle *vehicle; short widgetIndex, dropdownIndex; int i, j, num_items; @@ -3525,6 +3521,19 @@ static void window_ride_maintenance_dropdown() if (dropdownIndex == 0) { // This doesn't work for all breakdown types. //We'll need to decompile the peep_fixing function to figure out how to solve this. + switch (ride->breakdown_reason_pending) { + case BREAKDOWN_RESTRAINTS_STUCK_CLOSED: + case BREAKDOWN_RESTRAINTS_STUCK_OPEN: + case BREAKDOWN_DOORS_STUCK_CLOSED: + case BREAKDOWN_DOORS_STUCK_OPEN: + vehicle = &(g_sprite_list[ride->vehicles[ride->broken_vehicle]].vehicle); + vehicle->var_48 &= ~0x100; + break; + case BREAKDOWN_VEHICLE_MALFUNCTION: + vehicle = &(g_sprite_list[ride->vehicles[ride->broken_vehicle]].vehicle); + vehicle->var_48 &= ~0x200; + break; + } ride->lifecycle_flags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN); window_invalidate_by_number(WC_RIDE, w->number); break; From d7a4474bcd3c9d83be0601c0e7fb17ee707b3ca1 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 9 Jun 2015 23:18:20 -0400 Subject: [PATCH 5/5] Removed irrelevant comments stating false facts --- src/windows/ride.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index ad2ac44a48..bb4d2e5e70 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3519,8 +3519,6 @@ static void window_ride_maintenance_dropdown() case WIDX_FORCE_BREAKDOWN: if (dropdownIndex == 0) { - // This doesn't work for all breakdown types. - //We'll need to decompile the peep_fixing function to figure out how to solve this. switch (ride->breakdown_reason_pending) { case BREAKDOWN_RESTRAINTS_STUCK_CLOSED: case BREAKDOWN_RESTRAINTS_STUCK_OPEN: