From abdfa95b24dd9101e35459fe283e0bfb95ac87a0 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 5 Sep 2014 23:44:02 +0100 Subject: [PATCH] implement most of income tab for ride window --- src/ride.h | 2 +- src/string_ids.h | 6 + src/window_ride.c | 365 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 370 insertions(+), 3 deletions(-) diff --git a/src/ride.h b/src/ride.h index 0d1615fcee..e736e68ec4 100644 --- a/src/ride.h +++ b/src/ride.h @@ -146,7 +146,7 @@ typedef struct { uint16 mechanic; // 0x18E uint8 pad_190[0x03]; uint8 breakdown_reason; // 0x193 - uint8 pad_194[2]; + money16 price_secondary; // 0x194 uint16 var_196; // used in computing excitement, nausea, etc uint8 var_198; diff --git a/src/string_ids.h b/src/string_ids.h index a055583399..f3d1ebd400 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -408,6 +408,7 @@ enum { STR_FOOTPATH_TIP = 1424, STR_CUSTOMERS_PER_HOUR = 1427, + STR_RIDE_INCOME_ADMISSION_PRICE = 1428, STR_FREE = 1430, STR_WALKING = 1431, @@ -627,6 +628,8 @@ enum { STR_MARKETING = 1953, STR_RESEARCH_FUNDING = 1954, + STR_ON_RIDE_PHOTO_PRICE = 1963, + STR_ITEM_START = 1988, STR_ITEM_SINGULAR_START = 2044, STR_ITEM2_START = 2090, @@ -1004,6 +1007,9 @@ enum { STR_REAL_PARKS = STR_BEGINNER_PARKS + 3, STR_OTHER_PARKS = STR_BEGINNER_PARKS + 4, + STR_SAME_PRICE_THROUGHOUT_PARK = 3071, + STR_SAME_PRICE_THROUGHOUT_PARK_TIP = 3072, + STR_LIST_RIDES_TIP = 3104, STR_LIST_SHOPS_AND_STALLS_TIP = 3105, STR_LIST_KIOSKS_AND_FACILITIES_TIP = 3106, diff --git a/src/window_ride.c b/src/window_ride.c index 5ac33e1996..c0e7293b55 100644 --- a/src/window_ride.c +++ b/src/window_ride.c @@ -89,6 +89,17 @@ enum { WIDX_SAVE_DESIGN, WIDX_CANCEL_DESIGN, + WIDX_PRIMARY_PRICE_LABEL = 14, + WIDX_PRIMARY_PRICE, + WIDX_PRIMARY_PRICE_INCREASE, + WIDX_PRIMARY_PRICE_DECREASE, + WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK, + WIDX_SECONDARY_PRICE_LABEL, + WIDX_SECONDARY_PRICE, + WIDX_SECONDARY_PRICE_INCREASE, + WIDX_SECONDARY_PRICE_DECREASE, + WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK, + WIDX_SHOW_GUESTS_THOUGHTS = 14, WIDX_SHOW_GUESTS_ON_RIDE, WIDX_SHOW_GUESTS_QUEUING @@ -194,6 +205,36 @@ static rct_widget window_ride_measurements_widgets[] = { { WIDGETS_END }, }; +// 0x009AE844 +static rct_widget window_ride_income_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_24, 1, 5, 144, 50, 61, 0xFFFFFFFF, STR_NONE }, + { WWT_SPINNER, 1, 147, 308, 50, 61, 1429, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 51, 55, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 56, 60, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_CHECKBOX, 1, 5, 310, 61, 72, STR_SAME_PRICE_THROUGHOUT_PARK, STR_SAME_PRICE_THROUGHOUT_PARK_TIP }, + { WWT_24, 1, 5, 144, 89, 100, 0xFFFFFFFF, STR_NONE }, + { WWT_SPINNER, 1, 147, 308, 89, 100, 1799, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 90, 94, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 297, 307, 95, 99, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_CHECKBOX, 1, 5, 310, 100, 111, STR_SAME_PRICE_THROUGHOUT_PARK, STR_SAME_PRICE_THROUGHOUT_PARK_TIP }, + { WIDGETS_END }, +}; + // 0x009AE9C8 static rct_widget window_ride_customer_widgets[] = { { WWT_FRAME, 0, 0, 315, 0, 206, 0x0FFFFFFFF, STR_NONE }, @@ -226,7 +267,7 @@ static rct_widget *window_ride_page_widgets[] = { window_ride_music_widgets, window_ride_measurements_widgets, (rct_widget*)0x009AE710, - (rct_widget*)0x009AE844, + window_ride_income_widgets, window_ride_customer_widgets }; @@ -286,6 +327,13 @@ static void window_ride_measurements_toolabort(); static void window_ride_measurements_invalidate(); static void window_ride_measurements_paint(); +static void window_ride_income_mouseup(); +static void window_ride_income_resize(); +static void window_ride_income_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); +static void window_ride_income_update(rct_window *w); +static void window_ride_income_invalidate(); +static void window_ride_income_paint(); + static void window_ride_customer_mouseup(); static void window_ride_customer_resize(); static void window_ride_customer_update(rct_window *w); @@ -420,6 +468,38 @@ static void* window_ride_measurements_events[] = { window_ride_emptysub }; +// 0x0098DEF4 +static void* window_ride_income_events[] = { + window_ride_emptysub, + window_ride_income_mouseup, + window_ride_income_resize, + window_ride_income_mousedown, + window_ride_emptysub, + window_ride_emptysub, + window_ride_income_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_income_invalidate, + window_ride_income_paint, + window_ride_emptysub +}; + // 0x0098DE84 static void* window_ride_customer_events[] = { window_ride_emptysub, @@ -461,7 +541,7 @@ static uint32* window_ride_page_events[] = { (uint32*)window_ride_music_events, (uint32*)window_ride_measurements_events, (uint32*)0x0098DF64, - (uint32*)0x0098DEF4, + (uint32*)window_ride_income_events, (uint32*)window_ride_customer_events }; @@ -2456,6 +2536,287 @@ static void window_ride_measurements_paint() #pragma endregion +#pragma region Income + +/** + * + * rct2: 0x006ADEFD + */ +static void window_ride_income_toggle_primary_price(rct_window *w) +{ + +} + +/** + * + * rct2: 0x006AE06E + */ +static void window_ride_income_toggle_secondary_price(rct_window *w) +{ + +} + +/** + * + * rct2: 0x006AE1E4 + */ +static void window_ride_income_increase_primary_price(rct_window *w) +{ + +} + +/** + * + * rct2: 0x006AE237 + */ +static void window_ride_income_decrease_primary_price(rct_window *w) +{ + +} + +/** + * + * rct2: 0x006AE269 + */ +static void window_ride_income_increase_secondary_price(rct_window *w) +{ + +} + +/** + * + * rct2: 0x006AE28D + */ +static void window_ride_income_decrease_secondary_price(rct_window *w) +{ + +} + +/** + * + * rct2: 0x006ADEA9 + */ +static void window_ride_income_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_PRIMARY_PRICE_SAME_THROUGHOUT_PARK: + window_ride_income_toggle_primary_price(w); + break; + case WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK: + window_ride_income_toggle_primary_price(w); + break; + } +} + +/** + * + * rct2: 0x006AE2F8 + */ +static void window_ride_income_resize() +{ + rct_window *w; + + window_get_register(w); + + window_set_resize(w, 316, 177, 316, 177); +} + +/** + * + * rct2: 0x006ADED4 + */ +static void window_ride_income_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) +{ + switch (widgetIndex) { + case WIDX_PRIMARY_PRICE_INCREASE: + window_ride_income_increase_primary_price(w); + break; + case WIDX_PRIMARY_PRICE_DECREASE: + window_ride_income_decrease_primary_price(w); + break; + case WIDX_SECONDARY_PRICE_INCREASE: + window_ride_income_increase_secondary_price(w); + break; + case WIDX_SECONDARY_PRICE_DECREASE: + window_ride_income_decrease_secondary_price(w); + break; + } +} + +/** + * + * rct2: 0x006AE2BF + */ +static void window_ride_income_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_9); + + ride = GET_RIDE(w->number); + if (ride->var_14D & 2) { + ride->var_14D &= ~2; + window_invalidate(w); + } +} + +/** + * + * rct2: 0x006ADAA3 + */ +static void window_ride_income_invalidate() +{ + rct_window *w; + rct_widget *widgets; + rct_ride_type *rideEntry, **rideEntries = (rct_ride_type**)0x009ACFA4; + rct_string_id stringId; + int primaryItem, secondaryItem; + + 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; + + rideEntry = rideEntries[ride->subtype]; + + // Primary item + w->pressed_widgets &= ~(1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); + w->disabled_widgets &= ~(1 << WIDX_PRIMARY_PRICE); + if ( + !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) && + rideEntry->shop_item == 255 && + ride->type != RIDE_TYPE_BATHROOM + ) { + w->disabled_widgets |= (1 << WIDX_PRIMARY_PRICE); + } + + window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = STR_RIDE_INCOME_ADMISSION_PRICE; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].image = STR_ON_RIDE_PHOTO_PRICE; + window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_EMPTY; + + window_ride_income_widgets[WIDX_PRIMARY_PRICE].image = 1429; + RCT2_GLOBAL(0x013CE952 + 6, money32) = ride->price; + if (ride->price == 0) + window_ride_income_widgets[WIDX_PRIMARY_PRICE].image = STR_FREE; + + primaryItem = 31; + if (ride->type != RIDE_TYPE_BATHROOM) { + if ((primaryItem = (sint8)rideEntry->shop_item) != -1) { + window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_CHECKBOX; + if (primaryItem < 32) { + if (RCT2_GLOBAL(0x01358838, uint32) & (1 << primaryItem)) + w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); + + if (primaryItem != 31) + window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = 1960 + primaryItem; + } else { + primaryItem -= 32; + if (RCT2_GLOBAL(0x0135934C, uint32) & (1 << primaryItem)) + w->pressed_widgets |= (1 << WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK); + + window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = 2100 + primaryItem; + } + } + } + + // Get secondary item + secondaryItem = RCT2_GLOBAL(0x0097D7CB + (ride->type * 4), uint8); + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO)) { + if ((secondaryItem = (sint8)rideEntry->shop_item_secondary) != -1) { + // Set secondary item label + stringId = 1960 + secondaryItem; + if (stringId >= 1992) + stringId += 108; + + window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].image = stringId; + } + } + + if (secondaryItem == -1) { + // Hide secondary item widgets + window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].type = WWT_EMPTY; + window_ride_income_widgets[WIDX_SECONDARY_PRICE].type = WWT_EMPTY; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_INCREASE].type = WWT_EMPTY; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_DECREASE].type = WWT_EMPTY; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_EMPTY; + } else { + // Set same price throughout park checkbox + w->pressed_widgets &= ~(1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); + if (secondaryItem < 32) { + if (RCT2_GLOBAL(0x01358838, uint32) & (1 << secondaryItem)) + w->pressed_widgets |= (1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); + } else { + secondaryItem -= 32; + if (RCT2_GLOBAL(0x0135884C, uint32) & (1 << secondaryItem)) + w->pressed_widgets |= (1 << WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK); + } + + // Show widgets + window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].type = WWT_24; + window_ride_income_widgets[WIDX_SECONDARY_PRICE].type = WWT_SPINNER; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_INCREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_DECREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_income_widgets[WIDX_SECONDARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_CHECKBOX; + + // Set secondary item price + window_ride_income_widgets[WIDX_SECONDARY_PRICE].image = 1799; + RCT2_GLOBAL(0x013CE952 + 10, money32) = ride->price_secondary; + if (ride->price_secondary == 0) + window_ride_income_widgets[WIDX_SECONDARY_PRICE].image = STR_FREE; + } + + window_ride_anchor_border_widgets(w); + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); +} + +/** + * + * rct2: 0x006ADCE5 + */ +static void window_ride_income_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_ride_draw_tab_images(dpi, w); +} + +#pragma endregion + #pragma region Customer /**