1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-22 23:33:04 +01:00

Handle > 255 rides in ride list window

This commit is contained in:
Ted John
2021-05-04 21:05:21 +01:00
committed by Gymnasiast
parent 1bfcac14db
commit 417c0f584f
3 changed files with 43 additions and 54 deletions

View File

@@ -73,6 +73,7 @@ static rct_widget window_ride_list_widgets[] = {
}; };
static bool _quickDemolishMode = false; static bool _quickDemolishMode = false;
static std::vector<ride_id_t> _rideList;
static void window_ride_list_mouseup(rct_window *w, rct_widgetindex widgetIndex); static void window_ride_list_mouseup(rct_window *w, rct_widgetindex widgetIndex);
static void window_ride_list_resize(rct_window *w); static void window_ride_list_resize(rct_window *w);
@@ -198,7 +199,6 @@ rct_window* window_ride_list_open()
} }
WindowInitScrollWidgets(window); WindowInitScrollWidgets(window);
window->page = PAGE_RIDES; window->page = PAGE_RIDES;
window->no_list_items = 0;
window->selected_list_item = -1; window->selected_list_item = -1;
window->frame_no = 0; window->frame_no = 0;
window->min_width = 340; window->min_width = 340;
@@ -227,7 +227,6 @@ static void window_ride_list_mouseup(rct_window* w, rct_widgetindex widgetIndex)
break; break;
case WIDX_SORT: case WIDX_SORT:
w->list_information_type = _window_ride_list_information_type; w->list_information_type = _window_ride_list_information_type;
w->no_list_items = 0;
w->selected_list_item = -1; w->selected_list_item = -1;
window_ride_list_refresh_list(w); window_ride_list_refresh_list(w);
break; break;
@@ -237,7 +236,6 @@ static void window_ride_list_mouseup(rct_window* w, rct_widgetindex widgetIndex)
if (w->page != widgetIndex - WIDX_TAB_1) if (w->page != widgetIndex - WIDX_TAB_1)
{ {
w->page = widgetIndex - WIDX_TAB_1; w->page = widgetIndex - WIDX_TAB_1;
w->no_list_items = 0;
w->frame_no = 0; w->frame_no = 0;
w->selected_list_item = -1; w->selected_list_item = -1;
if (w->page != PAGE_RIDES && _window_ride_list_information_type > INFORMATION_TYPE_RUNNING_COST) if (w->page != PAGE_RIDES && _window_ride_list_information_type > INFORMATION_TYPE_RUNNING_COST)
@@ -407,16 +405,14 @@ static void window_ride_list_update(rct_window* w)
*/ */
static void window_ride_list_scrollgetsize(rct_window* w, int32_t scrollIndex, int32_t* width, int32_t* height) static void window_ride_list_scrollgetsize(rct_window* w, int32_t scrollIndex, int32_t* width, int32_t* height)
{ {
int32_t top; *height = static_cast<int32_t>(_rideList.size() * SCROLLABLE_ROW_HEIGHT);
*height = w->no_list_items * SCROLLABLE_ROW_HEIGHT;
if (w->selected_list_item != -1) if (w->selected_list_item != -1)
{ {
w->selected_list_item = -1; w->selected_list_item = -1;
w->Invalidate(); w->Invalidate();
} }
top = *height - window_ride_list_widgets[WIDX_LIST].bottom + window_ride_list_widgets[WIDX_LIST].top + 21; auto top = *height - window_ride_list_widgets[WIDX_LIST].bottom + window_ride_list_widgets[WIDX_LIST].top + 21;
if (top < 0) if (top < 0)
top = 0; top = 0;
if (top < w->scrolls[0].v_top) if (top < w->scrolls[0].v_top)
@@ -432,14 +428,12 @@ static void window_ride_list_scrollgetsize(rct_window* w, int32_t scrollIndex, i
*/ */
static void window_ride_list_scrollmousedown(rct_window* w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords) static void window_ride_list_scrollmousedown(rct_window* w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords)
{ {
int32_t index; auto index = screenCoords.y / SCROLLABLE_ROW_HEIGHT;
if (index < 0 || static_cast<size_t>(index) >= _rideList.size())
index = screenCoords.y / SCROLLABLE_ROW_HEIGHT;
if (index >= w->no_list_items)
return; return;
// Open ride window // Open ride window
auto rideIndex = w->list_item_positions[index]; auto rideIndex = _rideList[index];
auto ride = get_ride(rideIndex); auto ride = get_ride(rideIndex);
if (_quickDemolishMode && network_get_mode() != NETWORK_MODE_CLIENT) if (_quickDemolishMode && network_get_mode() != NETWORK_MODE_CLIENT)
{ {
@@ -460,10 +454,8 @@ static void window_ride_list_scrollmousedown(rct_window* w, int32_t scrollIndex,
*/ */
static void window_ride_list_scrollmouseover(rct_window* w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords) static void window_ride_list_scrollmouseover(rct_window* w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords)
{ {
int32_t index; auto index = screenCoords.y / SCROLLABLE_ROW_HEIGHT;
if (index < 0 || static_cast<size_t>(index) >= _rideList.size())
index = screenCoords.y / SCROLLABLE_ROW_HEIGHT;
if (index >= w->no_list_items)
return; return;
w->selected_list_item = index; w->selected_list_item = index;
@@ -521,7 +513,7 @@ static void window_ride_list_invalidate(rct_window* w)
const auto& rideManager = GetRideManager(); const auto& rideManager = GetRideManager();
auto allClosed = true; auto allClosed = true;
auto allOpen = false; auto allOpen = false;
if (w->no_list_items > 0 && std::size(rideManager) != 0) if (_rideList.size() > 0 && std::size(rideManager) != 0)
{ {
auto c = static_cast<RideClassification>(w->page); auto c = static_cast<RideClassification>(w->page);
allClosed = std::none_of(rideManager.begin(), rideManager.end(), [c](const Ride& ride) { allClosed = std::none_of(rideManager.begin(), rideManager.end(), [c](const Ride& ride) {
@@ -561,7 +553,7 @@ static void window_ride_list_paint(rct_window* w, rct_drawpixelinfo* dpi)
// Draw number of attractions on bottom // Draw number of attractions on bottom
auto ft = Formatter(); auto ft = Formatter();
ft.Add<uint16_t>(w->no_list_items); ft.Add<uint16_t>(static_cast<uint16_t>(_rideList.size()));
DrawTextBasic( DrawTextBasic(
dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_LIST].bottom + 2 }, ride_list_statusbar_count_strings[w->page], dpi, w->windowPos + ScreenCoordsXY{ 4, w->widgets[WIDX_LIST].bottom + 2 }, ride_list_statusbar_count_strings[w->page],
ft); ft);
@@ -578,10 +570,10 @@ static void window_ride_list_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi,
dpi, { dpiCoords, dpiCoords + ScreenCoordsXY{ dpi->width, dpi->height } }, ColourMapA[w->colours[1]].mid_light); dpi, { dpiCoords, dpiCoords + ScreenCoordsXY{ dpi->width, dpi->height } }, ColourMapA[w->colours[1]].mid_light);
auto y = 0; auto y = 0;
for (auto i = 0; i < w->no_list_items; i++) for (size_t i = 0; i < _rideList.size(); i++)
{ {
rct_string_id format = (_quickDemolishMode ? STR_RED_STRINGID : STR_BLACK_STRING); rct_string_id format = (_quickDemolishMode ? STR_RED_STRINGID : STR_BLACK_STRING);
if (i == w->selected_list_item) if (i == static_cast<size_t>(w->selected_list_item))
{ {
// Background highlight // Background highlight
gfx_filter_rect(dpi, 0, y, 800, y + SCROLLABLE_ROW_HEIGHT - 1, FilterPaletteID::PaletteDarken1); gfx_filter_rect(dpi, 0, y, 800, y + SCROLLABLE_ROW_HEIGHT - 1, FilterPaletteID::PaletteDarken1);
@@ -589,7 +581,7 @@ static void window_ride_list_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi,
} }
// Get ride // Get ride
auto ride = get_ride(w->list_item_positions[i]); auto ride = get_ride(_rideList[i]);
if (ride == nullptr) if (ride == nullptr)
continue; continue;
@@ -783,13 +775,25 @@ static void window_ride_list_draw_tab_images(rct_drawpixelinfo* dpi, rct_window*
dpi, ImageId(sprite_idx), w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_TAB_3].left, w->widgets[WIDX_TAB_3].top }); dpi, ImageId(sprite_idx), w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_TAB_3].left, w->widgets[WIDX_TAB_3].top });
} }
/**
* Bubbles an item one position up in the window list. This is done by swapping
* the two locations.
* rct2: New function not from rct2
*/
static void window_bubble_list_item(rct_window* w, int32_t index)
{
std::swap(_rideList[index], _rideList[index + 1]);
}
/** /**
* *
* rct2: 0x006B39A8 * rct2: 0x006B39A8
*/ */
void window_ride_list_refresh_list(rct_window* w) void window_ride_list_refresh_list(rct_window* w)
{ {
int32_t list_index = 0; _rideList.clear();
size_t list_index = 0;
for (auto& ridec : GetRideManager()) for (auto& ridec : GetRideManager())
{ {
auto ride = &ridec; auto ride = &ridec;
@@ -802,8 +806,8 @@ void window_ride_list_refresh_list(rct_window* w)
ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_LIST; ride->window_invalidate_flags &= ~RIDE_INVALIDATE_RIDE_LIST;
} }
w->list_item_positions[list_index] = ride->id; _rideList.push_back(ride->id);
int32_t current_list_position = list_index; auto current_list_position = static_cast<int32_t>(list_index);
switch (w->list_information_type) switch (w->list_information_type)
{ {
case INFORMATION_TYPE_STATUS: case INFORMATION_TYPE_STATUS:
@@ -811,7 +815,7 @@ void window_ride_list_refresh_list(rct_window* w)
auto strA = ride->GetName(); auto strA = ride->GetName();
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
auto strB = otherRide->GetName(); auto strB = otherRide->GetName();
@@ -826,7 +830,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_POPULARITY: case INFORMATION_TYPE_POPULARITY:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->popularity * 4 <= otherRide->popularity * 4) if (ride->popularity * 4 <= otherRide->popularity * 4)
@@ -839,7 +843,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_SATISFACTION: case INFORMATION_TYPE_SATISFACTION:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->satisfaction * 5 <= otherRide->satisfaction * 5) if (ride->satisfaction * 5 <= otherRide->satisfaction * 5)
@@ -852,7 +856,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_PROFIT: case INFORMATION_TYPE_PROFIT:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->profit <= otherRide->profit) if (ride->profit <= otherRide->profit)
@@ -865,7 +869,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_TOTAL_CUSTOMERS: case INFORMATION_TYPE_TOTAL_CUSTOMERS:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->total_customers <= otherRide->total_customers) if (ride->total_customers <= otherRide->total_customers)
@@ -878,7 +882,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_TOTAL_PROFIT: case INFORMATION_TYPE_TOTAL_PROFIT:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->total_profit <= otherRide->total_profit) if (ride->total_profit <= otherRide->total_profit)
@@ -891,7 +895,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_CUSTOMERS: case INFORMATION_TYPE_CUSTOMERS:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride_customers_per_hour(ride) <= ride_customers_per_hour(otherRide)) if (ride_customers_per_hour(ride) <= ride_customers_per_hour(otherRide))
@@ -904,7 +908,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_AGE: case INFORMATION_TYPE_AGE:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->build_date <= otherRide->build_date) if (ride->build_date <= otherRide->build_date)
@@ -917,7 +921,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_INCOME: case INFORMATION_TYPE_INCOME:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->income_per_hour <= otherRide->income_per_hour) if (ride->income_per_hour <= otherRide->income_per_hour)
@@ -930,7 +934,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_RUNNING_COST: case INFORMATION_TYPE_RUNNING_COST:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->upkeep_cost <= otherRide->upkeep_cost) if (ride->upkeep_cost <= otherRide->upkeep_cost)
@@ -943,7 +947,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_QUEUE_LENGTH: case INFORMATION_TYPE_QUEUE_LENGTH:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->GetTotalQueueLength() <= otherRide->GetTotalQueueLength()) if (ride->GetTotalQueueLength() <= otherRide->GetTotalQueueLength())
@@ -956,7 +960,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_QUEUE_TIME: case INFORMATION_TYPE_QUEUE_TIME:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->GetMaxQueueTime() <= otherRide->GetMaxQueueTime()) if (ride->GetMaxQueueTime() <= otherRide->GetMaxQueueTime())
@@ -969,7 +973,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_RELIABILITY: case INFORMATION_TYPE_RELIABILITY:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->reliability_percentage <= otherRide->reliability_percentage) if (ride->reliability_percentage <= otherRide->reliability_percentage)
@@ -982,7 +986,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_DOWN_TIME: case INFORMATION_TYPE_DOWN_TIME:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->downtime <= otherRide->downtime) if (ride->downtime <= otherRide->downtime)
@@ -995,7 +999,7 @@ void window_ride_list_refresh_list(rct_window* w)
case INFORMATION_TYPE_GUESTS_FAVOURITE: case INFORMATION_TYPE_GUESTS_FAVOURITE:
while (--current_list_position >= 0) while (--current_list_position >= 0)
{ {
auto otherRide = get_ride(w->list_item_positions[current_list_position]); auto otherRide = get_ride(_rideList[current_list_position]);
if (otherRide != nullptr) if (otherRide != nullptr)
{ {
if (ride->guests_favourite <= otherRide->guests_favourite) if (ride->guests_favourite <= otherRide->guests_favourite)
@@ -1010,7 +1014,6 @@ void window_ride_list_refresh_list(rct_window* w)
list_index++; list_index++;
} }
w->no_list_items = list_index;
w->selected_list_item = -1; w->selected_list_item = -1;
w->Invalidate(); w->Invalidate();
} }

View File

@@ -1631,18 +1631,6 @@ void window_event_scroll_paint_call(rct_window* w, rct_drawpixelinfo* dpi, int32
w->event_handlers->scroll_paint(w, dpi, scrollIndex); w->event_handlers->scroll_paint(w, dpi, scrollIndex);
} }
/**
* Bubbles an item one position up in the window list. This is done by swapping
* the two locations.
* rct2: New function not from rct2
*/
void window_bubble_list_item(rct_window* w, int32_t item_position)
{
char swap = w->list_item_positions[item_position];
w->list_item_positions[item_position] = w->list_item_positions[item_position + 1];
w->list_item_positions[item_position + 1] = swap;
}
/** /**
* *
* rct2: 0x006ED710 * rct2: 0x006ED710

View File

@@ -805,8 +805,6 @@ void ride_construction_toolupdate_entrance_exit(const ScreenCoordsXY& screenCoor
void ride_construction_toolupdate_construct(const ScreenCoordsXY& screenCoords); void ride_construction_toolupdate_construct(const ScreenCoordsXY& screenCoords);
void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords); void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords);
void window_bubble_list_item(rct_window* w, int32_t item_position);
void window_align_tabs(rct_window* w, rct_widgetindex start_tab_id, rct_widgetindex end_tab_id); void window_align_tabs(rct_window* w, rct_widgetindex start_tab_id, rct_widgetindex end_tab_id);
void window_staff_list_init_vars(); void window_staff_list_init_vars();