From d71ca1f376f3f676bf43ace79d6aa3835bc85a00 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 14 Oct 2015 16:19:50 +0200 Subject: [PATCH] Extend dropdowns to hold up to 64 items (with bugs) --- src/input.c | 6 +++--- src/windows/dropdown.c | 16 ++++++++-------- src/windows/dropdown.h | 4 ++-- src/windows/ride.c | 11 ++++++----- src/windows/ride_construction.c | 2 +- src/windows/staff.c | 2 +- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/input.c b/src/input.c index eb3f5809e6..d10e2f9232 100644 --- a/src/input.c +++ b/src/input.c @@ -1126,7 +1126,7 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi if (dropdown_index == -1)goto dropdown_cleanup; // _dropdown_unknown?? highlighted? - if (dropdown_index < 32 && RCT2_GLOBAL(0x009DED34, sint32) & (1 << dropdown_index))goto dropdown_cleanup; + if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index))goto dropdown_cleanup; // gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)goto dropdown_cleanup; @@ -1210,7 +1210,7 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi } // _dropdown_unknown?? highlighted? - if (dropdown_index < 32 && RCT2_GLOBAL(0x009DED34, sint32) & (1 << dropdown_index))return; + if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index))return; // gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)return; @@ -1670,4 +1670,4 @@ static void update_cursor_position() // write tutorial cursor position break; } -} \ No newline at end of file +} diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 4d900297e4..cce9070f9f 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -53,8 +53,8 @@ int gDropdownNumItems; uint16 gDropdownItemsFormat[64]; sint64 gDropdownItemsArgs[64]; // Replaces 0x009DED38 -uint32 gDropdownItemsChecked; -uint32 *gDropdownItemsDisabled = RCT2_ADDRESS(0x009DED34, uint32); +uint64 gDropdownItemsChecked; +uint64 gDropdownItemsDisabled; bool gDropdownIsColour; int gDropdownLastColourHover; @@ -179,7 +179,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo // Input state _dropdown_highlighted_index = -1; - *gDropdownItemsDisabled = 0; + gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; @@ -258,7 +258,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl // Input state _dropdown_highlighted_index = -1; - *gDropdownItemsDisabled = 0; + gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; @@ -329,16 +329,16 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) ); } else { // Text item - if (i < 32) - if (gDropdownItemsChecked & (1 << i)) + if (i < 64) + if (gDropdownItemsChecked & (1ULL << i)) item++; // Calculate colour colour = w->colours[0] & 0x7F; if (i == _dropdown_highlighted_index) colour = 2; - if (*gDropdownItemsDisabled & (1 << i)) - if (i < 32) + if (gDropdownItemsDisabled & (1ULL << i)) + if (i < 64) colour = (w->colours[0] & 0x7F) | 0x40; // Draw item string diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index 2a4789c453..fbaee52ee4 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -35,8 +35,8 @@ extern int gAppropriateImageDropdownItemsPerRow[]; extern int gDropdownNumItems; extern uint16 gDropdownItemsFormat[64]; extern sint64 gDropdownItemsArgs[64]; -extern uint32 gDropdownItemsChecked; -extern uint32 *gDropdownItemsDisabled; +extern uint64 gDropdownItemsChecked; +extern uint64 gDropdownItemsDisabled; extern bool gDropdownIsColour; extern int gDropdownLastColourHover; diff --git a/src/windows/ride.c b/src/windows/ride.c index 23510f5f7e..d6a99ea1cb 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1763,7 +1763,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { j = 2; for (i = 0; i < ride->num_vehicles; i++) { - RCT2_GLOBAL(0x009DED34, uint32) |= j; + gDropdownItemsDisabled |= j; j <<= 1; } } @@ -2336,7 +2336,8 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi selectedIndex = -1; numItems = 0; - for (; rideTypeIterator<=rideTypeIteratorMax; rideTypeIterator++) { + // Dropdowns with more items start acting weird, so cap it to 63. + for (; rideTypeIterator<=rideTypeIteratorMax && numItems<=63; rideTypeIterator++) { if(selectionShouldBeExpanded && ride_type_has_flag(rideTypeIterator, RIDE_TYPE_FLAG_FLAT_RIDE)) continue; @@ -2379,7 +2380,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1 << selectedIndex); + gDropdownItemsChecked = (1ULL << selectedIndex); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: window_dropdown_show_text_custom_width( @@ -3421,7 +3422,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc } if ((ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) == 0) { - *gDropdownItemsDisabled = (1 << 0); + gDropdownItemsDisabled = (1 << 0); } } break; @@ -4703,7 +4704,7 @@ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, r ); RCT2_GLOBAL(0x009DEBA2, sint16) = 0; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) - RCT2_GLOBAL(0x009DED34, uint32) |= 2; + gDropdownItemsDisabled |= 2; } /** diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 85e09df891..91d47ad76f 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3175,7 +3175,7 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, widget->right - widget->left ); - *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); + gDropdownItemsDisabled = (uint64)RCT2_GLOBAL(0x00F4409C, uint32); } /** diff --git a/src/windows/staff.c b/src/windows/staff.c index 143f9bb3fd..423564f341 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -538,7 +538,7 @@ void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* // Disable clear patrol area if no area is set. if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] & 2)) { - RCT2_GLOBAL(0x009DED34, sint32) |= 1 << 1; + gDropdownItemsDisabled |= (1ULL << 1); } }