1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-30 18:25:16 +01:00

Fix #4172: Expose ride-type changing capability in UI

This also allows changing ride type in multiplayer games. Very crashy.
This commit is contained in:
Michał Janiszewski
2016-07-26 00:52:50 +02:00
parent 61afcbcadf
commit 155bc054df
11 changed files with 110 additions and 11 deletions

View File

@@ -130,7 +130,8 @@ enum WINDOW_CHEATS_WIDGET_IDX {
WIDX_SHOW_ALL_OPERATING_MODES,
WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES,
WIDX_DISABLE_TRAIN_LENGTH_LIMITS,
WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK
WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK,
WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES,
};
#pragma region MEASUREMENTS
@@ -259,6 +260,7 @@ static rct_widget window_cheats_rides_widgets[] = {
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(6), OHPL(6), STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, STR_NONE }, // Show vehicles from other track types
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(12), OHPL(12), STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP }, // Disable train length limits
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(13), OHPL(13), STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK_TIP }, // Enable chain lift on all track
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(14), OHPL(14), STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP }, // Allow arbitrary ride type changes
{ WIDGETS_END },
};
@@ -430,7 +432,8 @@ static uint64 window_cheats_page_enabled_widgets[] = {
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_RENEW_RIDES) |
(1ULL << WIDX_MAKE_DESTRUCTIBLE) | (1ULL << WIDX_FIX_ALL) | (1ULL << WIDX_FAST_LIFT_HILL) | (1ULL << WIDX_DISABLE_BRAKES_FAILURE) |
(1ULL << WIDX_DISABLE_ALL_BREAKDOWNS) | (1ULL << WIDX_BUILD_IN_PAUSE_MODE) | (1ULL << WIDX_RESET_CRASH_STATUS) | (1ULL << WIDX_10_MINUTE_INSPECTIONS) |
(1ULL << WIDX_SHOW_ALL_OPERATING_MODES) | (1ULL << WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES) | (1ULL << WIDX_DISABLE_TRAIN_LENGTH_LIMITS) | (1ULL << WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK)
(1ULL << WIDX_SHOW_ALL_OPERATING_MODES) | (1ULL << WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES) | (1ULL << WIDX_DISABLE_TRAIN_LENGTH_LIMITS) |
(1ULL << WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK) | (1ULL << WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES)
};
static rct_string_id window_cheats_page_titles[] = {
@@ -758,6 +761,12 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex)
case WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_ENABLECHAINLIFTONALLTRACK, 0, GAME_COMMAND_CHEAT, 0, 0);
break;
case WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, 0, GAME_COMMAND_CHEAT, 0, 0);
if (gCheatsAllowArbitraryRideTypeChanges) {
window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE);
}
break;
}
}
@@ -830,6 +839,7 @@ static void window_cheats_invalidate(rct_window *w)
widget_set_checkbox_value(w, WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, gCheatsShowVehiclesFromOtherTrackTypes);
widget_set_checkbox_value(w, WIDX_DISABLE_TRAIN_LENGTH_LIMITS, gCheatsDisableTrainLengthLimit);
widget_set_checkbox_value(w, WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, gCheatsEnableChainLiftOnAllTrack);
widget_set_checkbox_value(w, WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES, gCheatsAllowArbitraryRideTypeChanges);
break;
}

View File

@@ -86,6 +86,10 @@ enum {
WIDX_CLOSE_LIGHT,
WIDX_TEST_LIGHT,
WIDX_OPEN_LIGHT,
WIDX_RIDE_TYPE,
WIDX_RIDE_TYPE_INCREASE,
WIDX_RIDE_TYPE_DECREASE,
WIDX_RIDE_TYPE_APPLY,
WIDX_VEHICLE_TYPE = 14,
WIDX_VEHICLE_TYPE_DROPDOWN,
@@ -214,6 +218,13 @@ static rct_widget window_ride_main_widgets[] = {
{ WWT_IMGBTN, 1, 296, 309, 48, 61, SPR_G2_RCT1_CLOSE_BUTTON_0, STR_CLOSE_RIDE_TIP },
{ WWT_IMGBTN, 1, 296, 309, 62, 75, SPR_G2_RCT1_TEST_BUTTON_0, STR_TEST_RIDE_TIP },
{ WWT_IMGBTN, 1, 296, 309, 76, 89, SPR_G2_RCT1_OPEN_BUTTON_0, STR_OPEN_RIDE_TIP },
// Ride type spinner + apply button
{ WWT_SPINNER, 1, 7, 260, 180, 191, STR_ARG_6_STRINGID, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 249, 259, 181, 185, STR_NUMERIC_UP, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 249, 259, 186, 190, STR_NUMERIC_DOWN, STR_NONE },
{ WWT_CLOSEBOX, 1, 265, 307, 180, 191, STR_APPLY, STR_NONE },
{ WIDGETS_END },
};
@@ -243,6 +254,7 @@ static rct_widget window_ride_vehicle_widgets[] = {
{ WWT_SPINNER, 1, 164, 308, 190, 201, STR_1_CAR_PER_TRAIN, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 297, 307, 191, 195, STR_NUMERIC_UP, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 297, 307, 196, 200, STR_NUMERIC_DOWN, STR_NONE },
{ WIDGETS_END },
};
@@ -497,7 +509,7 @@ static rct_widget *window_ride_page_widgets[] = {
};
const uint64 window_ride_page_enabled_widgets[] = {
0x0000000003FDBFF4,
0x000000003FFDBFF4,
0x00000000007EFFF4,
0x0000019E777DBFF4,
0x000000000003FFF4,
@@ -955,6 +967,10 @@ static rct_window_event_list *window_ride_page_events[] = {
#pragma endregion
static uint8 _rideType;
static void set_operating_setting(int rideNumber, uint8 setting, uint8 value);
// Cached overall view for each ride
// (Re)calculated when the ride window is opened
typedef struct ride_overall_view_t {
@@ -1539,6 +1555,7 @@ static rct_window *window_ride_open(int rideIndex)
}
}
var_496(w) = numSubTypes;
_rideType = ride->type;
return w;
}
@@ -1631,6 +1648,7 @@ rct_window *window_ride_open_station(int rideIndex, int stationIndex)
w->ride.view = 1 + ride->num_vehicles + stationIndex;
window_ride_init_viewport(w);
_rideType = ride->type;
return w;
}
@@ -1734,6 +1752,7 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle)
w->ride.view = view;
window_ride_init_viewport(w);
_rideType = ride->type;
window_invalidate(w);
return w;
@@ -2025,15 +2044,15 @@ static void window_ride_main_resize(rct_window *w)
int width, height;
w->flags |= WF_RESIZABLE;
int minHeight = 180;
int minHeight = 195;
if (theme_get_flags() & UITHEME_FLAG_USE_LIGHTS_RIDE)
minHeight = 200 + RCT1_LIGHT_OFFSET - (ride_type_has_flag(get_ride(w->number)->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? 14 : 0);
minHeight = 215 + RCT1_LIGHT_OFFSET - (ride_type_has_flag(get_ride(w->number)->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? 14 : 0);
window_set_resize(w, 316, minHeight, 500, 450);
viewport = w->viewport;
if (viewport != NULL) {
width = w->width - 30;
height = w->height - 75;
height = w->height - 90;
if (viewport->width != width || viewport->height != height) {
viewport->width = width;
viewport->height = height;
@@ -2190,6 +2209,7 @@ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget)
*/
static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widget *widget)
{
rct_ride *ride = get_ride(w->number);
switch (widgetIndex) {
case WIDX_VIEW_DROPDOWN:
window_ride_show_view_dropdown(w, widget);
@@ -2197,6 +2217,25 @@ static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widge
case WIDX_OPEN:
window_ride_show_open_dropdown(w, widget);
break;
case WIDX_RIDE_TYPE_INCREASE:
if (_rideType >= 90) {
_rideType = 90;
} else {
_rideType++;
}
break;
case WIDX_RIDE_TYPE_DECREASE:
if (_rideType == 0) {
_rideType = 0;
} else {
_rideType--;
}
break;
case WIDX_RIDE_TYPE_APPLY:
if (_rideType >= 0 && _rideType <= 90) {
set_operating_setting(w->number, RIDE_SETTING_RIDE_TYPE, _rideType);
}
break;
}
}
@@ -2347,6 +2386,7 @@ static void window_ride_main_invalidate(rct_window *w)
set_format_arg(0, uint16, ride->name);
set_format_arg(2, uint32, ride->name_arguments);
set_format_arg(6, uint16, _rideType + STR_RIDE_NAME_SPIRAL_ROLLER_COASTER);
uint32 spriteIds[] = {
SPR_CLOSED,
SPR_OPEN,
@@ -2362,13 +2402,40 @@ static void window_ride_main_invalidate(rct_window *w)
// Anchor main page specific widgets
window_ride_main_widgets[WIDX_VIEWPORT].right = w->width - 26;
window_ride_main_widgets[WIDX_VIEWPORT].bottom = w->height - 14;
window_ride_main_widgets[WIDX_VIEWPORT].bottom = w->height - 129;
window_ride_main_widgets[WIDX_STATUS].right = w->width - 26;
window_ride_main_widgets[WIDX_STATUS].top = w->height - 13;
window_ride_main_widgets[WIDX_STATUS].bottom = w->height - 3;
window_ride_main_widgets[WIDX_STATUS].top = w->height - 28;
window_ride_main_widgets[WIDX_STATUS].bottom = w->height - 18;
window_ride_main_widgets[WIDX_VIEW].right = w->width - 60;
window_ride_main_widgets[WIDX_VIEW_DROPDOWN].right = w->width - 61;
window_ride_main_widgets[WIDX_VIEW_DROPDOWN].left = w->width - 71;
window_ride_main_widgets[WIDX_RIDE_TYPE].right = w->width - 80;
window_ride_main_widgets[WIDX_RIDE_TYPE].top = w->height - 15;
window_ride_main_widgets[WIDX_RIDE_TYPE].bottom = w->height - 3;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].right = w->width - 81;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].left = w->width - 91;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].top = w->height - 14;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].bottom = w->height - 9;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].right = w->width - 81;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].left = w->width - 91;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].top = w->height - 8;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].bottom = w->height - 3;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].left = w->width - 78;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].right = w->width - 25;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].top = w->height - 15;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].bottom = w->height - 3;
if (!gCheatsAllowArbitraryRideTypeChanges) {
window_ride_main_widgets[WIDX_RIDE_TYPE].type = WWT_14;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].type = WWT_EMPTY;
} else {
window_ride_main_widgets[WIDX_RIDE_TYPE].type = WWT_SPINNER;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].type = WWT_DROPDOWN_BUTTON;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].type = WWT_DROPDOWN_BUTTON;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].type = WWT_CLOSEBOX;
}
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10);