2014-04-19 04:16:20 +02:00
/*****************************************************************************
2020-05-12 20:11:29 +02:00
* Copyright ( c ) 2014 - 2020 OpenRCT2 developers
2014-04-19 04:16:20 +02:00
*
2018-06-15 14:07:34 +02:00
* For a complete list of all authors , please refer to contributors . md
* Interested in contributing ? Visit https : //github.com/OpenRCT2/OpenRCT2
2014-04-19 04:16:20 +02:00
*
2018-06-15 14:07:34 +02:00
* OpenRCT2 is licensed under the GNU General Public License version 3.
2014-04-19 04:16:20 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2018-06-22 23:21:44 +02:00
# include "../interface/Theme.h"
2017-08-02 00:20:32 +02:00
2018-11-21 23:16:04 +01:00
# include <iterator>
2018-06-22 23:21:44 +02:00
# include <openrct2-ui/interface/Dropdown.h>
# include <openrct2-ui/interface/Widget.h>
# include <openrct2-ui/windows/Window.h>
2017-10-27 20:12:01 +02:00
# include <openrct2/Context.h>
2017-11-30 18:17:06 +01:00
# include <openrct2/Game.h>
2018-06-22 23:21:44 +02:00
# include <openrct2/config/Config.h>
# include <openrct2/drawing/Drawing.h>
# include <openrct2/interface/Colour.h>
2018-01-06 18:32:25 +01:00
# include <openrct2/localisation/Localisation.h>
2017-10-27 20:12:01 +02:00
# include <openrct2/network/network.h>
2017-10-08 22:15:41 +02:00
# include <openrct2/sprites.h>
2020-03-23 22:33:57 +01:00
# include <openrct2/util/Util.h>
2017-10-21 16:03:33 +02:00
# include <openrct2/windows/Intent.h>
2018-03-19 23:28:40 +01:00
# include <openrct2/world/Park.h>
2014-04-19 04:16:20 +02:00
2020-05-05 22:26:14 +02:00
static constexpr const rct_string_id WINDOW_TITLE = STR_NONE ;
static constexpr const int32_t WH = 240 ;
static constexpr const int32_t WW = 340 ;
2019-10-19 04:02:31 +02:00
2018-05-16 20:41:29 +02:00
// clang-format off
2014-04-19 04:16:20 +02:00
enum {
2017-06-06 23:24:18 +02:00
PAGE_RIDES ,
PAGE_SHOPS_AND_STALLS ,
PAGE_KIOSKS_AND_FACILITIES ,
PAGE_COUNT
2014-04-19 04:16:20 +02:00
} ;
2014-05-19 21:10:32 +02:00
enum WINDOW_RIDE_LIST_WIDGET_IDX {
2017-06-06 23:24:18 +02:00
WIDX_BACKGROUND ,
WIDX_TITLE ,
WIDX_CLOSE ,
WIDX_PAGE_BACKGROUND ,
WIDX_OPEN_CLOSE_ALL ,
WIDX_CURRENT_INFORMATION_TYPE ,
WIDX_INFORMATION_TYPE_DROPDOWN ,
WIDX_SORT ,
WIDX_TAB_1 ,
WIDX_TAB_2 ,
WIDX_TAB_3 ,
WIDX_LIST ,
WIDX_CLOSE_LIGHT ,
WIDX_OPEN_LIGHT ,
WIDX_QUICK_DEMOLISH ,
2014-04-19 04:16:20 +02:00
} ;
static rct_widget window_ride_list_widgets [ ] = {
2020-05-09 16:44:21 +02:00
WINDOW_SHIM ( WINDOW_TITLE , WW , WH ) ,
2020-11-27 04:14:20 +01:00
MakeWidget ( { 0 , 43 } , { 340 , 197 } , WindowWidgetType : : Resize , WindowColour : : Secondary ) , // tab page background
MakeWidget ( { 315 , 60 } , { 24 , 24 } , WindowWidgetType : : FlatBtn , WindowColour : : Secondary , SPR_TOGGLE_OPEN_CLOSE , STR_OPEN_OR_CLOSE_ALL_RIDES ) , // open / close all toggle
MakeWidget ( { 150 , 46 } , { 124 , 12 } , WindowWidgetType : : DropdownMenu , WindowColour : : Secondary ) , // current information type
MakeWidget ( { 262 , 47 } , { 11 , 10 } , WindowWidgetType : : Button , WindowColour : : Secondary , STR_DROPDOWN_GLYPH , STR_RIDE_LIST_INFORMATION_TYPE_TIP ) , // information type dropdown button
MakeWidget ( { 280 , 46 } , { 54 , 12 } , WindowWidgetType : : Button , WindowColour : : Secondary , STR_SORT , STR_RIDE_LIST_SORT_TIP ) , // sort button
2020-08-29 04:31:31 +02:00
MakeTab ( { 3 , 17 } , STR_LIST_RIDES_TIP ) , // tab 1
MakeTab ( { 34 , 17 } , STR_LIST_SHOPS_AND_STALLS_TIP ) , // tab 2
MakeTab ( { 65 , 17 } , STR_LIST_KIOSKS_AND_FACILITIES_TIP ) , // tab 3
2020-11-27 04:14:20 +01:00
MakeWidget ( { 3 , 60 } , { 334 , 177 } , WindowWidgetType : : Scroll , WindowColour : : Secondary , SCROLL_VERTICAL ) , // list
MakeWidget ( { 320 , 62 } , { 14 , 14 } , WindowWidgetType : : ImgBtn , WindowColour : : Secondary , SPR_G2_RCT1_CLOSE_BUTTON_0 ) ,
MakeWidget ( { 320 , 76 } , { 14 , 14 } , WindowWidgetType : : ImgBtn , WindowColour : : Secondary , SPR_G2_RCT1_OPEN_BUTTON_0 ) ,
MakeWidget ( { 315 , 90 } , { 24 , 24 } , WindowWidgetType : : FlatBtn , WindowColour : : Secondary , SPR_DEMOLISH , STR_QUICK_DEMOLISH_RIDE ) ,
2017-06-06 23:24:18 +02:00
{ WIDGETS_END } ,
2014-04-19 04:16:20 +02:00
} ;
2017-04-11 10:16:44 +02:00
static bool _quickDemolishMode = false ;
2021-05-04 22:05:21 +02:00
static std : : vector < ride_id_t > _rideList ;
2017-04-11 10:16:44 +02:00
2017-05-01 15:41:45 +02:00
static void window_ride_list_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_ride_list_resize ( rct_window * w ) ;
2017-07-03 23:09:46 +02:00
static void window_ride_list_mousedown ( rct_window * w , rct_widgetindex widgetIndex , rct_widget * widget ) ;
2018-06-20 17:28:51 +02:00
static void window_ride_list_dropdown ( rct_window * w , rct_widgetindex widgetIndex , int32_t dropdownIndex ) ;
2014-05-19 19:47:14 +02:00
static void window_ride_list_update ( rct_window * w ) ;
2018-06-20 17:28:51 +02:00
static void window_ride_list_scrollgetsize ( rct_window * w , int32_t scrollIndex , int32_t * width , int32_t * height ) ;
2020-02-29 03:43:29 +01:00
static void window_ride_list_scrollmousedown ( rct_window * w , int32_t scrollIndex , const ScreenCoordsXY & screenCoords ) ;
static void window_ride_list_scrollmouseover ( rct_window * w , int32_t scrollIndex , const ScreenCoordsXY & screenCoords ) ;
2015-07-10 02:39:16 +02:00
static void window_ride_list_invalidate ( rct_window * w ) ;
static void window_ride_list_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2018-06-20 17:28:51 +02:00
static void window_ride_list_scrollpaint ( rct_window * w , rct_drawpixelinfo * dpi , int32_t scrollIndex ) ;
2015-07-10 02:39:16 +02:00
2020-09-28 20:36:15 +02:00
static rct_window_event_list window_ride_list_events ( [ ] ( auto & events )
{
events . mouse_up = & window_ride_list_mouseup ;
events . resize = & window_ride_list_resize ;
events . mouse_down = & window_ride_list_mousedown ;
events . dropdown = & window_ride_list_dropdown ;
events . update = & window_ride_list_update ;
events . get_scroll_size = & window_ride_list_scrollgetsize ;
events . scroll_mousedown = & window_ride_list_scrollmousedown ;
events . scroll_mouseover = & window_ride_list_scrollmouseover ;
events . invalidate = & window_ride_list_invalidate ;
events . paint = & window_ride_list_paint ;
events . scroll_paint = & window_ride_list_scrollpaint ;
} ) ;
2014-04-19 04:16:20 +02:00
enum {
2017-06-06 23:24:18 +02:00
INFORMATION_TYPE_STATUS ,
INFORMATION_TYPE_POPULARITY ,
INFORMATION_TYPE_SATISFACTION ,
INFORMATION_TYPE_PROFIT ,
INFORMATION_TYPE_TOTAL_CUSTOMERS ,
INFORMATION_TYPE_TOTAL_PROFIT ,
INFORMATION_TYPE_CUSTOMERS ,
INFORMATION_TYPE_AGE ,
INFORMATION_TYPE_INCOME ,
INFORMATION_TYPE_RUNNING_COST ,
INFORMATION_TYPE_QUEUE_LENGTH ,
INFORMATION_TYPE_QUEUE_TIME ,
INFORMATION_TYPE_RELIABILITY ,
INFORMATION_TYPE_DOWN_TIME ,
INFORMATION_TYPE_GUESTS_FAVOURITE ,
DROPDOWN_LIST_COUNT
2016-02-02 00:31:31 +01:00
} ;
2018-01-11 14:50:31 +01:00
static constexpr const rct_string_id ride_info_type_string_mapping [ DROPDOWN_LIST_COUNT ] = {
2017-06-06 23:24:18 +02:00
STR_STATUS ,
STR_POPULARITY ,
STR_SATISFACTION ,
STR_PROFIT ,
STR_RIDE_LIST_TOTAL_CUSTOMERS ,
STR_RIDE_LIST_TOTAL_PROFIT ,
STR_RIDE_LIST_CUSTOMERS_PER_HOUR ,
STR_RIDE_LIST_AGE ,
STR_RIDE_LIST_INCOME ,
STR_RIDE_LIST_RUNNING_COST ,
STR_QUEUE_LENGTH ,
STR_QUEUE_TIME ,
STR_RELIABILITY ,
STR_DOWN_TIME ,
STR_GUESTS_FAVOURITE
2014-04-19 04:16:20 +02:00
} ;
2018-01-11 14:50:31 +01:00
static constexpr const rct_string_id ride_list_statusbar_count_strings [ PAGE_COUNT ] = {
2017-06-06 23:24:18 +02:00
STR_NUMBER_RIDES ,
STR_NUMBER_SHOPS_AND_STALLS ,
STR_NUMBER_RESTROOMS_AND_INFORMATION_KIOSKS ,
2016-07-14 14:07:49 +02:00
} ;
2018-01-11 14:50:31 +01:00
static constexpr const bool ride_info_type_money_mapping [ DROPDOWN_LIST_COUNT ] = {
2017-06-06 23:24:18 +02:00
false ,
false ,
false ,
true ,
false ,
true ,
false ,
false ,
true ,
true ,
false ,
false ,
false ,
false ,
false
2016-04-09 15:04:09 +02:00
} ;
2018-01-11 14:50:31 +01:00
static constexpr const rct_string_id page_names [ ] = {
2017-06-06 23:24:18 +02:00
STR_RIDES ,
STR_SHOPS_AND_STALLS ,
STR_RESTROOMS_AND_INFORMATION_KIOSKS ,
2016-07-14 14:07:49 +02:00
} ;
2018-05-16 20:41:29 +02:00
// clang-format on
2016-07-14 14:07:49 +02:00
2020-06-13 23:36:43 +02:00
static int32_t _window_ride_list_information_type = INFORMATION_TYPE_STATUS ;
2014-04-19 04:16:20 +02:00
2018-06-22 23:21:44 +02:00
static void window_ride_list_draw_tab_images ( rct_drawpixelinfo * dpi , rct_window * w ) ;
static void window_ride_list_close_all ( rct_window * w ) ;
static void window_ride_list_open_all ( rct_window * w ) ;
2014-04-19 04:16:20 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-19 04:16:20 +02:00
* rct2 : 0x006B30BC
*/
2018-06-22 23:21:44 +02:00
rct_window * window_ride_list_open ( )
2014-04-19 04:16:20 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * window ;
// Check if window is already open
window = window_bring_to_front_by_class ( WC_RIDE_LIST ) ;
2018-06-22 23:21:44 +02:00
if ( window = = nullptr )
{
2020-11-04 05:52:23 +01:00
window = WindowCreateAutoPos ( 340 , 240 , & window_ride_list_events , WC_RIDE_LIST , WF_10 | WF_RESIZABLE ) ;
2017-06-06 23:24:18 +02:00
window - > widgets = window_ride_list_widgets ;
2021-06-26 14:23:15 +02:00
window - > enabled_widgets = ( 1ULL < < WIDX_CLOSE ) | ( 1ULL < < WIDX_OPEN_CLOSE_ALL ) | ( 1ULL < < WIDX_CURRENT_INFORMATION_TYPE )
| ( 1ULL < < WIDX_INFORMATION_TYPE_DROPDOWN ) | ( 1ULL < < WIDX_SORT ) | ( 1ULL < < WIDX_TAB_1 ) | ( 1ULL < < WIDX_TAB_2 )
| ( 1ULL < < WIDX_TAB_3 ) | ( 1ULL < < WIDX_CLOSE_LIGHT ) | ( 1ULL < < WIDX_OPEN_LIGHT ) ;
2018-06-22 23:21:44 +02:00
if ( network_get_mode ( ) ! = NETWORK_MODE_CLIENT )
{
2021-06-26 14:23:15 +02:00
window - > enabled_widgets | = ( 1ULL < < WIDX_QUICK_DEMOLISH ) ;
2017-06-06 23:24:18 +02:00
}
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( window ) ;
2017-06-06 23:24:18 +02:00
window - > page = PAGE_RIDES ;
window - > selected_list_item = - 1 ;
window - > frame_no = 0 ;
window - > min_width = 340 ;
window - > min_height = 240 ;
window - > max_width = 400 ;
window - > max_height = 700 ;
2017-07-02 21:49:39 +02:00
window_ride_list_refresh_list ( window ) ;
2017-06-06 23:24:18 +02:00
}
2020-06-13 23:36:43 +02:00
2017-06-06 23:24:18 +02:00
window - > list_information_type = 0 ;
_quickDemolishMode = false ;
2017-10-08 22:15:41 +02:00
return window ;
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B3511
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-19 04:16:20 +02:00
{
2018-06-22 23:21:44 +02:00
switch ( widgetIndex )
{
case WIDX_CLOSE :
window_close ( w ) ;
break ;
case WIDX_SORT :
w - > list_information_type = _window_ride_list_information_type ;
2017-06-06 23:24:18 +02:00
w - > selected_list_item = - 1 ;
2017-07-05 00:03:43 +02:00
window_ride_list_refresh_list ( w ) ;
2018-06-22 23:21:44 +02:00
break ;
case WIDX_TAB_1 :
case WIDX_TAB_2 :
case WIDX_TAB_3 :
if ( w - > page ! = widgetIndex - WIDX_TAB_1 )
{
w - > page = widgetIndex - WIDX_TAB_1 ;
w - > frame_no = 0 ;
w - > selected_list_item = - 1 ;
if ( w - > page ! = PAGE_RIDES & & _window_ride_list_information_type > INFORMATION_TYPE_RUNNING_COST )
{
_window_ride_list_information_type = INFORMATION_TYPE_STATUS ;
}
window_ride_list_refresh_list ( w ) ;
}
break ;
case WIDX_CLOSE_LIGHT :
window_ride_list_close_all ( w ) ;
break ;
case WIDX_OPEN_LIGHT :
window_ride_list_open_all ( w ) ;
break ;
case WIDX_QUICK_DEMOLISH :
if ( network_get_mode ( ) ! = NETWORK_MODE_CLIENT )
{
_quickDemolishMode = ! _quickDemolishMode ;
}
else
{
_quickDemolishMode = false ;
}
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2018-06-22 23:21:44 +02:00
break ;
2017-06-06 23:24:18 +02:00
}
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B38A7
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_resize ( rct_window * w )
2014-04-20 04:31:54 +02:00
{
2017-06-06 23:24:18 +02:00
w - > min_width = 340 ;
w - > min_height = 124 ;
2018-06-22 23:21:44 +02:00
if ( w - > width < w - > min_width )
{
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
w - > width = w - > min_width ;
}
2018-06-22 23:21:44 +02:00
if ( w - > height < w - > min_height )
{
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
w - > height = w - > min_height ;
}
2017-07-02 21:49:39 +02:00
// Refreshing the list can be a very intensive operation
// owing to its use of ride_has_any_track_elements().
// This makes sure it's only refreshed every 64 ticks.
2018-12-01 17:00:11 +01:00
if ( ! ( gCurrentRealTimeTicks & 0x3f ) )
2018-06-22 23:21:44 +02:00
{
2017-07-02 21:49:39 +02:00
window_ride_list_refresh_list ( w ) ;
}
2014-04-20 04:31:54 +02:00
}
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B3532
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_mousedown ( rct_window * w , rct_widgetindex widgetIndex , rct_widget * widget )
2014-04-19 04:16:20 +02:00
{
2018-06-22 23:21:44 +02:00
if ( widgetIndex = = WIDX_OPEN_CLOSE_ALL )
{
2017-06-06 23:24:18 +02:00
gDropdownItemsFormat [ 0 ] = STR_CLOSE_ALL ;
gDropdownItemsFormat [ 1 ] = STR_OPEN_ALL ;
2020-11-03 09:16:06 +01:00
WindowDropdownShowText (
2020-06-25 03:44:00 +02:00
{ w - > windowPos . x + widget - > left , w - > windowPos . y + widget - > top } , widget - > height ( ) , w - > colours [ 1 ] , 0 , 2 ) ;
2018-06-22 23:21:44 +02:00
}
else if ( widgetIndex = = WIDX_INFORMATION_TYPE_DROPDOWN )
{
2017-06-06 23:24:18 +02:00
widget - - ;
2018-06-20 17:28:51 +02:00
int32_t lastType ;
2017-06-06 23:24:18 +02:00
if ( w - > page = = PAGE_RIDES )
lastType = INFORMATION_TYPE_GUESTS_FAVOURITE ;
else
lastType = INFORMATION_TYPE_RUNNING_COST ;
2018-06-20 17:28:51 +02:00
int32_t numItems = 0 ;
int32_t selectedIndex = - 1 ;
2018-06-22 23:21:44 +02:00
for ( int32_t type = INFORMATION_TYPE_STATUS ; type < = lastType ; type + + )
{
if ( ( gParkFlags & PARK_FLAGS_NO_MONEY ) )
{
if ( ride_info_type_money_mapping [ type ] )
{
2017-06-06 23:24:18 +02:00
continue ;
}
}
2018-06-22 23:21:44 +02:00
if ( type = = _window_ride_list_information_type )
{
2017-06-06 23:24:18 +02:00
selectedIndex = numItems ;
}
gDropdownItemsFormat [ numItems ] = STR_DROPDOWN_MENU_LABEL ;
gDropdownItemsArgs [ numItems ] = ride_info_type_string_mapping [ type ] ;
numItems + + ;
}
2020-11-03 09:16:06 +01:00
WindowDropdownShowTextCustomWidth (
2020-06-25 03:44:00 +02:00
{ w - > windowPos . x + widget - > left , w - > windowPos . y + widget - > top } , widget - > height ( ) , w - > colours [ 1 ] , 0 ,
2020-11-03 09:16:06 +01:00
Dropdown : : Flag : : StayOpen , numItems , widget - > width ( ) - 3 ) ;
2018-06-22 23:21:44 +02:00
if ( selectedIndex ! = - 1 )
{
2020-11-03 09:16:06 +01:00
Dropdown : : SetChecked ( selectedIndex , true ) ;
2017-06-06 23:24:18 +02:00
}
}
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B3547
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_dropdown ( rct_window * w , rct_widgetindex widgetIndex , int32_t dropdownIndex )
2014-04-19 04:16:20 +02:00
{
2017-11-20 17:08:14 +01:00
if ( widgetIndex = = WIDX_OPEN_CLOSE_ALL )
{
2017-06-06 23:24:18 +02:00
if ( dropdownIndex = = 0 )
2017-11-20 17:08:14 +01:00
{
2017-06-06 23:24:18 +02:00
window_ride_list_close_all ( w ) ;
2017-11-20 17:08:14 +01:00
}
2017-06-06 23:24:18 +02:00
else if ( dropdownIndex = = 1 )
2017-11-20 17:08:14 +01:00
{
2017-06-06 23:24:18 +02:00
window_ride_list_open_all ( w ) ;
2017-11-20 17:08:14 +01:00
}
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-11-20 17:08:14 +01:00
}
else if ( widgetIndex = = WIDX_INFORMATION_TYPE_DROPDOWN )
{
2017-06-06 23:24:18 +02:00
if ( dropdownIndex = = - 1 )
return ;
2018-06-20 17:28:51 +02:00
int32_t informationType = INFORMATION_TYPE_STATUS ;
2020-04-18 13:32:48 +02:00
uint32_t arg = static_cast < uint32_t > ( gDropdownItemsArgs [ dropdownIndex ] ) ;
2018-11-21 23:16:04 +01:00
for ( size_t i = 0 ; i < std : : size ( ride_info_type_string_mapping ) ; i + + )
2017-11-20 17:08:14 +01:00
{
if ( arg = = ride_info_type_string_mapping [ i ] )
{
2020-04-18 13:32:48 +02:00
informationType = static_cast < int32_t > ( i ) ;
2017-06-06 23:24:18 +02:00
}
}
_window_ride_list_information_type = informationType ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B386B
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_update ( rct_window * w )
2014-04-19 04:16:20 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no = ( w - > frame_no + 1 ) % 64 ;
widget_invalidate ( w , WIDX_TAB_1 + w - > page ) ;
if ( _window_ride_list_information_type ! = INFORMATION_TYPE_STATUS )
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B35A1
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_scrollgetsize ( rct_window * w , int32_t scrollIndex , int32_t * width , int32_t * height )
2014-04-20 04:31:54 +02:00
{
2021-05-04 22:05:21 +02:00
* height = static_cast < int32_t > ( _rideList . size ( ) * SCROLLABLE_ROW_HEIGHT ) ;
2018-06-22 23:21:44 +02:00
if ( w - > selected_list_item ! = - 1 )
{
2017-06-06 23:24:18 +02:00
w - > selected_list_item = - 1 ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
}
2021-05-04 22:05:21 +02:00
auto top = * height - window_ride_list_widgets [ WIDX_LIST ] . bottom + window_ride_list_widgets [ WIDX_LIST ] . top + 21 ;
2017-06-06 23:24:18 +02:00
if ( top < 0 )
top = 0 ;
2018-06-22 23:21:44 +02:00
if ( top < w - > scrolls [ 0 ] . v_top )
{
2017-06-06 23:24:18 +02:00
w - > scrolls [ 0 ] . v_top = top ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-20 04:31:54 +02:00
}
2014-04-23 18:29:16 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-23 18:29:16 +02:00
* rct2 : 0x006B361F
*/
2020-02-29 03:43:29 +01:00
static void window_ride_list_scrollmousedown ( rct_window * w , int32_t scrollIndex , const ScreenCoordsXY & screenCoords )
2014-04-23 18:29:16 +02:00
{
2021-05-04 22:05:21 +02:00
auto index = screenCoords . y / SCROLLABLE_ROW_HEIGHT ;
if ( index < 0 | | static_cast < size_t > ( index ) > = _rideList . size ( ) )
2017-06-06 23:24:18 +02:00
return ;
// Open ride window
2021-05-04 22:05:21 +02:00
auto rideIndex = _rideList [ index ] ;
2019-01-20 15:54:59 +01:00
auto ride = get_ride ( rideIndex ) ;
2018-06-22 23:21:44 +02:00
if ( _quickDemolishMode & & network_get_mode ( ) ! = NETWORK_MODE_CLIENT )
{
2019-01-20 15:54:59 +01:00
ride_action_modify ( ride , RIDE_MODIFY_DEMOLISH , GAME_COMMAND_FLAG_APPLY ) ;
2017-07-26 11:07:12 +02:00
window_ride_list_refresh_list ( w ) ;
2017-06-06 23:24:18 +02:00
}
2018-06-22 23:21:44 +02:00
else
{
2017-10-21 16:03:33 +02:00
auto intent = Intent ( WC_RIDE ) ;
2021-09-08 16:07:41 +02:00
intent . putExtra ( INTENT_EXTRA_RIDE_ID , EnumValue ( rideIndex ) ) ;
2017-10-21 16:03:33 +02:00
context_open_intent ( & intent ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-23 18:29:16 +02:00
}
/**
2015-10-20 20:16:30 +02:00
*
2014-04-23 18:29:16 +02:00
* rct2 : 0x006B35EF
*/
2020-02-29 03:43:29 +01:00
static void window_ride_list_scrollmouseover ( rct_window * w , int32_t scrollIndex , const ScreenCoordsXY & screenCoords )
2014-04-23 18:29:16 +02:00
{
2021-05-04 22:05:21 +02:00
auto index = screenCoords . y / SCROLLABLE_ROW_HEIGHT ;
if ( index < 0 | | static_cast < size_t > ( index ) > = _rideList . size ( ) )
2017-06-06 23:24:18 +02:00
return ;
2014-04-23 18:29:16 +02:00
2017-06-06 23:24:18 +02:00
w - > selected_list_item = index ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2014-04-23 18:29:16 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B3182
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_invalidate ( rct_window * w )
2014-04-19 04:16:20 +02:00
{
2018-07-21 11:50:45 +02:00
window_ride_list_widgets [ WIDX_CURRENT_INFORMATION_TYPE ] . text = ride_info_type_string_mapping
[ _window_ride_list_information_type ] ;
2017-06-06 23:24:18 +02:00
// Set correct active tab
2018-06-20 17:28:51 +02:00
for ( int32_t i = 0 ; i < 3 ; i + + )
2017-06-06 23:24:18 +02:00
w - > pressed_widgets & = ~ ( 1 < < ( WIDX_TAB_1 + i ) ) ;
w - > pressed_widgets | = 1LL < < ( WIDX_TAB_1 + w - > page ) ;
window_ride_list_widgets [ WIDX_TITLE ] . text = page_names [ w - > page ] ;
if ( _quickDemolishMode )
w - > pressed_widgets | = ( 1ULL < < WIDX_QUICK_DEMOLISH ) ;
else
w - > pressed_widgets & = ~ ( 1ULL < < WIDX_QUICK_DEMOLISH ) ;
w - > widgets [ WIDX_BACKGROUND ] . right = w - > width - 1 ;
w - > widgets [ WIDX_BACKGROUND ] . bottom = w - > height - 1 ;
w - > widgets [ WIDX_PAGE_BACKGROUND ] . right = w - > width - 1 ;
w - > widgets [ WIDX_PAGE_BACKGROUND ] . bottom = w - > height - 1 ;
w - > widgets [ WIDX_TITLE ] . right = w - > width - 2 ;
2020-05-05 22:31:04 +02:00
2021-01-10 19:23:35 +01:00
// if close button is on the right then it must move
2020-05-05 22:31:04 +02:00
w - > widgets [ WIDX_CLOSE ] . left = w - > width - 13 ;
w - > widgets [ WIDX_CLOSE ] . right = w - > width - 3 ;
2017-06-06 23:24:18 +02:00
w - > widgets [ WIDX_LIST ] . right = w - > width - 26 ;
w - > widgets [ WIDX_LIST ] . bottom = w - > height - 15 ;
w - > widgets [ WIDX_OPEN_CLOSE_ALL ] . right = w - > width - 2 ;
w - > widgets [ WIDX_OPEN_CLOSE_ALL ] . left = w - > width - 25 ;
w - > widgets [ WIDX_CLOSE_LIGHT ] . right = w - > width - 7 ;
w - > widgets [ WIDX_CLOSE_LIGHT ] . left = w - > width - 20 ;
w - > widgets [ WIDX_OPEN_LIGHT ] . right = w - > width - 7 ;
w - > widgets [ WIDX_OPEN_LIGHT ] . left = w - > width - 20 ;
w - > widgets [ WIDX_QUICK_DEMOLISH ] . right = w - > width - 2 ;
w - > widgets [ WIDX_QUICK_DEMOLISH ] . left = w - > width - 25 ;
2020-11-03 11:59:00 +01:00
if ( ThemeGetFlags ( ) & UITHEME_FLAG_USE_LIGHTS_RIDE )
2018-06-22 23:21:44 +02:00
{
2020-11-27 04:14:20 +01:00
w - > widgets [ WIDX_OPEN_CLOSE_ALL ] . type = WindowWidgetType : : Empty ;
w - > widgets [ WIDX_CLOSE_LIGHT ] . type = WindowWidgetType : : ImgBtn ;
w - > widgets [ WIDX_OPEN_LIGHT ] . type = WindowWidgetType : : ImgBtn ;
2017-06-06 23:24:18 +02:00
2019-08-03 19:11:30 +02:00
const auto & rideManager = GetRideManager ( ) ;
2020-05-05 00:38:48 +02:00
auto allClosed = true ;
2019-08-03 19:11:30 +02:00
auto allOpen = false ;
2021-05-04 22:05:21 +02:00
if ( _rideList . size ( ) > 0 & & std : : size ( rideManager ) ! = 0 )
2018-06-22 23:21:44 +02:00
{
2020-04-18 13:32:48 +02:00
auto c = static_cast < RideClassification > ( w - > page ) ;
2019-08-24 10:45:39 +02:00
allClosed = std : : none_of ( rideManager . begin ( ) , rideManager . end ( ) , [ c ] ( const Ride & ride ) {
2021-06-10 08:09:58 +02:00
return ride . GetClassification ( ) = = c & & ride . status = = RideStatus : : Open ;
2019-08-03 19:11:30 +02:00
} ) ;
2019-08-24 10:45:39 +02:00
allOpen = std : : none_of ( rideManager . begin ( ) , rideManager . end ( ) , [ c ] ( const Ride & ride ) {
2021-06-10 08:09:58 +02:00
return ride . GetClassification ( ) = = c & & ride . status ! = RideStatus : : Open ;
2019-08-03 19:11:30 +02:00
} ) ;
2017-06-06 23:24:18 +02:00
}
2019-08-03 19:11:30 +02:00
w - > widgets [ WIDX_CLOSE_LIGHT ] . image = SPR_G2_RCT1_CLOSE_BUTTON_0 + ( allClosed ? 1 : 0 ) * 2
2020-11-03 22:29:22 +01:00
+ WidgetIsPressed ( w , WIDX_CLOSE_LIGHT ) ;
2019-08-03 19:11:30 +02:00
w - > widgets [ WIDX_OPEN_LIGHT ] . image = SPR_G2_RCT1_OPEN_BUTTON_0 + ( allOpen ? 1 : 0 ) * 2
2020-11-03 22:29:22 +01:00
+ WidgetIsPressed ( w , WIDX_OPEN_LIGHT ) ;
2017-06-06 23:24:18 +02:00
w - > widgets [ WIDX_QUICK_DEMOLISH ] . top = w - > widgets [ WIDX_OPEN_LIGHT ] . bottom + 3 ;
}
2018-06-22 23:21:44 +02:00
else
{
2020-11-27 04:14:20 +01:00
w - > widgets [ WIDX_OPEN_CLOSE_ALL ] . type = WindowWidgetType : : FlatBtn ;
w - > widgets [ WIDX_CLOSE_LIGHT ] . type = WindowWidgetType : : Empty ;
w - > widgets [ WIDX_OPEN_LIGHT ] . type = WindowWidgetType : : Empty ;
2017-06-06 23:24:18 +02:00
w - > widgets [ WIDX_QUICK_DEMOLISH ] . top = w - > widgets [ WIDX_OPEN_CLOSE_ALL ] . bottom + 3 ;
}
w - > widgets [ WIDX_QUICK_DEMOLISH ] . bottom = w - > widgets [ WIDX_QUICK_DEMOLISH ] . top + 23 ;
2020-11-27 04:14:20 +01:00
w - > widgets [ WIDX_QUICK_DEMOLISH ] . type = network_get_mode ( ) ! = NETWORK_MODE_CLIENT ? WindowWidgetType : : FlatBtn
: WindowWidgetType : : Empty ;
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B3235
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-19 04:16:20 +02:00
{
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_ride_list_draw_tab_images ( dpi , w ) ;
2016-04-30 18:12:12 +02:00
2017-06-06 23:24:18 +02:00
// Draw number of attractions on bottom
2021-07-27 20:32:27 +02:00
auto ft = Formatter ( ) ;
2021-05-04 22:05:21 +02:00
ft . Add < uint16_t > ( static_cast < uint16_t > ( _rideList . size ( ) ) ) ;
2021-02-27 16:49:13 +01:00
DrawTextBasic (
dpi , w - > windowPos + ScreenCoordsXY { 4 , w - > widgets [ WIDX_LIST ] . bottom + 2 } , ride_list_statusbar_count_strings [ w - > page ] ,
2021-07-27 20:32:27 +02:00
ft ) ;
2014-04-19 04:16:20 +02:00
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B3240
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_scrollpaint ( rct_window * w , rct_drawpixelinfo * dpi , int32_t scrollIndex )
2014-04-20 04:31:54 +02:00
{
2020-07-16 03:34:57 +02:00
auto dpiCoords = ScreenCoordsXY { dpi - > x , dpi - > y } ;
gfx_fill_rect (
dpi , { dpiCoords , dpiCoords + ScreenCoordsXY { dpi - > width , dpi - > height } } , ColourMapA [ w - > colours [ 1 ] ] . mid_light ) ;
2017-06-06 23:24:18 +02:00
2019-07-31 20:50:06 +02:00
auto y = 0 ;
2021-05-04 22:05:21 +02:00
for ( size_t i = 0 ; i < _rideList . size ( ) ; i + + )
2018-06-22 23:21:44 +02:00
{
2019-07-31 20:50:06 +02:00
rct_string_id format = ( _quickDemolishMode ? STR_RED_STRINGID : STR_BLACK_STRING ) ;
2021-05-04 22:05:21 +02:00
if ( i = = static_cast < size_t > ( w - > selected_list_item ) )
2018-06-22 23:21:44 +02:00
{
2019-07-31 20:50:06 +02:00
// Background highlight
2020-12-05 19:13:59 +01:00
gfx_filter_rect ( dpi , 0 , y , 800 , y + SCROLLABLE_ROW_HEIGHT - 1 , FilterPaletteID : : PaletteDarken1 ) ;
2017-06-06 23:24:18 +02:00
format = ( _quickDemolishMode ? STR_LIGHTPINK_STRINGID : STR_WINDOW_COLOUR_2_STRINGID ) ;
}
// Get ride
2021-05-04 22:05:21 +02:00
auto ride = get_ride ( _rideList [ i ] ) ;
2019-07-31 20:50:06 +02:00
if ( ride = = nullptr )
continue ;
2017-06-06 23:24:18 +02:00
// Ride name
2020-09-30 23:42:04 +02:00
auto ft = Formatter ( ) ;
2020-06-25 02:02:08 +02:00
ride - > FormatNameTo ( ft ) ;
2021-02-28 00:22:24 +01:00
DrawTextEllipsised ( dpi , { 0 , y - 1 } , 159 , format , ft ) ;
2017-06-06 23:24:18 +02:00
// Ride information
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
2020-06-03 12:03:12 +02:00
ft . Increment ( 2 ) ;
2019-07-31 20:50:06 +02:00
auto formatSecondaryEnabled = true ;
rct_string_id formatSecondary = 0 ;
2018-06-22 23:21:44 +02:00
switch ( _window_ride_list_information_type )
2017-08-02 00:20:32 +02:00
{
2018-06-22 23:21:44 +02:00
case INFORMATION_TYPE_STATUS :
2019-07-31 20:50:06 +02:00
formatSecondaryEnabled = false ;
2020-07-09 18:54:30 +02:00
ft . Rewind ( ) ;
ride - > FormatStatusTo ( ft ) ;
2019-07-21 21:44:19 +02:00
// Make test red and bold if broken down or crashed
if ( ( ride - > lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN ) | | ( ride - > lifecycle_flags & RIDE_LIFECYCLE_CRASHED ) )
{
format = STR_RED_OUTLINED_STRING ;
}
2018-06-22 23:21:44 +02:00
break ;
case INFORMATION_TYPE_POPULARITY :
formatSecondary = STR_POPULARITY_UNKNOWN_LABEL ;
if ( ride - > popularity ! = 255 )
{
formatSecondary = STR_POPULARITY_LABEL ;
2020-06-03 12:03:12 +02:00
ft . Add < uint16_t > ( ride - > popularity * 4 ) ;
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_SATISFACTION :
formatSecondary = STR_SATISFACTION_UNKNOWN_LABEL ;
if ( ride - > satisfaction ! = 255 )
{
formatSecondary = STR_SATISFACTION_LABEL ;
2020-06-03 12:03:12 +02:00
ft . Add < uint16_t > ( ride - > satisfaction * 5 ) ;
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_PROFIT :
formatSecondary = 0 ;
2021-04-10 17:00:50 +02:00
if ( ride - > profit ! = MONEY64_UNDEFINED )
2018-06-22 23:21:44 +02:00
{
formatSecondary = STR_PROFIT_LABEL ;
2021-05-10 22:54:17 +02:00
ft . Add < money64 > ( ride - > profit ) ;
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_TOTAL_CUSTOMERS :
formatSecondary = STR_RIDE_LIST_TOTAL_CUSTOMERS_LABEL ;
2020-06-03 12:03:12 +02:00
ft . Add < uint32_t > ( ride - > total_customers ) ;
2018-06-22 23:21:44 +02:00
break ;
case INFORMATION_TYPE_TOTAL_PROFIT :
formatSecondary = 0 ;
2021-04-10 17:00:50 +02:00
if ( ride - > total_profit ! = MONEY64_UNDEFINED )
2018-06-22 23:21:44 +02:00
{
formatSecondary = STR_RIDE_LIST_TOTAL_PROFIT_LABEL ;
2021-05-10 22:54:17 +02:00
ft . Add < money64 > ( ride - > total_profit ) ;
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_CUSTOMERS :
formatSecondary = STR_RIDE_LIST_CUSTOMERS_PER_HOUR_LABEL ;
2020-06-03 12:03:12 +02:00
ft . Add < uint32_t > ( ride_customers_per_hour ( ride ) ) ;
2018-06-22 23:21:44 +02:00
break ;
case INFORMATION_TYPE_AGE :
2017-06-06 23:24:18 +02:00
{
2020-05-12 20:11:29 +02:00
int16_t age = date_get_year ( ride - > GetAge ( ) ) ;
2018-06-22 23:21:44 +02:00
switch ( age )
{
case 0 :
formatSecondary = STR_RIDE_LIST_BUILT_THIS_YEAR_LABEL ;
break ;
case 1 :
formatSecondary = STR_RIDE_LIST_BUILT_LAST_YEAR_LABEL ;
break ;
default :
formatSecondary = STR_RIDE_LIST_BUILT_X_YEARS_AGO_LABEL ;
break ;
}
2020-06-03 12:03:12 +02:00
ft . Add < int16_t > ( age ) ;
2018-06-22 23:21:44 +02:00
break ;
2017-06-06 23:24:18 +02:00
}
2018-06-22 23:21:44 +02:00
case INFORMATION_TYPE_INCOME :
formatSecondary = 0 ;
2021-04-10 17:00:50 +02:00
if ( ride - > income_per_hour ! = MONEY64_UNDEFINED )
2018-06-22 23:21:44 +02:00
{
formatSecondary = STR_RIDE_LIST_INCOME_LABEL ;
2021-05-10 22:54:17 +02:00
ft . Add < money64 > ( ride - > income_per_hour ) ;
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_RUNNING_COST :
formatSecondary = STR_RIDE_LIST_RUNNING_COST_UNKNOWN ;
2020-05-11 00:58:01 +02:00
if ( ride - > upkeep_cost ! = MONEY16_UNDEFINED )
2018-06-22 23:21:44 +02:00
{
formatSecondary = STR_RIDE_LIST_RUNNING_COST_LABEL ;
2021-05-10 22:54:17 +02:00
ft . Add < money64 > ( ride - > upkeep_cost * 16 ) ;
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_QUEUE_LENGTH :
2020-09-30 23:42:04 +02:00
{
auto queueLength = ride - > GetTotalQueueLength ( ) ;
ft . Add < uint16_t > ( queueLength ) ;
2018-06-22 23:21:44 +02:00
2020-09-30 23:42:04 +02:00
if ( queueLength = = 1 )
{
formatSecondary = STR_QUEUE_ONE_PERSON ;
}
else if ( queueLength > 1 )
{
formatSecondary = STR_QUEUE_PEOPLE ;
}
else
{
formatSecondary = STR_QUEUE_EMPTY ;
2018-06-22 23:21:44 +02:00
}
break ;
2020-09-30 23:42:04 +02:00
}
2018-06-22 23:21:44 +02:00
case INFORMATION_TYPE_QUEUE_TIME :
2020-09-30 23:42:04 +02:00
{
auto maxQueueTime = ride - > GetMaxQueueTime ( ) ;
ft . Add < uint16_t > ( maxQueueTime ) ;
2018-06-22 23:21:44 +02:00
2020-09-30 23:42:04 +02:00
if ( maxQueueTime > 1 )
{
formatSecondary = STR_QUEUE_TIME_PLURAL_LABEL ;
}
else
{
formatSecondary = STR_QUEUE_TIME_LABEL ;
2018-06-22 23:21:44 +02:00
}
break ;
2020-09-30 23:42:04 +02:00
}
2018-06-22 23:21:44 +02:00
case INFORMATION_TYPE_RELIABILITY :
2020-06-03 12:03:12 +02:00
ft . Add < uint16_t > ( ride - > reliability_percentage ) ;
2018-06-22 23:21:44 +02:00
formatSecondary = STR_RELIABILITY_LABEL ;
break ;
case INFORMATION_TYPE_DOWN_TIME :
2020-06-03 12:03:12 +02:00
ft . Add < uint16_t > ( ride - > downtime ) ;
2018-06-22 23:21:44 +02:00
formatSecondary = STR_DOWN_TIME_LABEL ;
break ;
case INFORMATION_TYPE_GUESTS_FAVOURITE :
formatSecondary = 0 ;
2019-08-03 19:11:30 +02:00
if ( ride - > IsRide ( ) )
2018-06-22 23:21:44 +02:00
{
2020-06-03 12:03:12 +02:00
ft . Add < uint16_t > ( ride - > guests_favourite ) ;
2018-07-21 11:50:45 +02:00
formatSecondary = ride - > guests_favourite = = 1 ? STR_GUESTS_FAVOURITE_LABEL
: STR_GUESTS_FAVOURITE_PLURAL_LABEL ;
2018-06-22 23:21:44 +02:00
}
break ;
2017-06-06 23:24:18 +02:00
}
2019-07-31 20:50:06 +02:00
if ( formatSecondaryEnabled )
{
2020-06-03 12:54:39 +02:00
ft . Rewind ( ) ;
2020-06-03 12:03:12 +02:00
ft . Add < rct_string_id > ( formatSecondary ) ;
2019-07-31 20:50:06 +02:00
}
2021-02-28 00:22:24 +01:00
DrawTextEllipsised ( dpi , { 160 , y - 1 } , 157 , format , ft ) ;
2017-12-18 15:59:17 +01:00
y + = SCROLLABLE_ROW_HEIGHT ;
2017-06-06 23:24:18 +02:00
}
2014-04-20 04:31:54 +02:00
}
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B38EA
*/
2018-06-22 23:21:44 +02:00
static void window_ride_list_draw_tab_images ( rct_drawpixelinfo * dpi , rct_window * w )
2014-04-19 04:16:20 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t sprite_idx ;
2017-06-06 23:24:18 +02:00
// Rides tab
sprite_idx = SPR_TAB_RIDE_0 ;
if ( w - > page = = PAGE_RIDES )
sprite_idx + = w - > frame_no / 4 ;
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( sprite_idx ) , w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_1 ] . left , w - > widgets [ WIDX_TAB_1 ] . top } ) ;
2017-06-06 23:24:18 +02:00
// Shops and stalls tab
sprite_idx = SPR_TAB_SHOPS_AND_STALLS_0 ;
if ( w - > page = = PAGE_SHOPS_AND_STALLS )
sprite_idx + = w - > frame_no / 4 ;
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( sprite_idx ) , w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_2 ] . left , w - > widgets [ WIDX_TAB_2 ] . top } ) ;
2017-06-06 23:24:18 +02:00
// Information kiosks and facilities tab
sprite_idx = SPR_TAB_KIOSKS_AND_FACILITIES_0 ;
if ( w - > page = = PAGE_KIOSKS_AND_FACILITIES )
sprite_idx + = ( w - > frame_no / 4 ) % 8 ;
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( sprite_idx ) , w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_3 ] . left , w - > widgets [ WIDX_TAB_3 ] . top } ) ;
2014-04-20 04:31:54 +02:00
}
2021-05-04 22:05:21 +02:00
/**
* 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 ] ) ;
}
2014-04-20 04:31:54 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-20 04:31:54 +02:00
* rct2 : 0x006B39A8
*/
2018-06-22 23:21:44 +02:00
void window_ride_list_refresh_list ( rct_window * w )
2014-04-20 04:31:54 +02:00
{
2021-05-04 22:05:21 +02:00
_rideList . clear ( ) ;
size_t list_index = 0 ;
2019-08-03 19:11:30 +02:00
for ( auto & ridec : GetRideManager ( ) )
2018-06-22 23:21:44 +02:00
{
2019-08-03 19:11:30 +02:00
auto ride = & ridec ;
2020-04-19 14:08:22 +02:00
if ( ride - > GetClassification ( ) ! = static_cast < RideClassification > ( w - > page )
2021-06-10 08:09:58 +02:00
| | ( ride - > status = = RideStatus : : Closed & & ! ride_has_any_track_elements ( ride ) ) )
2017-06-06 23:24:18 +02:00
continue ;
2018-06-22 23:21:44 +02:00
if ( ride - > window_invalidate_flags & RIDE_INVALIDATE_RIDE_LIST )
{
2017-06-06 23:24:18 +02:00
ride - > window_invalidate_flags & = ~ RIDE_INVALIDATE_RIDE_LIST ;
}
2021-05-04 22:05:21 +02:00
_rideList . push_back ( ride - > id ) ;
auto current_list_position = static_cast < int32_t > ( list_index ) ;
2018-06-22 23:21:44 +02:00
switch ( w - > list_information_type )
{
case INFORMATION_TYPE_STATUS :
2019-07-21 02:28:33 +02:00
{
auto strA = ride - > GetName ( ) ;
2018-06-22 23:21:44 +02:00
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
auto strB = otherRide - > GetName ( ) ;
2020-03-23 22:33:57 +01:00
if ( strlogicalcmp ( strA . c_str ( ) , strB . c_str ( ) ) > = 0 )
2019-08-09 09:06:25 +02:00
break ;
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
2019-07-21 02:28:33 +02:00
}
2018-06-22 23:21:44 +02:00
case INFORMATION_TYPE_POPULARITY :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > popularity * 4 < = otherRide - > popularity * 4 )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_SATISFACTION :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > satisfaction * 5 < = otherRide - > satisfaction * 5 )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_PROFIT :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > profit < = otherRide - > profit )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_TOTAL_CUSTOMERS :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > total_customers < = otherRide - > total_customers )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_TOTAL_PROFIT :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > total_profit < = otherRide - > total_profit )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_CUSTOMERS :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride_customers_per_hour ( ride ) < = ride_customers_per_hour ( otherRide ) )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_AGE :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > build_date < = otherRide - > build_date )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_INCOME :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > income_per_hour < = otherRide - > income_per_hour )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_RUNNING_COST :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > upkeep_cost < = otherRide - > upkeep_cost )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_QUEUE_LENGTH :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > GetTotalQueueLength ( ) < = otherRide - > GetTotalQueueLength ( ) )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_QUEUE_TIME :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > GetMaxQueueTime ( ) < = otherRide - > GetMaxQueueTime ( ) )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_RELIABILITY :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > reliability_percentage < = otherRide - > reliability_percentage )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_DOWN_TIME :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > downtime < = otherRide - > downtime )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
case INFORMATION_TYPE_GUESTS_FAVOURITE :
while ( - - current_list_position > = 0 )
{
2021-05-04 22:05:21 +02:00
auto otherRide = get_ride ( _rideList [ current_list_position ] ) ;
2019-08-09 09:06:25 +02:00
if ( otherRide ! = nullptr )
{
if ( ride - > guests_favourite < = otherRide - > guests_favourite )
break ;
2018-06-22 23:21:44 +02:00
2019-08-09 09:06:25 +02:00
window_bubble_list_item ( w , current_list_position ) ;
}
2018-06-22 23:21:44 +02:00
}
break ;
2017-06-06 23:24:18 +02:00
}
list_index + + ;
}
w - > selected_list_item = - 1 ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2014-04-20 04:31:54 +02:00
}
2018-06-22 23:21:44 +02:00
static void window_ride_list_close_all ( rct_window * w )
2014-04-20 04:31:54 +02:00
{
2019-08-03 19:11:30 +02:00
for ( auto & ride : GetRideManager ( ) )
2018-06-22 23:21:44 +02:00
{
2021-06-10 08:09:58 +02:00
if ( ride . status ! = RideStatus : : Closed & & ride . GetClassification ( ) = = static_cast < RideClassification > ( w - > page ) )
2019-08-03 19:11:30 +02:00
{
2021-06-10 08:09:58 +02:00
ride_set_status ( & ride , RideStatus : : Closed ) ;
2019-08-03 19:11:30 +02:00
}
2017-06-06 23:24:18 +02:00
}
2014-04-20 04:31:54 +02:00
}
2018-06-22 23:21:44 +02:00
static void window_ride_list_open_all ( rct_window * w )
2014-04-20 04:31:54 +02:00
{
2019-08-03 19:11:30 +02:00
for ( auto & ride : GetRideManager ( ) )
2018-06-22 23:21:44 +02:00
{
2021-06-10 08:09:58 +02:00
if ( ride . status ! = RideStatus : : Open & & ride . GetClassification ( ) = = static_cast < RideClassification > ( w - > page ) )
2019-08-03 19:11:30 +02:00
{
2021-06-10 08:09:58 +02:00
ride_set_status ( & ride , RideStatus : : Open ) ;
2019-08-03 19:11:30 +02:00
}
2017-06-06 23:24:18 +02:00
}
2014-04-21 11:27:48 +02:00
}