From 2d2ff0dead183d825591273d2de2cd0a1219e162 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 13:27:54 +0100 Subject: [PATCH 1/6] Started reverse of viewport_update_position --- src/viewport.c | 29 +++++++++++++++++++++++++++++ src/window_new_ride.c | 1 + 2 files changed, 30 insertions(+) diff --git a/src/viewport.c b/src/viewport.c index 8a00f235e4..f43e11877d 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -21,6 +21,7 @@ #include "addresses.h" #include "config.h" #include "gfx.h" +#include "map.h" #include "string_ids.h" #include "sprite.h" #include "sprites.h" @@ -225,6 +226,34 @@ void viewport_update_pointers() */ void viewport_update_position(rct_window *window) { + //push w + RCT2_CALLPROC_X(window->event_handlers[WE_RESIZE], 0, 0, 0, 0, window, 0, 0); + + rct_viewport* viewport = window->viewport; + if (!viewport)return; + + if (window->viewport_target_sprite != -1){ + rct_sprite* sprite = &g_sprite_list[window->viewport_target_sprite]; + + int height = map_element_height(sprite->unknown.x, sprite->unknown.y) - 16; + int underground = sprite->unknown.z < height; + + RCT2_CALLPROC_X(0x6E7A15, sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, underground, window, viewport, 0); + + int center_x, center_y; + center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); + + RCT2_CALLPROC_X(0x6E7DE1, center_x, center_y, 0, 0, window, viewport, 0); + window_invalidate(window);//Added to force a redraw. + return; + } + + + int eax = viewport->view_width; + int ebx = viewport->view_height; + eax /= 2; + ebx /= 2; + RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0); } diff --git a/src/window_new_ride.c b/src/window_new_ride.c index 2d8eebdd10..1269f7d395 100644 --- a/src/window_new_ride.c +++ b/src/window_new_ride.c @@ -680,6 +680,7 @@ static void window_new_ride_scrollmouseover() return; item = window_new_ride_scroll_get_ride_list_item_at(w, x, y); + if (w->new_ride.highlighted_ride_id == *((sint16*)&item)) return; From 169a69cfec646ce8e9adfdba1d52a7ae16d7fb11 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 14:56:02 +0100 Subject: [PATCH 2/6] First draft of viewport_update. Not working --- src/viewport.c | 140 ++++++++++++++++++++++++++++++++++++++++++++-- src/window_peep.c | 4 +- 2 files changed, 138 insertions(+), 6 deletions(-) diff --git a/src/viewport.c b/src/viewport.c index f43e11877d..00ba78f4bb 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -227,7 +227,7 @@ void viewport_update_pointers() void viewport_update_position(rct_window *window) { //push w - RCT2_CALLPROC_X(window->event_handlers[WE_RESIZE], 0, 0, 0, 0, window, 0, 0); + RCT2_CALLPROC_X(window->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)window, 0, 0); rct_viewport* viewport = window->viewport; if (!viewport)return; @@ -238,12 +238,12 @@ void viewport_update_position(rct_window *window) int height = map_element_height(sprite->unknown.x, sprite->unknown.y) - 16; int underground = sprite->unknown.z < height; - RCT2_CALLPROC_X(0x6E7A15, sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, underground, window, viewport, 0); + RCT2_CALLPROC_X(0x6E7A15, sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, underground, (int)window, (int)viewport, 0); int center_x, center_y; center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); - RCT2_CALLPROC_X(0x6E7DE1, center_x, center_y, 0, 0, window, viewport, 0); + RCT2_CALLPROC_X(0x6E7DE1, center_x, center_y, 0, 0, (int)window, (int)viewport, 0); window_invalidate(window);//Added to force a redraw. return; } @@ -253,8 +253,140 @@ void viewport_update_position(rct_window *window) int ebx = viewport->view_height; eax /= 2; ebx /= 2; + eax += window->viewport_focus_coordinates.x; + ebx += window->viewport_focus_coordinates.y; + int edx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + int ecx = 0, ebp; + RCT2_CALLFUNC_X(0x00689174, &eax, &ebx, &ecx, &edx, (int*)&window, (int*)&viewport, &ebp); + + RCT2_CALLPROC_X(0x006E7A15, eax, ebx, 0, 0, (int)window, (int)viewport, 0); - RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0); + ebp = 0; + if (eax < 0xFF00){ + eax = 0xFF00; + ebp++; + } + if (ebx < 0xFF00){ + ebx = 0xFF00; + ebp++; + } + + if (eax > RCT2_GLOBAL(0x1358832, sint16)){ + eax = RCT2_GLOBAL(0x1358832, sint16); + ebp++; + } + if (ebx > RCT2_GLOBAL(0x1358832, sint16)){ + ebx = RCT2_GLOBAL(0x1358832, sint16); + ebp++; + } + if (ebp) { + ecx = ebx; + edx = map_element_height(ebx, eax); + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ + case 0: + ebx = eax; + eax = -eax; + eax += ecx; + ecx += ebx; + ecx /= 2; + ecx -= edx; + break; + case 1: + eax = -eax; + ebx = eax; + eax -= ecx; + ecx += ebx; + ecx /= 2; + ecx -= edx; + break; + case 2: + ebx = eax; + eax -= ecx; + ecx = -ecx; + ecx -= ebx; + ecx /= 2; + ecx -= edx; + break; + case 3: + ebx = eax; + eax += ecx; + ecx = -ecx; + ecx += ebx; + ecx /= 2; + ecx -= edx; + break; + } + ebx = ecx; + ecx = viewport->view_width; + ecx /= 2; + eax -= ecx; + ecx = viewport->view_height; + ecx /= 2; + ebx -= ecx; + + if (window->viewport_focus_coordinates.x > 0){ + if (window->viewport_focus_coordinates.x > eax){ + eax = window->viewport_focus_coordinates.x; + } + } + else{ + if (eax <= window->viewport_focus_coordinates.x){ + eax = window->viewport_focus_coordinates.x; + } + } + + if (window->viewport_focus_coordinates.y > 0){ + if (window->viewport_focus_coordinates.y > ebx){ + ebx = window->viewport_focus_coordinates.y; + } + } + else{ + if (ebx <= window->viewport_focus_coordinates.y){ + ebx = window->viewport_focus_coordinates.y; + } + } + + window->viewport_focus_coordinates.x = eax; + window->viewport_focus_coordinates.y = ebx; + } + + eax = window->viewport_focus_coordinates.x; + ebx = window->viewport_focus_coordinates.y; + if (window->flags & (1 << 3)){ + ecx = 0; + eax -= viewport->view_x; + if (eax < 0){ + eax = -eax; + ecx |= 1; + } + ebx -= viewport->view_y; + if (ebx < 0){ + ebx = -ebx; + ecx |= 2; + } + eax += 7; + ebx += 7; + eax /= 8; + ebx /= 8; + edx = eax; + edx |= ebx; + if (!edx){ + window->flags &= ~(1<<3); + } + if (ecx & 1){ + eax = -eax; + } + if (ecx & 2){ + ebx = -ebx; + } + eax += viewport->view_x; + ebx += viewport->view_y; + } + + RCT2_CALLPROC_X(0x6E7DE1, eax, ebx, ecx, edx, (int)window, (int)viewport, 0); + + // 6e7c03 + //RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0); } void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom); diff --git a/src/window_peep.c b/src/window_peep.c index f0bc914724..8c7ef1601a 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -521,10 +521,10 @@ void window_peep_viewport_init(rct_window* w){ void window_peep_overview_paint(){ rct_window *w; rct_drawpixelinfo *dpi; - rct_widget *labelWidget; + //rct_widget *labelWidget; window_paint_get_registers(w, dpi); - RCT2_CALLPROC_X(0x696887, 0, 0, 0, 0, w, dpi, 0); + RCT2_CALLPROC_X(0x696887, 0, 0, 0, 0, (int)w, (int)dpi, 0); return; window_draw_widgets(w, dpi); From 330fa2326c537290c7728e53c2660538667a31a5 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 24 Aug 2014 10:30:05 +0100 Subject: [PATCH 3/6] Fix bugs with viewport --- src/viewport.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/viewport.c b/src/viewport.c index 00ba78f4bb..adc3da2494 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -249,12 +249,12 @@ void viewport_update_position(rct_window *window) } - int eax = viewport->view_width; - int ebx = viewport->view_height; + sint16 eax = viewport->view_width; + sint16 ebx = viewport->view_height; eax /= 2; ebx /= 2; - eax += window->viewport_focus_coordinates.x; - ebx += window->viewport_focus_coordinates.y; + eax += window->saved_view_x; + ebx += window->saved_view_y; int edx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); int ecx = 0, ebp; RCT2_CALLFUNC_X(0x00689174, &eax, &ebx, &ecx, &edx, (int*)&window, (int*)&viewport, &ebp); @@ -262,12 +262,12 @@ void viewport_update_position(rct_window *window) RCT2_CALLPROC_X(0x006E7A15, eax, ebx, 0, 0, (int)window, (int)viewport, 0); ebp = 0; - if (eax < 0xFF00){ - eax = 0xFF00; + if (eax < (sint16)0xFF00){ + eax = (sint16)0xFF00; ebp++; } - if (ebx < 0xFF00){ - ebx = 0xFF00; + if (ebx < (sint16)0xFF00){ + ebx = (sint16)0xFF00; ebp++; } @@ -324,34 +324,34 @@ void viewport_update_position(rct_window *window) ecx /= 2; ebx -= ecx; - if (window->viewport_focus_coordinates.x > 0){ - if (window->viewport_focus_coordinates.x > eax){ - eax = window->viewport_focus_coordinates.x; + if (window->saved_view_x > 0){ + if (window->saved_view_x > eax){ + eax = window->saved_view_x; } } else{ - if (eax <= window->viewport_focus_coordinates.x){ - eax = window->viewport_focus_coordinates.x; + if (eax <= window->saved_view_x){ + eax = window->saved_view_x; } } - if (window->viewport_focus_coordinates.y > 0){ - if (window->viewport_focus_coordinates.y > ebx){ - ebx = window->viewport_focus_coordinates.y; + if (window->saved_view_y > 0){ + if (window->saved_view_y > ebx){ + ebx = window->saved_view_y; } } else{ - if (ebx <= window->viewport_focus_coordinates.y){ - ebx = window->viewport_focus_coordinates.y; + if (ebx <= window->saved_view_y){ + ebx = window->saved_view_y; } } - window->viewport_focus_coordinates.x = eax; - window->viewport_focus_coordinates.y = ebx; + window->saved_view_x = eax; + window->saved_view_y = ebx; } - eax = window->viewport_focus_coordinates.x; - ebx = window->viewport_focus_coordinates.y; + eax = window->saved_view_x; + ebx = window->saved_view_y; if (window->flags & (1 << 3)){ ecx = 0; eax -= viewport->view_x; From d095dce810bbe13363e03831cbff8e8cd0344777 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 24 Aug 2014 12:33:37 +0100 Subject: [PATCH 4/6] Finished viewport_update_position. --- src/addresses.h | 1 + src/editor.c | 6 +- src/map.c | 4 +- src/map.h | 2 + src/viewport.c | 223 +++++++++++++++++++++++++----------------------- src/window.h | 2 +- 6 files changed, 124 insertions(+), 114 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index efb780f9e5..bc1493a850 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -257,6 +257,7 @@ #define RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY 0x013580E7 #define RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH 0x013580E8 +#define RCT2_ADDRESS_MAP_MAXIMUM_X_Y 0x01358832 #define RCT2_ADDRESS_MAP_SIZE 0x01358834 #define RCT2_ADDRESS_PARK_SIZE 0x013580EA diff --git a/src/editor.c b/src/editor.c index ebccbb1e20..db3ead3c26 100644 --- a/src/editor.c +++ b/src/editor.c @@ -73,7 +73,7 @@ void editor_load() RCT2_CALLPROC_EBPSAFE(0x0066EF38); // window_main_editor_create mainWindow = window_get_main(); window_scroll_to_location(mainWindow, 2400, 2400, 112); - mainWindow->flags &= ~WF_3; + mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION; RCT2_CALLPROC_EBPSAFE(0x006837E3); gfx_invalidate_screen(); RCT2_GLOBAL(0x009DEA66, sint16) = 0; @@ -120,7 +120,7 @@ void trackdesigner_load() RCT2_CALLPROC_EBPSAFE(0x0066EF38); // window_main_editor_create mainWindow = window_get_main(); window_scroll_to_location(mainWindow, 2400, 2400, 112); - mainWindow->flags &= ~WF_3; + mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION; RCT2_CALLPROC_EBPSAFE(0x006837E3); gfx_invalidate_screen(); RCT2_GLOBAL(0x009DEA66, sint16) = 0; @@ -158,7 +158,7 @@ void trackmanager_load() RCT2_CALLPROC_EBPSAFE(0x0066EF38); // window_main_editor_create mainWindow = window_get_main(); window_scroll_to_location(mainWindow, 2400, 2400, 112); - mainWindow->flags &= ~WF_3; + mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION; RCT2_CALLPROC_EBPSAFE(0x006837E3); gfx_invalidate_screen(); RCT2_GLOBAL(0x009DEA66, sint16) = 0; diff --git a/src/map.c b/src/map.c index 39fcdbef7d..d965ed6fab 100644 --- a/src/map.c +++ b/src/map.c @@ -102,7 +102,7 @@ void map_init() RCT2_GLOBAL(0x013CE774, sint16) = 0; RCT2_GLOBAL(0x013CE776, sint16) = 0; RCT2_GLOBAL(0x01358830, sint16) = 4768; - RCT2_GLOBAL(0x01358832, sint16) = 5054; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16) = 5054; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, sint16) = 150; RCT2_GLOBAL(0x01358836, sint16) = 4767; RCT2_GLOBAL(0x01359208, sint16) = 7; @@ -141,7 +141,7 @@ void map_update_tile_pointers() /** * Return the absolute height of an element, given its (x,y) coordinates - * + * * rct2: 0x00662783 */ int map_element_height(int x, int y) diff --git a/src/map.h b/src/map.h index 069c0d52c9..cacd717306 100644 --- a/src/map.h +++ b/src/map.h @@ -177,6 +177,8 @@ enum { #define MAP_ELEMENT_WATER_HEIGHT_MASK 0x1F #define MAP_ELEMENT_SURFACE_TERRAIN_MASK 0xE0 +#define MAP_MINIMUM_X_Y -256 + #define MAX_MAP_ELEMENTS 196608 #define MAX_TILE_MAP_ELEMENT_POINTERS (256 * 256) diff --git a/src/viewport.c b/src/viewport.c index adc3da2494..e91bbd7da5 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -220,6 +220,60 @@ void viewport_update_pointers() *vp = NULL; } +void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ + int start_x = *x; + int start_y = *y; + int eax, ebx, ecx = 0; + switch (curr_rotation){ + case 0: + for (int i = 0; i < 6; ++i){ + int edx = start_x / 2; + eax = -start_x; + eax += start_y; + ebx = start_y + edx; + eax += ecx; + ebx += ecx; + ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + } + break; + case 1: + for (int i = 0; i < 6; ++i){ + int edx = start_x / 2; + eax = -start_x; + eax -= start_y; + ebx = start_y - edx; + eax -= ecx; + ebx += ecx; + ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + } + break; + case 2: + for (int i = 0; i < 6; ++i){ + int edx = start_x / 2; + eax -= start_y; + ebx = -start_y; + ebx -= edx; + eax -= ecx; + ebx -= ecx; + ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + } + break; + case 3: + for (int i = 0; i < 6; ++i){ + int edx = start_x / 2; + eax += start_y; + ebx = -start_y; + ebx += edx; + eax += ecx; + ebx -= ecx; + ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + } + break; + } + *x = eax; + *y = ebx; +} + /** * * rct2: 0x006E7A3A @@ -249,143 +303,96 @@ void viewport_update_position(rct_window *window) } - sint16 eax = viewport->view_width; - sint16 ebx = viewport->view_height; - eax /= 2; - ebx /= 2; - eax += window->saved_view_x; - ebx += window->saved_view_y; - int edx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + sint16 x = viewport->view_width / 2 + window->saved_view_x; + sint16 y = viewport->view_height / 2 + window->saved_view_y; + + int curr_rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); int ecx = 0, ebp; - RCT2_CALLFUNC_X(0x00689174, &eax, &ebx, &ecx, &edx, (int*)&window, (int*)&viewport, &ebp); + sub_689174(&x, &y, curr_rotation); + //RCT2_CALLFUNC_X(0x00689174, (int*)&x, (int*)&y, &ecx, &curr_rotation, (int*)&window, (int*)&viewport, &ebp); - RCT2_CALLPROC_X(0x006E7A15, eax, ebx, 0, 0, (int)window, (int)viewport, 0); + RCT2_CALLPROC_X(0x006E7A15, x, y, 0, 0, (int)window, (int)viewport, 0); - ebp = 0; - if (eax < (sint16)0xFF00){ - eax = (sint16)0xFF00; - ebp++; + //Clamp to the map minimum value + int at_map_edge = 0; + if (x < MAP_MINIMUM_X_Y){ + x = MAP_MINIMUM_X_Y; + at_map_edge = 1; } - if (ebx < (sint16)0xFF00){ - ebx = (sint16)0xFF00; - ebp++; + if (y < MAP_MINIMUM_X_Y){ + y = MAP_MINIMUM_X_Y; + at_map_edge = 1; } - if (eax > RCT2_GLOBAL(0x1358832, sint16)){ - eax = RCT2_GLOBAL(0x1358832, sint16); - ebp++; + //Clamp to the map maximum value (scenario specific) + if (x > RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16)){ + x = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16); + at_map_edge = 1; } - if (ebx > RCT2_GLOBAL(0x1358832, sint16)){ - ebx = RCT2_GLOBAL(0x1358832, sint16); - ebp++; + if (y > RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16)){ + y = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16); + at_map_edge = 1; } - if (ebp) { - ecx = ebx; - edx = map_element_height(ebx, eax); - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ - case 0: - ebx = eax; - eax = -eax; - eax += ecx; - ecx += ebx; - ecx /= 2; - ecx -= edx; - break; - case 1: - eax = -eax; - ebx = eax; - eax -= ecx; - ecx += ebx; - ecx /= 2; - ecx -= edx; - break; - case 2: - ebx = eax; - eax -= ecx; - ecx = -ecx; - ecx -= ebx; - ecx /= 2; - ecx -= edx; - break; - case 3: - ebx = eax; - eax += ecx; - ecx = -ecx; - ecx += ebx; - ecx /= 2; - ecx -= edx; - break; - } - ebx = ecx; - ecx = viewport->view_width; - ecx /= 2; - eax -= ecx; - ecx = viewport->view_height; - ecx /= 2; - ebx -= ecx; + if (at_map_edge) { + // The &0xFFFF is to prevent the sign extension messing the + // function up. + int z = map_element_height(x & 0xFFFF, y & 0xFFFF); + int _2d_x, _2d_y; + center_2d_coordinates(x, y, z, &_2d_x, &_2d_y, viewport); + if (window->saved_view_x > 0){ - if (window->saved_view_x > eax){ - eax = window->saved_view_x; - } + _2d_x = min(_2d_x, window->saved_view_x); } else{ - if (eax <= window->saved_view_x){ - eax = window->saved_view_x; - } + _2d_x = max(_2d_x, window->saved_view_x); } if (window->saved_view_y > 0){ - if (window->saved_view_y > ebx){ - ebx = window->saved_view_y; - } + _2d_y = min(_2d_y, window->saved_view_y); } else{ - if (ebx <= window->saved_view_y){ - ebx = window->saved_view_y; - } + _2d_y = max(_2d_y, window->saved_view_y); } - window->saved_view_x = eax; - window->saved_view_y = ebx; + window->saved_view_x = _2d_x; + window->saved_view_y = _2d_y; } - eax = window->saved_view_x; - ebx = window->saved_view_y; - if (window->flags & (1 << 3)){ - ecx = 0; - eax -= viewport->view_x; - if (eax < 0){ - eax = -eax; - ecx |= 1; + x = window->saved_view_x; + y = window->saved_view_y; + if (window->flags & WF_SCROLLING_TO_LOCATION){ + // Moves the viewport if focusing in on an item + uint8 flags = 0; + x -= viewport->view_x; + if (x < 0){ + x = -x; + flags |= 1; } - ebx -= viewport->view_y; - if (ebx < 0){ - ebx = -ebx; - ecx |= 2; + y -= viewport->view_y; + if (y < 0){ + y = -y; + flags |= 2; } - eax += 7; - ebx += 7; - eax /= 8; - ebx /= 8; - edx = eax; - edx |= ebx; - if (!edx){ - window->flags &= ~(1<<3); + x = (x + 7)/8; + y = (y + 7)/8; + + //If we are at the final zoom position + if (!x && !y){ + window->flags &= ~WF_SCROLLING_TO_LOCATION; } - if (ecx & 1){ - eax = -eax; + if (flags & 1){ + x = -x; } - if (ecx & 2){ - ebx = -ebx; + if (flags & 2){ + y = -y; } - eax += viewport->view_x; - ebx += viewport->view_y; + x += viewport->view_x; + y += viewport->view_y; } - RCT2_CALLPROC_X(0x6E7DE1, eax, ebx, ecx, edx, (int)window, (int)viewport, 0); + RCT2_CALLPROC_X(0x6E7DE1, x, y, 0, 0, (int)window, (int)viewport, 0); - // 6e7c03 //RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0); } diff --git a/src/window.h b/src/window.h index bab8718775..7fbab578ca 100644 --- a/src/window.h +++ b/src/window.h @@ -260,7 +260,7 @@ typedef enum { WF_STICK_TO_BACK = (1 << 0), WF_STICK_TO_FRONT = (1 << 1), WF_2 = (1 << 2), - WF_3 = (1 << 3), + WF_SCROLLING_TO_LOCATION = (1 << 3), WF_TRANSPARENT = (1 << 4), WF_5 = (1 << 5), WF_RESIZABLE = (1 << 8), From 3b2fa2ddce242f20c3a6553910bbdee235e927f0 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 24 Aug 2014 14:52:38 +0100 Subject: [PATCH 5/6] Trying to find cause of subtle bug --- src/map.c | 7 +++---- src/map.h | 12 ++++++------ src/viewport.c | 24 +++++++++++++++++------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/map.c b/src/map.c index d965ed6fab..55ad530943 100644 --- a/src/map.c +++ b/src/map.c @@ -168,7 +168,7 @@ int map_element_height(int x, int y) // Remove the extra height bit slope &= 0xF; - uint8 quad, quad_extra; // which quadrant the element is in? + sint8 quad, quad_extra; // which quadrant the element is in? // quad_extra is for extra height tiles uint8 xl, yl; // coordinates across this tile @@ -198,7 +198,7 @@ int map_element_height(int x, int y) quad = TILE_SIZE - yl - xl; break; case 8: // NW corner up - quad = xl - yl; + quad = yl - xl; break; } // If the element is in the quadrant with the slope, raise its height @@ -241,7 +241,7 @@ int map_element_height(int x, int y) break; case 14: // NE corner down quad_extra = (TILE_SIZE - xl) + (TILE_SIZE - yl); - quad = TILE_SIZE - yl - xl; + quad = TILE_SIZE - yl - xl - 1; break; } @@ -255,7 +255,6 @@ int map_element_height(int x, int y) // so we move *down* the slope if (quad < 0) { height += quad / 2; - height += 0xFF00; } } diff --git a/src/map.h b/src/map.h index cacd717306..8aa4e171fd 100644 --- a/src/map.h +++ b/src/map.h @@ -24,8 +24,8 @@ #include "rct2.h" typedef struct { - uint8 slope; - uint8 terrain; + uint8 slope; //4 + uint8 terrain; //5 uint8 grass_length; uint8 ownership; } rct_map_element_surface_properties; @@ -92,10 +92,10 @@ typedef union { * size: 0x08 */ typedef struct { - uint8 type; - uint8 flags; - uint8 base_height; - uint8 clearance_height; + uint8 type; //0 + uint8 flags; //1 + uint8 base_height; //2 + uint8 clearance_height; //3 rct_map_element_properties properties; } rct_map_element; diff --git a/src/viewport.c b/src/viewport.c index e91bbd7da5..f39df94dfe 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -18,6 +18,7 @@ * along with this program. If not, see . *****************************************************************************/ +#include #include "addresses.h" #include "config.h" #include "gfx.h" @@ -221,25 +222,32 @@ void viewport_update_pointers() } void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ + //RCT2_CALLFUNC_X(0x00689174, (int*)&x, (int*)&y, &ecx, &curr_rotation, (int*)&window, (int*)&viewport, &ebp); + int start_x = *x; int start_y = *y; - int eax, ebx, ecx = 0; + int eax = start_x, ebx, ecx = 0; switch (curr_rotation){ case 0: for (int i = 0; i < 6; ++i){ int edx = start_x / 2; - eax = -start_x; + eax = -start_x / 2; eax += start_y; ebx = start_y + edx; eax += ecx; ebx += ecx; + + int __eax = eax, __ebx = 0, __ecx = ebx, __edx = 0, __edi= 0, __esi = 0, __ebp = 0; + RCT2_CALLFUNC_X(0x00662783, &__eax, &__ebx, &__ecx, &__edx, &__esi, &__edi, &__ebp); ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + assert(ecx == __edx); } break; case 1: for (int i = 0; i < 6; ++i){ int edx = start_x / 2; - eax = -start_x; + eax = -start_x / 2; eax -= start_y; ebx = start_y - edx; eax -= ecx; @@ -250,7 +258,7 @@ void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ case 2: for (int i = 0; i < 6; ++i){ int edx = start_x / 2; - eax -= start_y; + eax = start_x / 2 - start_y; ebx = -start_y; ebx -= edx; eax -= ecx; @@ -261,7 +269,7 @@ void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ case 3: for (int i = 0; i < 6; ++i){ int edx = start_x / 2; - eax += start_y; + eax = start_x / 2 + start_y; ebx = -start_y; ebx += edx; eax += ecx; @@ -272,6 +280,10 @@ void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ } *x = eax; *y = ebx; + int _eax = start_x, _ebx = start_y, _ecx, _edx = curr_rotation, _esi, _edi, _ebp; + RCT2_CALLFUNC_X(0x00689174, &_eax, &_ebx, &_ecx, &_edx, &_esi, &_edi, &_ebp); + assert(*x == (sint16)_eax); + assert(*y == (sint16)_ebx); } /** @@ -307,9 +319,7 @@ void viewport_update_position(rct_window *window) sint16 y = viewport->view_height / 2 + window->saved_view_y; int curr_rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); - int ecx = 0, ebp; sub_689174(&x, &y, curr_rotation); - //RCT2_CALLFUNC_X(0x00689174, (int*)&x, (int*)&y, &ecx, &curr_rotation, (int*)&window, (int*)&viewport, &ebp); RCT2_CALLPROC_X(0x006E7A15, x, y, 0, 0, (int)window, (int)viewport, 0); From f94ebfc4e5231317ec93e64391a0efdcc05f81fc Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 24 Aug 2014 17:38:30 +0100 Subject: [PATCH 6/6] Tidied up 689174. Fixed remaining small map bugs --- src/map.c | 6 ++--- src/viewport.c | 65 ++++++++++++++++---------------------------------- 2 files changed, 24 insertions(+), 47 deletions(-) diff --git a/src/map.c b/src/map.c index 55ad530943..c82fd6dc48 100644 --- a/src/map.c +++ b/src/map.c @@ -210,7 +210,7 @@ int map_element_height(int x, int y) // One side up switch (slope) { case 3: // E side up - height += xl / 2; + height += xl / 2 + 1; break; case 6: // S side up height += (TILE_SIZE - yl) / 2; @@ -233,11 +233,11 @@ int map_element_height(int x, int y) break; case 11: // SW corner down quad_extra = xl + yl; - quad = xl + yl - TILE_SIZE; + quad = xl + yl - TILE_SIZE - 1; break; case 13: // SE corner down quad_extra = TILE_SIZE - xl + yl; - quad = xl - yl; + quad = yl - xl; break; case 14: // NE corner down quad_extra = (TILE_SIZE - xl) + (TILE_SIZE - yl); diff --git a/src/viewport.c b/src/viewport.c index f39df94dfe..b5de1c435e 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -224,66 +224,44 @@ void viewport_update_pointers() void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ //RCT2_CALLFUNC_X(0x00689174, (int*)&x, (int*)&y, &ecx, &curr_rotation, (int*)&window, (int*)&viewport, &ebp); - int start_x = *x; - int start_y = *y; - int eax = start_x, ebx, ecx = 0; + sint16 start_x = *x; + sint16 start_y = *y; + sint16 height = 0; switch (curr_rotation){ case 0: for (int i = 0; i < 6; ++i){ - int edx = start_x / 2; - eax = -start_x / 2; - eax += start_y; - ebx = start_y + edx; - eax += ecx; - ebx += ecx; - int __eax = eax, __ebx = 0, __ecx = ebx, __edx = 0, __edi= 0, __esi = 0, __ebp = 0; - RCT2_CALLFUNC_X(0x00662783, &__eax, &__ebx, &__ecx, &__edx, &__esi, &__edi, &__ebp); - ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); - ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); - assert(ecx == __edx); + *x = start_y - start_x / 2 + height; + *y = start_y + start_x / 2 + height; + + height = map_element_height((0xFFFF) & *x, (0xFFFF) & *y); } break; case 1: for (int i = 0; i < 6; ++i){ - int edx = start_x / 2; - eax = -start_x / 2; - eax -= start_y; - ebx = start_y - edx; - eax -= ecx; - ebx += ecx; - ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + *x = -start_y - start_x / 2 - height; + *y = start_y - start_x / 2 + height; + + height = map_element_height((0xFFFF) & *x, (0xFFFF) & *y); } break; case 2: for (int i = 0; i < 6; ++i){ - int edx = start_x / 2; - eax = start_x / 2 - start_y; - ebx = -start_y; - ebx -= edx; - eax -= ecx; - ebx -= ecx; - ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + *x = -start_y + start_x / 2 - height; + *y = -start_y - start_x / 2 - height; + + height = map_element_height((0xFFFF) & *x, (0xFFFF) & *y); } break; case 3: for (int i = 0; i < 6; ++i){ - int edx = start_x / 2; - eax = start_x / 2 + start_y; - ebx = -start_y; - ebx += edx; - eax += ecx; - ebx -= ecx; - ecx = map_element_height((0xFFFF) & eax, (0xFFFF) & ebx); + *x = start_x / 2 + start_y + height; + *y = start_x / 2 - start_y - height; + + height = map_element_height((0xFFFF) & *x, (0xFFFF) & *y); } break; } - *x = eax; - *y = ebx; - int _eax = start_x, _ebx = start_y, _ecx, _edx = curr_rotation, _esi, _edi, _ebp; - RCT2_CALLFUNC_X(0x00689174, &_eax, &_ebx, &_ecx, &_edx, &_esi, &_edi, &_ebp); - assert(*x == (sint16)_eax); - assert(*y == (sint16)_ebx); } /** @@ -292,7 +270,8 @@ void sub_689174(sint16* x, sint16* y, uint8 curr_rotation){ */ void viewport_update_position(rct_window *window) { - //push w + //RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0); + RCT2_CALLPROC_X(window->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)window, 0, 0); rct_viewport* viewport = window->viewport; @@ -402,8 +381,6 @@ void viewport_update_position(rct_window *window) } RCT2_CALLPROC_X(0x6E7DE1, x, y, 0, 0, (int)window, (int)viewport, 0); - - //RCT2_CALLPROC_X(0x006E7A3A, 0, 0, 0, 0, (int)window, 0, 0); } void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom);