From d09134e64aafa739996a2b0ad500f36914d34967 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Mon, 15 Jan 2018 06:34:56 +0100 Subject: [PATCH] Decrease Window dependencies in Vehicle.cpp --- src/openrct2-ui/WindowManager.cpp | 22 +++++++++ src/openrct2/interface/Window.cpp | 24 +++++++++ src/openrct2/interface/Window.h | 7 +++ src/openrct2/interface/Window_internal.h | 4 -- src/openrct2/ride/Vehicle.cpp | 62 ++++++++---------------- src/openrct2/windows/Intent.h | 1 + 6 files changed, 74 insertions(+), 46 deletions(-) diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index 640dddcd95..c24cdecf3f 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -354,6 +354,28 @@ public: window_tile_inspector_auto_set_buttons(window); break; } + + case INTENT_ACTION_INVALIDATE_VEHICLE_WINDOW: + { + rct_vehicle * vehicle = static_cast(intent.GetPointerExtra(INTENT_EXTRA_VEHICLE)); + sint32 viewVehicleIndex; + Ride * ride; + rct_window * w; + + w = window_find_by_number(WC_RIDE, vehicle->ride); + if (w == nullptr) + return; + + ride = get_ride(vehicle->ride); + viewVehicleIndex = w->ride.view - 1; + if (viewVehicleIndex < 0 || viewVehicleIndex >= ride->num_vehicles) + return; + + if (vehicle->sprite_index != ride->vehicles[viewVehicleIndex]) + return; + + window_invalidate(w); + } } } diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 30f2818f3a..be86c4c02f 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -2703,4 +2703,28 @@ rct_viewport * window_get_viewport(rct_window * w) return w->viewport; } + +rct_window * window_get_listening() +{ + for (rct_window * w = RCT2_LAST_WINDOW; w >= g_window_list; w--) + { + if (w->viewport == nullptr) + { + continue; + } + + if (w->viewport->flags & VIEWPORT_FLAG_SOUND_ON) + { + return w; + } + } + + return nullptr; +} + +rct_windowclass window_get_classification(rct_window * window) +{ + return window->classification; +} + } diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 1603df5439..b398798e5d 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -549,6 +549,10 @@ typedef void (*close_callback)(); #define WINDOW_LIMIT_MAX 64 #define WINDOW_LIMIT_RESERVED 4 // Used to reserve room for the main viewport, toolbars, etc. +extern rct_window * gWindowFirst; +extern rct_window * gWindowNextSlot; +extern rct_window * gWindowAudioExclusive; + extern uint16 gWindowUpdateTicks; extern uint8 gToolbarDirtyFlags; extern uint16 gWindowMapFlashingFlags; @@ -723,6 +727,9 @@ extern uint8 _rideConstructionState2; extern bool _stationConstructed; extern bool _deferClose; +rct_window * window_get_listening(); +rct_windowclass window_get_classification(rct_window * window); + #ifdef __cplusplus } #endif diff --git a/src/openrct2/interface/Window_internal.h b/src/openrct2/interface/Window_internal.h index f988825825..21c7dbeae5 100644 --- a/src/openrct2/interface/Window_internal.h +++ b/src/openrct2/interface/Window_internal.h @@ -103,9 +103,5 @@ struct rct_window { // rct2: 0x01420078 extern rct_window g_window_list[WINDOW_LIMIT_MAX + WINDOW_LIMIT_RESERVED]; -extern rct_window * gWindowFirst; -extern rct_window * gWindowNextSlot; -extern rct_window * gWindowAudioExclusive; - } #endif diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index f8582f71b7..00a0155f34 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -25,7 +25,6 @@ #include "../core/Util.hpp" #include "../Game.h" #include "../interface/Viewport.h" -#include "../interface/Window_internal.h" #include "../localisation/Localisation.h" #include "../management/NewsItem.h" #include "../platform/platform.h" @@ -44,6 +43,7 @@ #include "Track.h" #include "TrackData.h" #include "VehicleData.h" +#include "../windows/Intent.h" static void vehicle_update(rct_vehicle * vehicle); @@ -880,7 +880,7 @@ static void vehicle_update_sound_params(rct_vehicle * vehicle) sint16 quarter_w = g_music_tracking_viewport->view_width / 4; sint16 quarter_h = g_music_tracking_viewport->view_height / 4; - if (gWindowAudioExclusive->classification == WC_MAIN_WINDOW) + if (window_get_classification(gWindowAudioExclusive) == WC_MAIN_WINDOW) { left -= quarter_w; bottom -= quarter_h; @@ -892,7 +892,7 @@ static void vehicle_update_sound_params(rct_vehicle * vehicle) sint16 right = g_music_tracking_viewport->view_width + left; sint16 top = g_music_tracking_viewport->view_height + bottom; - if (gWindowAudioExclusive->classification == WC_MAIN_WINDOW) + if (window_get_classification(gWindowAudioExclusive) == WC_MAIN_WINDOW) { right += quarter_w + quarter_w; top += quarter_h + quarter_h; @@ -1010,31 +1010,23 @@ static sint32 vehicle_get_sound_priority_factor(rct_vehicle * vehicle) static void vehicle_sounds_update_window_setup() { g_music_tracking_viewport = nullptr; - rct_viewport * viewport = nullptr; - rct_window * window = gWindowNextSlot; - while (true) - { - window--; - if (window < g_window_list) - { - break; - } - viewport = window->viewport; - if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) - { - break; - } - } - g_music_tracking_viewport = viewport; - if (viewport == nullptr) - return; - if (window) + rct_window * window = window_get_listening(); + if (window == nullptr) { - gWindowAudioExclusive = window; - const uint8 ZoomToVolume[MAX_ZOOM_LEVEL + 1] = { 0, 35, 70, 70 }; - gVolumeAdjustZoom = ZoomToVolume[viewport->zoom]; + return; } + + rct_viewport * viewport = window_get_viewport(window); + if (viewport == nullptr) + { + return; + } + + g_music_tracking_viewport = viewport; + gWindowAudioExclusive = window; + const uint8 ZoomToVolume[MAX_ZOOM_LEVEL + 1] = { 0, 35, 70, 70 }; + gVolumeAdjustZoom = ZoomToVolume[viewport->zoom]; } static uint8 vehicle_sounds_update_get_pan_volume(rct_vehicle_sound_params * sound_params) @@ -9873,21 +9865,7 @@ sint32 vehicle_get_total_num_peeps(rct_vehicle * vehicle) */ void vehicle_invalidate_window(rct_vehicle * vehicle) { - sint32 viewVehicleIndex; - Ride * ride; - rct_window * w; - - w = window_find_by_number(WC_RIDE, vehicle->ride); - if (w == nullptr) - return; - - ride = get_ride(vehicle->ride); - viewVehicleIndex = w->ride.view - 1; - if (viewVehicleIndex < 0 || viewVehicleIndex >= ride->num_vehicles) - return; - - if (vehicle->sprite_index != ride->vehicles[viewVehicleIndex]) - return; - - window_invalidate(w); + auto intent = Intent(INTENT_ACTION_INVALIDATE_VEHICLE_WINDOW); + intent.putExtra(INTENT_EXTRA_VEHICLE, vehicle); + context_broadcast_intent(&intent); } diff --git a/src/openrct2/windows/Intent.h b/src/openrct2/windows/Intent.h index b3c600a513..92b05173cc 100644 --- a/src/openrct2/windows/Intent.h +++ b/src/openrct2/windows/Intent.h @@ -88,6 +88,7 @@ extern "C" { INTENT_ACTION_SET_TILE_INSPECTOR_PAGE, INTENT_ACTION_SET_TILE_INSPECTOR_BUTTONS, INTENT_ACTION_REFRESH_STAFF_LIST, + INTENT_ACTION_INVALIDATE_VEHICLE_WINDOW, }; Intent *intent_create(rct_windowclass clss);