mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #1288 from trigger-death/force-ride-breakdown
Force ride breakdown and fix ride options
This commit is contained in:
commit
472d546542
|
@ -3620,3 +3620,9 @@ 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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
@ -3340,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3396,30 +3398,96 @@ 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
|
||||
);
|
||||
|
||||
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)) {
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) == 0) {
|
||||
*gDropdownItemsDisabled = (1 << 0);
|
||||
}
|
||||
}
|
||||
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 +3498,72 @@ 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;
|
||||
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
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 = 1;
|
||||
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)
|
||||
break;
|
||||
num_items++;
|
||||
}
|
||||
}
|
||||
ride_prepare_breakdown(w->number, i);
|
||||
}
|
||||
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 +3613,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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue