diff --git a/src/input.c b/src/input.c index d10e2f9232..c2d63a34c4 100644 --- a/src/input.c +++ b/src/input.c @@ -1123,13 +1123,17 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi if (w->classification == WC_DROPDOWN) { dropdown_index = dropdown_index_from_point(x, y, w); - if (dropdown_index == -1)goto dropdown_cleanup; + if (dropdown_index == -1) { + goto dropdown_cleanup; + } - // _dropdown_unknown?? highlighted? - if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << 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; + if (gDropdownItemsFormat[dropdown_index] == 0) { + goto dropdown_cleanup; + } } else { if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex) @@ -1209,14 +1213,15 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi window_tooltip_show(STR_COLOUR_NAMES_START + dropdown_index, x, y); } - // _dropdown_unknown?? highlighted? - if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << 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; + if (gDropdownItemsFormat[dropdown_index] == 0) { + return; + } - // _dropdown_highlighted_index - RCT2_GLOBAL(0x009DEBA2, sint16) = dropdown_index; + gDropdownHighlightedIndex = dropdown_index; window_invalidate_by_class(WC_DROPDOWN); } else { gDropdownLastColourHover = -1; diff --git a/src/windows/banner.c b/src/windows/banner.c index a8bba69e64..6ff97c3bb4 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -239,7 +239,7 @@ static void window_banner_mousedown(int widgetIndex, rct_window*w, rct_widget* w 13, widget->right - widget->left - 3); - gDropdownItemsChecked = 1 << (banner->text_colour - 1); + dropdown_set_checked(banner->text_colour - 1, true); break; } } diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index cce9070f9f..a593e4c69f 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -47,16 +47,38 @@ int _dropdown_num_columns; int _dropdown_num_rows; int _dropdown_item_width; int _dropdown_item_height; -int _dropdown_highlighted_index; int gDropdownNumItems; uint16 gDropdownItemsFormat[64]; sint64 gDropdownItemsArgs[64]; -// Replaces 0x009DED38 uint64 gDropdownItemsChecked; uint64 gDropdownItemsDisabled; bool gDropdownIsColour; int gDropdownLastColourHover; +int gDropdownHighlightedIndex; + +bool dropdown_is_checked(int index) +{ + return gDropdownItemsChecked & (1ULL << index); +} + +void dropdown_set_checked(int index, bool value) +{ + if (value) { + gDropdownItemsChecked |= 1ULL << index; + } else { + gDropdownItemsChecked &= ~(1ULL << index); + } +} + +void dropdown_set_disabled(int index, bool value) +{ + if (value) { + gDropdownItemsDisabled |= 1ULL << index; + } else { + gDropdownItemsDisabled &= ~(1ULL << index); + } +} static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -178,19 +200,11 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo w->colours[0] = colour; // Input state - _dropdown_highlighted_index = -1; + gDropdownHighlightedIndex = -1; gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; - RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; - - // Copy the following properties until all use of it is decompiled - RCT2_GLOBAL(0x009DEBA0, sint16) = gDropdownNumItems; - RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns; - RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows; - RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width; - RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height; - RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index; gDropdownIsColour = false; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; } /** @@ -257,18 +271,13 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl w->colours[0] = colour; // Input state - _dropdown_highlighted_index = -1; + gDropdownHighlightedIndex = -1; gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; // Copy the following properties until all use of it is decompiled - RCT2_GLOBAL(0x009DEBA0, sint16) = gDropdownNumItems; - RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns; - RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows; - RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width; - RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height; - RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index; + gDropdownHighlightedIndex = gDropdownHighlightedIndex; gDropdownIsColour = false; } @@ -283,7 +292,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); - _dropdown_highlighted_index = RCT2_GLOBAL(0x009DEBA2, sint16); + gDropdownHighlightedIndex = gDropdownHighlightedIndex; for (int i = 0; i < gDropdownNumItems; i++) { cell_x = i % _dropdown_num_columns; cell_y = i / _dropdown_num_columns; @@ -306,7 +315,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) } } else { // - if (i == _dropdown_highlighted_index) { + if (i == gDropdownHighlightedIndex) { l = w->x + 2 + (cell_x * _dropdown_item_width); t = w->y + 2 + (cell_y * _dropdown_item_height); r = l + _dropdown_item_width - 1; @@ -318,7 +327,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) if (item == (uint16)-1 || item == (uint16)-2) { // Image item image = *((uint32*)&gDropdownItemsArgs[i]); - if (item == (uint16)-2 && _dropdown_highlighted_index == i) + if (item == (uint16)-2 && gDropdownHighlightedIndex == i) image++; gfx_draw_sprite( @@ -329,13 +338,15 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) ); } else { // Text item - if (i < 64) - if (gDropdownItemsChecked & (1ULL << i)) + if (i < 64) { + if (dropdown_is_checked(i)) { item++; + } + } // Calculate colour colour = w->colours[0] & 0x7F; - if (i == _dropdown_highlighted_index) + if (i == gDropdownHighlightedIndex) colour = 2; if (gDropdownItemsDisabled & (1ULL << i)) if (i < 64) @@ -358,7 +369,8 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) /* New function based on 6e914e * returns -1 if index is invalid */ -int dropdown_index_from_point(int x, int y, rct_window* w){ +int dropdown_index_from_point(int x, int y, rct_window *w) +{ int top = y - w->y - 2; if (top < 0) return -1; @@ -367,20 +379,14 @@ int dropdown_index_from_point(int x, int y, rct_window* w){ left -= 2; if (left < 0) return -1; - // _dropdown_item_width - int column_no = left / RCT2_GLOBAL(0x009DED40, sint32); - // _dropdown_no_columns - if (column_no >= RCT2_GLOBAL(0x009DED44, sint32)) return -1; - - // _dropdown_item_height - int row_no = top / RCT2_GLOBAL(0x9DED3C, uint8); - // _dropdown_no_rows - if (row_no >= RCT2_GLOBAL(0x009DED48, sint32)) return -1; + int column_no = left / _dropdown_item_width; + if (column_no >= _dropdown_num_columns) return -1; - // _dropdown_no_columns - int dropdown_index = row_no * RCT2_GLOBAL(0x009DED44, sint32) + column_no; - // _dropdown_no_items - if (dropdown_index >= RCT2_GLOBAL(0x009DEBA0, sint16)) return -1; + int row_no = top / _dropdown_item_height; + if (row_no >= _dropdown_num_rows) return -1; + + int dropdown_index = row_no * _dropdown_num_columns + column_no; + if (dropdown_index >= gDropdownNumItems) return -1; return dropdown_index; } @@ -413,7 +419,7 @@ void window_dropdown_show_colour_available(rct_window *w, rct_widget *widget, ui for (i = 0; i < 32; i++) { if (availableColours & (1 << i)) { if (selectedColour == i) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; gDropdownItemsFormat[i] = 0xFFFE; gDropdownItemsArgs[i] = ((uint64)i << 32) | (0x20000000 | (i << 19) | 5059); diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index fbaee52ee4..5096e2ae92 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -39,6 +39,10 @@ extern uint64 gDropdownItemsChecked; extern uint64 gDropdownItemsDisabled; extern bool gDropdownIsColour; extern int gDropdownLastColourHover; +extern int gDropdownHighlightedIndex; + +void dropdown_set_checked(int index, bool value); +void dropdown_set_disabled(int index, bool value); void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items); void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colour, uint8 flags, int num_items, int width); diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index fd67695778..1712de45fd 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -496,7 +496,7 @@ static void window_editor_objective_options_show_objective_dropdown(rct_window * objectiveType = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8); for (i = 0; i < numItems; i++) { if (gDropdownItemsArgs[i] - STR_OBJECTIVE_DROPDOWN_NONE == objectiveType) { - gDropdownItemsChecked = (1 << i); + dropdown_set_checked(i, true); break; } } @@ -522,7 +522,7 @@ static void window_editor_objective_options_show_climate_dropdown(rct_window *w) 4, dropdownWidget->right - dropdownWidget->left - 3 ); - gDropdownItemsChecked = (1 << RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8)); + dropdown_set_checked(RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8), true); } static void window_editor_objective_options_show_category_dropdown(rct_window *w) @@ -546,7 +546,7 @@ static void window_editor_objective_options_show_category_dropdown(rct_window *w 5, dropdownWidget->right - dropdownWidget->left - 3 ); - gDropdownItemsChecked = (1 << s6Info->category); + dropdown_set_checked(s6Info->category, true); } static void window_editor_objective_options_arg_1_increase(rct_window *w) diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index bb6c71fa4f..24ee1454e4 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -1035,7 +1035,7 @@ static void window_editor_scenario_options_park_mousedown(int widgetIndex, rct_w dropdownWidget->right - dropdownWidget->left - 3 ); - gDropdownItemsChecked = 1 << (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY ? 0 : 1); + dropdown_set_checked((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY ? 0 : 1), true); break; } } diff --git a/src/windows/finances.c b/src/windows/finances.c index b61e436346..11ad495297 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1298,7 +1298,7 @@ static void window_finances_research_mousedown(int widgetIndex, rct_window *w, r ); int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); - gDropdownItemsChecked = (1 << currentResearchLevel); + dropdown_set_checked(currentResearchLevel, true); } /** diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 3f3bd0cd2f..d1b097b92b 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -352,7 +352,7 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = STR_PAGE_1 + i; } - gDropdownItemsChecked = (1 << _window_guest_list_selected_view); + dropdown_set_checked(_window_guest_list_selected_view, true); break; case WIDX_INFO_TYPE_DROPDOWN_BUTTON: widget = &w->widgets[widgetIndex - 1]; @@ -372,7 +372,7 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge widget->right - widget->left - 3 ); - gDropdownItemsChecked = (1 << _window_guest_list_selected_view); + dropdown_set_checked(_window_guest_list_selected_view, true); break; } } diff --git a/src/windows/land.c b/src/windows/land.c index 94f9e4200b..82cb1e99cd 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -222,7 +222,7 @@ static void window_land_mousedown(int widgetIndex, rct_window*w, rct_widget* wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; if (window_land_floor_texture_order[i] == _selectedFloorTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -239,7 +239,7 @@ static void window_land_mousedown(int widgetIndex, rct_window*w, rct_widget* wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; if (window_land_wall_texture_order[i] == _selectedWallTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -268,7 +268,7 @@ static void window_land_dropdown(rct_window *w, int widgetIndex, int dropdownInd switch (widgetIndex) { case WIDX_FLOOR: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _selectedFloorTexture : @@ -284,7 +284,7 @@ static void window_land_dropdown(rct_window *w, int widgetIndex, int dropdownInd break; case WIDX_WALL: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _selectedWallTexture : diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c index e641556f2c..87d9fe573e 100644 --- a/src/windows/mapgen.c +++ b/src/windows/mapgen.c @@ -536,7 +536,7 @@ static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; if (window_land_floor_texture_order[i] == _floorTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -553,7 +553,7 @@ static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; if (window_land_wall_texture_order[i] == _wallTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -575,7 +575,7 @@ static void window_mapgen_base_dropdown(rct_window *w, int widgetIndex, int drop switch (widgetIndex) { case WIDX_FLOOR_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _floorTexture : @@ -591,7 +591,7 @@ static void window_mapgen_base_dropdown(rct_window *w, int widgetIndex, int drop break; case WIDX_WALL_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _wallTexture : @@ -859,7 +859,7 @@ static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_ gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; if (window_land_floor_texture_order[i] == _floorTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -876,7 +876,7 @@ static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_ gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; if (window_land_wall_texture_order[i] == _wallTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -898,7 +898,7 @@ static void window_mapgen_simplex_dropdown(rct_window *w, int widgetIndex, int d switch (widgetIndex) { case WIDX_SIMPLEX_FLOOR_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _floorTexture : @@ -915,7 +915,7 @@ static void window_mapgen_simplex_dropdown(rct_window *w, int widgetIndex, int d break; case WIDX_SIMPLEX_WALL_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _wallTexture : diff --git a/src/windows/options.c b/src/windows/options.c index 301843995c..5567922add 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -715,8 +715,9 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, gNumResolutions); - if (selectedResolution != -1 && selectedResolution < 32) - gDropdownItemsChecked = 1 << selectedResolution; + if (selectedResolution != -1 && selectedResolution < 32) { + dropdown_set_checked(selectedResolution, true); + } } break; @@ -730,7 +731,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 3); - gDropdownItemsChecked = 1 << gConfigGeneral.fullscreen_mode; + dropdown_set_checked(gConfigGeneral.fullscreen_mode, true); break; case WIDX_CONSTRUCTION_MARKER_DROPDOWN: gDropdownItemsFormat[0] = 1142; @@ -740,7 +741,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = 1 << gConfigGeneral.construction_marker_colour; + dropdown_set_checked(gConfigGeneral.construction_marker_colour, true); break; } break; @@ -755,7 +756,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = gConfigGeneral.show_height_as_units ? 1 : 2; + dropdown_set_checked(gConfigGeneral.show_height_as_units ? 1 : 2, true); break; case WIDX_CURRENCY_DROPDOWN: num_items = 10; @@ -767,7 +768,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, num_items); - gDropdownItemsChecked = 1 << gConfigGeneral.currency_format; + dropdown_set_checked(gConfigGeneral.currency_format, true); break; case WIDX_DISTANCE_DROPDOWN: gDropdownItemsFormat[0] = 1142; @@ -777,7 +778,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = 1 << gConfigGeneral.measurement_format; + dropdown_set_checked(gConfigGeneral.measurement_format, true); break; case WIDX_TEMPERATURE_DROPDOWN: gDropdownItemsFormat[0] = 1142; @@ -787,7 +788,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = 1 << gConfigGeneral.temperature_format; + dropdown_set_checked(gConfigGeneral.temperature_format, true); break; case WIDX_LANGUAGE_DROPDOWN: for (i = 1; i < LANGUAGE_COUNT; i++) { @@ -795,7 +796,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsArgs[i - 1] = (sint32)LanguagesDescriptors[i].native_name; } window_options_show_dropdown(w, widget, LANGUAGE_COUNT - 1); - gDropdownItemsChecked = 1 << (gCurrentLanguage - 1); + dropdown_set_checked(gCurrentLanguage - 1, true); break; case WIDX_DATE_FORMAT_DROPDOWN: for (i = 0; i < 4; i++) { @@ -803,7 +804,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsArgs[i] = DateFormatStringIds[i]; } window_options_show_dropdown(w, widget, 4); - gDropdownItemsChecked = 1 << (gConfigGeneral.date_format); + dropdown_set_checked(gConfigGeneral.date_format, true); break; } break; @@ -821,7 +822,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, gAudioDeviceCount); - gDropdownItemsChecked |= (1 << RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32)); + dropdown_set_checked(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32), true); break; case WIDX_TITLE_MUSIC_DROPDOWN: num_items = 4; @@ -836,7 +837,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, num_items); - gDropdownItemsChecked = 1 << gConfigSound.title_music; + dropdown_set_checked(gConfigSound.title_music, true); break; } break; @@ -866,10 +867,11 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget->right - widget->left - 3 ); - if (gCurrentTheme == 0 || gCurrentTheme == 1) - gDropdownItemsChecked = 1 << (gCurrentTheme ^ 1); - else - gDropdownItemsChecked = 1 << (gCurrentTheme); + if (gCurrentTheme == 0 || gCurrentTheme == 1) { + dropdown_set_checked(gCurrentTheme ^ 1, true); + } else { + dropdown_set_checked(gCurrentTheme, true); + } break; } break; @@ -883,7 +885,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* } window_options_show_dropdown(w, widget, AUTOSAVE_NEVER + 1); - gDropdownItemsChecked = 1 << gConfigGeneral.autosave_frequency; + dropdown_set_checked(gConfigGeneral.autosave_frequency, true); break; case WIDX_TITLE_SEQUENCE_DROPDOWN: num_items = gConfigTitleSequences.num_presets; @@ -903,7 +905,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (gCurrentPreviewTitleSequence); + dropdown_set_checked(gCurrentPreviewTitleSequence, true); break; } break; diff --git a/src/windows/park.c b/src/windows/park.c index 230160f55e..c4d4e0998d 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -689,11 +689,11 @@ static void window_park_entrance_mousedown(int widgetIndex, rct_window*w, rct_wi ); if (park_is_open()) { - RCT2_GLOBAL(0x009DEBA2, sint16) = 0; - gDropdownItemsChecked |= (1 << 1); + gDropdownHighlightedIndex = 0; + dropdown_set_checked(1, true); } else { - RCT2_GLOBAL(0x009DEBA2, sint16) = 1; - gDropdownItemsChecked |= (1 << 0); + gDropdownHighlightedIndex = 1; + dropdown_set_checked(0, true); } } } @@ -706,7 +706,7 @@ static void window_park_entrance_dropdown(rct_window *w, int widgetIndex, int dr { if (widgetIndex == WIDX_OPEN_OR_CLOSE) { if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; if (dropdownIndex != 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 1724; diff --git a/src/windows/research.c b/src/windows/research.c index b888096b81..c58ce270ec 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -465,7 +465,7 @@ static void window_research_funding_mousedown(int widgetIndex, rct_window *w, rc ); int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); - gDropdownItemsChecked = (1 << currentResearchLevel); + dropdown_set_checked(currentResearchLevel, true); } /** diff --git a/src/windows/ride.c b/src/windows/ride.c index d6a99ea1cb..f757342726 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1769,7 +1769,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) } // Set checked item - gDropdownItemsChecked |= (1 << w->ride.view); + dropdown_set_checked(w->ride.view, true); } /** @@ -1844,8 +1844,8 @@ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget) highlightedIndex--; } - gDropdownItemsChecked |= (1 << checkedIndex); - RCT2_GLOBAL(0x009DEBA2, sint16) = highlightedIndex; + dropdown_set_checked(checkedIndex, true); + gDropdownHighlightedIndex = highlightedIndex; } /** @@ -1892,7 +1892,7 @@ static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdo break; case WIDX_OPEN: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; ride = GET_RIDE(w->number); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_TEST_MODE) && dropdownIndex != 0) @@ -2380,7 +2380,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1ULL << selectedIndex); + dropdown_set_checked(selectedIndex, true); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: window_dropdown_show_text_custom_width( @@ -2399,7 +2399,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi gDropdownItemsArgs[i] = ((i + 1) << 16) | (i == 0 ? stringId : stringId + 1); } - gDropdownItemsChecked = (1 << (ride->num_vehicles - 1)); + dropdown_set_checked(ride->num_vehicles - 1, true); break; case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN: minCars = (ride->min_max_cars_per_train >> 4); @@ -2425,7 +2425,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi gDropdownItemsArgs[i] |= (cars - rideEntry->zero_cars) << 16; } - gDropdownItemsChecked = (1 << (ride->num_cars_per_train - minCars)); + dropdown_set_checked(ride->num_cars_per_train - minCars, true); break; } } @@ -2820,9 +2820,11 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) ); // Set checked item - for (i = 0; i < numAvailableModes; i++) - if (ride->mode == availableModes[i]) - gDropdownItemsChecked = 1 << i; + for (i = 0; i < numAvailableModes; i++) { + if (ride->mode == availableModes[i]) { + dropdown_set_checked(i, true); + } + } } /** @@ -2851,7 +2853,7 @@ static void window_ride_load_dropdown(rct_window *w, rct_widget *widget) widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1 << (ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK)); + dropdown_set_checked(ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK, true); } /** @@ -3366,7 +3368,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1 << ride->inspection_interval); + dropdown_set_checked(ride->inspection_interval, true); break; case WIDX_FORCE_BREAKDOWN: @@ -3411,7 +3413,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc continue; } if (i == breakdownReason) { - gDropdownItemsChecked = (1 << num_items); + dropdown_set_checked(num_items, true); break; } gDropdownItemsFormat[num_items] = 1142; @@ -3813,7 +3815,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << colourSchemeIndex; + dropdown_set_checked(colourSchemeIndex, true); break; case WIDX_TRACK_MAIN_COLOUR: window_dropdown_show_colour(w, widget, w->colours[1], ride->track_colour_main[colourSchemeIndex]); @@ -3840,17 +3842,18 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << ride->track_colour_supports[colourSchemeIndex]; + dropdown_set_checked(ride->track_colour_supports[colourSchemeIndex], true); break; - case WIDX_ENTRANCE_STYLE_DROPDOWN: + case WIDX_ENTRANCE_STYLE_DROPDOWN: for (i = 0; i < countof(window_ride_entrance_style_list); i++) { gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = RideEntranceDefinitions[window_ride_entrance_style_list[i]].string_id; - if (ride->entrance_style == window_ride_entrance_style_list[i]) - gDropdownItemsChecked = 1 << i; + if (ride->entrance_style == window_ride_entrance_style_list[i]) { + dropdown_set_checked(i, true); + } } - int checked = gDropdownItemsChecked; + uint64 checked = gDropdownItemsChecked; window_dropdown_show_text_custom_width( w->x + dropdownWidget->left, @@ -3864,7 +3867,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid gDropdownItemsChecked = checked; break; - case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN: + case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN: for (i = 0; i < 3; i++) { gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = (RideNameConvention[ride->type].vehicle_name << 16) | (STR_ALL_VEHICLES_IN_SAME_COLOURS + i); @@ -3880,7 +3883,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << (ride->colour_scheme_type & 3); + dropdown_set_checked(ride->colour_scheme_type & 3, true); break; case WIDX_VEHICLE_COLOUR_INDEX_DROPDOWN: numItems = ride->num_vehicles; @@ -3903,7 +3906,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << w->var_48C; + dropdown_set_checked(w->var_48C, true); break; case WIDX_VEHICLE_MAIN_COLOUR: vehicleColour = ride_get_vehicle_colour(ride, w->var_48C); @@ -4452,8 +4455,9 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg ); for (i = 0; i < numItems; i++) { - if (window_ride_current_music_style_order[i] == ride->music) - gDropdownItemsChecked = (1 << i); + if (window_ride_current_music_style_order[i] == ride->music) { + dropdown_set_checked(i, true); + } } } @@ -4702,7 +4706,7 @@ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, r 0, 2 ); - RCT2_GLOBAL(0x009DEBA2, sint16) = 0; + gDropdownHighlightedIndex = 0; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) gDropdownItemsDisabled |= 2; } @@ -4717,7 +4721,7 @@ static void window_ride_measurements_dropdown(rct_window *w, int widgetIndex, in return; if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; if (dropdownIndex == 0) save_track_design((uint8)w->number); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 91d47ad76f..6257ecf9ad 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3161,7 +3161,7 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, } gDropdownItemsFormat[i] = trackPieceStringId; if ((trackPiece | 0x100) == _currentTrackCurve) { - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } } diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 873a93c76e..ae3cf98b2d 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -263,7 +263,7 @@ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget numItems, widget->right - widget->left - 3 ); - gDropdownItemsChecked |= (1 << _window_ride_list_information_type); + dropdown_set_checked(_window_ride_list_information_type, true); } } diff --git a/src/windows/staff.c b/src/windows/staff.c index 423564f341..4b306cf126 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -532,7 +532,7 @@ void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* int y = widget->top + w->y; int extray = widget->bottom - widget->top + 1; window_dropdown_show_text(x, y, extray, w->colours[1], 0, 2); - RCT2_GLOBAL(0x009DEBA2, sint16) = 0; + gDropdownHighlightedIndex = 0; rct_peep* peep = GET_PEEP(w->number); diff --git a/src/windows/themes.c b/src/windows/themes.c index 3c51d80887..94b04f68a9 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -552,10 +552,11 @@ static void window_themes_mousedown(int widgetIndex, rct_window* w, rct_widget* widget->right - widget->left - 3 ); - if (gCurrentTheme == 0 || gCurrentTheme == 1) - gDropdownItemsChecked = 1 << (gCurrentTheme ^ 1); - else - gDropdownItemsChecked = 1 << (gCurrentTheme); + if (gCurrentTheme == 0 || gCurrentTheme == 1) { + dropdown_set_checked(gCurrentTheme ^ 1, true); + } else { + dropdown_set_checked(gCurrentTheme, true); + } break; case WIDX_THEMES_RCT1_RIDE_LIGHTS: if (gCurrentTheme >= 2) { diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 54e74ce8ee..7fb1c66aca 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -322,7 +322,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << get_command_info_index(command.command); + dropdown_set_checked(get_command_info_index(command.command), true); break; case WIDX_INPUT_DROPDOWN: if (command.command == TITLE_SCRIPT_SPEED) { @@ -342,7 +342,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (command.speed - 1); + dropdown_set_checked(command.speed - 1, true); } else if (command.command == TITLE_SCRIPT_LOAD) { num_items = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; @@ -361,7 +361,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (command.saveIndex); + dropdown_set_checked(command.saveIndex, true); } break; } diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index feb68f79e0..5832f8c17d 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -587,7 +587,7 @@ static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_wi widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (gCurrentTitleSequence); + dropdown_set_checked(gCurrentTitleSequence, true); } break; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 868068e110..1b01e3361f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -411,8 +411,9 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg ); #ifndef DISABLE_TWITCH - if (_menuDropdownIncludesTwitch && gTwitchEnable) - gDropdownItemsChecked |= (1 << 11); + if (_menuDropdownIncludesTwitch && gTwitchEnable) { + dropdown_set_checked(11, true); + } #endif break; case WIDX_CHEATS: @@ -433,12 +434,15 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg 0, 5 ); - if (gCheatsSandboxMode) - gDropdownItemsChecked |= (1 << DDIDX_ENABLE_SANDBOX_MODE); - if (gCheatsDisableClearanceChecks) - gDropdownItemsChecked |= (1 << DDIDX_DISABLE_CLEARANCE_CHECKS); - if (gCheatsDisableSupportLimits) - gDropdownItemsChecked |= (1 << DDIDX_DISABLE_SUPPORT_LIMITS); + if (gCheatsSandboxMode) { + dropdown_set_checked(DDIDX_ENABLE_SANDBOX_MODE, true); + } + if (gCheatsDisableClearanceChecks) { + dropdown_set_checked(DDIDX_DISABLE_CLEARANCE_CHECKS, true); + } + if (gCheatsDisableSupportLimits) { + dropdown_set_checked(DDIDX_DISABLE_SUPPORT_LIMITS, true); + } RCT2_GLOBAL(0x009DEBA2, uint16) = 0; break; case WIDX_VIEW_MENU: @@ -2844,10 +2848,12 @@ void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { ); // Set checkmarks - if (gGameSpeed <= 4) - gDropdownItemsChecked |= (1 << (gGameSpeed - 1)); - if (gGameSpeed == 8) - gDropdownItemsChecked |= (1 << 5); + if (gGameSpeed <= 4) { + dropdown_set_checked(gGameSpeed - 1, true); + } + if (gGameSpeed == 8) { + dropdown_set_checked(5, true); + } if (gConfigGeneral.debugging_tools) RCT2_GLOBAL(0x9DEBA2, uint16) = (gGameSpeed == 8 ? 0 : gGameSpeed); @@ -3011,25 +3017,25 @@ void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget) { // Set checkmarks rct_viewport* mainViewport = window_get_main()->viewport; if (mainViewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE) - gDropdownItemsChecked |= (1 << 0); + dropdown_set_checked(0, true); if (mainViewport->flags & VIEWPORT_FLAG_HIDE_BASE) - gDropdownItemsChecked |= (1 << 1); + dropdown_set_checked(1, true); if (mainViewport->flags & VIEWPORT_FLAG_HIDE_VERTICAL) - gDropdownItemsChecked |= (1 << 2); + dropdown_set_checked(2, true); if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES) - gDropdownItemsChecked |= (1 << 4); + dropdown_set_checked(4, true); if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_SCENERY) - gDropdownItemsChecked |= (1 << 5); + dropdown_set_checked(5, true); if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS) - gDropdownItemsChecked |= (1 << 6); + dropdown_set_checked(6, true); if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS) - gDropdownItemsChecked |= (1 << 7); + dropdown_set_checked(7, true); if (mainViewport->flags & VIEWPORT_FLAG_LAND_HEIGHTS) - gDropdownItemsChecked |= (1 << 9); + dropdown_set_checked(9, true); if (mainViewport->flags & VIEWPORT_FLAG_TRACK_HEIGHTS) - gDropdownItemsChecked |= (1 << 10); + dropdown_set_checked(10, true); if (mainViewport->flags & VIEWPORT_FLAG_PATH_HEIGHTS) - gDropdownItemsChecked |= (1 << 11); + dropdown_set_checked(11, true); RCT2_GLOBAL(0x9DEBA2, uint16) = 0; }