mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 19:13:07 +01:00
Extend dropdowns to hold up to 64 items (with bugs)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user