diff --git a/src/strings.h b/src/strings.h index 40e89cb6b6..4794844093 100644 --- a/src/strings.h +++ b/src/strings.h @@ -173,6 +173,10 @@ enum { STR_GUESTS_TIP = 1693, STR_STAFF_TIP = 1694, + STR_CANT_RENAME_PARK = 1717, + STR_PARK_NAME = 1718, + STR_ENTER_PARK_NAME = 1719, + STR_NAME_PARK_TIP = 1720, STR_PARK_CLOSED = 1721, STR_PARK_OPEN = 1722, diff --git a/src/viewport.c b/src/viewport.c index d51feac9b4..77beffa45a 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -92,4 +92,13 @@ void viewport_update_pointers() void viewport_update_position(rct_window *window) { RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, window, 0, 0); +} + +/** + * + * rct2: 0x00685C02 + */ +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); } \ No newline at end of file diff --git a/src/viewport.h b/src/viewport.h index 648cef7a80..c70fafe7d1 100644 --- a/src/viewport.h +++ b/src/viewport.h @@ -45,5 +45,6 @@ enum { void viewport_init_all(); void viewport_update_pointers(); void viewport_update_position(rct_window *window); +void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, int top, int right, int bottom); #endif \ No newline at end of file diff --git a/src/widget.c b/src/widget.c index 6877938395..336e716392 100644 --- a/src/widget.c +++ b/src/widget.c @@ -28,6 +28,7 @@ static void widget_frame_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetI static void widget_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); static void widget_tab_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); static void widget_flat_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); +static void widget_text_inset(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); static void widget_caption_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); @@ -121,6 +122,7 @@ void widget_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) case WWT_15: case WWT_DROPDOWN: case WWT_VIEWPORT: + widget_text_inset(dpi, w, widgetIndex); break; case WWT_18: break; @@ -311,6 +313,39 @@ static void widget_flat_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int w widget_draw_image(dpi, w, widgetIndex); } +/** + * + * rct2: 0x006EBD1F + */ +static void widget_text_inset(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) +{ + rct_widget* widget; + int l, t, r, b, width, press; + uint8 colour; + + // Get the widget + widget = &w->widgets[widgetIndex]; + + // Resolve the absolute ltrb + l = w->x + widget->left; + t = w->y + widget->top; + r = w->x + widget->right; + b = w->y + widget->bottom; + + // Get the colour + colour = w->colours[widget->colour]; + + gfx_fill_rect_inset(dpi, l, t, r, b, colour, 0x60); + + // Text + if (widget->image == (uint32)-2 || widget->image == (uint32)-1) + return; + + if (widget_is_disabled(w, widgetIndex)) + colour |= 0x40; + gfx_draw_string_left(dpi, widget->image, 0x013CE952, colour, l, t); +} + /** * * rct2: 0x006EB2F9 diff --git a/src/window.c b/src/window.c index fa0fc7415d..bf8b866534 100644 --- a/src/window.c +++ b/src/window.c @@ -45,7 +45,7 @@ void window_dispatch_update_all() 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_EBPSAFE(0x006EE411); + RCT2_CALLPROC_EBPSAFE(0x006EE411); // handle_text_input } /** @@ -578,6 +578,15 @@ void window_rotate_camera(rct_window *w) RCT2_CALLPROC_X(0x0068881A, 0, 0, 0, 0, w, 0, 0); } +/** + * + * rct2: 0x006EE308 + */ +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); +} + /** * Draws a window that is in the specified region. * rct2: 0x006E756C @@ -749,4 +758,16 @@ void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi) widgetIndex++; } +} + +/** + * + * rct2: 0x00685BE1 + * + * @param dpi (edi) + * @param w (esi) + */ +void window_draw_viewport(rct_drawpixelinfo *dpi, rct_window *w) +{ + viewport_render(dpi, w->viewport, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height); } \ No newline at end of file diff --git a/src/window.h b/src/window.h index df062d176b..dda04a7035 100644 --- a/src/window.h +++ b/src/window.h @@ -138,36 +138,32 @@ typedef struct rct_window { typedef enum { WE_CLOSE = 0, WE_MOUSE_UP = 1, - WE_UNKNOWN_02 = 2, + WE_UNKNOWN_02 = 2, // tab switch? WE_MOUSE_DOWN = 3, WE_DROPDOWN = 4, WE_UNKNOWN_05 = 5, WE_UPDATE = 6, WE_UNKNOWN_07 = 7, WE_UNKNOWN_08 = 8, - WE_UNKNOWN_09 = 9, - WE_UNKNOWN_0A = 10, - WE_UNKNOWN_0B = 11, + WE_UNKNOWN_09 = 9, // tool update? + WE_UNKNOWN_0A = 10, // tool mouse down? + WE_UNKNOWN_0B = 11, // tool mouse down? WE_UNKNOWN_0C = 12, - WE_UNKNOWN_0D = 13, + WE_UNKNOWN_0D = 13, // abort tool? WE_UNKNOWN_0E = 14, WE_SCROLL_GETSIZE = 15, WE_SCROLL_MOUSEDOWN = 16, WE_UNKNOWN_11 = 17, WE_SCROLL_MOUSEOVER = 18, - WE_UNKNOWN_13 = 19, + WE_TEXT_INPUT = 19, WE_UNKNOWN_14 = 20, WE_UNKNOWN_15 = 21, WE_TOOLTIP = 22, - WE_UNKNOWN_17 = 23, + WE_UNKNOWN_17 = 23, // tooltip related WE_UNKNOWN_18 = 24, WE_INVALIDATE = 25, WE_PAINT = 26, WE_SCROLL_PAINT = 27, - - WE_MOUSE_ENTER, - WE_MOUSE_LEAVE, - WE_MOUSE_OVER, } WINDOW_EVENTS; typedef enum { @@ -291,8 +287,11 @@ rct_window *window_get_main(); void window_scroll_to_location(rct_window *w, int x, int y, int z); void window_rotate_camera(rct_window *w); +void window_show_textinput(rct_window *w, int widgetIndex, uint16 title, uint16 text, int value); + void window_draw(rct_window *w, int left, int top, int right, int bottom); void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi); +void window_draw_viewport(rct_drawpixelinfo *dpi, rct_window *w); // Open window functions void window_main_open(); @@ -304,6 +303,7 @@ void window_title_logo_open(); void window_scenarioselect_open(); void window_land_open(); void window_water_open(); +void window_park_entrance_open(); void window_park_objective_open(); void window_cheats_open(); diff --git a/src/window_game_top_toolbar.c b/src/window_game_top_toolbar.c index 6e87fec966..40f57946ae 100644 --- a/src/window_game_top_toolbar.c +++ b/src/window_game_top_toolbar.c @@ -220,7 +220,7 @@ static void window_game_top_toolbar_mouseup() RCT2_CALLPROC_EBPSAFE(0x006B30BC); break; case WIDX_PARK: - RCT2_CALLPROC_EBPSAFE(0x00667C48); + window_park_entrance_open(); break; case WIDX_STAFF: RCT2_CALLPROC_EBPSAFE(0x006BD3CC); diff --git a/src/window_park.c b/src/window_park.c index c12689b5ee..859276e903 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -25,6 +25,7 @@ #include "ride.h" #include "scenario.h" #include "strings.h" +#include "sprite.h" #include "sprites.h" #include "util.h" #include "viewport.h" @@ -86,7 +87,7 @@ static rct_widget window_park_entrance_widgets[] = { { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_PARK_AWARDS_TAB_TIP }, // tab 7 { WWT_VIEWPORT, 1, 3, 204, 46, 160, 0x0FFFFFFFF, STR_NONE }, // viewport - { WWT_12, 1, 3, 204, 161, 171, 0x0FFFFFFFF, STR_NONE }, // + { WWT_12, 1, 3, 204, 161, 171, 0x0FFFFFFFF, STR_NONE }, // status { WWT_FLATBTN, 1, 205, 228, 49, 72, 0x0FFFFFFFF, STR_OPEN_OR_CLOSE_PARK_TIP }, // open / close { WWT_FLATBTN, 1, 205, 228, 73, 96, SPR_BUY_LAND_RIGHTS, SPR_BUY_LAND_RIGHTS_TIP }, // buy land rights { WWT_FLATBTN, 1, 205, 228, 97, 120, SPR_BUY_CONSTRUCTION_RIGHTS, SPR_BUY_CONSTRUCTION_RIGHTS_TIP }, // buy construction rights @@ -212,6 +213,7 @@ static void window_park_emptysub() { } static void window_park_entrance_close(); static void window_park_entrance_mouseup(); static void window_park_entrance_update(); +static void window_park_entrance_textinput(); static void window_park_entrance_invalidate(); static void window_park_entrance_paint(); @@ -265,7 +267,7 @@ static uint32 window_park_entrance_events[] = { window_park_emptysub, window_park_emptysub, window_park_emptysub, - window_park_emptysub, + window_park_entrance_textinput, window_park_emptysub, window_park_emptysub, window_park_emptysub, @@ -573,8 +575,8 @@ rct_window *window_park_open() RCT2_CALLFUNC_X(0x006EA9B1, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); w = esi; } - w->widgets = 0x009A8E68; - w->enabled_widgets = 0x0003E7F4; + w->widgets = window_park_entrance_widgets; + w->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE]; w->number = 0; w->page = WINDOW_PARK_PAGE_ENTRANCE; w->var_482 = 0; @@ -592,6 +594,31 @@ rct_window *window_park_open() #pragma region Entrance page +/** + * + * rct2: 0x00667C48 + */ +void window_park_entrance_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; + } + + window->page = WINDOW_PARK_PAGE_ENTRANCE; + 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->pressed_widgets = 0; + window_init_scroll_widgets(window); + RCT2_CALLPROC_X(0x00669B55, 0, 0, 0, 0, window, 0, 0); +} + /** * * rct2: 0x0066860C @@ -639,10 +666,28 @@ static void window_park_entrance_mouseup() RCT2_CALLPROC_X(0x00668393, 0, 0, 0, 0, w, 0, 0); break; case WIDX_LOCATE: - RCT2_CALLPROC_X(0x0066842F, 0, 0, 0, 0, w, 0, 0); + if (w->viewport == NULL || *((sint32*)&w->var_482) == -1) + break; + + int x, y, z; + if (*((uint32*)&w->var_486) & 0x80000000) { + rct_sprite *sprite = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[w->var_482]); + x = sprite->unknown.x; + y = sprite->unknown.y; + z = sprite->unknown.z; + } else { + x = w->var_482; + y = w->var_484; + z = w->var_488; + } + + rct_window *mainWindow = window_get_main(); + if (mainWindow != NULL) + window_scroll_to_location(mainWindow, x, y & 0xFFF, z); break; case WIDX_RENAME: - RCT2_CALLPROC_X(0x0066857E, 0, 0, 0, 0, w, 0, 0); + RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + window_show_textinput(w, WIDX_RENAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(0x013573D4, uint32)); break; } } @@ -661,6 +706,32 @@ static void window_park_entrance_update() window_invalidate_by_id(w->classification, 1179); } +/** + * + * rct2: 0x0066848B + */ +static void window_park_entrance_textinput() +{ + uint8 result; + short widgetIndex; + rct_window *w; + char *text; + + __asm mov result, cl + __asm mov widgetIndex, dx + __asm mov w, esi + __asm mov text, edi + + if (widgetIndex == WIDX_RENAME) { + if (result) { + RCT2_GLOBAL(0x0141E9AE, uint16) = STR_CANT_RENAME_PARK; + RCT2_CALLPROC_X(0x006677F2, 1, 1, 0, *((int*)(text + 0)), '!', *((int*)(text + 8)), *((int*)(text + 4))); + RCT2_CALLPROC_X(0x006677F2, 2, 1, 0, *((int*)(text + 12)), '!', *((int*)(text + 20)), *((int*)(text + 16))); + RCT2_CALLPROC_X(0x006677F2, 0, 1, 0, *((int*)(text + 24)), '!', *((int*)(text + 32)), *((int*)(text + 28))); + } + } +} + /** * * rct2: 0x00667FDC @@ -720,7 +791,7 @@ static void window_park_entrance_paint() // Draw viewport if (w->viewport != NULL) { - RCT2_CALLPROC_X(0x00685BE1, 0, 0, 0, 0, 0, w->viewport, 0); + window_draw_viewport(dpi, w); if (w->viewport->flags & VIEWPORT_FLAG_SOUND_ON) gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2); } @@ -1371,9 +1442,11 @@ static void window_park_set_page(rct_window *w, int page) if (w->classification == RCT2_GLOBAL(0x009DE544, rct_windowclass) && w->number == RCT2_GLOBAL(0x009DE542, rct_windownumber)) RCT2_CALLPROC_EBPSAFE(0x006EE281); + // Set listen only to viewport RCT2_GLOBAL(0x009E32E0, uint8) = 0; if (page == WINDOW_PARK_PAGE_ENTRANCE && w->page == WINDOW_PARK_PAGE_ENTRANCE && w->viewport != NULL && !(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON)) RCT2_GLOBAL(0x009E32E0, uint8)++; + w->page = page; w->var_48E = 0; w->var_492 = 0;