1
0
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:
IntelOrca
2014-04-17 03:19:30 +01:00
parent eba4b6da9d
commit 7bab1b34a2
8 changed files with 163 additions and 20 deletions

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;