From dffd689ee6a3479aa48f5aec3e971eb38b939c4a Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 25 Aug 2014 19:31:53 +0100 Subject: [PATCH] Added more to window_peep overview paint Moved get_arguments_from_thought to peep.c and added to peep.h Fixed possible crash in viewport_update_position Fixed compile error --- src/peep.c | 38 ++++++++++++++++++++ src/peep.h | 1 + src/viewport.c | 2 +- src/window.h | 2 +- src/window_guest_list.c | 40 +-------------------- src/window_peep.c | 77 ++++++++++++++++++++++++++++++++++------- 6 files changed, 106 insertions(+), 54 deletions(-) diff --git a/src/peep.c b/src/peep.c index caf4016fde..ea85a117e4 100644 --- a/src/peep.c +++ b/src/peep.c @@ -542,6 +542,44 @@ void get_arguments_from_action(rct_peep* peep, uint32 *argument_1, uint32* argum } +/** +* rct2: 0x00698342 +* thought.item (eax) +* thought.type (ebx) +* argument_1 (esi & ebx) +* argument_2 (esi+2) +*/ +void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, uint32* argument_2){ + int esi = 0x9AC86C; + + if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 1){ + rct_ride* ride = &g_ride_list[thought.item]; + esi = (int)(&(ride->var_04A)); + } + else if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 2){ + if (thought.item < 0x20){ + RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM_START; + } + else{ + RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM2_START; + } + } + else if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 4){ + if (thought.item < 0x20){ + RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM_SINGULAR_START; + } + else + { + RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM2_SINGULAR_START; + } + } + else{ + esi = 0x9AC864; //No thought? + } + *argument_1 = ((thought.type + STR_THOUGHT_START) & 0xFFFF) | (*((uint16*)esi) << 16); + *argument_2 = *((uint32*)(esi + 2)); //Always 0 apart from on rides? +} + /** * rct2: 0x00698827 * returns 1 on pickup (CF not set) diff --git a/src/peep.h b/src/peep.h index 0ee2dc1d6d..3f18e5d587 100644 --- a/src/peep.h +++ b/src/peep.h @@ -444,5 +444,6 @@ void peep_update_crowd_noise(); void peep_applause(); rct_peep *peep_generate(int x, int y, int z); void get_arguments_from_action(rct_peep* peep, uint32 *argument_1, uint32* argument_2); +void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, uint32* argument_2); #endif diff --git a/src/viewport.c b/src/viewport.c index b5de1c435e..4697b57df3 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -280,7 +280,7 @@ void viewport_update_position(rct_window *window) 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 height = map_element_height(0xFFFF & sprite->unknown.x, 0xFFFF & sprite->unknown.y) - 16; int underground = sprite->unknown.z < height; RCT2_CALLPROC_X(0x6E7A15, sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, underground, (int)window, (int)viewport, 0); diff --git a/src/window.h b/src/window.h index f2adce2696..d4a9cbb0af 100644 --- a/src/window.h +++ b/src/window.h @@ -203,7 +203,7 @@ typedef struct rct_window { sint16 page; // 0x48A sint16 var_48C; sint16 frame_no; // 0x48E updated every tic for motion in windows sprites - uint16 list_information_type; // 0x490 0 for none + uint16 list_information_type; // 0x490 0 for none, Used as current position of marquee in window_peep sint16 var_492; uint32 var_494; uint8 var_498[0x14]; diff --git a/src/window_guest_list.c b/src/window_guest_list.c index a5953114be..217e7ebb26 100644 --- a/src/window_guest_list.c +++ b/src/window_guest_list.c @@ -135,7 +135,7 @@ static void window_guest_list_find_groups(); static int get_guest_face_sprite_small(rct_peep *peep); static int get_guest_face_sprite_large(rct_peep *peep); static void get_arguments_from_peep(rct_peep *peep, uint32 *argument_1, uint32* argument_2); -void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, uint32* argument_2); + /** * * rct2: 0x006992E3 @@ -730,44 +730,6 @@ static int window_guest_list_is_peep_in_filter(rct_peep* peep) return 1; } -/** - * rct2: 0x00698342 - * thought.item (eax) - * thought.type (ebx) - * argument_1 (esi & ebx) - * argument_2 (esi+2) - */ -void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, uint32* argument_2){ - int esi = 0x9AC86C; - - if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 1){ - rct_ride* ride = &g_ride_list[thought.item]; - esi = (int)(&(ride->var_04A)); - } - else if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 2){ - if (thought.item < 0x20){ - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM_START; - } - else{ - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM2_START; - } - } - else if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 4){ - if (thought.item < 0x20){ - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM_SINGULAR_START; - } - else - { - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM2_SINGULAR_START; - } - } - else{ - esi = 0x9AC864; //No thought? - } - *argument_1 = ((thought.type + STR_THOUGHT_START) & 0xFFFF) | (*((uint16*)esi) << 16); - *argument_2 = *((uint32*)(esi+2)); //Always 0 apart from on rides? -} - /** * rct2:0x0069B7EA * Calculates a hash value (arguments) for comparing peep actions/thoughts diff --git a/src/window_peep.c b/src/window_peep.c index b393240a81..e6be343114 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -85,18 +85,18 @@ rct_widget window_peep_overview_widgets[] = { }; rct_widget window_peep_stats_widgets[] = { - {WWT_FRAME, 0, 0,191,0,156,-1,-1}, - {WWT_CAPTION, 0, 1,190,1,14,865,829}, - {WWT_CLOSEBOX, 0, 179,189,2,13,824,828}, - {WWT_RESIZE, 1, 0,191,43,156,-1,-1}, - {WWT_TAB, 1, 3,33,17,43,0x2000144E,1938}, - {WWT_TAB, 1, 34,64,17,43,0x2000144E,1940}, - {WWT_TAB, 1, 65,95,17,43,0x2000144E,1941}, - {WWT_TAB, 1, 96,126,17,43,0x2000144E,1942}, - {WWT_TAB, 1, 127,157,17,43,0x2000144E,1943}, - {WWT_TAB, 1, 158,188,17,43,0x2000144E,1944}, + {WWT_FRAME, 0, 0, 191, 0, 156, -1, STR_NONE}, + {WWT_CAPTION, 0, 1, 190, 1, 14, 865, STR_WINDOW_TITLE_TIP}, + {WWT_CLOSEBOX, 0, 179, 189, 2, 13, 824, STR_CLOSE_WINDOW_TIP}, + {WWT_RESIZE, 1, 0, 191, 43, 156, -1, STR_NONE}, + {WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, 1938}, + {WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, 1940}, + {WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, 1941}, + {WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, 1942}, + {WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, 1943}, + {WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, 1944}, {WIDGETS_END}, -} +}; //0x981D0C rct_widget *window_peep_page_widgets[] = { @@ -693,8 +693,8 @@ void window_peep_overview_paint(){ //rct_widget *labelWidget; window_paint_get_registers(w, dpi); - RCT2_CALLPROC_X(0x696887, 0, 0, 0, 0, (int)w, (int)dpi, 0); - return; + //RCT2_CALLPROC_X(0x696887, 0, 0, 0, 0, (int)w, (int)dpi, 0); + //return; window_draw_widgets(w, dpi); //6983dd @@ -703,7 +703,58 @@ void window_peep_overview_paint(){ //69861f //69869b //698661 + + // Draw the viewport no sound sprite if (w->viewport){ window_draw_viewport(dpi, w); + rct_viewport* viewport = w->viewport; + if (viewport->flags & VIEWPORT_FLAG_SOUND_ON){ + gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2, 0); + } } + + // Draw the centered label + uint32 argument1, argument2; + rct_peep* peep = GET_PEEP(w->number); + get_arguments_from_action(peep, &argument1, &argument2); + RCT2_GLOBAL(0x13CE952, uint32) = argument1; + RCT2_GLOBAL(0x13CE952 + 4, uint32) = argument2; + rct_widget* widget = &w->widgets[WIDX_ACTION_LBL]; + int x = (widget->left + widget->right) / 2 + w->x; + int y = w->y + widget->top - 1; + int width = widget->right - widget->left; + gfx_draw_string_centred_clipped(dpi, 1191, (void*)0x13CE952, 0, x, y, width); + + // Draw the marquee thought + widget = &w->widgets[WIDX_MARQUEE]; + width = widget->right - widget->left - 3; + int left = widget->left + 2 + w->x; + int top = widget->top + w->y; + int height = widget->bottom - widget->top; + rct_drawpixelinfo* dpi_marquee = clip_drawpixelinfo(dpi, left, width, top, height); + + if (!dpi_marquee)return; + int i = 0; + for (; i < PEEP_MAX_THOUGHTS; ++i){ + if (peep->thoughts[i].type == PEEP_THOUGHT_TYPE_NONE){ + w->list_information_type = 0; + return; + } + if (peep->thoughts[i].var_2 == 1){ // If a fresh thought + break; + } + } + if (i == PEEP_MAX_THOUGHTS){ + w->list_information_type = 0; + return; + } + + get_arguments_from_thought(peep->thoughts[i], &argument1, &argument2); + + RCT2_GLOBAL(0x13CE952, uint32) = argument1; + RCT2_GLOBAL(0x13CE952 + 4, uint32) = argument2; + RCT2_GLOBAL(0x13CE952 + 8, uint16) = 0; + + x = widget->right - widget->left - w->list_information_type; + gfx_draw_string_left(dpi_marquee, 1193, (void*)0x13CE952, 0, x, 0); }