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,