From 581114b1e52ba24df92d5289ff50ac2ad249fc67 Mon Sep 17 00:00:00 2001 From: Duncan Date: Wed, 20 Aug 2014 12:36:29 +0100 Subject: [PATCH 01/20] Added window_peep_close Not tested. Cancels any tool that was in use by the window. --- src/window_peep.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/window_peep.c b/src/window_peep.c index 13376b714c..b20acc3f9b 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -77,8 +77,10 @@ rct_widget *window_peep_page_widgets[] = { window_peep_overview_widgets }; +void window_peep_close(); + static void* window_peep_overview_events[] = { - (void*)0x696A75, + window_peep_close, (void*)0x696A06, (void*)0x696FBE, window_peep_emptysub, @@ -174,3 +176,16 @@ void window_peep_open(rct_peep* peep){ window_init_scroll_widgets(window); RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); } + +/* rct2: 0x00696A75 */ +void window_peep_close(){ + rct_window* w; + + window_get_register(w); + + if (RCT2_GLOBAL(0x9DE518,uint32) & (1<<3)){ + if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS,rct_windowclass) && + w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER,rct_windownumber)) + tool_cancel(); + } +} From 6524f277061e0278015e488c76c3c480577e9173 Mon Sep 17 00:00:00 2001 From: Duncan Date: Wed, 20 Aug 2014 12:52:27 +0100 Subject: [PATCH 02/20] Started addition of window_peep_resize Not tested. --- src/window_peep.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/window_peep.c b/src/window_peep.c index b20acc3f9b..949630c8cd 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -189,3 +189,28 @@ void window_peep_close(){ tool_cancel(); } } + +/* rct2: 0x00696FBE */ +void window_peep_resize(){ + rct_window* w; + + window_get_register(w); + + RCT2_CALLPROC_EBPSAFE(0x6987a6); + RCT2_CALLPROC_EBPSAFE(w->eventhandler[WE_INVALIDATE]); + + window_invalidate_by_id(0xA97,w->number); + + w->min_width = 192; + w->max_width = 500; + w->min_height = 159; + w->max_height = 450; + + if (w->min_width > w->width){ + w->width = w->min_width; + window_invalidate(w); + } + + //0x697002 +} + From ed753875d6e9a3b1888a9cf8701b81310223386b Mon Sep 17 00:00:00 2001 From: Duncan Date: Thu, 21 Aug 2014 12:47:52 +0100 Subject: [PATCH 03/20] Finish peep_resize not tested. --- src/window_peep.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/window_peep.c b/src/window_peep.c index 949630c8cd..61d9175cd9 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -211,6 +211,36 @@ void window_peep_resize(){ window_invalidate(w); } - //0x697002 + if (w->max_width < w->width){ + w->width = w->max_width; + window_invalidate(w); + } + + if (w->min_height > w->height){ + w->height = w->min_height; + window_invalidate(w); + } + + if (w->max_height < w->height){ + w->height = w->max_height; + window_invalidate(w); + } + + rct_viewport* view = w->viewport; + + if (view){ + if ((w->width - 30) == view->width){ + if ((w->height - 72) == view->height){ + RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); + return; + } + } + uint8 zoom_amount = 1 << view->zoom; + view->width = w->width - 30; + view->height = w->height - 72; + view->view_width = view->width / zoom_amount; + view->view_height = view->height / zoom_amount; + } + RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); } From 4db53e2bfba72a68b1d89a665aeb32dcbcf2b8b7 Mon Sep 17 00:00:00 2001 From: Duncan Date: Thu, 21 Aug 2014 13:05:46 +0100 Subject: [PATCH 04/20] Added start of window_peep_overview_mouse_down Not tested. --- src/window_peep.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/window_peep.c b/src/window_peep.c index 61d9175cd9..07c91d7eac 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -48,6 +48,13 @@ enum WINDOW_PEEP_WIDGET_IDX { WIDX_TAB_4, WIDX_TAB_5, WIDX_TAB_6, + WIDX_MARQUEE, + WIDX_VIEWPORT, + WIDX_ACTION_LBL, + WIDX_RENAME, + WIDX_PICKUP, + WIDX_LOCATE, + WIDX_TRACK }; void window_peep_emptysub(){}; @@ -78,11 +85,12 @@ rct_widget *window_peep_page_widgets[] = { }; void window_peep_close(); +void window_peep_resize(); static void* window_peep_overview_events[] = { window_peep_close, (void*)0x696A06, - (void*)0x696FBE, + window_peep_resize, window_peep_emptysub, window_peep_emptysub, window_peep_emptysub, @@ -244,3 +252,33 @@ void window_peep_resize(){ RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); } +void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* widget){ + switch(widgetIndex){ + case WIDX_CLOSE: + //6ecd4c + break; + case WIDX_PAGE_BACKGROUND: + //696a20 + break; + case WIDX_TAB1: + case WIDX_TAB2: + case WIDX_TAB3: + case WIDX_TAB4: + case WIDX_TAB5: + case WIDX_TAB6: + //696aa0 + break; + case WIDX_RENAME: + //696ba6 + break; + case WIDX_PICKUP: + //696e4d + break; + case WIDX_LOCATE: + //696ee9 + break; + case WIDX_TRACK: + g_sprite_list[w->number].peep.flags ^= PEEP_FLAGS_TRACKING; + break; + } +} From ca5e60639ef470593eb08c47aa104815f31c80d8 Mon Sep 17 00:00:00 2001 From: Duncan Date: Thu, 21 Aug 2014 16:45:01 +0100 Subject: [PATCH 05/20] Added set_page Not tested. --- src/window_peep.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/window_peep.c b/src/window_peep.c index 07c91d7eac..391691fb78 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -80,6 +80,7 @@ rct_widget window_peep_overview_widgets[] = { { WIDGETS_END }, }; +//0x981D0C rct_widget *window_peep_page_widgets[] = { window_peep_overview_widgets }; @@ -118,10 +119,12 @@ static void* window_peep_overview_events[] = { (void*)0x69707C }; +//0x981D24 void* window_peep_page_events[] = { window_peep_overview_events }; +//0x981D3C uint32 window_peep_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | @@ -266,7 +269,7 @@ void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* case WIDX_TAB4: case WIDX_TAB5: case WIDX_TAB6: - //696aa0 + window_peep_set_page(w, widgetIndex - WIDX_TAB1); break; case WIDX_RENAME: //696ba6 @@ -282,3 +285,46 @@ void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* break; } } + +void window_peep_set_page(rct_window* w, int page){ + if (RCT2_GLOBAL(0x9DE518,uint32) & (1 << 3)) + { + if(w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber) && + w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass)) + tool_cancel(); + + } + int listen = 0; + if ( page == WINDOW_PEEP_OVERVIEW && w->page==WINDOW_PEEP_OVERVIEW && w->viewport){ + if(!(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON)) + listen = 1; + } + + + w->page = page; + w->frame_no = 0; + w->no_list_items = 0; + w->selected_list_item = -1; + + rct_viewport* viewport = w->viewport; + w->viewport = 0; + if (viewport){ + viewport->width = 0; + } + + w->enabled_widgets = window_peep_page_enabled_widgets[page]; + w->var_020 = RCT2_ADDRESS(0x981D54,uint32)[page]; + w->event_handlers = window_peep_page_events[page]; + w->pressed_widgets = 0; + w->widgets = window_peep_page_widgets[page]; + RCT2_CALLPROC_X(0x6987A6, 0, 0, 0, 0, (int) w, 0, 0); + window_invalidate(w); + + RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0); + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + + window_init_scroll_widgets(w); + window_invalidate(w); + + if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; +} From ba76d6e4e56f5855bda79fd803e07ee7672f085e Mon Sep 17 00:00:00 2001 From: Duncan Date: Thu, 21 Aug 2014 16:47:13 +0100 Subject: [PATCH 06/20] added window_close mouse down --- src/window_peep.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/window_peep.c b/src/window_peep.c index 391691fb78..86997ca94a 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -87,10 +87,11 @@ rct_widget *window_peep_page_widgets[] = { void window_peep_close(); void window_peep_resize(); +void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* widget); static void* window_peep_overview_events[] = { window_peep_close, - (void*)0x696A06, + window_peep_overview_mouse_down, window_peep_resize, window_peep_emptysub, window_peep_emptysub, @@ -255,10 +256,11 @@ void window_peep_resize(){ RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); } +/* rct2: 0x00696A06 */ void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* widget){ switch(widgetIndex){ case WIDX_CLOSE: - //6ecd4c + window_close(w); break; case WIDX_PAGE_BACKGROUND: //696a20 From 52d69be031bc1058e87f4a90f0d4facf7b25b303 Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 12:20:25 +0100 Subject: [PATCH 07/20] added locate function not tested. --- src/window_peep.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/window_peep.c b/src/window_peep.c index 86997ca94a..fa767532ed 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -87,11 +87,11 @@ rct_widget *window_peep_page_widgets[] = { void window_peep_close(); void window_peep_resize(); -void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* widget); +void window_peep_overview_mouse_up(int widgetIndex, rct_window* w, rct_widget* widget); static void* window_peep_overview_events[] = { window_peep_close, - window_peep_overview_mouse_down, + window_peep_overview_mouse_up, window_peep_resize, window_peep_emptysub, window_peep_emptysub, @@ -257,14 +257,11 @@ void window_peep_resize(){ } /* rct2: 0x00696A06 */ -void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* widget){ +void window_peep_overview_mouse_up(int widgetIndex, rct_window* w, rct_widget* widget){ switch(widgetIndex){ case WIDX_CLOSE: window_close(w); break; - case WIDX_PAGE_BACKGROUND: - //696a20 - break; case WIDX_TAB1: case WIDX_TAB2: case WIDX_TAB3: @@ -280,7 +277,7 @@ void window_peep_overview_mouse_down(int widgetIndex, rct_window* w, rct_widget* //696e4d break; case WIDX_LOCATE: - //696ee9 + window_scroll_to_viewport(w); break; case WIDX_TRACK: g_sprite_list[w->number].peep.flags ^= PEEP_FLAGS_TRACKING; From 8379262ea4929daa0b7d1398df2c3befa6b99c81 Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 12:24:00 +0100 Subject: [PATCH 08/20] Added viewport focus struct. Definitely breaks build --- src/window.h | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/window.h b/src/window.h index f9d1b0db8a..26792b2e44 100644 --- a/src/window.h +++ b/src/window.h @@ -93,6 +93,33 @@ typedef struct { sint16 v_thumb_bottom; // 0x10 } rct_scroll; +// Type is viewport_target_y & 0x8000 == 0 +typedef struct sprite_focus{ + sint16 viewport_target_x; //0x482 + sint16 viewport_target_y; //0x484 + sint16 viewport_target_z; //0x486 + uint8 viewport_target_rotation;//0x488 + uint8 pad_489; +} + +// Type is viewport_target_sprite_id & 0x80000000 != 0 +typedef struct coordinate_focus{ + uint32 viewport_target_sprite_id; //0x482 + uint32 pad_486; +} + +#define VIEWPORT_FOCUS_TYPE_MASK_SPRITE 0x8000 +#define VIEWPORT_FOCUS_SPRITE_MASK 0x3FFFFFFF; + +/** + * Viewport focus structure. + * size: 0x8 + */ +union{ + sprite_focus sprite; + coordinate_focus coordinate; +} viewport_focus; + /** * Window structure * size: 0x4C0 @@ -123,10 +150,7 @@ typedef struct rct_window { sint16 pad_47C; sint16 pad_47E; sint16 var_480; - sint16 var_482; // viewport target x - sint16 var_484; // viewport target y - sint16 var_486; // viewport target z - sint16 var_488; // viewport rotation << 8 + viewport_focus focus; // 0x482 viewport focus sint16 page; // 0x48A sint16 var_48C; sint16 frame_no; // 0x48E updated every tic for motion in windows sprites @@ -326,6 +350,7 @@ void window_push_others_below(rct_window *w1); rct_window *window_get_main(); +void window_scroll_to_viewport(rct_window *w); void window_scroll_to_location(rct_window *w, int x, int y, int z); void window_rotate_camera(rct_window *w); void window_zoom_in(rct_window *w); From 967af50f4d4301dab446074722f97392dbeca984 Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 12:30:17 +0100 Subject: [PATCH 09/20] Added window_scroll_to_viewport based off previous function --- src/window.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/window.c b/src/window.c index 266397aa43..485e177c18 100644 --- a/src/window.c +++ b/src/window.c @@ -885,6 +885,35 @@ rct_window *window_get_main() return NULL; } +/** + * Based on + * rct2: 0x696ee9 & 0x66842F + * + */ +void window_scroll_to_viewport(rct_window *w) +{ + int x, y, z; + rct_window *mainWindow; + + if (w->viewport == NULL || w->focus.sprite.viewport_target_sprite_id == -1) + return; + + if (w->focus.coordinate.viewport_target_y & VIEWPORT_FOCUS_TYPE_MASK_SPRITE) { + rct_sprite *sprite = &(g_sprite_list[w->focus.sprite.viewport_target_sprite_id & VIEWPORT_FOCUS_SPRITE_MASK]); + x = sprite->unknown.x; + y = sprite->unknown.y; + z = sprite->unknown.z; + } else { + x = w->focus.coordinate.viewport_target_x; + y = w->focus.coordinate.viewport_target_y & VIEWPORT_FOCUS_Y_MASK; + z = w->focus.coordinate.viewport_target_z; + } + + mainWindow = window_get_main(); + if (mainWindow != NULL) + window_scroll_to_location(mainWindow, x, y, z); +} + /** * * rct2: 0x006E7C9C From c2557be14d14d329be9dfb561141f7649cfba6ff Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 12:34:22 +0100 Subject: [PATCH 10/20] Fixed slight mistake with order. --- src/window.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/window.h b/src/window.h index 26792b2e44..cd321d7bda 100644 --- a/src/window.h +++ b/src/window.h @@ -94,22 +94,24 @@ typedef struct { } rct_scroll; // Type is viewport_target_y & 0x8000 == 0 -typedef struct sprite_focus{ +typedef struct coordinate_focus{ sint16 viewport_target_x; //0x482 - sint16 viewport_target_y; //0x484 + sint16 viewport_target_y; //0x484 & VIEWPORT_FOCUS_Y_MASK sint16 viewport_target_z; //0x486 uint8 viewport_target_rotation;//0x488 uint8 pad_489; } // Type is viewport_target_sprite_id & 0x80000000 != 0 -typedef struct coordinate_focus{ - uint32 viewport_target_sprite_id; //0x482 +typedef struct sprite_focus{ + uint16 viewport_target_sprite_id; //0x482 + uint8 pad_484; + uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK uint32 pad_486; } -#define VIEWPORT_FOCUS_TYPE_MASK_SPRITE 0x8000 -#define VIEWPORT_FOCUS_SPRITE_MASK 0x3FFFFFFF; +#define VIEWPORT_FOCUS_TYPE_MASK 0x80 +#define VIEWPORT_FOCUS_Y_MASK 0x3FFF; /** * Viewport focus structure. From 16cddec597ad8a23c9223051457324d8e59fcf3e Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 12:37:31 +0100 Subject: [PATCH 11/20] Fixed slight mistake with order. not tested. --- src/window.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/window.c b/src/window.c index 485e177c18..ed0dce4a70 100644 --- a/src/window.c +++ b/src/window.c @@ -894,12 +894,12 @@ void window_scroll_to_viewport(rct_window *w) { int x, y, z; rct_window *mainWindow; - + // In original checked to make sure x and y were not -1 as well. if (w->viewport == NULL || w->focus.sprite.viewport_target_sprite_id == -1) return; - if (w->focus.coordinate.viewport_target_y & VIEWPORT_FOCUS_TYPE_MASK_SPRITE) { - rct_sprite *sprite = &(g_sprite_list[w->focus.sprite.viewport_target_sprite_id & VIEWPORT_FOCUS_SPRITE_MASK]); + if (w->focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK) { + rct_sprite *sprite = &(g_sprite_list[w->focus.sprite.viewport_target_sprite_id]); x = sprite->unknown.x; y = sprite->unknown.y; z = sprite->unknown.z; From 7500fccc7923badcbd6d76a454a928d4204d15e3 Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 12:39:14 +0100 Subject: [PATCH 12/20] Now uses new viewport_scroll function --- src/window_park.c | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/src/window_park.c b/src/window_park.c index 51f1a3e127..8b72613e64 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -574,7 +574,6 @@ static uint32 window_park_page_enabled_widgets[] = { #pragma endregion static void window_park_init_viewport(rct_window *w); -static void window_park_scroll_to_viewport(rct_window *w); static void window_park_set_page(rct_window *w, int page); static void window_park_anchor_border_widgets(rct_window *w); static void window_park_align_tabs(rct_window *w); @@ -680,7 +679,7 @@ static void window_park_entrance_mouseup() RCT2_CALLPROC_X(0x00668393, 0, 0, 0, widgetIndex, (int)w, 0, 0); break; case WIDX_LOCATE: - window_park_scroll_to_viewport(w); + window_scroll_to_viewport(w); break; case WIDX_RENAME: RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32); @@ -1054,30 +1053,6 @@ static void window_park_init_viewport(rct_window *w) window_invalidate(w); } -static void window_park_scroll_to_viewport(rct_window *w) -{ - int x, y, z; - rct_window *mainWindow; - - if (w->viewport == NULL || *((sint32*)&w->var_482) == -1) - return; - - if (*((uint32*)&w->var_486) & 0x80000000) { - rct_sprite *sprite = &(g_sprite_list[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_486; - } - - mainWindow = window_get_main(); - if (mainWindow != NULL) - window_scroll_to_location(mainWindow, x, y, z); -} - #pragma endregion #pragma region Rating page From f700e560cad3c7985a37fa0d9d13a69e0fb5d811 Mon Sep 17 00:00:00 2001 From: Duncan Date: Fri, 22 Aug 2014 15:39:02 +0100 Subject: [PATCH 13/20] Added missing enabled widgets 1 widx is missing --- src/window_peep.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/window_peep.c b/src/window_peep.c index fa767532ed..4e1630bb1d 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -127,6 +127,51 @@ void* window_peep_page_events[] = { //0x981D3C uint32 window_peep_page_enabled_widgets[] = { + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_RENAME)| + (1 << WIDX_PICKUP)| + (1 << WIDX_LOCATE)| + (1 << WIDX_TRACK), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6) | + (1 << WIDX_?), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_TAB_3) | + (1 << WIDX_TAB_4) | + (1 << WIDX_TAB_5) | + (1 << WIDX_TAB_6), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | @@ -179,7 +224,7 @@ void window_peep_open(rct_peep* peep){ window_invalidate(window); window->widgets = RCT2_GLOBAL(0x981D0C, rct_widget*); - window->enabled_widgets = RCT2_GLOBAL(0x981D3C,uint32); + window->enabled_widgets = window_peep_page_enabled_widgets[WINDOW_PEEP_OVERVIEW]; window->var_020 = RCT2_GLOBAL(0x981D54,uint32); window->event_handlers = RCT2_GLOBAL(0x981D24,uint32*); window->pressed_widgets = 0; From 0c3844787bebc676ff8cbaac0ce1e792b5c0511a Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 22 Aug 2014 18:54:28 +0100 Subject: [PATCH 14/20] Fix compile issues. Add new structs --- src/window.c | 13 ++++++------ src/window.h | 43 ++++++++++++++++++++++++++++++++------- src/window_new_campaign.c | 28 ++++++++++++------------- src/window_new_ride.c | 37 +++++++++++++++++---------------- src/window_news.c | 15 +++++++------- src/window_park.c | 35 +++++++++++++++---------------- src/window_peep.c | 31 +++++++++++++++------------- src/window_staff_peep.c | 2 +- 8 files changed, 121 insertions(+), 83 deletions(-) diff --git a/src/window.c b/src/window.c index ed0dce4a70..7286f78051 100644 --- a/src/window.c +++ b/src/window.c @@ -27,6 +27,7 @@ #include "widget.h" #include "window.h" #include "viewport.h" +#include "sprite.h" #define RCT2_FIRST_WINDOW (RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) #define RCT2_LAST_WINDOW (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) - 1) @@ -395,10 +396,10 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han w->pressed_widgets = 0; w->var_020 = 0; w->var_480 = 0; - w->var_482 = 0; - w->var_484 = 0; - w->var_486 = 0; - w->var_488 = 0; + w->focus.coordinate.viewport_target_x = 0; + w->focus.coordinate.viewport_target_y = 0; + w->focus.coordinate.viewport_target_z = 0; + w->focus.coordinate.viewport_target_rotation = 0; w->page = 0; w->var_48C = 0; w->frame_no = 0; @@ -895,10 +896,10 @@ void window_scroll_to_viewport(rct_window *w) int x, y, z; rct_window *mainWindow; // In original checked to make sure x and y were not -1 as well. - if (w->viewport == NULL || w->focus.sprite.viewport_target_sprite_id == -1) + if (w->viewport == NULL || w->focus.coordinate.viewport_target_y == -1) return; - if (w->focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK) { + if (w->focus.sprite.type & VIEWPORT_FOCUS_TYPE_SPRITE) { rct_sprite *sprite = &(g_sprite_list[w->focus.sprite.viewport_target_sprite_id]); x = sprite->unknown.x; y = sprite->unknown.y; diff --git a/src/window.h b/src/window.h index cd321d7bda..a16650603a 100644 --- a/src/window.h +++ b/src/window.h @@ -94,34 +94,57 @@ typedef struct { } rct_scroll; // Type is viewport_target_y & 0x8000 == 0 -typedef struct coordinate_focus{ +typedef struct{ sint16 viewport_target_x; //0x482 sint16 viewport_target_y; //0x484 & VIEWPORT_FOCUS_Y_MASK sint16 viewport_target_z; //0x486 uint8 viewport_target_rotation;//0x488 uint8 pad_489; -} +} coordinate_focus; // Type is viewport_target_sprite_id & 0x80000000 != 0 -typedef struct sprite_focus{ +typedef struct{ uint16 viewport_target_sprite_id; //0x482 uint8 pad_484; uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK uint32 pad_486; -} +} sprite_focus; -#define VIEWPORT_FOCUS_TYPE_MASK 0x80 +#define VIEWPORT_FOCUS_TYPE_MASK 0xC0 +enum{ + VIEWPORT_FOCUS_TYPE_COORDINATE = (1<<6), + VIEWPORT_FOCUS_TYPE_SPRITE = (1<<7) +}; #define VIEWPORT_FOCUS_Y_MASK 0x3FFF; /** * Viewport focus structure. * size: 0x8 */ -union{ +typedef union{ sprite_focus sprite; coordinate_focus coordinate; } viewport_focus; +typedef struct{ + uint16 no_weeks; //0x482 + uint16 ride_id; //0x484 + uint32 pad_486; +} campaign_variables; + +typedef struct{ + uint16 selected_ride_id; //0x482 + uint16 pad_484; + uint16 pad_486; + uint16 selected_ride_countdown; //488 +} new_ride_variables; + +typedef struct{ + uint16 var_482; + uint16 var_484; + uint16 var_486; + uint16 var_488; +} news_variables; /** * Window structure * size: 0x4C0 @@ -152,7 +175,13 @@ typedef struct rct_window { sint16 pad_47C; sint16 pad_47E; sint16 var_480; - viewport_focus focus; // 0x482 viewport focus + union{ + viewport_focus focus; + campaign_variables campaign; + new_ride_variables new_ride; + news_variables news; + }; + //viewport_focus focus; // 0x482 viewport focus sint16 page; // 0x48A sint16 var_48C; sint16 frame_no; // 0x48E updated every tic for motion in windows sprites diff --git a/src/window_new_campaign.c b/src/window_new_campaign.c index 3bd66c88da..fa45270c98 100644 --- a/src/window_new_campaign.c +++ b/src/window_new_campaign.c @@ -165,10 +165,10 @@ void window_new_campaign_open(int campaignType) w->var_480 = campaignType; // Number of weeks - w->var_482 = 2; + w->campaign.no_weeks = 2; // Currently selected ride - w->var_484 = SELECTED_RIDE_UNDEFINED; + w->campaign.ride_id = SELECTED_RIDE_UNDEFINED; // Get all applicable rides numApplicableRides = 0; @@ -234,7 +234,7 @@ static void window_new_campaign_mouseup() break; case WIDX_START_BUTTON: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_START_MARKETING_CAMPAIGN; - game_do_command(0, (w->var_482 << 8) | 1, 0, (w->var_484 << 8) | w->var_480, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0); + game_do_command(0, (w->campaign.no_weeks<< 8) | 1, 0, (w->campaign.ride_id << 8) | w->var_480, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0); window_close(w); break; } @@ -305,11 +305,11 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi } break; case WIDX_WEEKS_INCREASE_BUTTON: - w->var_482 = min(w->var_482 + 1, 6); + w->campaign.no_weeks = min(w->campaign.no_weeks + 1, 6); window_invalidate(w); break; case WIDX_WEEKS_DECREASE_BUTTON: - w->var_482 = max(w->var_482 - 1, 2); + w->campaign.no_weeks = max(w->campaign.no_weeks - 1, 2); window_invalidate(w); break; } @@ -333,9 +333,9 @@ static void window_new_campaign_dropdown() rct_string_id itemStringId = (uint16)gDropdownItemsArgs[dropdownIndex] - 2016; if (itemStringId >= 32) itemStringId -= 96; - w->var_484 = itemStringId; + w->campaign.ride_id = itemStringId; } else { - w->var_484 = window_new_campaign_rides[dropdownIndex]; + w->campaign.ride_id = window_new_campaign_rides[dropdownIndex]; } window_invalidate(w); @@ -362,8 +362,8 @@ static void window_new_campaign_invalidate() window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_DROPDOWN; window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON; window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_RIDE; - if (w->var_484 != SELECTED_RIDE_UNDEFINED) { - rct_ride *ride = GET_RIDE(w->var_484); + if (w->campaign.ride_id != SELECTED_RIDE_UNDEFINED) { + rct_ride *ride = GET_RIDE(w->campaign.ride_id); window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = ride->var_04A; RCT2_GLOBAL(0x013CE952, uint32) = ride->var_04C; } @@ -373,8 +373,8 @@ static void window_new_campaign_invalidate() window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_DROPDOWN; window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON; window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_ITEM; - if (w->var_484 != SELECTED_RIDE_UNDEFINED) { - rct_string_id itemStringId = w->var_484 + 2016; + if (w->campaign.ride_id != SELECTED_RIDE_UNDEFINED) { + rct_string_id itemStringId = w->campaign.ride_id + 2016; if (itemStringId >= 2048) itemStringId += 96; window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = itemStringId; @@ -383,11 +383,11 @@ static void window_new_campaign_invalidate() } // Set current number of weeks spinner - window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = (STR_MARKETING_1_WEEK - 1) + w->var_482; + window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = (STR_MARKETING_1_WEEK - 1) + w->campaign.no_weeks; // Enable / disable start button based on ride dropdown w->disabled_widgets &= ~(1 << WIDX_START_BUTTON); - if (window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type == WWT_DROPDOWN && w->var_484 == SELECTED_RIDE_UNDEFINED) + if (window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type == WWT_DROPDOWN && w->campaign.ride_id == SELECTED_RIDE_UNDEFINED) w->disabled_widgets |= 1 << WIDX_START_BUTTON; } @@ -414,6 +414,6 @@ static void window_new_campaign_paint() y += 13; // Total price - money32 totalPrice = AdvertisingCampaignPricePerWeek[w->var_480] * w->var_482; + money32 totalPrice = AdvertisingCampaignPricePerWeek[w->var_480] * w->campaign.no_weeks; gfx_draw_string_left(dpi, STR_MARKETING_TOTAL_COST, &totalPrice, 0, x, y); } \ No newline at end of file diff --git a/src/window_new_ride.c b/src/window_new_ride.c index 8f0969b269..737bbea1c6 100644 --- a/src/window_new_ride.c +++ b/src/window_new_ride.c @@ -432,15 +432,15 @@ void window_new_ride_open() w->colours[1] = 26; w->colours[2] = 26; w->var_480 = -1; - w->var_482 = -1; + w->new_ride.selected_ride_id = -1; _lastTrackDesignCountRideType.type = 255; _lastTrackDesignCountRideType.entry_index = 255; window_new_ride_populate_list(); - w->var_482 = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab]; - if (w->var_482 == -1) - w->var_482 = RCT2_GLOBAL(0x00F43523, sint16); + w->new_ride.selected_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab]; + if (w->new_ride.selected_ride_id == -1) + w->new_ride.selected_ride_id = RCT2_GLOBAL(0x00F43523, sint16); w->width = 1; window_new_ride_refresh_widget_sizing(w); @@ -577,13 +577,13 @@ static void window_new_ride_mousedown(int widgetIndex, rct_window *w, rct_widget _window_new_ride_current_tab = page; w->frame_no = 0; - w->var_482 = -1; + w->new_ride.selected_ride_id = -1; w->var_480 = -1; window_new_ride_populate_list(); if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) { - w->var_482 = RCT2_ADDRESS(0x00F43825, sint16)[page]; - if (w->var_482 == -1) - w->var_482 = RCT2_GLOBAL(0x00F43523, sint16); + w->new_ride.selected_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[page]; + if (w->new_ride.selected_ride_id == -1) + w->new_ride.selected_ride_id = RCT2_GLOBAL(0x00F43523, sint16); } window_new_ride_refresh_widget_sizing(w); @@ -603,7 +603,7 @@ static void window_new_ride_update(rct_window *w) widget_invalidate(w->classification, w->number, WIDX_TAB_1 + _window_new_ride_current_tab); - if (w->var_480 != -1 && w->var_488-- == 0) + if (w->var_480 != -1 && w->new_ride.selected_ride_countdown-- == 0) window_new_ride_select(w); } @@ -645,13 +645,14 @@ static void window_new_ride_scrollmousedown() { short x, y; rct_window *w; + ride_list_item item; window_scrollmouse_get_registers(w, x, y); if (RCT2_GLOBAL(0x009DEA6E, uint8) != 0) return; - ride_list_item item = window_new_ride_scroll_get_ride_list_item_at(w, x, y); + item = window_new_ride_scroll_get_ride_list_item_at(w, x, y); if (item.type == 255 && item.entry_index == 255) return; @@ -659,7 +660,7 @@ static void window_new_ride_scrollmousedown() w->var_480 = *((sint16*)&item); sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2)); - w->var_488 = 8; + w->new_ride.selected_ride_countdown = 8; window_invalidate(w); } @@ -671,17 +672,18 @@ static void window_new_ride_scrollmouseover() { short x, y; rct_window *w; + ride_list_item item; window_scrollmouse_get_registers(w, x, y); if (w->var_480 != -1) return; - ride_list_item item = window_new_ride_scroll_get_ride_list_item_at(w, x, y); - if (w->var_482 == *((sint16*)&item)) + item = window_new_ride_scroll_get_ride_list_item_at(w, x, y); + if (w->new_ride.selected_ride_id == *((sint16*)&item)) return; - w->var_482 = *((sint16*)&item); + w->new_ride.selected_ride_id = *((sint16*)&item); RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item; window_invalidate(w); } @@ -737,7 +739,7 @@ static void window_new_ride_paint() window_new_ride_draw_tab_images(dpi, w); if (_window_new_ride_current_tab != WINDOW_NEW_RIDE_PAGE_RESEARCH) { - ride_list_item item = *((ride_list_item*)&w->var_482); + ride_list_item item = *((ride_list_item*)&w->new_ride.selected_ride_id); if (item.type == 255 && item.entry_index == 255) return; @@ -827,15 +829,16 @@ static void window_new_ride_scrollpaint() int y = 1; ride_list_item *listItem = (ride_list_item*)0x00F43523; while (listItem->type != 255 || listItem->entry_index != 255) { + uint8 *rideEntry; // Draw flat button rectangle int flags = 0; if (w->var_480 == *((sint16*)listItem)) flags |= 0x20; - if (w->var_482 == *((sint16*)listItem) || flags != 0) + if (w->new_ride.selected_ride_id == *((sint16*)listItem) || flags != 0) gfx_fill_rect_inset(dpi, x, y, x + 115, y + 115, w->colours[1], 0x80 | flags); // Draw ride image - uint8 *rideEntry = rideEntries[listItem->entry_index]; + rideEntry = rideEntries[listItem->entry_index]; int unk = RCT2_GLOBAL(rideEntry + 4, uint32); if (listItem->type != RCT2_GLOBAL(rideEntry + 12, uint8)) { unk++; diff --git a/src/window_news.c b/src/window_news.c index d8e9c27ef6..32967a3c76 100644 --- a/src/window_news.c +++ b/src/window_news.c @@ -146,7 +146,7 @@ static void window_news_update(rct_window *w) if (w->var_480 == -1) return; - if (--w->var_484 != 0) + if (--w->news.var_484 != 0) return; window_invalidate(w); @@ -162,10 +162,11 @@ static void window_news_update(rct_window *w) if (j == 0) { if (newsItems[i].flags & 1) return; - if (w->var_482 == 1) { + if (w->news.var_482 == 1) { news_item_open_subject(newsItems[i].type, newsItems[i].assoc); return; - } else if (w->var_482 > 1) { + } + else if (w->news.var_482 > 1) { news_item_get_subject_location(newsItems[i].type, newsItems[i].assoc, &x, &y, &z); if (x != SPRITE_LOCATION_NULL) if ((w = window_get_main()) != NULL) @@ -251,8 +252,8 @@ static void window_news_scrollmousedown() if (buttonIndex != 0) { w->var_480 = i - 11; - w->var_482 = buttonIndex; - w->var_484 = 4; + w->news.var_482 = buttonIndex; + w->news.var_484 = 4; window_invalidate(w); sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2)); } @@ -330,7 +331,7 @@ static void window_news_scrollpaint() press = 0; if (w->var_480 != -1) { newsItem2 = &newsItems[11 + w->var_480]; - if (newsItem == newsItem2 && w->var_482 == 1) + if (newsItem == newsItem2 && w->news.var_482 == 1) press = 0x20; } gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press); @@ -371,7 +372,7 @@ static void window_news_scrollpaint() press = 0; if (w->var_480 != -1) { newsItem2 = &newsItems[11 + w->var_480]; - if (newsItem == newsItem2 && w->var_482 == 2) + if (newsItem == newsItem2 && w->news.var_482 == 2) press = 0x20; } gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press); diff --git a/src/window_park.c b/src/window_park.c index 8b72613e64..92c2579309 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -593,7 +593,7 @@ rct_window *window_park_open() 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; + w->focus.coordinate.viewport_target_y = 0; w->frame_no = 0; w->list_information_type = -1; w->var_48C = -1; @@ -619,8 +619,8 @@ void window_park_entrance_open() 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->focus.coordinate.viewport_target_y = -1; + window->focus.coordinate.viewport_target_x = -1; } window->page = WINDOW_PARK_PAGE_ENTRANCE; @@ -1021,10 +1021,11 @@ static void window_park_init_viewport(rct_window *w) // Call invalidate event RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); - w->var_482 = x; - w->var_484 = y; - w->var_486 = z; - w->var_488 = r << 8; + w->focus.coordinate.viewport_target_x = x; + w->focus.coordinate.viewport_target_y = y; + w->focus.sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE; + w->focus.coordinate.viewport_target_z = z; + w->focus.coordinate.viewport_target_rotation = r; if (zr != 0xFFFF) { // Create viewport @@ -1036,11 +1037,11 @@ static void window_park_init_viewport(rct_window *w) w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 2, (viewportWidget->bottom - viewportWidget->top) - 2, - zr&0xFF, + r, x, y, z, - xy&0xC0000000 >> 30, + w->focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, -1 ); w->flags |= (1 << 2); @@ -1068,8 +1069,8 @@ void window_park_rating_open() 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->focus.coordinate.viewport_target_x = -1; + window->focus.coordinate.viewport_target_y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) @@ -1202,8 +1203,8 @@ void window_park_guests_open() 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->focus.coordinate.viewport_target_x = -1; + window->focus.coordinate.viewport_target_y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) @@ -1608,8 +1609,8 @@ void window_park_objective_open() 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->focus.coordinate.viewport_target_x = -1; + window->focus.coordinate.viewport_target_y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) @@ -1771,8 +1772,8 @@ void window_park_awards_open() 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->focus.coordinate.viewport_target_x = -1; + window->focus.coordinate.viewport_target_y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) diff --git a/src/window_peep.c b/src/window_peep.c index 4e1630bb1d..670558383f 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -24,6 +24,7 @@ #include "string_ids.h" #include "sprite.h" #include "sprites.h" +#include "viewport.h" #include "widget.h" #include "window.h" #include "window_dropdown.h" @@ -85,6 +86,8 @@ rct_widget *window_peep_page_widgets[] = { window_peep_overview_widgets }; +void window_peep_set_page(rct_window* w, int page); + void window_peep_close(); void window_peep_resize(); void window_peep_overview_mouse_up(int widgetIndex, rct_window* w, rct_widget* widget); @@ -153,8 +156,8 @@ uint32 window_peep_page_enabled_widgets[] = { (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_TAB_5) | - (1 << WIDX_TAB_6) | - (1 << WIDX_?), + (1 << WIDX_TAB_6), //| + //(1 << WIDX_?), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | @@ -201,7 +204,7 @@ void window_peep_open(rct_peep* peep){ window->enabled_widgets = window_peep_page_enabled_widgets[0]; window->number = peep->sprite_index; window->page = 0; - window->var_482 = 0; + window->focus.coordinate.viewport_target_y = 0; window->frame_no = 0; window->list_information_type = 0; window->var_492 = 0; @@ -217,7 +220,7 @@ void window_peep_open(rct_peep* peep){ window->colours[0] = 1; window->colours[1] = 15; window->colours[2] = 15; - window->var_482 = -1; + window->focus.coordinate.viewport_target_y = -1; } window->page = 0; @@ -254,7 +257,7 @@ void window_peep_resize(){ window_get_register(w); RCT2_CALLPROC_EBPSAFE(0x6987a6); - RCT2_CALLPROC_EBPSAFE(w->eventhandler[WE_INVALIDATE]); + RCT2_CALLPROC_EBPSAFE(w->event_handlers[WE_INVALIDATE]); window_invalidate_by_id(0xA97,w->number); @@ -288,7 +291,7 @@ void window_peep_resize(){ if (view){ if ((w->width - 30) == view->width){ if ((w->height - 72) == view->height){ - RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); + RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)w, 0, 0); return; } } @@ -298,7 +301,7 @@ void window_peep_resize(){ view->view_width = view->width / zoom_amount; view->view_height = view->height / zoom_amount; } - RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); + RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)w, 0, 0); } /* rct2: 0x00696A06 */ @@ -307,13 +310,13 @@ void window_peep_overview_mouse_up(int widgetIndex, rct_window* w, rct_widget* w case WIDX_CLOSE: window_close(w); break; - case WIDX_TAB1: - case WIDX_TAB2: - case WIDX_TAB3: - case WIDX_TAB4: - case WIDX_TAB5: - case WIDX_TAB6: - window_peep_set_page(w, widgetIndex - WIDX_TAB1); + case WIDX_TAB_1: + case WIDX_TAB_2: + case WIDX_TAB_3: + case WIDX_TAB_4: + case WIDX_TAB_5: + case WIDX_TAB_6: + window_peep_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_RENAME: //696ba6 diff --git a/src/window_staff_peep.c b/src/window_staff_peep.c index d4bd010646..79316284b5 100644 --- a/src/window_staff_peep.c +++ b/src/window_staff_peep.c @@ -186,7 +186,7 @@ rct_window* sub_6BEF1B(rct_peep* peep) w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32); w->number = peep->sprite_index; w->page = 0; - w->var_482 = 0; + w->focus.coordinate.viewport_target_y = 0; w->frame_no = 0; RCT2_GLOBAL((int*)w + 0x496, uint16) = 0; // missing, var_494 should perhaps be uint16? From 5795165ceda1306f4aeb31e9d62b5af6161ec129 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 22 Aug 2014 20:17:48 +0100 Subject: [PATCH 15/20] Fix missing variables. Labeled even more vars --- src/window.c | 2 +- src/window.h | 26 +++++++++++++++------ src/window_map.c | 2 +- src/window_new_campaign.c | 18 +++++++------- src/window_new_ride.c | 38 +++++++++++++++--------------- src/window_news.c | 18 +++++++------- src/window_peep.c | 39 ++++++++----------------------- src/window_title_scenarioselect.c | 2 +- 8 files changed, 69 insertions(+), 76 deletions(-) diff --git a/src/window.c b/src/window.c index 7286f78051..84f86ab4e6 100644 --- a/src/window.c +++ b/src/window.c @@ -395,7 +395,7 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han w->disabled_widgets = 0; w->pressed_widgets = 0; w->var_020 = 0; - w->var_480 = 0; + w->focus.coordinate.var_480 = 0; w->focus.coordinate.viewport_target_x = 0; w->focus.coordinate.viewport_target_y = 0; w->focus.coordinate.viewport_target_z = 0; diff --git a/src/window.h b/src/window.h index a16650603a..e8d5d4f376 100644 --- a/src/window.h +++ b/src/window.h @@ -95,6 +95,7 @@ typedef struct { // Type is viewport_target_y & 0x8000 == 0 typedef struct{ + sint16 var_480; sint16 viewport_target_x; //0x482 sint16 viewport_target_y; //0x484 & VIEWPORT_FOCUS_Y_MASK sint16 viewport_target_z; //0x486 @@ -104,6 +105,7 @@ typedef struct{ // Type is viewport_target_sprite_id & 0x80000000 != 0 typedef struct{ + sint16 var_480; uint16 viewport_target_sprite_id; //0x482 uint8 pad_484; uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK @@ -119,7 +121,7 @@ enum{ /** * Viewport focus structure. - * size: 0x8 + * size: 0xA */ typedef union{ sprite_focus sprite; @@ -127,24 +129,35 @@ typedef union{ } viewport_focus; typedef struct{ - uint16 no_weeks; //0x482 + sint16 campaign_type; + sint16 no_weeks; //0x482 uint16 ride_id; //0x484 uint32 pad_486; } campaign_variables; typedef struct{ - uint16 selected_ride_id; //0x482 + sint16 selected_ride_id; //0x480 + sint16 highlighted_ride_id; //0x482 uint16 pad_484; uint16 pad_486; uint16 selected_ride_countdown; //488 } new_ride_variables; typedef struct{ - uint16 var_482; + sint16 var_480; + sint16 var_482; uint16 var_484; uint16 var_486; uint16 var_488; } news_variables; + +typedef struct{ + sint16 rotation; + sint16 var_482; + uint16 var_484; + uint16 var_486; + uint16 var_488; +}map_variables; /** * Window structure * size: 0x4C0 @@ -174,14 +187,13 @@ typedef struct rct_window { sint16 selected_list_item; // 0x47A -1 for none selected sint16 pad_47C; sint16 pad_47E; - sint16 var_480; union{ viewport_focus focus; campaign_variables campaign; new_ride_variables new_ride; news_variables news; + map_variables map; }; - //viewport_focus focus; // 0x482 viewport focus sint16 page; // 0x48A sint16 var_48C; sint16 frame_no; // 0x48E updated every tic for motion in windows sprites @@ -430,7 +442,7 @@ void window_park_objective_open(); void window_park_rating_open(); void window_finances_open(); void window_finances_research_open(); -void window_new_campaign_open(int campaignType); +void window_new_campaign_open(sint16 campaignType); void window_ride_list_open(); void window_new_ride_open(); void window_banner_open(); diff --git a/src/window_map.c b/src/window_map.c index 4a317b3454..9ac0b2e380 100644 --- a/src/window_map.c +++ b/src/window_map.c @@ -162,7 +162,7 @@ void window_map_open() w->var_020 |= 0x300; window_init_scroll_widgets(w); - w->var_480 = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint16); + w->map.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint16); window_map_init_map(); RCT2_GLOBAL(0x00F64F05, uint8) = 0; diff --git a/src/window_new_campaign.c b/src/window_new_campaign.c index fa45270c98..d52e9482d5 100644 --- a/src/window_new_campaign.c +++ b/src/window_new_campaign.c @@ -128,7 +128,7 @@ int ride_name_compare(const void *a, const void *b) * * rct2: 0x0069E16F */ -void window_new_campaign_open(int campaignType) +void window_new_campaign_open(sint16 campaignType) { // RCT2_CALLPROC_X(0x0069E16F, campaignType, 0, 0, 0, 0, 0, 0); @@ -138,7 +138,7 @@ void window_new_campaign_open(int campaignType) w = window_bring_to_front_by_id(WC_NEW_CAMPAIGN, 0); if (w != NULL) { - if (w->var_480 == campaignType) + if (w->campaign.campaign_type == campaignType) return; window_close(w); @@ -162,7 +162,7 @@ void window_new_campaign_open(int campaignType) window_new_campaign_widgets[WIDX_TITLE].image = STR_MARKETING_VOUCHERS_FOR_FREE_ENTRY_TO_THE_PARK + campaignType; // Campaign type - w->var_480 = campaignType; + w->campaign.campaign_type = campaignType; // Number of weeks w->campaign.no_weeks = 2; @@ -234,7 +234,7 @@ static void window_new_campaign_mouseup() break; case WIDX_START_BUTTON: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_START_MARKETING_CAMPAIGN; - game_do_command(0, (w->campaign.no_weeks<< 8) | 1, 0, (w->campaign.ride_id << 8) | w->var_480, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0); + game_do_command(0, (w->campaign.no_weeks << 8) | 1, 0, (w->campaign.ride_id << 8) | w->campaign.campaign_type, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0); window_close(w); break; } @@ -252,7 +252,7 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi case WIDX_RIDE_DROPDOWN_BUTTON: dropdownWidget = widget - 1; - if (w->var_480 == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { + if (w->campaign.campaign_type == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { window_new_campaign_get_shop_items(); if (window_new_campaign_shop_items[0] != 255) { int numItems = 0; @@ -329,7 +329,7 @@ static void window_new_campaign_dropdown() if (widgetIndex != WIDX_RIDE_DROPDOWN_BUTTON) return; - if (w->var_480 == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { + if (w->campaign.campaign_type == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { rct_string_id itemStringId = (uint16)gDropdownItemsArgs[dropdownIndex] - 2016; if (itemStringId >= 32) itemStringId -= 96; @@ -355,7 +355,7 @@ static void window_new_campaign_invalidate() window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_EMPTY; window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_EMPTY; window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = STR_MARKETING_NOT_SELECTED; - switch (w->var_480) { + switch (w->campaign.campaign_type) { case ADVERTISING_CAMPAIGN_RIDE_FREE: case ADVERTISING_CAMPAIGN_RIDE: window_new_campaign_widgets[WIDX_RIDE_LABEL].type = WWT_24; @@ -409,11 +409,11 @@ static void window_new_campaign_paint() y = w->y + 60; // Price per week - money32 pricePerWeek = AdvertisingCampaignPricePerWeek[w->var_480]; + money32 pricePerWeek = AdvertisingCampaignPricePerWeek[w->campaign.campaign_type]; gfx_draw_string_left(dpi, STR_MARKETING_COST_PER_WEEK, &pricePerWeek, 0, x, y); y += 13; // Total price - money32 totalPrice = AdvertisingCampaignPricePerWeek[w->var_480] * w->campaign.no_weeks; + money32 totalPrice = AdvertisingCampaignPricePerWeek[w->campaign.campaign_type] * w->campaign.no_weeks; gfx_draw_string_left(dpi, STR_MARKETING_TOTAL_COST, &totalPrice, 0, x, y); } \ No newline at end of file diff --git a/src/window_new_ride.c b/src/window_new_ride.c index 737bbea1c6..633b52a242 100644 --- a/src/window_new_ride.c +++ b/src/window_new_ride.c @@ -431,16 +431,16 @@ void window_new_ride_open() w->colours[0] = 24; w->colours[1] = 26; w->colours[2] = 26; - w->var_480 = -1; - w->new_ride.selected_ride_id = -1; + w->new_ride.selected_ride_countdown = -1; + w->new_ride.highlighted_ride_id = -1; _lastTrackDesignCountRideType.type = 255; _lastTrackDesignCountRideType.entry_index = 255; window_new_ride_populate_list(); - w->new_ride.selected_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab]; - if (w->new_ride.selected_ride_id == -1) - w->new_ride.selected_ride_id = RCT2_GLOBAL(0x00F43523, sint16); + w->new_ride.highlighted_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab]; + if (w->new_ride.highlighted_ride_id == -1) + w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16); w->width = 1; window_new_ride_refresh_widget_sizing(w); @@ -577,13 +577,13 @@ static void window_new_ride_mousedown(int widgetIndex, rct_window *w, rct_widget _window_new_ride_current_tab = page; w->frame_no = 0; - w->new_ride.selected_ride_id = -1; - w->var_480 = -1; + w->new_ride.highlighted_ride_id = -1; + w->new_ride.selected_ride_countdown = -1; window_new_ride_populate_list(); if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) { - w->new_ride.selected_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[page]; - if (w->new_ride.selected_ride_id == -1) - w->new_ride.selected_ride_id = RCT2_GLOBAL(0x00F43523, sint16); + w->new_ride.highlighted_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[page]; + if (w->new_ride.highlighted_ride_id == -1) + w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16); } window_new_ride_refresh_widget_sizing(w); @@ -603,7 +603,7 @@ static void window_new_ride_update(rct_window *w) widget_invalidate(w->classification, w->number, WIDX_TAB_1 + _window_new_ride_current_tab); - if (w->var_480 != -1 && w->new_ride.selected_ride_countdown-- == 0) + if (w->new_ride.selected_ride_countdown != -1 && w->new_ride.selected_ride_countdown-- == 0) window_new_ride_select(w); } @@ -657,7 +657,7 @@ static void window_new_ride_scrollmousedown() return; RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item; - w->var_480 = *((sint16*)&item); + w->new_ride.selected_ride_countdown = *((sint16*)&item); sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2)); w->new_ride.selected_ride_countdown = 8; @@ -676,14 +676,14 @@ static void window_new_ride_scrollmouseover() window_scrollmouse_get_registers(w, x, y); - if (w->var_480 != -1) + if (w->new_ride.selected_ride_countdown != -1) return; item = window_new_ride_scroll_get_ride_list_item_at(w, x, y); - if (w->new_ride.selected_ride_id == *((sint16*)&item)) + if (w->new_ride.highlighted_ride_id == *((sint16*)&item)) return; - w->new_ride.selected_ride_id = *((sint16*)&item); + w->new_ride.highlighted_ride_id = *((sint16*)&item); RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item; window_invalidate(w); } @@ -739,7 +739,7 @@ static void window_new_ride_paint() window_new_ride_draw_tab_images(dpi, w); if (_window_new_ride_current_tab != WINDOW_NEW_RIDE_PAGE_RESEARCH) { - ride_list_item item = *((ride_list_item*)&w->new_ride.selected_ride_id); + ride_list_item item = *((ride_list_item*)&w->new_ride.highlighted_ride_id); if (item.type == 255 && item.entry_index == 255) return; @@ -832,9 +832,9 @@ static void window_new_ride_scrollpaint() uint8 *rideEntry; // Draw flat button rectangle int flags = 0; - if (w->var_480 == *((sint16*)listItem)) + if (w->new_ride.selected_ride_countdown == *((sint16*)listItem)) flags |= 0x20; - if (w->new_ride.selected_ride_id == *((sint16*)listItem) || flags != 0) + if (w->new_ride.highlighted_ride_id == *((sint16*)listItem) || flags != 0) gfx_fill_rect_inset(dpi, x, y, x + 115, y + 115, w->colours[1], 0x80 | flags); // Draw ride image @@ -973,7 +973,7 @@ static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixeli */ static void window_new_ride_select(rct_window *w) { - ride_list_item item = *((ride_list_item*)&w->var_480); + ride_list_item item = *((ride_list_item*)&w->new_ride.selected_ride_countdown); if (item.type == 255) return; diff --git a/src/window_news.c b/src/window_news.c index 32967a3c76..fa4f51e10d 100644 --- a/src/window_news.c +++ b/src/window_news.c @@ -107,7 +107,7 @@ void window_news_open() window->colours[0] = 1; window->colours[1] = 1; window->colours[2] = 0; - window->var_480 = -1; + window->news.var_480 = -1; } // sub_66E4BA: @@ -144,7 +144,7 @@ static void window_news_update(rct_window *w) int i, j, x, y, z; rct_news_item *newsItems; - if (w->var_480 == -1) + if (w->news.var_480 == -1) return; if (--w->news.var_484 != 0) return; @@ -153,8 +153,8 @@ static void window_news_update(rct_window *w) sound_play_panned(SOUND_CLICK_2, w->x + (w->width / 2)); newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); - j = w->var_480; - w->var_480 = -1; + j = w->news.var_480; + w->news.var_480 = -1; for (i = 11; i < 61; i++) { if (newsItems[i].type == NEWS_ITEM_NULL) return; @@ -251,7 +251,7 @@ static void window_news_scrollmousedown() } if (buttonIndex != 0) { - w->var_480 = i - 11; + w->news.var_480 = i - 11; w->news.var_482 = buttonIndex; w->news.var_484 = 4; window_invalidate(w); @@ -329,8 +329,8 @@ static void window_news_scrollpaint() yy = y + 14; press = 0; - if (w->var_480 != -1) { - newsItem2 = &newsItems[11 + w->var_480]; + if (w->news.var_480 != -1) { + newsItem2 = &newsItems[11 + w->news.var_480]; if (newsItem == newsItem2 && w->news.var_482 == 1) press = 0x20; } @@ -370,8 +370,8 @@ static void window_news_scrollpaint() yy = y + 14; press = 0; - if (w->var_480 != -1) { - newsItem2 = &newsItems[11 + w->var_480]; + if (w->news.var_480 != -1) { + newsItem2 = &newsItems[11 + w->news.var_480]; if (newsItem == newsItem2 && w->news.var_482 == 2) press = 0x20; } diff --git a/src/window_peep.c b/src/window_peep.c index 670558383f..1dc4c79f01 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -90,7 +90,7 @@ void window_peep_set_page(rct_window* w, int page); void window_peep_close(); void window_peep_resize(); -void window_peep_overview_mouse_up(int widgetIndex, rct_window* w, rct_widget* widget); +void window_peep_overview_mouse_up(); static void* window_peep_overview_events[] = { window_peep_close, @@ -226,10 +226,10 @@ void window_peep_open(rct_peep* peep){ window->page = 0; window_invalidate(window); - window->widgets = RCT2_GLOBAL(0x981D0C, rct_widget*); + window->widgets = window_peep_page_widgets[WINDOW_PEEP_OVERVIEW]; window->enabled_widgets = window_peep_page_enabled_widgets[WINDOW_PEEP_OVERVIEW]; window->var_020 = RCT2_GLOBAL(0x981D54,uint32); - window->event_handlers = RCT2_GLOBAL(0x981D24,uint32*); + window->event_handlers = window_peep_page_events[WINDOW_PEEP_OVERVIEW]; window->pressed_widgets = 0; RCT2_CALLPROC_X(0x006987A6, 0, 0, 0, 0, (int)window, 0, 0); @@ -259,32 +259,9 @@ void window_peep_resize(){ RCT2_CALLPROC_EBPSAFE(0x6987a6); RCT2_CALLPROC_EBPSAFE(w->event_handlers[WE_INVALIDATE]); - window_invalidate_by_id(0xA97,w->number); + window_invalidate_by_id(0xA97, w->number); - w->min_width = 192; - w->max_width = 500; - w->min_height = 159; - w->max_height = 450; - - if (w->min_width > w->width){ - w->width = w->min_width; - window_invalidate(w); - } - - if (w->max_width < w->width){ - w->width = w->max_width; - window_invalidate(w); - } - - if (w->min_height > w->height){ - w->height = w->min_height; - window_invalidate(w); - } - - if (w->max_height < w->height){ - w->height = w->max_height; - window_invalidate(w); - } + window_set_resize(w, 192, 159, 500, 450); rct_viewport* view = w->viewport; @@ -305,7 +282,11 @@ void window_peep_resize(){ } /* rct2: 0x00696A06 */ -void window_peep_overview_mouse_up(int widgetIndex, rct_window* w, rct_widget* widget){ +void window_peep_overview_mouse_up(){ + short widgetIndex; + rct_window* w; + window_widget_get_registers(w, widgetIndex); + switch(widgetIndex){ case WIDX_CLOSE: window_close(w); diff --git a/src/window_title_scenarioselect.c b/src/window_title_scenarioselect.c index d567c9ff4f..cd7ef7d7b1 100644 --- a/src/window_title_scenarioselect.c +++ b/src/window_title_scenarioselect.c @@ -128,7 +128,7 @@ void window_scenarioselect_open() window->colours[0] = 1; window->colours[1] = 26; window->colours[2] = 26; - window->var_480 = -1; + window->focus.coordinate.var_480 = -1; window->var_494 = 0; window_scenarioselect_init_tabs(); From 810590e7546f052aed85189dfb4395ef0d86dd9c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 08:30:31 +0100 Subject: [PATCH 16/20] Changed struct for last time --- src/window.c | 22 ++++++++++---------- src/window.h | 27 +++++++++++------------- src/window_news.c | 2 +- src/window_park.c | 34 +++++++++++++++---------------- src/window_peep.c | 4 ++-- src/window_staff_peep.c | 2 +- src/window_title_scenarioselect.c | 2 +- 7 files changed, 45 insertions(+), 48 deletions(-) diff --git a/src/window.c b/src/window.c index 84f86ab4e6..50b7be7162 100644 --- a/src/window.c +++ b/src/window.c @@ -395,11 +395,11 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han w->disabled_widgets = 0; w->pressed_widgets = 0; w->var_020 = 0; - w->focus.coordinate.var_480 = 0; - w->focus.coordinate.viewport_target_x = 0; - w->focus.coordinate.viewport_target_y = 0; - w->focus.coordinate.viewport_target_z = 0; - w->focus.coordinate.viewport_target_rotation = 0; + w->viewport_focus_coordinates.var_480 = 0; + w->viewport_focus_coordinates.x = 0; + w->viewport_focus_coordinates.y = 0; + w->viewport_focus_coordinates.z = 0; + w->viewport_focus_coordinates.rotation = 0; w->page = 0; w->var_48C = 0; w->frame_no = 0; @@ -896,18 +896,18 @@ void window_scroll_to_viewport(rct_window *w) int x, y, z; rct_window *mainWindow; // In original checked to make sure x and y were not -1 as well. - if (w->viewport == NULL || w->focus.coordinate.viewport_target_y == -1) + if (w->viewport == NULL || w->viewport_focus_coordinates.y == -1) return; - if (w->focus.sprite.type & VIEWPORT_FOCUS_TYPE_SPRITE) { - rct_sprite *sprite = &(g_sprite_list[w->focus.sprite.viewport_target_sprite_id]); + if (w->viewport_focus_sprite.type & VIEWPORT_FOCUS_TYPE_SPRITE) { + rct_sprite *sprite = &(g_sprite_list[w->viewport_focus_sprite.sprite_id]); x = sprite->unknown.x; y = sprite->unknown.y; z = sprite->unknown.z; } else { - x = w->focus.coordinate.viewport_target_x; - y = w->focus.coordinate.viewport_target_y & VIEWPORT_FOCUS_Y_MASK; - z = w->focus.coordinate.viewport_target_z; + x = w->viewport_focus_coordinates.x; + y = w->viewport_focus_coordinates.y & VIEWPORT_FOCUS_Y_MASK; + z = w->viewport_focus_coordinates.z; } mainWindow = window_get_main(); diff --git a/src/window.h b/src/window.h index e8d5d4f376..6124c0374d 100644 --- a/src/window.h +++ b/src/window.h @@ -93,20 +93,24 @@ typedef struct { sint16 v_thumb_bottom; // 0x10 } rct_scroll; -// Type is viewport_target_y & 0x8000 == 0 +/** + * Viewport focus structure. + * size: 0xA + * Use sprite.type to work out type. + */ typedef struct{ sint16 var_480; - sint16 viewport_target_x; //0x482 - sint16 viewport_target_y; //0x484 & VIEWPORT_FOCUS_Y_MASK - sint16 viewport_target_z; //0x486 - uint8 viewport_target_rotation;//0x488 + sint16 x; //0x482 + sint16 y; //0x484 & VIEWPORT_FOCUS_Y_MASK + sint16 z; //0x486 + uint8 rotation;//0x488 uint8 pad_489; } coordinate_focus; // Type is viewport_target_sprite_id & 0x80000000 != 0 typedef struct{ sint16 var_480; - uint16 viewport_target_sprite_id; //0x482 + uint16 sprite_id; //0x482 uint8 pad_484; uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK uint32 pad_486; @@ -119,14 +123,6 @@ enum{ }; #define VIEWPORT_FOCUS_Y_MASK 0x3FFF; -/** - * Viewport focus structure. - * size: 0xA - */ -typedef union{ - sprite_focus sprite; - coordinate_focus coordinate; -} viewport_focus; typedef struct{ sint16 campaign_type; @@ -188,7 +184,8 @@ typedef struct rct_window { sint16 pad_47C; sint16 pad_47E; union{ - viewport_focus focus; + coordinate_focus viewport_focus_coordinates; + sprite_focus viewport_focus_sprite; campaign_variables campaign; new_ride_variables new_ride; news_variables news; diff --git a/src/window_news.c b/src/window_news.c index fa4f51e10d..9c431422e4 100644 --- a/src/window_news.c +++ b/src/window_news.c @@ -319,7 +319,7 @@ static void window_news_scrollpaint() // Item text char sz[400];// = (char*)0x09B5F2C; char* args[1]; - args[0] = &sz; + args[0] = (char*)&sz; sprintf(sz, "%c%c%s", newsItem->colour, FORMAT_SMALLFONT, newsItem->text); gfx_draw_string_left_wrapped(dpi, args, 2, y + 10, 325, 1170, 14); diff --git a/src/window_park.c b/src/window_park.c index 92c2579309..c9643861c4 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -593,7 +593,7 @@ rct_window *window_park_open() w->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE]; w->number = 0; w->page = WINDOW_PARK_PAGE_ENTRANCE; - w->focus.coordinate.viewport_target_y = 0; + w->viewport_focus_coordinates.y = 0; w->frame_no = 0; w->list_information_type = -1; w->var_48C = -1; @@ -619,8 +619,8 @@ void window_park_entrance_open() window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0); if (window == NULL) { window = window_park_open(); - window->focus.coordinate.viewport_target_y = -1; - window->focus.coordinate.viewport_target_x = -1; + window->viewport_focus_coordinates.y = -1; + window->viewport_focus_coordinates.x = -1; } window->page = WINDOW_PARK_PAGE_ENTRANCE; @@ -1021,11 +1021,11 @@ static void window_park_init_viewport(rct_window *w) // Call invalidate event RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); - w->focus.coordinate.viewport_target_x = x; - w->focus.coordinate.viewport_target_y = y; - w->focus.sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE; - w->focus.coordinate.viewport_target_z = z; - w->focus.coordinate.viewport_target_rotation = r; + w->viewport_focus_coordinates.x = x; + w->viewport_focus_coordinates.y = y; + w->viewport_focus_sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE; + w->viewport_focus_coordinates.z = z; + w->viewport_focus_coordinates.rotation = r; if (zr != 0xFFFF) { // Create viewport @@ -1041,7 +1041,7 @@ static void window_park_init_viewport(rct_window *w) x, y, z, - w->focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, + w->viewport_focus_sprite.type & VIEWPORT_FOCUS_TYPE_MASK, -1 ); w->flags |= (1 << 2); @@ -1069,8 +1069,8 @@ void window_park_rating_open() window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0); if (window == NULL) { window = window_park_open(); - window->focus.coordinate.viewport_target_x = -1; - window->focus.coordinate.viewport_target_y = -1; + window->viewport_focus_coordinates.x = -1; + window->viewport_focus_coordinates.y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) @@ -1203,8 +1203,8 @@ void window_park_guests_open() window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0); if (window == NULL) { window = window_park_open(); - window->focus.coordinate.viewport_target_x = -1; - window->focus.coordinate.viewport_target_y = -1; + window->viewport_focus_coordinates.x = -1; + window->viewport_focus_coordinates.y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) @@ -1609,8 +1609,8 @@ void window_park_objective_open() window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0); if (window == NULL) { window = window_park_open(); - window->focus.coordinate.viewport_target_x = -1; - window->focus.coordinate.viewport_target_y = -1; + window->viewport_focus_coordinates.x = -1; + window->viewport_focus_coordinates.y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) @@ -1772,8 +1772,8 @@ void window_park_awards_open() window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0); if (window == NULL) { window = window_park_open(); - window->focus.coordinate.viewport_target_x = -1; - window->focus.coordinate.viewport_target_y = -1; + window->viewport_focus_coordinates.x = -1; + window->viewport_focus_coordinates.y = -1; } if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3)) diff --git a/src/window_peep.c b/src/window_peep.c index 1dc4c79f01..2d36f8b80a 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -204,7 +204,7 @@ void window_peep_open(rct_peep* peep){ window->enabled_widgets = window_peep_page_enabled_widgets[0]; window->number = peep->sprite_index; window->page = 0; - window->focus.coordinate.viewport_target_y = 0; + window->viewport_focus_coordinates.y = 0; window->frame_no = 0; window->list_information_type = 0; window->var_492 = 0; @@ -220,7 +220,7 @@ void window_peep_open(rct_peep* peep){ window->colours[0] = 1; window->colours[1] = 15; window->colours[2] = 15; - window->focus.coordinate.viewport_target_y = -1; + window->viewport_focus_coordinates.y = -1; } window->page = 0; diff --git a/src/window_staff_peep.c b/src/window_staff_peep.c index 79316284b5..032d969a59 100644 --- a/src/window_staff_peep.c +++ b/src/window_staff_peep.c @@ -186,7 +186,7 @@ rct_window* sub_6BEF1B(rct_peep* peep) w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32); w->number = peep->sprite_index; w->page = 0; - w->focus.coordinate.viewport_target_y = 0; + w->viewport_focus_coordinates.y = 0; w->frame_no = 0; RCT2_GLOBAL((int*)w + 0x496, uint16) = 0; // missing, var_494 should perhaps be uint16? diff --git a/src/window_title_scenarioselect.c b/src/window_title_scenarioselect.c index cd7ef7d7b1..38246736e7 100644 --- a/src/window_title_scenarioselect.c +++ b/src/window_title_scenarioselect.c @@ -128,7 +128,7 @@ void window_scenarioselect_open() window->colours[0] = 1; window->colours[1] = 26; window->colours[2] = 26; - window->focus.coordinate.var_480 = -1; + window->viewport_focus_coordinates.var_480 = -1; window->var_494 = 0; window_scenarioselect_init_tabs(); From 0b20bb79b8d7a6a6a48b3a6174b96281e2d07c1d Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 10:39:15 +0100 Subject: [PATCH 17/20] Added window_peep_viewport_init --- src/peep.c | 8 +++ src/peep.h | 1 + src/ride.h | 2 +- src/vehicle.h | 3 + src/window_peep.c | 145 ++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 147 insertions(+), 12 deletions(-) diff --git a/src/peep.c b/src/peep.c index 1a2cc8d739..caf4016fde 100644 --- a/src/peep.c +++ b/src/peep.c @@ -540,4 +540,12 @@ void get_arguments_from_action(rct_peep* peep, uint32 *argument_1, uint32* argum break; } +} + +/** + * rct2: 0x00698827 + * returns 1 on pickup (CF not set) + */ +int peep_can_be_picked_up(rct_peep* peep){ + return RCT2_ADDRESS(0x982004, uint8)[peep->state] & 1; } \ No newline at end of file diff --git a/src/peep.h b/src/peep.h index 18e5cd17f6..0ee2dc1d6d 100644 --- a/src/peep.h +++ b/src/peep.h @@ -437,6 +437,7 @@ typedef struct { if (peep->type == PEEP_TYPE_STAFF) int peep_get_staff_count(); +int peep_can_be_picked_up(rct_peep* peep); void peep_update_all(); void peep_problem_warnings_update(); void peep_update_crowd_noise(); diff --git a/src/ride.h b/src/ride.h index be34a4eb33..461725e79f 100644 --- a/src/ride.h +++ b/src/ride.h @@ -54,7 +54,7 @@ typedef struct { uint8 status; // 0x049 uint16 var_04A; uint32 var_04C; - uint16 overall_view; // 0x050 + uint16 overall_view; // 0x050 00XX = X, XX00 = Y (* 32 + 16) uint16 station_starts[4]; // 0x052 uint8 station_heights[4]; // 0x05A uint8 pad_05E[0xC]; diff --git a/src/vehicle.h b/src/vehicle.h index 9451bdb8c8..c6df2167ee 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -41,4 +41,7 @@ typedef struct { void vehicle_update_all(); +/** Helper macro until rides are stored in this module. */ +#define GET_VEHICLE(sprite_index) &(g_sprite_list[sprite_index].vehicle) + #endif \ No newline at end of file diff --git a/src/window_peep.c b/src/window_peep.c index 2d36f8b80a..5f11ec43ce 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -20,6 +20,8 @@ #include "addresses.h" #include "game.h" +#include "map.h" +#include "ride.h" #include "peep.h" #include "string_ids.h" #include "sprite.h" @@ -49,11 +51,12 @@ enum WINDOW_PEEP_WIDGET_IDX { WIDX_TAB_4, WIDX_TAB_5, WIDX_TAB_6, - WIDX_MARQUEE, + + WIDX_MARQUEE = 10, WIDX_VIEWPORT, - WIDX_ACTION_LBL, - WIDX_RENAME, + WIDX_ACTION_LBL, WIDX_PICKUP, + WIDX_RENAME, WIDX_LOCATE, WIDX_TRACK }; @@ -74,8 +77,8 @@ rct_widget window_peep_overview_widgets[] = { { WWT_12, 1, 3, 166, 45, 56, 0x0FFFFFFFF, STR_NONE}, // Label Thought marquee { WWT_VIEWPORT, 1, 3, 166, 57, 143, 0x0FFFFFFFF, STR_NONE }, // Viewport { WWT_12, 1, 3, 166, 144, 154, 0x0FFFFFFFF, STR_NONE}, // Label Action - { WWT_FLATBTN, 1, 167, 190, 45, 68, SPR_RENAME, 1706}, // Rename Button - { WWT_FLATBTN, 1, 167, 190, 69, 92, 0x1430, 1055}, // Pickup Button + { WWT_FLATBTN, 1, 167, 190, 45, 68, SPR_RENAME, 1706}, // Pickup Button + { WWT_FLATBTN, 1, 167, 190, 69, 92, 0x1430, 1055}, // Rename Button { WWT_FLATBTN, 1, 167, 190, 93, 116, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP},// Locate Button { WWT_FLATBTN, 1, 167, 190, 117, 140, SPR_TRACK_PEEP, 1930}, // Track Button { WIDGETS_END }, @@ -87,6 +90,7 @@ rct_widget *window_peep_page_widgets[] = { }; void window_peep_set_page(rct_window* w, int page); +void window_peep_disable_widgets(rct_window* w); void window_peep_close(); void window_peep_resize(); @@ -209,7 +213,7 @@ void window_peep_open(rct_peep* peep){ window->list_information_type = 0; window->var_492 = 0; window->var_494 = 0; - RCT2_CALLPROC_X(0x006987A6, 0, 0, 0, 0, (int)window, 0, 0); + window_peep_disable_widgets(window); window->min_width = 192; window->min_height = 157; window->max_width = 500; @@ -232,11 +236,34 @@ void window_peep_open(rct_peep* peep){ window->event_handlers = window_peep_page_events[WINDOW_PEEP_OVERVIEW]; window->pressed_widgets = 0; - RCT2_CALLPROC_X(0x006987A6, 0, 0, 0, 0, (int)window, 0, 0); + window_peep_disable_widgets(window); window_init_scroll_widgets(window); RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); } +/* rct2: 0x006987A6 + * Disables the finance tab when no money. + * Disables peep pickup when in certain no pickup states. + */ +void window_peep_disable_widgets(rct_window* w){ + rct_peep* peep = &g_sprite_list[w->number].peep; + uint64 disabled_widgets = 0; + + if (peep_can_be_picked_up(peep)){ + if (w->disabled_widgets & (1 << WIDX_PICKUP)) + window_invalidate(w); + } + else{ + disabled_widgets = (1 << WIDX_PICKUP); + if (!(w->disabled_widgets & (1 << WIDX_PICKUP))) + window_invalidate(w); + } + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_11){ + disabled_widgets |= (1 << WIDX_TAB_4); //Disable finance tab if no money + } + w->disabled_widgets = disabled_widgets; +} + /* rct2: 0x00696A75 */ void window_peep_close(){ rct_window* w; @@ -256,7 +283,7 @@ void window_peep_resize(){ window_get_register(w); - RCT2_CALLPROC_EBPSAFE(0x6987a6); + window_peep_disable_widgets(w); RCT2_CALLPROC_EBPSAFE(w->event_handlers[WE_INVALIDATE]); window_invalidate_by_id(0xA97, w->number); @@ -299,10 +326,10 @@ void window_peep_overview_mouse_up(){ case WIDX_TAB_6: window_peep_set_page(w, widgetIndex - WIDX_TAB_1); break; - case WIDX_RENAME: + case WIDX_PICKUP: //696ba6 break; - case WIDX_PICKUP: + case WIDX_RENAME: //696e4d break; case WIDX_LOCATE: @@ -345,7 +372,7 @@ void window_peep_set_page(rct_window* w, int page){ w->event_handlers = window_peep_page_events[page]; w->pressed_widgets = 0; w->widgets = window_peep_page_widgets[page]; - RCT2_CALLPROC_X(0x6987A6, 0, 0, 0, 0, (int) w, 0, 0); + window_peep_disable_widgets(w); window_invalidate(w); RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0); @@ -356,3 +383,99 @@ void window_peep_set_page(rct_window* w, int page){ if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; } + + +void window_peep_viewport_init(rct_window* w){ + if (w->page != WINDOW_PEEP_OVERVIEW) return; + int edx = w->number; + int ecx = 0; + //edi + rct_peep* peep = GET_PEEP(w->number); + + if (peep->state == PEEP_STATE_PICKED){ + edx = -1; + } + else{ + uint8 final_check = 1; + if (peep->state == PEEP_STATE_ON_RIDE + || peep->state == PEEP_STATE_ENTERING_RIDE + || (peep->state == PEEP_STATE_LEAVING_RIDE && peep->x == 0x8000)){ + + rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]); + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){ + rct_vehicle* train = GET_VEHICLE(ride->train_car_map[peep->current_train]); + int car = peep->current_car; + + for (; car != 0; car--){ + train = GET_VEHICLE(train->next_vehicle_on_train); + } + + edx = train->sprite_index; + final_check = 0; + } + } + if (peep->x == 0x8000 && final_check){ + rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]); + int x = ride->overall_view & 0xFF * 32 + 16; + int y = (ride->overall_view >> 8) * 32 + 16; + int height = map_element_height(x, y); + height += 32; + ecx = height << 16; + edx = ((y << 16) & 0xFFFF0000) | x; + edx |= 0x40000000; + } + else{ + edx |= 0xC0000000; + ecx &= 0xFFFF; + } + ecx &= 0xFFFF0000; + ecx |= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) << 8; + } +//698935 + rct_viewport* viewport; + uint16 viewport_flags; + + if (w->viewport){ + //Check all combos, for now skipping y and rot + if (edx & 0xFFFF == w->viewport_focus_coordinates.x && ecx & 0xFFFF == w->viewport_focus_coordinates.z) + return; + viewport = w->viewport; + w->viewport = 0; + viewport_flags = viewport->flags; + viewport->width = 0; + viewport_update_pointers(); + } + else{ + viewport_flags = 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 0x1) + viewport_flags |= VIEWPORT_FLAG_GRIDLINES; + } + + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + w->viewport_focus_coordinates.x = edx; + w->viewport_focus_coordinates.y = edx >> 16; + w->viewport_focus_coordinates.z = ecx; + w->viewport_focus_coordinates.rotation = ecx >> 16; + + if (edx != 0xFFFF){ + if (!(w->viewport)){ + int eax = RCT2_GLOBAL(0x9AC3FE, uint16); + int ebx = RCT2_GLOBAL(0x9AC400, uint16); + eax <<= 16; + ebx <<= 16; + eax |= RCT2_GLOBAL(0x9AC3FA, uint16); + ebx |= RCT2_GLOBAL(0x9AC3FC, uint16); + ebx -= eax; + ebx -= 0x10001; + eax &= 0x10001; + eax += w->x; + viewport_create(w, x, y, width, height, zoom, center_x, center_y, center_z, flags, sprite); + w->flags |= WF_2; + window_invalidate(w); + } + } + viewport = w->viewport; + if (w->viewport) + viewport->flags = viewport_flags; + window_invalidate(w); +} \ No newline at end of file From 7d29081331f281c3f0f54f1297de6dbf187c4c22 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 11:56:20 +0100 Subject: [PATCH 18/20] Fix remaining issues. Viewport init working --- src/viewport.c | 6 ++-- src/window.h | 4 ++- src/window_park.c | 2 +- src/window_peep.c | 91 +++++++++++++++++++++++++---------------------- 4 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/viewport.c b/src/viewport.c index 62272a127b..8a00f235e4 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -162,7 +162,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo viewport->width = width; viewport->height = height; - if (!(flags & (1 << 0))){ + if (!(flags & VIEWPORT_FOCUS_TYPE_COORDINATE)){ zoom = 0; } @@ -171,12 +171,12 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo viewport->zoom = zoom; viewport->flags = 0; - if (RCT2_GLOBAL(0x9AAC7A, uint8) & 1){ + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_KEYBOARD_SHORTCUTS, uint8) & 1){ viewport->flags |= VIEWPORT_FLAG_GRIDLINES; } w->viewport = viewport; - if (flags & (1<<1)){ + if (flags & VIEWPORT_FOCUS_TYPE_SPRITE){ w->viewport_target_sprite = sprite; rct_sprite* center_sprite = &g_sprite_list[sprite]; center_x = center_sprite->unknown.x; diff --git a/src/window.h b/src/window.h index 6124c0374d..bab8718775 100644 --- a/src/window.h +++ b/src/window.h @@ -113,7 +113,9 @@ typedef struct{ uint16 sprite_id; //0x482 uint8 pad_484; uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK - uint32 pad_486; + uint16 pad_486; + uint8 rotation; //0x488 + uint8 pad_489; } sprite_focus; #define VIEWPORT_FOCUS_TYPE_MASK 0xC0 diff --git a/src/window_park.c b/src/window_park.c index c9643861c4..39b982ae1b 100644 --- a/src/window_park.c +++ b/src/window_park.c @@ -1037,7 +1037,7 @@ static void window_park_init_viewport(rct_window *w) w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 2, (viewportWidget->bottom - viewportWidget->top) - 2, - r, + 0, x, y, z, diff --git a/src/window_peep.c b/src/window_peep.c index 5f11ec43ce..06f522b3cd 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -91,6 +91,7 @@ rct_widget *window_peep_page_widgets[] = { void window_peep_set_page(rct_window* w, int page); void window_peep_disable_widgets(rct_window* w); +void window_peep_viewport_init(rct_window* w); void window_peep_close(); void window_peep_resize(); @@ -238,7 +239,7 @@ void window_peep_open(rct_peep* peep){ window_peep_disable_widgets(window); window_init_scroll_widgets(window); - RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0); + window_peep_viewport_init(window); } /* rct2: 0x006987A6 @@ -295,7 +296,7 @@ void window_peep_resize(){ if (view){ if ((w->width - 30) == view->width){ if ((w->height - 72) == view->height){ - RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)w, 0, 0); + window_peep_viewport_init(w); return; } } @@ -305,7 +306,7 @@ void window_peep_resize(){ view->view_width = view->width / zoom_amount; view->view_height = view->height / zoom_amount; } - RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)w, 0, 0); + window_peep_viewport_init(w); } /* rct2: 0x00696A06 */ @@ -384,22 +385,27 @@ void window_peep_set_page(rct_window* w, int page){ if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; } - +/* rct2: 0x0069883C */ void window_peep_viewport_init(rct_window* w){ if (w->page != WINDOW_PEEP_OVERVIEW) return; - int edx = w->number; - int ecx = 0; - //edi + + union{ + sprite_focus sprite; + coordinate_focus coordinate; + } focus; //The focus will be either a sprite or a coordinate. + + focus.sprite.sprite_id = w->number; + rct_peep* peep = GET_PEEP(w->number); if (peep->state == PEEP_STATE_PICKED){ - edx = -1; + focus.sprite.sprite_id = -1; } else{ uint8 final_check = 1; if (peep->state == PEEP_STATE_ON_RIDE || peep->state == PEEP_STATE_ENTERING_RIDE - || (peep->state == PEEP_STATE_LEAVING_RIDE && peep->x == 0x8000)){ + || (peep->state == PEEP_STATE_LEAVING_RIDE && peep->x == SPRITE_LOCATION_NULL)){ rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]); if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){ @@ -410,39 +416,42 @@ void window_peep_viewport_init(rct_window* w){ train = GET_VEHICLE(train->next_vehicle_on_train); } - edx = train->sprite_index; + focus.sprite.sprite_id = train->sprite_index; final_check = 0; } } - if (peep->x == 0x8000 && final_check){ + if (peep->x == SPRITE_LOCATION_NULL && final_check){ rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]); int x = ride->overall_view & 0xFF * 32 + 16; int y = (ride->overall_view >> 8) * 32 + 16; int height = map_element_height(x, y); height += 32; - ecx = height << 16; - edx = ((y << 16) & 0xFFFF0000) | x; - edx |= 0x40000000; + focus.coordinate.x = x; + focus.coordinate.y = y; + focus.coordinate.z = height; + focus.sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE; } else{ - edx |= 0xC0000000; - ecx &= 0xFFFF; + focus.sprite.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE; + focus.sprite.pad_486 &= 0xFFFF; } - ecx &= 0xFFFF0000; - ecx |= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) << 8; + focus.coordinate.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); } -//698935 - rct_viewport* viewport; + uint16 viewport_flags; if (w->viewport){ //Check all combos, for now skipping y and rot - if (edx & 0xFFFF == w->viewport_focus_coordinates.x && ecx & 0xFFFF == w->viewport_focus_coordinates.z) + if (focus.coordinate.x == w->viewport_focus_coordinates.x && + focus.coordinate.y == w->viewport_focus_coordinates.y && + focus.coordinate.z == w->viewport_focus_coordinates.z && + focus.coordinate.rotation == w->viewport_focus_coordinates.rotation) return; - viewport = w->viewport; + + viewport_flags = w->viewport->flags; + w->viewport->width = 0; w->viewport = 0; - viewport_flags = viewport->flags; - viewport->width = 0; + viewport_update_pointers(); } else{ @@ -452,30 +461,28 @@ void window_peep_viewport_init(rct_window* w){ } RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); - w->viewport_focus_coordinates.x = edx; - w->viewport_focus_coordinates.y = edx >> 16; - w->viewport_focus_coordinates.z = ecx; - w->viewport_focus_coordinates.rotation = ecx >> 16; - if (edx != 0xFFFF){ + w->viewport_focus_coordinates.x = focus.coordinate.x; + w->viewport_focus_coordinates.y = focus.coordinate.y; + w->viewport_focus_coordinates.z = focus.coordinate.z; + w->viewport_focus_coordinates.rotation = focus.coordinate.rotation; + + if (peep->state != PEEP_STATE_PICKED){ if (!(w->viewport)){ - int eax = RCT2_GLOBAL(0x9AC3FE, uint16); - int ebx = RCT2_GLOBAL(0x9AC400, uint16); - eax <<= 16; - ebx <<= 16; - eax |= RCT2_GLOBAL(0x9AC3FA, uint16); - ebx |= RCT2_GLOBAL(0x9AC3FC, uint16); - ebx -= eax; - ebx -= 0x10001; - eax &= 0x10001; - eax += w->x; - viewport_create(w, x, y, width, height, zoom, center_x, center_y, center_z, flags, sprite); + rct_widget* view_widget = &w->widgets[WIDX_VIEWPORT]; + + int x = view_widget->left + 1 + w->x; + int y = view_widget->top + 1 + w->y; + int width = view_widget->right - view_widget->left - 1; + int height = view_widget->bottom - view_widget->top - 1; + + viewport_create(w, x, y, width, height, 0, focus.coordinate.x, focus.coordinate.y, focus.coordinate.z, focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); w->flags |= WF_2; window_invalidate(w); } } - viewport = w->viewport; + if (w->viewport) - viewport->flags = viewport_flags; + w->viewport->flags = viewport_flags; window_invalidate(w); } \ No newline at end of file From 19e72c54c7c4b760628ead532b8c116d2bee9be1 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 12:06:25 +0100 Subject: [PATCH 19/20] Started peep_overview_paint --- src/window_peep.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/window_peep.c b/src/window_peep.c index 06f522b3cd..3e2b6caae1 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -96,6 +96,7 @@ void window_peep_viewport_init(rct_window* w); void window_peep_close(); void window_peep_resize(); void window_peep_overview_mouse_up(); +void window_peep_overview_paint(); static void* window_peep_overview_events[] = { window_peep_close, @@ -124,7 +125,7 @@ static void* window_peep_overview_events[] = { window_peep_emptysub, window_peep_emptysub, (void*)0x696749, //Invalidate - (void*)0x696887, //Paint + window_peep_overview_paint, //Paint (void*)0x69707C }; @@ -485,4 +486,24 @@ void window_peep_viewport_init(rct_window* w){ if (w->viewport) w->viewport->flags = viewport_flags; window_invalidate(w); +} + +/* rct2: 0x696887 */ +void window_peep_overview_paint(){ + rct_window *w; + rct_drawpixelinfo *dpi; + rct_widget *labelWidget; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + //6983dd + //698597 + //6985d8 + //69861f + //69869b + //698661 + if (w->viewport){ + window_draw_viewport(dpi, w); + } } \ No newline at end of file From 4dd7a7dbc62b6084ffe5b9cfc75c2a7a7809c69f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 23 Aug 2014 13:35:55 +0100 Subject: [PATCH 20/20] Add in address 's --- src/window_peep.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/window_peep.c b/src/window_peep.c index 3e2b6caae1..2c55d29ce9 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -86,7 +86,12 @@ rct_widget window_peep_overview_widgets[] = { //0x981D0C rct_widget *window_peep_page_widgets[] = { - window_peep_overview_widgets + window_peep_overview_widgets, + (rct_widget *)0x9AC45C, + (rct_widget *)0x9ac500, + (rct_widget *)0x9ac5b4, + (rct_widget *)0x9ac658, + (rct_widget *)0x9ac6FC }; void window_peep_set_page(rct_window* w, int page); @@ -131,7 +136,12 @@ static void* window_peep_overview_events[] = { //0x981D24 void* window_peep_page_events[] = { - window_peep_overview_events + window_peep_overview_events, + (void*)0x982468, + (void*)0x9824d8, + (void*)0x982548, + (void*)0x9825b8, + (void*)0x982628 }; //0x981D3C @@ -495,6 +505,8 @@ void window_peep_overview_paint(){ rct_widget *labelWidget; window_paint_get_registers(w, dpi); + RCT2_CALLPROC_X(0x696887, 0, 0, 0, 0, w, dpi, 0); + return; window_draw_widgets(w, dpi); //6983dd