mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-04 13:42:55 +01:00
discover text input and other events
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
35
src/widget.c
35
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
|
||||
|
||||
23
src/window.c
23
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);
|
||||
}
|
||||
22
src/window.h
22
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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user