From 89ad0cc7698de96949a17c016ef0a573518e98cd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 14 Apr 2016 22:53:00 +0100 Subject: [PATCH] store windows in openrct2 memory and increase max Allocate a bigger window list and viewport list in OpenRCT2 static memory and move over all references from RCT2. This also removes the 'active' viewport pointer list and instead changes everything to just enumerate the whole viewport list --- src/addresses.h | 16 ++++++++-------- src/audio/audio.c | 4 ++-- src/drawing/drawing.c | 2 +- src/drawing/rain.c | 4 ++-- src/input.c | 4 ++-- src/interface/viewport.c | 35 ++++++++++++++--------------------- src/interface/viewport.h | 4 +++- src/interface/window.c | 18 +++++++++--------- src/interface/window.h | 7 ++++++- src/ride/vehicle.c | 4 ++-- src/scenario.c | 2 +- src/world/map.c | 22 +++++++++++----------- src/world/sprite.c | 6 +++--- 13 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index bc235a15f4..7269fbd960 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -517,14 +517,6 @@ #define RCT2_ADDRESS_TOOLTIP_TEXT_BUFFER 0x0141FE44 #define RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT 0x01420044 -#define RCT2_ADDRESS_WINDOW_LIST 0x01420078 -#define RCT2_ADDRESS_NEW_WINDOW_PTR 0x014234B8 - -#define RCT2_ADDRESS_VIEWPORT_LIST 0x014234BC -// Null Terminated list of active viewport pointers. -// This is also the end of RCT2_ADDRESS_VIEWPORT_LIST. -#define RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY 0x01423570 - #define RCT2_ADDRESS_HCURSOR_START 0x01423598 #define RCT2_ADDRESS_HCURSOR_ARROW 0x01423598 #define RCT2_ADDRESS_HCURSOR_BLANK 0x0142359C @@ -624,6 +616,14 @@ #define RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG 0x009AB4C6 #define RCT2_ADDRESS_NAUSEA_THRESHOLDS 0x00982390 //uint16 +#define RCT2_ADDRESS_WINDOW_LIST 0x01420078 +#define RCT2_ADDRESS_NEW_WINDOW_PTR 0x014234B8 + +#define RCT2_ADDRESS_VIEWPORT_LIST 0x014234BC +// Null Terminated list of active viewport pointers. +// This is also the end of RCT2_ADDRESS_VIEWPORT_LIST. +#define RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY 0x01423570 + #pragma endregion /** diff --git a/src/audio/audio.c b/src/audio/audio.c index ff91b26ed5..d98a015b2c 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -144,10 +144,10 @@ rct_audio_params audio_get_params_from_location(int soundId, const rct_xyz16 *lo uint8 rotation = get_current_rotation(); rct_xy16 pos2 = coordinate_3d_to_2d(location, rotation); - rct_window *window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); + rct_window *window = gWindowNextSlot; while (true) { window--; - if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) + if (window < g_window_list) break; rct_viewport *viewport = window->viewport; diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 3c98306f68..b11d05ce22 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -337,7 +337,7 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom) windowDPI->height = bottom - top; windowDPI->pitch = screenDPI->width + screenDPI->pitch + left - right; - for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) { + for (w = g_window_list; w < gWindowNextSlot; w++) { if (w->flags & WF_TRANSPARENT) continue; if (right <= w->x || bottom <= w->y) diff --git a/src/drawing/rain.c b/src/drawing/rain.c index 89e5db3e1c..f2c7d5a3dd 100644 --- a/src/drawing/rain.c +++ b/src/drawing/rain.c @@ -71,7 +71,7 @@ static void call_draw_rain_func(rct_window* w, short left, short right, short to */ static void draw_rain_window(rct_window* original_w, short left, short right, short top, short bottom, uint32 draw_rain_func) { - rct_window* newWindow = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); + rct_window* newWindow = gWindowNextSlot; rct_window* w = original_w + 1; // Start from second window for (; ; w++) { @@ -139,7 +139,7 @@ static void draw_rain_animation(uint32 draw_rain_func) short top = screenDPI->y; short bottom = top + screenDPI->height; - rct_window* newWindow = (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)); + rct_window* newWindow = gWindowNextSlot; for (rct_window* w = g_window_list; w < newWindow; w++) { draw_rain_window(w, left, right, top, bottom, draw_rain_func); diff --git a/src/input.c b/src/input.c index e34c8f84ae..1dd20e5094 100644 --- a/src/input.c +++ b/src/input.c @@ -139,7 +139,7 @@ void game_handle_input() } if (RCT2_GLOBAL(0x009ABDF2, uint8) != 0) { - for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) + for (w = g_window_list; w < gWindowNextSlot; w++) window_event_unknown_07_call(w); sub_6EA73F(); @@ -166,7 +166,7 @@ void game_handle_input() } } - for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) + for (w = g_window_list; w < gWindowNextSlot; w++) window_event_unknown_08_call(w); } diff --git a/src/interface/viewport.c b/src/interface/viewport.c index e7afdebfe9..6f7c98c65b 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -38,12 +38,9 @@ #include "viewport.h" #include "window.h" -#define RCT2_FIRST_VIEWPORT (RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_LIST, rct_viewport)) -#define RCT2_LAST_VIEWPORT (RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport) - 1) - //#define DEBUG_SHOW_DIRTY_BOX -rct_viewport* g_viewport_list = RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_LIST, rct_viewport); +rct_viewport g_viewport_list[MAX_VIEWPORT_COUNT]; typedef struct paint_struct paint_struct; @@ -92,14 +89,13 @@ void viewport_init_all() colours_init_maps(); // Setting up windows - RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) = g_window_list; + gWindowNextSlot = g_window_list; RCT2_GLOBAL(0x01423604, sint32) = 0; // Setting up viewports - for (int i = 0; i < 9; i++) { + for (int i = 0; i < MAX_VIEWPORT_COUNT; i++) { g_viewport_list[i].width = 0; } - RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*) = NULL; // ? gInputFlags = 0; @@ -167,12 +163,17 @@ 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) { - rct_viewport* viewport; - for (viewport = g_viewport_list; viewport->width != 0; viewport++){ - if (viewport > RCT2_LAST_VIEWPORT){ - error_string_quit(0xFF000001, -1); + rct_viewport* viewport = NULL; + for (int i = 0; i < MAX_VIEWPORT_COUNT; i++) { + if (g_viewport_list[i].width == 0) { + viewport = &g_viewport_list[i]; + break; } } + if (viewport == NULL) { + log_error("No more viewport slots left to allocate."); + return; + } viewport->x = x; viewport->y = y; @@ -220,15 +221,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo */ void viewport_update_pointers() { - rct_viewport *viewport; - rct_viewport **vp = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - // The last possible viewport entry is 1 before what is the active viewport_ptr_array - for (viewport = g_viewport_list; viewport <= RCT2_LAST_VIEWPORT; viewport++) - if (viewport->width != 0) - *vp++ = viewport; - - *vp = NULL; } /** @@ -324,7 +317,7 @@ void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy) void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) { // sub-divide by intersecting windows - if (window < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)) + if (window < gWindowNextSlot) { // skip current window and non-intersecting windows if (viewport == window->viewport || @@ -445,7 +438,7 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_d rct_window* orignal_w = w; int left = 0, right = 0, top = 0, bottom = 0; - for (; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++){ + for (; w < gWindowNextSlot; w++){ if (!(w->flags & WF_TRANSPARENT)) continue; if (w->viewport == viewport) continue; diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 55086127c3..d05fce6a50 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -88,8 +88,10 @@ typedef struct { }; } viewport_interaction_info; +#define MAX_VIEWPORT_COUNT MAX_WINDOW_COUNT + // rct2: 0x014234BC -extern rct_viewport* g_viewport_list; +extern rct_viewport g_viewport_list[MAX_VIEWPORT_COUNT]; void viewport_init_all(); void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_viewport* viewport); diff --git a/src/interface/window.c b/src/interface/window.c index 3900f8a752..380b7d8450 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -33,13 +33,13 @@ #include "../localisation/localisation.h" #include "../cursors.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) -#define RCT2_NEW_WINDOW (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)) +#define RCT2_FIRST_WINDOW (g_window_list) +#define RCT2_LAST_WINDOW (gWindowNextSlot - 1) +#define RCT2_NEW_WINDOW (gWindowNextSlot) -#define MAX_NUMBER_WINDOWS 11 - -rct_window* g_window_list = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window); +rct_window g_window_list[MAX_WINDOW_COUNT]; +rct_window * gWindowFirst; +rct_window * gWindowNextSlot; uint16 TextInputDescriptionArgs[4]; widget_identifier gCurrentTextBox = { { 255, 0 }, 0 }; @@ -393,7 +393,7 @@ rct_window *window_create(int x, int y, int width, int height, rct_window_event_ { rct_window *w; // Check if there are any window slots left - if (RCT2_NEW_WINDOW >= &(g_window_list[MAX_NUMBER_WINDOWS])) { + if (RCT2_NEW_WINDOW >= &(g_window_list[MAX_WINDOW_COUNT])) { // Close least recently used window for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT | WF_NO_AUTO_CLOSE))) @@ -1196,7 +1196,7 @@ rct_window *window_bring_to_front_by_number(rct_windowclass cls, rct_windownumbe */ void window_push_others_right(rct_window* window) { - for (rct_window* w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) { + for (rct_window* w = g_window_list; w < gWindowNextSlot; w++) { if (w == window) continue; if (w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT)) @@ -1351,7 +1351,7 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) rct_window* w2 = w; while (1) { w2++; - if (w2 >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)) { + if (w2 >= gWindowNextSlot) { found = 1; break; } diff --git a/src/interface/window.h b/src/interface/window.h index a101157dc9..cb9184b997 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -503,8 +503,13 @@ extern modal_callback gLoadSaveCallback; typedef void (*close_callback)(); +#define MAX_WINDOW_COUNT 64 + // rct2: 0x01420078 -extern rct_window* g_window_list; +extern rct_window g_window_list[MAX_WINDOW_COUNT]; + +extern rct_window * gWindowFirst; +extern rct_window * gWindowNextSlot; // rct2: 0x00F635EE extern ride_list_item _window_track_list_item; diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 08e20b191e..933ffb3924 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -296,10 +296,10 @@ void vehicle_sounds_update() if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1 && !gGameSoundsOff && gConfigSound.sound_enabled && !gOpenRCT2Headless) { RCT2_GLOBAL(0x00F438A4, rct_viewport*) = (rct_viewport*)-1; rct_viewport* viewport = (rct_viewport*)-1; - rct_window* window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); + rct_window* window = gWindowNextSlot; while (1) { window--; - if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) { + if (window < g_window_list) { break; } viewport = window->viewport; diff --git a/src/scenario.c b/src/scenario.c index 41eab2fd9a..5b8942df8b 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -380,7 +380,7 @@ void scenario_end() rct_window* w; window_close_by_class(WC_DROPDOWN); - for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++){ + for (w = g_window_list; w < gWindowNextSlot; w++){ if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) window_close(w); } diff --git a/src/world/map.c b/src/world/map.c index 145b387b7f..d0c48b4b3a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3868,7 +3868,6 @@ void map_get_bounding_box(int ax, int ay, int bx, int by, int *left, int *top, i void map_invalidate_selection_rect() { int x0, y0, x1, y1, left, right, top, bottom; - rct_viewport **vp; if (!(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0))) return; @@ -3883,10 +3882,11 @@ void map_invalidate_selection_rect() bottom += 32; top -= 32 + 2080; - vp = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - while (*vp != NULL) { - viewport_invalidate(*vp, left, top, right, bottom); - vp++; + for (int i = 0; i < MAX_VIEWPORT_COUNT; i++) { + rct_viewport *viewport = &g_viewport_list[i]; + if (viewport->width != 0) { + viewport_invalidate(viewport, left, top, right, bottom); + } } } @@ -4767,8 +4767,9 @@ static void translate_3d_to_2d(int rotation, int *x, int *y) void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) { + if (gOpenRCT2Headless) return; + int x1, y1, x2, y2; - rct_viewport **vp; x += 16; y += 16; @@ -4779,12 +4780,11 @@ void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) x2 = x + 32; y2 = y + 32 - z0; - vp = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - while (!gOpenRCT2Headless && *vp != 0) { - if (maxZoom == -1 || (*vp)->zoom <= maxZoom) { - viewport_invalidate(*vp, x1, y1, x2, y2); + for (int i = 0; i < MAX_VIEWPORT_COUNT; i++) { + rct_viewport *viewport = &g_viewport_list[i]; + if (viewport->width != 0 && (maxZoom == -1 || viewport->zoom <= maxZoom)) { + viewport_invalidate(viewport, x1, y1, x2, y2); } - vp++; } } diff --git a/src/world/sprite.c b/src/world/sprite.c index 5f6ba1e77e..9e610ec2ab 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -41,9 +41,9 @@ static void invalidate_sprite_max_zoom(rct_sprite *sprite, int maxZoom) { if (sprite->unknown.sprite_left == SPRITE_LOCATION_NULL) return; - for (rct_viewport** viewport_p = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); *viewport_p != NULL; viewport_p++) { - rct_viewport* viewport = *viewport_p; - if (viewport->zoom <= maxZoom) { + for (int i = 0; i < MAX_VIEWPORT_COUNT; i++) { + rct_viewport *viewport = &g_viewport_list[i]; + if (viewport->width != 0 && viewport->zoom <= maxZoom) { viewport_invalidate( viewport, sprite->unknown.sprite_left,