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