Can now force ride breakdowns

This commit is contained in:
Robert Jordan 2015-06-09 20:18:04 -04:00
parent fa49e5745e
commit 10c1c29c11
4 changed files with 155 additions and 27 deletions

View File

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

View File

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

View File

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

View File

@ -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;
}
}
/**