From a14a389040094474a469d48bfc11160339305b4a Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sat, 14 Feb 2015 13:29:09 +0100 Subject: [PATCH 1/9] Initial decompilation of window_map_paint_peep_overlay --- src/windows/map.c | 97 +++++++++++++++++++++++++++++++++++++++- src/windows/staff_list.c | 2 +- 2 files changed, 96 insertions(+), 3 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index d25f11b4ce..105891b50d 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -601,6 +601,99 @@ static void window_map_tooltip() RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 0xC55; } +/** +* +* rct2: 0x0068DADA +*/ +static void window_map_paint_peep_overlay(rct_window *w, rct_drawpixelinfo *dpi) +{ + //RCT2_CALLPROC_X(0x68DADA, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing guests + //return; + + rct_peep *peep; + uint16 spriteIndex; + + sint16 left, right, bottom, top; + sint16 temp; + sint16 color; + + FOR_ALL_PEEPS(spriteIndex, peep) { + left = peep->x; + top = peep->y; + + if (left == SPRITE_LOCATION_NULL) + continue; + + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + case 3: + temp = left; + left = top; + top = temp; + left = 0x1FFF - left; + break; + case 2: + left = 0x1FFF - left; + top = 0x1FFF - top; + break; + case 1: + temp = left; + left = top; + top = temp; + top = 0x1FFF - top; + break; + case 0: + break; + } + left >>= 5; + top >>= 5; + bottom = top; + bottom += left; + left = -left; + left += top; + left += 0xF8; + bottom -= 8; + + right = left; + top = bottom; + + color = 0x14; + + if ((peep->var_0C & 0x200) != 0) { + if (peep->type == PEEP_TYPE_STAFF) { + if ((RCT2_GLOBAL(0x009AC861, uint16) & 8) == 0) + goto fill_rect; + color = 0x8A; + left--; + if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) != 0) + goto fill_rect; + color = 0xA; + } else { + if ((RCT2_GLOBAL(0x009AC861, uint16) & 2) == 0) + goto fill_rect; + color = 0xAC; + left--; + if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) != 0) + goto fill_rect; + color = 0x15; + } + } + + fill_rect: + gfx_fill_rect(dpi, left, top, right, bottom, color); + } + +} + +/** +* +* rct2: 0x0068DBC1 +*/ +static void window_map_paint_train_overlay(rct_window *w, rct_drawpixelinfo *dpi) +{ + RCT2_CALLPROC_X(0x68DBC1, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing trains +} + + /** * * rct2: 0x0068CF23 @@ -632,9 +725,9 @@ static void window_map_scrollpaint() *g1_element = pushed_g1_element; if (w->selected_tab == 0) - RCT2_CALLPROC_X(0x68DADA, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing guests + window_map_paint_peep_overlay(w, dpi); else - RCT2_CALLPROC_X(0x68DBC1, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing trains + window_map_paint_train_overlay(w, dpi); RCT2_CALLPROC_X(0x68D8CE, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws the HUD rectangle on the map } diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index b3dc14a47c..27655c2a74 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -321,7 +321,7 @@ void window_staff_list_update(rct_window *w) peep->var_0C &= 0xFDFF; if (peep->staff_type == RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8)) { - peep->var_0C &= 0x200; + peep->var_0C |= 0x200; } } } From 2e6fb1cc0f0bd0348ab3364139b39140166668e8 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sat, 14 Feb 2015 14:03:41 +0100 Subject: [PATCH 2/9] Decompiled window_map_paint_train_overlay --- src/windows/map.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/windows/map.c b/src/windows/map.c index 105891b50d..fddf5a7e4c 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -690,7 +690,65 @@ static void window_map_paint_peep_overlay(rct_window *w, rct_drawpixelinfo *dpi) */ static void window_map_paint_train_overlay(rct_window *w, rct_drawpixelinfo *dpi) { - RCT2_CALLPROC_X(0x68DBC1, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing trains + //RCT2_CALLPROC_X(0x68DBC1, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing trains + //return; + + rct_vehicle *train, *vehicle; + uint16 train_index, vehicle_index; + + sint16 left, top, right, bottom; + sint16 temp; + sint16 color; + + for (train_index = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_VEHICLE, uint16); train_index != SPRITE_INDEX_NULL; train_index = train->next) { + train = GET_VEHICLE(train_index); + for (vehicle_index = train_index; vehicle_index != SPRITE_INDEX_NULL; vehicle_index = vehicle->next_vehicle_on_train) { + vehicle = GET_VEHICLE(vehicle_index); + + left = vehicle->x; + top = vehicle->y; + + if (left == SPRITE_LOCATION_NULL) + continue; + + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + case 3: + temp = left; + left = top; + top = temp; + left = 0x1FFF - left; + break; + case 2: + left = 0x1FFF - left; + top = 0x1FFF - top; + break; + case 1: + temp = left; + left = top; + top = temp; + top = 0x1FFF - top; + break; + case 0: + break; + } + + left >>= 5; + top >>= 5; + bottom = top; + bottom += left; + left = -left; + left += top; + left += 0xF8; + bottom -= 8; + + right = left; + top = bottom; + + color = 0xAB; + + gfx_fill_rect(dpi, left, top, right, bottom, color); + } + } } From 7ba49b88875a230154d8c9fec5d4457989caedea Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sat, 14 Feb 2015 14:24:18 +0100 Subject: [PATCH 3/9] Separate common code to window_map_transform_to_map_coords; small cleanup --- src/windows/map.c | 117 ++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 72 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index fddf5a7e4c..26290c2860 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -601,11 +601,47 @@ static void window_map_tooltip() RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 0xC55; } +/** +* +* part of window_map_paint_peep_overlay and window_map_paint_train_overlay +*/ +static void window_map_transform_to_map_coords(sint16 *left, sint16 *top) +{ + sint16 x = *left, y = *top; + sint16 temp; + + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + case 3: + temp = x; + x = y; + y = temp; + x = 0x1FFF - x; + break; + case 2: + x = 0x1FFF - x; + y = 0x1FFF - y; + break; + case 1: + temp = x; + x = y; + y = temp; + y = 0x1FFF - y; + break; + case 0: + break; + } + x >>= 5; + y >>= 5; + + *left = -x + y + 0xF8; + *top = x + y - 8; +} + /** * * rct2: 0x0068DADA */ -static void window_map_paint_peep_overlay(rct_window *w, rct_drawpixelinfo *dpi) +static void window_map_paint_peep_overlay(rct_drawpixelinfo *dpi) { //RCT2_CALLPROC_X(0x68DADA, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing guests //return; @@ -614,7 +650,6 @@ static void window_map_paint_peep_overlay(rct_window *w, rct_drawpixelinfo *dpi) uint16 spriteIndex; sint16 left, right, bottom, top; - sint16 temp; sint16 color; FOR_ALL_PEEPS(spriteIndex, peep) { @@ -624,37 +659,10 @@ static void window_map_paint_peep_overlay(rct_window *w, rct_drawpixelinfo *dpi) if (left == SPRITE_LOCATION_NULL) continue; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { - case 3: - temp = left; - left = top; - top = temp; - left = 0x1FFF - left; - break; - case 2: - left = 0x1FFF - left; - top = 0x1FFF - top; - break; - case 1: - temp = left; - left = top; - top = temp; - top = 0x1FFF - top; - break; - case 0: - break; - } - left >>= 5; - top >>= 5; - bottom = top; - bottom += left; - left = -left; - left += top; - left += 0xF8; - bottom -= 8; + window_map_transform_to_map_coords(&left, &top); right = left; - top = bottom; + bottom = top; color = 0x14; @@ -677,18 +685,16 @@ static void window_map_paint_peep_overlay(rct_window *w, rct_drawpixelinfo *dpi) color = 0x15; } } - fill_rect: gfx_fill_rect(dpi, left, top, right, bottom, color); } - } /** * * rct2: 0x0068DBC1 */ -static void window_map_paint_train_overlay(rct_window *w, rct_drawpixelinfo *dpi) +static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) { //RCT2_CALLPROC_X(0x68DBC1, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws dots representing trains //return; @@ -697,8 +703,6 @@ static void window_map_paint_train_overlay(rct_window *w, rct_drawpixelinfo *dpi uint16 train_index, vehicle_index; sint16 left, top, right, bottom; - sint16 temp; - sint16 color; for (train_index = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_VEHICLE, uint16); train_index != SPRITE_INDEX_NULL; train_index = train->next) { train = GET_VEHICLE(train_index); @@ -711,47 +715,16 @@ static void window_map_paint_train_overlay(rct_window *w, rct_drawpixelinfo *dpi if (left == SPRITE_LOCATION_NULL) continue; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { - case 3: - temp = left; - left = top; - top = temp; - left = 0x1FFF - left; - break; - case 2: - left = 0x1FFF - left; - top = 0x1FFF - top; - break; - case 1: - temp = left; - left = top; - top = temp; - top = 0x1FFF - top; - break; - case 0: - break; - } - - left >>= 5; - top >>= 5; - bottom = top; - bottom += left; - left = -left; - left += top; - left += 0xF8; - bottom -= 8; + window_map_transform_to_map_coords(&left, &top); right = left; - top = bottom; + bottom = top; - color = 0xAB; - - gfx_fill_rect(dpi, left, top, right, bottom, color); + gfx_fill_rect(dpi, left, top, right, bottom, 0xAB); } } } - /** * * rct2: 0x0068CF23 @@ -783,9 +756,9 @@ static void window_map_scrollpaint() *g1_element = pushed_g1_element; if (w->selected_tab == 0) - window_map_paint_peep_overlay(w, dpi); + window_map_paint_peep_overlay(dpi); else - window_map_paint_train_overlay(w, dpi); + window_map_paint_train_overlay(dpi); RCT2_CALLPROC_X(0x68D8CE, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws the HUD rectangle on the map } From 13359d422011ee35c67b4b2958ab9540986f2717 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sun, 15 Feb 2015 01:04:48 +0100 Subject: [PATCH 4/9] Initial decompilation of window_map_paint_hud_rectangle --- src/windows/map.c | 144 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/src/windows/map.c b/src/windows/map.c index 26290c2860..8fe10200f1 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -725,6 +725,148 @@ static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) } } +/** +* +* rct2: 0x0068DABD +*/ +static void sub_68DABD(sint16 left, sint16 top, sint16 right, sint16 bottom, rct_drawpixelinfo *dpi){ + sint16 temp = right; + right = top; + top = temp; + if (left >= right) { + temp = left; + left = right; + right = temp; + } + if (top >= bottom) { + temp = top; + top = bottom; + bottom = temp; + } + + gfx_fill_rect(dpi, left, top, right, bottom, 0x38); +} + +/** +* +* rct2: 0x0068D8CE +*/ +static void window_map_paint_hud_rectangle(rct_window *w, rct_drawpixelinfo *dpi) +{ + //RCT2_CALLPROC_X(0x68D8CE, 0, 0, 0, 0, (int)w, (int)dpi, 0); + //return; + + static sint16 tab_x[4] = { 0xF8, 0x1F, 0xF8, 0xFFF8 }; + static sint16 tab_y[4] = { 0, 0x100, 0x200, 0x100 }; + + sint16 ax, bx, cx, dx; + + rct_window *main_window = window_get_main(); + if (main_window == NULL) + return; + rct_viewport *viewport = main_window->viewport; + if (viewport == NULL) + return; + + int ebp = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + + // top horizontal + + ax = viewport->view_x; + bx = viewport->view_y; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + cx += 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + ax = viewport->view_x; + bx = viewport->view_y; + ax += viewport->view_width; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + ax -= 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + // left vertical + + ax = viewport->view_x; + bx = viewport->view_y; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + dx += 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + ax = viewport->view_x; + bx = viewport->view_y; + bx += viewport->view_height; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + bx -= 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + //bottom horizontal + + ax = viewport->view_x; + bx = viewport->view_y; + bx += viewport->view_height; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + cx += 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + ax = viewport->view_x; + bx = viewport->view_y; + ax += viewport->view_width; + bx += viewport->view_height; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + ax -= 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + // right vertical + + ax = viewport->view_x; + bx = viewport->view_y; + ax += viewport->view_width; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + dx += 3; + sub_68DABD(ax, cx, bx, dx, dpi); + + ax = viewport->view_x; + bx = viewport->view_y; + ax += viewport->view_width; + bx += viewport->view_height; + ax >>= 5; + bx >>= 4; + ax += tab_x[ebp]; + bx += tab_y[ebp]; + cx = ax, dx = bx; + bx -= 3; + sub_68DABD(ax, cx, bx, dx, dpi); +} + /** * * rct2: 0x0068CF23 @@ -760,7 +902,7 @@ static void window_map_scrollpaint() else window_map_paint_train_overlay(dpi); - RCT2_CALLPROC_X(0x68D8CE, 0, 0, 0, 0, (int)w, (int)dpi, 0); //draws the HUD rectangle on the map + window_map_paint_hud_rectangle(w, dpi); } /** From baa7703451bb9bf992d6875982c4d31abd9caddc Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sun, 15 Feb 2015 16:22:27 +0100 Subject: [PATCH 5/9] Clean up window_map_paint_hud_rectangle --- src/windows/map.c | 172 ++++++++++++++++++---------------------------- 1 file changed, 65 insertions(+), 107 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index 8fe10200f1..c020f3ec78 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -726,29 +726,9 @@ static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) } /** -* -* rct2: 0x0068DABD -*/ -static void sub_68DABD(sint16 left, sint16 top, sint16 right, sint16 bottom, rct_drawpixelinfo *dpi){ - sint16 temp = right; - right = top; - top = temp; - if (left >= right) { - temp = left; - left = right; - right = temp; - } - if (top >= bottom) { - temp = top; - top = bottom; - bottom = temp; - } - - gfx_fill_rect(dpi, left, top, right, bottom, 0x38); -} - -/** -* +* The call to gfx_fill_rect was originally wrapped in sub_68DABD which made sure that topview_x; - bx = viewport->view_y; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - cx += 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x; + top = viewport->view_y; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left, top, left + 3, top, 0x38); - ax = viewport->view_x; - bx = viewport->view_y; - ax += viewport->view_width; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - ax -= 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x + viewport->view_width; + top = viewport->view_y; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left - 3, top, left, top, 0x38); // left vertical - ax = viewport->view_x; - bx = viewport->view_y; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - dx += 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x; + top = viewport->view_y; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left, top, left, top + 3, 0x38); - ax = viewport->view_x; - bx = viewport->view_y; - bx += viewport->view_height; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - bx -= 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x; + top = viewport->view_y + viewport->view_height; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left, top - 3, left, top, 0x38); //bottom horizontal - ax = viewport->view_x; - bx = viewport->view_y; - bx += viewport->view_height; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - cx += 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x; + top = viewport->view_y + viewport->view_height; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left, top, left + 3, top, 0x38); - ax = viewport->view_x; - bx = viewport->view_y; - ax += viewport->view_width; - bx += viewport->view_height; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - ax -= 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x + viewport->view_width; + top = viewport->view_y + viewport->view_height; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left - 3, top, left, top, 0x38); // right vertical - ax = viewport->view_x; - bx = viewport->view_y; - ax += viewport->view_width; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - dx += 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x + viewport->view_width; + top = viewport->view_y; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left, top, left, top + 3, 0x38); - ax = viewport->view_x; - bx = viewport->view_y; - ax += viewport->view_width; - bx += viewport->view_height; - ax >>= 5; - bx >>= 4; - ax += tab_x[ebp]; - bx += tab_y[ebp]; - cx = ax, dx = bx; - bx -= 3; - sub_68DABD(ax, cx, bx, dx, dpi); + left = viewport->view_x + viewport->view_width; + top = viewport->view_y + viewport->view_height; + left >>= 5; + top >>= 4; + left += offset_x; + top += offset_y; + gfx_fill_rect(dpi, left, top - 3, left, top, 0x38); } /** From c1df97cdd0458b50ffa33397449332c1dac29e6e Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sun, 15 Feb 2015 16:44:08 +0100 Subject: [PATCH 6/9] Simplify window_map_paint_hud_rectangle --- src/windows/map.c | 89 ++++++++++------------------------------------- 1 file changed, 18 insertions(+), 71 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index c020f3ec78..8c65ad0e73 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -726,21 +726,19 @@ static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) } /** -* The call to gfx_fill_rect was originally wrapped in sub_68DABD which made sure that topview_x >> 5) + offset_x; + sint16 right = ((viewport->view_x + viewport->view_width) >> 5) + offset_x; + sint16 top = (viewport->view_y >> 4) + offset_y; + sint16 bottom = ((viewport->view_y + viewport->view_height) >> 4) + offset_y; - left = viewport->view_x; - top = viewport->view_y; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; + // top horizontal lines gfx_fill_rect(dpi, left, top, left + 3, top, 0x38); + gfx_fill_rect(dpi, right - 3, top, right, top, 0x38); - left = viewport->view_x + viewport->view_width; - top = viewport->view_y; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; - gfx_fill_rect(dpi, left - 3, top, left, top, 0x38); - - // left vertical - - left = viewport->view_x; - top = viewport->view_y; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; + // left vertical lines gfx_fill_rect(dpi, left, top, left, top + 3, 0x38); + gfx_fill_rect(dpi, left, bottom - 3, left, bottom, 0x38); - left = viewport->view_x; - top = viewport->view_y + viewport->view_height; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; - gfx_fill_rect(dpi, left, top - 3, left, top, 0x38); + // bottom horizontal lines + gfx_fill_rect(dpi, left, bottom, left + 3, bottom, 0x38); + gfx_fill_rect(dpi, right - 3, bottom, right, bottom, 0x38); - //bottom horizontal - - left = viewport->view_x; - top = viewport->view_y + viewport->view_height; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; - gfx_fill_rect(dpi, left, top, left + 3, top, 0x38); - - left = viewport->view_x + viewport->view_width; - top = viewport->view_y + viewport->view_height; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; - gfx_fill_rect(dpi, left - 3, top, left, top, 0x38); - - // right vertical - - left = viewport->view_x + viewport->view_width; - top = viewport->view_y; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; - gfx_fill_rect(dpi, left, top, left, top + 3, 0x38); - - left = viewport->view_x + viewport->view_width; - top = viewport->view_y + viewport->view_height; - left >>= 5; - top >>= 4; - left += offset_x; - top += offset_y; - gfx_fill_rect(dpi, left, top - 3, left, top, 0x38); + // right vertical lines + gfx_fill_rect(dpi, right, top, right, top + 3, 0x38); + gfx_fill_rect(dpi, right, bottom - 3, right, bottom, 0x38); } /** @@ -860,7 +807,7 @@ static void window_map_scrollpaint() else window_map_paint_train_overlay(dpi); - window_map_paint_hud_rectangle(w, dpi); + window_map_paint_hud_rectangle(dpi); } /** From c6e690a71b0277d0161a372eb580d253744560e4 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sun, 15 Feb 2015 22:24:15 +0100 Subject: [PATCH 7/9] Removed gotos from window_map_paint_peep_overlay --- src/windows/map.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index 8c65ad0e73..2d5927e7a4 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -668,24 +668,21 @@ static void window_map_paint_peep_overlay(rct_drawpixelinfo *dpi) if ((peep->var_0C & 0x200) != 0) { if (peep->type == PEEP_TYPE_STAFF) { - if ((RCT2_GLOBAL(0x009AC861, uint16) & 8) == 0) - goto fill_rect; - color = 0x8A; - left--; - if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) != 0) - goto fill_rect; - color = 0xA; + if ((RCT2_GLOBAL(0x009AC861, uint16) & 8) != 0) { + color = 0x8A; + left--; + if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) == 0) + color = 0xA; + } } else { - if ((RCT2_GLOBAL(0x009AC861, uint16) & 2) == 0) - goto fill_rect; - color = 0xAC; - left--; - if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) != 0) - goto fill_rect; - color = 0x15; + if ((RCT2_GLOBAL(0x009AC861, uint16) & 2) != 0) { + color = 0xAC; + left--; + if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) == 0) + color = 0x15; + } } } - fill_rect: gfx_fill_rect(dpi, left, top, right, bottom, color); } } From bfe401c7789bb45a38018706102f100c27f58a97 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Mon, 16 Feb 2015 14:27:31 +0100 Subject: [PATCH 8/9] Refactor code related to map flashing, removed a small mistake related with it Removed code related to map flashing from title_update --- src/addresses.h | 2 ++ src/game.c | 27 +++++++++++++++------------ src/title.c | 11 ----------- src/windows/guest_list.c | 2 +- src/windows/map.c | 8 ++++---- src/windows/staff_list.c | 4 ++-- 6 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index e8618000c2..b288384800 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -126,6 +126,8 @@ #define RCT2_ADDRESS_RUN_INTRO_TICK_PART 0x009AC319 +#define RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS 0x009AC861 + #define RCT2_ADDRESS_RIDE_ENTRIES 0x009ACFA4 #define RCT2_ADDRESS_INSTALLED_OBJECT_LIST 0x009ADAE8 diff --git a/src/game.c b/src/game.c index 9d21b3bb08..a0a200527c 100644 --- a/src/game.c +++ b/src/game.c @@ -201,7 +201,7 @@ void update_palette_effects() void game_update() { - int i, numUpdates, tmp; + int i, numUpdates; // Handles picked-up peep and rain redraw redraw_peep_and_rain(); @@ -250,17 +250,20 @@ void game_update() RCT2_GLOBAL(0x009A8C28, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_VIEWPORT_SCROLLING; - RCT2_GLOBAL(0x009AC861, uint16) ^= (1 << 15); - RCT2_GLOBAL(0x009AC861, uint16) &= ~(1 << 1); - tmp = RCT2_GLOBAL(0x009AC861, uint16) & (1 << 0); - RCT2_GLOBAL(0x009AC861, uint16) &= ~(1 << 0); - if (!tmp) - RCT2_GLOBAL(0x009AC861, uint16) |= (1 << 1); - RCT2_GLOBAL(0x009AC861, uint16) &= ~(1 << 3); - tmp = RCT2_GLOBAL(0x009AC861, uint16) & (1 << 2); - RCT2_GLOBAL(0x009AC861, uint16) &= ~(1 << 2); - if (!tmp) - RCT2_GLOBAL(0x009AC861, uint16) |= (1 << 2); + + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) ^= (1 << 15); + + // Handle guest map flashing + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) &= ~(1 << 1); + if (RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) & (1 << 0)) + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) |= (1 << 1); + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) &= ~(1 << 0); + + // Handle staff map flashing + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) &= ~(1 << 3); + if (RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) & (1 << 2)) + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) |= (1 << 3); + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) &= ~(1 << 2); window_map_tooltip_update_visibility(); window_update_all(); diff --git a/src/title.c b/src/title.c index 87380c673b..4adfd8c253 100644 --- a/src/title.c +++ b/src/title.c @@ -277,17 +277,6 @@ void title_update() } RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~0x80; - RCT2_GLOBAL(0x009AC861, uint16) &= ~0x8000; - RCT2_GLOBAL(0x009AC861, uint16) &= ~0x02; - tmp = RCT2_GLOBAL(0x009AC861, uint16) & 0x01; - RCT2_GLOBAL(0x009AC861, uint16) &= ~0x01; - if (!tmp) - RCT2_GLOBAL(0x009AC861, uint16) |= 0x02; - RCT2_GLOBAL(0x009AC861, uint16) &= ~0x08; - tmp = RCT2_GLOBAL(0x009AC861, uint16) & 0x04; - RCT2_GLOBAL(0x009AC861, uint16) &= ~0x04; - if (!tmp) - RCT2_GLOBAL(0x009AC861, uint16) |= 0x04; window_map_tooltip_update_visibility(); window_update_all(); diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index cef844f839..7e4229bea5 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -598,7 +598,7 @@ static void window_guest_list_scrollpaint() if (_window_guest_list_selected_filter != -1) { if (window_guest_list_is_peep_in_filter(peep)) continue; - RCT2_GLOBAL(0x009AC861, uint16) |= 1; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) |= (1 << 0); peep->var_0C |= 0x200; } diff --git a/src/windows/map.c b/src/windows/map.c index 2d5927e7a4..1dca570427 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -668,17 +668,17 @@ static void window_map_paint_peep_overlay(rct_drawpixelinfo *dpi) if ((peep->var_0C & 0x200) != 0) { if (peep->type == PEEP_TYPE_STAFF) { - if ((RCT2_GLOBAL(0x009AC861, uint16) & 8) != 0) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) & (1 << 3)) != 0) { color = 0x8A; left--; - if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) == 0) + if ((RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) & (1 << 15)) == 0) color = 0xA; } } else { - if ((RCT2_GLOBAL(0x009AC861, uint16) & 2) != 0) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) & (1 << 1)) != 0) { color = 0xAC; left--; - if ((RCT2_GLOBAL(0x009AC861, uint16) & 0x8000) == 0) + if ((RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) & (1 << 15)) == 0) color = 0x15; } } diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 27655c2a74..f7197f25ca 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -315,10 +315,10 @@ void window_staff_list_update(rct_window *w) w->list_information_type = 0; } else { widget_invalidate(w, WIDX_STAFF_LIST_HANDYMEN_TAB + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8)); - RCT2_GLOBAL(0x009AC861, uint16) |= 2; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) |= (1 << 2); FOR_ALL_PEEPS(spriteIndex, peep) { if (peep->type == PEEP_TYPE_STAFF) { - peep->var_0C &= 0xFDFF; + peep->var_0C &= ~0x200; if (peep->staff_type == RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8)) { peep->var_0C |= 0x200; From 4c98d01a67b0bc25f5e4a9b949c0d31c5434411c Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Mon, 16 Feb 2015 22:19:19 +0100 Subject: [PATCH 9/9] Reduced frequency of flickering in map window by 4 --- src/game.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/game.c b/src/game.c index a0a200527c..47ce26f2ed 100644 --- a/src/game.c +++ b/src/game.c @@ -251,7 +251,11 @@ void game_update() RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_VIEWPORT_SCROLLING; - RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) ^= (1 << 15); + // the flickering frequency is reduced by 4, compared to the original + // it was done due to inability to reproduce original frequency + // and decision that the original one looks too fast + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, sint32) % 4 == 0) + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) ^= (1 << 15); // Handle guest map flashing RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) &= ~(1 << 1);