diff --git a/src/game.c b/src/game.c index fee22669de..a17cafb32e 100644 --- a/src/game.c +++ b/src/game.c @@ -495,7 +495,7 @@ void game_handle_input() if (RCT2_GLOBAL(0x009DEA64, uint16) & 2) { RCT2_GLOBAL(0x009DEA64, uint16) &= ~2; - game_do_command(0, 1, 0, 0, 5, 2, 0); + game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 2, 0); } if (RCT2_GLOBAL(0x009ABDF2, uint8) != 0) { @@ -2096,11 +2096,12 @@ int game_do_command(int eax, int ebx, int ecx, int edx, int esi, int edi, int eb * @param flags (ebx) * @param command (esi) */ -int game_do_command_p(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { int cost, flags, insufficientFunds; int original_ebx, original_edx, original_esi, original_edi, original_ebp; + *esi = command; original_ebx = *ebx; original_edx = *edx; original_esi = *esi; @@ -2116,7 +2117,7 @@ int game_do_command_p(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi *ebx &= ~1; // Primary command - RCT2_CALLFUNC_X(game_do_command_table[*esi], eax, ebx, ecx, edx, esi, edi, ebp); + RCT2_CALLFUNC_X(game_do_command_table[command], eax, ebx, ecx, edx, esi, edi, ebp); cost = *ebx; if (cost != 0x80000000) { @@ -2139,7 +2140,7 @@ int game_do_command_p(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi } // Secondary command - RCT2_CALLFUNC_X(game_do_command_table[*esi], eax, ebx, ecx, edx, esi, edi, ebp); + RCT2_CALLFUNC_X(game_do_command_table[command], eax, ebx, ecx, edx, esi, edi, ebp); *edx = *ebx; if (*edx != 0x80000000 && *edx < cost) @@ -2262,6 +2263,54 @@ static void game_load_or_quit() } +/** +* +* rct2: 0x00669E55 +*/ +static void game_update_staff_colour() +{ + byte tabIndex, colour, _bl; + int spriteIndex; + rct_peep *peep; + + #ifdef _MSC_VER + __asm mov _bl, bl + #else + __asm__("mov %[_bl], bl " : [_bl] "+m" (_bl)); + #endif + + #ifdef _MSC_VER + __asm mov tabIndex, bh + #else + __asm__("mov %[tabIndex], bh " : [tabIndex] "+m" (tabIndex)); + #endif + + #ifdef _MSC_VER + __asm mov colour, dh + #else + __asm__("mov %[colour], bh " : [colour] "+m" (colour)); + #endif + + if (_bl & 1) { + RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8)[tabIndex] = colour; + + FOR_ALL_PEEPS(spriteIndex, peep) { + if (peep->type == PEEP_TYPE_STAFF && peep->staff_type == tabIndex) { + peep->tshirt_colour = colour; + peep->trousers_colour = colour; + } + } + } + + gfx_invalidate_screen(); + + #ifdef _MSC_VER + __asm mov ebx, 0 + #else + __asm__("mov ebx, 0 "); + #endif +} + /** * * rct2: 0x00674F40 @@ -2521,14 +2570,14 @@ void rct2_exit() void game_load_or_quit_no_save_prompt() { if (RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) < 1) { - game_do_command(0, 1, 0, 1, 5, 0, 0); + game_do_command(0, 1, 0, 1, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); tool_cancel(); if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) load_landscape(); else load_game(); } else if (RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) == 1) { - game_do_command(0, 1, 0, 1, 5, 0, 0); + game_do_command(0, 1, 0, 1, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 5)) { RCT2_CALLPROC_EBPSAFE(0x0040705E); RCT2_GLOBAL(0x009DE518, uint32) &= ~(1 << 5); @@ -2553,7 +2602,7 @@ static uint32 game_do_command_table[58] = { 0x006B49D9, 0x006B4EA6, 0x006B52D4, - 0x006B578B, + 0x006B578B, // 10 0x006B5559, 0x006660A8, 0x0066640B, @@ -2563,7 +2612,7 @@ static uint32 game_do_command_table[58] = { 0x006A61DE, 0x006A68AE, 0x006A67C0, - 0x00663CCD, + 0x00663CCD, // 20 0x006B53E9, 0x00698D6C, 0x0068C542, @@ -2573,7 +2622,7 @@ static uint32 game_do_command_table[58] = { 0x006E6878, 0x006C5AE9, 0x006BEFA1, - 0x006C09D1, + 0x006C09D1, // 30 0x006C0B83, 0x006C0BB5, 0x00669C6D, @@ -2583,7 +2632,7 @@ static uint32 game_do_command_table[58] = { 0x00666A63, 0x006CD8CE, 0x00669E30, - 0x00669E55, // updating the color of staff after setting a new one + (uint32)game_update_staff_colour, // 40 0x006E519A, 0x006E5597, 0x006B893C, @@ -2593,7 +2642,7 @@ static uint32 game_do_command_table[58] = { 0x006D13FE, 0x0069E73C, 0x006CDEE4, - 0x006B9E6D, + 0x006B9E6D, // 50 0x006BA058, 0x006E0F26, 0x006E56B5, diff --git a/src/game.h b/src/game.h index b0f7d86a5b..f2d47d80fd 100644 --- a/src/game.h +++ b/src/game.h @@ -21,6 +21,67 @@ #ifndef _GAME_H_ #define _GAME_H_ +enum GAME_COMMAND { + GAME_COMMAND_0, + GAME_COMMAND_1, + GAME_COMMAND_TOGGLE_PAUSE, // 2 + GAME_COMMAND_3, + GAME_COMMAND_4, + GAME_COMMAND_LOAD_OR_QUIT, // 5 + GAME_COMMAND_6, + GAME_COMMAND_7, + GAME_COMMAND_8, + GAME_COMMAND_9, + GAME_COMMAND_10, + GAME_COMMAND_11, + GAME_COMMAND_12, + GAME_COMMAND_13, + GAME_COMMAND_14, + GAME_COMMAND_15, + GAME_COMMAND_16, + GAME_COMMAND_17, + GAME_COMMAND_18, + GAME_COMMAND_19, + GAME_COMMAND_20, + GAME_COMMAND_21, + GAME_COMMAND_22, + GAME_COMMAND_23, + GAME_COMMAND_24, + GAME_COMMAND_25, + GAME_COMMAND_26, + GAME_COMMAND_27, + GAME_COMMAND_28, + GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, + GAME_COMMAND_30, + GAME_COMMAND_31, + GAME_COMMAND_32, + GAME_COMMAND_33, + GAME_COMMAND_34, + GAME_COMMAND_35, + GAME_COMMAND_36, + GAME_COMMAND_37, + GAME_COMMAND_38, + GAME_COMMAND_39, + GAME_COMMAND_UPDATE_STAFF_COLOUR, + GAME_COMMAND_41, + GAME_COMMAND_42, + GAME_COMMAND_43, + GAME_COMMAND_44, + GAME_COMMAND_45, + GAME_COMMAND_46, + GAME_COMMAND_47, + GAME_COMMAND_48, + GAME_COMMAND_49, + GAME_COMMAND_50, + GAME_COMMAND_51, + GAME_COMMAND_52, + GAME_COMMAND_53, + GAME_COMMAND_54, + GAME_COMMAND_55, + GAME_COMMAND_56, + GAME_COMMAND_57 +}; + void game_create_windows(); void game_update(); void game_logic_update(); @@ -29,7 +90,7 @@ void update_rain_animation(); void update_water_animation(); int game_do_command(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); -int game_do_command_p(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int *edi, int *esi, int *ebp); void game_increase_game_speed(); void game_reduce_game_speed(); diff --git a/src/string_ids.h b/src/string_ids.h index 475cc7a1ea..b6710fde38 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -357,8 +357,8 @@ enum { STR_ON = 1776, STR_MUSIC = 1777, - STR_STAFF_LIST_COLORBTN = 1790, - STR_UNIFORM_COLOR = 1791, + STR_UNIFORM_COLOUR_TIP = 1790, + STR_UNIFORM_COLOUR = 1791, STR_RESPONDING_TO_RIDE_BREAKDOWN_CALL = 1792, STR_HEADING_TO_RIDE_FOR_INSPECTION = 1793, STR_FIXING_RIDE = 1794, @@ -417,7 +417,7 @@ enum { STR_SHOW_SUBJECT_TIP = 1937, STR_SHOW_PATROL_AREA_TIP = 1947, - STR_STAFF_LIST_DROPDOWNBUTTON_TIP = 1948, + STR_HIRE_STAFF_TIP = 1948, STR_FINANCIAL_SUMMARY = 1949, STR_FINANCIAL_GRAPH = 1950, STR_PARK_VALUE_GRAPH = 1951, diff --git a/src/window_game_top_toolbar.c b/src/window_game_top_toolbar.c index 39c1c476f7..1dae79fa18 100644 --- a/src/window_game_top_toolbar.c +++ b/src/window_game_top_toolbar.c @@ -163,7 +163,7 @@ static void window_game_top_toolbar_mouseup() switch (widgetIndex) { case WIDX_PAUSE: - game_do_command(0, 1, 0, 0, 2, 0, 0); + game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0); break; case WIDX_FASTFORWARD: // This is an excellent place to add in debugging statements and @@ -364,7 +364,7 @@ static void window_game_top_toolbar_dropdown() if (widgetIndex == WIDX_FILE_MENU) { switch (dropdownIndex) { case 0: // load game - game_do_command(0, 1, 0, 0, 5, 0, 0); + game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); break; case 1: // save game tool_cancel(); @@ -381,7 +381,7 @@ static void window_game_top_toolbar_dropdown() RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10; break; case 7: // quit game - game_do_command(0, 1, 0, 0, 5, 1, 0); + game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0); break; } } else if (widgetIndex == WIDX_VIEW_MENU) { diff --git a/src/window_peep.c b/src/window_peep.c index b3173c7bd5..049a36142b 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -182,7 +182,7 @@ void window_staff_peep_open(rct_peep* peep) { rct_window* w = window_bring_to_front_by_id(WC_PEEP, peep->sprite_index); if (!w) { - int eax, ebx, ecx, edx, esi, edi, ebp; + int eax, ebx, ecx, edx, esi, edi; eax = peep->sprite_index; ecx = WC_PEEP; @@ -196,7 +196,7 @@ void window_staff_peep_open(rct_peep* peep) w->widgets = RCT2_GLOBAL(0x992998, rct_widget*); w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32); w->var_020 = RCT2_GLOBAL(0x9929BC, uint32); - w->event_handlers = RCT2_GLOBAL(0x9929A4, uint32); + w->event_handlers = (uint32*)RCT2_GLOBAL(0x9929A4, uint32); w->pressed_widgets = 0; RCT2_CALLPROC_X(0x006BED21, 0, 0, 0, 0, (int)w, 0, 0); window_init_scroll_widgets(w); diff --git a/src/window_staff.c b/src/window_staff.c index d6e08f5fd4..ef36397e12 100644 --- a/src/window_staff.c +++ b/src/window_staff.c @@ -54,66 +54,66 @@ static void window_staff_paint(); static void window_staff_scrollpaint(); static void* window_staff_events[] = { - window_staff_close, //(void*)0x006BD9B1, - window_staff_mouseup, //(void*)0x006BD94C, - window_staff_resize, //(void*)0x006BDD5D, - window_staff_mousedown, //(void*)0x006BD971, - window_staff_dropdown, //(void*)0x006BD9A6, + window_staff_close, + window_staff_mouseup, + window_staff_resize, + window_staff_mousedown, + window_staff_dropdown, window_staff_emptysub, - window_staff_update, // (void*)0x006BDCEA, + window_staff_update, window_staff_emptysub, window_staff_emptysub, window_staff_emptysub, (void*)0x006BD990, // window_staff_tooldown window_staff_emptysub, window_staff_emptysub, - window_staff_toolabort, // (void*)0x006BD99B, + window_staff_toolabort, window_staff_emptysub, - window_staff_scrollgetsize, // (void*)0x006BDBE6, - window_staff_scrollmousedown, // (void*)0x006BDC9A, + window_staff_scrollgetsize, + window_staff_scrollmousedown, window_staff_emptysub, - window_staff_scrollmouseover, // (void*)0x006BDC6B, + window_staff_scrollmouseover, window_staff_emptysub, window_staff_emptysub, window_staff_emptysub, - window_staff_tooltip, // (void*)0x006BDC90, + window_staff_tooltip, window_staff_emptysub, window_staff_emptysub, - window_staff_invalidate, // (void*)0x006BD477, - window_staff_paint, // (void*)0x006BD533, - window_staff_scrollpaint, // (void*)0x006BD785, + window_staff_invalidate, + window_staff_paint, + window_staff_scrollpaint, }; enum WINDOW_STAFF_LIST_WIDGET_IDX { - WIDX_STAFF_BACKGROUND, // 0,1 - WIDX_STAFF_TITLE, // 1,2 - WIDX_STAFF_CLOSE, // 2,4 - WIDX_STAFF_TAB_CONTENT_PANEL, // 3,8 - WIDX_STAFF_HANDYMEN_TAB, // 4,10 - WIDX_STAFF_MECHANICS_TAB, // 5,20 - WIDX_STAFF_SECURITY_TAB, // 6,40 - WIDX_STAFF_ENTERTAINERS_TAB, // 7,80 - WIDX_STAFF_LIST, // 8,100 - WIDX_STAFF_UNIFORM_COLOR_PICKER, // 9,200 - WIDX_STAFF_HIRE_BUTTON, // A,400 - WIDX_STAFF_SHOW_PATROL_AREA_BUTTON, // B,800 - WIDX_STAFF_MAP, // C,1000 + WIDX_STAFF_BACKGROUND, + WIDX_STAFF_TITLE, + WIDX_STAFF_CLOSE, + WIDX_STAFF_TAB_CONTENT_PANEL, + WIDX_STAFF_HANDYMEN_TAB, + WIDX_STAFF_MECHANICS_TAB, + WIDX_STAFF_SECURITY_TAB, + WIDX_STAFF_ENTERTAINERS_TAB, + WIDX_STAFF_LIST, + WIDX_STAFF_UNIFORM_COLOR_PICKER, + WIDX_STAFF_HIRE_BUTTON, + WIDX_STAFF_SHOW_PATROL_AREA_BUTTON, + WIDX_STAFF_MAP, }; static rct_widget window_staff_widgets[] = { - { WWT_FRAME, 0, 0, 319, 0, 269, 0x0FFFFFFFF, STR_NONE }, // 0,1: panel / background - { WWT_CAPTION, 0, 1, 318, 1, 14, STR_STAFF, STR_WINDOW_TITLE_TIP }, // 1,2: title bar - { WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // 2,4: close x button - { WWT_RESIZE, 1, 0, 319, 43, 269, 0x0FFFFFFFF, STR_NONE }, // 3,8: tab content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_STAFF_HANDYMEN_TAB_TIP }, // 4,10: tab 1 - { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, STR_STAFF_MECHANICS_TAB_TIP }, // 5,20: tab 2 - { WWT_TAB, 1, 65, 95, 17, 43, 0x02000144E, STR_STAFF_SECURITY_TAB_TIP }, // 6,40: tab 3 - { WWT_TAB, 1, 96, 126, 17, 43, 0x02000144E, STR_STAFF_ENTERTAINERS_TAB_TIP }, // 7,80: tab 4 - { WWT_SCROLL, 1, 3, 316, 72, 266, 3, STR_NONE }, // 8,100: staff list - { WWT_COLORBTN, 1, 130, 141, 58, 69, STR_NONE, STR_STAFF_LIST_COLORBTN }, // 9,200: uniform color picker - { WWT_DROPDOWN_BUTTON, 0, 165, 309, 17, 29, STR_NONE, STR_STAFF_LIST_DROPDOWNBUTTON_TIP }, // 10,400: hire button - { WWT_FLATBTN, 1, 267, 290, 46, 69, 5175, STR_SHOW_PATROL_AREA_TIP }, // 11,800: show staff patrol area - { WWT_FLATBTN, 1, 291, 314, 46, 69, 5192, STR_SHOW_STAFF_ON_MAP_TIP }, // 12,1000: map + { WWT_FRAME, 0, 0, 319, 0, 269, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 318, 1, 14, STR_STAFF, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close button + { WWT_RESIZE, 1, 0, 319, 43, 269, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_STAFF_HANDYMEN_TAB_TIP }, // handymen tab + { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, STR_STAFF_MECHANICS_TAB_TIP }, // mechanics tab + { WWT_TAB, 1, 65, 95, 17, 43, 0x02000144E, STR_STAFF_SECURITY_TAB_TIP }, // security guards tab + { WWT_TAB, 1, 96, 126, 17, 43, 0x02000144E, STR_STAFF_ENTERTAINERS_TAB_TIP }, // entertainers tab + { WWT_SCROLL, 1, 3, 316, 72, 266, 3, STR_NONE }, // staff list + { WWT_COLORBTN, 1, 130, 141, 58, 69, STR_NONE, STR_UNIFORM_COLOUR_TIP }, // uniform color picker + { WWT_DROPDOWN_BUTTON, 0, 165, 309, 17, 29, STR_NONE, STR_HIRE_STAFF_TIP }, // hire button + { WWT_FLATBTN, 1, 267, 290, 46, 69, 5175, STR_SHOW_PATROL_AREA_TIP }, // show staff patrol area tool + { WWT_FLATBTN, 1, 291, 314, 46, 69, 5192, STR_SHOW_STAFF_ON_MAP_TIP }, // show staff on map button { WIDGETS_END }, }; @@ -208,9 +208,8 @@ void window_staff_hire_new() { eax = 0x8000; ebx = RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) << 8 | bl; - esi = 0x1D; - int result = game_do_command_p(&eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + int result = game_do_command_p(GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); if (result == 0x80000000) { rct_window* window = window_find_by_id(WC_STAFF_LIST, 0); @@ -300,7 +299,7 @@ static void window_staff_resize() static void window_staff_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { short newSelectedTab; - int eax, ebx, ecx, edx; + int eax; switch (widgetIndex) { case WIDX_STAFF_HANDYMEN_TAB: @@ -317,11 +316,7 @@ static void window_staff_mousedown(int widgetIndex, rct_window*w, rct_widget* wi break; case WIDX_STAFF_UNIFORM_COLOR_PICKER: eax = (RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8)[RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8)] << 8) + 0x80 + w->colours[1]; - ebx = 0; - ecx = 0; - edx = widgetIndex; - - RCT2_CALLPROC_X(0x006ED43D, eax, &ebx, &ecx, &edx, (int)w, (int)widget, 0xFFFFFFFF); + RCT2_CALLPROC_X(0x006ED43D, eax, 0, 0, widgetIndex, (int)w, (int)widget, 0xFFFFFFFF); break; } @@ -354,7 +349,7 @@ static void window_staff_dropdown() (RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) << 8) + 1, 0, (dropdownIndex << 8) + 4, - 0x28, + GAME_COMMAND_UPDATE_STAFF_COLOUR, 0, 0); } @@ -587,7 +582,7 @@ void window_staff_invalidate() * rct2: 0x006BD533 */ void window_staff_paint() { - int i, x, y, format; + int i; uint8 selectedTab; rct_window *w; rct_drawpixelinfo *dpi; @@ -674,7 +669,7 @@ void window_staff_paint() { } if (selectedTab < 3) { - gfx_draw_string_left(dpi, STR_UNIFORM_COLOR, w, 0, w->x + 6, window_staff_widgets[WIDX_STAFF_UNIFORM_COLOR_PICKER].top + w->y + 1); + gfx_draw_string_left(dpi, STR_UNIFORM_COLOUR, w, 0, w->x + 6, window_staff_widgets[WIDX_STAFF_UNIFORM_COLOR_PICKER].top + w->y + 1); } int staffTypeStringId = 1859 + selectedTab; @@ -753,7 +748,7 @@ void window_staff_scrollpaint() staffOrderSprite = RCT2_ADDRESS(0x00992A08, uint32)[selectedTab]; while (staffOrders != 0) { - if (staffOrders & 1 != 0) { + if (staffOrders & 1) { gfx_draw_sprite(dpi, staffOrderSprite, staffOrderIcon_x, y - 1); } staffOrders = staffOrders >> 1; diff --git a/src/window_title_menu.c b/src/window_title_menu.c index 8e2e5aab45..9586d888e4 100644 --- a/src/window_title_menu.c +++ b/src/window_title_menu.c @@ -118,7 +118,7 @@ static void window_title_menu_mouseup() if (widgetIndex == WIDX_START_NEW_GAME) { window_scenarioselect_open(); } else if (widgetIndex == WIDX_CONTINUE_SAVED_GAME) { - game_do_command(0, 1, 0, 0, 5, 0, 0); + game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); } }