From fcc847beb4698ab61ec1f59b20cd5323f2f8ea88 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 9 Sep 2014 01:12:32 +0100 Subject: [PATCH] start implementing operating tab on ride window --- src/ride.h | 3 +- src/string_ids.h | 17 +++ src/window_ride.c | 312 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 329 insertions(+), 3 deletions(-) diff --git a/src/ride.h b/src/ride.h index 178c40ff7d..dc71186c06 100644 --- a/src/ride.h +++ b/src/ride.h @@ -164,7 +164,8 @@ typedef struct { uint8 var_1BC; uint8 pad_1BD[0x0B]; uint8 music; - uint8 pad_1C9[0x04]; + uint8 pad_1C9[0x03]; + uint8 num_block_brakes; // 0x1CC uint8 var_1CD; uint16 guests_favourite; // 0x1CE uint32 lifecycle_flags; // 0x1D0 diff --git a/src/string_ids.h b/src/string_ids.h index ccea24de47..86e7f599a1 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -358,6 +358,15 @@ enum { STR_QUEUE_PEOPLE = 1203, STR_QUEUE_TIME_LABEL = 1204, STR_QUEUE_TIME_PLURAL_LABEL = 1205, + STR_WAIT_FOR = 1206, + + STR_WAIT_FOR_PASSENGERS_BEFORE_DEPARTING_TIP = 1209, + STR_MINIMUM_WAITING_TIME = 1211, + STR_MAXIMUM_WAITING_TIME = 1212, + STR_MINIMUM_LENGTH_BEFORE_DEPARTING_TIP = 1213, + STR_MAXIMUM_LENGTH_BEFORE_DEPARTING_TIP = 1214, + STR_SYNCHRONISE_WITH_ADJACENT_STATIONS = 1215, + STR_SYNCHRONISE_WITH_ADJACENT_STATIONS_TIP = 1216, STR_NUMERIC_UP = 1218, STR_NUMERIC_DOWN = 1219, @@ -636,6 +645,9 @@ enum { STR_MARKETING = 1953, STR_RESEARCH_FUNDING = 1954, + STR_NUMBER_OF_CIRCUITS = 1955, + STR_NUMBER_OF_CIRCUITS_TIP = 1956, + STR_ON_RIDE_PHOTO_PRICE = 1963, STR_ITEM_START = 1988, @@ -866,6 +878,8 @@ enum { STR_RESEARCH_NEW_SHOPS_AND_STALLS = 2475, STR_RESEARCH_NEW_SCENERY_AND_THEMING = 2476, + STR_SELECT_OPERATING_MODE = 2477, + STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP = 2482, STR_FINANCES_WEEKLY_PROFIT_POSITIVE = 2483, STR_FINANCES_WEEKLY_PROFIT_LOSS = 2484, @@ -1018,6 +1032,8 @@ enum { STR_SAME_PRICE_THROUGHOUT_PARK = 3071, STR_SAME_PRICE_THROUGHOUT_PARK_TIP = 3072, + STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP = 3097, + STR_SELECT_COLOUR = 3099, STR_SELECT_SECONDARY_COLOUR = 3100, STR_SELECT_TERNARY_COLOUR = 3101, @@ -1028,6 +1044,7 @@ enum { STR_CLOSE_RIDE = 3107, STR_TEST_RIDE = 3108, STR_OPEN_RIDE = 3109, + STR_BLOCK_SECTIONS = 3110, STR_SAVE_TRACK_DESIGN = 3115, STR_SAVE_TRACK_DESIGN_NOT_POSSIBLE = 3116, diff --git a/src/window_ride.c b/src/window_ride.c index 0445e0176f..4339ffa6ff 100644 --- a/src/window_ride.c +++ b/src/window_ride.c @@ -75,6 +75,34 @@ enum { WIDX_LOCATE, WIDX_DEMOLISH, + WIDX_OPERATE_UNK_14 = 14, + WIDX_OPERATION_UNK_14_INCREASE, + WIDX_OPERATION_UNK_14_DECREASE, + WIDX_LIFT_HILL_SPEED, + WIDX_LIFT_HILL_SPEED_INCREASE, + WIDX_LIFT_HILL_SPEED_DECREASE, + WIDX_WAIT_FOR_PASSENGERS, + WIDX_OPERATE_UNK_21, + WIDX_MINIMUM_LENGTH_CHECKBOX, + WIDX_MINIMUM_LENGTH, + WIDX_MINIMUM_LENGTH_INCREASE, + WIDX_MINIMUM_LENGTH_DECREASE, + WIDX_MAXIMUM_LENGTH_CHECKBOX, + WIDX_MAXIMUM_LENGTH, + WIDX_MAXIMUM_LENGTH_INCREASE, + WIDX_MAXIMUM_LENGTH_DECREASE, + WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX, + WIDX_OPERATE_UNK_31, + WIDX_OPERATE_UNK_32, + WIDX_OPERATE_UNK_33, + WIDX_OPERATE_UNK_34, + WIDX_OPERATE_UNK_35, + WIDX_OPERATE_UNK_36, + WIDX_OPERATE_NUMBER_OF_CIRCUITS_LABEL, + WIDX_OPERATE_NUMBER_OF_CIRCUITS, + WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE, + WIDX_OPERATE_NUMBER_OF_CIRCUITS_DECREASE, + WIDX_INSPECTION_INTERVAL = 14, WIDX_INSPECTION_INTERVAL_DROPDOWN, WIDX_LOCATE_MECHANIC, @@ -134,6 +162,53 @@ static rct_widget window_ride_main_widgets[] = { { WIDGETS_END }, }; +// 0x009ADEFC +static rct_widget window_ride_operating_widgets[] = { + { WWT_FRAME, 0, 0, 315, 0, 206, 0x0FFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 314, 1, 14, 0x3DD, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 303, 313, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_RESIZE, 1, 0, 315, 43, 179, 0x0FFFFFFFF, STR_NONE }, + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_VIEW_OF_RIDE_ATTRACTION_TIP }, + { WWT_TAB, 1, 34, 64, 17, 46, 0x2000144E, STR_VEHICLE_DETAILS_AND_OPTIONS_TIP }, + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_OPERATING_OPTIONS_TIP }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_MAINTENANCE_OPTIONS_TIP }, + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_COLOUR_SCHEME_OPTIONS_TIP }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_SOUND_AND_MUSIC_OPTIONS_TIP }, + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_MEASUREMENTS_AND_TEST_DATA_TIP }, + { WWT_TAB, 1, 220, 250, 17, 43, 0x2000144E, STR_GRAPHS_TIP }, + { WWT_TAB, 1, 251, 281, 17, 43, 0x2000144E, STR_INCOME_AND_COSTS_TIP }, + { WWT_TAB, 1, 282, 312, 17, 43, 0x2000144E, STR_CUSTOMER_INFORMATION_TIP }, + + { WWT_SPINNER, 1, 157, 308, 61, 72, 874, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 62, 66, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 67, 71, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_SPINNER, 1, 157, 308, 75, 86, 3096, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 76, 80, STR_NUMERIC_UP, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 81, 85, STR_NUMERIC_DOWN, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP }, + { WWT_CHECKBOX, 1, 7, 86, 109, 120, STR_WAIT_FOR, STR_WAIT_FOR_PASSENGERS_BEFORE_DEPARTING_TIP }, + { WWT_CHECKBOX, 1, 7, 308, 124, 135, 0xFFFFFFFF, STR_NONE }, + { WWT_CHECKBOX, 1, 7, 156, 139, 150, STR_MINIMUM_WAITING_TIME, STR_MINIMUM_LENGTH_BEFORE_DEPARTING_TIP }, + { WWT_SPINNER, 1, 157, 308, 139, 150, 870, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 140, 144, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 145, 149, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_CHECKBOX, 1, 7, 156, 154, 165, STR_MAXIMUM_WAITING_TIME, STR_MAXIMUM_LENGTH_BEFORE_DEPARTING_TIP }, + { WWT_SPINNER, 1, 157, 308, 154, 165, 872, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 155, 159, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 160, 164, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_CHECKBOX, 1, 7, 308, 169, 180, STR_SYNCHRONISE_WITH_ADJACENT_STATIONS, STR_SYNCHRONISE_WITH_ADJACENT_STATIONS_TIP }, + { WWT_24, 1, 7, 149, 61, 72, 0xFFFFFFFF, STR_NONE }, + { WWT_24, 1, 7, 149, 75, 86, 3095, STR_NONE }, + { WWT_DROPDOWN, 1, 7, 308, 47, 58, 0xFFFFFFFF, STR_SELECT_OPERATING_MODE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 48, 57, 876, STR_SELECT_OPERATING_MODE }, + { WWT_DROPDOWN, 1, 87, 308, 109, 120, 0xFFFFFFFF, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 110, 119, 876, STR_NONE }, + { WWT_24, 1, 7, 149, 89, 100, STR_NUMBER_OF_CIRCUITS, STR_NUMBER_OF_CIRCUITS_TIP }, + { WWT_SPINNER, 1, 157, 308, 89, 100, 1957, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 90, 94, STR_NUMERIC_UP, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 95, 99, STR_NUMERIC_DOWN, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP }, + { WIDGETS_END }, +}; + // 0x009AE190 static rct_widget window_ride_maintenance_widgets[] = { { WWT_FRAME, 0, 0, 315, 0, 206, 0x0FFFFFFFF, STR_NONE }, @@ -261,7 +336,7 @@ static rct_widget window_ride_customer_widgets[] = { static rct_widget *window_ride_page_widgets[] = { window_ride_main_widgets, (rct_widget*)0x009ADDA8, - (rct_widget*)0x009ADEFC, + window_ride_operating_widgets, window_ride_maintenance_widgets, (rct_widget*)0x009AE2A4, window_ride_music_widgets, @@ -300,6 +375,14 @@ static void window_ride_main_unknown_14(); static void window_ride_main_invalidate(); static void window_ride_main_paint(); +static void window_ride_operating_mouseup(); +static void window_ride_operating_resize(); +static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); +static void window_ride_operating_dropdown(); +static void window_ride_operating_update(rct_window *w); +static void window_ride_operating_invalidate(); +static void window_ride_operating_paint(); + static void window_ride_maintenance_mouseup(); static void window_ride_maintenance_resize(); static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); @@ -372,6 +455,38 @@ static void* window_ride_main_events[] = { window_ride_emptysub }; +// 0x0098E0B4 +static void* window_ride_operating_events[] = { + window_ride_emptysub, + window_ride_operating_mouseup, + window_ride_operating_resize, + window_ride_operating_mousedown, + window_ride_operating_dropdown, + window_ride_emptysub, + window_ride_operating_update, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_emptysub, + window_ride_operating_invalidate, + window_ride_operating_paint, + window_ride_emptysub +}; + // 0x0098E124 static void* window_ride_maintenance_events[] = { window_ride_emptysub, @@ -535,7 +650,7 @@ static void* window_ride_customer_events[] = { static uint32* window_ride_page_events[] = { (uint32*)window_ride_main_events, (uint32*)0x0098E204, - (uint32*)0x0098E0B4, + (uint32*)window_ride_operating_events, (uint32*)window_ride_maintenance_events, (uint32*)0x0098E044, (uint32*)window_ride_music_events, @@ -1579,6 +1694,199 @@ static void window_ride_main_paint() #pragma endregion +#pragma region Operating + +/** + * + * rct2: 0x006B10A7 + */ +static void window_ride_operating_mouseup() +{ + short widgetIndex; + rct_window *w; + + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_TAB_1: + case WIDX_TAB_2: + case WIDX_TAB_3: + case WIDX_TAB_4: + case WIDX_TAB_5: + case WIDX_TAB_6: + case WIDX_TAB_7: + case WIDX_TAB_8: + case WIDX_TAB_9: + case WIDX_TAB_10: + window_ride_set_page(w, widgetIndex - WIDX_TAB_1); + break; + case WIDX_WAIT_FOR_PASSENGERS: + break; + case WIDX_OPERATE_UNK_21: + break; + case WIDX_MINIMUM_LENGTH_CHECKBOX: + break; + case WIDX_MAXIMUM_LENGTH_CHECKBOX: + break; + case WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX: + break; + } +} + +/** + * + * rct2: 0x006B1715 + */ +static void window_ride_operating_resize() +{ + rct_window *w; + + window_get_register(w); + + window_set_resize(w, 316, 186, 316, 186); +} + +/** + * + * rct2: 0x006B10F4 + */ +static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) +{ + switch (widgetIndex) { + case WIDX_OPERATION_UNK_14_INCREASE: + break; + case WIDX_OPERATION_UNK_14_DECREASE: + break; + case WIDX_LIFT_HILL_SPEED_INCREASE: + break; + case WIDX_LIFT_HILL_SPEED_DECREASE: + break; + case WIDX_MINIMUM_LENGTH_INCREASE: + break; + case WIDX_MINIMUM_LENGTH_DECREASE: + break; + case WIDX_MAXIMUM_LENGTH_INCREASE: + break; + case WIDX_MAXIMUM_LENGTH_DECREASE: + break; + case WIDX_OPERATE_UNK_34: + break; + case WIDX_OPERATE_UNK_36: + break; + case WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE: + break; + case WIDX_OPERATE_NUMBER_OF_CIRCUITS_DECREASE: + break; + } +} + +/** + * + * rct2: 0x006B1165 + */ +static void window_ride_operating_dropdown() +{ + rct_window *w; + short widgetIndex, dropdownIndex; + + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + switch (widgetIndex) { + case WIDX_OPERATE_UNK_34: + break; + case WIDX_OPERATE_UNK_36: + break; + } +} + +/** + * + * rct2: 0x006B178E + */ +static void window_ride_operating_update(rct_window *w) +{ + rct_ride *ride; + + w->frame_no++; + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + widget_invalidate(WC_RIDE, w->number, WIDX_TAB_3); + + ride = GET_RIDE(w->number); + if (ride->var_14D & 10) { + ride->var_14D &= ~10; + window_invalidate(w); + } +} + +/** + * + * rct2: 0x006B0B30 + */ +static void window_ride_operating_invalidate() +{ + rct_window *w; + rct_widget *widgets; + + window_get_register(w); + + widgets = window_ride_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_ride_set_pressed_tab(w); + + rct_ride *ride = GET_RIDE(w->number); + RCT2_GLOBAL(0x013CE952 + 0, uint16) = ride->name; + RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; + + // TODO lots of widget setup + + window_ride_anchor_border_widgets(w); + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); +} + +/** + * + * rct2: 0x006B1001 + */ +static void window_ride_operating_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + rct_ride *ride; + uint16 blockSections; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_ride_draw_tab_images(dpi, w); + + ride = GET_RIDE(w->number); + + gfx_fill_rect_inset( + dpi, + w->x + window_ride_operating_widgets[WIDX_PAGE_BACKGROUND].left + 4, + w->y + 103, + w->x + window_ride_operating_widgets[WIDX_PAGE_BACKGROUND].right - 5, + w->y + 104, + w->colours[1], + 0x20 + ); + + if (ride->mode == 34 || ride->mode == 36) { + blockSections = ride->num_block_brakes + ride->num_stations; + gfx_draw_string_left(dpi, STR_BLOCK_SECTIONS, &blockSections, 0, w->x + 21, ride->mode == 36 ? w->y + 76 : w->y + 61); + } + +} + +#pragma endregion + #pragma region Maintenance /**