diff --git a/src/interface/viewport.c b/src/interface/viewport.c index c3bcf35d45..671a0c61fd 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -442,22 +442,11 @@ void viewport_update_position(rct_window *window) rct_viewport* viewport = window->viewport; if (!viewport)return; - if (window->viewport_target_sprite != -1){ - rct_sprite* sprite = &g_sprite_list[window->viewport_target_sprite]; - - int height = (map_element_height(0xFFFF & sprite->unknown.x, 0xFFFF & sprite->unknown.y) & 0xFFFF) - 16; - int underground = sprite->unknown.z < height; - - viewport_set_underground_flag(underground, window, viewport); - - int center_x, center_y; - center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); - - sub_6E7DE1(center_x, center_y, window, viewport); + if (window->viewport_target_sprite != -1) { + viewport_update_sprite_follow(window); return; } - sint16 x = viewport->view_width / 2 + window->saved_view_x; sint16 y = viewport->view_height / 2 + window->saved_view_y; sint16 z; @@ -547,6 +536,23 @@ void viewport_update_position(rct_window *window) sub_6E7DE1(x, y, window, viewport); } +void viewport_update_sprite_follow(rct_window *window) +{ + if (window->viewport_target_sprite != -1 && window->viewport){ + rct_sprite* sprite = &g_sprite_list[window->viewport_target_sprite]; + + int height = (map_element_height(0xFFFF & sprite->unknown.x, 0xFFFF & sprite->unknown.y) & 0xFFFF) - 16; + int underground = sprite->unknown.z < height; + + viewport_set_underground_flag(underground, window, window->viewport); + + int center_x, center_y; + center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); + + sub_6E7DE1(center_x, center_y, window, window->viewport); + } +} + /** * * rct2: 0x00685C02 diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 6cbcd5b264..7671852ceb 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -96,6 +96,7 @@ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_view void viewport_create(rct_window *w, int x, int y, int width, int height, int zoom, int center_x, int center_y, int center_z, char flags, sint16 sprite); void viewport_update_pointers(); void viewport_update_position(rct_window *window); +void viewport_update_sprite_follow(rct_window *window); void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, int top, int right, int bottom); void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom); diff --git a/src/openrct2.c b/src/openrct2.c index cf8e99cc94..76cf444a9a 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -27,6 +27,7 @@ #include "game.h" #include "hook.h" #include "interface/window.h" +#include "interface/viewport.h" #include "localisation/localisation.h" #include "network/http.h" #include "openrct2.h" @@ -326,7 +327,9 @@ static void openrct2_loop() } // Viewports need to be updated to reduce chopiness of those which follow sprites - window_update_all_viewports(); + for (rct_window *w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) { + viewport_update_sprite_follow(w); + } platform_process_messages(); rct2_draw();