mirror of https://github.com/OpenRCT2/OpenRCT2.git
prepare for left viewport interaction implementation
This commit is contained in:
parent
62be863476
commit
f1cc82f258
65
src/input.c
65
src/input.c
|
@ -370,41 +370,10 @@ static void game_handle_input_mouse(int x, int y, int state)
|
|||
RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_UP], x, y, 0, (int)RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16), (int)w, 0, 0);
|
||||
}
|
||||
else{
|
||||
if ((RCT2_GLOBAL(0x9DE518, uint32)&(1 << 4)))break;
|
||||
rct_sprite* spr;
|
||||
int eax = x, ebx = y, ecx = state, esi = (int)w, edi = (int)widget, ebp = 0;
|
||||
RCT2_CALLFUNC_X(0X6ED9D0, &eax, &ebx, &ecx, (int*)&spr, &esi, &edi, &ebp);
|
||||
if ((ebx & 0xFF) == 2){
|
||||
|
||||
if (spr->unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE){
|
||||
//Open ride window
|
||||
RCT2_CALLPROC_X(0x6ACAC2, eax, ebx, ecx, (int)spr, esi, edi, ebp);
|
||||
}
|
||||
else if (spr->unknown.sprite_identifier == SPRITE_IDENTIFIER_PEEP){
|
||||
window_guest_open(&spr->peep);
|
||||
}
|
||||
else if (spr->unknown.sprite_identifier == SPRITE_IDENTIFIER_FLOATING_TEXT){
|
||||
//Unknown for now
|
||||
RCT2_CALLPROC_X(0x6E88D7, eax, ebx, ecx, (int)spr, esi, edi, ebp);
|
||||
}
|
||||
}
|
||||
else if ((ebx & 0xFF) == 3){
|
||||
rct_map_element* map_element = (rct_map_element*)spr;
|
||||
|
||||
if (!((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE)){
|
||||
eax = RCT2_ADDRESS(0x0099BA64, uint8)[16 * map_element->properties.track.type];
|
||||
if (!(eax & 0x10)){//If not station track
|
||||
//Open ride window in overview mode.
|
||||
window_ride_main_open(map_element->properties.track.ride_index);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//Open ride window in station view
|
||||
RCT2_CALLPROC_X(0x6ACCCE, map_element->properties.track.ride_index, (map_element->properties.track.sequence & 0x70) >> 4, ecx, (int)map_element, esi, edi, ebp);
|
||||
}
|
||||
else if ((ebx & 0xFF) == 8){
|
||||
window_park_entrance_open();
|
||||
}
|
||||
if ((RCT2_GLOBAL(0x9DE518, uint32) & (1 << 4)))
|
||||
break;
|
||||
|
||||
viewport_interaction_left_click(x, y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -542,19 +511,23 @@ void process_mouse_over(int x, int y)
|
|||
if (widgetId != -1) {
|
||||
switch (window->widgets[widgetId].type){
|
||||
case WWT_VIEWPORT:
|
||||
if ((RCT2_GLOBAL(0x9DE518, int) & 0x8) == 0)
|
||||
{
|
||||
edx = cursorId;
|
||||
eax = x;
|
||||
ebx = y;
|
||||
//Find out if there is a clickable item under pointer
|
||||
RCT2_CALLFUNC_X(0X6ED9D0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
|
||||
if ((ebx & 0xFF) == 2 || (ebx & 0xFF) == 8 || (ebx & 0xFF) == 3)
|
||||
{
|
||||
if ((RCT2_GLOBAL(0x9DE518, int) & 0x8) == 0) {
|
||||
if (viewport_interaction_left_over(x, y)) {
|
||||
sub_6ED990(CURSOR_HAND_POINT);
|
||||
return;
|
||||
}
|
||||
|
||||
// edx = cursorId;
|
||||
// eax = x;
|
||||
// ebx = y;
|
||||
// //Find out if there is a clickable item under pointer
|
||||
// RCT2_CALLFUNC_X(0X6ED9D0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
//
|
||||
// if ((ebx & 0xFF) == 2 || (ebx & 0xFF) == 8 || (ebx & 0xFF) == 3)
|
||||
// {
|
||||
// sub_6ED990(CURSOR_HAND_POINT);
|
||||
// return;
|
||||
// }
|
||||
break;
|
||||
}
|
||||
cursorId = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8);
|
||||
|
@ -629,7 +602,7 @@ void process_mouse_over(int x, int y)
|
|||
}
|
||||
}
|
||||
|
||||
viewport_interaction_hover(x, y);
|
||||
viewport_interaction_right_over(x, y);
|
||||
sub_6ED990(cursorId);
|
||||
}
|
||||
|
||||
|
|
|
@ -81,8 +81,11 @@ void viewport_set_visibility(uint8 mode);
|
|||
|
||||
void get_map_coordinates_from_pos(int screenX, int screenY, int flags, int *x, int *y, int *z, rct_map_element **mapElement);
|
||||
|
||||
int viewport_interaction_get_item(int x, int y, rct_map_element **outMapElement, int *outX, int *outY);
|
||||
void viewport_interaction_hover(int x, int y);
|
||||
void viewport_interaction_right_click(int x, int y);
|
||||
int viewport_interaction_get_item_left(int x, int y, rct_map_element **outMapElement, int *outX, int *outY);
|
||||
int viewport_interaction_left_over(int x, int y);
|
||||
int viewport_interaction_left_click(int x, int y);
|
||||
int viewport_interaction_get_item_right(int x, int y, rct_map_element **outMapElement, int *outX, int *outY);
|
||||
int viewport_interaction_right_over(int x, int y);
|
||||
int viewport_interaction_right_click(int x, int y);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "../world/banner.h"
|
||||
#include "../world/map.h"
|
||||
#include "../world/scenery.h"
|
||||
#include "../world/sprite.h"
|
||||
#include "viewport.h"
|
||||
|
||||
static void viewport_interaction_remove_scenery(rct_map_element *mapElement, int x, int y);
|
||||
|
@ -36,24 +37,73 @@ static void viewport_interaction_remove_park_entrance(rct_map_element *mapElemen
|
|||
static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, int x, int y);
|
||||
static void viewport_interaction_remove_large_scenery(rct_map_element *mapElement, int x, int y);
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006ED9D0
|
||||
*/
|
||||
int viewport_interaction_get_item_left(int x, int y, rct_map_element **outMapElement, int *outX, int *outY)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int viewport_interaction_left_over(int x, int y)
|
||||
{
|
||||
int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0, ebp = 0;
|
||||
RCT2_CALLFUNC_X(0x006ED9D0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
if ((ebx & 0xFF) == 2 || (ebx & 0xFF) == 8 || (ebx & 0xFF) == 3)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int viewport_interaction_left_click(int x, int y)
|
||||
{
|
||||
rct_sprite* spr;
|
||||
|
||||
int eax = x, ebx = y, ecx = 0, esi = 0, edi = 0, ebp = 0;
|
||||
RCT2_CALLFUNC_X(0x006ED9D0, &eax, &ebx, &ecx, (int*)&spr, &esi, &edi, &ebp);
|
||||
if ((ebx & 0xFF) == 2){
|
||||
|
||||
if (spr->unknown.sprite_identifier == SPRITE_IDENTIFIER_VEHICLE){
|
||||
//Open ride window
|
||||
RCT2_CALLPROC_X(0x6ACAC2, eax, ebx, ecx, (int)spr, esi, edi, ebp);
|
||||
}
|
||||
else if (spr->unknown.sprite_identifier == SPRITE_IDENTIFIER_PEEP){
|
||||
window_guest_open(&spr->peep);
|
||||
}
|
||||
else if (spr->unknown.sprite_identifier == SPRITE_IDENTIFIER_FLOATING_TEXT){
|
||||
//Unknown for now
|
||||
RCT2_CALLPROC_X(0x6E88D7, eax, ebx, ecx, (int)spr, esi, edi, ebp);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
else if ((ebx & 0xFF) == 3){
|
||||
rct_map_element* map_element = (rct_map_element*)spr;
|
||||
|
||||
if (!((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_ENTRANCE)){
|
||||
eax = RCT2_ADDRESS(0x0099BA64, uint8)[16 * map_element->properties.track.type];
|
||||
if (!(eax & 0x10)){//If not station track
|
||||
//Open ride window in overview mode.
|
||||
window_ride_main_open(map_element->properties.track.ride_index);
|
||||
return;
|
||||
}
|
||||
}
|
||||
//Open ride window in station view
|
||||
RCT2_CALLPROC_X(0x6ACCCE, map_element->properties.track.ride_index, (map_element->properties.track.sequence & 0x70) >> 4, ecx, (int)map_element, esi, edi, ebp);
|
||||
return 1;
|
||||
}
|
||||
else if ((ebx & 0xFF) == 8){
|
||||
window_park_entrance_open();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006EDE88
|
||||
*/
|
||||
int viewport_interaction_get_item(int x, int y, rct_map_element **outMapElement, int *outX, int *outY)
|
||||
int viewport_interaction_get_item_right(int x, int y, rct_map_element **outMapElement, int *outX, int *outY)
|
||||
{
|
||||
{
|
||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
||||
eax = x;
|
||||
ebx = y;
|
||||
RCT2_CALLFUNC_X(0x006EDE88, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
|
||||
*outMapElement = (rct_map_element*)edx;
|
||||
*outX = eax & 0xFFFF;
|
||||
*outY = ecx & 0xFFFF;
|
||||
return ebx & 0xFF;
|
||||
}
|
||||
|
||||
rct_s6_info *s6Info = (rct_s6_info*)0x00141F570;
|
||||
rct_map_element *mapElement;
|
||||
rct_scenery_entry *sceneryEntry;
|
||||
|
@ -134,6 +184,7 @@ int viewport_interaction_get_item(int x, int y, rct_map_element **outMapElement,
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint16) = sceneryEntry->name;
|
||||
return 9;
|
||||
}
|
||||
break;
|
||||
|
||||
case VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY:
|
||||
sceneryEntry = g_largeSceneryEntries[mapElement->properties.scenerymultiple.type & 0x3FF];
|
||||
|
@ -142,6 +193,7 @@ int viewport_interaction_get_item(int x, int y, rct_map_element **outMapElement,
|
|||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS + 2, uint16) = sceneryEntry->name;
|
||||
return 10;
|
||||
}
|
||||
break;
|
||||
|
||||
case VIEWPORT_INTERACTION_ITEM_BANNER:
|
||||
banner = &gBanners[mapElement->properties.banner.index];
|
||||
|
@ -208,22 +260,25 @@ int viewport_interaction_get_item(int x, int y, rct_map_element **outMapElement,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void viewport_interaction_hover(int x, int y)
|
||||
int viewport_interaction_right_over(int x, int y)
|
||||
{
|
||||
rct_map_element *mapElement;
|
||||
|
||||
viewport_interaction_get_item(x, y, &mapElement, &x, &y);
|
||||
return viewport_interaction_get_item_right(x, y, &mapElement, &x, &y) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006E8A62
|
||||
*/
|
||||
void viewport_interaction_right_click(int x, int y)
|
||||
int viewport_interaction_right_click(int x, int y)
|
||||
{
|
||||
rct_map_element *mapElement;
|
||||
|
||||
switch (viewport_interaction_get_item(x, y, &mapElement, &x, &y)) {
|
||||
switch (viewport_interaction_get_item_right(x, y, &mapElement, &x, &y)) {
|
||||
case 0:
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
if (mapElement->type == 0)
|
||||
RCT2_CALLPROC_X(0x006B4857, x, 0, y, (int)mapElement, 0, 0, 0);
|
||||
|
@ -253,6 +308,8 @@ void viewport_interaction_right_click(int x, int y)
|
|||
window_banner_open(mapElement->properties.banner.index);
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue