diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj
index 3c13ff3f2b..1f0de53737 100644
--- a/projects/openrct2.vcxproj
+++ b/projects/openrct2.vcxproj
@@ -74,7 +74,6 @@
-
@@ -84,6 +83,7 @@
+
@@ -93,9 +93,13 @@
+
+
+
+
@@ -155,6 +159,7 @@
Disabled
true
1Byte
+ _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
@@ -167,13 +172,15 @@
Disabled
true
true
- true
+
+
MultiThreaded
1Byte
4013
false
+ _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters
index 00a17f947b..559453fe4d 100644
--- a/projects/openrct2.vcxproj.filters
+++ b/projects/openrct2.vcxproj.filters
@@ -269,9 +269,6 @@
Windows
-
- Source Files
-
Windows
@@ -281,6 +278,21 @@
Source Files
+
+ Windows
+
+
+ Windows
+
+
+ Windows
+
+
+ Windows
+
+
+ Windows
+
diff --git a/src/addresses.h b/src/addresses.h
index 7b946e796d..055c224b80 100644
--- a/src/addresses.h
+++ b/src/addresses.h
@@ -120,6 +120,9 @@
#define RCT2_ADDRESS_WINDOW_DPI 0x009DEA74
+#define RCT2_ADDRESS_NUM_DSOUND_DEVICES 0x009E2B88
+#define RCT2_ADDRESS_DSOUND_DEVICES 0x009E2B8C
+
#define RCT2_ADDRESS_CMDLINE 0x009E2D98
#define RCT2_ADDRESS_LAND_RAISE_COST 0x009E2E1C
@@ -154,8 +157,11 @@
#define RCT2_ADDRESS_OBJECTIVE_YEAR 0x013580F9
#define RCT2_ADDRESS_OBJECTIVE_CURRENCY 0x013580FC
#define RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS 0x01358100
+#define RCT2_ADDRESS_BALANCE_HISTORY 0x0135812C
#define RCT2_ADDRESS_CURRENT_PROFIT 0x01358330
+#define RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY 0x0135833C
#define RCT2_ADDRESS_CURRENT_PARK_VALUE 0x0135853C
+#define RCT2_ADDRESS_PARK_VALUE_HISTORY 0x01358540
#define RCT2_ADDRESS_COMPLETED_COMPANY_VALUE 0x01358740
#define RCT2_ADDRESS_TOTAL_ADMISSIONS 0x01358744
#define RCT2_ADDRESS_INCOME_FROM_ADMISSIONS 0x01358748
@@ -165,6 +171,11 @@
#define RCT2_ADDRESS_CURRENT_INTEREST_RATE 0x0135934A
#define RCT2_ADDRESS_EXPENDITURE_TABLE 0x01357848
#define RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL 0x013573FF
+
+#define RCT2_ADDRESS_HANDYMAN_COLOUR 0x01357BCD
+#define RCT2_ADDRESS_MECHANIC_COLOUR 0x01357BCE
+#define RCT2_ADDRESS_SECURITY_COLOUR 0x01357BCF
+
#define RCT2_ADDRESS_CURRENT_INTEREST_RATE 0x0135934A
#define RCT2_ADDRESS_MAP_SIZE 0x01358834
@@ -209,8 +220,6 @@
#define RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID 0x0141E9AE
#define RCT2_ADDRESS_CURRENT_ROTATION 0x0141E9E0
-#define RCT2_ADDRESS_SCENARIO_NAME 0x0141F5B8
-
#define RCT2_ADDRESS_WATER_RAISE_COST 0x0141F738
#define RCT2_ADDRESS_WATER_LOWER_COST 0x0141F73C
@@ -229,6 +238,8 @@
#define RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB 0x00F4390A
+#define RCT2_ADDRESS_WINDOW_MAP_SELECTED_TAB 0x014209E4
+
#define RCT2_ADDRESS_OS_TIME_MINUTE 0x01424654
#define RCT2_ADDRESS_OS_TIME_HOUR 0x01424656
#define RCT2_ADDRESS_OS_TIME_DAY 0x01424304
diff --git a/src/config.c b/src/config.c
index 614e3be043..f13ddaf571 100644
--- a/src/config.c
+++ b/src/config.c
@@ -25,6 +25,9 @@
#include "addresses.h"
#include "config.h"
#include "rct2.h"
+#include
+
+#include "osinterface.h"
// Current keyboard shortcuts
uint16 gShortcutKeys[SHORTCUT_COUNT];
@@ -142,10 +145,10 @@ void config_save()
HANDLE hFile;
DWORD bytesWritten;
- hFile = CreateFile(get_file_path(PATH_ID_GAMECFG), GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ hFile = CreateFile(get_file_path(PATH_ID_GAMECFG), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
WriteFile(hFile, &MagicNumber, 4, &bytesWritten, NULL);
- WriteFile(hFile, 0x009AAC5C, 2155, &bytesWritten, NULL);
+ WriteFile(hFile, (LPCVOID)0x009AAC5C, 2155, &bytesWritten, NULL);
CloseHandle(hFile);
}
}
@@ -154,6 +157,7 @@ void config_save()
general_configuration_t gGeneral_config;
+static char *config_show_directory_browser();
static void config_parse_settings(FILE *fp);
static int config_get_line(FILE *fp, char *setting, char *value);
static int config_parse_setting(FILE *fp, char *setting);
@@ -178,7 +182,7 @@ void config_init()
DWORD dwAttrib = GetFileAttributes(path);
if (dwAttrib == INVALID_FILE_ATTRIBUTES || !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) { // folder does not exist
if (!CreateDirectory(path, NULL)) {
- config_error("Could not create config file (do you have write acces to you documents folder?)");
+ config_error("Could not create config file (do you have write access to your documents folder?)");
}
}
strcat(path, "\\config.ini");
@@ -236,9 +240,11 @@ static void config_create_default(char *path)
{
FILE* fp;
- if (!config_find_rct2_path(gGeneral_config.game_path)) {
- MessageBox(NULL, "Unable to find RCT2 installation directory. Please correct in config.ini.", "OpenRCT2", MB_OK);
- strcpy(gGeneral_config.game_path, "C:\\");
+
+ if (!config_find_rct2_path(gConfig.game_path)) {
+ osinterface_show_messagebox("Unable to find RCT2 installation directory. Please select the directory where you installed RCT2!");
+ char *res = osinterface_open_directory_browser("Please select your RCT2 directory");
+ strcpy(gConfig.game_path, res);
}
fp = fopen(path, "w");
@@ -253,13 +259,14 @@ static void config_create_default(char *path)
fclose(fp);
}
+
/**
* Parse settings and set the game veriables
* @param fp file pointer to the settings file
*/
static void config_parse_settings(FILE *fp)
{
- int c = NULL, pos = 0;
+ int pos = 0;
char *setting;
char *value;
char *section;
@@ -428,36 +435,36 @@ static int config_parse_setting(FILE *fp, char *setting){
* @param value a pointer to where to store the value
* @return < 0 if EOF is reached
*/
-static int config_parse_value(FILE *fp, char *value){
+static int config_parse_value(FILE *fp, char *value)
+{
long start, end;
int size, c, pos = 0;
start = ftell(fp);
c = fgetc(fp);
- while (isspace(c)){
+ while (isspace(c)) {
start = ftell(fp);
c = fgetc(fp);
-
}
- while (c != EOF && c != '\n'){
+ while (c != EOF && c != '\n') {
c = fgetc(fp);
}
+
end = ftell(fp);
size = end - start;
- if (size > MAX_CONFIG_LENGTH){
+ if (size > MAX_CONFIG_LENGTH)
config_error("One of your settings is too long");
- }
+
fseek(fp, start, SEEK_SET);
c = fgetc(fp);
- while (c != EOF && c != '\n'){
-
+ while (c != EOF && c != '\n') {
value[pos] = (char)c;
c = fgetc(fp);
pos++;
}
value[pos] = '\0';
- return;
+ return 0;
}
/**
@@ -540,8 +547,10 @@ static int config_parse_currency(char* currency){
* @param msg Message to print in message box
*/
static void config_error(char *msg){
- MessageBox(NULL, msg, "OpenRCT2", MB_OK);
- exit(-1);
+
+ osinterface_show_messagebox(msg);
+ //TODO:SHUT DOWN EVERYTHING!
+
}
diff --git a/src/editor.c b/src/editor.c
index 9f07f326af..e2d8e01f7b 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -58,11 +58,11 @@ void editor_load()
finance_init();
date_reset();
window_guest_list_init_vars_b();
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) = WINDOW_STAFF_LIST_TAB_HANDYMEN;
+ window_staff_init_vars();
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_SCENARIO_EDITOR;
RCT2_GLOBAL(0x0141F570, uint8) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_SHOW_REAL_GUEST_NAMES;
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
RCT2_GLOBAL(0x0141F571, uint8) = 4;
viewport_init_all();
news_item_init_queue();
@@ -107,10 +107,10 @@ void trackdesigner_load()
finance_init();
date_reset();
window_guest_list_init_vars_b();
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) = WINDOW_STAFF_LIST_TAB_HANDYMEN;
+ window_staff_init_vars();
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_TRACK_DESIGNER;
RCT2_GLOBAL(0x0141F570, uint8) = 0;
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
viewport_init_all();
news_item_init_queue();
RCT2_CALLPROC_EBPSAFE(0x0066EF38); // window_main_editor_create
@@ -145,10 +145,10 @@ void trackmanager_load()
finance_init();
date_reset();
window_guest_list_init_vars_b();
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) = WINDOW_STAFF_LIST_TAB_HANDYMEN;
+ window_staff_init_vars();
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_TRACK_MANAGER;
RCT2_GLOBAL(0x0141F570, uint8) = 0;
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
viewport_init_all();
news_item_init_queue();
RCT2_CALLPROC_EBPSAFE(0x0066EF38); // window_main_editor_create
diff --git a/src/finance.c b/src/finance.c
index 86eb3d1508..7db4b107b0 100644
--- a/src/finance.c
+++ b/src/finance.c
@@ -23,6 +23,7 @@
#include "sprite.h"
#include "park.h"
#include "peep.h"
+#include "ride.h"
#include "window.h"
// monthly cost
@@ -102,6 +103,35 @@ void finance_pay_interest()
finance_payment((sint32)tempcost, RCT_EXPENDITURE_TYPE_INTEREST);
}
+/**
+ *
+ * rct2: 0x006AC885
+ */
+void finance_pay_ride_upkeep()
+{
+ rct_ride* ride;
+ for (int i = 0; i < MAX_RIDES; i++) {
+ ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
+ if (ride->type == RIDE_TYPE_NULL)
+ continue;
+
+ if (!(ride->var_1D0 & 0x1000)) {
+ ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
+ ride->var_196 = 25855; // durability?
+
+ }
+ if (ride->status != RIDE_STATUS_CLOSED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x800)) {
+ sint16 upkeep = ride->upkeep_cost;
+ if (upkeep != -1) {
+ ride->var_158 -= upkeep;
+ ride->var_14D |= 2;
+ finance_payment(upkeep, RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP);
+ }
+ }
+ }
+}
+
+
/**
*
* rct2: 0x0069DEFB
diff --git a/src/finance.h b/src/finance.h
index 4a81abe34f..7bb126cc01 100644
--- a/src/finance.h
+++ b/src/finance.h
@@ -23,9 +23,12 @@
#include "rct2.h"
+#define CURRENCY(whole, fraction) ((whole) * 10 + ((fraction) / 10))
+
typedef int rct_expenditure_type;
enum {
+ RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP = 1,
RCT_EXPENDITURE_TYPE_WAGES = 10,
RCT_EXPENDITURE_TYPE_RESEARCH = 12,
RCT_EXPENDITURE_TYPE_INTEREST = 13
@@ -36,6 +39,7 @@ void finance_payment(int amount, rct_expenditure_type type);
void finance_pay_wages();
void finance_pay_research();
void finance_pay_interest();
+void finance_pay_ride_upkeep();
void finance_init();
#endif
\ No newline at end of file
diff --git a/src/game.c b/src/game.c
index c734617582..c3f7c0f44c 100644
--- a/src/game.c
+++ b/src/game.c
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014 Ted John
+ * Copyright (c) 2014 Ted John, Peter Hill
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
@@ -195,13 +195,14 @@ void game_handle_input()
if (RCT2_GLOBAL(0x009ABDF2, uint8) != 0) {
for (w = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
- RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_07], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_07], 0, 0, 0, 0, (int)w, 0, 0);
RCT2_CALLPROC_EBPSAFE(0x006EA73F);
RCT2_CALLPROC_EBPSAFE(0x006E8346); // update_cursor_position
{
- int eax, ebx, ecx, edx, esi, edi, ebp;
+ // int eax, ebx, ecx, edx, esi, edi, ebp;
+ int eax, ebx, ecx;
for (;;) {
game_get_next_input(&eax, &ebx, &ecx);
@@ -228,7 +229,7 @@ void game_handle_input()
}
for (w = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++)
- RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_08], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_08], 0, 0, 0, 0, (int)w, 0, 0);
}
/**
@@ -288,11 +289,9 @@ static void input_leftmousedown(int x, int y, rct_window *w, int widgetIndex);
*/
static void game_handle_input_mouse(int x, int y, int state)
{
- rct_window *w, *w2;
+ rct_window *w;
rct_widget *widget;
int widgetIndex;
- rct_windowclass windowClass;
- rct_windownumber windowNumber;
// Get window and widget under cursor position
w = window_find_from_point(x, y);
@@ -347,7 +346,7 @@ static void game_handle_input_mouse(int x, int y, int state)
break;
case INPUT_STATE_WIDGET_PRESSED:
- RCT2_CALLPROC_X(0x006E8DA7, x, y, state, widgetIndex, w, widget, 0);
+ RCT2_CALLPROC_X(0x006E8DA7, x, y, state, widgetIndex, (int)w, (int)widget, 0);
break;
case INPUT_STATE_DRAGGING:
// RCT2_CALLPROC_X(0x006E8C5C, x, y, state, widgetIndex, w, widget, 0);
@@ -370,7 +369,7 @@ static void game_handle_input_mouse(int x, int y, int state)
} else if (state == 2) {
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_NORMAL;
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint8) = 0;
- RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, sint16);
+ RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, sint16);
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, rct_windowclass);
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, rct_windownumber);
y = clamp(29, y, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 34);
@@ -382,7 +381,7 @@ static void game_handle_input_mouse(int x, int y, int state)
RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_X, sint16) = x;
RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, sint16) = y;
- RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_18], 0, 0, x, y, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_18], 0, 0, x, y, (int)w, 0, 0);
}
break;
case INPUT_STATE_VIEWPORT_DRAG:
@@ -460,13 +459,13 @@ static void game_handle_input_mouse(int x, int y, int state)
break;
}
case INPUT_STATE_DROPDOWN_ACTIVE:
- RCT2_CALLPROC_X(0x006E8DA7, x, y, state, widgetIndex, w, widget, 0);
+ RCT2_CALLPROC_X(0x006E8DA7, x, y, state, widgetIndex, (int)w, (int)widget, 0);
break;
case INPUT_STATE_VIEWPORT_LEFT:
- RCT2_CALLPROC_X(0x006E87B4, x, y, state, widgetIndex, w, widget, 0);
+ RCT2_CALLPROC_X(0x006E87B4, x, y, state, widgetIndex, (int)w, (int)widget, 0);
break;
case INPUT_STATE_SCROLL_LEFT:
- RCT2_CALLPROC_X(0x006E8676, x, y, state, widgetIndex, w, widget, 0);
+ RCT2_CALLPROC_X(0x006E8676, x, y, state, widgetIndex, (int)w, (int)widget, 0);
break;
case INPUT_STATE_RESIZING:
// RCT2_CALLPROC_X(0x006E8B46, x, y, state, widgetIndex, w, widget, 0);
@@ -482,7 +481,7 @@ static void game_handle_input_mouse(int x, int y, int state)
if (state == 2) {
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_NORMAL;
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint8) = 0;
- RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, sint16);
+ RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, sint16);
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, rct_windowclass);
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) = RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, rct_windownumber);
}
@@ -498,7 +497,7 @@ static void game_handle_input_mouse(int x, int y, int state)
RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, sint16) = y;
break;
case 9:
- RCT2_CALLPROC_X(0x006E8ACB, x, y, state, widgetIndex, w, widget, 0);
+ RCT2_CALLPROC_X(0x006E8ACB, x, y, state, widgetIndex, (int)w, (int)widget, 0);
break;
}
}
@@ -527,8 +526,8 @@ static void input_mouseover(int x, int y, rct_window *w, int widgetIndex)
int eax, ebx, ecx, edx, esi, edi, ebp;
eax = x;
ebx = y;
- esi = w;
- edi = widget;
+ esi = (int)w;
+ edi = (int)widget;
RCT2_CALLFUNC_X(0x006E9F92, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); // widget_scoll_get_part
eax &= 0xFFFF;
ebx &= 0xFFFF;
@@ -537,7 +536,7 @@ static void input_mouseover(int x, int y, rct_window *w, int widgetIndex)
if (ecx < 0)
goto showTooltip;
if (ecx == 0) {
- RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEOVER], edx, 0, eax, ebx, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEOVER], edx, 0, eax, ebx, (int)w, 0, 0);
goto showTooltip;
} else {
@@ -585,8 +584,6 @@ static void input_mouseover(int x, int y, rct_window *w, int widgetIndex)
*/
static void input_mouseover_widget_check(rct_windowclass windowClass, rct_windownumber windowNumber, int widgetIndex)
{
- rct_window *w;
-
// Check if widget cursor was over has changed
if (windowClass != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass) ||
windowNumber != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWNUMBER, rct_windownumber) ||
@@ -597,8 +594,8 @@ static void input_mouseover_widget_check(rct_windowclass windowClass, rct_window
// Set new cursor over widget
RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass) = windowClass;
- RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWNUMBER, rct_windowclass) = windowNumber;
- RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, rct_windowclass) = widgetIndex;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWNUMBER, rct_windownumber) = windowNumber;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, uint16) = widgetIndex;
// Invalidate new widget cursor is on if widget is a flat button
if (windowClass != 255)
@@ -612,7 +609,7 @@ static void input_mouseover_widget_flatbutton_invalidate()
if (w == NULL)
return;
- RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
if (w->widgets[RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, rct_windownumber)].type == WWT_FLATBTN)
widget_invalidate(RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass), RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWNUMBER, rct_windownumber), RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, rct_windownumber));
}
@@ -676,7 +673,7 @@ static void input_leftmousedown(int x, int y, rct_window *w, int widgetIndex)
if (w == NULL)
break;
- RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_DOWN], x, y, 0, RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16), w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_DOWN], x, y, 0, RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16), (int)w, 0, 0);
RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 4);
break;
case WWT_CAPTION:
@@ -698,8 +695,8 @@ static void input_leftmousedown(int x, int y, rct_window *w, int widgetIndex)
int eax, ebx, ecx, edx, esi, edi, ebp;
eax = x;
ebx = y;
- esi = w;
- edi = widget;
+ esi = (int)w;
+ edi = (int)widget;
RCT2_CALLFUNC_X(0x006E9F92, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); // widget_scoll_get_part
eax &= 0xFFFF;
ebx &= 0xFFFF;
@@ -708,42 +705,42 @@ static void input_leftmousedown(int x, int y, rct_window *w, int widgetIndex)
RCT2_GLOBAL(0x009DE548, uint16) = ecx;
RCT2_GLOBAL(0x009DE54C, uint32) = edx;
- RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_15], RCT2_GLOBAL(0x009DE54C, uint32), ebx, ecx, edx, w, widget, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_15], RCT2_GLOBAL(0x009DE54C, uint32), ebx, ecx, edx, (int)w, (int)widget, 0);
switch (ecx) {
case SCROLL_PART_VIEW:
- RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEDOWN], edx / sizeof(rct_scroll), ebx, eax, ebx, w, widget, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEDOWN], edx / sizeof(rct_scroll), ebx, eax, ebx, (int)w, (int)widget, 0);
break;
case SCROLL_PART_HSCROLLBAR_LEFT:
// 0x006E9A60
- RCT2_CALLPROC_X(0x006E9A60, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9A60, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_HSCROLLBAR_RIGHT:
// 0x006E9ABF
- RCT2_CALLPROC_X(0x006E9ABF, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9ABF, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_HSCROLLBAR_LEFT_TROUGH:
// 0x006E9B47
- RCT2_CALLPROC_X(0x006E9B47, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9B47, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_HSCROLLBAR_RIGHT_TROUGH:
// 0x006E9BB7
- RCT2_CALLPROC_X(0x006E9BB7, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9BB7, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_VSCROLLBAR_TOP:
// 0x006E9C37
- RCT2_CALLPROC_X(0x006E9C37, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9C37, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_VSCROLLBAR_BOTTOM:
// 0x006E9C96
- RCT2_CALLPROC_X(0x006E9C96, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9C96, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_VSCROLLBAR_TOP_TROUGH:
// 0x006E9D1E
- RCT2_CALLPROC_X(0x006E9D1E, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9D1E, 0, 0, 0, 0, (int)w, 0, 0);
break;
case SCROLL_PART_VSCROLLBAR_BOTTOM_TROUGH:
// 0x006E9D8E
- RCT2_CALLPROC_X(0x006E9D8E, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E9D8E, 0, 0, 0, 0, (int)w, 0, 0);
break;
}
break;
@@ -757,14 +754,14 @@ static void input_leftmousedown(int x, int y, rct_window *w, int widgetIndex)
// Set new cursor down widget
RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, rct_windowclass) = windowClass;
- RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, rct_windowclass) = windowNumber;
- RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, rct_windowclass) = widgetIndex;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWNUMBER, rct_windownumber) = windowNumber;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, uint16) = widgetIndex;
RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 0);
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_WIDGET_PRESSED;
RCT2_GLOBAL(0x009DE528, uint16) = 1;
widget_invalidate(windowClass, windowNumber, widgetIndex);
- RCT2_CALLPROC_X(w->event_handlers[WE_MOUSE_DOWN], 0, 0, 0, widgetIndex, w, widget, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_MOUSE_DOWN], 0, 0, 0, widgetIndex, (int)w, (int)widget, 0);
break;
}
}
@@ -866,6 +863,228 @@ int get_next_key()
return 0;
}
+void handle_shortcut_command(int shortcutIndex)
+{
+ rct_window *window;
+
+ switch (shortcutIndex) {
+ case SHORTCUT_CLOSE_TOP_MOST_WINDOW:
+ window_close_top();
+ break;
+ case SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2))
+ window_close_all();
+ else if (RCT2_GLOBAL(0x0141F570, uint8) == 1)
+ window_close_top();
+ break;
+ case SHORTCUT_CANCEL_CONSTRUCTION_MODE:
+ window = window_find_by_id(WC_ERROR, 0);
+ if (window != NULL)
+ window_close(window);
+ else if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
+ tool_cancel();
+ break;
+ case SHORTCUT_PAUSE_GAME:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 10)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 0, WE_MOUSE_UP);
+ }
+ }
+ break;
+ case SHORTCUT_ZOOM_VIEW_OUT:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 2, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_ZOOM_VIEW_IN:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 3, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_ROTATE_VIEW:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 4, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_ROTATE_CONSTRUCTION_OBJECT:
+ RCT2_CALLPROC_EBPSAFE(0x006E4182);
+ break;
+ case SHORTCUT_UNDERGROUND_VIEW_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 0, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_REMOVE_BASE_LAND_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 1, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 2, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_SEE_THROUGH_RIDES_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 4, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 5, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 6, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_INVISIBLE_PEOPLE_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 7, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 9, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 10, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE:
+ RCT2_CALLPROC_X(0x0066CF8A, 11, 0, 0, 0, 0, 0, 0);
+ break;
+ case SHORTCUT_ADJUST_LAND:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 7, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_ADJUST_WATER:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 8, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_BUILD_SCENERY:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 9, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_BUILD_PATHS:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 10, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_BUILD_NEW_RIDE:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 11, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_SHOW_FINANCIAL_INFORMATION:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C))
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x800))
+ RCT2_CALLPROC_EBPSAFE(0x0069DDF1);
+ break;
+ case SHORTCUT_SHOW_RESEARCH_INFORMATION:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) {
+ // Open new ride window
+ RCT2_CALLPROC_EBPSAFE(0x006B3CFF);
+ window = window_find_by_id(WC_CONSTRUCT_RIDE, 0);
+ if (window != NULL)
+ window_event_helper(window, 10, WE_MOUSE_DOWN);
+ }
+ break;
+ case SHORTCUT_SHOW_RIDES_LIST:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 12, WE_MOUSE_UP);
+ }
+ }
+ break;
+ case SHORTCUT_SHOW_PARK_INFORMATION:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 13, WE_MOUSE_UP);
+ }
+ }
+ break;
+ case SHORTCUT_SHOW_GUEST_LIST:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 15, WE_MOUSE_UP);
+ }
+ }
+ break;
+ case SHORTCUT_SHOW_STAFF_LIST:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 14, WE_MOUSE_UP);
+ }
+ }
+ break;
+ case SHORTCUT_SHOW_RECENT_MESSAGES:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E))
+ window_news_open();
+ break;
+ case SHORTCUT_SHOW_MAP:
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) {
+ if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ window_event_helper(window, 6, WE_MOUSE_UP);
+ }
+ }
+ }
+ break;
+ case SHORTCUT_SCREENSHOT:
+ RCT2_CALLPROC_EBPSAFE(0x006E4034); // set screenshot countdown to 2
+ break;
+ }
+}
+
/**
*
* rct2: 0x006E3E68
@@ -873,9 +1092,9 @@ int get_next_key()
void handle_shortcut(int key)
{
int i;
- for (i = 0; i < 32; i++) {
+ for (i = 0; i < SHORTCUT_COUNT; i++) {
if (key == gShortcutKeys[i]) {
- RCT2_CALLPROC_EBPSAFE(RCT2_ADDRESS(0x006E3FB4, uint32)[i]);
+ handle_shortcut_command(i);
break;
}
}
@@ -911,7 +1130,7 @@ void set_shortcut(int key)
void game_handle_keyboard_input()
{
rct_window *w;
- int key, i;
+ int key;
// Handle mouse scrolling
if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) == 0)
@@ -960,7 +1179,7 @@ void game_handle_keyboard_input()
if (RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & 4) {
window_tooltip_close();
if ((w = window_get_main()) != NULL) {
- RCT2_CALLPROC_X(0x006EA2AA, 0, 0, 0, 0, w, RCT2_GLOBAL(0x009DEA72, uint16), 0);
+ RCT2_CALLPROC_X(0x006EA2AA, 0, 0, 0, 0, (int)w, RCT2_GLOBAL(0x009DEA72, uint16), 0);
RCT2_GLOBAL(0x009DEA72, uint16)++;
}
}
@@ -968,7 +1187,7 @@ void game_handle_keyboard_input()
if (!(RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & 4)) {
window_tooltip_close();
if ((w = window_get_main()) != NULL) {
- RCT2_CALLPROC_X(0x006EA2AA, 0, 0, 0, 0, w, RCT2_GLOBAL(0x009DEA72, uint16), 0);
+ RCT2_CALLPROC_X(0x006EA2AA, 0, 0, 0, 0, (int)w, RCT2_GLOBAL(0x009DEA72, uint16), 0);
RCT2_GLOBAL(0x009DEA72, uint16)++;
}
}
@@ -1089,9 +1308,7 @@ int game_do_command(int eax, int ebx, int ecx, int edx, int esi, int edi, int eb
*/
static void game_pause_toggle()
{
- rct_window *w;
- char input_bl, input_dl;
- short input_di;
+ char input_bl;
__asm mov input_bl, bl
@@ -1113,7 +1330,6 @@ static void game_pause_toggle()
*/
static void game_load_or_quit()
{
- rct_window *w;
char input_bl, input_dl;
short input_di;
@@ -1122,7 +1338,7 @@ static void game_load_or_quit()
__asm mov input_di, di
if (!(input_bl & 1))
- return 0;
+ return; // 0;
switch (input_dl) {
case 0:
@@ -1146,13 +1362,15 @@ static void game_load_or_quit()
*/
static int open_landscape_file_dialog()
{
- format_string(0x0141ED68, STR_LOAD_LANDSCAPE_DIALOG_TITLE, 0);
- strcpy(0x0141EF68, RCT2_ADDRESS_LANDSCAPES_PATH);
- format_string(0x0141EE68, STR_RCT2_LANDSCAPE_FILE, 0);
+ int result;
+ format_string((char*)0x0141ED68, STR_LOAD_LANDSCAPE_DIALOG_TITLE, 0);
+ strcpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_LANDSCAPES_PATH);
+ format_string((char*)0x0141EE68, STR_RCT2_LANDSCAPE_FILE, 0);
pause_sounds();
- osinterface_open_common_file_dialog(1, 0x0141ED68, 0x0141EF68, "*.SV6;*.SV4;*.SC6", 0x0141EE68);
+ result = osinterface_open_common_file_dialog(1, (char*)0x0141ED68, (char*)0x0141EF68, "*.SV6;*.SV4;*.SC6", (char*)0x0141EE68);
unpause_sounds();
// window_proc
+ return result;
}
/**
@@ -1162,11 +1380,11 @@ static int open_landscape_file_dialog()
static int open_load_game_dialog()
{
int result;
- format_string(0x0141ED68, STR_LOAD_GAME_DIALOG_TITLE, 0);
- strcpy(0x0141EF68, RCT2_ADDRESS_SAVED_GAMES_PATH);
- format_string(0x0141EE68, STR_RCT2_SAVED_GAME, 0);
+ format_string((char*)0x0141ED68, STR_LOAD_GAME_DIALOG_TITLE, 0);
+ strcpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH);
+ format_string((char*)0x0141EE68, STR_RCT2_SAVED_GAME, 0);
pause_sounds();
- result = osinterface_open_common_file_dialog(1, 0x0141ED68, 0x0141EF68, "*.SV6", 0x0141EE68);
+ result = osinterface_open_common_file_dialog(1, (char*)0x0141ED68, (char*)0x0141EF68, "*.SV6", (char*)0x0141EE68);
unpause_sounds();
// window_proc
return result;
@@ -1182,7 +1400,7 @@ static void load_landscape()
gfx_invalidate_screen();
} else {
// Set default filename
- char *esi = 0x0141EF67;
+ char *esi = (char*)0x0141EF67;
while (1) {
esi++;
if (*esi == '.')
@@ -1192,7 +1410,7 @@ static void load_landscape()
strcpy(esi, ".SC6");
break;
}
- strcpy(0x009ABB37, 0x0141EF68);
+ strcpy((char*)0x009ABB37, (char*)0x0141EF68);
RCT2_CALLPROC_EBPSAFE(0x006758C0); // landscape_load
if (1) {
@@ -1234,11 +1452,11 @@ int game_load_save()
return 0;
}
- rct_s6_header *s6Header = 0x009E34E4;
- rct_s6_info *s6Info = 0x0141F570;
+ rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4;
+ rct_s6_info *s6Info = (rct_s6_info*)0x0141F570;
// Read first chunk
- sawyercoding_read_chunk(hFile, s6Header);
+ sawyercoding_read_chunk(hFile, (uint8*)s6Header);
if (s6Header->type == S6_TYPE_SAVEDGAME) {
// Read packed objects
if (s6Header->num_packed_objects > 0) {
@@ -1253,14 +1471,14 @@ int game_load_save()
object_read_and_load_entries(hFile);
// Read flags (16 bytes)
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_CURRENT_MONTH_YEAR);
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR);
// Read map elements
- memset(RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element));
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_MAP_ELEMENTS);
+ memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element));
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS);
// Read game data, including sprites
- sawyercoding_read_chunk(hFile, 0x010E63B8);
+ sawyercoding_read_chunk(hFile, (uint8*)0x010E63B8);
CloseHandle(hFile);
@@ -1298,7 +1516,7 @@ int game_load_save()
RCT2_CALLPROC_EBPSAFE(0x0069E9A7);
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
RCT2_GLOBAL(0x009DEB7C, uint16) = 0;
if (RCT2_GLOBAL(0x0013587C4, uint32) == 0) // this check is not in scenario play
RCT2_CALLPROC_EBPSAFE(0x0069E869);
@@ -1318,7 +1536,7 @@ static void load_game()
gfx_invalidate_screen();
} else {
// Set default filename
- char *esi = 0x0141EF67;
+ char *esi = (char*)0x0141EF67;
while (1) {
esi++;
if (*esi == '.')
@@ -1328,7 +1546,7 @@ static void load_game()
strcpy(esi, ".SV6");
break;
}
- strcpy(0x009ABB37, 0x0141EF68);
+ strcpy((char*)0x009ABB37, (char*)0x0141EF68);
if (game_load_save()) {
gfx_invalidate_screen();
@@ -1380,10 +1598,10 @@ void game_load_or_quit_no_save_prompt()
static uint32 game_do_command_table[58] = {
0x006B2FC5,
0x0066397F,
- game_pause_toggle,
+ (uint32)game_pause_toggle,
0x006C511D,
0x006C5B69,
- game_load_or_quit,
+ (uint32)game_load_or_quit,
0x006B3F0F,
0x006B49D9,
0x006B4EA6,
diff --git a/src/gfx.c b/src/gfx.c
index 022b35e1a2..b0f8a59487 100644
--- a/src/gfx.c
+++ b/src/gfx.c
@@ -98,8 +98,53 @@ void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour)
gfx_fill_rect(dpi, x, y, x, y, colour);
}
+/*
+* Draws a horizontal line of specified colour to a buffer.
+* rct2: 0x68474C
+*/
+void gfx_draw_line_on_buffer(rct_drawpixelinfo *dpi, char colour, int y, int x, int no_pixels)
+{
+ y -= dpi->y;
+
+ //Check to make sure point is in the y range
+ if (y < 0)return;
+ if (y >= dpi->height)return;
+ //Check to make sure we are drawing at least a pixel
+ if (!no_pixels) return;
+
+ no_pixels++;
+ x -= dpi->x;
+
+ //If x coord outside range leave
+ if (x < 0){
+ //Unless the number of pixels is enough to be in range
+ no_pixels += x;
+ if (no_pixels <= 0)return;
+ //Resets starting point to 0 as we don't draw outside the range
+ x = 0;
+ }
+
+ //Ensure that the end point of the line is within range
+ if (x + no_pixels - dpi->width > 0){
+ //If the end point has any pixels outside range
+ //cut them off. If there are now no pixels return.
+ no_pixels -= x + no_pixels - dpi->width;
+ if (no_pixels <= 0)return;
+ }
+
+ char* bits_pointer;
+ //Get the buffer we are drawing to and move to the first coordinate.
+ bits_pointer = dpi->bits + y*(dpi->pitch + dpi->width) + x;
+
+ //Draw the line to the specified colour
+ for (; no_pixels > 0; --no_pixels, ++bits_pointer){
+ *((uint8*)bits_pointer) = colour;
+ }
+}
+
+
/**
- *
+ * Draws a line on dpi if within dpi boundaries
* rct2: 0x00684466
* dpi (edi)
* x1 (ax)
@@ -110,7 +155,78 @@ void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour)
*/
void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int colour)
{
- RCT2_CALLPROC_X(0x00684466, x1, y1, x2, y2, 0, dpi, colour);
+ // Check to make sure the line is within the drawing area
+ if ((x1 < dpi->x) && (x2 < dpi->x)){
+ return;
+ }
+
+ if ((y1 < dpi->y) && (y2 < dpi->y)){
+ return;
+ }
+
+ if ((x1 >(dpi->x + dpi->width)) && (x2 >(dpi->x + dpi->width))){
+ return;
+ }
+
+ if ((y1 > (dpi->y + dpi->height)) && (y2 > (dpi->y + dpi->height))){
+ return;
+ }
+
+ //Bresenhams algorithm
+
+ //If vertical plot points upwards
+ int steep = abs(y2 - y1) > abs(x2 - x1);
+ if (steep){
+ int temp_y2 = y2;
+ int temp_x2 = x2;
+ y2 = x1;
+ x2 = y1;
+ y1 = temp_x2;
+ x1 = temp_y2;
+ }
+
+ //If line is right to left swap direction
+ if (x1 > x2){
+ int temp_y2 = y2;
+ int temp_x2 = x2;
+ y2 = y1;
+ x2 = x1;
+ y1 = temp_y2;
+ x1 = temp_x2;
+ }
+
+ int delta_x = x2 - x1;
+ int delta_y = abs(y2 - y1);
+ int error = delta_x / 2;
+ int y_step;
+ int y = y1;
+
+ //Direction of step
+ if (y1 < y2)y_step = 1;
+ else y_step = -1;
+
+ for (int x = x1, x_start = x1, no_pixels = 1; x < x2; ++x,++no_pixels){
+ //Vertical lines are drawn 1 pixel at a time
+ if (steep)gfx_draw_line_on_buffer(dpi, colour, x, y, 1);
+
+ error -= delta_y;
+ if (error < 0){
+ //Non vertical lines are drawn with as many pixels in a horizontal line as possible
+ if (!steep)gfx_draw_line_on_buffer(dpi, colour, y, x_start, no_pixels);
+
+ //Reset non vertical line vars
+ x_start = x + 1;
+ no_pixels = 1;
+ y += y_step;
+ error += delta_x;
+ }
+
+ //Catch the case of the last line
+ if (x + 1 == x2 && !steep){
+ gfx_draw_line_on_buffer(dpi, colour, y, x_start, no_pixels);
+ }
+ }
+ return;
}
/**
@@ -125,7 +241,7 @@ void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int c
*/
void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bottom, int colour)
{
- RCT2_CALLPROC_X(0x00678AD4, left, right, top, bottom, 0, dpi, colour);
+ RCT2_CALLPROC_X(0x00678AD4, left, right, top, bottom, 0, (int)dpi, colour);
}
/**
@@ -141,7 +257,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot
*/
void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short right, short bottom, int colour, short _si)
{
- RCT2_CALLPROC_X(0x006E6F81, left, right, top, bottom, _si, dpi, colour);
+ RCT2_CALLPROC_X(0x006E6F81, left, right, top, bottom, _si, (int)dpi, colour);
}
/**
@@ -153,7 +269,7 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri
*/
void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y)
{
- RCT2_CALLPROC_X(0x0067A28E, 0, image_id, x, y, 0, dpi, 0);
+ RCT2_CALLPROC_X(0x0067A28E, 0, image_id, x, y, 0, (int)dpi, 0);
}
/**
@@ -196,7 +312,7 @@ void gfx_transpose_palette(int pal, unsigned char product)
*/
void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, int colour, void *args)
{
- RCT2_CALLPROC_X(0x006C1D6C, colour, format, x, y, args, dpi, 0);
+ RCT2_CALLPROC_X(0x006C1D6C, colour, format, x, y, (int)args, (int)dpi, 0);
}
/**
@@ -253,7 +369,6 @@ void gfx_set_dirty_blocks(int left, int top, int right, int bottom)
void gfx_draw_all_dirty_blocks()
{
int x, y, xx, yy, columns, rows;
- short left, top, right, bottom;
uint8 *screenDirtyBlocks = RCT2_ADDRESS(0x00EDE408, uint8);
for (x = 0; x < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32); x++) {
@@ -346,7 +461,7 @@ int gfx_get_string_width(char *buffer)
{
int eax, ebx, ecx, edx, esi, edi, ebp;
- esi = buffer;
+ esi = (int)buffer;
RCT2_CALLFUNC_X(0x006C2321, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
return ecx & 0xFFFF;
@@ -366,7 +481,7 @@ int gfx_get_string_width(char *buffer)
*/
void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args, int colour, int x, int y, int width)
{
- RCT2_CALLPROC_X(0x006C1B83, colour, format, x, y, args, dpi, width);
+ RCT2_CALLPROC_X(0x006C1B83, colour, format, x, y, (int)args, (int)dpi, width);
//char* buffer;
@@ -391,7 +506,7 @@ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args
*/
void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width)
{
- RCT2_CALLPROC_X(0x006C1BBA, colour, format, x, y, args, dpi, width);
+ RCT2_CALLPROC_X(0x006C1BBA, colour, format, x, y, (int)args, (int)dpi, width);
//char* buffer;
//short text_width;
@@ -452,8 +567,8 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i
ebx = format;
ecx = x;
edx = y;
- esi = args;
- edi = dpi;
+ esi = (int)args;
+ edi = (int)dpi;
ebp = width;
RCT2_CALLFUNC_X(0x006C1E53, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
@@ -479,8 +594,8 @@ int gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *format, int x, in
ebx = colour;
ecx = x;
edx = y;
- esi = format;
- edi = dpi;
+ esi = (int)format;
+ edi = (int)dpi;
ebp = width;
RCT2_CALLFUNC_X(0x006C2105, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
@@ -523,8 +638,8 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *format, int colour, int x, in
ebx = 0;
ecx = x;
edx = y;
- esi = format;
- edi = dpi;
+ esi = (int)format;
+ edi = (int)dpi;
ebp = 0;
RCT2_CALLFUNC_X(0x00682702, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
diff --git a/src/map.c b/src/map.c
index 581eabdf30..935f059ee0 100644
--- a/src/map.c
+++ b/src/map.c
@@ -146,7 +146,6 @@ void map_update_tile_pointers()
*/
int map_element_height(int x, int y)
{
- int i;
rct_map_element *mapElement;
// Off the map
@@ -298,13 +297,13 @@ void sub_68B089()
i++;
if (i >= MAX_TILE_MAP_ELEMENT_POINTERS)
i = 0;
- } while (TILE_MAP_ELEMENT_POINTER(i) == 0xFFFFFFFF);
+ } while (TILE_MAP_ELEMENT_POINTER(i) == TILE_UNDEFINED_MAP_ELEMENT);
RCT2_GLOBAL(0x0010E63B8, uint32) = i;
mapElementFirst = mapElement = TILE_MAP_ELEMENT_POINTER(i);
do {
mapElement--;
- if (mapElement < RCT2_ADDRESS_MAP_ELEMENTS)
+ if (mapElement < (rct_map_element*)RCT2_ADDRESS_MAP_ELEMENTS)
break;
} while (mapElement->base_height == 255);
mapElement++;
diff --git a/src/map.h b/src/map.h
index 88e76d7e11..108e339a82 100644
--- a/src/map.h
+++ b/src/map.h
@@ -180,7 +180,7 @@ enum {
#define MAX_MAP_ELEMENTS 196608
#define MAX_TILE_MAP_ELEMENT_POINTERS (256 * 256)
-#define TILE_UNDEFINED_MAP_ELEMENT -1
+#define TILE_UNDEFINED_MAP_ELEMENT (rct_map_element*)-1
void map_init();
void map_update_tile_pointers();
diff --git a/src/news_item.c b/src/news_item.c
index 3bc978f7bb..4b5fa14e7c 100644
--- a/src/news_item.c
+++ b/src/news_item.c
@@ -191,7 +191,7 @@ void news_item_get_subject_location(int type, int subject, int *x, int *y, int *
*z = map_element_height(*x, *y);
break;
case NEWS_ITEM_PEEP_ON_RIDE:
- peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[subject]);
+ peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[subject]).peep;
*x = peep->x;
*y = peep->y;
*z = peep->z;
@@ -212,16 +212,16 @@ void news_item_get_subject_location(int type, int subject, int *x, int *y, int *
}
// Find the first car of the train peep is on
- car = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[ride->train_car_map[peep->current_train]]);
+ car = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[ride->train_car_map[peep->current_train]]).car;
// Find the actual car peep is on
for (i = 0; i < peep->current_car; i++)
- car = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[car->next_car]);
+ car = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[car->next_car]).car;
*x = car->x;
*y = car->y;
*z = car->z;
break;
case NEWS_ITEM_PEEP:
- peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[subject]);
+ peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[subject]).peep;
*x = peep->x;
*y = peep->y;
*z = peep->z;
@@ -252,7 +252,7 @@ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc)
// find first open slot
while (newsItem->type != NEWS_ITEM_NULL) {
- if (newsItem + sizeof(newsItem) >= 0x13CB1CC)
+ if (newsItem + sizeof(newsItem) >= (rct_news_item*)0x13CB1CC)
news_item_close_current();
else
newsItem++;
@@ -263,12 +263,12 @@ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc)
newsItem->flags = 0;
newsItem->assoc = assoc;
newsItem->ticks = 0;
- newsItem->month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
- newsItem->day = (days_in_month[(newsItem->month & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16;
+ newsItem->month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
+ newsItem->day = (days_in_month[(newsItem->month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16;
- format_string(0x0141EF68, string_id, 0x013CE952); // overflows possible?
+ format_string((char*)0x0141EF68, string_id, (void*)0x013CE952); // overflows possible?
newsItem->colour = ((char*)0x0141EF68)[0];
- strncpy(newsItem->text, 0x0141EF68, 255);
+ strncpy(newsItem->text, (char*)0x0141EF68, 255);
newsItem->text[254] = 0;
// blatant disregard for what happens on the last element.
@@ -276,3 +276,71 @@ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc)
newsItem++;
newsItem->type = 0;
}
+
+/**
+ * Opens the window/tab for the subject of the news item
+ *
+ * rct2: 0x0066EBE6
+ *
+ **/
+void news_item_open_subject(int type, int subject) {
+
+ int eax;
+ rct_peep* peep;
+ rct_window* window;
+
+ switch (type) {
+ case NEWS_ITEM_RIDE:
+ RCT2_CALLPROC_X(0x006ACC28, subject, 0, 0, 0, 0, 0, 0);
+ break;
+ case NEWS_ITEM_PEEP_ON_RIDE:
+ case NEWS_ITEM_PEEP:
+ peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[subject]).peep;
+ RCT2_CALLPROC_X(0x006989E9, 0, 0, 0, (int)peep, 0, 0, 0);
+ break;
+ case NEWS_ITEM_MONEY:
+ // Open finances window
+ RCT2_CALLPROC_EBPSAFE(0x0069DDF1);
+ break;
+ case NEWS_ITEM_RESEARCH:
+
+ if (subject >= 0x10000) {
+ // Open ride list window
+ RCT2_CALLPROC_EBPSAFE(0x006B3CFF);
+ eax = (subject & 0xFF00) >> 8;
+ eax += (subject & 0xFF) << 8;
+ // Switch to right tab and scroll to ride location
+ RCT2_CALLPROC_X(0x006B3EBA, eax, 0, subject, 0, 0, 0, 0);
+ break;
+ }
+
+ // Check if window is already open
+ window = window_bring_to_front_by_id(WC_SCENERY, 0);
+ if (window == NULL) {
+ window = window_find_by_id(WC_TOP_TOOLBAR, 0);
+ if (window != NULL) {
+ window_invalidate(window);
+ if (tool_set(window, 9, 0)){
+ RCT2_CALLPROC_X(0x006E1172, (subject & 0xFFFF), 0, subject, 0, 0, 0, 0);
+ }
+ RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6);
+ // Open scenery window
+ RCT2_CALLPROC_EBPSAFE(0x006E0FEF);
+ }
+ }
+ // Switch to new scenery tab
+ RCT2_CALLPROC_X(0x006E1172, (subject & 0xFFFF), 0, subject, 0, 0, 0, 0);
+
+ break;
+ case NEWS_ITEM_PEEPS:
+ // Open guest list to right tab
+ RCT2_CALLPROC_X(0x006993BA, 3, subject, 0, 0, 0, 0, 0);
+ break;
+ case NEWS_ITEM_AWARD:
+ window_park_awards_open();
+ break;
+ case NEWS_ITEM_GRAPH:
+ window_park_rating_open();
+ break;
+ }
+}
diff --git a/src/news_item.h b/src/news_item.h
index 3de7ada5a5..a82aa29b0f 100644
--- a/src/news_item.h
+++ b/src/news_item.h
@@ -33,7 +33,7 @@ enum {
NEWS_ITEM_PEEP,
NEWS_ITEM_MONEY,
NEWS_ITEM_BLANK,
- NEWS_ITEM_SCENERY,
+ NEWS_ITEM_RESEARCH,
NEWS_ITEM_PEEPS,
NEWS_ITEM_AWARD,
NEWS_ITEM_GRAPH
@@ -48,8 +48,7 @@ typedef struct {
uint8 flags; // 0x01
uint32 assoc; // 0x02
uint16 ticks; // 0x06
- uint8 month; // 0x08
- uint8 pad_09; // 0x09
+ uint16 month_year; // 0x08
uint8 day; // 0x0A
uint8 pad_0B; // 0x0B
uint8 colour; // 0x0C
@@ -61,5 +60,6 @@ void news_item_update_current();
void news_item_close_current();
void news_item_get_subject_location(int type, int subject, int *x, int *y, int *z);
void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc);
+void news_item_open_subject(int type, int subject);
#endif
diff --git a/src/object.c b/src/object.c
index ba642157c2..1a98a2a482 100644
--- a/src/object.c
+++ b/src/object.c
@@ -34,7 +34,7 @@ void object_load_list()
*
* rct2: 0x006AA0C6
*/
-void object_read_and_load_entries(HFILE hFile)
+void object_read_and_load_entries(HANDLE hFile)
{
RCT2_CALLPROC_EBPSAFE(0x006AA0C6);
diff --git a/src/object.h b/src/object.h
index 54c5f76220..3549548bab 100644
--- a/src/object.h
+++ b/src/object.h
@@ -35,7 +35,7 @@ typedef struct {
} rct_object_entry;
void object_load_list();
-void object_read_and_load_entries(HFILE hFile);
+void object_read_and_load_entries(HANDLE hFile);
int object_load_packed();
#endif
diff --git a/src/osinterface.c b/src/osinterface.c
index 3e97491e5b..1c7afe06d6 100644
--- a/src/osinterface.c
+++ b/src/osinterface.c
@@ -19,6 +19,8 @@
*****************************************************************************/
#include
+#include
+#include
#include
#include
#include
@@ -31,8 +33,8 @@
typedef void(*update_palette_func)(char*, int, int);
openrct2_cursor gCursorState;
-unsigned char* gKeysState;
-unsigned char* gKeysPressed;
+const unsigned char *gKeysState;
+unsigned char *gKeysPressed;
unsigned int gLastKeyPressed;
static void osinterface_create_window();
@@ -323,12 +325,12 @@ int osinterface_open_common_file_dialog(int type, char *title, char *filename, c
openFileName.lpstrTitle = title;
// Copy filter name
- strcpy(0x01423800, filterName);
+ strcpy((char*)0x01423800, filterName);
// Copy filter pattern
- strcpy(0x01423800 + strlen(filterName) + 1, filterPattern);
+ strcpy((char*)0x01423800 + strlen(filterName) + 1, filterPattern);
*((char*)(0x01423800 + strlen(filterName) + 1 + strlen(filterPattern) + 1)) = 0;
- openFileName.lpstrFilter = 0x01423800;
+ openFileName.lpstrFilter = (char*)0x01423800;
//
tmp = RCT2_GLOBAL(0x009E2C74, uint32);
@@ -348,4 +350,49 @@ int osinterface_open_common_file_dialog(int type, char *title, char *filename, c
RCT2_GLOBAL(0x009E2C74, uint32) = tmp;
return result;
-}
\ No newline at end of file
+}
+
+void osinterface_show_messagebox(char* message){
+ MessageBox(NULL, message, "OpenRCT2", MB_OK);
+}
+
+char* osinterface_open_directory_browser(char *title) {
+ BROWSEINFO bi;
+ char pszBuffer[MAX_PATH];
+ LPITEMIDLIST pidl;
+ LPMALLOC lpMalloc;
+
+ // Initialize COM
+ if (CoInitializeEx(0, COINIT_APARTMENTTHREADED) != S_OK) {
+ MessageBox(NULL, _T("Error opening browse window"), _T("ERROR"), MB_OK);
+ CoUninitialize();
+ return 0;
+ }
+
+ // Get a pointer to the shell memory allocator
+ if (SHGetMalloc(&lpMalloc) != S_OK) {
+ MessageBox(NULL, _T("Error opening browse window"), _T("ERROR"), MB_OK);
+ CoUninitialize();
+ return 0;
+ }
+
+ bi.hwndOwner = NULL;
+ bi.pidlRoot = NULL;
+ bi.pszDisplayName = pszBuffer;
+ bi.lpszTitle = _T(title);
+ bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
+ bi.lpfn = NULL;
+ bi.lParam = 0;
+
+ char *outPath = "C:\\";
+
+ if (pidl = SHBrowseForFolder(&bi)) {
+ // Copy the path directory to the buffer
+ if (SHGetPathFromIDList(pidl, pszBuffer)) {
+ // Store pszBuffer (and the path) in the outPath
+ outPath = strcat("", pszBuffer);
+ }
+ }
+ CoUninitialize();
+ return outPath;
+}
diff --git a/src/osinterface.h b/src/osinterface.h
index 9ec682fea2..8360d3f1c4 100644
--- a/src/osinterface.h
+++ b/src/osinterface.h
@@ -37,8 +37,8 @@ typedef struct {
} openrct2_cursor;
extern openrct2_cursor gCursorState;
-extern unsigned char* gKeysState;
-extern unsigned char* gKeysPressed;
+extern const unsigned char *gKeysState;
+extern unsigned char *gKeysPressed;
extern unsigned int gLastKeyPressed;
void osinterface_init();
@@ -47,5 +47,7 @@ void osinterface_draw();
void osinterface_free();
int osinterface_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName);
+void osinterface_show_messagebox(char* message);
+char* osinterface_open_directory_browser(char *title);
#endif
diff --git a/src/park.c b/src/park.c
index aaa1685375..bc39ff3d46 100644
--- a/src/park.c
+++ b/src/park.c
@@ -19,11 +19,14 @@
*****************************************************************************/
#include "addresses.h"
+#include "finance.h"
#include "map.h"
#include "park.h"
#include "peep.h"
#include "ride.h"
+#include "scenario.h"
#include "sprite.h"
+#include "strings.h"
#include "window.h"
int park_is_open()
@@ -37,7 +40,84 @@ int park_is_open()
*/
void park_init()
{
- RCT2_CALLPROC_EBPSAFE(0x00667132);
+ int i;
+
+ RCT2_GLOBAL(0x013CA740, uint8) = 0;
+ RCT2_GLOBAL(0x013573D4, uint16) = 777;
+ RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) = 28;
+ RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) = 28;
+ RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, uint8) = 28;
+ RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0;
+ RCT2_GLOBAL(0x01357BC8, uint16) = 0;
+ RCT2_GLOBAL(0x01357846, uint16) = 0;
+ RCT2_GLOBAL(0x013573FE, uint16) = 0;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) = 0;
+ RCT2_GLOBAL(0x013580EC, uint16) = 0;
+ RCT2_GLOBAL(0x013580EE, uint16) = 0;
+ RCT2_GLOBAL(0x01357CF4, sint32) = -1;
+
+ for (i = 0; i < 20; i++)
+ RCT2_ADDRESS(0x01358102, uint8)[i] = 0;
+
+ RCT2_GLOBAL(0x01358844, uint32) = 0xFFFFFFFF;
+ RCT2_GLOBAL(0x01358849, uint32) = 0xFFFFFFFE;
+ RCT2_GLOBAL(0x0135884E, uint32) = 0xFFFFFFFD;
+ finance_init();
+
+ for (i = 0; i < 2; i++)
+ RCT2_ADDRESS(0x01357404, uint32)[i] = 0;
+
+ for (i = 0; i < 56; i++)
+ RCT2_ADDRESS(0x01357BD0, sint32)[i] = -1;
+
+ RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, uint16) = CURRENCY(10, 00);
+ RCT2_GLOBAL(0x013573F2, sint16) = -1;
+ RCT2_GLOBAL(0x013573F8, sint16) = -1;
+ RCT2_GLOBAL(0x01357CF2, uint16) = 127;
+ RCT2_GLOBAL(0x013573FF, uint8) = 2;
+
+ RCT2_GLOBAL(0x013580F4, uint16) = 500;
+ RCT2_GLOBAL(0x013580E9, uint8) = 128;
+ RCT2_GLOBAL(0x013580F6, uint8) = 200;
+ RCT2_GLOBAL(0x013580F7, uint8) = 200;
+ RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) = 1;
+ RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_YEAR, uint8) = 4;
+ RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) = 1000;
+ RCT2_GLOBAL(0x01358770, uint16) = 900;
+ RCT2_GLOBAL(0x01358772, uint16) = 400;
+ RCT2_GLOBAL(0x01358774, uint16) = 0;
+ RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = PARK_FLAGS_11 | PARK_FLAGS_SHOW_REAL_GUEST_NAMES;
+ park_reset_awards_and_history();
+
+ rct_s6_info *info = (rct_s6_info*)0x0141F570;
+ info->name[0] = '\0';
+ format_string(info->details, STR_NO_DETAILS_YET, NULL);
+}
+
+/**
+ *
+ * rct2: 0x0066729F
+ */
+void park_reset_awards_and_history()
+{
+ int i;
+
+ // Reset park rating and guests in park history
+ for (i = 0; i < 32; i++) {
+ RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8)[i] = 255;
+ RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8)[i] = 255;
+ }
+
+ // Reset finance history
+ for (i = 0; i < 128; i++) {
+ RCT2_ADDRESS(RCT2_ADDRESS_BALANCE_HISTORY, uint32)[i] = 0x80000000;
+ RCT2_ADDRESS(RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY, uint32)[i] = 0x80000000;
+ RCT2_ADDRESS(RCT2_ADDRESS_PARK_VALUE_HISTORY, uint32)[i] = 0x80000000;
+ }
+
+ // Reset awards
+ for (i = 0; i < 4; i++)
+ RCT2_ADDRESS(RCT2_ADDRESS_AWARD_LIST, rct_award)[i].time = 0;
}
/**
diff --git a/src/park.h b/src/park.h
index ee91fa5b46..177e4755a5 100644
--- a/src/park.h
+++ b/src/park.h
@@ -59,7 +59,8 @@ enum {
PARK_FLAGS_FORBID_HIGH_CONSTRUCTION = (1 << 5), // below tree height
PARK_FLAGS_PREF_LESS_INTENSE_RIDES = (1 << 6),
PARK_FLAGS_FORBID_MARKETING_CAMPAIGN = (1 << 7),
- PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 11),
+ PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 8),
+ PARK_FLAGS_11 = (1 << 11),
PARK_FLAGS_DIFFICULT_GUEST_GENERATION = (1 << 12),
PARK_FLAGS_PARK_FREE_ENTRY = (1 << 13),
PARK_FLAGS_DIFFICULT_PARK_RATING = (1 << 14),
@@ -69,6 +70,7 @@ enum {
int park_is_open();
void park_init();
+void park_reset_awards_and_history();
int park_calculate_size();
int calculate_park_rating();
diff --git a/src/peep.c b/src/peep.c
index 194c255704..8a04b3e95d 100644
--- a/src/peep.c
+++ b/src/peep.c
@@ -63,11 +63,11 @@ void peep_update_all()
sprite_index = peep->next;
if ((i & 0x7F) != (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x7F)) {
- RCT2_CALLPROC_X(0x0068FC1E, 0, 0, 0, 0, peep, 0, 0);
+ RCT2_CALLPROC_X(0x0068FC1E, 0, 0, 0, 0, (int)peep, 0, 0);
} else {
- RCT2_CALLPROC_X(0x0068F41A, 0, 0, 0, i, peep, 0, 0);
+ RCT2_CALLPROC_X(0x0068F41A, 0, 0, 0, i, (int)peep, 0, 0);
if (peep->var_08 == 4)
- RCT2_CALLPROC_X(0x0068FC1E, 0, 0, 0, 0, peep, 0, 0);
+ RCT2_CALLPROC_X(0x0068FC1E, 0, 0, 0, 0, (int)peep, 0, 0);
}
i++;
diff --git a/src/peep.h b/src/peep.h
index 0b54db7988..529eef7d16 100644
--- a/src/peep.h
+++ b/src/peep.h
@@ -388,7 +388,9 @@ typedef struct {
uint8 no_of_food; // 0xEC
uint8 no_of_drinks; // 0xED
uint8 no_of_souvenirs; // 0xEE
- uint8 pad_EF[0x07];
+ uint8 pad_EF[0x04];
+ uint8 var_F3;
+ uint8 pad_F4[0x02];
uint8 balloon_colour; // 0xF6
uint8 umbrella_colour; // 0xF7
uint8 hat_colour; // 0xF8
diff --git a/src/rct2.c b/src/rct2.c
index 9be9418e02..39b939e420 100644
--- a/src/rct2.c
+++ b/src/rct2.c
@@ -17,8 +17,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*****************************************************************************/
-
-#define _CRT_SECURE_NO_WARNINGS
+
+#pragma warning(disable : 4996) // GetVersionExA deprecated
#include
#include
@@ -43,7 +43,6 @@
#include "title.h"
#include "track.h"
#include "viewport.h"
-#include "settings.h"
void rct2_init_directories();
@@ -135,9 +134,9 @@ void rct2_init()
date_reset();
climate_reset(CLIMATE_COOL_AND_WET);
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
window_guest_list_init_vars_b();
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) = WINDOW_STAFF_LIST_TAB_HANDYMEN;
+ window_staff_init_vars();
title_load();
@@ -151,7 +150,7 @@ void rct2_init_directories()
// check install directory
DWORD dwAttrib = GetFileAttributes(gGeneral_config.game_path);
if (dwAttrib == INVALID_FILE_ATTRIBUTES || !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) {
- MessageBox(NULL, "Invalid RCT2 installation path. Please correct in config.ini.", "OpenRCT2", MB_OK);
+ osinterface_show_messagebox("Invalid RCT2 installation path. Please correct in config.ini.");
exit(-1);
}
@@ -231,16 +230,16 @@ void check_cmdline_arg()
}
processed_arg[j ++] = 0;
- if(!stricmp(processed_arg + last_period, "sv6"))
+ if (!_stricmp(processed_arg + last_period, "sv6"))
{
- strcpy(0x00141EF68, processed_arg);
+ strcpy((char*)0x00141EF68, processed_arg);
game_load_save();
}
- else if(!stricmp(processed_arg + last_period, "sc6"))
+ else if (!_stricmp(processed_arg + last_period, "sc6"))
{
//TODO: scenario install
}
- else if(!stricmp(processed_arg + last_period, "td6") || !stricmp(processed_arg + last_period, "td4"))
+ else if (!_stricmp(processed_arg + last_period, "td6") || !_stricmp(processed_arg + last_period, "td4"))
{
//TODO: track design install
}
@@ -321,7 +320,7 @@ void get_system_info()
GetSystemInfo(&sysInfo);
// RCT2 only has 2 bytes reserved for OEM_ID even though it should be a DWORD
- RCT2_GLOBAL(RCT2_ADDRESS_SYS_OEM_ID, uint16) = sysInfo.dwOemId;
+ RCT2_GLOBAL(RCT2_ADDRESS_SYS_OEM_ID, uint16) = (uint16)sysInfo.dwOemId;
RCT2_GLOBAL(RCT2_ADDRESS_SYS_CPU_LEVEL, uint16) = sysInfo.wProcessorLevel;
RCT2_GLOBAL(RCT2_ADDRESS_SYS_CPU_REVISION, uint16) = sysInfo.wProcessorRevision;
RCT2_GLOBAL(RCT2_ADDRESS_SYS_CPU_NUMBER, uint32) = sysInfo.dwNumberOfProcessors;
@@ -332,9 +331,9 @@ void get_system_info()
RCT2_GLOBAL(RCT2_ADDRESS_MEM_TOTAL_VIRTUAL, uint32) = memInfo.dwTotalVirtual;
uint32 size = 80;
- GetUserName(RCT2_ADDRESS_OS_USER_NAME, &size);
+ GetUserName((char*)RCT2_ADDRESS_OS_USER_NAME, &size);
size = 80;
- GetComputerName(RCT2_ADDRESS_OS_COMPUTER_NAME, &size);
+ GetComputerName((char*)RCT2_ADDRESS_OS_COMPUTER_NAME, &size);
// Screen Display Width/Height but RCT_ADDRESS_SCREEN_HEIGHT/WIDTH already taken?
RCT2_GLOBAL(0x01423C08, sint32) = GetSystemMetrics(SM_CXSCREEN);
diff --git a/src/ride.c b/src/ride.c
index cc6f543d7f..42f32287ff 100644
--- a/src/ride.c
+++ b/src/ride.c
@@ -20,6 +20,9 @@
#include "addresses.h"
#include "ride.h"
+#include "sprite.h"
+#include "peep.h"
+#include "window.h"
#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]))
@@ -150,3 +153,50 @@ void ride_init_all()
ride_measurement->var_00 = 0xFF;
}
}
+
+/**
+*
+* rct2: 0x006B7A38
+*/
+void reset_all_ride_build_dates() {
+ int i;
+ rct_ride *ride;
+ for (i = 0; i < MAX_RIDES; i++) {
+ ride = GET_RIDE(i);
+ if (ride->type != RIDE_TYPE_NULL) {
+ //mov ax, current_month_year
+ //sub [esi + 180h], ax
+ ride->build_date -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
+ }
+ }
+}
+
+/**
+ * rct2: 0x006AC916
+ */
+void ride_update_favourited_stat()
+{
+ rct_ride *ride;
+ rct_peep* peep;
+
+ for (int i = 0; i < MAX_RIDES; i++) {
+ ride = GET_RIDE(i);
+ if (ride->type != RIDE_TYPE_NULL)
+ ride->guests_favourite = 0;
+
+ }
+ for (int sprite_idx = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); sprite_idx != SPRITE_INDEX_NULL; sprite_idx = peep->next) {
+ peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[sprite_idx].peep);
+ if (peep->var_08 != 4)
+ return;
+ if (peep->favourite_ride != 0xff) {
+ ride = GET_RIDE(peep->favourite_ride);
+ ride->guests_favourite++;
+ ride->var_14D |= 1;
+
+ }
+
+ }
+ window_invalidate_by_id(WC_RIDE_LIST, 0);
+}
+
diff --git a/src/ride.h b/src/ride.h
index 78574be103..84eb778120 100644
--- a/src/ride.h
+++ b/src/ride.h
@@ -72,7 +72,10 @@ typedef struct {
uint8 var_14D;
uint8 pad_14E[0x0A];
uint16 var_158;
- uint8 pad_15A[0x3C];
+ uint8 pad_15A[0x26];
+ uint16 build_date;
+ sint16 upkeep_cost; // 0x182
+ uint8 pad_184[0x12];
uint16 var_196;
uint8 pad_198;
uint8 var_199;
@@ -257,5 +260,7 @@ int ride_get_count();
int ride_get_total_queue_length(rct_ride *ride);
int ride_get_max_queue_time(rct_ride *ride);
void ride_init_all();
+void reset_all_ride_build_dates();
+void ride_update_favourited_stat();
#endif
diff --git a/src/sawyercoding.c b/src/sawyercoding.c
index c5393e02d4..7e7a59928b 100644
--- a/src/sawyercoding.c
+++ b/src/sawyercoding.c
@@ -31,16 +31,15 @@ static void decode_chunk_rotate(char *buffer, int length);
*
* rct2: 0x00676FD2
*/
-int sawyercoding_validate_checksum(HFILE hFile)
+int sawyercoding_validate_checksum(HANDLE hFile)
{
- int i;
- uint32 checksum, fileChecksum;
+ uint32 i, checksum, fileChecksum;
DWORD dataSize, bufferSize, numBytesRead;
uint8 buffer[1024];
// Get data size
if ((dataSize = SetFilePointer(hFile, 0, NULL, FILE_END)) < 8)
- return;
+ return 0;
dataSize -= 4;
// Calculate checksum
@@ -74,7 +73,7 @@ int sawyercoding_validate_checksum(HFILE hFile)
* rct2: 0x0067685F
* buffer (esi)
*/
-int sawyercoding_read_chunk(HFILE hFile, uint8 *buffer)
+int sawyercoding_read_chunk(HANDLE hFile, uint8 *buffer)
{
DWORD numBytesRead;
sawyercoding_chunk_header chunkHeader;
@@ -145,7 +144,7 @@ static int decode_chunk_rle(char *buffer, int length)
static int decode_chunk_repeat(char *buffer, int length)
{
int i, j, count;
- uint8 *src, *dst, *copyOffset, rleCodeByte;
+ uint8 *src, *dst, *copyOffset;
// Backup buffer
src = malloc(length);
diff --git a/src/sawyercoding.h b/src/sawyercoding.h
index 7b30566703..02b63b6209 100644
--- a/src/sawyercoding.h
+++ b/src/sawyercoding.h
@@ -36,7 +36,7 @@ enum {
CHUNK_ENCODING_ROTATE
};
-int sawyercoding_validate_checksum(HFILE hFile);
-int sawyercoding_read_chunk(HFILE hFile, uint8 *buffer);
+int sawyercoding_validate_checksum(HANDLE hFile);
+int sawyercoding_read_chunk(HANDLE hFile, uint8 *buffer);
#endif
diff --git a/src/scenario.c b/src/scenario.c
index 4d2b409bdb..4e4461e635 100644
--- a/src/scenario.c
+++ b/src/scenario.c
@@ -18,8 +18,6 @@
* along with this program. If not, see .
*****************************************************************************/
-#define _CRT_SECURE_NO_WARNINGS
-
#include
#include "addresses.h"
#include "date.h"
@@ -103,9 +101,8 @@ void scenario_load_list()
static void scenario_list_add(char *path)
{
- int i;
rct_scenario_basic *scenario;
- rct_s6_info *s6Info = 0x0141F570;
+ rct_s6_info *s6Info = (rct_s6_info*)0x0141F570;
// Check if scenario already exists in list, likely if in scores
scenario = get_scenario_by_filename(path);
@@ -138,7 +135,7 @@ static void scenario_list_add(char *path)
}
// Check if the scenario list buffer has room for another scenario
- if ((RCT2_NUM_SCENARIOS + 1) * sizeof(rct_scenario_basic) > _scenarioListSize) {
+ if ((RCT2_NUM_SCENARIOS + 1) * (int)sizeof(rct_scenario_basic) > _scenarioListSize) {
// Allocate more room
_scenarioListSize += 16 * sizeof(rct_scenario_basic);
RCT2_SCENARIO_LIST = (rct_scenario_basic*)rct2_realloc(RCT2_SCENARIO_LIST, _scenarioListSize);
@@ -267,8 +264,8 @@ static int scenario_load_basic(char *path)
{
HANDLE hFile;
int _eax;
- rct_s6_header *s6Header = 0x009E34E4;
- rct_s6_info *s6Info = 0x0141F570;
+ rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4;
+ rct_s6_info *s6Info = (rct_s6_info*)0x0141F570;
hFile = CreateFile(
path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS | FILE_ATTRIBUTE_NORMAL, NULL
@@ -277,10 +274,10 @@ static int scenario_load_basic(char *path)
RCT2_GLOBAL(0x009E382C, HANDLE*) = hFile;
// Read first chunk
- sawyercoding_read_chunk(hFile, s6Header);
+ sawyercoding_read_chunk(hFile, (uint8*)s6Header);
if (s6Header->type == S6_TYPE_SCENARIO) {
// Read second chunk
- sawyercoding_read_chunk(hFile, s6Info);
+ sawyercoding_read_chunk(hFile, (uint8*)s6Info);
CloseHandle(hFile);
RCT2_GLOBAL(0x009AA00C, uint8) = 0;
if (s6Info->flags != 255) {
@@ -322,8 +319,8 @@ void scenario_load(char *path)
{
HANDLE hFile;
int i, j;
- rct_s6_header *s6Header = 0x009E34E4;
- rct_s6_info *s6Info = 0x0141F570;
+ rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4;
+ rct_s6_info *s6Info = (rct_s6_info*)0x0141F570;
hFile = CreateFile(
path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS | FILE_ATTRIBUTE_NORMAL, NULL
@@ -338,10 +335,10 @@ void scenario_load(char *path)
}
// Read first chunk
- sawyercoding_read_chunk(hFile, s6Header);
+ sawyercoding_read_chunk(hFile, (uint8*)s6Header);
if (s6Header->type == S6_TYPE_SCENARIO) {
// Read second chunk
- sawyercoding_read_chunk(hFile, s6Info);
+ sawyercoding_read_chunk(hFile, (uint8*)s6Info);
// Read packed objects
if (s6Header->num_packed_objects > 0) {
@@ -355,35 +352,35 @@ void scenario_load(char *path)
object_read_and_load_entries(hFile);
// Read flags (16 bytes)
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_CURRENT_MONTH_YEAR);
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR);
// Read map elements
- memset(RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element));
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_MAP_ELEMENTS);
+ memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element));
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS);
// Read game data, including sprites
- sawyercoding_read_chunk(hFile, 0x010E63B8);
+ sawyercoding_read_chunk(hFile, (uint8*)0x010E63B8);
// Read number of guests in park and something else
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_GUESTS_IN_PARK);
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK);
// Read ?
- sawyercoding_read_chunk(hFile, 0x01357BC8);
+ sawyercoding_read_chunk(hFile, (uint8*)0x01357BC8);
// Read park rating
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_CURRENT_PARK_RATING);
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING);
// Read ?
- sawyercoding_read_chunk(hFile, 0x01357CF2);
+ sawyercoding_read_chunk(hFile, (uint8*)0x01357CF2);
// Read ?
- sawyercoding_read_chunk(hFile, 0x0135832C);
+ sawyercoding_read_chunk(hFile, (uint8*)0x0135832C);
// Read ?
- sawyercoding_read_chunk(hFile, RCT2_ADDRESS_CURRENT_PARK_VALUE);
+ sawyercoding_read_chunk(hFile, (uint8*)RCT2_ADDRESS_CURRENT_PARK_VALUE);
// Read more game data, including research items and rides
- sawyercoding_read_chunk(hFile, 0x01358740);
+ sawyercoding_read_chunk(hFile, (uint8*)0x01358740);
CloseHandle(hFile);
@@ -411,7 +408,7 @@ void scenario_load(char *path)
void scenario_load_and_play(rct_scenario_basic *scenario)
{
rct_window *mainWindow;
- rct_s6_info *s6Info = 0x0141F570;
+ rct_s6_info *s6Info = (rct_s6_info*)0x0141F570;
RCT2_GLOBAL(0x009AA0F0, uint32) = RCT2_GLOBAL(0x00F663B0, uint32) ^ timeGetTime();
RCT2_GLOBAL(0x009AA0F4, uint32) = RCT2_GLOBAL(0x00F663B4, uint32) ^ timeGetTime();
@@ -422,7 +419,7 @@ void scenario_load_and_play(rct_scenario_basic *scenario)
RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char),
scenario->path
);
- scenario_load(0x0141EF68);
+ scenario_load((char*)0x0141EF68);
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING;
viewport_init_all();
game_create_windows();
@@ -450,7 +447,7 @@ void scenario_load_and_play(rct_scenario_basic *scenario)
window_invalidate(mainWindow);
RCT2_CALLPROC_EBPSAFE(0x0069E9A7);
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
RCT2_GLOBAL(0x00F663B0, sint32) = RCT2_GLOBAL(0x009AA0F0, sint32);
RCT2_GLOBAL(0x00F663B4, sint32) = RCT2_GLOBAL(0x009AA0F4, sint32);
@@ -461,24 +458,24 @@ void scenario_load_and_play(rct_scenario_basic *scenario)
RCT2_CALLPROC_EBPSAFE(0x00684AC3);
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
news_item_init_queue();
- if (RCT2_ADDRESS(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) != OBJECTIVE_NONE)
+ if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) != OBJECTIVE_NONE)
window_park_objective_open();
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, sint16) = calculate_park_rating();
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, sint16) = calculate_park_value();
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_COMPANY_VALUE, sint16) = calculate_company_value();
RCT2_GLOBAL(0x013587D0, sint16) = RCT2_GLOBAL(0x013573DC, sint16) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, sint16);
- RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint16) = ENCRYPT_MONEY(RCT2_GLOBAL(0x013573DC, sint32));
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(RCT2_GLOBAL(0x013573DC, sint32));
RCT2_CALLPROC_EBPSAFE(0x0069E869); // (loan related)
- strcpy(0x0135924A, s6Info->details);
- strcpy(0x0135920A, s6Info->name);
+ strcpy((char*)0x0135924A, s6Info->details);
+ strcpy((char*)0x0135920A, s6Info->name);
if (RCT2_GLOBAL(0x009ADAE4, sint32) != -1) {
char *ebp = RCT2_GLOBAL(0x009ADAE4, char*);
//
- format_string(0x0141ED68, RCT2_GLOBAL(ebp + 2, uint16), 0);
+ format_string((char*)0x0141ED68, RCT2_GLOBAL(ebp + 2, uint16), 0);
// Set park name
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_RENAME_PARK;
@@ -487,22 +484,22 @@ void scenario_load_and_play(rct_scenario_basic *scenario)
game_do_command(0, 1, 0, *((int*)(0x0141ED68 + 24)), 33, *((int*)(0x0141ED68 + 32)), *((int*)(0x0141ED68 + 28)));
//
- format_string(0x0141ED68, RCT2_GLOBAL(ebp + 0, uint16), 0);
- strncpy(RCT2_ADDRESS_SCENARIO_NAME, 0x0141ED68, 31);
+ format_string((char*)0x0141ED68, RCT2_GLOBAL(ebp + 0, uint16), 0);
+ strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, (char*)0x0141ED68, 31);
((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0';
// Set scenario details
- format_string(0x0141ED68, RCT2_GLOBAL(ebp + 4, uint16), 0);
- strncpy(RCT2_ADDRESS_SCENARIO_DETAILS, 0x0141ED68, 255);
+ format_string((char*)0x0141ED68, RCT2_GLOBAL(ebp + 4, uint16), 0);
+ strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, (char*)0x0141ED68, 255);
((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0';
}
// Set the last saved game path
- strcpy(0x009ABB37, 0x009AB5DA);
- format_string(0x009ABB37 + strlen(0x009ABB37), RCT2_GLOBAL(0x0013573D4, uint16), 0x0013573D8);
- strcat(0x009ABB37, ".SV6");
+ strcpy((char*)0x009ABB37, (char*)0x009AB5DA);
+ format_string((char*)0x009ABB37 + strlen((char*)0x009ABB37), RCT2_GLOBAL(0x0013573D4, uint16), (void*)0x0013573D8);
+ strcat((char*)0x009ABB37, ".SV6");
- memset(0x001357848, 0, 56);
+ memset((void*)0x001357848, 0, 56);
RCT2_GLOBAL(0x0135832C, uint32) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PROFIT, sint32) = 0;
RCT2_GLOBAL(0x01358334, uint32) = 0;
@@ -512,14 +509,14 @@ void scenario_load_and_play(rct_scenario_basic *scenario)
RCT2_GLOBAL(RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, uint32) = 0;
RCT2_GLOBAL(0x013587D8, uint16) = 63;
RCT2_CALLPROC_EBPSAFE(0x0069E869); // (loan related, called above already)
- RCT2_CALLPROC_EBPSAFE(0x0066729F); // reset history / finance / awards
- RCT2_CALLPROC_EBPSAFE(0x006B7A38); // reset_all_ride_build_dates
+ park_reset_awards_and_history();
+ reset_all_ride_build_dates();
date_reset();
RCT2_CALLPROC_EBPSAFE(0x00674576);
park_calculate_size();
RCT2_CALLPROC_EBPSAFE(0x006C1955);
RCT2_GLOBAL(0x01358840, uint8) = 0;
- memset(0x001358102, 0, 20);
+ memset((void*)0x001358102, 0, 20);
RCT2_GLOBAL(0x00135882E, uint16) = 0;
// Open park with free entry when there is no money
@@ -572,7 +569,7 @@ void scenario_success()
RCT2_CALLPROC_EBPSAFE(0x0069BE9B); // celebration
for (i = 0; i < RCT2_GLOBAL(RCT2_ADDRESS_NUM_SCENARIOS, sint32); i++) {
- char* cur_scenario_name = RCT2_ADDRESS(0x135936C, char*);
+ char *cur_scenario_name = RCT2_ADDRESS(0x135936C, char);
scenario = &(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_LIST, rct_scenario_basic*)[i]);
if (0 == strncmp(cur_scenario_name, scenario->path, 256)){
@@ -604,7 +601,7 @@ void scenario_objective5_check()
memset(type_already_counted, 0, 256);
- for (int i = 0; i < 255; i++) {
+ for (int i = 0; i < MAX_RIDES; i++) {
uint8 subtype_id;
uint32 subtype_p;
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
@@ -640,7 +637,7 @@ void scenario_objective8_check()
memset(type_already_counted, 0, 256);
- for (int i = 0; i < 255; i++) {
+ for (int i = 0; i < MAX_RIDES; i++) {
uint8 subtype_id;
uint32 subtype_p;
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
@@ -660,7 +657,7 @@ void scenario_objective8_check()
for (int j = 0; j < limit; ++j) {
sum += ((uint32*)&ride->pad_088[92])[j];
}
- if ((sum >> 16) > objective_length) {
+ if ((sum >> 16) > (uint32)objective_length) {
type_already_counted[subtype_id]++;
rcs++;
}
@@ -741,7 +738,7 @@ void scenario_objectives_check()
{
rct_ride* ride;
int rcs = 0;
- for (int i = 0; i < 255; i++) {
+ for (int i = 0; i < MAX_RIDES; i++) {
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
if (ride->status && ride->excitement > objective_currency)
rcs++;
@@ -847,7 +844,7 @@ void scenario_update()
uint32 month_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16),
next_month_tick = month_tick + 4;
uint8 month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7,
- current_days_in_month = days_in_month[month],
+ current_days_in_month = (uint8)days_in_month[month],
objective_type = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8);
if (screen_flags & (~SCREEN_FLAGS_PLAYING)) // only in normal play mode
@@ -875,7 +872,7 @@ void scenario_update()
scenario_marketing_update();
peep_problem_warnings_update();
RCT2_CALLPROC_EBPSAFE(0x006B7A5E); // check ride reachability
- RCT2_CALLPROC_EBPSAFE(0x006AC916); // ride update favourited
+ ride_update_favourited_stat();
if (month <= 1 && RCT2_GLOBAL(0x009ADAE0, sint32) != -1 && RCT2_GLOBAL(0x009ADAE0 + 14, uint16) & 1) {
for (int i = 0; i < 100; ++i) {
@@ -893,11 +890,11 @@ void scenario_update()
//if ( (unsigned int)((2 * current_day) & 0xFFFF) >= 0xFFF8) {
if (next_month_tick % 0x8000 == 0) {
- // biweekly checks
- RCT2_CALLPROC_EBPSAFE(0x006AC885);
+ // fortnightly
+ finance_pay_ride_upkeep();
}
- RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) = next_month_tick;
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) = (uint16)next_month_tick;
if (next_month_tick >= 0x10000) {
// month ends actions
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)++;
diff --git a/src/screenshot.c b/src/screenshot.c
index 8d85ddc85a..bf92238c2e 100644
--- a/src/screenshot.c
+++ b/src/screenshot.c
@@ -117,9 +117,9 @@ int screenshot_dump_bmp()
BitmapFileHeader header;
BitmapInfoHeader info;
- int i, x, y, index, width, height, stride;
- char *buffer, path[MAX_PATH], *row, *dst;
- HFILE hFile;
+ int i, y, index, width, height, stride;
+ char *buffer, path[MAX_PATH], *row;
+ HANDLE hFile;
DWORD bytesWritten;
// Get a free screenshot path
@@ -127,7 +127,7 @@ int screenshot_dump_bmp()
return -1;
// Open file for writing
- hFile = CreateFile(path, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ hFile = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return -1;
diff --git a/src/strings.c b/src/strings.c
index 540e644252..fc50c8f1b6 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -32,7 +32,7 @@
*/
void format_string(char *dest, rct_string_id format, void *args)
{
- RCT2_CALLPROC_X(0x006C2555, format, 0, args, 0, 0, dest, 0);
+ RCT2_CALLPROC_X(0x006C2555, format, 0, (int)args, 0, 0, (int)dest, 0);
}
void generate_string_file()
diff --git a/src/strings.h b/src/strings.h
index 1e459333b6..7a92046a84 100644
--- a/src/strings.h
+++ b/src/strings.h
@@ -217,6 +217,8 @@ enum {
STR_PLACE_SCENERY_TIP = 1159,
STR_ADJUST_WATER_TIP = 1160,
+ STR_OPTIONS = 1168,
+
STR_BUILD_FOOTPATH_TIP = 1173,
STR_CANT_BUILD_FOOTPATH_HERE = 1176,
STR_CANT_REMOVE_FOOTPATH_FROM_HERE = 1177,
@@ -278,6 +280,8 @@ enum {
STR_SUMMARISED_GUESTS_TIP = 1753,
STR_ADMISSION_PRICE = 1756,
+ STR_MUSIC = 1777,
+
STR_ACTIONS = 1814,
STR_THOUGHTS = STR_ACTIONS + 1,
STR_INFORMATION_TYPE_TIP = 1816,
@@ -355,6 +359,20 @@ enum {
STR_CHANGE_BASE_LAND_TIP = 2294,
STR_CHANGE_VERTICAL_LAND_TIP = 2295,
+ STR_SOUND_QUALITY = 2317,
+ STR_CURRENCY = 2328,
+ STR_DISTANCE_AND_SPEED = 2329,
+ STR_TEMPERATURE = 2330,
+ STR_HEIGHT_LABELS = 2331,
+ STR_UNITS = 2332,
+ STR_SOUND = 2333,
+ STR_DISPLAY = 2346,
+ STR_DISPLAY_RESOLUTION = 2360,
+ STR_TILE_SMOOTHING = 2361,
+ STR_TILE_SMOOTHING_TIP = 2362,
+ STR_GRIDLINES = 2363,
+ STR_GRIDLINES_TIP = 2364,
+
//STR_NONE = 2368,
STR_LOW = 2369,
STR_AVERAGE = 2370,
@@ -404,12 +422,22 @@ enum {
STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP = 2482,
+ STR_CONTROLS = 2485,
+ STR_GENERAL = 2486,
+ STR_REAL_NAME = 2487,
+ STR_REAL_NAME_TIP = 2488,
+ STR_HOTKEY = 2489,
+
STR_ENTER_NAME_INTO_SCENARIO_CHART = 2790,
STR_COMPLETED_BY_WITH_COMPANY_VALUE = 2794,
STR_SORT = 2795,
STR_RIDE_LIST_SORT_TIP = 2796,
+ STR_SCREEN_EDGE_SCROLLING = 2797,
+ STR_SCREEN_EDGE_SCROLLING_TIP = 2798,
+ STR_HOTKEY_TIP = 2799,
+
STR_TOTAL_ADMISSIONS = 2800,
STR_INCOME_FROM_ADMISSIONS = 2801,
@@ -466,6 +494,8 @@ enum {
STR_UNABLE_TO_LOAD_FILE = 3010,
STR_FILE_CONTAINS_INVALID_DATA = 3011,
+ STR_CONSTRUCTION_MARKER = 3057,
+
STR_BEGINNER_PARKS = 3064,
STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1,
STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2,
@@ -490,14 +520,22 @@ enum {
STR_LIST = 3159,
+ STR_NO_DETAILS_YET = 3317,
+
STR_OBJECTIVE = 3322,
+ STR_SAVE_PLUGIN_DATA = 3333,
+ STR_SAVE_PLUGIN_DATA_TIP = 3334,
+
STR_GAME_TOOLS = 3341,
STR_SCENARIO_EDITOR = 3342,
STR_CONVERT_SAVED_GAME_TO_SCENARIO = 3343,
STR_ROLLER_COASTER_DESIGNER = 3344,
STR_TRACK_DESIGNS_MANAGER = 3345,
+ STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING = 3362,
+ STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP = 3363,
+
STR_TUTORIAL_BEGINNERS = 3385,
STR_TUTORIAL_CUSTOM_RIDES = 3386,
STR_TUTORIAL_ROLLER_COASTER = 3387,
diff --git a/src/title.c b/src/title.c
index fc6ef67aa5..1664250b60 100644
--- a/src/title.c
+++ b/src/title.c
@@ -103,9 +103,9 @@ void title_load()
date_reset();
RCT2_CALLPROC_X(0x006C45ED, 0, 0, 0, 0, 0, 0, 0);
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
window_guest_list_init_vars_b();
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) = WINDOW_STAFF_LIST_TAB_HANDYMEN;
+ window_staff_init_vars();
RCT2_CALLPROC_EBPSAFE(0x0068AFFD);
RCT2_CALLPROC_EBPSAFE(0x0069EBE4);
viewport_init_all();
@@ -154,7 +154,7 @@ static void title_update_showcase()
rct_window* w;
uint8 script_opcode, script_operand;
short x, y, z;
- int i, _edx;
+ int i;
if (_scriptWaitCounter <= 0) {
do {
@@ -191,7 +191,7 @@ static void title_update_showcase()
window_invalidate(w);
RCT2_CALLPROC_EBPSAFE(0x0069E9A7);
- window_ride_list_init_vars();
+ window_new_ride_init_vars();
RCT2_CALLPROC_EBPSAFE(0x00684AC3);
RCT2_CALLPROC_EBPSAFE(0x006DFEE4);
news_item_init_queue();
@@ -223,7 +223,7 @@ static void title_update_showcase()
_currentScript = _magicMountainScript;
if (gRandomShowcase) {
if (_currentScript != NULL)
- free(_currentScript);
+ free((uint8*)_currentScript);
_currentScript = generate_random_script();
}
break;
@@ -322,7 +322,7 @@ static void title_play_music()
strcat(musicPath, "\\data\\css50.dat");
}
- if (RCT2_CALLFUNC_3(0x0040194E, int, int, int, int, 3, musicPath, 0)) // play music
+ if (RCT2_CALLFUNC_3(0x0040194E, int, int, char*, int, 3, musicPath, 0)) // play music
RCT2_CALLPROC_5(0x00401999, int, int, int, int, int, 3, 1, 0, 0, 0);
RCT2_GLOBAL(0x009AF600, uint8) = 1;
@@ -333,7 +333,7 @@ static uint8 *generate_random_script()
int i, j;
const int views = 16;
- srand(time(NULL));
+ srand((unsigned int)time(NULL));
uint8 *script = malloc(views * 8 + 2);
i = 0;
diff --git a/src/viewport.c b/src/viewport.c
index a22af3cf24..b005bafad2 100644
--- a/src/viewport.c
+++ b/src/viewport.c
@@ -78,7 +78,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int ecx
{
x &= 0xFFFF;
y &= 0xFFFF;
- RCT2_CALLPROC_X(0x006EB009, (y << 16) | x, (height << 16) | width, ecx, edx, w, 0, 0);
+ RCT2_CALLPROC_X(0x006EB009, (y << 16) | x, (height << 16) | width, ecx, edx, (int)w, 0, 0);
}
/**
@@ -103,7 +103,7 @@ void viewport_update_pointers()
*/
void viewport_update_position(rct_window *window)
{
- RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, window, 0, 0);
+ RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0);
}
/**
@@ -112,7 +112,7 @@ void viewport_update_position(rct_window *window)
*/
void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, int top, int right, int bottom)
{
- RCT2_CALLPROC_X(0x00685C02, left , top, 0, right, viewport, dpi, bottom);
+ RCT2_CALLPROC_X(0x00685C02, left , top, 0, right, (int)viewport, (int)dpi, bottom);
}
/**
diff --git a/src/widget.c b/src/widget.c
index c9de92adca..f286139c41 100644
--- a/src/widget.c
+++ b/src/widget.c
@@ -37,6 +37,7 @@ static void widget_text_inset(rct_drawpixelinfo *dpi, rct_window *w, int widgetI
static void widget_text_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex);
static void widget_groupbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex);
static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex);
+static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex);
static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex);
static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex);
static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour);
@@ -153,8 +154,9 @@ void widget_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
case WWT_SCROLL:
widget_scroll_draw(dpi, w, widgetIndex);
break;
- case WWT_23:
+ case WWT_CHECKBOX:
case WWT_24:
+ widget_checkbox_draw(dpi, w, widgetIndex);
break;
case WWT_25:
break;
@@ -246,7 +248,6 @@ static void widget_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget
{
rct_widget* widget;
int l, t, r, b, press;
- uint32 image;
uint8 colour;
// Get the widget
@@ -329,8 +330,7 @@ static void widget_tab_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetInd
static void widget_flat_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
{
rct_widget* widget;
- int l, t, r, b, press;
- uint32 image;
+ int l, t, r, b;
uint8 colour;
if (!widget_is_disabled(w, widgetIndex) && widget_is_highlighted(w, widgetIndex)) {
@@ -373,7 +373,7 @@ static void widget_flat_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int w
static void widget_text_button(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
{
rct_widget* widget;
- int l, t, r, b, width, press, stringId;
+ int l, t, r, b, press;
uint8 colour;
// Get the widget
@@ -403,7 +403,7 @@ static void widget_text_button(rct_drawpixelinfo *dpi, rct_window *w, int widget
static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
{
rct_widget* widget;
- int l, t, r, b, width, press, stringId;
+ int l, t, r, b, stringId;
uint8 colour;
// Get the widget
@@ -431,7 +431,7 @@ static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widge
gfx_draw_string_left_clipped(
dpi,
stringId,
- 0x013CE952,
+ (void*)0x013CE952,
colour,
l + 1,
t,
@@ -443,7 +443,7 @@ static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widge
gfx_draw_string_centred_clipped(
dpi,
stringId,
- 0x013CE952,
+ (void*)0x013CE952,
colour,
(w->x + w->x + widget->left + widget->right + 1) / 2 - 1,
t,
@@ -459,7 +459,7 @@ static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widge
static void widget_text(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
{
rct_widget* widget;
- int l, t, r, b, width, press;
+ int l, t, r, b;
uint8 colour;
// Get the widget
@@ -479,7 +479,7 @@ static void widget_text(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
if (widget_is_disabled(w, widgetIndex))
colour |= 0x40;
- gfx_draw_string_left(dpi, widget->image, 0x013CE952, colour, l + 1, t);
+ gfx_draw_string_left(dpi, widget->image, (void*)0x013CE952, colour, l + 1, t);
}
/**
@@ -489,7 +489,7 @@ static void widget_text(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
static void widget_text_inset(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
{
rct_widget* widget;
- int l, t, r, b, width, press;
+ int l, t, r, b;
uint8 colour;
// Get the widget
@@ -564,9 +564,9 @@ static void widget_groupbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg
// Text
if (widget->image != (uint32)-1) {
colour = w->colours[widget->colour] & 0x7F;
- if (colour & 1)
+ if (widget_is_disabled(w, widgetIndex))
colour |= 0x40;
- gfx_draw_string_left(dpi, widget->image, 0x013CE952, colour, l, t);
+ gfx_draw_string_left(dpi, widget->image, (void*)0x013CE952, colour, l, t);
textRight = gLastDrawStringX + 1;
}
@@ -711,6 +711,48 @@ static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg
gfx_draw_string_centred_clipped(dpi, widget->image, (void*)0x013CE952, colour, l, t, widget->right - widget->left - 2);
}
+/**
+*
+* rct2: 0x006EBAD9
+*/
+static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex)
+{
+ rct_widget* widget;
+ int l, t, b;
+ uint8 colour;
+
+ // Get the widget
+ widget = &w->widgets[widgetIndex];
+
+ // Resolve the absolute ltb
+ l = w->x + widget->left;
+ t = w->y + widget->top;
+ b = w->y + widget->bottom;
+
+ // Get the colour
+ colour = w->colours[widget->colour];
+
+ // checkbox
+ if (widget->type != WWT_24) {
+ gfx_fill_rect_inset(dpi, l, t, l + 9, b - 1, colour, 0x60);
+
+ // fill it when checkbox is pressed
+ if (widget_is_pressed(w, widgetIndex)) {
+ RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224;
+ gfx_draw_string(dpi, (char*)0x009DED72, colour & 0x7F, l, t);
+ }
+ }
+
+ // draw the text
+ if (widget->image == -1)
+ return;
+
+ if (widget_is_disabled(w, widgetIndex)) {
+ colour |= 0x40;
+ }
+ gfx_draw_string_left(dpi, widget->image, (char*)0x013CE952, colour, l + 14, t);
+}
+
/**
*
* rct2: 0x006EBD96
@@ -720,7 +762,7 @@ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget
rct_widget* widget;
rct_scroll* scroll;
int scrollIndex;
- int l, t, r, b, press, ebp;
+ int l, t, r, b;
int cl, ct, cr, cb;
uint8 colour;
rct_drawpixelinfo scroll_dpi;
@@ -782,7 +824,7 @@ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget
// Draw the scroll contents
if (scroll_dpi.width > 0 && scroll_dpi.height > 0)
- RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_PAINT], 0, 0, 0, 0, w, &scroll_dpi, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_PAINT], 0, 0, 0, 0, (int)w, (int)&scroll_dpi, 0);
}
static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour)
@@ -870,20 +912,20 @@ static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetI
colour = w->colours[widget->colour];
colour = RCT2_ADDRESS(0x00141FC4A, uint8)[(colour & 0x7F) * 8] & 0xFF;
RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009DED74;
- memset(0x009DED74, colour, 256);
+ memset((void*)0x009DED74, colour, 256);
RCT2_GLOBAL(0x009DED74, uint8) = 0;
RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000;
image &= 0x7FFFF;
- RCT2_CALLPROC_X(0x0067A46E, 0, image, l + 1, t + 1, 0, dpi, 0);
+ RCT2_CALLPROC_X(0x0067A46E, 0, image, l + 1, t + 1, 0, (int)dpi, 0);
// Draw greyed out (dark)
colour = w->colours[widget->colour];
colour = RCT2_ADDRESS(0x00141FC48, uint8)[(colour & 0x7F) * 8] & 0xFF;
RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009DED74;
- memset(0x009DED74, colour, 256);
+ memset((void*)0x009DED74, colour, 256);
RCT2_GLOBAL(0x009DED74, uint8) = 0;
RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000;
- RCT2_CALLPROC_X(0x0067A46E, 0, image, l, t, 0, dpi, 0);
+ RCT2_CALLPROC_X(0x0067A46E, 0, image, l, t, 0, (int)dpi, 0);
} else {
if (image & 0x80000000) {
// ?
diff --git a/src/widget.h b/src/widget.h
index 477c124a6c..0f269bc724 100644
--- a/src/widget.h
+++ b/src/widget.h
@@ -47,7 +47,7 @@ typedef enum {
WWT_CAPTION = 20,
WWT_CLOSEBOX = 21,
WWT_SCROLL = 22,
- WWT_23,
+ WWT_CHECKBOX,
WWT_24,
WWT_25,
WWT_LAST = 26,
diff --git a/src/window.c b/src/window.c
index a35da16b81..11a43c5567 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1,5 +1,5 @@
/*****************************************************************************
-* Copyright (c) 2014 Ted John
+* Copyright (c) 2014 Ted John, Peter Hill
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
@@ -111,7 +111,7 @@ void window_dispatch_update_all()
RCT2_GLOBAL(0x01423604, sint32)++;
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_NOT_SHOWN_TICKS, sint16)++;
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--)
- RCT2_CALLPROC_X(w->event_handlers[WE_UPDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_UPDATE], 0, 0, 0, 0, (int)w, 0, 0);
RCT2_CALLPROC_EBPSAFE(0x006EE411); // handle_text_input
}
@@ -142,7 +142,7 @@ void window_update_all()
if (RCT2_GLOBAL(0x009DEB7C, sint16) >= 1000) {
RCT2_GLOBAL(0x009DEB7C, sint16) = 0;
for (w = RCT2_LAST_WINDOW; w >= RCT2_FIRST_WINDOW; w--)
- RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_07], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_07], 0, 0, 0, 0, (int)w, 0, 0);
}
// Border flash invalidation
@@ -164,7 +164,7 @@ void window_update_all()
*/
static void window_scroll_wheel_input(rct_window *w, int scrollIndex, int wheel)
{
- int widgetIndex, newValue, size;
+ int widgetIndex, size;
rct_scroll *scroll;
rct_widget *widget;
@@ -238,7 +238,7 @@ static void window_viewport_wheel_input(rct_window *w, int wheel)
*/
static void window_all_wheel_input()
{
- int i, raw, wheel, widgetIndex;
+ int raw, wheel, widgetIndex;
rct_window *w;
rct_widget *widget;
rct_scroll *scroll;
@@ -402,9 +402,9 @@ rct_window *window_create_auto_pos(int width, int height, uint32 *event_handlers
ebx = (height << 16) | width;
ecx = (flags << 8) | cls;
- edx = event_handlers;
+ edx = (int)event_handlers;
RCT2_CALLFUNC_X(0x006EA9B1, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
- return esi;
+ return (rct_window*)esi;
}
/**
@@ -421,7 +421,7 @@ void window_close(rct_window* window)
return;
// Call close event of window
- RCT2_CALLPROC_X(window->event_handlers[WE_CLOSE], 0, 0, 0, 0, window, 0, 0);
+ RCT2_CALLPROC_X(window->event_handlers[WE_CLOSE], 0, 0, 0, 0, (int)window, 0, 0);
window = window_find_by_id(window->classification, window->number);
@@ -493,13 +493,54 @@ rct_window *window_find_by_id(rct_windowclass cls, rct_windownumber number)
return NULL;
}
+/**
+ * Closes the top-most window
+ *
+ * rct2: 0x006E403C
+ */
+void window_close_top()
+{
+ rct_window* w;
+
+ window_close_by_id(WC_DROPDOWN, 0);
+
+ if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)
+ if (RCT2_GLOBAL(0x0141F570, uint8) != 1)
+ return;
+
+ for (w = RCT2_FIRST_WINDOW; w < RCT2_LAST_WINDOW; w++) {
+ if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) {
+ window_close(w);
+ return;
+ }
+ }
+}
+
+/**
+ * Closes all open windows
+ *
+ * rct2: 0x006EE927
+ */
+void window_close_all() {
+ rct_window* w;
+
+ window_close_by_id(WC_DROPDOWN, 0);
+
+ for (w = RCT2_FIRST_WINDOW; w < RCT2_LAST_WINDOW; w++){
+ if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) {
+ window_close(w);
+ w = RCT2_FIRST_WINDOW;
+ }
+ }
+}
+
/**
*
* rct2: 0x006EA845
*/
rct_window *window_find_from_point(int x, int y)
{
- rct_window *w, *w2;
+ rct_window *w;
rct_widget *widget;
int widget_index;
@@ -535,7 +576,7 @@ int window_find_widget_from_point(rct_window *w, int x, int y)
int i, widget_index;
// Invalidate the window
- RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
// Find the widget at point x, y
widget_index = -1;
@@ -668,7 +709,7 @@ void window_init_scroll_widgets(rct_window *w)
*/
void window_update_scroll_widgets(rct_window *w)
{
- RCT2_CALLPROC_X(0x006EAE4E, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006EAE4E, 0, 0, 0, 0, (int)w, 0, 0);
}
int window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *height)
@@ -676,7 +717,7 @@ int window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *heig
rct_widget *widget = window_get_scroll_widget(w, scrollIndex);
int widgetIndex = window_get_widget_index(w, widget);
- int eax = 0, ebx = scrollIndex * sizeof(rct_scroll), ecx = 0, edx = 0, esi = w, edi = widgetIndex * sizeof(rct_widget), ebp = 0;
+ int eax = 0, ebx = scrollIndex * sizeof(rct_scroll), ecx = 0, edx = 0, esi = (int)w, edi = widgetIndex * sizeof(rct_widget), ebp = 0;
RCT2_CALLFUNC_X(w->event_handlers[WE_SCROLL_GETSIZE], & eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
*width = ecx;
*height = edx;
@@ -817,7 +858,7 @@ rct_window *window_get_main()
*/
void window_scroll_to_location(rct_window *w, int x, int y, int z)
{
- RCT2_CALLPROC_X(0x006E7C9C, x, 0, y, z, w, 0, 0);
+ RCT2_CALLPROC_X(0x006E7C9C, x, 0, y, z, (int)w, 0, 0);
}
/**
@@ -826,7 +867,7 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z)
*/
void window_rotate_camera(rct_window *w)
{
- RCT2_CALLPROC_X(0x0068881A, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x0068881A, 0, 0, 0, 0, (int)w, 0, 0);
}
/**
@@ -835,7 +876,7 @@ void window_rotate_camera(rct_window *w)
*/
void window_zoom_in(rct_window *w)
{
- RCT2_CALLPROC_X(0x006887A6, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006887A6, 0, 0, 0, 0, (int)w, 0, 0);
}
/**
@@ -844,7 +885,7 @@ void window_zoom_in(rct_window *w)
*/
void window_zoom_out(rct_window *w)
{
- RCT2_CALLPROC_X(0x006887E0, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006887E0, 0, 0, 0, 0, (int)w, 0, 0);
}
/**
@@ -853,7 +894,7 @@ void window_zoom_out(rct_window *w)
*/
void window_show_textinput(rct_window *w, int widgetIndex, uint16 title, uint16 text, int value)
{
- RCT2_CALLPROC_X(0x006EE308, title, text, value, widgetIndex, w, 0, 0);
+ RCT2_CALLPROC_X(0x006EE308, title, text, value, widgetIndex, (int)w, 0, 0);
}
/**
@@ -870,11 +911,6 @@ void window_draw(rct_window *w, int left, int top, int right, int bottom)
rct_drawpixelinfo *dpi, copy;
int overflow;
- char *copyBits;
- int copyLeft;
- int copyWidth;
- int copyPitch;
-
// RCT2_CALLPROC_X(0x006E756C, left, top, 0, right, w, 0, bottom);
// return;
@@ -948,10 +984,10 @@ void window_draw(rct_window *w, int left, int top, int right, int bottom)
RCT2_GLOBAL(0x0141F743, uint8) = v->colours[3] & 0x7F;
// Invalidate the window
- RCT2_CALLPROC_X(v->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, v, 0, 0);
+ RCT2_CALLPROC_X(v->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)v, 0, 0);
// Paint the window
- RCT2_CALLPROC_X(v->event_handlers[WE_PAINT], 0, 0, 0, 0, v, dpi, 0);
+ RCT2_CALLPROC_X(v->event_handlers[WE_PAINT], 0, 0, 0, 0, (int)v, (int)dpi, 0);
}
}
@@ -1074,8 +1110,8 @@ void window_resize(rct_window *w, int dw, int dh)
w->width = clamp(w->min_width, w->width + dw, w->max_width);
w->height = clamp(w->min_height, w->height + dh, w->max_height);
- RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], w->width, w->height, 0, 0, w, 0, 0);
- RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], w->width, w->height, 0, 0, (int)w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
// Update scroll widgets
for (i = 0; i < 3; i++) {
@@ -1176,7 +1212,7 @@ void tool_cancel()
RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)
);
if (w != NULL)
- RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_ABORT], 0, 0, 0, RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16), w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_ABORT], 0, 0, 0, RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16), (int)w, 0, 0);
}
}
}
@@ -1185,7 +1221,8 @@ void tool_cancel()
*
* rct2: 0x0068F083
*/
-void window_guest_list_init_vars_a() {
+void window_guest_list_init_vars_a()
+{
RCT2_GLOBAL(0x013B0E6C, uint32) = 1;
RCT2_GLOBAL(0x00F1AF1C, uint32) = 0xFFFFFFFF;
RCT2_GLOBAL(0x00F1EE02, uint32) = 0xFFFFFFFF;
@@ -1196,7 +1233,8 @@ void window_guest_list_init_vars_a() {
*
* rct2: 0x0068F050
*/
-void window_guest_list_init_vars_b() {
+void window_guest_list_init_vars_b()
+{
RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_GUEST_LIST_SELECTED_TAB, uint8) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_GUEST_LIST_SELECTED_VIEW, uint8) = 0;
RCT2_GLOBAL(0x00F1AF1C, uint32) = 0xFFFFFFFF;
@@ -1206,25 +1244,9 @@ void window_guest_list_init_vars_b() {
}
/**
-*
-* rct2: 0x006ACA58
-*/
-void window_ride_list_init_vars() {
- // If we are in the track designer, default to the Roller Coaster tab
- if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) {
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_SELECTED_TAB, uint8) = WINDOW_RIDE_LIST_TAB_ROLLER_COASTER;
- }
- else {
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_SELECTED_TAB, uint8) = WINDOW_RIDE_LIST_TAB_TRANSPORT;
- }
-
- for (short i = 0; i < 6; i++) {
- /*
- Reset what is highlighted in each tab.
- Each 16bit number represents the item in its respective tab.
- */
- RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, uint16)[i] = 0xFFFF;
- }
-
- RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_INFORMATION_TYPE, uint8) = 0;
-}
\ No newline at end of file
+ * Wrapper for window events so C functions can call them
+ */
+void window_event_helper(rct_window* w, short widgetIndex, WINDOW_EVENTS event)
+{
+ RCT2_CALLPROC_X(w->event_handlers[event], 0, 0, 0, widgetIndex, (int)w, 0, 0);
+}
diff --git a/src/window.h b/src/window.h
index 1f52eee128..3a21c90257 100644
--- a/src/window.h
+++ b/src/window.h
@@ -275,6 +275,7 @@ enum {
WC_CHANGE_KEYBOARD_SHORTCUT = 37,
WC_MAP = 38,
WC_TITLE_LOGO = 39,
+ WC_BANNER = 40,
WC_EDITOR_OBJECT_SELECTION = 42,
WC_EDITOR_INVENTION_LIST = 43,
WC_EDITOR_SCENARIO_OPTIONS = 45,
@@ -284,22 +285,6 @@ enum {
WC_CHEATS = 110,
} WINDOW_CLASS;
-enum {
- WINDOW_RIDE_LIST_TAB_TRANSPORT,
- WINDOW_RIDE_LIST_TAB_GENTLE,
- WINDOW_RIDE_LIST_TAB_ROLLER_COASTER,
- WINDOW_RIDE_LIST_TAB_THRILL,
- WINDOW_RIDE_LIST_TAB_WATER,
- WINDOW_RIDE_LIST_TAB_SHOP,
- WINDOW_RIDE_LIST_TAB_RESEARCH
-} WINDOW_RIDE_LIST_TAB;
-
-enum {
- WINDOW_STAFF_LIST_TAB_HANDYMEN,
- WINDOW_STAFF_LIST_TAB_MECHANICS,
- WINDOW_STAFF_LIST_TAB_SECURITY,
- WINDOW_STAFF_LIST_TAB_ENTERTAINERS
-} WINDOW_STAFF_LIST_TAB;
void window_dispatch_update_all();
void window_update_all();
@@ -307,6 +292,8 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
rct_window *window_create_auto_pos(int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags);
void window_close(rct_window *window);
void window_close_by_id(rct_windowclass cls, rct_windownumber number);
+void window_close_top();
+void window_close_all();
rct_window *window_find_by_id(rct_windowclass cls, rct_windownumber number);
rct_window *window_find_from_point(int x, int y);
int window_find_widget_from_point(rct_window *w, int x, int y);
@@ -359,13 +346,23 @@ void window_clear_scenery_open();
void window_land_open();
void window_water_open();
void window_guest_list_open();
+void window_options_open();
+void window_park_awards_open();
void window_park_entrance_open();
+void window_park_guests_open();
void window_park_objective_open();
+void window_park_rating_open();
void window_ride_list_open();
+void window_banner_open();
void window_cheats_open();
void window_guest_list_init_vars_a();
void window_guest_list_init_vars_b();
-void window_ride_list_init_vars();
+
+void window_new_ride_init_vars();
+
+void window_staff_init_vars();
+
+void window_event_helper(rct_window* w, short widgetIndex, WINDOW_EVENTS event);
#endif
diff --git a/src/window_about.c b/src/window_about.c
index c6657996f8..4250d65cdd 100644
--- a/src/window_about.c
+++ b/src/window_about.c
@@ -46,7 +46,7 @@ static void window_about_emptysub() { }
static void window_about_mouseup();
static void window_about_paint();
-static uint32 window_about_events[] = {
+static void* window_about_events[] = {
window_about_emptysub,
window_about_mouseup,
window_about_emptysub,
@@ -83,7 +83,6 @@ static uint32 window_about_events[] = {
*/
void window_about_open()
{
- int x, y;
rct_window* window;
// Check if window is already open
@@ -96,7 +95,7 @@ void window_about_open()
max(28, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) / 2 - 165),
400,
330,
- window_about_events,
+ (uint32*)window_about_events,
WC_ABOUT,
0
);
@@ -115,7 +114,6 @@ void window_about_open()
*/
static void window_about_mouseup()
{
- int i;
short widgetIndex;
rct_window *w;
@@ -155,40 +153,40 @@ static void window_about_paint()
// Version
RCT2_GLOBAL(0x009C383C, uint8) = 49;
- gfx_draw_string_centred(dpi, STR_VERSION_X, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_VERSION_X, x, y, 0, (void*)0x009E2D28);
// Credits
RCT2_GLOBAL(0x009C383C, uint8) = 48;
y += 10;
- gfx_draw_string_centred(dpi, STR_COPYRIGHT_CS, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_COPYRIGHT_CS, x, y, 0, (void*)0x009E2D28);
y += 79;
- gfx_draw_string_centred(dpi, STR_DESIGNED_AND_PROGRAMMED_BY_CS, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_DESIGNED_AND_PROGRAMMED_BY_CS, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_GRAPHICS_BY_SF, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_GRAPHICS_BY_SF, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_SOUND_AND_MUSIC_BY_AB, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_SOUND_AND_MUSIC_BY_AB, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_ADDITIONAL_SOUNDS_RECORDED_BY_DE, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_ADDITIONAL_SOUNDS_RECORDED_BY_DE, x, y, 0, (void*)0x009E2D28);
y += 13;
- gfx_draw_string_centred(dpi, STR_REPRESENTATION_BY_JL, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_REPRESENTATION_BY_JL, x, y, 0, (void*)0x009E2D28);
y += 25;
- gfx_draw_string_centred(dpi, STR_THANKS_TO, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_THANKS_TO, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_THANKS_TO_PEOPLE, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_THANKS_TO_PEOPLE, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_1, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_1, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_2, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_2, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_3, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_3, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_4, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_4, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_5, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_5, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_6, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_6, x, y, 0, (void*)0x009E2D28);
y += 10;
- gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_7, x, y, 0, 0x009E2D28);
+ gfx_draw_string_centred(dpi, STR_CREDIT_SPARE_7, x, y, 0, (void*)0x009E2D28);
// Images
gfx_draw_sprite(dpi, SPR_CREDITS_CHRIS_SAWYER_SMALL, w->x + 92, w->y + 40);
diff --git a/src/window_banner.c b/src/window_banner.c
new file mode 100644
index 0000000000..8f930d330b
--- /dev/null
+++ b/src/window_banner.c
@@ -0,0 +1,233 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Ted John, Dennis Devriendt
+ * 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
+#include "addresses.h"
+#include "config.h"
+#include "strings.h"
+#include "viewport.h"
+#include "widget.h"
+#include "window.h"
+
+static enum WINDOW_BANNER_WIDGET_IDX {
+ WIDX_BACKGROUND,
+ WIDX_TITLE,
+ WIDX_CLOSE,
+ WIDX_VIEWPORT,
+ WIDX_BANNER_TEXT,
+ WIDX_BANNER_NO_ENTRY,
+ WIDX_BANNER_DEMOLISH,
+ WIDX_MAIN_COLOR,
+ WIDX_TEXT_COLOR_DROPDOWN,
+ WIDX_TEXT_COLOR_DROPDOWN_BUTTON
+};
+
+static rct_widget window_banner_widgets[] = {
+ { WWT_FRAME, 0, 0, 112, 0, 95, 0x0FFFFFFFF, 65535}, // panel / background
+ { WWT_CAPTION, 0, 1, 111, 1, 14, 0xBA9, STR_WINDOW_TITLE_TIP}, // title bar
+ { WWT_CLOSEBOX, 0, 100, 110, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP}, // close x button
+ { WWT_VIEWPORT, 1, 3, 87, 17, 76, 0x0FFFFFFFE, 65535}, // tab content panel
+ { WWT_FLATBTN, 1, 88, 111, 19, 42, 0x1430, STR_CHANGE_BANNER_TEXT_TIP}, // change banner button
+ { WWT_FLATBTN, 1, 88, 111, 43, 66, 0x143A, STR_SET_AS_NO_ENTRY_BANNER_TIP}, // no entry button
+ { WWT_FLATBTN, 1, 88, 111, 67, 90, 0x142D, STR_DEMOLISH_BANNER_TIP}, // demolish button
+ { WWT_COLORBTN, 1, 5, 16, 80, 91, 0x0FFFFFFFF, STR_SELECT_MAIN_COLOR_TIP}, // high money
+ { WWT_DROPDOWN, 1, 43, 81, 80, 91, 0x0FFFFFFFF, 65535}, // high money
+ { WWT_DROPDOWN_BUTTON, 1, 70, 80, 81, 90, 0x36C, STR_SELECT_TEXT_COLOR_TIP}, // high money
+ { WIDGETS_END },
+};
+
+static void window_banner_emptysub() { }
+static void window_banner_mouseup();
+static void window_banner_mousedown();
+static void window_banner_dropdown();
+static void window_banner_textinput();
+static void window_banner_invalidate();
+static void window_banner_paint();
+
+static void* window_banner_events[] = {
+ window_banner_emptysub,
+ window_banner_mouseup,
+ window_banner_emptysub,
+ window_banner_mousedown,
+ window_banner_dropdown,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_textinput,
+ (void*)0x006BA7B5,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_emptysub,
+ window_banner_invalidate,
+ window_banner_paint,
+ window_banner_emptysub
+};
+
+/**
+*
+* rct2: 0x006BA305
+*/
+void window_banner_open()
+{
+ rct_windownumber windownumber;
+ rct_window* w;
+ rct_widget *viewportWidget;
+
+ //__asm mov windownumber, ax // not quite right I think
+ windownumber = 0;
+
+ // Check if window is already open
+ w = window_bring_to_front_by_id(WC_BANNER, windownumber);
+ if (w != NULL)
+ return;
+
+ w = window_create_auto_pos(113, 96, (uint32*)window_banner_events, WC_BANNER, 0);
+ w->widgets = window_banner_widgets;
+ w->enabled_widgets =
+ (1 << WIDX_CLOSE) |
+ (1 << WIDX_BANNER_TEXT) |
+ (1 << WIDX_BANNER_NO_ENTRY) |
+ (1 << WIDX_BANNER_DEMOLISH) |
+ (1 << WIDX_MAIN_COLOR) |
+ (1 << WIDX_TEXT_COLOR_DROPDOWN) |
+ (1 << WIDX_TEXT_COLOR_DROPDOWN_BUTTON);
+
+ w->number = windownumber;
+ window_init_scroll_widgets(w);
+ w->colours[0] = 24;
+ w->colours[1] = 24;
+ w->colours[2] = 24;
+
+ /*
+ TODO: MISSING CODE 006BA377 -> 006BA3F6, need the banner map element
+ */
+
+ // Create viewport
+ viewportWidget = &window_banner_widgets[WIDX_VIEWPORT];
+ viewport_create(
+ w,
+ w->x + viewportWidget->left + 1,
+ w->y + viewportWidget->top + 1,
+ (viewportWidget->right - viewportWidget->left) - 2,
+ (viewportWidget->bottom - viewportWidget->top) - 2,
+ 100, // TODO: needs banner map position
+ 100 // TODO: needs banner map position
+ );
+
+ w->viewport->flags = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES) ? VIEWPORT_FLAG_GRIDLINES : 0;
+ w->flags |= WF_2 | WF_TRANSPARENT;
+ window_invalidate(w);
+}
+
+static void window_banner_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_BANNER_DEMOLISH:
+ RCT2_CALLPROC_EBPSAFE(0x006BA739);
+ break;
+ case WIDX_BANNER_TEXT:
+ RCT2_CALLPROC_EBPSAFE(0x006BA6BC);
+ break;
+ case WIDX_BANNER_NO_ENTRY:
+ RCT2_CALLPROC_EBPSAFE(0x006BA64D);
+ break;
+ }
+}
+
+static void window_banner_mousedown()
+{
+ short widgetIndex;
+
+ __asm mov widgetIndex, dx
+
+ switch (widgetIndex) {
+ case WIDX_MAIN_COLOR:
+ RCT2_CALLPROC_EBPSAFE(0x006BA528);
+ break;
+ case WIDX_TEXT_COLOR_DROPDOWN_BUTTON:
+ RCT2_CALLPROC_EBPSAFE(0x006BA563);
+ break;
+ }
+}
+
+static void window_banner_dropdown()
+{
+ short widgetIndex;
+
+ __asm mov widgetIndex, dx;
+
+ if (widgetIndex == WIDX_MAIN_COLOR)
+ RCT2_CALLPROC_EBPSAFE(0x006BA548);
+ else if (widgetIndex == WIDX_TEXT_COLOR_DROPDOWN_BUTTON)
+ RCT2_CALLPROC_EBPSAFE(0x006BA5D0);
+}
+
+static void window_banner_textinput()
+{
+ short widgetIndex;
+
+ __asm mov widgetIndex, dx;
+
+ if (widgetIndex == WIDX_BANNER_TEXT) {
+ RCT2_CALLPROC_EBPSAFE(0x006BA6D8);
+ }
+}
+
+static void window_banner_invalidate()
+{
+ RCT2_CALLPROC_EBPSAFE(0x006BA44D);
+}
+
+static void window_banner_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+
+ __asm mov w, esi
+ __asm mov dpi, edi
+
+ window_draw_widgets(w, dpi);
+
+ // Draw viewport
+ if (w->viewport != NULL) {
+ window_draw_viewport(dpi, w);
+ }
+}
diff --git a/src/window_cheats.c b/src/window_cheats.c
index 4e9b188f53..8dfbb32e21 100644
--- a/src/window_cheats.c
+++ b/src/window_cheats.c
@@ -84,7 +84,7 @@ static void window_cheats_invalidate();
static void window_cheats_paint();
static void window_cheats_set_page(rct_window *w, int page);
-static uint32 window_cheats_money_events[] = {
+static void* window_cheats_money_events[] = {
window_cheats_emptysub,
window_cheats_money_mouseup,
window_cheats_emptysub,
@@ -115,7 +115,7 @@ static uint32 window_cheats_money_events[] = {
window_cheats_emptysub
};
-static uint32 window_cheats_guests_events[] = {
+static void* window_cheats_guests_events[] = {
window_cheats_emptysub,
window_cheats_guests_mouseup,
window_cheats_emptysub,
@@ -146,7 +146,7 @@ static uint32 window_cheats_guests_events[] = {
window_cheats_emptysub
};
-static uint32 *window_cheats_page_events[] = {
+static void* window_cheats_page_events[] = {
window_cheats_money_events,
window_cheats_guests_events,
};
@@ -167,7 +167,7 @@ void window_cheats_open()
if (window != NULL)
return;
- window = window_create(32, 32, WW, WH, window_cheats_money_events, WC_CHEATS, 0);
+ window = window_create(32, 32, WW, WH, (uint32*)window_cheats_money_events, WC_CHEATS, 0);
window->widgets = window_cheats_money_widgets;
window->enabled_widgets = window_cheats_page_enabled_widgets[0];
window_init_scroll_widgets(window);
@@ -211,7 +211,6 @@ static void window_cheats_money_mouseup()
static void window_cheats_guests_mouseup()
{
- int i;
short widgetIndex;
rct_window *w;
@@ -260,7 +259,7 @@ static void window_cheats_invalidate()
__asm mov w, esi
strcpy((char*)0x009BC677, "Cheats");
- rct_widget **widgets = window_cheats_page_widgets[w->page];
+ rct_widget *widgets = window_cheats_page_widgets[w->page];
if (w->widgets != widgets) {
w->widgets = widgets;
window_init_scroll_widgets(w);
@@ -269,7 +268,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->page);
+ w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
}
static void window_cheats_paint()
diff --git a/src/window_clear_scenery.c b/src/window_clear_scenery.c
index f5a708f83d..81cc447c78 100644
--- a/src/window_clear_scenery.c
+++ b/src/window_clear_scenery.c
@@ -53,7 +53,7 @@ static void window_clear_scenery_update();
static void window_clear_scenery_invalidate();
static void window_clear_scenery_paint();
-static uint32 window_clear_scenery_events[] = {
+static void* window_clear_scenery_events[] = {
window_clear_scenery_close,
window_clear_scenery_mouseup,
window_clear_scenery_emptysub,
@@ -96,7 +96,7 @@ void window_clear_scenery_open()
if (window_find_by_id(WC_CLEAR_SCENERY, 0) != NULL)
return;
- window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 67, window_clear_scenery_events, WC_CLEAR_SCENERY, 0);
+ window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 67, (uint32*)window_clear_scenery_events, WC_CLEAR_SCENERY, 0);
window->widgets = window_clear_scenery_widgets;
window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT);
window_init_scroll_widgets(window);
diff --git a/src/window_dropdown.c b/src/window_dropdown.c
index 9050dd6c64..84607a4632 100644
--- a/src/window_dropdown.c
+++ b/src/window_dropdown.c
@@ -51,13 +51,13 @@ int _dropdown_item_height;
int _dropdown_highlighted_index;
uint16 gDropdownItemsFormat[64];
-sint32 gDropdownItemsArgs[64];
+sint64 gDropdownItemsArgs[64];
uint32 gDropdownItemsChecked;
static void window_dropdown_emptysub() { }
static void window_dropdown_paint();
-static uint32 window_dropdown_events[] = {
+static void* window_dropdown_events[] = {
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
@@ -130,12 +130,10 @@ void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 fla
void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colour, uint8 flags, int num_items, int width)
{
rct_window* w;
- int i, string_width, max_string_width;
- char buffer[256];
// Copy the formats and arguments until all use of it is decompiled
- memcpy(0x009DEBA4, gDropdownItemsFormat, 37 * 2);
- memcpy(0x009DEBF4, gDropdownItemsArgs, 80 * 4);
+ memcpy((void*)0x009DEBA4, gDropdownItemsFormat, 40 * 2);
+ memcpy((void*)0x009DEBF4, gDropdownItemsArgs, 40 * 8);
RCT2_GLOBAL(0x009DE518, uint32) &= ~(0x04 | 0x02);
if (flags & 0x80)
@@ -159,7 +157,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
x, y + extray,
window_dropdown_widgets[WIDX_BACKGROUND].right + 1,
window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1,
- window_dropdown_events,
+ (uint32*)window_dropdown_events,
WC_DROPDOWN,
0x02
);
@@ -199,12 +197,12 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
*/
void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 flags, int numItems, int itemWidth, int itemHeight, int numColumns)
{
- int i, width, height;
+ int width, height;
rct_window* w;
// Copy the formats and arguments until all use of it is decompiled
- memcpy(0x009DEBA4, gDropdownItemsFormat, 37 * 2);
- memcpy(0x009DEBF4, gDropdownItemsArgs, 80 * 4);
+ memcpy((void*)0x009DEBA4, gDropdownItemsFormat, 40 * 2);
+ memcpy((void*)0x009DEBF4, gDropdownItemsArgs, 40 * 8);
RCT2_GLOBAL(0x009DE518, uint32) &= ~(0x04 | 0x02);
if (flags & 0x80)
@@ -237,7 +235,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl
x, y + extray,
window_dropdown_widgets[WIDX_BACKGROUND].right + 1,
window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1,
- window_dropdown_events,
+ (uint32*)window_dropdown_events,
WC_DROPDOWN,
WF_STICK_TO_FRONT
);
@@ -312,7 +310,7 @@ static void window_dropdown_paint()
item = gDropdownItemsFormat[i];
if (item == (uint16)-1 || item == (uint16)-2) {
// Image item
- image = gDropdownItemsArgs[i];
+ image = *((uint32*)&gDropdownItemsArgs[i]);
if (item == (uint16)-2 && _dropdown_highlighted_index == i)
image++;
diff --git a/src/window_dropdown.h b/src/window_dropdown.h
index 14d47a8920..b98598abac 100644
--- a/src/window_dropdown.h
+++ b/src/window_dropdown.h
@@ -28,7 +28,7 @@
extern int gAppropriateImageDropdownItemsPerRow[];
extern uint16 gDropdownItemsFormat[64];
-extern sint32 gDropdownItemsArgs[64];
+extern sint64 gDropdownItemsArgs[64];
extern uint32 gDropdownItemsChecked;
void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items);
diff --git a/src/settings.c b/src/window_finances.c
similarity index 73%
rename from src/settings.c
rename to src/window_finances.c
index 6e281aa97a..a2244518dd 100644
--- a/src/settings.c
+++ b/src/window_finances.c
@@ -1,5 +1,5 @@
/*****************************************************************************
-* Copyright (c) 2014 Ted John
+* Copyright (c) 2014 Maciek Baron
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
@@ -18,11 +18,16 @@
* along with this program. If not, see .
*****************************************************************************/
-#include
-#include
-#include
-#include
#include
-#include "settings.h"
-#include "screenshot.h"
+#include "addresses.h"
+#include "game.h"
+#include "window.h"
+enum {
+ WINDOW_FINANCES_TAB_SUMMARY,
+ WINDOW_FINANCES_TAB_FINANCIAL_GRAPH,
+ WINDOW_FINANCES_TAB_VALUE_GRAPH,
+ WINDOW_FINANCES_TAB_PROFIT_GRAPH,
+ WINDOW_FINANCES_TAB_MARKETING,
+ WINDOW_FINANCES_TAB_RESEARCH
+} WINDOW_FINANCIAL_TAB;
\ No newline at end of file
diff --git a/src/window_footpath.c b/src/window_footpath.c
index d88cf014a3..38da0c66e6 100644
--- a/src/window_footpath.c
+++ b/src/window_footpath.c
@@ -116,7 +116,7 @@ static void window_footpath_toolup();
static void window_footpath_invalidate();
static void window_footpath_paint();
-static uint32 window_footpath_events[] = {
+static void* window_footpath_events[] = {
window_footpath_close,
window_footpath_mouseup,
window_footpath_emptysub,
@@ -174,7 +174,7 @@ void window_footpath_open()
29,
106,
381,
- window_footpath_events,
+ (uint32*)window_footpath_events,
WC_FOOTPATH,
0
);
@@ -270,7 +270,7 @@ static void window_footpath_mouseup()
break;
_window_footpath_cost = 0x80000000;
- RCT2_CALLPROC_EBPSAFE(0x006EE281);
+ tool_cancel();
RCT2_CALLPROC_EBPSAFE(0x006A7831);
RCT2_CALLPROC_EBPSAFE(0x0068AB1B);
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
@@ -305,25 +305,25 @@ static void window_footpath_mousedown()
window_footpath_show_footpath_types_dialog(w, widget, 1);
break;
case WIDX_DIRECTION_NW:
- RCT2_CALLPROC_X(0x006A8111, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A8111, 0, 0, 0, 0, (int)w, 0, 0);
break;
case WIDX_DIRECTION_NE:
- RCT2_CALLPROC_X(0x006A8135, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A8135, 0, 0, 0, 0, (int)w, 0, 0);
break;
case WIDX_DIRECTION_SW:
- RCT2_CALLPROC_X(0x006A815C, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A815C, 0, 0, 0, 0, (int)w, 0, 0);
break;
case WIDX_DIRECTION_SE:
- RCT2_CALLPROC_X(0x006A8183, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A8183, 0, 0, 0, 0, (int)w, 0, 0);
break;
case WIDX_SLOPEDOWN:
- RCT2_CALLPROC_X(0x006A81AA, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A81AA, 0, 0, 0, 0, (int)w, 0, 0);
break;
case WIDX_LEVEL:
- RCT2_CALLPROC_X(0x006A81C5, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A81C5, 0, 0, 0, 0, (int)w, 0, 0);
break;
case WIDX_SLOPEUP:
- RCT2_CALLPROC_X(0x006A81E0, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A81E0, 0, 0, 0, 0, (int)w, 0, 0);
break;
}
}
@@ -388,10 +388,9 @@ static void window_footpath_dropdown()
*/
static void window_footpath_toolupdate()
{
- int x, y, z;
+ int x, y;
short widgetIndex;
rct_window *w;
- rct_map_element *mapElement;
__asm mov x, eax
__asm mov y, ebx
@@ -401,7 +400,7 @@ static void window_footpath_toolupdate()
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
window_footpath_set_provisional_path_at_point(x, y);
} else if (widgetIndex == WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL) {
- RCT2_CALLPROC_X(0x006A8388, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A8388, 0, 0, 0, 0, (int)w, 0, 0);
}
}
@@ -411,10 +410,9 @@ static void window_footpath_toolupdate()
*/
static void window_footpath_tooldown()
{
- int x, y, z;
+ int x, y;
short widgetIndex;
rct_window *w;
- rct_map_element *mapElement;
__asm mov x, eax
__asm mov y, ebx
@@ -424,7 +422,7 @@ static void window_footpath_tooldown()
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
window_footpath_place_path_at_point(x, y);
} else if (widgetIndex == WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL) {
- RCT2_CALLPROC_X(0x006A840F, x, y, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A840F, x, y, 0, 0, (int)w, 0, 0);
}
}
@@ -444,7 +442,7 @@ static void window_footpath_tooldrag()
__asm mov w, esi
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
- RCT2_CALLPROC_X(0x006A82C5, x, y, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A82C5, x, y, 0, 0, (int)w, 0, 0);
}
}
@@ -464,7 +462,7 @@ static void window_footpath_toolup()
__asm mov w, esi
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
- RCT2_CALLPROC_X(0x006A8380, x, y, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x006A8380, x, y, 0, 0, (int)w, 0, 0);
}
}
@@ -649,7 +647,7 @@ static void window_footpath_set_provisional_path_at_point(int x, int y)
x = eax & 0xFFFF;
z = ebx & 0xFF;
y = ecx & 0xFFFF;
- mapElement = edx;
+ mapElement = (rct_map_element*)edx;
if (z == 0) {
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~1;
@@ -686,8 +684,7 @@ static void window_footpath_set_provisional_path_at_point(int x, int y)
*/
static int window_footpath_set_provisional_path(int type, int x, int y, int z, int slope)
{
- int cost;
- int eax, ebx, ecx, edx, esi, edi, ebp;
+ int eax, cost;
RCT2_CALLPROC_EBPSAFE(0x006A77FF);
@@ -732,7 +729,7 @@ static void window_footpath_place_path_at_point(int x, int y)
x = eax & 0xFFFF;
z = ebx & 0xFF;
y = ecx & 0xFFFF;
- mapElement = edx;
+ mapElement = (rct_map_element*)edx;
if (z == 0)
return;
@@ -775,7 +772,7 @@ static void window_footpath_construct()
*/
static void window_footpath_remove()
{
- int x, y, z, lastTile;
+ int x, y, lastTile;
rct_map_element *mapElement;
// RCT2_CALLPROC_EBPSAFE(0x006A7863);
diff --git a/src/window_game_bottom_toolbar.c b/src/window_game_bottom_toolbar.c
index 32b4a01251..49c820abf2 100644
--- a/src/window_game_bottom_toolbar.c
+++ b/src/window_game_bottom_toolbar.c
@@ -77,7 +77,7 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi,
static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rct_window *w);
static void window_game_bottom_toolbar_draw_tutorial_text(rct_drawpixelinfo *dpi, rct_window *w);
-static uint32 window_game_bottom_toolbar_events[] = {
+static void* window_game_bottom_toolbar_events[] = {
window_game_bottom_toolbar_emptysub,
window_game_bottom_toolbar_mouseup,
window_game_bottom_toolbar_emptysub,
@@ -119,7 +119,7 @@ void window_game_bottom_toolbar_open()
window = window_create(
0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 32,
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 32,
- window_game_bottom_toolbar_events,
+ (uint32*)window_game_bottom_toolbar_events,
WC_BOTTOM_TOOLBAR,
WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5
);
@@ -163,17 +163,17 @@ static void window_game_bottom_toolbar_mouseup()
RCT2_CALLPROC_EBPSAFE(0x0069DDF1);
break;
case WIDX_GUESTS:
- RCT2_CALLPROC_EBPSAFE(0x00667D35);
+ window_park_guests_open();
break;
case WIDX_PARK_RATING:
- RCT2_CALLPROC_EBPSAFE(0x00667CA4);
+ window_park_rating_open();
break;
case WIDX_MIDDLE_INSET:
news_item_close_current();
break;
case WIDX_NEWS_SUBJECT:
newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]);
- RCT2_CALLPROC_X(0x0066EBE6, 0, newsItem->type, newsItem->assoc, 0, 0, 0, 0);
+ news_item_open_subject(newsItem->type, newsItem->assoc);
break;
case WIDX_NEWS_LOCATE:
newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]);
@@ -204,8 +204,7 @@ static void window_game_bottom_toolbar_tooltip()
{
int month, day;
short widgetIndex;
- rct_window *w, *mainWindow;
- rct_news_item *newsItem;
+ rct_window *w;
__asm mov widgetIndex, dx
__asm mov w, esi
@@ -332,7 +331,6 @@ void window_game_bottom_toolbar_invalidate_news_item()
*/
static void window_game_bottom_toolbar_paint()
{
- int x, y, imgId;
rct_window *w;
rct_drawpixelinfo *dpi;
@@ -525,7 +523,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc
(window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right) / 2 + w->x,
w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 11,
0,
- dpi,
+ (int)dpi,
(newsItem->ticks << 16) | (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left - 62)
);
@@ -615,7 +613,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc
break;
case NEWS_ITEM_MONEY:
gfx_draw_sprite(dpi, SPR_FINANCE, x, y);
- case NEWS_ITEM_SCENERY:
+ case NEWS_ITEM_RESEARCH:
gfx_draw_sprite(dpi, (newsItem->assoc < 0x10000 ? SPR_NEW_RIDE : SPR_SCENERY), x, y);
break;
case NEWS_ITEM_PEEPS:
diff --git a/src/window_game_top_toolbar.c b/src/window_game_top_toolbar.c
index fa59d02950..f6d893d16d 100644
--- a/src/window_game_top_toolbar.c
+++ b/src/window_game_top_toolbar.c
@@ -82,7 +82,7 @@ static void window_game_top_toolbar_dropdown();
static void window_game_top_toolbar_invalidate();
static void window_game_top_toolbar_paint();
-static uint32 window_game_top_toolbar_events[] = {
+static void* window_game_top_toolbar_events[] = {
window_game_top_toolbar_emptysub,
window_game_top_toolbar_mouseup,
window_game_top_toolbar_emptysub,
@@ -92,11 +92,11 @@ static uint32 window_game_top_toolbar_events[] = {
window_game_top_toolbar_emptysub,
window_game_top_toolbar_emptysub,
window_game_top_toolbar_emptysub,
- 0x0066CB25,
- 0x0066CB73,
- 0x0066CB4E,
- 0x0066CC5B,
- 0x0066CA58,
+ (void*)0x0066CB25,
+ (void*)0x0066CB73,
+ (void*)0x0066CB4E,
+ (void*)0x0066CC5B,
+ (void*)0x0066CA58,
window_game_top_toolbar_emptysub,
window_game_top_toolbar_emptysub,
window_game_top_toolbar_emptysub,
@@ -124,7 +124,7 @@ void window_game_top_toolbar_open()
window = window_create(
0, 0,
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 28,
- window_game_top_toolbar_events,
+ (uint32*)window_game_top_toolbar_events,
WC_TOP_TOOLBAR,
WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5
);
@@ -208,9 +208,10 @@ static void window_game_top_toolbar_mouseup()
}
break;
case WIDX_SCENERY:
- tool_set(w, WIDX_SCENERY, 0);
- RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6);
- RCT2_CALLPROC_EBPSAFE(0x006E0FEF);
+ if (!tool_set(w, WIDX_SCENERY, 0)) {
+ RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6);
+ RCT2_CALLPROC_EBPSAFE(0x006E0FEF);
+ }
break;
case WIDX_PATH:
if (window_find_by_id(WC_FOOTPATH, 0) == NULL) {
@@ -355,7 +356,7 @@ static void window_game_top_toolbar_dropdown()
break;
}
- char *src = 0x0141EF67;
+ char *src = (char*)0x0141EF67;
do {
src++;
} while (*src != '.' && *src != '\0');
@@ -376,7 +377,8 @@ static void window_game_top_toolbar_dropdown()
window_about_open();
break;
case 4: // options
- RCT2_CALLPROC_EBPSAFE(0x006BAC5B);
+ window_options_open();
+ //RCT2_CALLPROC_EBPSAFE(0x006BAC5B);
break;
case 5: // screenshot
RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10;
diff --git a/src/window_guest_list.c b/src/window_guest_list.c
index d57a504ccf..5bd202fa28 100644
--- a/src/window_guest_list.c
+++ b/src/window_guest_list.c
@@ -84,7 +84,7 @@ static void window_guest_list_invalidate();
static void window_guest_list_paint();
static void window_guest_list_scrollpaint();
-static uint32 window_guest_list_events[] = {
+static void* window_guest_list_events[] = {
window_guest_list_emptysub,
window_guest_list_mouseup,
window_guest_list_resize,
@@ -130,7 +130,8 @@ static uint8 _window_guest_list_groups_guest_faces[240 * 58];
static int window_guest_list_is_peep_in_filter(rct_peep* peep);
static void window_guest_list_find_groups();
-static int get_guest_face_sprite(rct_peep *peep);
+static int get_guest_face_sprite_small(rct_peep *peep);
+static int get_guest_face_sprite_large(rct_peep *peep);
/**
*
@@ -141,11 +142,11 @@ void window_guest_list_open()
rct_window* window;
// Check if window is already open
- window = window_bring_to_front_by_id(WC_RIDE_LIST, 0);
+ window = window_bring_to_front_by_id(WC_GUEST_LIST, 0);
if (window != NULL)
return;
- window = window_create_auto_pos(350, 330, window_guest_list_events, WC_GUEST_LIST, 0x0400);
+ window = window_create_auto_pos(350, 330, (uint32*)window_guest_list_events, WC_GUEST_LIST, 0x0400);
window->widgets = window_guest_list_widgets;
window->enabled_widgets =
(1 << WIDX_CLOSE) |
@@ -160,7 +161,7 @@ void window_guest_list_open()
window_init_scroll_widgets(window);
_window_guest_list_highlighted_index = -1;
window->var_490 = 0;
- _window_guest_list_selected_tab = 1;
+ _window_guest_list_selected_tab = PAGE_INDIVIDUAL;
_window_guest_list_selected_filter = -1;
_window_guest_list_selected_page = 0;
_window_guest_list_num_pages = 1;
@@ -183,7 +184,6 @@ void window_guest_list_open()
*/
static void window_guest_list_mouseup()
{
- int i;
short widgetIndex;
rct_window *w;
@@ -441,7 +441,7 @@ static void window_guest_list_scrollmousedown()
if (i == 0) {
// Open guest window
- RCT2_CALLPROC_X(0x006989E9, 0, 0, 0, peep, 0, 0, 0);
+ RCT2_CALLPROC_X(0x006989E9, 0, 0, 0, (int)peep, 0, 0, 0);
break;
} else {
i--;
@@ -504,7 +504,7 @@ static void window_guest_list_invalidate()
w->pressed_widgets &= ~(1 << WIDX_TAB_1);
w->pressed_widgets &= ~(1 << WIDX_TAB_2);
- w->pressed_widgets |= (1 << (_window_guest_list_selected_tab + WIDX_TAB_1));
+ w->pressed_widgets |= (1LL << (_window_guest_list_selected_tab + WIDX_TAB_1));
window_guest_list_widgets[WIDX_INFO_TYPE_DROPDOWN].image = STR_ACTIONS + _window_guest_list_selected_view;
window_guest_list_widgets[WIDX_MAP].type = WWT_EMPTY;
@@ -575,14 +575,14 @@ static void window_guest_list_paint()
} else {
format = STR_ALL_GUESTS_SUMMARISED;
}
- gfx_draw_string_left_clipped(dpi, format, 0x00F1EDF6, 0, x, y, 310);
+ gfx_draw_string_left_clipped(dpi, format, (void*)0x00F1EDF6, 0, x, y, 310);
// Number of guests (list items)
if (_window_guest_list_selected_tab == PAGE_INDIVIDUAL) {
x = w->x + 4;
y = w->y + window_guest_list_widgets[WIDX_GUEST_LIST].bottom + 2;
RCT2_GLOBAL(0x013CE952, sint16) = w->var_492;
- gfx_draw_string_left(dpi, (w->var_492 == 1 ? 1755 : 1754), 0x013CE952, 0, x, y);
+ gfx_draw_string_left(dpi, (w->var_492 == 1 ? 1755 : 1754), (void*)0x013CE952, 0, x, y);
}
}
@@ -593,7 +593,7 @@ static void window_guest_list_paint()
static void window_guest_list_scrollpaint()
{
int eax, ebx, ecx, edx, esi, edi, ebp;
- int spriteIdx, format, numGuests, i, j, x, y;
+ int spriteIdx, format, numGuests, i, j, y;
rct_window *w;
rct_drawpixelinfo *dpi;
rct_peep *peep;
@@ -644,12 +644,12 @@ static void window_guest_list_scrollpaint()
// Guest name
RCT2_GLOBAL(0x013CE952, uint16) = peep->name_string_idx;
RCT2_GLOBAL(0x013CE954, uint32) = peep->id;
- gfx_draw_string_left_clipped(dpi, format, 0x013CE952, 0, 0, y - 1, 113);
+ gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 0, y - 1, 113);
switch (_window_guest_list_selected_view) {
case VIEW_ACTIONS:
// Guest face
- gfx_draw_sprite(dpi, get_guest_face_sprite(peep), 118, y);
+ gfx_draw_sprite(dpi, get_guest_face_sprite_small(peep), 118, y);
// Tracking icon
if (peep->flags & PEEP_FLAGS_TRACKING)
@@ -664,7 +664,7 @@ static void window_guest_list_scrollpaint()
RCT2_GLOBAL(0x013CE952, uint16) = ebx;
RCT2_GLOBAL(0x013CE952 + 2, uint16) = ecx;
RCT2_GLOBAL(0x013CE952 + 4, uint32) = edx;
- gfx_draw_string_left_clipped(dpi, format, 0x013CE952, 0, 133, y - 1, 314);
+ gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 133, y - 1, 314);
break;
case VIEW_THOUGHTS:
// For each thought
@@ -685,7 +685,7 @@ static void window_guest_list_scrollpaint()
RCT2_GLOBAL(0x013CE952, uint16) = ebx;
RCT2_GLOBAL(0x013CE952 + 2, uint32) = *((uint32*)esi);
RCT2_GLOBAL(0x013CE952 + 6, uint16) = *((uint16*)(esi + 4));
- gfx_draw_string_left_clipped(dpi, format, 0x013CE952, 0, 118, y - 1, 329);
+ gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 118, y - 1, 329);
break;
}
break;
@@ -725,11 +725,11 @@ static void window_guest_list_scrollpaint()
RCT2_GLOBAL(0x013CE952 + 2, uint16) = _window_guest_list_groups_argument_1[i] >> 16;
RCT2_GLOBAL(0x013CE952 + 4, uint32) = _window_guest_list_groups_argument_2[i];
RCT2_GLOBAL(0x013CE952 + 10, uint32) = numGuests;
- gfx_draw_string_left_clipped(dpi, format, 0x013CE952, 0, 0, y - 1, 414);
+ gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 0, y - 1, 414);
// Draw guest count
RCT2_GLOBAL(0x013CE95A, uint16) = STR_GUESTS_COUNT_COMMA_SEP;
- gfx_draw_string_right(dpi, format, 0x0013CE95A, 0, 326, y - 1);
+ gfx_draw_string_right(dpi, format, (void*)0x0013CE95A, 0, 326, y - 1);
}
y += 21;
}
@@ -749,7 +749,7 @@ static int window_guest_list_is_peep_in_filter(rct_peep* peep)
temp = _window_guest_list_selected_view;
_window_guest_list_selected_view = _window_guest_list_selected_filter;
- esi = peep;
+ esi = (int)peep;
RCT2_CALLFUNC_X(0x0069B7EA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
ebx &= 0xFFFF;
@@ -797,6 +797,8 @@ static int sub_69B7EA(rct_peep *peep, int *outEAX)
*outEAX = 0;
return 0;
}
+
+ return 0;
}
/**
@@ -856,7 +858,7 @@ static void window_guest_list_find_groups()
_window_guest_list_groups_argument_2[groupIndex] = RCT2_GLOBAL(0x013CE952 + 2, uint32);
RCT2_ADDRESS(0x00F1AF26, uint8)[groupIndex] = groupIndex;
faceIndex = groupIndex * 56;
- _window_guest_list_groups_guest_faces[faceIndex++] = get_guest_face_sprite(peep) - 5486;
+ _window_guest_list_groups_guest_faces[faceIndex++] = get_guest_face_sprite_small(peep) - 5486;
// Find more peeps that belong to same group
spriteIdx2 = peep->next;
@@ -880,7 +882,7 @@ static void window_guest_list_find_groups()
// Add face sprite, cap at 56 though
if (_window_guest_list_groups_num_guests[groupIndex] < 56)
continue;
- _window_guest_list_groups_guest_faces[faceIndex++] = get_guest_face_sprite(peep2) - 5486;
+ _window_guest_list_groups_guest_faces[faceIndex++] = get_guest_face_sprite_small(peep2) - 5486;
}
if (RCT2_GLOBAL(0x00F1EDF6, uint16) == 0) {
@@ -927,14 +929,70 @@ static void window_guest_list_find_groups()
}
/**
- *
+ * Function split into large and small sprite
* rct2: 0x00698721
*/
-static int get_guest_face_sprite(rct_peep *peep)
+static int get_guest_face_sprite_small(rct_peep *peep)
{
- int eax, ebx, ecx, edx, esi, edi, ebp;
- esi = peep;
- ebp = 999;
- RCT2_CALLFUNC_X(0x00698721, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
- return ebp;
-}
\ No newline at end of file
+ int sprite;
+ sprite = 0x157A;
+
+ if (peep->var_F3) return sprite;
+
+ sprite = 0x1579;
+ if (peep->nausea > 200) return sprite;
+ sprite--;
+
+ if (peep->nausea > 170) return sprite;
+ sprite--;
+
+ if (peep->nausea > 140) return sprite;
+ sprite = 0x1576;
+
+ if (peep->energy < 46) return sprite;
+ sprite--;
+
+ if (peep->energy < 70) return sprite;
+ sprite = 0x156E;
+
+ for (int i = 37; peep->happiness >= i; i += 37)
+ {
+ sprite++;
+ }
+
+ return sprite;
+}
+
+/**
+* Function split into large and small sprite
+* rct2: 0x00698721
+*/
+static int get_guest_face_sprite_large(rct_peep* peep){
+ int sprite;
+ sprite = 5314;
+
+ if (peep->var_F3) return sprite;
+
+ sprite = 5298;
+ if (peep->nausea > 200) return sprite;
+ sprite = 0x14AE;
+
+ if (peep->nausea > 170) return sprite;
+ sprite = 0x14AD;
+
+ if (peep->nausea > 140) return sprite;
+ sprite = 0x14AC;
+
+ if (peep->energy < 46) return sprite;
+ sprite--;
+
+ if (peep->energy < 70) return sprite;
+ sprite = 0x14A4;
+
+ for (int i = 37; peep->happiness >= i; i += 37)
+ {
+ sprite++;
+ }
+
+ return sprite;
+}
diff --git a/src/window_land.c b/src/window_land.c
index ca9b9ea295..2a2c90e7b5 100644
--- a/src/window_land.c
+++ b/src/window_land.c
@@ -58,7 +58,7 @@ static void window_land_update();
static void window_land_invalidate();
static void window_land_paint();
-static uint32 window_land_events[] = {
+static void* window_land_events[] = {
window_land_close,
window_land_mouseup,
window_land_emptysub,
@@ -122,7 +122,7 @@ void window_land_open()
if (window_find_by_id(WC_LAND, 0) != NULL)
return;
- window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 126, window_land_events, WC_LAND, 0);
+ window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 126, (uint32*)window_land_events, WC_LAND, 0);
window->widgets = window_land_widgets;
window->enabled_widgets =
(1 << WIDX_CLOSE) |
@@ -277,7 +277,7 @@ static void window_land_dropdown()
type = (dropdownIndex == -1) ?
_selectedFloorTexture :
- gDropdownItemsArgs[dropdownIndex] - SPR_FLOOR_TEXTURE_GRASS;
+ *((uint32*)&gDropdownItemsArgs[dropdownIndex]) - SPR_FLOOR_TEXTURE_GRASS;
if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) == type) {
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) = 255;
@@ -293,7 +293,7 @@ static void window_land_dropdown()
type = (dropdownIndex == -1) ?
_selectedWallTexture :
- gDropdownItemsArgs[dropdownIndex] - SPR_WALL_TEXTURE_ROCK;
+ *((uint32*)&gDropdownItemsArgs[dropdownIndex]) - SPR_WALL_TEXTURE_ROCK;
if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) == type) {
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) = 255;
@@ -368,19 +368,19 @@ static void window_land_paint()
RCT2_GLOBAL(0x009BC678, char) = FORMAT_COMMA16;
RCT2_GLOBAL(0x009BC679, char) = 0;
RCT2_GLOBAL(0x013CE952, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16);
- gfx_draw_string_centred(dpi, 3165, x, y - 2, 0, 0x013CE952);
+ gfx_draw_string_centred(dpi, 3165, x, y - 2, 0, (void*)0x013CE952);
}
y = w->y + window_land_widgets[WIDX_PREVIEW].bottom + 5;
// Draw raise cost amount
if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, uint32) != 0x80000000 && RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, uint32) != 0)
- gfx_draw_string_centred(dpi, 984, x, y, 0, RCT2_ADDRESS_LAND_RAISE_COST);
+ gfx_draw_string_centred(dpi, 984, x, y, 0, (void*)RCT2_ADDRESS_LAND_RAISE_COST);
y += 10;
// Draw lower cost amount
if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_LOWER_COST, uint32) != 0x80000000 && RCT2_GLOBAL(RCT2_ADDRESS_LAND_LOWER_COST, uint32) != 0)
- gfx_draw_string_centred(dpi, 985, x, y, 0, RCT2_ADDRESS_LAND_LOWER_COST);
+ gfx_draw_string_centred(dpi, 985, x, y, 0, (void*)RCT2_ADDRESS_LAND_LOWER_COST);
y += 50;
// Draw paint price
@@ -393,7 +393,7 @@ static void window_land_paint()
if (price != 0 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) {
RCT2_GLOBAL(0x013CE952, sint32) = price;
- gfx_draw_string_centred(dpi, 986, x, y, 0, 0x013CE952);
+ gfx_draw_string_centred(dpi, 986, x, y, 0, (void*)0x013CE952);
}
}
diff --git a/src/window_main.c b/src/window_main.c
index 2c95d7cbc8..314fe51d94 100644
--- a/src/window_main.c
+++ b/src/window_main.c
@@ -34,14 +34,14 @@ rct_widget window_main_widgets[] = {
void window_main_open()
{
rct_window* window;
- rct_widget* main_widgets = 0x009A9414;
+ rct_widget* main_widgets = (rct_widget*)0x009A9414;
main_widgets[0].right = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16);
main_widgets[0].bottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16);
window = window_create(
0, 0,
window_main_widgets[0].right, window_main_widgets[0].bottom,
- 0x0097C0BC,
+ (uint32*)0x0097C0BC,
WC_MAIN_WINDOW,
WF_STICK_TO_BACK
);
diff --git a/src/window_new_ride.c b/src/window_new_ride.c
new file mode 100644
index 0000000000..edbb45d96e
--- /dev/null
+++ b/src/window_new_ride.c
@@ -0,0 +1,58 @@
+/*****************************************************************************
+* Copyright (c) 2014 Maciek Baron
+* 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
+#include "addresses.h"
+#include "game.h"
+#include "window.h"
+
+enum {
+ WINDOW_NEW_RIDE_TAB_TRANSPORT,
+ WINDOW_NEW_RIDE_TAB_GENTLE,
+ WINDOW_NEW_RIDE_TAB_ROLLER_COASTER,
+ WINDOW_NEW_RIDE_TAB_THRILL,
+ WINDOW_NEW_RIDE_TAB_WATER,
+ WINDOW_NEW_RIDE_TAB_SHOP,
+ WINDOW_NEW_RIDE_TAB_RESEARCH
+} WINDOW_RIDE_CONSTRUCTION_TAB;
+
+/**
+*
+* rct2: 0x006ACA58
+*/
+void window_new_ride_init_vars() {
+ // If we are in the track designer, default to the Roller Coaster tab
+ if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) {
+ RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_SELECTED_TAB, uint8) = WINDOW_NEW_RIDE_TAB_ROLLER_COASTER;
+ }
+ else {
+ RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_SELECTED_TAB, uint8) = WINDOW_NEW_RIDE_TAB_TRANSPORT;
+ }
+
+ for (short i = 0; i < 6; i++) {
+ /*
+ Reset what is highlighted in each tab.
+ Each 16bit number represents the item in its respective tab.
+ */
+ RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, uint16)[i] = 0xFFFF;
+ }
+
+ RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_INFORMATION_TYPE, uint8) = 0;
+}
\ No newline at end of file
diff --git a/src/window_news.c b/src/window_news.c
index daa4f53939..4fa036bae0 100644
--- a/src/window_news.c
+++ b/src/window_news.c
@@ -52,7 +52,7 @@ static void window_news_tooltip();
static void window_news_paint();
static void window_news_scrollpaint();
-static uint32 window_news_events[] = {
+static void* window_news_events[] = {
window_news_emptysub,
window_news_mouseup,
window_news_emptysub,
@@ -89,7 +89,6 @@ static uint32 window_news_events[] = {
*/
void window_news_open()
{
- int x, y;
rct_window* window;
// Check if window is already open
@@ -98,7 +97,7 @@ void window_news_open()
window = window_create_auto_pos(
400,
300,
- window_news_events,
+ (uint32*)window_news_events,
WC_RECENT_NEWS,
0
);
@@ -127,7 +126,6 @@ void window_news_open()
*/
static void window_news_mouseup()
{
- int i;
short widgetIndex;
rct_window *w;
@@ -169,7 +167,7 @@ static void window_news_update()
if (newsItems[i].flags & 1)
return;
if (w->var_482 == 1) {
- RCT2_CALLPROC_X(0x0066EBE6, 0, newsItems[i].type, newsItems[i].assoc, 0, 0, 0, 0);
+ news_item_open_subject(newsItems[i].type, newsItems[i].assoc);
return;
} else if (w->var_482 > 1) {
news_item_get_subject_location(newsItems[i].type, newsItems[i].assoc, &x, &y, &z);
@@ -276,7 +274,6 @@ static void window_news_tooltip()
*/
static void window_news_paint()
{
- int x, y;
rct_window *w;
rct_drawpixelinfo *dpi;
@@ -318,12 +315,12 @@ static void window_news_scrollpaint()
// Date text
RCT2_GLOBAL(0x013CE952, uint16) = STR_DATE_DAY_1 + newsItem->day - 1;
- RCT2_GLOBAL(0x013CE952 + 2, uint16) = STR_MONTH_MARCH + (newsItem->month % 8);
- gfx_draw_string_left(dpi, 2235, 0x013CE952, 2, 4, y);
+ RCT2_GLOBAL(0x013CE952 + 2, uint16) = STR_MONTH_MARCH + (newsItem->month_year % 8);
+ gfx_draw_string_left(dpi, 2235, (void*)0x013CE952, 2, 4, y);
// Item text
RCT2_GLOBAL(0x009B5F2C, uint8) = newsItem->colour;
- strcpy(0x009B5F2D, newsItem->text);
+ strcpy((char*)0x009B5F2D, newsItem->text);
gfx_draw_string_left_wrapped(dpi, 0, 2, y + 10, 325, 1926, 14);
// Subject button
@@ -352,7 +349,7 @@ static void window_news_scrollpaint()
case NEWS_ITEM_MONEY:
gfx_draw_sprite(dpi, SPR_FINANCE, x, yy);
break;
- case NEWS_ITEM_SCENERY:
+ case NEWS_ITEM_RESEARCH:
gfx_draw_sprite(dpi, newsItem->assoc < 0x10000 ? SPR_NEW_RIDE : SPR_SCENERY, x, yy);
break;
case NEWS_ITEM_PEEPS:
diff --git a/src/window_options.c b/src/window_options.c
new file mode 100644
index 0000000000..142ca1dcb7
--- /dev/null
+++ b/src/window_options.c
@@ -0,0 +1,332 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Ted John, Dennis Devriendt
+ * 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 "addresses.h"
+#include "strings.h"
+#include "widget.h"
+#include "window.h"
+#include "window_dropdown.h"
+
+static enum WINDOW_OPTIONS_WIDGET_IDX {
+ WIDX_BACKGROUND,
+ WIDX_TITLE,
+ WIDX_CLOSE,
+ WIDX_SOUND_GROUP,
+ WIDX_SOUND,
+ WIDX_SOUND_DROPDOWN,
+ WIDX_MUSIC,
+ WIDX_MUSIC_DROPDOWN,
+ WIDX_SOUND_QUALITY,
+ WIDX_SOUND_QUALITY_DROPDOWN,
+ WIDX_SOUND_SW_BUFFER_CHECKBOX,
+ WIDX_UNITS_GROUP,
+ WIDX_CURRENCY,
+ WIDX_CURRENCY_DROPDOWN,
+ WIDX_DISTANCE,
+ WIDX_DISTANCE_DROPDOWN,
+ WIDX_TEMPERATURE,
+ WIDX_TEMPERATURE_DROPDOWN,
+ WIDX_HEIGHT_LABELS,
+ WIDX_HEIGHT_LABELS_DROPDOWN,
+ WIDX_DISPLAY_GROUP,
+ WIDX_RESOLUTION,
+ WIDX_RESOLUTION_DROPDOWN,
+ WIDX_TILE_SMOOTHING_CHECKBOX,
+ WIDX_GRIDLINES_CHECKBOX,
+ WIDX_CONSTRUCTION_MARKER,
+ WIDX_CONSTRUCTION_MARKER_DROPDOWN,
+ WIDX_CONTROLS_GROUP,
+ WIDX_SCREEN_EDGE_SCROLLING,
+ WIDX_HOTKEY_DROPDOWN,
+ WIDX_GENERAL_GROUP,
+ WIDX_REAL_NAME_CHECKBOX,
+ WIDX_SAVE_PLUGIN_DATA_CHECKBOX
+};
+
+static rct_widget window_options_widgets[] = {
+ { WWT_FRAME, 0, 0, 309, 0, 371, STR_NONE, STR_NONE },
+ { WWT_CAPTION, 0, 1, 308, 1, 14, STR_OPTIONS, STR_WINDOW_TITLE_TIP },
+ { WWT_CLOSEBOX, 0, 297, 307, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
+ { WWT_GROUPBOX, 0, 3, 306, 17, 93, STR_SOUND, STR_NONE },
+ { WWT_DROPDOWN, 0, 10, 299, 31, 42, 0x361, STR_NONE }, // sound
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 32, 41, 0x36C, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 46, 57, 0x365, STR_NONE }, // music
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 47, 56, 0x36C, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 61, 72, 0x366, STR_NONE }, // sound quality
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 62, 71, 0x36C, STR_NONE },
+ { WWT_CHECKBOX, 0, 10, 299, 76, 87, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP },
+ { WWT_GROUPBOX, 0, 3, 306, 100, 176, STR_UNITS, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 114, 125, 0x367, STR_NONE }, // currency
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 115, 124, 0x36C, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 129, 140, 0x368, STR_NONE }, // distance
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 130, 139, 0x36C, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 144, 155, 0x36B, STR_NONE }, // temperature
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 145, 154, 0x36C, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 159, 170, 0x364, STR_NONE }, // height labels
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 160, 169, 0x36C, STR_NONE },
+ { WWT_GROUPBOX, 0, 3, 306, 182, 258, STR_DISPLAY, STR_NONE },
+ { WWT_DROPDOWN, 0, 155, 299, 196, 207, 0x348, STR_NONE }, // resolution
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 197, 206, 0x36C, STR_NONE },
+ { WWT_CHECKBOX, 0, 10, 299, 212, 223, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP },
+ { WWT_CHECKBOX, 0, 10, 299, 227, 238, STR_GRIDLINES, STR_GRIDLINES_TIP },
+ { WWT_DROPDOWN, 0, 155, 299, 241, 252, STR_NONE, STR_NONE }, // construction marker
+ { WWT_DROPDOWN_BUTTON, 0, 288, 298, 242, 251, 0x36C, STR_NONE },
+ { WWT_GROUPBOX, 0, 3, 306, 264, 310, STR_CONTROLS, STR_NONE },
+ { WWT_CHECKBOX, 2, 10, 299, 279, 290, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP },
+ { WWT_DROPDOWN_BUTTON, 0, 26, 185, 293, 304, STR_HOTKEY, STR_HOTKEY_TIP },
+ { WWT_GROUPBOX, 0, 3, 306, 317, 365, STR_GENERAL, STR_NONE },
+ { WWT_CHECKBOX, 2, 10, 299, 331, 342, STR_REAL_NAME, STR_REAL_NAME_TIP },
+ { WWT_CHECKBOX, 2, 10, 299, 346, 357, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP },
+ { WIDGETS_END },
+};
+
+static void window_options_emptysub() { }
+static void window_options_mouseup();
+static void window_options_mousedown();
+static void window_options_dropdown();
+static void window_options_update();
+static void window_options_paint();
+
+static void* window_options_events[] = {
+ window_options_emptysub,
+ window_options_mouseup,
+ window_options_emptysub,
+ window_options_mousedown,
+ window_options_dropdown,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_emptysub,
+ window_options_update,
+ window_options_paint,
+ window_options_emptysub
+};
+
+/**
+*
+* rct2: 0x006BAC5B
+*/
+void window_options_open()
+{
+ rct_window* w;
+
+ // Check if window is already open
+ w = window_bring_to_front_by_id(WC_OPTIONS, 0);
+ if (w != NULL)
+ return;
+
+ w = window_create_auto_pos(310, 372, (uint32*)window_options_events, WC_OPTIONS, 0);
+ w->widgets = window_options_widgets;
+ w->enabled_widgets =
+ (1 << WIDX_CLOSE) |
+ (1 << WIDX_SOUND) |
+ (1 << WIDX_SOUND_DROPDOWN) |
+ (1 << WIDX_MUSIC) |
+ (1 << WIDX_MUSIC_DROPDOWN) |
+ (1 << WIDX_SOUND_QUALITY) |
+ (1 << WIDX_SOUND_QUALITY_DROPDOWN) |
+ (1 << WIDX_CURRENCY) |
+ (1 << WIDX_CURRENCY_DROPDOWN) |
+ (1 << WIDX_DISTANCE) |
+ (1 << WIDX_DISTANCE_DROPDOWN) |
+ (1 << WIDX_RESOLUTION) |
+ (1 << WIDX_RESOLUTION_DROPDOWN) |
+ (1 << WIDX_TEMPERATURE) |
+ (1 << WIDX_TEMPERATURE_DROPDOWN) |
+ (1 << WIDX_HOTKEY_DROPDOWN) |
+ (1 << WIDX_SCREEN_EDGE_SCROLLING) |
+ (1 << WIDX_REAL_NAME_CHECKBOX) |
+ (1 << WIDX_CONSTRUCTION_MARKER) |
+ (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) |
+ (1 << WIDX_HEIGHT_LABELS) |
+ (1 << WIDX_HEIGHT_LABELS_DROPDOWN) |
+ (1 << WIDX_TILE_SMOOTHING_CHECKBOX) |
+ (1 << WIDX_GRIDLINES_CHECKBOX) |
+ (1 << WIDX_SOUND_SW_BUFFER_CHECKBOX);
+ // TODO: missing .text:006BAD22 or dword ptr [esi+0Ch], 1
+
+ window_init_scroll_widgets(w);
+ w->colours[0] = 7;
+ w->colours[1] = 7;
+ w->colours[2] = 7;
+}
+
+/**
+*
+* rct2: 0x006BAFCA
+*/
+static void window_options_mouseup()
+{
+ RCT2_CALLPROC_EBPSAFE(0x006BAFCA);
+}
+
+/**
+*
+* rct2: 0x006BB01B
+*/
+static void window_options_mousedown()
+{
+ //RCT2_CALLPROC_EBPSAFE(0x006BB01B);
+ int numItems, i;
+ sint64 device;
+ short widgetIndex;
+ rct_window *w;
+ rct_widget *widget;
+
+ __asm mov widgetIndex, dx
+ __asm mov w, esi
+
+ widget = &w->widgets[widgetIndex - 1];
+
+ switch (widgetIndex) {
+ case WIDX_SOUND_DROPDOWN:
+ numItems = RCT2_GLOBAL(RCT2_ADDRESS_NUM_DSOUND_DEVICES, uint32);
+ if (numItems == 0)
+ break;
+
+ window_dropdown_show_text_custom_width(
+ w->x + widget->left,
+ w->y + widget->top,
+ widget->bottom - widget->top + 1,
+ w->colours[1],
+ 0x80,
+ numItems,
+ widget->right - widget->left - 3
+ );
+
+ // populate the list with the sound devices
+ device = RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, sint32) + 0x10;
+
+ for (i = 0; i < numItems; i++) {
+ gDropdownItemsFormat[i] = 1142;
+ gDropdownItemsArgs[i] = 1170 | (device << 16);
+ device += 0x210;
+ }
+ gDropdownItemsChecked |= (1 << RCT2_GLOBAL(0x9AF280, uint32));
+
+ break;
+ case WIDX_HEIGHT_LABELS_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB517);
+ break;
+ case WIDX_MUSIC_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB5A8);
+ break;
+ case WIDX_SOUND_QUALITY_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB631);
+ break;
+ case WIDX_CURRENCY_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB494);
+ break;
+ case WIDX_DISTANCE_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB3E6);
+ break;
+ case WIDX_RESOLUTION_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB2AF);
+ break;
+ case WIDX_TEMPERATURE_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB21F);
+ break;
+ case WIDX_CONSTRUCTION_MARKER_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB18F);
+ break;
+ }
+}
+
+/**
+*
+* rct2: 0x006BB076
+*/
+static void window_options_dropdown()
+{
+ RCT2_CALLPROC_EBPSAFE(0x006BB076);
+ /*short widgetIndex;
+ rct_window *w;
+
+ __asm mov widgetIndex, dx
+ __asm mov w, esi
+
+ switch (widgetIndex) {
+ case WIDX_SOUND_DROPDOWN:
+ RCT2_CALLPROC_EBPSAFE(0x006BB757);
+ break;
+ }*/
+}
+
+/**
+*
+* rct2: 0x006BAD48
+*/
+static void window_options_update()
+{
+ RCT2_CALLPROC_EBPSAFE(0x006BAD48);
+}
+
+/**
+*
+* rct2: 0x006BAEB4
+*/
+static void window_options_paint()
+{
+ rct_window *w;
+ rct_drawpixelinfo *dpi;
+
+ __asm mov w, esi
+ __asm mov dpi, edi
+
+ window_draw_widgets(w, dpi);
+
+ // units
+ gfx_draw_string_left(dpi, STR_CURRENCY, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_CURRENCY].top + 1);
+ gfx_draw_string_left(dpi, STR_DISTANCE_AND_SPEED, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_DISTANCE].top + 1);
+ gfx_draw_string_left(dpi, STR_TEMPERATURE, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_TEMPERATURE].top + 1);
+ gfx_draw_string_left(dpi, STR_HEIGHT_LABELS, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_HEIGHT_LABELS].top + 1);
+
+ // display
+ gfx_draw_string_left(dpi, STR_DISPLAY_RESOLUTION, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_RESOLUTION].top + 1);
+ gfx_draw_string_left(dpi, STR_CONSTRUCTION_MARKER, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_CONSTRUCTION_MARKER].top + 1);
+
+ // sound
+ gfx_draw_string_left(dpi, STR_MUSIC, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_MUSIC].top + 1);
+ gfx_draw_string_left(dpi, STR_SOUND_QUALITY, w, 0, w->x + 10,
+ w->y + window_options_widgets[WIDX_SOUND_QUALITY].top + 1);
+}
\ No newline at end of file
diff --git a/src/window_park.c b/src/window_park.c
index 4700b6f479..c7ee646eae 100644
--- a/src/window_park.c
+++ b/src/window_park.c
@@ -264,7 +264,7 @@ static void window_park_awards_update();
static void window_park_awards_invalidate();
static void window_park_awards_paint();
-static uint32 window_park_entrance_events[] = {
+static void* window_park_entrance_events[] = {
window_park_entrance_close,
window_park_entrance_mouseup,
window_park_entrance_resize,
@@ -295,7 +295,7 @@ static uint32 window_park_entrance_events[] = {
window_park_emptysub
};
-static uint32 window_park_rating_events[] = {
+static void* window_park_rating_events[] = {
window_park_emptysub,
window_park_rating_mouseup,
window_park_rating_resize,
@@ -326,7 +326,7 @@ static uint32 window_park_rating_events[] = {
window_park_emptysub
};
-static uint32 window_park_guests_events[] = {
+static void* window_park_guests_events[] = {
window_park_emptysub,
window_park_guests_mouseup,
window_park_guests_resize,
@@ -357,7 +357,7 @@ static uint32 window_park_guests_events[] = {
window_park_emptysub
};
-static uint32 window_park_price_events[] = {
+static void* window_park_price_events[] = {
window_park_emptysub,
window_park_price_mouseup,
window_park_price_resize,
@@ -388,7 +388,7 @@ static uint32 window_park_price_events[] = {
window_park_emptysub
};
-static uint32 window_park_stats_events[] = {
+static void* window_park_stats_events[] = {
window_park_emptysub,
window_park_stats_mouseup,
window_park_stats_resize,
@@ -419,7 +419,7 @@ static uint32 window_park_stats_events[] = {
window_park_emptysub
};
-static uint32 window_park_objective_events[] = {
+static void* window_park_objective_events[] = {
window_park_emptysub,
window_park_objective_mouseup,
window_park_objective_resize,
@@ -450,7 +450,7 @@ static uint32 window_park_objective_events[] = {
window_park_emptysub
};
-static uint32 window_park_awards_events[] = {
+static void* window_park_awards_events[] = {
window_park_emptysub,
window_park_awards_mouseup,
window_park_awards_resize,
@@ -481,7 +481,7 @@ static uint32 window_park_awards_events[] = {
window_park_emptysub
};
-static uint32 *window_park_page_events[] = {
+static void* window_park_page_events[] = {
window_park_entrance_events,
window_park_rating_events,
window_park_guests_events,
@@ -589,7 +589,7 @@ rct_window *window_park_open()
{
rct_window* w;
- w = window_create_auto_pos(230, 174, window_park_entrance_events, WC_PARK_INFORMATION, 0x0400);
+ w = window_create_auto_pos(230, 174, (uint32*)window_park_entrance_events, WC_PARK_INFORMATION, 0x0400);
w->widgets = window_park_entrance_widgets;
w->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE];
w->number = 0;
@@ -599,7 +599,7 @@ rct_window *window_park_open()
w->var_490 = -1;
w->var_48C = -1;
w->var_492 = 0;
- RCT2_CALLPROC_X(0x00667F8B, 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x00667F8B, 0, 0, 0, 0, (int)w, 0, 0);
w->colours[0] = 1;
w->colours[1] = 19;
w->colours[2] = 19;
@@ -628,7 +628,7 @@ void window_park_entrance_open()
window_invalidate(window);
window->widgets = window_park_entrance_widgets;
window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE];
- window->event_handlers = window_park_entrance_events;
+ window->event_handlers = (uint32*)window_park_entrance_events;
window->pressed_widgets = 0;
window_init_scroll_widgets(window);
window_park_init_viewport(window);
@@ -646,7 +646,7 @@ static void window_park_entrance_close()
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber))
- RCT2_CALLPROC_EBPSAFE(0x006EE281);
+ tool_cancel();
}
/**
@@ -675,10 +675,10 @@ static void window_park_entrance_mouseup()
window_park_set_page(w, widgetIndex - WIDX_TAB_1);
break;
case WIDX_BUY_LAND_RIGHTS:
- RCT2_CALLPROC_X(0x006682F7, 0, 0, 0, widgetIndex, w, 0, 0);
+ RCT2_CALLPROC_X(0x006682F7, 0, 0, 0, widgetIndex, (int)w, 0, 0);
break;
case WIDX_BUY_CONSTRUCTION_RIGHTS:
- RCT2_CALLPROC_X(0x00668393, 0, 0, 0, widgetIndex, w, 0, 0);
+ RCT2_CALLPROC_X(0x00668393, 0, 0, 0, widgetIndex, (int)w, 0, 0);
break;
case WIDX_LOCATE:
window_park_scroll_to_viewport(w);
@@ -791,7 +791,7 @@ static void window_park_entrance_toolupdate()
{
int x, y;
short widgetIndex;
- rct_window *w, *mainWindow;
+ rct_window *w;
__asm mov x, eax
__asm mov y, ebx
@@ -799,7 +799,7 @@ static void window_park_entrance_toolupdate()
__asm mov w, esi
if (widgetIndex == WIDX_BUY_LAND_RIGHTS) {
- RCT2_CALLPROC_X(0x0068AAE1, x, y, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x0068AAE1, x, y, 0, 0, (int)w, 0, 0);
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE;
screen_pos_to_map_pos(&x, &y);
if (x != SPRITE_LOCATION_NULL) {
@@ -809,7 +809,7 @@ static void window_park_entrance_toolupdate()
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = x;
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = y;
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = y;
- RCT2_CALLPROC_X(0x0068AAE1, x, y, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(0x0068AAE1, x, y, 0, 0, (int)w, 0, 0);
}
}
}
@@ -821,14 +821,14 @@ static void window_park_entrance_toolupdate()
static void window_park_entrance_tooldown()
{
short x, y, widgetIndex;
- rct_window *w, *mainWindow;
+ rct_window *w;
__asm mov x, ax
__asm mov y, bx
__asm mov widgetIndex, dx
__asm mov w, esi
- RCT2_CALLPROC_X(0x006681E6, x, y, 0, widgetIndex, w, 0, 0);
+ RCT2_CALLPROC_X(0x006681E6, x, y, 0, widgetIndex, (int)w, 0, 0);
}
/**
@@ -838,14 +838,14 @@ static void window_park_entrance_tooldown()
static void window_park_entrance_tooldrag()
{
short x, y, widgetIndex;
- rct_window *w, *mainWindow;
+ rct_window *w;
__asm mov x, ax
__asm mov y, bx
__asm mov widgetIndex, dx
__asm mov w, esi
- RCT2_CALLPROC_X(0x006681FB, x, y, 0, widgetIndex, w, 0, 0);
+ RCT2_CALLPROC_X(0x006681FB, x, y, 0, widgetIndex, (int)w, 0, 0);
}
/**
@@ -855,7 +855,7 @@ static void window_park_entrance_tooldrag()
static void window_park_entrance_toolabort()
{
short widgetIndex;
- rct_window *w, *mainWindow;
+ rct_window *w;
__asm mov widgetIndex, dx
__asm mov w, esi
@@ -952,7 +952,6 @@ static void window_park_entrance_invalidate()
*/
static void window_park_entrance_paint()
{
- int i, x, y;
rct_window *w;
rct_drawpixelinfo *dpi;
rct_widget *labelWidget;
@@ -977,7 +976,7 @@ static void window_park_entrance_paint()
gfx_draw_string_centred_clipped(
dpi,
1191,
- 0x013CE952,
+ (void*)0x013CE952,
0,
w->x + (labelWidget->left + labelWidget->right) / 2,
w->y + labelWidget->top,
@@ -1025,7 +1024,7 @@ static void window_park_init_viewport(rct_window *w)
}
// Call invalidate event
- RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
w->var_482 = x;
w->var_484 = y;
@@ -1083,6 +1082,35 @@ static void window_park_scroll_to_viewport(rct_window *w)
#pragma region Rating page
+/**
+*
+* rct2: 0x00667CA4
+*/
+void window_park_rating_open()
+{
+ rct_window* window;
+
+ window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
+ if (window == NULL) {
+ window = window_park_open();
+ window->var_482 = -1;
+ window->var_484 = -1;
+ }
+
+ if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
+ if (window->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && window->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber))
+ tool_cancel();
+
+ window->viewport = NULL;
+ window->page = WINDOW_PARK_PAGE_RATING;
+ window_invalidate(window);
+ window->widgets = window_park_rating_widgets;
+ window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_RATING];
+ window->var_020 = 0;
+ window->event_handlers = (uint32*)window_park_rating_events;
+ window_init_scroll_widgets(window);
+}
+
/**
*
* rct2: 0x00668A06
@@ -1134,9 +1162,8 @@ static void window_park_rating_update()
*/
static void window_park_rating_invalidate()
{
- int i;
rct_window *w;
- rct_widget **widgets;
+ rct_widget *widgets;
__asm mov w, esi
@@ -1178,7 +1205,7 @@ static void window_park_rating_paint()
widget = &window_park_rating_widgets[WIDX_PAGE_BACKGROUND];
// Current value
- gfx_draw_string_left(dpi, STR_PARK_RATING_LABEL, RCT2_ADDRESS_CURRENT_PARK_RATING, 0, x + widget->left + 3, y + widget->top + 2);
+ gfx_draw_string_left(dpi, STR_PARK_RATING_LABEL, (void*)RCT2_ADDRESS_CURRENT_PARK_RATING, 0, x + widget->left + 3, y + widget->top + 2);
// Graph border
gfx_fill_rect_inset(dpi, x + widget->left + 4, y + widget->top + 15, x + widget->right - 4, y + widget->bottom - 4, w->colours[1], 0x30);
@@ -1197,6 +1224,35 @@ static void window_park_rating_paint()
#pragma region Guests page
+/**
+*
+* rct2: 0x00667D35
+*/
+void window_park_guests_open()
+{
+ rct_window* window;
+
+ window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
+ if (window == NULL) {
+ window = window_park_open();
+ window->var_482 = -1;
+ window->var_484 = -1;
+ }
+
+ if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
+ if (window->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && window->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber))
+ tool_cancel();
+
+ window->viewport = NULL;
+ window->page = WINDOW_PARK_PAGE_GUESTS;
+ window_invalidate(window);
+ window->widgets = window_park_guests_widgets;
+ window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_GUESTS];
+ window->var_020 = 0;
+ window->event_handlers = (uint32*)window_park_guests_events;
+ window_init_scroll_widgets(window);
+}
+
/**
*
* rct2: 0x00668DEB
@@ -1249,9 +1305,8 @@ static void window_park_guests_update()
*/
static void window_park_guests_invalidate()
{
- int i;
rct_window *w;
- rct_widget **widgets;
+ rct_widget *widgets;
__asm mov w, esi
@@ -1293,7 +1348,7 @@ static void window_park_guests_paint()
widget = &window_park_guests_widgets[WIDX_PAGE_BACKGROUND];
// Current value
- gfx_draw_string_left(dpi, STR_GUESTS_IN_PARK_LABEL, RCT2_ADDRESS_GUESTS_IN_PARK, 0, x + widget->left + 3, y + widget->top + 2);
+ gfx_draw_string_left(dpi, STR_GUESTS_IN_PARK_LABEL, (void*)RCT2_ADDRESS_GUESTS_IN_PARK, 0, x + widget->left + 3, y + widget->top + 2);
// Graph border
gfx_fill_rect_inset(dpi, x + widget->left + 4, y + widget->top + 15, x + widget->right - 4, y + widget->bottom - 4, w->colours[1], 0x30);
@@ -1400,9 +1455,8 @@ static void window_park_price_update()
*/
static void window_park_price_invalidate()
{
- int i;
rct_window *w;
- rct_widget **widgets;
+ rct_widget *widgets;
__asm mov w, esi
@@ -1453,9 +1507,9 @@ static void window_park_price_paint()
x = w->x + window_park_price_widgets[WIDX_PAGE_BACKGROUND].left + 4;
y = w->y + window_park_price_widgets[WIDX_PAGE_BACKGROUND].top + 30;
- gfx_draw_string_left(dpi, STR_TOTAL_ADMISSIONS, RCT2_ADDRESS_TOTAL_ADMISSIONS, 0, x, y);
+ gfx_draw_string_left(dpi, STR_TOTAL_ADMISSIONS, (void*)RCT2_ADDRESS_TOTAL_ADMISSIONS, 0, x, y);
y += 10;
- gfx_draw_string_left(dpi, STR_INCOME_FROM_ADMISSIONS, RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, 0, x, y);
+ gfx_draw_string_left(dpi, STR_INCOME_FROM_ADMISSIONS, (void*)RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, 0, x, y);
}
#pragma endregion
@@ -1528,9 +1582,8 @@ static void window_park_stats_update()
*/
static void window_park_stats_invalidate()
{
- int i;
rct_window *w;
- rct_widget **widgets;
+ rct_widget *widgets;
__asm mov w, esi
@@ -1558,7 +1611,6 @@ 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
@@ -1570,32 +1622,32 @@ static void window_park_stats_paint()
y = w->y + window_park_awards_widgets[WIDX_PAGE_BACKGROUND].top + 4;
// Draw park size
- parkSize = RCT2_GLOBAL(0x013580EA, sint16) * 10;
+ parkSize = RCT2_GLOBAL(RCT2_ADDRESS_PARK_SIZE, 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);
+ gfx_draw_string_left(dpi, stringIndex, (void*)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);
+ gfx_draw_string_left(dpi, STR_NUMBER_OF_RIDES_LABEL, (void*)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);
+ gfx_draw_string_left(dpi, STR_STAFF_LABEL, (void*)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);
+ gfx_draw_string_left(dpi, STR_GUESTS_IN_PARK_LABEL, (void*)RCT2_ADDRESS_GUESTS_IN_PARK, 0, x, y);
}
#pragma endregion
@@ -1619,7 +1671,7 @@ void window_park_objective_open()
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
if (window->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && window->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber))
- RCT2_CALLPROC_EBPSAFE(0x006EE281);
+ tool_cancel();
window->viewport = NULL;
window->page = WINDOW_PARK_PAGE_OBJECTIVE;
@@ -1627,7 +1679,7 @@ void window_park_objective_open()
window->widgets = window_park_objective_widgets;
window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_OBJECTIVE];
window->var_020 = 0;
- window->event_handlers = window_park_objective_events;
+ window->event_handlers = (uint32*)window_park_objective_events;
window_init_scroll_widgets(window);
window->x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2 - 115;
window->y = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2 - 87;
@@ -1640,7 +1692,6 @@ void window_park_objective_open()
*/
static void window_park_objective_mouseup()
{
- int tabIndex;
short widgetIndex;
rct_window *w;
@@ -1699,7 +1750,6 @@ static void window_park_objective_update()
*/
static void window_park_objective_invalidate()
{
- int i;
rct_window *w;
__asm mov w, esi
@@ -1707,8 +1757,8 @@ static void window_park_objective_invalidate()
window_park_set_pressed_tab(w);
// Set window title arguments
- *((short*)0x013CE952) = RCT2_GLOBAL(0x013573D4, uint16);
- *((short*)0x013CE954) = RCT2_GLOBAL(0x013573D8, uint32);
+ *((uint16*)0x013CE952) = RCT2_GLOBAL(0x013573D4, uint16);
+ *((uint32*)0x013CE954) = RCT2_GLOBAL(0x013573D8, uint32);
//
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x02)
@@ -1726,7 +1776,7 @@ static void window_park_objective_invalidate()
*/
static void window_park_objective_paint()
{
- int i, x, y;
+ int x, y;
rct_window *w;
rct_drawpixelinfo *dpi;
@@ -1773,6 +1823,35 @@ static void window_park_objective_paint()
#pragma region Awards page
+/**
+*
+* rct2: 0x00667DC6
+*/
+void window_park_awards_open()
+{
+ rct_window* window;
+
+ window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
+ if (window == NULL) {
+ window = window_park_open();
+ window->var_482 = -1;
+ window->var_484 = -1;
+ }
+
+ if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
+ if (window->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && window->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber))
+ tool_cancel();
+
+ window->viewport = NULL;
+ window->page = WINDOW_PARK_PAGE_AWARDS;
+ window_invalidate(window);
+ window->widgets = window_park_awards_widgets;
+ window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_AWARDS];
+ window->var_020 = 0;
+ window->event_handlers = (uint32*)window_park_awards_events;
+ window_init_scroll_widgets(window);
+}
+
/**
*
* rct2: 0x00669851
@@ -1824,9 +1903,8 @@ static void window_park_awards_update()
*/
static void window_park_awards_invalidate()
{
- int i;
rct_window *w;
- rct_widget **widgets;
+ rct_widget *widgets;
__asm mov w, esi
@@ -1872,7 +1950,7 @@ static void window_park_awards_paint()
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);
+ gfx_draw_string_left_wrapped(dpi, (void*)STR_AWARD_MOST_UNTIDY, x + 34, y + 6, 180, 0, 0);
y += 32;
count++;
@@ -1896,7 +1974,7 @@ static void window_park_set_page(rct_window *w, int page)
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber))
- RCT2_CALLPROC_EBPSAFE(0x006EE281);
+ tool_cancel();
// Set listen only to viewport
listen = 0;
@@ -1915,11 +1993,11 @@ static void window_park_set_page(rct_window *w, int 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);
+ RCT2_CALLPROC_X(0x00667F8B, 0, 0, 0, 0, (int)w, 0, 0);
window_invalidate(w);
- RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, w, 0, 0);
- RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
if (listen != 0 && w->viewport != NULL)
w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON;
}
@@ -1942,7 +2020,7 @@ static void window_park_align_tabs(rct_window *w)
x = w->widgets[WIDX_TAB_1].left;
tab_width = w->widgets[WIDX_TAB_1].right - w->widgets[WIDX_TAB_1].left;
for (i = 0; i < 7; i++) {
- if (w->disabled_widgets & (1 << (WIDX_TAB_1 + i)))
+ if (w->disabled_widgets & (1LL << (WIDX_TAB_1 + i)))
continue;
w->widgets[WIDX_TAB_1 + i].left = x;
w->widgets[WIDX_TAB_1 + i].right = x + tab_width;
@@ -1955,7 +2033,7 @@ 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);
+ w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
}
static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
@@ -2038,7 +2116,7 @@ static void window_park_graph_draw_months(rct_drawpixelinfo *dpi, uint8 *history
if (history[i] != 0 && history[i] != 255 && yearOver32 % 4 == 0) {
// Draw month text
RCT2_GLOBAL(0x013CE952, uint32) = ((yearOver32 / 4) + 8) % 8 + STR_MONTH_SHORT_MAR;
- gfx_draw_string_centred(dpi, 2222, x, y - 10, 0, 0x013CE952);
+ gfx_draw_string_centred(dpi, 2222, x, y - 10, 0, (void*)0x013CE952);
// Draw month mark
gfx_fill_rect(dpi, x, y, x, y + 3, 10);
@@ -2052,7 +2130,6 @@ static void window_park_graph_draw_months(rct_drawpixelinfo *dpi, uint8 *history
static void window_park_graph_draw_line_a(rct_drawpixelinfo *dpi, uint8 *history, int baseX, int baseY)
{
int i, x, y, lastX, lastY;
-
lastX = -1;
x = baseX;
for (i = 31; i >= 0; i--) {
diff --git a/src/window_ride_list.c b/src/window_ride_list.c
index 390261673b..f7e877ef3d 100644
--- a/src/window_ride_list.c
+++ b/src/window_ride_list.c
@@ -79,7 +79,7 @@ static void window_ride_list_invalidate();
static void window_ride_list_paint();
static void window_ride_list_scrollpaint();
-static uint32 window_ride_list_events[] = {
+static void* window_ride_list_events[] = {
window_ride_list_emptysub,
window_ride_list_mouseup,
window_ride_list_resize,
@@ -140,7 +140,7 @@ void window_ride_list_open()
// Check if window is already open
window = window_bring_to_front_by_id(WC_RIDE_LIST, 0);
if (window == NULL) {
- window = window_create_auto_pos(340, 240, window_ride_list_events, WC_RIDE_LIST, 0x0400);
+ window = window_create_auto_pos(340, 240, (uint32*)window_ride_list_events, WC_RIDE_LIST, 0x0400);
window->widgets = window_ride_list_widgets;
window->enabled_widgets =
(1 << WIDX_CLOSE) |
@@ -175,7 +175,6 @@ void window_ride_list_open()
*/
static void window_ride_list_mouseup()
{
- int i;
short widgetIndex;
rct_window *w;
@@ -273,10 +272,8 @@ static void window_ride_list_mousedown()
*/
static void window_ride_list_dropdown()
{
- int i;
short dropdownIndex, widgetIndex;
rct_window *w;
- rct_ride *ride;
__asm mov dropdownIndex, ax
__asm mov widgetIndex, dx
@@ -291,7 +288,7 @@ static void window_ride_list_dropdown()
if (dropdownIndex == -1)
return;
- _window_ride_list_information_type = gDropdownItemsArgs[dropdownIndex] - STR_STATUS;
+ _window_ride_list_information_type = *((uint32*)&gDropdownItemsArgs[dropdownIndex]) - STR_STATUS;
window_invalidate(w);
}
}
@@ -398,7 +395,7 @@ static void window_ride_list_tooltip()
*/
static void window_ride_list_invalidate()
{
- int i, x, y;
+ int i;
rct_window *w;
__asm mov w, esi
@@ -408,7 +405,7 @@ static void window_ride_list_invalidate()
// Set correct active tab
for (i = 0; i < 3; i++)
w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i));
- w->pressed_widgets |= 1 << (WIDX_TAB_1 + w->page);
+ w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
window_ride_list_widgets[WIDX_TITLE].image = STR_RIDES + w->page;
@@ -554,7 +551,7 @@ static void window_ride_list_scrollpaint()
format = 1192;
RCT2_GLOBAL(0x013CE952, uint16) = formatSecondary;
- gfx_draw_string_left_clipped(dpi, format, 0x013CE952, 0, 160, y - 1, 157);
+ gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 160, y - 1, 157);
y += 10;
}
}
@@ -593,7 +590,7 @@ static void window_ride_list_draw_tab_images(rct_drawpixelinfo *dpi, rct_window
static void window_ride_list_refresh_list(rct_window *w)
{
int i, j, k, countA, countB;
- sint16 swapper;
+ uint8 swapper;
rct_ride *ride, *otherRide;
countA = countB = 0;
@@ -636,7 +633,7 @@ static void window_ride_list_refresh_list(rct_window *w)
otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
RCT2_GLOBAL(0x013CE952, uint32) = otherRide->var_04C;
RCT2_CALLPROC_X(0x006C2538, otherRide->var_04A, 0, 0x013CE952, 0, 0, 0x0141EF68, 0);
- if (strcmp(0x0141ED68, 0x0141EF68) >= 0)
+ if (strcmp((char*)0x0141ED68, (char*)0x0141EF68) >= 0)
break;
swapper = w->var_076[k];
diff --git a/src/window_save_prompt.c b/src/window_save_prompt.c
index 3978cc1154..a0a06597fd 100644
--- a/src/window_save_prompt.c
+++ b/src/window_save_prompt.c
@@ -54,7 +54,7 @@ static void window_save_prompt_close();
static void window_save_prompt_mouseup();
static void window_save_prompt_paint();
-static uint32 window_save_prompt_events[] = {
+static void* window_save_prompt_events[] = {
window_save_prompt_close,
window_save_prompt_mouseup,
window_save_prompt_emptysub,
@@ -102,7 +102,7 @@ void window_save_prompt_open()
max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - 25),
260,
50,
- window_save_prompt_events,
+ (uint32*)window_save_prompt_events,
WC_SAVE_PROMPT,
0
);
diff --git a/src/settings.h b/src/window_staff.c
similarity index 66%
rename from src/settings.h
rename to src/window_staff.c
index d5e2452ac0..3652084e9d 100644
--- a/src/settings.h
+++ b/src/window_staff.c
@@ -1,5 +1,5 @@
/*****************************************************************************
-* Copyright (c) 2014 Ted John, Peter Hill
+* Copyright (c) 2014 Maciek Baron
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
@@ -18,16 +18,22 @@
* along with this program. If not, see .
*****************************************************************************/
-#ifndef _SETTINGS_H_
-#define _SETTINGS_H_
+#include
+#include "addresses.h"
+#include "game.h"
+#include "window.h"
-#include
-#include
-#include "rct2.h"
+enum {
+ WINDOW_STAFF_LIST_TAB_HANDYMEN,
+ WINDOW_STAFF_LIST_TAB_MECHANICS,
+ WINDOW_STAFF_LIST_TAB_SECURITY,
+ WINDOW_STAFF_LIST_TAB_ENTERTAINERS
+} WINDOW_STAFF_LIST_TAB;
-
-
-
-
-#endif
\ No newline at end of file
+/*
+* rct2: 0x006BD39C
+**/
+void window_staff_init_vars() {
+ RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) = WINDOW_STAFF_LIST_TAB_HANDYMEN;
+}
\ No newline at end of file
diff --git a/src/window_title_exit.c b/src/window_title_exit.c
index 1eaa52b6a8..780e4cf3b4 100644
--- a/src/window_title_exit.c
+++ b/src/window_title_exit.c
@@ -34,7 +34,7 @@ static void window_title_exit_emptysub() {}
static void window_title_exit_paint();
static void window_title_exit_mouseup();
-static uint32 window_title_exit_events[] = {
+static void* window_title_exit_events[] = {
window_title_exit_emptysub,
window_title_exit_mouseup,
window_title_exit_emptysub,
@@ -76,7 +76,7 @@ void window_title_exit_open()
window = window_create(
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 40, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 64,
40, 64,
- window_title_exit_events,
+ (uint32*)window_title_exit_events,
WC_TITLE_EXIT,
WF_STICK_TO_FRONT
);
diff --git a/src/window_title_logo.c b/src/window_title_logo.c
index a81ec804b1..f30a66cea4 100644
--- a/src/window_title_logo.c
+++ b/src/window_title_logo.c
@@ -32,7 +32,7 @@ static rct_widget window_title_logo_widgets[] = {
static void window_title_logo_emptysub() {}
static void window_title_logo_paint();
-static uint32 window_title_logo_events[] = {
+static void* window_title_logo_events[] = {
window_title_logo_emptysub,
window_title_logo_emptysub,
window_title_logo_emptysub,
@@ -79,8 +79,8 @@ void window_title_logo_open()
packs++;
// Create the window
- window = window_create(0, 0, 200, 106 + (10 * packs), window_title_logo_events, WC_TITLE_LOGO, WF_STICK_TO_FRONT);
- window->widgets = 0x009A9658; // mouse move bug in original game, keep this address and no crash happens
+ window = window_create(0, 0, 200, 106 + (10 * packs), (uint32*)window_title_logo_events, WC_TITLE_LOGO, WF_STICK_TO_FRONT);
+ window->widgets = (rct_widget*)0x009A9658; // mouse move bug in original game, keep this address and no crash happens
window_init_scroll_widgets(window);
window->flags |= 16;
window->colours[0] = 129;
diff --git a/src/window_title_menu.c b/src/window_title_menu.c
index f34c875127..e139ce8397 100644
--- a/src/window_title_menu.c
+++ b/src/window_title_menu.c
@@ -50,7 +50,7 @@ static void window_title_menu_dropdown();
static void window_title_menu_unknown17();
static void window_title_menu_paint();
-static uint32 window_title_menu_events[] = {
+static void* window_title_menu_events[] = {
window_title_menu_emptysub,
window_title_menu_mouseup,
window_title_menu_emptysub,
@@ -92,7 +92,7 @@ void window_title_menu_open()
window = window_create(
(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 328) / 2, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 142,
328, 82,
- window_title_menu_events,
+ (uint32*)window_title_menu_events,
WC_TITLE_MENU,
WF_STICK_TO_FRONT
);
diff --git a/src/window_title_scenarioselect.c b/src/window_title_scenarioselect.c
index 00556c1ee2..70bb883045 100644
--- a/src/window_title_scenarioselect.c
+++ b/src/window_title_scenarioselect.c
@@ -66,7 +66,7 @@ static void window_scenarioselect_invalidate();
static void window_scenarioselect_paint();
static void window_scenarioselect_scrollpaint();
-static uint32 window_scenarioselect_events[] = {
+static void* window_scenarioselect_events[] = {
window_scenarioselect_emptysub,
window_scenarioselect_mouseup,
window_scenarioselect_emptysub,
@@ -116,7 +116,7 @@ void window_scenarioselect_open()
max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - 167),
610,
334,
- window_scenarioselect_events,
+ (uint32*)window_scenarioselect_events,
WC_SCENARIO_SELECT,
WF_STICK_TO_FRONT | WF_10
);
@@ -128,7 +128,7 @@ void window_scenarioselect_open()
window->colours[1] = 26;
window->colours[2] = 26;
window->var_480 = -1;
- window->var_494 = NULL;
+ window->var_494 = 0;
window_scenarioselect_init_tabs();
@@ -189,10 +189,10 @@ static void window_scenarioselect_mousedown()
if (widgetIndex >= WIDX_TAB1 && widgetIndex <= WIDX_TAB5) {
w->var_4AC = widgetIndex - 4;
- w->var_494 = NULL;
+ w->var_494 = 0;
window_invalidate(w);
- RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, w, 0, 0);
- RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0);
+ RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
window_init_scroll_widgets(w);
window_invalidate(w);
}
@@ -273,8 +273,8 @@ static void window_scenarioselect_scrollmouseover()
selected = scenario;
break;
}
- if (w->var_494 != selected) {
- w->var_494 = selected;
+ if (w->var_494 != (uint32)selected) {
+ w->var_494 = (uint32)selected;
window_invalidate(w);
}
}
@@ -286,7 +286,7 @@ static void window_scenarioselect_invalidate()
__asm mov w, esi
w->pressed_widgets &= ~(0x10 | 0x20 | 0x40 | 0x80 | 0x100);
- w->pressed_widgets |= 1 << (w->var_4AC + 4);
+ w->pressed_widgets |= 1LL << (w->var_4AC + 4);
}
static void window_scenarioselect_paint()
@@ -326,13 +326,13 @@ static void window_scenarioselect_paint()
// Scenario name
x = w->x + window_scenarioselect_widgets[WIDX_SCENARIOLIST].right + 4;
y = w->y + window_scenarioselect_widgets[WIDX_TABCONTENT].top + 5;
- strcpy(0x009BC677, scenario->name);
+ strcpy((char*)0x009BC677, scenario->name);
*((short*)(0x0013CE952 + 0)) = 3165;
gfx_draw_string_centred_clipped(dpi, 1193, (void*)0x013CE952, 0, x + 85, y, 170);
y += 15;
// Scenario details
- strcpy(0x009BC677, scenario->details);
+ strcpy((char*)0x009BC677, scenario->details);
*((short*)(0x0013CE952 + 0)) = 3165;
y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 170, 1191, 0) + 5;
@@ -345,7 +345,7 @@ static void window_scenarioselect_paint()
// Scenario score
if (scenario->flags & SCENARIO_FLAGS_COMPLETED) {
- strcpy(0x009BC677, scenario->completed_by);
+ strcpy((char*)0x009BC677, scenario->completed_by);
*((short*)(0x0013CE952 + 0)) = 3165;
*((int*)(0x0013CE952 + 2)) = scenario->company_value;
y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 170, STR_COMPLETED_BY_WITH_COMPANY_VALUE, 0);
diff --git a/src/window_tooltip.c b/src/window_tooltip.c
index bc13d6fbd1..95312aea2f 100644
--- a/src/window_tooltip.c
+++ b/src/window_tooltip.c
@@ -38,7 +38,7 @@ static void window_tooltip_onclose();
static void window_tooltip_update();
static void window_tooltip_paint();
-static uint32 window_tooltip_events[] = {
+static void* window_tooltip_events[] = {
window_tooltip_onclose,
window_tooltip_emptysub,
window_tooltip_emptysub,
@@ -93,7 +93,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y
return;
widget = &widgetWindow->widgets[widgetIndex];
- RCT2_CALLPROC_X(widgetWindow->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, widgetWindow, 0, 0);
+ RCT2_CALLPROC_X(widgetWindow->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)widgetWindow, 0, 0);
if (widget->tooltip == 0xFFFF)
return;
@@ -103,7 +103,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y
int eax, ebx, ecx, edx, esi, edi, ebp;
eax = widgetIndex;
- esi = widgetWindow;
+ esi = (int)widgetWindow;
RCT2_CALLFUNC_X(widgetWindow->event_handlers[WE_TOOLTIP], &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
if ((eax & 0xFFFF) == 0xFFFF)
return;
@@ -114,7 +114,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y
RCT2_GLOBAL(0x0142006C, sint32) = -1;
- format_string(0x0141ED68, widget->tooltip, 0x013CE952);
+ format_string((char*)0x0141ED68, widget->tooltip, (void*)0x013CE952);
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224;
esi = 0x0141ED68;
@@ -136,12 +136,12 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y
window_tooltip_widgets[WIDX_BACKGROUND].right = width;
window_tooltip_widgets[WIDX_BACKGROUND].bottom = height;
- memcpy(0x0141FE44, 0x0141ED68, 512);
+ memcpy((void*)0x0141FE44, (void*)0x0141ED68, 512);
x = clamp(0, x - (width / 2), RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - width);
y = clamp(22, y + 26, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - height - 40);
- w = window_create(x, y, width, height, window_tooltip_events, WC_TOOLTIP, WF_TRANSPARENT | WF_STICK_TO_FRONT);
+ w = window_create(x, y, width, height, (uint32*)window_tooltip_events, WC_TOOLTIP, WF_TRANSPARENT | WF_STICK_TO_FRONT);
w->widgets = window_tooltip_widgets;
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_NOT_SHOWN_TICKS, uint16) = 0;
@@ -213,5 +213,5 @@ static void window_tooltip_paint()
gfx_draw_pixel(dpi, right - 1, bottom - 1, 0x0200002F);
// Text
- RCT2_CALLPROC_X(0x006C1DB7, 0, 0, w->x + ((w->width + 1) / 2) - 1, w->y + 1, 0x0141FE44, dpi, RCT2_GLOBAL(0x01420044, uint16));
+ RCT2_CALLPROC_X(0x006C1DB7, 0, 0, w->x + ((w->width + 1) / 2) - 1, w->y + 1, 0x0141FE44, (int)dpi, RCT2_GLOBAL(0x01420044, uint16));
}
\ No newline at end of file
diff --git a/src/window_water.c b/src/window_water.c
index 1e91cbf5b5..0c22ddabae 100644
--- a/src/window_water.c
+++ b/src/window_water.c
@@ -53,7 +53,7 @@ static void window_water_update();
static void window_water_invalidate();
static void window_water_paint();
-static uint32 window_water_events[] = {
+static void* window_water_events[] = {
window_water_close,
window_water_mouseup,
window_water_emptysub,
@@ -96,7 +96,7 @@ void window_water_open()
if (window_find_by_id(WC_WATER, 0) != NULL)
return;
- window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 76, 29, 76, 77, window_water_events, WC_WATER, 0);
+ window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 76, 29, 76, 77, (uint32*)window_water_events, WC_WATER, 0);
window->widgets = window_water_widgets;
window->enabled_widgets = 0x04 | 0x10 | 0x20;
window_init_scroll_widgets(window);