diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index f9f7d152b3..fd191ae483 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -39,6 +39,7 @@ + @@ -67,6 +68,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index e7ba2bd880..4883136cbc 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -105,6 +105,9 @@ Header Files + + Header Files + @@ -215,6 +218,9 @@ Windows + + Source Files + diff --git a/src/addresses.h b/src/addresses.h index 2089aa5fe8..e0bac3aaf0 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -48,6 +48,7 @@ #define RCT2_ADDRESS_APP_PATH 0x009AA214 #define RCT2_ADDRESS_CONFIG_FLAGS 0x009AAC74 +#define RCT2_ADDRESS_CONFIG_METRIC 0x009AAC78 #define RCT2_ADDRESS_CONFIG_FAHRENHEIT 0x009AAC79 #define RCT2_ADDRESS_CONFIG_KEYBOARD_SHORTCUTS 0x009AAC7A #define RCT2_ADDRESS_CONFIG_EDGE_SCROLLING 0x009AACBA @@ -120,6 +121,7 @@ #define RCT2_ADDRESS_SPRITES_START_LITTER 0x013573C4 #define RCT2_ADDRESS_CURRENT_LOAN 0x013573E0 +#define RCT2_ADDRESS_GAME_FLAGS 0x013573E4 #define RCT2_ADDRESS_GUESTS_IN_PARK 0x01357844 #define RCT2_ADDRESS_CURRENT_PARK_RATING 0x01357CB0 #define RCT2_ADDRESS_PARK_RATING_HISTORY 0x01357CB2 @@ -131,6 +133,7 @@ #define RCT2_ADDRESS_CURRENT_PARK_VALUE 0x0135853C #define RCT2_ADDRESS_COMPLETED_COMPANY_VALUE 0x01358740 #define RCT2_ADDRESS_CURRENT_COMPANY_VALUE 0x0135874C +#define RCT2_ADDRESS_AWARD_LIST 0x01358760 #define RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED 0x013587F8 #define RCT2_ADDRESS_MAP_SIZE 0x01358834 diff --git a/src/config.c b/src/config.c index 68c356239c..11a821a5f0 100644 --- a/src/config.c +++ b/src/config.c @@ -40,12 +40,12 @@ void config_load() if (RCT2_GLOBAL(0x009AB4C6, sint8) == 1) return; RCT2_GLOBAL(0x009AB4C6, sint8) = 1; - RCT2_GLOBAL(0x009AAC78, sint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FAHRENHEIT, sint8) = 1; RCT2_GLOBAL(0x009AACBB, sint8) = 1; RCT2_GLOBAL(0x009AACBD, sint16) = 0; if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) - RCT2_GLOBAL(0x009AACBD, sint16) = (RCT2_GLOBAL(0x009AAC78, sint8) + 1) * 256; + RCT2_GLOBAL(0x009AACBD, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; RCT2_GLOBAL(0x009AA00D, sint8) = 1; } } @@ -61,6 +61,6 @@ void config_load() RCT2_GLOBAL(0x009AAC76, sint8) = RCT2_ADDRESS(0x009AF604, sint8)[RCT2_GLOBAL(0x009AAC77, sint8)]; RCT2_GLOBAL(0x009AACBD, sint16) = 0; if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) - RCT2_GLOBAL(0x009AACBD, sint16) = (RCT2_GLOBAL(0x009AAC78, sint8) + 1) * 256; + RCT2_GLOBAL(0x009AACBD, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; RCT2_GLOBAL(0x009AA00D, sint8) = 1; } \ No newline at end of file diff --git a/src/park.c b/src/park.c index a1d8f87a1b..ec02f64504 100644 --- a/src/park.c +++ b/src/park.c @@ -24,6 +24,11 @@ #include "ride.h" #include "sprite.h" +int park_is_open() +{ + return (RCT2_GLOBAL(RCT2_ADDRESS_GAME_FLAGS, uint32) & GAME_FLAGS_PARK_OPEN) != 0; +} + /** * * rct2: 0x00667132 diff --git a/src/park.h b/src/park.h index 85b2a64fd6..4d3829e8a0 100644 --- a/src/park.h +++ b/src/park.h @@ -26,6 +26,32 @@ #define DECRYPT_MONEY(money) rol32((money) ^ 0xF4EC9621, 13) #define ENCRYPT_MONEY(money) (ror32((money), 13) ^ 0xF4EC9621) +typedef struct { + uint16 time; + uint16 type; +} rct_award; + +enum { + PARK_AWARD_MOST_UNTIDY, + PARK_AWARD_MOST_TIDY, + PARK_AWARD_BEST_ROLLERCOASTERS, + PARK_AWARD_BEST_VALUE, + PARK_AWARD_MOST_BEAUTIFUL, + PARK_AWARD_WORST_VALUE, + PARK_AWARD_SAFEST, + PARK_AWARD_BEST_STAFF, + PARK_AWARD_BEST_FOOD, + PARK_AWARD_WORST_FOOD, + PARK_AWARD_BEST_RESTROOMS, + PARK_AWARD_MOST_DISAPPOINTING, + PARK_AWARD_BEST_WATER_RIDES, + PARK_AWARD_BEST_CUSTOM_DESIGNED_RIDES, + PARK_AWARD_MOST_DAZZLING_RIDE_COLOURS, + PARK_AWARD_MOST_CONFUSING_LAYOUT, + PARK_AWARD_BEST_GENTLE_RIDES, +}; + +int park_is_open(); void park_init(); int calculate_park_rating(); diff --git a/src/peep.c b/src/peep.c index d44e7acf74..0eec3d0536 100644 --- a/src/peep.c +++ b/src/peep.c @@ -23,6 +23,24 @@ #include "rct2.h" #include "sprite.h" +int peep_get_staff_count() +{ + uint16 sprite_index; + rct_peep *peep; + int count = 0; + + sprite_index = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); + while (sprite_index != SPRITE_INDEX_NULL) { + peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[sprite_index].peep); + sprite_index = peep->next; + + if (peep->type == PEEP_TYPE_STAFF) + count++; + } + + return count; +} + /** * * rct2: 0x0068F0A9 diff --git a/src/peep.h b/src/peep.h index 4ee4b34376..593c181a46 100644 --- a/src/peep.h +++ b/src/peep.h @@ -88,6 +88,7 @@ typedef struct { uint8 hat_colour; // 0xF8 } rct_peep; +int peep_get_staff_count(); void peep_update_all(); #endif \ No newline at end of file diff --git a/src/rct2.h b/src/rct2.h index 454bea7445..3157b8e270 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -120,6 +120,11 @@ enum { }; +enum { + GAME_FLAGS_PARK_OPEN = (1 << 0), + GAME_FLAGS_NO_MONEY = (1 << 11) +}; + void rct2_endupdate(); char *get_file_path(int pathId); void get_system_time(); diff --git a/src/ride.c b/src/ride.c index 7fc47eb73c..9742492f6d 100644 --- a/src/ride.c +++ b/src/ride.c @@ -24,6 +24,20 @@ #define GET_RIDE(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[x])) #define GET_RIDE_MEASUREMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_MEASUREMENTS, rct_ride_measurement)[x])) +int ride_get_count() +{ + rct_ride *ride; + int i, count = 0; + + for (i = 0; i < MAX_RIDES; i++) { + ride = GET_RIDE(i); + if (ride->type != RIDE_TYPE_NULL) + count++; + } + + return count; +} + /** * * rct2: 0x006ACA89 diff --git a/src/ride.h b/src/ride.h index ab16329574..a4fe774571 100644 --- a/src/ride.h +++ b/src/ride.h @@ -163,9 +163,10 @@ enum { RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER }; -#define MAX_RIDES 256 +#define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 +int ride_get_count(); void ride_init_all(); #endif \ No newline at end of file diff --git a/src/sprites.h b/src/sprites.h index 52b199bd5d..5b52bab824 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -52,6 +52,50 @@ enum { SPR_AWARD = 5194, SPR_GRAPH = 5195, + SPR_TAB_GRAPH_0 = 5245, + SPR_TAB_GRAPH_1 = SPR_TAB_GRAPH_0 + 1, + SPR_TAB_GRAPH_2 = SPR_TAB_GRAPH_0 + 2, + SPR_TAB_GRAPH_3 = SPR_TAB_GRAPH_0 + 3, + SPR_TAB_GRAPH_4 = SPR_TAB_GRAPH_0 + 4, + SPR_TAB_GRAPH_5 = SPR_TAB_GRAPH_0 + 5, + SPR_TAB_GRAPH_6 = SPR_TAB_GRAPH_0 + 6, + SPR_TAB_GRAPH_7 = SPR_TAB_GRAPH_0 + 7, + + SPR_TAB_ADMISSION_0 = 5253, + SPR_TAB_ADMISSION_1 = SPR_TAB_ADMISSION_0 + 1, + SPR_TAB_ADMISSION_2 = SPR_TAB_ADMISSION_0 + 2, + SPR_TAB_ADMISSION_3 = SPR_TAB_ADMISSION_0 + 3, + SPR_TAB_ADMISSION_4 = SPR_TAB_ADMISSION_0 + 4, + SPR_TAB_ADMISSION_5 = SPR_TAB_ADMISSION_0 + 5, + SPR_TAB_ADMISSION_6 = SPR_TAB_ADMISSION_0 + 6, + SPR_TAB_ADMISSION_7 = SPR_TAB_ADMISSION_0 + 7, + + SPR_TAB_STATS_0 = 5277, + SPR_TAB_STATS_1 = SPR_TAB_STATS_0 + 1, + SPR_TAB_STATS_2 = SPR_TAB_STATS_0 + 2, + SPR_TAB_STATS_3 = SPR_TAB_STATS_0 + 3, + SPR_TAB_STATS_4 = SPR_TAB_STATS_0 + 4, + SPR_TAB_STATS_5 = SPR_TAB_STATS_0 + 5, + SPR_TAB_STATS_6 = SPR_TAB_STATS_0 + 6, + + SPR_AWARD_MOST_UNTIDY = 5469, + SPR_MOST_TIDY = SPR_AWARD_MOST_UNTIDY + 1, + SPR_BEST_ROLLERCOASTERS = SPR_AWARD_MOST_UNTIDY + 2, + SPR_BEST_VALUE = SPR_AWARD_MOST_UNTIDY + 3, + SPR_MOST_BEAUTIFUL = SPR_AWARD_MOST_UNTIDY + 4, + SPR_WORST_VALUE = SPR_AWARD_MOST_UNTIDY + 5, + SPR_SAFEST = SPR_AWARD_MOST_UNTIDY + 6, + SPR_BEST_STAFF = SPR_AWARD_MOST_UNTIDY + 7, + SPR_BEST_FOOD = SPR_AWARD_MOST_UNTIDY + 8, + SPR_WORST_FOOD = SPR_AWARD_MOST_UNTIDY + 9, + SPR_BEST_RESTROOMS = SPR_AWARD_MOST_UNTIDY + 10, + SPR_MOST_DISAPPOINTING = SPR_AWARD_MOST_UNTIDY + 11, + SPR_BEST_WATER_RIDES = SPR_AWARD_MOST_UNTIDY + 12, + SPR_BEST_CUSTOM_DESIGNED_RIDES = SPR_AWARD_MOST_UNTIDY + 13, + SPR_MOST_DAZZLING_RIDE_COLOURS = SPR_AWARD_MOST_UNTIDY + 14, + SPR_MOST_CONFUSING_LAYOUT = SPR_AWARD_MOST_UNTIDY + 15, + SPR_BEST_GENTLE_RIDES = SPR_AWARD_MOST_UNTIDY + 16, + SPR_LAND_TOOL_DECREASE = 5499, SPR_LAND_TOOL_INCREASE = 5501, @@ -82,6 +126,8 @@ enum { SPR_TAB_OBJECTIVE_14 = SPR_TAB_OBJECTIVE_0 + 14, SPR_TAB_OBJECTIVE_15 = SPR_TAB_OBJECTIVE_0 + 15, + SPR_TAB_AWARDS = 5527, + SPR_TOOLBAR_PAUSE = 5597, SPR_TOOLBAR_FILE = 5599, SPR_TOOLBAR_ZOOM_OUT = 5601, diff --git a/src/strings.h b/src/strings.h index 7977c8ec30..40e89cb6b6 100644 --- a/src/strings.h +++ b/src/strings.h @@ -133,6 +133,8 @@ enum { STR_MONTH_SHORT_NOV = STR_MONTH_SHORT_JAN + 10, STR_MONTH_SHORT_DEC = STR_MONTH_SHORT_JAN + 11, + STR_CLOSE_X = 824, + STR_CLOSE_WINDOW_TIP = 828, STR_WINDOW_TITLE_TIP = 829, @@ -152,6 +154,8 @@ enum { STR_LOWER_COST_AMOUNT = 985, STR_COST_AMOUNT = 986, + STR_OPEN_OR_CLOSE_PARK_TIP = 1010, + STR_LOCATE_SUBJECT_TIP = 1027, STR_RIDES_IN_PARK_TIP = 1053, @@ -161,13 +165,21 @@ enum { STR_BUILD_FOOTPATH_TIP = 1173, + STR_NUMERIC_UP = 1218, + STR_NUMERIC_DOWN = 1219, + STR_GUESTS = 1463, STR_GUESTS_TIP = 1693, STR_STAFF_TIP = 1694, + STR_NAME_PARK_TIP = 1720, + STR_PARK_CLOSED = 1721, + STR_PARK_OPEN = 1722, + STR_INDIVIDUAL_GUESTS_TIP = 1752, STR_SUMMARISED_GUESTS_TIP = 1753, + STR_ADMISSION_PRICE = 1756, STR_ACTIONS = 1814, STR_THOUGHTS = STR_ACTIONS + 1, @@ -193,7 +205,17 @@ enum { STR_CELCIUS_VALUE = 2216, STR_FAHRENHEIT_VALUE = 2217, - STR_PARK_rating_TIP = 2221, + STR_PARK_RATING_TIP = 2221, + + STR_GUESTS_IN_PARK_LABEL = 2223, + + STR_NUMBER_OF_RIDES_LABEL = 2321, + STR_STAFF_LABEL = 2322, + STR_PARK_SIZE_METRIC_LABEL = 2323, + STR_PARK_SIZE_IMPERIAL_LABEL = 2324, + + SPR_BUY_LAND_RIGHTS_TIP = 2325, + SPR_BUY_CONSTRUCTION_RIGHTS_TIP = 2326, STR_PARK_INFORMATION_TIP = 2233, @@ -235,13 +257,43 @@ enum { STR_OBJECTIVE_REPLAY_LOAN_AND_PARK_VALUE = STR_OBJECTIVE_NONE + 10, STR_OBJECTIVE_MONTHLY_FOOD_INCOME = STR_OBJECTIVE_NONE + 11, + STR_PARK_ENTRANCE_TAB_TIP = 2462, + STR_PARK_RATING_TAB_TIP = 2463, + STR_PARK_GUESTS_TAB_TIP = 2464, + STR_PARK_PRICE_TAB_TIP = 2465, + STR_PARK_STATS_TAB_TIP = 2466, + STR_PARK_OBJECTIVE_TAB_TIP = 2467, + STR_PARK_AWARDS_TAB_TIP = 2468, + STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP = 2482, + STR_ENTER_NAME_INTO_SCENARIO_CHART = 2790, + STR_COMPLETED_BY_WITH_COMPANY_VALUE = 2794, STR_SHOW_GUESTS_ON_MAP_TIP = 2803, STR_SHOW_MAP_TIP = 2805, + STR_AWARD_MOST_UNTIDY = 2814, + STR_MOST_TIDY = STR_AWARD_MOST_UNTIDY + 1, + STR_BEST_ROLLERCOASTERS = STR_AWARD_MOST_UNTIDY + 2, + STR_BEST_VALUE = STR_AWARD_MOST_UNTIDY + 3, + STR_MOST_BEAUTIFUL = STR_AWARD_MOST_UNTIDY + 4, + STR_WORST_VALUE = STR_AWARD_MOST_UNTIDY + 5, + STR_SAFEST = STR_AWARD_MOST_UNTIDY + 6, + STR_BEST_STAFF = STR_AWARD_MOST_UNTIDY + 7, + STR_BEST_FOOD = STR_AWARD_MOST_UNTIDY + 8, + STR_WORST_FOOD = STR_AWARD_MOST_UNTIDY + 9, + STR_BEST_RESTROOMS = STR_AWARD_MOST_UNTIDY + 10, + STR_MOST_DISAPPOINTING = STR_AWARD_MOST_UNTIDY + 11, + STR_BEST_WATER_RIDES = STR_AWARD_MOST_UNTIDY + 12, + STR_BEST_CUSTOM_DESIGNED_RIDES = STR_AWARD_MOST_UNTIDY + 13, + STR_MOST_DAZZLING_RIDE_COLOURS = STR_AWARD_MOST_UNTIDY + 14, + STR_MOST_CONFUSING_LAYOUT = STR_AWARD_MOST_UNTIDY + 15, + STR_BEST_GENTLE_RIDES = STR_AWARD_MOST_UNTIDY + 16, + + STR_NO_RECENT_AWARDS = 2848, + STR_TUTORIAL = 2856, STR_PRESS_KEY_OR_MOUSE_BUTTON_FOR_CONTROL = 2857, diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000000..4158be5eeb --- /dev/null +++ b/src/util.c @@ -0,0 +1,28 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "util.h" + +int squaredmetres_to_squaredfeet(int squaredMetres) +{ + // 1 metre squared = 10.7639104 feet squared + // how its done in RCT2 + return squaredMetres * 11; +} \ No newline at end of file diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000000..194b5982b9 --- /dev/null +++ b/src/util.h @@ -0,0 +1,26 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#ifndef _UTIL_H_ +#define _UTIL_H_ + +int squaredmetres_to_squaredfeet(int squaredMetres); + +#endif \ No newline at end of file diff --git a/src/viewport.h b/src/viewport.h index 4a7751c67c..648cef7a80 100644 --- a/src/viewport.h +++ b/src/viewport.h @@ -34,7 +34,7 @@ enum { VIEWPORT_FLAG_GRIDLINES = (1 << 7), VIEWPORT_FLAG_LAND_OWNERSHIP = (1 << 8), VIEWPORT_FLAG_9 = (1 << 9), - VIEWPORT_FLAG_10 = (1 << 10), + VIEWPORT_FLAG_SOUND_ON = (1 << 10), VIEWPORT_FLAG_INVISIBLE_PEEPS = (1 << 11), VIEWPORT_FLAG_HIDE_BASE = (1 << 12), VIEWPORT_FLAG_HIDE_VERTICAL = (1 << 13), diff --git a/src/window.c b/src/window.c index da6f787de8..fa0fc7415d 100644 --- a/src/window.c +++ b/src/window.c @@ -162,7 +162,7 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han w->var_484 = 0; w->var_486 = 0; w->var_488 = 0; - w->var_48A = 0; + w->page = 0; w->var_48C = 0; w->var_48E = 0; w->var_490 = 0; diff --git a/src/window.h b/src/window.h index eeea2ed3bb..df062d176b 100644 --- a/src/window.h +++ b/src/window.h @@ -116,7 +116,7 @@ typedef struct rct_window { sint16 var_484; sint16 var_486; sint16 var_488; - sint16 var_48A; + sint16 page; sint16 var_48C; sint16 var_48E; sint16 var_490; diff --git a/src/window_cheats.c b/src/window_cheats.c index d9729427f8..a9085d3df0 100644 --- a/src/window_cheats.c +++ b/src/window_cheats.c @@ -108,7 +108,7 @@ void window_cheats_open() window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_HIGH_MONEY); window_init_scroll_widgets(window); - window->var_48A = WINDOW_CHEATS_PAGE_MONEY; + window->page = WINDOW_CHEATS_PAGE_MONEY; window->colours[0] = 1; window->colours[1] = 19; window->colours[2] = 19; @@ -159,7 +159,7 @@ static void window_cheats_invalidate() // Set correct active tab for (i = 0; i < 7; i++) w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); - w->pressed_widgets |= 1 << (WIDX_TAB_1 + w->var_48A); + w->pressed_widgets |= 1 << (WIDX_TAB_1 + w->page); } static void window_cheats_paint() @@ -181,7 +181,7 @@ static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) // Money tab if (!(w->disabled_widgets & (1 << WIDX_TAB_1))) { sprite_idx = 5261; - if (w->var_48A == WINDOW_CHEATS_PAGE_MONEY) + if (w->page == WINDOW_CHEATS_PAGE_MONEY) sprite_idx += (w->var_48E / 2) % 8; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top); } @@ -189,7 +189,7 @@ static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) // Guests tab if (!(w->disabled_widgets & (1 << WIDX_TAB_2))) { sprite_idx = 5568; - if (w->var_48A == WINDOW_CHEATS_PAGE_GUESTS) + if (w->page == WINDOW_CHEATS_PAGE_GUESTS) sprite_idx += w->var_48E / 4; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top); } diff --git a/src/window_game_bottom_toolbar.c b/src/window_game_bottom_toolbar.c index e3626a81f8..222e60eff1 100644 --- a/src/window_game_bottom_toolbar.c +++ b/src/window_game_bottom_toolbar.c @@ -50,7 +50,7 @@ rct_widget window_game_bottom_toolbar_widgets[] = { { WWT_IMGBTN, 0, 0x0002, 0x0075, 2, 31, 0xFFFFFFFF, STR_NONE }, // Left inset panel { WWT_FLATBTN, 0, 0x0002, 0x0075, 1, 12, 0xFFFFFFFF, STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP }, // Money window { WWT_FLATBTN, 0, 0x0002, 0x0075, 11, 22, 0xFFFFFFFF, STR_NONE }, // Guests window - { WWT_FLATBTN, 0, 0x0002, 0x0075, 21, 31, 0xFFFFFFFF, STR_PARK_rating_TIP }, // Park rating window + { WWT_FLATBTN, 0, 0x0002, 0x0075, 21, 31, 0xFFFFFFFF, STR_PARK_RATING_TIP }, // Park rating window { WWT_IMGBTN, 2, 0x0078, 0x0207, 0, 33, 0xFFFFFFFF, STR_NONE }, // Middle outset panel { WWT_25, 2, 0x007A, 0x0205, 2, 31, 0xFFFFFFFF, STR_NONE }, // Middle inset panel diff --git a/src/window_park.c b/src/window_park.c index d6ef701378..c12689b5ee 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -20,15 +20,21 @@ #include "addresses.h" #include "date.h" +#include "park.h" +#include "peep.h" +#include "ride.h" +#include "scenario.h" #include "strings.h" #include "sprites.h" +#include "util.h" +#include "viewport.h" #include "widget.h" #include "window.h" enum WINDOW_PARK_PAGE { WINDOW_PARK_PAGE_ENTRANCE, - WINDOW_PARK_PAGE_RATING_GRAPH, - WINDOW_PARK_PAGE_GUESTS_GRAPH, + WINDOW_PARK_PAGE_RATING, + WINDOW_PARK_PAGE_GUESTS, WINDOW_PARK_PAGE_PRICE, WINDOW_PARK_PAGE_STATS, WINDOW_PARK_PAGE_OBJECTIVE, @@ -47,63 +53,508 @@ enum WINDOW_PARK_WIDGET_IDX { WIDX_TAB_5, WIDX_TAB_6, WIDX_TAB_7, - WIDX_ENTER_NAME + + WIDX_VIEWPORT = 11, + WIDX_STATUS, + WIDX_OPEN_OR_CLOSE, + WIDX_BUY_LAND_RIGHTS, + WIDX_BUY_CONSTRUCTION_RIGHTS, + WIDX_LOCATE, + WIDX_RENAME, + + WIDX__ = 11, + WIDX_PRICE, + WIDX_INCREASE_PRICE, + WIDX_DECREASE_PRICE, + + WIDX_ENTER_NAME = 11 }; -static rct_widget window_park_objective_widgets[] = { - { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, 65535}, // panel / background - { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP}, // title bar - { WWT_CLOSEBOX, 0, 217, 227, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP}, // close x button - { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, 65535}, // tab content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, 2462}, // tab 1 - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, 2463}, // tab 2 - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, 2464}, // tab 3 - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, 2465}, // tab 4 - { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, 2466}, // tab 5 - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, 2467}, // tab 6 - { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, 2468}, // tab 7 - { WWT_DROPDOWN_BUTTON, 1, 7, 222, 209, 220, 0x0AE6, 65535}, // enter name +#pragma region Widgets + +static rct_widget window_park_entrance_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + + { WWT_VIEWPORT, 1, 3, 204, 46, 160, 0x0FFFFFFFF, STR_NONE }, // viewport + { WWT_12, 1, 3, 204, 161, 171, 0x0FFFFFFFF, STR_NONE }, // + { WWT_FLATBTN, 1, 205, 228, 49, 72, 0x0FFFFFFFF, STR_OPEN_OR_CLOSE_PARK_TIP }, // open / close + { WWT_FLATBTN, 1, 205, 228, 73, 96, SPR_BUY_LAND_RIGHTS, SPR_BUY_LAND_RIGHTS_TIP }, // buy land rights + { WWT_FLATBTN, 1, 205, 228, 97, 120, SPR_BUY_CONSTRUCTION_RIGHTS, SPR_BUY_CONSTRUCTION_RIGHTS_TIP }, // buy construction rights + { WWT_FLATBTN, 1, 205, 228, 121, 144, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP }, // locate + { WWT_FLATBTN, 1, 205, 228, 145, 168, SPR_RENAME, STR_NAME_PARK_TIP }, // rename { WIDGETS_END }, }; -static void window_park_objective_emptysub() { } +static rct_widget window_park_rating_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + { WIDGETS_END }, +}; + +static rct_widget window_park_guests_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + { WIDGETS_END }, +}; + +static rct_widget window_park_price_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + + + { WWT_24, 1, 7, 146, 50, 61, STR_ADMISSION_PRICE, STR_NONE }, // + { WWT_15, 1, 147, 222, 50, 61, 0x595, STR_NONE }, // price + { WWT_DROPDOWN_BUTTON, 1, 211, 221, 51, 55, STR_NUMERIC_UP, STR_NONE }, // increase price + { WWT_DROPDOWN_BUTTON, 1, 211, 221, 56, 60, STR_NUMERIC_DOWN, STR_NONE }, // decrease price + { WIDGETS_END }, +}; + +static rct_widget window_park_stats_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + { WIDGETS_END }, +}; + +static rct_widget window_park_objective_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + + { WWT_DROPDOWN_BUTTON, 1, 7, 222, 209, 220, STR_ENTER_NAME_INTO_SCENARIO_CHART, STR_NONE }, // enter name + { WIDGETS_END }, +}; + +static rct_widget window_park_awards_widgets[] = { + { WWT_FRAME, 0, 0, 229, 0, 223, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 228, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 217, 227, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_IMGBTN, 1, 0, 229, 43, 173, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_PARK_ENTRANCE_TAB_TIP }, // tab 1 + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_PARK_RATING_TAB_TIP }, // tab 2 + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_GUESTS_TAB_TIP }, // tab 3 + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_PARK_PRICE_TAB_TIP }, // tab 4 + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_PARK_STATS_TAB_TIP }, // tab 5 + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_PARK_OBJECTIVE_TAB_TIP }, // tab 6 + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 + { WIDGETS_END }, +}; + +static rct_widget *window_park_page_widgets[] = { + window_park_entrance_widgets, + window_park_rating_widgets, + window_park_guests_widgets, + window_park_price_widgets, + window_park_stats_widgets, + window_park_objective_widgets, + window_park_awards_widgets +}; + +#pragma endregion + +#pragma region Events + +static void window_park_emptysub() { } + +static void window_park_entrance_close(); +static void window_park_entrance_mouseup(); +static void window_park_entrance_update(); +static void window_park_entrance_invalidate(); +static void window_park_entrance_paint(); + +static void window_park_rating_mouseup(); +static void window_park_rating_update(); +static void window_park_rating_invalidate(); +static void window_park_rating_paint(); + +static void window_park_guests_mouseup(); +static void window_park_guests_update(); +static void window_park_guests_invalidate(); +static void window_park_guests_paint(); + +static void window_park_price_mouseup(); +static void window_park_price_update(); +static void window_park_price_invalidate(); +static void window_park_price_paint(); + +static void window_park_stats_mouseup(); +static void window_park_stats_update(); +static void window_park_stats_invalidate(); +static void window_park_stats_paint(); + static void window_park_objective_mouseup(); static void window_park_objective_update(); static void window_park_objective_invalidate(); static void window_park_objective_paint(); -static uint32 window_park_objective_events[] = { - window_park_objective_emptysub, - window_park_objective_mouseup, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_update, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_emptysub, - window_park_objective_invalidate, - window_park_objective_paint, - window_park_objective_emptysub +static void window_park_awards_mouseup(); +static void window_park_awards_update(); +static void window_park_awards_invalidate(); +static void window_park_awards_paint(); + +static uint32 window_park_entrance_events[] = { + window_park_entrance_close, + window_park_entrance_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_entrance_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_entrance_invalidate, + window_park_entrance_paint, + window_park_emptysub }; +static uint32 window_park_rating_events[] = { + window_park_emptysub, + window_park_rating_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_rating_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_rating_invalidate, + window_park_rating_paint, + window_park_emptysub +}; + +static uint32 window_park_guests_events[] = { + window_park_emptysub, + window_park_guests_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_guests_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_guests_invalidate, + window_park_guests_paint, + window_park_emptysub +}; + +static uint32 window_park_price_events[] = { + window_park_emptysub, + window_park_price_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_price_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_price_invalidate, + window_park_price_paint, + window_park_emptysub +}; + +static uint32 window_park_stats_events[] = { + window_park_emptysub, + window_park_stats_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_stats_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_stats_invalidate, + window_park_stats_paint, + window_park_emptysub +}; + +static uint32 window_park_objective_events[] = { + window_park_emptysub, + window_park_objective_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_objective_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_objective_invalidate, + window_park_objective_paint, + window_park_emptysub +}; + +static uint32 window_park_awards_events[] = { + window_park_emptysub, + window_park_awards_mouseup, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_awards_update, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_emptysub, + window_park_awards_invalidate, + window_park_awards_paint, + window_park_emptysub +}; + +static uint32 *window_park_page_events[] = { + window_park_entrance_events, + window_park_rating_events, + window_park_guests_events, + window_park_price_events, + window_park_stats_events, + window_park_objective_events, + window_park_awards_events +}; + +#pragma endregion + +#pragma region Enabled widgets + +static uint32 window_park_page_enabled_widgets[] = { + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7) | + (1 << WIDX_OPEN_OR_CLOSE) | + (1 << WIDX_BUY_LAND_RIGHTS) | + (1 << WIDX_BUY_CONSTRUCTION_RIGHTS) | + (1 << WIDX_LOCATE) | + (1 << WIDX_RENAME), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7) | + (1 << WIDX_INCREASE_PRICE) | + (1 << WIDX_DECREASE_PRICE), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7) | + (1 << WIDX_ENTER_NAME), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_TAB_7) +}; + +#pragma endregion + +static void window_park_set_page(rct_window *w, int page); +static void window_park_anchor_border_widgets(rct_window *w); static void window_park_align_tabs(rct_window *w); +static void window_park_set_pressed_tab(rct_window *w); static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); /** @@ -125,7 +576,7 @@ rct_window *window_park_open() w->widgets = 0x009A8E68; w->enabled_widgets = 0x0003E7F4; w->number = 0; - w->var_48A = WINDOW_PARK_PAGE_ENTRANCE; + w->page = WINDOW_PARK_PAGE_ENTRANCE; w->var_482 = 0; w->var_48E = 0; w->var_490 = -1; @@ -139,6 +590,525 @@ rct_window *window_park_open() return w; } +#pragma region Entrance page + +/** + * + * rct2: 0x0066860C + */ +static void window_park_entrance_close() +{ + rct_window *w; + + __asm mov w, esi + + if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) + if (w->classification == RCT2_GLOBAL(0x009DE544, rct_windowclass) && w->number == RCT2_GLOBAL(0x009DE542, rct_windownumber)) + RCT2_CALLPROC_EBPSAFE(0x006EE281); +} + +/** + * + * rct2: 0x0066817C + */ +static void window_park_entrance_mouseup() +{ + short widgetIndex; + rct_window *w; + + __asm mov widgetIndex, dx + __asm mov w, esi + + 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: + window_park_set_page(w, widgetIndex - WIDX_TAB_1); + break; + case WIDX_BUY_LAND_RIGHTS: + RCT2_CALLPROC_X(0x006682F7, 0, 0, 0, 0, w, 0, 0); + break; + case WIDX_BUY_CONSTRUCTION_RIGHTS: + RCT2_CALLPROC_X(0x00668393, 0, 0, 0, 0, w, 0, 0); + break; + case WIDX_LOCATE: + RCT2_CALLPROC_X(0x0066842F, 0, 0, 0, 0, w, 0, 0); + break; + case WIDX_RENAME: + RCT2_CALLPROC_X(0x0066857E, 0, 0, 0, 0, w, 0, 0); + break; + } +} + +/** + * + * rct2: 0x006686B5 + */ +static void window_park_entrance_update() +{ + rct_window *w; + + __asm mov w, esi + + w->var_48E++; + window_invalidate_by_id(w->classification, 1179); +} + +/** + * + * rct2: 0x00667FDC + */ +static void window_park_entrance_invalidate() +{ + int i; + rct_window *w; + + __asm mov w, esi + + w->widgets = window_park_page_widgets[w->page]; + window_init_scroll_widgets(w); + + window_park_set_pressed_tab(w); + + // Set open / close park button state + RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].image = park_is_open() ? SPR_OPEN : SPR_CLOSED; + + // Only allow closing of park for guest / rating objective + if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_GUESTS_AND_RATING) + w->disabled_widgets |= (1 << WIDX_OPEN_OR_CLOSE); + + window_park_align_tabs(w); + window_park_anchor_border_widgets(w); + + // Only allow closing of park and purchase of land when there is money + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_FLAGS, uint32) & GAME_FLAGS_NO_MONEY) { + window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_EMPTY; + window_park_entrance_widgets[WIDX_BUY_LAND_RIGHTS].type = WWT_EMPTY; + window_park_entrance_widgets[WIDX_BUY_CONSTRUCTION_RIGHTS].type = WWT_EMPTY; + } else { + window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_FLATBTN; + window_park_entrance_widgets[WIDX_BUY_LAND_RIGHTS].type = WWT_FLATBTN; + window_park_entrance_widgets[WIDX_BUY_CONSTRUCTION_RIGHTS].type = WWT_FLATBTN; + } +} + +/** + * + * rct2: 0x006680D0 + */ +static void window_park_entrance_paint() +{ + int i, x, y; + rct_window *w; + rct_drawpixelinfo *dpi; + rct_widget *labelWidget; + + __asm mov w, esi + __asm mov dpi, edi + + window_draw_widgets(w, dpi); + window_park_draw_tab_images(dpi, w); + + // Draw viewport + if (w->viewport != NULL) { + RCT2_CALLPROC_X(0x00685BE1, 0, 0, 0, 0, 0, w->viewport, 0); + if (w->viewport->flags & VIEWPORT_FLAG_SOUND_ON) + gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2); + } + + // Draw park closed / open label + RCT2_GLOBAL(0x013CE952, uint16) = park_is_open() ? STR_PARK_OPEN : STR_PARK_CLOSED; + + labelWidget = &window_park_entrance_widgets[WIDX_STATUS]; + gfx_draw_string_centred_clipped( + dpi, + 1191, + 0x013CE952, + 0, + w->x + (labelWidget->left + labelWidget->right) / 2, + w->y + labelWidget->top, + labelWidget->right - labelWidget->left + ); +} + +#pragma endregion + +#pragma region Rating page + +/** + * + * rct2: 0x00668A06 + */ +static void window_park_rating_mouseup() +{ + short widgetIndex; + rct_window *w; + + __asm mov widgetIndex, dx + __asm mov w, esi + + if (widgetIndex == WIDX_CLOSE) + window_close(w); + else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) + window_park_set_page(w, widgetIndex - WIDX_TAB_1); +} + +/** + * + * rct2: 0x00668A21 + */ +static void window_park_rating_update() +{ + rct_window *w; + + __asm mov w, esi + + w->var_48E++; + widget_invalidate(w->classification, w->number, WIDX_TAB_2); +} + +/** + * + * rct2: 0x006686CB + */ +static void window_park_rating_invalidate() +{ + int i; + rct_window *w; + rct_widget **widgets; + + __asm mov w, esi + + widgets = window_park_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_park_set_pressed_tab(w); + + RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + + window_park_align_tabs(w); + window_park_anchor_border_widgets(w); +} + +/** + * + * rct2: 0x0066875D + */ +static void window_park_rating_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + __asm mov w, esi + __asm mov dpi, edi + + window_draw_widgets(w, dpi); + window_park_draw_tab_images(dpi, w); +} + +#pragma endregion + +#pragma region Guests page + +/** + * + * rct2: 0x00668DEB + */ +static void window_park_guests_mouseup() +{ + short widgetIndex; + rct_window *w; + + __asm mov widgetIndex, dx + __asm mov w, esi + + if (widgetIndex == WIDX_CLOSE) + window_close(w); + else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) + window_park_set_page(w, widgetIndex - WIDX_TAB_1); +} + +/** + * + * rct2: 0x00668E06 + */ +static void window_park_guests_update() +{ + rct_window *w; + + __asm mov w, esi + + w->var_48E++; + w->var_492 = (w->var_492 + 1) % 24; + widget_invalidate(w->classification, w->number, WIDX_TAB_3); +} + +/** + * + * rct2: 0x00668AB0 + */ +static void window_park_guests_invalidate() +{ + int i; + rct_window *w; + rct_widget **widgets; + + __asm mov w, esi + + widgets = window_park_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_park_set_pressed_tab(w); + + RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + + window_park_align_tabs(w); + window_park_anchor_border_widgets(w); +} + +/** + * + * rct2: 0x00668B42 + */ +static void window_park_guests_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + __asm mov w, esi + __asm mov dpi, edi + + window_draw_widgets(w, dpi); + window_park_draw_tab_images(dpi, w); +} + +#pragma endregion + +#pragma region Price page + +/** + * + * rct2: 0x00669011 + */ +static void window_park_price_mouseup() +{ + short widgetIndex; + rct_window *w; + + __asm mov widgetIndex, dx + __asm mov w, esi + + if (widgetIndex == WIDX_CLOSE) + window_close(w); + else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) + window_park_set_page(w, widgetIndex - WIDX_TAB_1); +} + +/** + * + * rct2: 0x00669077 + */ +static void window_park_price_update() +{ + rct_window *w; + + __asm mov w, esi + + w->var_48E++; + widget_invalidate(w->classification, w->number, WIDX_TAB_4); +} + +/** + * + * rct2: 0x00668EAD + */ +static void window_park_price_invalidate() +{ + int i; + rct_window *w; + rct_widget **widgets; + + __asm mov w, esi + + widgets = window_park_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_park_set_pressed_tab(w); + + RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + + window_park_align_tabs(w); + window_park_anchor_border_widgets(w); +} + +/** + * + * rct2: 0x00668F99 + */ +static void window_park_price_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + __asm mov w, esi + __asm mov dpi, edi + + window_draw_widgets(w, dpi); + window_park_draw_tab_images(dpi, w); +} + +#pragma endregion + +#pragma region Stats page + +/** + * + * rct2: 0x0066928C + */ +static void window_park_stats_mouseup() +{ + short widgetIndex; + rct_window *w; + + __asm mov widgetIndex, dx + __asm mov w, esi + + if (widgetIndex == WIDX_CLOSE) + window_close(w); + else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) + window_park_set_page(w, widgetIndex - WIDX_TAB_1); +} + +/** + * + * rct2: 0x006692A8 + */ +static void window_park_stats_update() +{ + int i; + rct_window *w; + + __asm mov w, esi + + w->var_48E++; + widget_invalidate(w->classification, w->number, WIDX_TAB_5); + + // Invalidate ride count if changed + i = ride_get_count(); + if (w->var_490 != i) { + w->var_490 = i; + widget_invalidate(w->classification, w->number, WIDX_PAGE_BACKGROUND); + } + + // Invalidate number of staff if changed + i = peep_get_staff_count(); + if (w->var_48C != i) { + w->var_48C = i; + widget_invalidate(w->classification, w->number, WIDX_PAGE_BACKGROUND); + } +} + +/** + * + * rct2: 0x00669106 + */ +static void window_park_stats_invalidate() +{ + int i; + rct_window *w; + rct_widget **widgets; + + __asm mov w, esi + + widgets = window_park_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_park_set_pressed_tab(w); + + RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + + window_park_align_tabs(w); + window_park_anchor_border_widgets(w); +} + +/** + * + * rct2: 0x00669198 + */ +static void window_park_stats_paint() +{ + int x, y, parkSize, stringIndex; + rct_window *w; + rct_drawpixelinfo *dpi; + rct_award *award; + + __asm mov w, esi + __asm mov dpi, edi + + window_draw_widgets(w, dpi); + window_park_draw_tab_images(dpi, w); + + x = w->x + window_park_awards_widgets[WIDX_PAGE_BACKGROUND].left + 4; + y = w->y + window_park_awards_widgets[WIDX_PAGE_BACKGROUND].top + 4; + + // Draw park size + parkSize = RCT2_GLOBAL(0x013580EA, sint16) * 10; + stringIndex = STR_PARK_SIZE_METRIC_LABEL; + if (!RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, uint8)) { + stringIndex = STR_PARK_SIZE_IMPERIAL_LABEL; + parkSize = squaredmetres_to_squaredfeet(parkSize); + } + RCT2_GLOBAL(0x013CE952, uint32) = parkSize; + gfx_draw_string_left(dpi, stringIndex, 0x013CE952, 0, x, y); + y += 10; + + // Draw number of rides / attractions + if (w->var_490 != -1) { + RCT2_GLOBAL(0x013CE952, uint32) = w->var_490; + gfx_draw_string_left(dpi, STR_NUMBER_OF_RIDES_LABEL, 0x013CE952, 0, x, y); + } + y += 10; + + // Draw number of staff + if (w->var_48C != -1) { + RCT2_GLOBAL(0x013CE952, uint32) = w->var_48C; + gfx_draw_string_left(dpi, STR_STAFF_LABEL, 0x013CE952, 0, x, y); + } + y += 10; + + // Draw number of guests in park + gfx_draw_string_left(dpi, STR_GUESTS_IN_PARK_LABEL, RCT2_ADDRESS_GUESTS_IN_PARK, 0, x, y); +} + +#pragma endregion + +#pragma region Objective page + /** * * rct2: 0x00667E57 @@ -159,19 +1129,10 @@ void window_park_objective_open() RCT2_CALLPROC_EBPSAFE(0x006EE281); window->viewport = NULL; - window->var_48A = WINDOW_PARK_PAGE_OBJECTIVE; + window->page = WINDOW_PARK_PAGE_OBJECTIVE; window_invalidate(window); window->widgets = window_park_objective_widgets; - window->enabled_widgets = - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_TAB_4) | - (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_TAB_7) | - (1 << WIDX_ENTER_NAME); + window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_OBJECTIVE]; window->var_020 = 0; window->event_handlers = window_park_objective_events; window_init_scroll_widgets(window); @@ -180,8 +1141,13 @@ void window_park_objective_open() window_invalidate(window); } +/** + * + * rct2: 0x006695AA + */ static void window_park_objective_mouseup() { + int tabIndex; short widgetIndex; rct_window *w; @@ -199,7 +1165,7 @@ static void window_park_objective_mouseup() case WIDX_TAB_5: case WIDX_TAB_6: case WIDX_TAB_7: - RCT2_CALLPROC_X(0x00668496, 0, 0, 0, widgetIndex, w, 0, 0); + window_park_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_ENTER_NAME: RCT2_CALLPROC_X(0x006EE308, 2791, 2792, 0, 0, 0, 0, 0); @@ -207,6 +1173,10 @@ static void window_park_objective_mouseup() } } +/** + * + * rct2: 0x0066966C + */ static void window_park_objective_update() { rct_window *w; @@ -217,6 +1187,10 @@ static void window_park_objective_update() widget_invalidate(w->classification, w->number, WIDX_TAB_6); } +/** + * + * rct2: 0x006693B2 + */ static void window_park_objective_invalidate() { int i; @@ -224,10 +1198,7 @@ static void window_park_objective_invalidate() __asm mov w, esi - // Set correct active tab - for (i = 0; i < 7; i++) - w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); - w->pressed_widgets |= 1 << (WIDX_TAB_1 + w->var_48A); + window_park_set_pressed_tab(w); // Set window title arguments *((short*)0x013CE952) = RCT2_GLOBAL(0x013573D4, uint16); @@ -239,17 +1210,8 @@ static void window_park_objective_invalidate() else window_park_objective_widgets[WIDX_ENTER_NAME].type = WWT_EMPTY; - // Align the tabs window_park_align_tabs(w); - - // Set anchored widgets - window_park_objective_widgets[WIDX_BACKGROUND].right = w->width - 1; - window_park_objective_widgets[WIDX_BACKGROUND].bottom = w->height - 1; - window_park_objective_widgets[WIDX_PAGE_BACKGROUND].right = w->width - 1; - window_park_objective_widgets[WIDX_PAGE_BACKGROUND].bottom = w->width - 1; - window_park_objective_widgets[WIDX_TITLE].right = w->width - 2; - window_park_objective_widgets[WIDX_CLOSE].left = w->width - 13; - window_park_objective_widgets[WIDX_CLOSE].right = w->width - 2; + window_park_anchor_border_widgets(w); } /** @@ -301,6 +1263,149 @@ static void window_park_objective_paint() } } +#pragma endregion + +#pragma region Awards page + +/** + * + * rct2: 0x00669851 + */ +static void window_park_awards_mouseup() +{ + short widgetIndex; + rct_window *w; + + __asm mov widgetIndex, dx + __asm mov w, esi + + if (widgetIndex == WIDX_CLOSE) + window_close(w); + else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) + window_park_set_page(w, widgetIndex - WIDX_TAB_1); +} + +/** + * + * rct2: 0x0066986D + */ +static void window_park_awards_update() +{ + rct_window *w; + + __asm mov w, esi + + w->var_48E++; + window_invalidate_by_id(w->classification, 1179); +} + +/** + * + * rct2: 0x006696FB + */ +static void window_park_awards_invalidate() +{ + int i; + rct_window *w; + rct_widget **widgets; + + __asm mov w, esi + + widgets = window_park_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_park_set_pressed_tab(w); + + RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(0x013573D4, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + + window_park_align_tabs(w); + window_park_anchor_border_widgets(w); +} + +/** + * + * rct2: 0x0066978D + */ +static void window_park_awards_paint() +{ + int i, count, x, y; + rct_window *w; + rct_drawpixelinfo *dpi; + rct_award *award; + + __asm mov w, esi + __asm mov dpi, edi + + window_draw_widgets(w, dpi); + window_park_draw_tab_images(dpi, w); + + x = w->x + window_park_awards_widgets[WIDX_PAGE_BACKGROUND].left + 4; + y = w->y + window_park_awards_widgets[WIDX_PAGE_BACKGROUND].top + 4; + + count = 0; + for (i = 0; i < 4; i++) { + award = &RCT2_ADDRESS(RCT2_ADDRESS_AWARD_LIST, rct_award)[i]; + if (award->time == 0) + continue; + + gfx_draw_sprite(dpi, SPR_AWARD_MOST_UNTIDY + award->type, x, y); + gfx_draw_string_left_wrapped(dpi, STR_AWARD_MOST_UNTIDY, x + 34, y + 6, 180, 0, 0); + + y += 32; + count++; + } + + if (count == 0) + gfx_draw_string_left(dpi, STR_NO_RECENT_AWARDS, 0, 0, x + 6, y + 6); +} + +#pragma endregion + +static void window_park_set_page(rct_window *w, int page) +{ + if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) + if (w->classification == RCT2_GLOBAL(0x009DE544, rct_windowclass) && w->number == RCT2_GLOBAL(0x009DE542, rct_windownumber)) + RCT2_CALLPROC_EBPSAFE(0x006EE281); + + RCT2_GLOBAL(0x009E32E0, uint8) = 0; + if (page == WINDOW_PARK_PAGE_ENTRANCE && w->page == WINDOW_PARK_PAGE_ENTRANCE && w->viewport != NULL && !(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON)) + RCT2_GLOBAL(0x009E32E0, uint8)++; + w->page = page; + w->var_48E = 0; + w->var_492 = 0; + if (w->viewport != NULL) { + w->viewport->x = 0; + w->viewport = NULL; + } + + w->enabled_widgets = window_park_page_enabled_widgets[page]; + w->var_020 = RCT2_GLOBAL(0x0097BAE0 + (page * 4), uint32); + w->event_handlers = window_park_page_events[page]; + w->widgets = window_park_page_widgets[page]; + RCT2_CALLPROC_X(0x00667F8B, 0, 0, 0, 0, w, 0, 0); + window_invalidate(w); + + RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_02], 0, 0, 0, 0, w, 0, 0); + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0); + if (RCT2_GLOBAL(0x009E32E0, uint8) != 0 && w->viewport != NULL) + w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; +} + +static void window_park_anchor_border_widgets(rct_window *w) +{ + w->widgets[WIDX_BACKGROUND].right = w->width - 1; + w->widgets[WIDX_BACKGROUND].bottom = w->height - 1; + w->widgets[WIDX_PAGE_BACKGROUND].right = w->width - 1; + w->widgets[WIDX_PAGE_BACKGROUND].bottom = w->height - 1; + w->widgets[WIDX_TITLE].right = w->width - 2; + w->widgets[WIDX_CLOSE].left = w->width - 13; + w->widgets[WIDX_CLOSE].right = w->width - 3; +} + static void window_park_align_tabs(rct_window *w) { int i, x, tab_width; @@ -316,6 +1421,14 @@ static void window_park_align_tabs(rct_window *w) } } +static void window_park_set_pressed_tab(rct_window *w) +{ + int i; + for (i = 0; i < 7; i++) + w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); + w->pressed_widgets |= 1 << (WIDX_TAB_1 + w->page); +} + static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) { int sprite_idx; @@ -326,39 +1439,59 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) // Rating tab if (!(w->disabled_widgets & (1 << WIDX_TAB_2))) { - sprite_idx = 5245; - if (w->var_48A == WINDOW_PARK_PAGE_RATING_GRAPH) + sprite_idx = SPR_TAB_GRAPH_0; + if (w->page == WINDOW_PARK_PAGE_RATING) sprite_idx += (w->var_48E / 8) % 8; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_2].left, w->y + w->widgets[WIDX_TAB_2].top); gfx_draw_sprite(dpi, SPR_RATING_HIGH, w->x + w->widgets[WIDX_TAB_2].left + 7, w->y + w->widgets[WIDX_TAB_2].top + 1); gfx_draw_sprite(dpi, SPR_RATING_LOW, w->x + w->widgets[WIDX_TAB_2].left + 16, w->y + w->widgets[WIDX_TAB_2].top + 12); } + // Guests tab + if (!(w->disabled_widgets & (1 << WIDX_TAB_3))) { + sprite_idx = SPR_TAB_GRAPH_0; + if (w->page == WINDOW_PARK_PAGE_GUESTS) + sprite_idx += (w->var_48E / 8) % 8; + gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top); + + sprite_idx = *RCT2_GLOBAL(0x00982708, sint32*) + 1; + if (w->page == WINDOW_PARK_PAGE_GUESTS) + sprite_idx += w->var_492 & 0xFFFFFFFC; + + sprite_idx |= 0xA9E00000; + gfx_draw_sprite( + dpi, + sprite_idx, + w->x + (w->widgets[WIDX_TAB_3].left + w->widgets[WIDX_TAB_3].right) / 2, + w->y + w->widgets[WIDX_TAB_3].bottom - 9 + ); + } + // Price tab if (!(w->disabled_widgets & (1 << WIDX_TAB_4))) { - sprite_idx = 5253; - if (w->var_48A == WINDOW_PARK_PAGE_PRICE) + sprite_idx = SPR_TAB_ADMISSION_0; + if (w->page == WINDOW_PARK_PAGE_PRICE) sprite_idx += (w->var_48E / 2) % 8; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_4].left, w->y + w->widgets[WIDX_TAB_4].top); } // Statistics tab if (!(w->disabled_widgets & (1 << WIDX_TAB_5))) { - sprite_idx = 5277; - if (w->var_48A == WINDOW_PARK_PAGE_STATS) + sprite_idx = SPR_TAB_STATS_0; + if (w->page == WINDOW_PARK_PAGE_STATS) sprite_idx += (w->var_48E / 4) % 7; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_5].left, w->y + w->widgets[WIDX_TAB_5].top); } // Objective tab if (!(w->disabled_widgets & (1 << WIDX_TAB_6))) { - sprite_idx = 5511; - if (w->var_48A == WINDOW_PARK_PAGE_OBJECTIVE) + sprite_idx = SPR_TAB_OBJECTIVE_0; + if (w->page == WINDOW_PARK_PAGE_OBJECTIVE) sprite_idx += (w->var_48E / 4) % 16; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_6].left, w->y + w->widgets[WIDX_TAB_6].top); } // Awards tab if (!(w->disabled_widgets & (1 << WIDX_TAB_7))) - gfx_draw_sprite(dpi, 5527, w->x + w->widgets[WIDX_TAB_7].left, w->y + w->widgets[WIDX_TAB_7].top); + gfx_draw_sprite(dpi, SPR_TAB_AWARDS, w->x + w->widgets[WIDX_TAB_7].left, w->y + w->widgets[WIDX_TAB_7].top); } \ No newline at end of file