2014-04-14 22:25:20 +02:00
/*****************************************************************************
2020-07-21 15:04:34 +02:00
* Copyright ( c ) 2014 - 2020 OpenRCT2 developers
2014-04-14 22:25: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-14 22:25:20 +02:00
*
2018-06-15 14:07:34 +02:00
* OpenRCT2 is licensed under the GNU General Public License version 3.
2014-04-14 22:25:20 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2018-06-22 23:21:44 +02:00
# include "../interface/Theme.h"
2018-08-12 13:50:40 +02:00
# include <algorithm>
2018-05-16 22:22:17 +02:00
# include <limits>
2018-06-22 23:21:44 +02:00
# include <openrct2-ui/interface/Dropdown.h>
2017-12-07 02:47:26 +01:00
# include <openrct2-ui/interface/Graph.h>
# include <openrct2-ui/interface/LandTool.h>
2018-06-22 23:21:44 +02:00
# include <openrct2-ui/interface/Viewport.h>
# include <openrct2-ui/interface/Widget.h>
2017-09-05 20:55:18 +02:00
# include <openrct2-ui/windows/Window.h>
2018-06-22 23:21:44 +02:00
# include <openrct2/Context.h>
2017-11-30 18:17:06 +01:00
# include <openrct2/Game.h>
2019-07-21 11:33:15 +02:00
# include <openrct2/GameState.h>
2018-06-22 23:21:44 +02:00
# include <openrct2/Input.h>
Split actions hpp files into separate h and cpp files (#13548)
* Split up SmallSceneryPlace/Remove
Added undo function for Remove Scenery
* Refactor: Balloon and Banner actions hpp=>h/cpp
* Refactor: rename all action *.hpp files to *.cpp
This is preparation for separation in later commits. Note that without
the complete set of commits in this branch, the code will not build.
* Refactor Clear, Climate, Custom, and Footpath actions hpp=>h/cpp
* VSCode: add src subdirectories to includePath
* Refactor Guest actions hpp=>h/cpp
* Refactor Land actions hpp=>h/cpp
* Refactor LargeScenery actions hpp=>h/cpp
* Refactor Load, Maze, Network actions hpp=>h/cpp
* Refactor Park actions hpp=>h/cpp
* Refactor/style: move private function declarations in actions *.h
Previous action .h files included private function declarations with
private member variables, before public function declarations. This
commit re-orders the header files to the following order:
- public member variables
- private member variables
- public functions
- private functions
* Refactor Pause action hpp=>h/cpp
* Refactor Peep, Place, Player actions hpp=>h/cpp
* Refactor Ride actions hpp=>h/cpp
* Refactor Scenario, Set*, Sign* actions hpp=>h/cpp
* Refactor SmallScenerySetColourAction hpp=>h/cpp
* Refactor Staff actions hpp=>h/cpp
* Refactor Surface, Tile, Track* actions hpp=>h/cpp
* Refactor Wall and Water actions hpp=>h/cpp
* Fix various includes and other compile errors
Update includes for tests.
Move static function declarations to .h files
Add explicit includes to various files that were previously implicit
(the required header was a nested include in an action hpp file, and the
action .h file does not include that header)
Move RideSetStatus string enum to the cpp file to avoid unused imports
* Xcode: modify project file for actions refactor
* Cleanup whitespace and end-of-file newlines
Co-authored-by: duncanspumpkin <duncans_pumpkin@hotmail.co.uk>
2020-12-10 07:39:10 +01:00
# include <openrct2/actions/ParkSetNameAction.h>
2018-06-22 23:21:44 +02:00
# include <openrct2/config/Config.h>
2018-01-06 18:32:25 +01:00
# include <openrct2/localisation/Date.h>
# include <openrct2/localisation/Localisation.h>
2017-10-11 21:38:26 +02:00
# include <openrct2/management/Award.h>
2020-08-13 00:23:08 +02:00
# include <openrct2/ride/RideData.h>
2018-06-22 23:21:44 +02:00
# include <openrct2/scenario/Scenario.h>
2017-12-13 13:02:24 +01:00
# include <openrct2/util/Util.h>
2017-12-14 10:34:12 +01:00
# include <openrct2/world/Entrance.h>
2018-03-19 23:28:40 +01:00
# include <openrct2/world/Park.h>
2014-04-14 22:25:20 +02:00
2020-05-05 22:26:14 +02:00
static constexpr const rct_string_id WINDOW_TITLE = STR_STRINGID ;
static constexpr const int32_t WH = 224 ;
2019-10-19 04:02:31 +02:00
2018-05-16 20:41:29 +02:00
// clang-format off
2014-04-14 22:25:20 +02:00
enum WINDOW_PARK_PAGE {
2017-06-06 23:24:18 +02:00
WINDOW_PARK_PAGE_ENTRANCE ,
WINDOW_PARK_PAGE_RATING ,
WINDOW_PARK_PAGE_GUESTS ,
WINDOW_PARK_PAGE_PRICE ,
WINDOW_PARK_PAGE_STATS ,
WINDOW_PARK_PAGE_OBJECTIVE ,
WINDOW_PARK_PAGE_AWARDS
2014-04-14 22:25:20 +02:00
} ;
enum WINDOW_PARK_WIDGET_IDX {
2017-06-06 23:24:18 +02:00
WIDX_BACKGROUND ,
WIDX_TITLE ,
WIDX_CLOSE ,
WIDX_PAGE_BACKGROUND ,
WIDX_TAB_1 ,
WIDX_TAB_2 ,
WIDX_TAB_3 ,
WIDX_TAB_4 ,
WIDX_TAB_5 ,
WIDX_TAB_6 ,
WIDX_TAB_7 ,
WIDX_VIEWPORT = 11 ,
WIDX_STATUS ,
WIDX_OPEN_OR_CLOSE ,
WIDX_BUY_LAND_RIGHTS ,
WIDX_LOCATE ,
WIDX_RENAME ,
WIDX_CLOSE_LIGHT ,
WIDX_OPEN_LIGHT ,
WIDX_PRICE_LABEL = 11 ,
WIDX_PRICE ,
WIDX_INCREASE_PRICE ,
WIDX_DECREASE_PRICE ,
WIDX_ENTER_NAME = 11
2014-04-16 03:05:49 +02:00
} ;
# pragma region Widgets
2020-03-07 13:43:22 +01:00
# define MAIN_PARK_WIDGETS(WW) \
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 } , { WW , 131 } , WindowWidgetType : : Resize , WindowColour : : Secondary ) , /* tab content panel */ \
2020-08-29 04:31:31 +02:00
MakeTab ( { 3 , 17 } , STR_PARK_ENTRANCE_TAB_TIP ) , /* tab 1 */ \
MakeTab ( { 34 , 17 } , STR_PARK_RATING_TAB_TIP ) , /* tab 2 */ \
MakeTab ( { 65 , 17 } , STR_PARK_GUESTS_TAB_TIP ) , /* tab 3 */ \
MakeTab ( { 96 , 17 } , STR_PARK_PRICE_TAB_TIP ) , /* tab 4 */ \
MakeTab ( { 127 , 17 } , STR_PARK_STATS_TAB_TIP ) , /* tab 5 */ \
MakeTab ( { 158 , 17 } , STR_PARK_OBJECTIVE_TAB_TIP ) , /* tab 6 */ \
MakeTab ( { 189 , 17 } , STR_PARK_AWARDS_TAB_TIP ) /* tab 7 */
2014-04-16 03:05:49 +02:00
2015-06-11 14:04:55 +02:00
static rct_widget window_park_entrance_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 230 ) ,
2020-11-27 04:14:20 +01:00
MakeWidget ( { 3 , 46 } , { 202 , 115 } , WindowWidgetType : : Viewport , WindowColour : : Secondary ) , // viewport
MakeWidget ( { 3 , 161 } , { 202 , 11 } , WindowWidgetType : : LabelCentred , WindowColour : : Secondary ) , // status
MakeWidget ( { 205 , 49 } , { 24 , 24 } , WindowWidgetType : : FlatBtn , WindowColour : : Secondary , 0xFFFFFFFF , STR_OPEN_OR_CLOSE_PARK_TIP ) , // open / close
MakeWidget ( { 205 , 73 } , { 24 , 24 } , WindowWidgetType : : FlatBtn , WindowColour : : Secondary , SPR_BUY_LAND_RIGHTS , STR_BUY_LAND_AND_CONSTRUCTION_RIGHTS_TIP ) , // buy land rights
MakeWidget ( { 205 , 97 } , { 24 , 24 } , WindowWidgetType : : FlatBtn , WindowColour : : Secondary , SPR_LOCATE , STR_LOCATE_SUBJECT_TIP ) , // locate
MakeWidget ( { 205 , 121 } , { 24 , 24 } , WindowWidgetType : : FlatBtn , WindowColour : : Secondary , SPR_RENAME , STR_NAME_PARK_TIP ) , // rename
MakeWidget ( { 210 , 51 } , { 14 , 15 } , WindowWidgetType : : ImgBtn , WindowColour : : Secondary , SPR_G2_RCT1_CLOSE_BUTTON_0 , STR_CLOSE_PARK_TIP ) ,
MakeWidget ( { 210 , 66 } , { 14 , 14 } , WindowWidgetType : : ImgBtn , WindowColour : : Secondary , SPR_G2_RCT1_OPEN_BUTTON_0 , STR_OPEN_PARK_TIP ) ,
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-16 03:05:49 +02:00
} ;
static rct_widget window_park_rating_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 255 ) ,
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-16 03:05:49 +02:00
} ;
static rct_widget window_park_guests_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 255 ) ,
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-16 03:05:49 +02:00
} ;
static rct_widget window_park_price_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 230 ) ,
2020-11-27 04:14:20 +01:00
MakeWidget ( { 21 , 50 } , { 126 , 14 } , WindowWidgetType : : Label , WindowColour : : Secondary , STR_ADMISSION_PRICE ) ,
MakeSpinnerWidgets ( { 147 , 50 } , { 76 , 14 } , WindowWidgetType : : Spinner , WindowColour : : Secondary ) , // Price (3 widgets)
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-16 03:05:49 +02:00
} ;
static rct_widget window_park_stats_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 230 ) ,
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-14 22:25:20 +02:00
} ;
static rct_widget window_park_objective_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 230 ) ,
2020-11-27 04:14:20 +01:00
MakeWidget ( { 7 , 207 } , { 216 , 14 } , WindowWidgetType : : Button , WindowColour : : Secondary , STR_ENTER_NAME_INTO_SCENARIO_CHART ) , // enter name
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-14 22:25:20 +02:00
} ;
2014-04-16 03:05:49 +02:00
static rct_widget window_park_awards_widgets [ ] = {
2020-03-07 13:43:22 +01:00
MAIN_PARK_WIDGETS ( 230 ) ,
2021-09-26 11:11:42 +02:00
WIDGETS_END ,
2014-04-16 03:05:49 +02:00
} ;
static rct_widget * window_park_page_widgets [ ] = {
2017-06-06 23:24:18 +02:00
window_park_entrance_widgets ,
window_park_rating_widgets ,
window_park_guests_widgets ,
window_park_price_widgets ,
window_park_stats_widgets ,
window_park_objective_widgets ,
window_park_awards_widgets
2014-04-16 03:05:49 +02:00
} ;
# pragma endregion
# pragma region Events
2015-07-10 02:39:16 +02:00
static void window_park_entrance_close ( rct_window * w ) ;
2017-05-01 15:41:45 +02:00
static void window_park_entrance_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_entrance_resize ( rct_window * w ) ;
2017-07-03 23:09:46 +02:00
static void window_park_entrance_mousedown ( rct_window * w , rct_widgetindex widgetIndex , rct_widget * widget ) ;
2018-06-20 17:28:51 +02:00
static void window_park_entrance_dropdown ( rct_window * w , rct_widgetindex widgetIndex , int32_t dropdownIndex ) ;
2014-05-19 19:47:14 +02:00
static void window_park_entrance_update ( rct_window * w ) ;
2017-05-01 15:41:45 +02:00
static void window_park_entrance_textinput ( rct_window * w , rct_widgetindex widgetIndex , char * text ) ;
2015-07-10 02:39:16 +02:00
static void window_park_entrance_invalidate ( rct_window * w ) ;
static void window_park_entrance_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-16 03:05:49 +02:00
2017-05-01 15:41:45 +02:00
static void window_park_rating_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_rating_resize ( rct_window * w ) ;
2014-05-19 19:47:14 +02:00
static void window_park_rating_update ( rct_window * w ) ;
2015-07-10 02:39:16 +02:00
static void window_park_rating_invalidate ( rct_window * w ) ;
static void window_park_rating_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-16 03:05:49 +02:00
2017-05-01 15:41:45 +02:00
static void window_park_guests_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_guests_resize ( rct_window * w ) ;
2014-05-19 19:47:14 +02:00
static void window_park_guests_update ( rct_window * w ) ;
2015-07-10 02:39:16 +02:00
static void window_park_guests_invalidate ( rct_window * w ) ;
static void window_park_guests_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-16 03:05:49 +02:00
2017-05-01 15:41:45 +02:00
static void window_park_price_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_price_resize ( rct_window * w ) ;
2017-07-03 23:09:46 +02:00
static void window_park_price_mousedown ( rct_window * w , rct_widgetindex widgetIndex , rct_widget * widget ) ;
2014-05-19 19:47:14 +02:00
static void window_park_price_update ( rct_window * w ) ;
2015-07-10 02:39:16 +02:00
static void window_park_price_invalidate ( rct_window * w ) ;
static void window_park_price_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-16 03:05:49 +02:00
2017-05-01 15:41:45 +02:00
static void window_park_stats_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_stats_resize ( rct_window * w ) ;
2014-05-19 19:47:14 +02:00
static void window_park_stats_update ( rct_window * w ) ;
2015-07-10 02:39:16 +02:00
static void window_park_stats_invalidate ( rct_window * w ) ;
static void window_park_stats_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-16 03:05:49 +02:00
2017-05-01 15:41:45 +02:00
static void window_park_objective_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_objective_resize ( rct_window * w ) ;
2014-05-19 19:47:14 +02:00
static void window_park_objective_update ( rct_window * w ) ;
2017-05-01 15:41:45 +02:00
static void window_park_objective_textinput ( rct_window * w , rct_widgetindex widgetIndex , char * text ) ;
2015-07-10 02:39:16 +02:00
static void window_park_objective_invalidate ( rct_window * w ) ;
static void window_park_objective_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-14 22:25:20 +02:00
2017-05-01 15:41:45 +02:00
static void window_park_awards_mouseup ( rct_window * w , rct_widgetindex widgetIndex ) ;
2015-07-10 02:39:16 +02:00
static void window_park_awards_resize ( rct_window * w ) ;
2014-05-19 19:47:14 +02:00
static void window_park_awards_update ( rct_window * w ) ;
2015-07-10 02:39:16 +02:00
static void window_park_awards_invalidate ( rct_window * w ) ;
static void window_park_awards_paint ( rct_window * w , rct_drawpixelinfo * dpi ) ;
2014-04-16 03:05:49 +02:00
2020-09-28 20:36:15 +02:00
static rct_window_event_list window_park_entrance_events ( [ ] ( auto & events )
{
events . close = & window_park_entrance_close ;
events . mouse_up = & window_park_entrance_mouseup ;
events . resize = & window_park_entrance_resize ;
events . mouse_down = & window_park_entrance_mousedown ;
events . dropdown = & window_park_entrance_dropdown ;
events . update = & window_park_entrance_update ;
events . text_input = & window_park_entrance_textinput ;
events . invalidate = & window_park_entrance_invalidate ;
events . paint = & window_park_entrance_paint ;
} ) ;
static rct_window_event_list window_park_rating_events ( [ ] ( auto & events )
{
events . mouse_up = & window_park_rating_mouseup ;
events . resize = & window_park_rating_resize ;
events . update = & window_park_rating_update ;
events . invalidate = & window_park_rating_invalidate ;
events . paint = & window_park_rating_paint ;
} ) ;
static rct_window_event_list window_park_guests_events ( [ ] ( auto & events )
{
events . mouse_up = & window_park_guests_mouseup ;
events . resize = & window_park_guests_resize ;
events . update = & window_park_guests_update ;
events . invalidate = & window_park_guests_invalidate ;
events . paint = & window_park_guests_paint ;
} ) ;
static rct_window_event_list window_park_price_events ( [ ] ( auto & events )
{
events . mouse_up = & window_park_price_mouseup ;
events . resize = & window_park_price_resize ;
events . mouse_down = & window_park_price_mousedown ;
events . update = & window_park_price_update ;
events . invalidate = & window_park_price_invalidate ;
events . paint = & window_park_price_paint ;
} ) ;
static rct_window_event_list window_park_stats_events ( [ ] ( auto & events )
{
events . mouse_up = & window_park_stats_mouseup ;
events . resize = & window_park_stats_resize ;
events . update = & window_park_stats_update ;
events . invalidate = & window_park_stats_invalidate ;
events . paint = & window_park_stats_paint ;
} ) ;
static rct_window_event_list window_park_objective_events ( [ ] ( auto & events )
{
events . mouse_up = & window_park_objective_mouseup ;
events . resize = & window_park_objective_resize ;
events . update = & window_park_objective_update ;
events . text_input = & window_park_objective_textinput ;
events . invalidate = & window_park_objective_invalidate ;
events . paint = & window_park_objective_paint ;
} ) ;
static rct_window_event_list window_park_awards_events ( [ ] ( auto & events )
{
events . mouse_up = & window_park_awards_mouseup ;
events . resize = & window_park_awards_resize ;
events . update = & window_park_awards_update ;
events . invalidate = & window_park_awards_invalidate ;
events . paint = & window_park_awards_paint ;
} ) ;
2014-04-16 03:05:49 +02:00
2015-07-10 02:39:16 +02:00
static rct_window_event_list * window_park_page_events [ ] = {
2017-06-06 23:24:18 +02:00
& window_park_entrance_events ,
& window_park_rating_events ,
& window_park_guests_events ,
& window_park_price_events ,
& window_park_stats_events ,
& window_park_objective_events ,
& window_park_awards_events
2014-04-16 03:05:49 +02:00
} ;
# pragma endregion
# pragma region Enabled widgets
2018-06-20 17:28:51 +02:00
static uint32_t window_park_page_enabled_widgets [ ] = {
2021-06-26 14:23:15 +02:00
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 ) |
( 1ULL < < WIDX_OPEN_OR_CLOSE ) |
( 1ULL < < WIDX_BUY_LAND_RIGHTS ) |
( 1ULL < < WIDX_LOCATE ) |
( 1ULL < < WIDX_RENAME ) |
( 1ULL < < WIDX_CLOSE_LIGHT ) |
( 1ULL < < WIDX_OPEN_LIGHT ) ,
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 ) ,
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 ) ,
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 ) |
( 1ULL < < WIDX_INCREASE_PRICE ) |
( 1ULL < < WIDX_DECREASE_PRICE ) ,
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 ) ,
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 ) |
( 1ULL < < WIDX_ENTER_NAME ) ,
( 1ULL < < WIDX_CLOSE ) |
( 1ULL < < WIDX_TAB_1 ) |
( 1ULL < < WIDX_TAB_2 ) |
( 1ULL < < WIDX_TAB_3 ) |
( 1ULL < < WIDX_TAB_4 ) |
( 1ULL < < WIDX_TAB_5 ) |
( 1ULL < < WIDX_TAB_6 ) |
( 1ULL < < WIDX_TAB_7 )
2014-04-16 03:05:49 +02:00
} ;
2018-06-20 17:28:51 +02:00
static uint32_t window_park_page_hold_down_widgets [ ] = {
2017-06-06 23:24:18 +02:00
0 ,
0 ,
0 ,
2015-02-10 21:40:33 +01:00
2021-06-26 14:23:15 +02:00
( 1ULL < < WIDX_INCREASE_PRICE ) |
( 1ULL < < WIDX_DECREASE_PRICE ) ,
2015-02-10 21:40:33 +01:00
2017-06-06 23:24:18 +02:00
0 ,
0 ,
0
2015-02-10 21:40:33 +01:00
} ;
2014-04-16 03:05:49 +02:00
# pragma endregion
2018-02-14 09:42:26 +01:00
struct window_park_award {
2017-06-06 23:24:18 +02:00
rct_string_id text ;
2018-06-20 17:28:51 +02:00
uint32_t sprite ;
2018-02-14 09:42:26 +01:00
} ;
2016-07-14 14:07:49 +02:00
2018-01-11 14:50:31 +01:00
static constexpr const window_park_award ParkAwards [ ] = {
2017-06-06 23:24:18 +02:00
{ STR_AWARD_MOST_UNTIDY , SPR_AWARD_MOST_UNTIDY } ,
{ STR_AWARD_MOST_TIDY , SPR_AWARD_MOST_TIDY } ,
{ STR_AWARD_BEST_ROLLERCOASTERS , SPR_AWARD_BEST_ROLLERCOASTERS } ,
{ STR_AWARD_BEST_VALUE , SPR_AWARD_BEST_VALUE } ,
{ STR_AWARD_MOST_BEAUTIFUL , SPR_AWARD_MOST_BEAUTIFUL } ,
{ STR_AWARD_WORST_VALUE , SPR_AWARD_WORST_VALUE } ,
{ STR_AWARD_SAFEST , SPR_AWARD_SAFEST } ,
{ STR_AWARD_BEST_STAFF , SPR_AWARD_BEST_STAFF } ,
{ STR_AWARD_BEST_FOOD , SPR_AWARD_BEST_FOOD } ,
{ STR_AWARD_WORST_FOOD , SPR_AWARD_WORST_FOOD } ,
{ STR_AWARD_BEST_RESTROOMS , SPR_AWARD_BEST_RESTROOMS } ,
{ STR_AWARD_MOST_DISAPPOINTING , SPR_AWARD_MOST_DISAPPOINTING } ,
{ STR_AWARD_BEST_WATER_RIDES , SPR_AWARD_BEST_WATER_RIDES } ,
{ STR_AWARD_BEST_CUSTOM_DESIGNED_RIDES , SPR_AWARD_BEST_CUSTOM_DESIGNED_RIDES } ,
{ STR_AWARD_MOST_DAZZLING_RIDE_COLOURS , SPR_AWARD_MOST_DAZZLING_RIDE_COLOURS } ,
{ STR_AWARD_MOST_CONFUSING_LAYOUT , SPR_AWARD_MOST_CONFUSING_LAYOUT } ,
{ STR_AWARD_BEST_GENTLE_RIDES , SPR_AWARD_BEST_GENTLE_RIDES } ,
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
2018-06-22 23:21:44 +02:00
static void window_park_init_viewport ( rct_window * w ) ;
static void window_park_set_page ( rct_window * w , int32_t page ) ;
static void window_park_anchor_border_widgets ( rct_window * w ) ;
static void window_park_set_pressed_tab ( rct_window * w ) ;
static void window_park_draw_tab_images ( rct_drawpixelinfo * dpi , rct_window * w ) ;
static void window_park_set_disabled_tabs ( rct_window * w ) ;
2014-04-14 22:25:20 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-14 22:25:20 +02:00
* rct2 : 0x00667F11
*/
2018-06-22 23:21:44 +02:00
static rct_window * window_park_open ( )
2014-04-14 22:25:20 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * w ;
2020-11-04 05:52:23 +01:00
w = WindowCreateAutoPos ( 230 , 174 + 9 , & window_park_entrance_events , WC_PARK_INFORMATION , WF_10 ) ;
2017-06-06 23:24:18 +02:00
w - > widgets = window_park_entrance_widgets ;
w - > enabled_widgets = window_park_page_enabled_widgets [ WINDOW_PARK_PAGE_ENTRANCE ] ;
w - > number = 0 ;
w - > page = WINDOW_PARK_PAGE_ENTRANCE ;
w - > frame_no = 0 ;
2018-06-20 17:28:51 +02:00
w - > list_information_type = std : : numeric_limits < uint16_t > : : max ( ) ;
2017-07-28 12:31:49 +02:00
w - > numberOfStaff = - 1 ;
2017-06-06 23:24:18 +02:00
w - > var_492 = 0 ;
window_park_set_disabled_tabs ( w ) ;
return w ;
2014-04-14 22:25:20 +02:00
}
2014-08-30 15:11:19 +02:00
/**
*
* rct2 : 0x00667F8B
*/
2018-06-22 23:21:44 +02:00
static void window_park_set_disabled_tabs ( rct_window * w )
2014-08-30 15:11:19 +02:00
{
2017-06-06 23:24:18 +02:00
// Disable price tab if money is disabled
2021-06-26 14:23:15 +02:00
w - > disabled_widgets = ( gParkFlags & PARK_FLAGS_NO_MONEY ) ? ( 1ULL < < WIDX_TAB_4 ) : 0 ;
2014-08-30 15:11:19 +02:00
}
2015-01-27 22:18:30 +01:00
static void window_park_prepare_window_title_text ( )
{
2019-07-21 11:33:15 +02:00
auto & park = OpenRCT2 : : GetContext ( ) - > GetGameState ( ) - > GetPark ( ) ;
auto parkName = park . Name . c_str ( ) ;
2020-05-14 02:29:39 +02:00
auto ft = Formatter : : Common ( ) ;
ft . Add < rct_string_id > ( STR_STRING ) ;
ft . Add < const char * > ( parkName ) ;
2015-01-27 22:18:30 +01:00
}
2014-04-16 03:05:49 +02:00
# pragma region Entrance page
2014-04-17 04:19:30 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-17 04:19:30 +02:00
* rct2 : 0x00667C48
*/
2018-06-22 23:21:44 +02:00
rct_window * window_park_entrance_open ( )
2014-04-17 04:19:30 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * window ;
window = window_bring_to_front_by_class ( WC_PARK_INFORMATION ) ;
2018-06-22 23:21:44 +02:00
if ( window = = nullptr )
{
2017-06-06 23:24:18 +02:00
window = window_park_open ( ) ;
}
window - > page = WINDOW_PARK_PAGE_ENTRANCE ;
2019-06-15 17:20:16 +02:00
window - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
window - > widgets = window_park_entrance_widgets ;
window - > enabled_widgets = window_park_page_enabled_widgets [ WINDOW_PARK_PAGE_ENTRANCE ] ;
window - > event_handlers = & window_park_entrance_events ;
window - > pressed_widgets = 0 ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( window ) ;
2017-06-06 23:24:18 +02:00
window_park_init_viewport ( window ) ;
2017-09-05 20:55:18 +02:00
return window ;
2014-04-17 04:19:30 +02:00
}
2014-04-16 03:05:49 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x0066860C
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_close ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
if ( input_test_flag ( INPUT_FLAG_TOOL_ACTIVE ) )
if ( w - > classification = = gCurrentToolWidget . window_classification & & w - > number = = gCurrentToolWidget . window_number )
tool_cancel ( ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x0066817C
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
switch ( widgetIndex )
{
case WIDX_CLOSE :
window_close ( w ) ;
break ;
case WIDX_TAB_1 :
case WIDX_TAB_2 :
case WIDX_TAB_3 :
case WIDX_TAB_4 :
case WIDX_TAB_5 :
case WIDX_TAB_6 :
case WIDX_TAB_7 :
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
break ;
case WIDX_BUY_LAND_RIGHTS :
context_open_window ( WC_LAND_RIGHTS ) ;
break ;
case WIDX_LOCATE :
2019-06-15 17:12:14 +02:00
w - > ScrollToViewport ( ) ;
2018-06-22 23:21:44 +02:00
break ;
case WIDX_RENAME :
2019-07-21 11:33:15 +02:00
{
auto & park = OpenRCT2 : : GetContext ( ) - > GetGameState ( ) - > GetPark ( ) ;
window_text_input_raw_open (
2021-08-24 20:12:05 +02:00
w , WIDX_RENAME , STR_PARK_NAME , STR_ENTER_PARK_NAME , { } , park . Name . c_str ( ) , USER_STRING_MAX_LENGTH ) ;
2018-06-22 23:21:44 +02:00
break ;
2019-07-21 11:33:15 +02:00
}
2018-06-22 23:21:44 +02:00
case WIDX_CLOSE_LIGHT :
2019-03-15 21:53:17 +01:00
park_set_open ( false ) ;
2018-06-22 23:21:44 +02:00
break ;
case WIDX_OPEN_LIGHT :
2019-03-15 21:53:17 +01:00
park_set_open ( true ) ;
2018-06-22 23:21:44 +02:00
break ;
2017-06-06 23:24:18 +02:00
}
2014-04-16 03:05:49 +02:00
}
2014-04-17 20:33:31 +02:00
/**
*
* rct2 : 0x00668637
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_resize ( rct_window * w )
2014-04-17 20:33:31 +02:00
{
2017-06-06 23:24:18 +02:00
w - > flags | = WF_RESIZABLE ;
window_set_resize ( w , 230 , 174 + 9 , 230 * 3 , ( 274 + 9 ) * 3 ) ;
window_park_init_viewport ( w ) ;
2014-04-17 20:33:31 +02:00
}
2014-04-17 16:12:41 +02:00
/**
*
* rct2 : 0x006681BF
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_mousedown ( rct_window * w , rct_widgetindex widgetIndex , rct_widget * widget )
2014-04-17 16:12:41 +02:00
{
2018-06-22 23:21:44 +02:00
if ( widgetIndex = = WIDX_OPEN_OR_CLOSE )
{
2017-06-06 23:24:18 +02:00
gDropdownItemsFormat [ 0 ] = STR_DROPDOWN_MENU_LABEL ;
gDropdownItemsFormat [ 1 ] = STR_DROPDOWN_MENU_LABEL ;
gDropdownItemsArgs [ 0 ] = STR_CLOSE_PARK ;
gDropdownItemsArgs [ 1 ] = STR_OPEN_PARK ;
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 ( ) + 1 , w - > colours [ 1 ] , 0 , 2 ) ;
2018-06-22 23:21:44 +02:00
if ( park_is_open ( ) )
{
2017-06-06 23:24:18 +02:00
gDropdownDefaultIndex = 0 ;
2020-11-03 09:16:06 +01:00
Dropdown : : SetChecked ( 1 , true ) ;
2018-06-22 23:21:44 +02:00
}
else
{
2017-06-06 23:24:18 +02:00
gDropdownDefaultIndex = 1 ;
2020-11-03 09:16:06 +01:00
Dropdown : : SetChecked ( 0 , true ) ;
2017-06-06 23:24:18 +02:00
}
}
2014-04-17 16:12:41 +02:00
}
/**
2015-10-20 20:16:30 +02:00
*
2014-04-17 16:12:41 +02:00
* rct2 : 0x006682B8
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_dropdown ( rct_window * w , rct_widgetindex widgetIndex , int32_t dropdownIndex )
2014-04-17 16:12:41 +02:00
{
2018-06-22 23:21:44 +02:00
if ( widgetIndex = = WIDX_OPEN_OR_CLOSE )
{
2017-06-06 23:24:18 +02:00
if ( dropdownIndex = = - 1 )
dropdownIndex = gDropdownHighlightedIndex ;
2018-06-22 23:21:44 +02:00
if ( dropdownIndex ! = 0 )
{
2019-03-15 21:53:17 +01:00
park_set_open ( true ) ;
2018-06-22 23:21:44 +02:00
}
else
{
2019-03-15 21:53:17 +01:00
park_set_open ( false ) ;
2017-06-06 23:24:18 +02:00
}
}
2014-04-17 16:12:41 +02:00
}
2014-04-16 03:05:49 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x006686B5
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_update ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
widget_invalidate ( w , WIDX_TAB_1 ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-17 04:19:30 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-17 04:19:30 +02:00
* rct2 : 0x0066848B
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_textinput ( rct_window * w , rct_widgetindex widgetIndex , char * text )
2014-04-17 04:19:30 +02:00
{
2017-08-15 10:07:44 +02:00
if ( widgetIndex = = WIDX_RENAME & & text ! = nullptr )
2018-04-10 18:14:32 +02:00
{
auto action = ParkSetNameAction ( text ) ;
GameActions : : Execute ( & action ) ;
}
2014-04-17 04:19:30 +02:00
}
2014-04-16 03:05:49 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x00667FDC
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_invalidate ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t i , height ;
2017-06-06 23:24:18 +02:00
w - > widgets = window_park_page_widgets [ w - > page ] ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( w ) ;
2017-06-06 23:24:18 +02:00
window_park_set_pressed_tab ( w ) ;
// Set open / close park button state
2019-07-21 11:33:15 +02:00
{
auto & park = OpenRCT2 : : GetContext ( ) - > GetGameState ( ) - > GetPark ( ) ;
auto parkName = park . Name . c_str ( ) ;
2020-05-14 02:29:39 +02:00
auto ft = Formatter : : Common ( ) ;
ft . Add < rct_string_id > ( STR_STRING ) ;
ft . Add < const char * > ( parkName ) ;
2019-07-21 11:33:15 +02:00
}
2017-06-06 23:24:18 +02:00
window_park_entrance_widgets [ WIDX_OPEN_OR_CLOSE ] . image = park_is_open ( ) ? SPR_OPEN : SPR_CLOSED ;
2018-07-21 11:50:45 +02:00
window_park_entrance_widgets [ WIDX_CLOSE_LIGHT ] . image = SPR_G2_RCT1_CLOSE_BUTTON_0 + ! park_is_open ( ) * 2
2020-11-03 22:29:22 +01:00
+ WidgetIsPressed ( w , WIDX_CLOSE_LIGHT ) ;
2018-07-21 11:50:45 +02:00
window_park_entrance_widgets [ WIDX_OPEN_LIGHT ] . image = SPR_G2_RCT1_OPEN_BUTTON_0 + park_is_open ( ) * 2
2020-11-03 22:29:22 +01:00
+ WidgetIsPressed ( w , WIDX_OPEN_LIGHT ) ;
2017-06-06 23:24:18 +02:00
// Only allow closing of park for guest / rating objective
2020-08-12 22:03:36 +02:00
if ( gScenarioObjective . Type = = OBJECTIVE_GUESTS_AND_RATING )
2021-06-26 14:23:15 +02:00
w - > disabled_widgets | = ( 1ULL < < WIDX_OPEN_OR_CLOSE ) | ( 1ULL < < WIDX_CLOSE_LIGHT ) | ( 1ULL < < WIDX_OPEN_LIGHT ) ;
2017-06-06 23:24:18 +02:00
else
2021-06-26 14:23:15 +02:00
w - > disabled_widgets & = ~ ( ( 1ULL < < WIDX_OPEN_OR_CLOSE ) | ( 1ULL < < WIDX_CLOSE_LIGHT ) | ( 1ULL < < WIDX_OPEN_LIGHT ) ) ;
2017-06-06 23:24:18 +02:00
// Only allow purchase of land when there is money
if ( gParkFlags & PARK_FLAGS_NO_MONEY )
2020-11-27 04:14:20 +01:00
window_park_entrance_widgets [ WIDX_BUY_LAND_RIGHTS ] . type = WindowWidgetType : : Empty ;
2017-06-06 23:24:18 +02:00
else
2020-11-27 04:14:20 +01:00
window_park_entrance_widgets [ WIDX_BUY_LAND_RIGHTS ] . type = WindowWidgetType : : FlatBtn ;
2017-06-06 23:24:18 +02:00
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
// Anchor entrance page specific widgets
window_park_entrance_widgets [ WIDX_VIEWPORT ] . right = w - > width - 26 ;
window_park_entrance_widgets [ WIDX_VIEWPORT ] . bottom = w - > height - 14 ;
window_park_entrance_widgets [ WIDX_STATUS ] . right = w - > width - 26 ;
window_park_entrance_widgets [ WIDX_STATUS ] . top = w - > height - 13 ;
window_park_entrance_widgets [ WIDX_STATUS ] . bottom = w - > height - 3 ;
2020-11-03 11:59:00 +01:00
if ( ThemeGetFlags ( ) & UITHEME_FLAG_USE_LIGHTS_PARK )
2018-06-22 23:21:44 +02:00
{
2020-11-27 04:14:20 +01:00
window_park_entrance_widgets [ WIDX_OPEN_OR_CLOSE ] . type = WindowWidgetType : : Empty ;
2020-08-12 22:03:36 +02:00
if ( gScenarioObjective . Type = = OBJECTIVE_GUESTS_AND_RATING )
2018-06-22 23:21:44 +02:00
{
2020-11-27 04:14:20 +01:00
window_park_entrance_widgets [ WIDX_CLOSE_LIGHT ] . type = WindowWidgetType : : FlatBtn ;
window_park_entrance_widgets [ WIDX_OPEN_LIGHT ] . type = WindowWidgetType : : FlatBtn ;
2017-06-06 23:24:18 +02:00
}
2018-06-22 23:21:44 +02:00
else
{
2020-11-27 04:14:20 +01:00
window_park_entrance_widgets [ WIDX_CLOSE_LIGHT ] . type = WindowWidgetType : : ImgBtn ;
window_park_entrance_widgets [ WIDX_OPEN_LIGHT ] . type = WindowWidgetType : : ImgBtn ;
2017-06-06 23:24:18 +02:00
}
height = window_park_entrance_widgets [ WIDX_OPEN_LIGHT ] . bottom + 5 ;
}
2018-06-22 23:21:44 +02:00
else
{
2020-11-27 04:14:20 +01:00
window_park_entrance_widgets [ WIDX_OPEN_OR_CLOSE ] . type = WindowWidgetType : : FlatBtn ;
window_park_entrance_widgets [ WIDX_CLOSE_LIGHT ] . type = WindowWidgetType : : Empty ;
window_park_entrance_widgets [ WIDX_OPEN_LIGHT ] . type = WindowWidgetType : : Empty ;
2017-06-06 23:24:18 +02:00
height = 49 ;
}
2018-06-22 23:21:44 +02:00
for ( i = WIDX_CLOSE_LIGHT ; i < = WIDX_OPEN_LIGHT ; i + + )
{
2017-06-06 23:24:18 +02:00
window_park_entrance_widgets [ i ] . left = w - > width - 20 ;
window_park_entrance_widgets [ i ] . right = w - > width - 7 ;
}
2018-06-22 23:21:44 +02:00
for ( i = WIDX_OPEN_OR_CLOSE ; i < = WIDX_RENAME ; i + + )
{
2020-11-27 04:14:20 +01:00
if ( window_park_entrance_widgets [ i ] . type = = WindowWidgetType : : Empty )
2017-06-06 23:24:18 +02:00
continue ;
window_park_entrance_widgets [ i ] . left = w - > width - 25 ;
window_park_entrance_widgets [ i ] . right = w - > width - 2 ;
window_park_entrance_widgets [ i ] . top = height ;
window_park_entrance_widgets [ i ] . bottom = height + 23 ;
height + = 24 ;
}
2014-04-16 03:05:49 +02:00
}
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x006680D0
*/
2018-06-22 23:21:44 +02:00
static void window_park_entrance_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
rct_widget * labelWidget ;
2017-06-06 23:24:18 +02:00
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
// Draw viewport
2018-06-22 23:21:44 +02:00
if ( w - > viewport ! = nullptr )
{
2017-06-06 23:24:18 +02:00
window_draw_viewport ( dpi , w ) ;
if ( w - > viewport - > flags & VIEWPORT_FLAG_SOUND_ON )
2021-03-23 11:58:09 +01:00
gfx_draw_sprite ( dpi , ImageId ( SPR_HEARING_VIEWPORT ) , w - > windowPos + ScreenCoordsXY { 2 , 2 } ) ;
2017-06-06 23:24:18 +02:00
}
// Draw park closed / open label
2020-09-30 23:42:04 +02:00
auto ft = Formatter ( ) ;
2020-05-14 02:29:39 +02:00
ft . Add < rct_string_id > ( park_is_open ( ) ? STR_PARK_OPEN : STR_PARK_CLOSED ) ;
2017-06-06 23:24:18 +02:00
labelWidget = & window_park_entrance_widgets [ WIDX_STATUS ] ;
2020-08-28 18:03:51 +02:00
DrawTextEllipsised (
dpi , w - > windowPos + ScreenCoordsXY { labelWidget - > midX ( ) , labelWidget - > top } , labelWidget - > width ( ) , STR_BLACK_STRING , ft ,
2021-02-28 00:22:24 +01:00
{ TextAlignment : : CENTRE } ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-17 20:33:31 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-17 20:33:31 +02:00
* rct2 : 0x00669B55
*/
2018-06-22 23:21:44 +02:00
static void window_park_init_viewport ( rct_window * w )
2014-04-17 20:33:31 +02:00
{
2021-09-18 21:34:38 +02:00
int32_t viewportFlags ;
2017-06-06 23:24:18 +02:00
if ( w - > page ! = WINDOW_PARK_PAGE_ENTRANCE )
return ;
2021-09-21 11:06:04 +02:00
std : : optional < Focus > focus = std : : nullopt ;
2019-04-20 20:39:47 +02:00
if ( ! gParkEntrances . empty ( ) )
2018-06-22 23:21:44 +02:00
{
2018-12-15 18:57:23 +01:00
const auto & entrance = gParkEntrances [ 0 ] ;
2021-09-21 11:06:04 +02:00
focus = Focus ( CoordsXYZ { entrance . x + 16 , entrance . y + 16 , entrance . z + 32 } ) ;
2017-06-06 23:24:18 +02:00
}
2018-06-22 23:21:44 +02:00
if ( w - > viewport = = nullptr )
{
2017-06-06 23:24:18 +02:00
viewportFlags = gConfigGeneral . always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0 ;
2018-06-22 23:21:44 +02:00
}
else
{
2020-10-06 11:27:56 +02:00
viewportFlags = w - > viewport - > flags ;
w - > RemoveViewport ( ) ;
2017-06-06 23:24:18 +02:00
}
// Call invalidate event
window_event_invalidate_call ( w ) ;
2021-09-21 11:06:04 +02:00
w - > focus = focus ;
2017-06-06 23:24:18 +02:00
2021-09-18 21:34:38 +02:00
if ( focus . has_value ( ) )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
// Create viewport
2018-06-22 23:21:44 +02:00
if ( w - > viewport = = nullptr )
{
rct_widget * viewportWidget = & window_park_entrance_widgets [ WIDX_VIEWPORT ] ;
2017-06-06 23:24:18 +02:00
viewport_create (
2020-03-01 20:32:35 +01:00
w , w - > windowPos + ScreenCoordsXY { viewportWidget - > left + 1 , viewportWidget - > top + 1 } ,
2021-09-18 21:34:38 +02:00
viewportWidget - > width ( ) - 1 , viewportWidget - > height ( ) - 1 , focus . value ( ) ) ;
2017-06-06 23:24:18 +02:00
w - > flags | = ( 1 < < 2 ) ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
}
}
2017-08-15 10:07:44 +02:00
if ( w - > viewport ! = nullptr )
2017-06-06 23:24:18 +02:00
w - > viewport - > flags = viewportFlags ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2014-04-17 20:33:31 +02:00
}
2014-04-16 03:05:49 +02:00
# pragma endregion
# pragma region Rating page
2014-05-08 17:08:52 +02:00
/**
2018-06-22 23:21:44 +02:00
*
* rct2 : 0x00667CA4
*/
rct_window * window_park_rating_open ( )
2014-05-08 17:08:52 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * window ;
window = window_bring_to_front_by_class ( WC_PARK_INFORMATION ) ;
2018-06-22 23:21:44 +02:00
if ( window = = nullptr )
{
2017-06-06 23:24:18 +02:00
window = window_park_open ( ) ;
}
if ( input_test_flag ( INPUT_FLAG_TOOL_ACTIVE ) )
2018-06-22 23:21:44 +02:00
if ( window - > classification = = gCurrentToolWidget . window_classification
& & window - > number = = gCurrentToolWidget . window_number )
tool_cancel ( ) ;
2017-06-06 23:24:18 +02:00
2017-08-15 10:07:44 +02:00
window - > viewport = nullptr ;
2017-06-06 23:24:18 +02:00
window - > page = WINDOW_PARK_PAGE_RATING ;
2019-06-15 17:20:16 +02:00
window - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
window - > widgets = window_park_rating_widgets ;
window - > enabled_widgets = window_park_page_enabled_widgets [ WINDOW_PARK_PAGE_RATING ] ;
window - > hold_down_widgets = window_park_page_hold_down_widgets [ WINDOW_PARK_PAGE_RATING ] ;
window - > event_handlers = & window_park_rating_events ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( window ) ;
2017-09-05 20:55:18 +02:00
return window ;
2014-05-08 17:08:52 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x00668A06
*/
2018-06-22 23:21:44 +02:00
static void window_park_rating_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
if ( widgetIndex = = WIDX_CLOSE )
window_close ( w ) ;
else if ( widgetIndex > = WIDX_TAB_1 & & widgetIndex < = WIDX_TAB_7 )
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-18 01:07:06 +02:00
/**
*
* rct2 : 0x00668A36
*/
2018-06-22 23:21:44 +02:00
static void window_park_rating_resize ( rct_window * w )
2014-04-18 01:07:06 +02:00
{
2020-03-07 13:43:22 +01:00
window_set_resize ( w , 255 , 182 , 255 , 182 ) ;
2014-04-18 01:07:06 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x00668A21
*/
2018-06-22 23:21:44 +02:00
static void window_park_rating_update ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
widget_invalidate ( w , WIDX_TAB_2 ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x006686CB
*/
2018-06-22 23:21:44 +02:00
static void window_park_rating_invalidate ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
rct_widget * widgets ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
widgets = window_park_page_widgets [ w - > page ] ;
2018-06-22 23:21:44 +02:00
if ( w - > widgets ! = widgets )
{
2017-06-06 23:24:18 +02:00
w - > widgets = widgets ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( w ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_park_set_pressed_tab ( w ) ;
window_park_prepare_window_title_text ( ) ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x0066875D
*/
2018-06-22 23:21:44 +02:00
static void window_park_rating_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-16 03:05:49 +02:00
{
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
2014-04-18 23:47:25 +02:00
2020-06-11 23:26:16 +02:00
auto screenPos = w - > windowPos ;
2020-03-07 13:58:02 +01:00
rct_widget * widget = & window_park_rating_widgets [ WIDX_PAGE_BACKGROUND ] ;
2014-04-18 23:47:25 +02:00
2017-06-06 23:24:18 +02:00
// Current value
2021-07-27 20:32:27 +02:00
auto ft = Formatter ( ) ;
ft . Add < uint16_t > ( gParkRating ) ;
DrawTextBasic ( dpi , screenPos + ScreenCoordsXY { widget - > left + 3 , widget - > top + 2 } , STR_PARK_RATING_LABEL , ft ) ;
2014-04-18 23:47:25 +02:00
2017-06-06 23:24:18 +02:00
// Graph border
2018-06-22 23:21:44 +02:00
gfx_fill_rect_inset (
2020-09-16 05:02:22 +02:00
dpi ,
{ screenPos + ScreenCoordsXY { widget - > left + 4 , widget - > top + 15 } ,
screenPos + ScreenCoordsXY { widget - > right - 4 , widget - > bottom - 4 } } ,
w - > colours [ 1 ] , INSET_RECT_F_30 ) ;
2014-04-18 23:47:25 +02:00
2020-03-07 13:58:02 +01:00
// Y axis labels
2020-06-11 15:11:12 +02:00
screenPos = screenPos + ScreenCoordsXY { widget - > left + 27 , widget - > top + 23 } ;
2020-03-07 13:58:02 +01:00
for ( int i = 5 ; i > = 0 ; i - - )
{
2020-03-11 19:25:32 +01:00
uint32_t axisValue = i * 200 ;
2021-07-27 20:32:27 +02:00
ft = Formatter ( ) ;
2020-09-19 02:39:00 +02:00
ft . Add < uint32_t > ( axisValue ) ;
2021-03-27 14:40:17 +01:00
DrawTextBasic (
dpi , screenPos + ScreenCoordsXY { 10 , 0 } , STR_GRAPH_AXIS_LABEL , ft ,
{ FontSpriteBase : : SMALL , TextAlignment : : RIGHT } ) ;
2020-06-11 15:11:12 +02:00
gfx_fill_rect_inset (
2020-09-16 05:02:22 +02:00
dpi , { screenPos + ScreenCoordsXY { 15 , 5 } , screenPos + ScreenCoordsXY { w - > width - 32 , 5 } } , w - > colours [ 2 ] ,
2020-06-11 15:11:12 +02:00
INSET_RECT_FLAG_BORDER_INSET ) ;
screenPos . y + = 20 ;
2020-03-07 13:58:02 +01:00
}
2017-06-06 23:24:18 +02:00
// Graph
2020-06-11 15:11:12 +02:00
screenPos = w - > windowPos + ScreenCoordsXY { widget - > left + 47 , widget - > top + 26 } ;
2014-04-18 23:47:25 +02:00
2021-03-27 04:39:11 +01:00
Graph : : Draw ( dpi , gParkRatingHistory , 32 , screenPos ) ;
2014-04-16 03:05:49 +02:00
}
# pragma endregion
# pragma region Guests page
2014-05-08 17:35:32 +02:00
/**
2018-06-22 23:21:44 +02:00
*
* rct2 : 0x00667D35
*/
rct_window * window_park_guests_open ( )
2014-05-08 17:35:32 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * window ;
window = window_bring_to_front_by_class ( WC_PARK_INFORMATION ) ;
2018-06-22 23:21:44 +02:00
if ( window = = nullptr )
{
2017-06-06 23:24:18 +02:00
window = window_park_open ( ) ;
}
if ( input_test_flag ( INPUT_FLAG_TOOL_ACTIVE ) )
2018-06-22 23:21:44 +02:00
if ( window - > classification = = gCurrentToolWidget . window_classification
& & window - > number = = gCurrentToolWidget . window_number )
2017-06-06 23:24:18 +02:00
tool_cancel ( ) ;
2017-08-15 10:07:44 +02:00
window - > viewport = nullptr ;
2017-06-06 23:24:18 +02:00
window - > page = WINDOW_PARK_PAGE_GUESTS ;
2019-06-15 17:20:16 +02:00
window - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
window - > widgets = window_park_guests_widgets ;
window - > enabled_widgets = window_park_page_enabled_widgets [ WINDOW_PARK_PAGE_GUESTS ] ;
window - > hold_down_widgets = window_park_page_hold_down_widgets [ WINDOW_PARK_PAGE_GUESTS ] ;
window - > event_handlers = & window_park_guests_events ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( window ) ;
2017-09-05 20:55:18 +02:00
return window ;
2014-05-08 17:35:32 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x00668DEB
*/
2018-06-22 23:21:44 +02:00
static void window_park_guests_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
if ( widgetIndex = = WIDX_CLOSE )
window_close ( w ) ;
else if ( widgetIndex > = WIDX_TAB_1 & & widgetIndex < = WIDX_TAB_7 )
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-18 01:07:06 +02:00
/**
*
* rct2 : 0x00668E33
*/
2018-06-22 23:21:44 +02:00
static void window_park_guests_resize ( rct_window * w )
2014-04-18 01:07:06 +02:00
{
2020-03-07 13:43:22 +01:00
window_set_resize ( w , 255 , 182 , 255 , 182 ) ;
2014-04-18 01:07:06 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x00668E06
*/
2018-06-22 23:21:44 +02:00
static void window_park_guests_update ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
w - > var_492 = ( w - > var_492 + 1 ) % 24 ;
widget_invalidate ( w , WIDX_TAB_3 ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x00668AB0
*/
2018-06-22 23:21:44 +02:00
static void window_park_guests_invalidate ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
rct_widget * widgets ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
widgets = window_park_page_widgets [ w - > page ] ;
2018-06-22 23:21:44 +02:00
if ( w - > widgets ! = widgets )
{
2017-06-06 23:24:18 +02:00
w - > widgets = widgets ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( w ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_park_set_pressed_tab ( w ) ;
window_park_prepare_window_title_text ( ) ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x00668B42
*/
2018-06-22 23:21:44 +02:00
static void window_park_guests_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-16 03:05:49 +02:00
{
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
2014-04-18 23:47:25 +02:00
2020-06-11 15:11:12 +02:00
auto screenPos = ScreenCoordsXY { w - > windowPos . x , w - > windowPos . y } ;
2020-03-07 14:01:17 +01:00
rct_widget * widget = & window_park_guests_widgets [ WIDX_PAGE_BACKGROUND ] ;
2014-04-18 23:47:25 +02:00
2017-06-06 23:24:18 +02:00
// Current value
2021-07-27 20:32:27 +02:00
auto ft = Formatter ( ) ;
ft . Add < uint32_t > ( gNumGuestsInPark ) ;
DrawTextBasic ( dpi , screenPos + ScreenCoordsXY { widget - > left + 3 , widget - > top + 2 } , STR_GUESTS_IN_PARK_LABEL , ft ) ;
2014-04-18 23:47:25 +02:00
2017-06-06 23:24:18 +02:00
// Graph border
2018-06-22 23:21:44 +02:00
gfx_fill_rect_inset (
2020-09-16 05:02:22 +02:00
dpi ,
{ screenPos + ScreenCoordsXY { widget - > left + 4 , widget - > top + 15 } ,
screenPos + ScreenCoordsXY { widget - > right - 4 , widget - > bottom - 4 } } ,
w - > colours [ 1 ] , INSET_RECT_F_30 ) ;
2014-04-18 23:47:25 +02:00
2020-03-07 14:01:17 +01:00
// Y axis labels
2020-06-11 15:11:12 +02:00
screenPos = screenPos + ScreenCoordsXY { widget - > left + 27 , widget - > top + 23 } ;
2020-03-07 14:01:17 +01:00
for ( int i = 5 ; i > = 0 ; i - - )
{
2020-03-11 19:25:32 +01:00
uint32_t axisValue = i * 1000 ;
2021-07-27 20:32:27 +02:00
ft = Formatter ( ) ;
2020-09-19 02:39:00 +02:00
ft . Add < uint32_t > ( axisValue ) ;
2021-03-27 14:40:17 +01:00
DrawTextBasic (
dpi , screenPos + ScreenCoordsXY { 10 , 0 } , STR_GRAPH_AXIS_LABEL , ft ,
{ FontSpriteBase : : SMALL , TextAlignment : : RIGHT } ) ;
2020-06-11 15:11:12 +02:00
gfx_fill_rect_inset (
2020-09-16 05:02:22 +02:00
dpi , { screenPos + ScreenCoordsXY { 15 , 5 } , screenPos + ScreenCoordsXY { w - > width - 32 , 5 } } , w - > colours [ 2 ] ,
2020-06-11 15:11:12 +02:00
INSET_RECT_FLAG_BORDER_INSET ) ;
screenPos . y + = 20 ;
2020-03-07 14:01:17 +01:00
}
2017-06-06 23:24:18 +02:00
// Graph
2020-06-11 15:11:12 +02:00
screenPos = w - > windowPos + ScreenCoordsXY { widget - > left + 47 , widget - > top + 26 } ;
2014-04-18 23:47:25 +02:00
2021-09-03 23:43:43 +02:00
uint8_t cappedHistory [ 32 ] ;
for ( size_t i = 0 ; i < std : : size ( cappedHistory ) ; i + + )
{
auto value = gGuestsInParkHistory [ i ] ;
if ( value ! = std : : numeric_limits < uint32_t > : : max ( ) )
{
cappedHistory [ i ] = static_cast < uint8_t > ( std : : min < uint32_t > ( value , 5000 ) / 20 ) ;
}
else
{
cappedHistory [ i ] = std : : numeric_limits < uint8_t > : : max ( ) ;
}
}
Graph : : Draw ( dpi , cappedHistory , static_cast < int32_t > ( std : : size ( cappedHistory ) ) , screenPos ) ;
2014-04-16 03:05:49 +02:00
}
# pragma endregion
# pragma region Price page
/**
*
* rct2 : 0x00669011
*/
2018-06-22 23:21:44 +02:00
static void window_park_price_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
if ( widgetIndex = = WIDX_CLOSE )
window_close ( w ) ;
else if ( widgetIndex > = WIDX_TAB_1 & & widgetIndex < = WIDX_TAB_7 )
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-18 01:07:06 +02:00
/**
*
* rct2 : 0x0066908C
*/
2018-06-22 23:21:44 +02:00
static void window_park_price_resize ( rct_window * w )
2014-04-18 01:07:06 +02:00
{
2017-06-06 23:24:18 +02:00
window_set_resize ( w , 230 , 124 , 230 , 124 ) ;
2014-04-18 01:07:06 +02:00
}
2014-04-17 20:33:31 +02:00
/**
*
* rct2 : 0x0066902C
*/
2018-06-22 23:21:44 +02:00
static void window_park_price_mousedown ( rct_window * w , rct_widgetindex widgetIndex , rct_widget * widget )
2014-04-17 20:33:31 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t newFee ;
2017-06-06 23:24:18 +02:00
2018-06-22 23:21:44 +02:00
switch ( widgetIndex )
{
case WIDX_CLOSE :
window_close ( w ) ;
break ;
case WIDX_INCREASE_PRICE :
newFee = std : : min ( MAX_ENTRANCE_FEE , gParkEntranceFee + MONEY ( 1 , 00 ) ) ;
park_set_entrance_fee ( newFee ) ;
break ;
case WIDX_DECREASE_PRICE :
newFee = std : : max ( MONEY ( 0 , 00 ) , gParkEntranceFee - MONEY ( 1 , 00 ) ) ;
park_set_entrance_fee ( newFee ) ;
break ;
2017-06-06 23:24:18 +02:00
}
2014-04-17 20:33:31 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x00669077
*/
2018-06-22 23:21:44 +02:00
static void window_park_price_update ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
widget_invalidate ( w , WIDX_TAB_4 ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x00668EAD
*/
2018-06-22 23:21:44 +02:00
static void window_park_price_invalidate ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
rct_widget * widgets ;
2017-06-06 23:24:18 +02:00
widgets = window_park_page_widgets [ w - > page ] ;
2018-06-22 23:21:44 +02:00
if ( w - > widgets ! = widgets )
{
2017-06-06 23:24:18 +02:00
w - > widgets = widgets ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( w ) ;
2017-06-06 23:24:18 +02:00
}
window_park_set_pressed_tab ( w ) ;
window_park_prepare_window_title_text ( ) ;
// Show a tooltip if the park is pay per ride.
window_park_price_widgets [ WIDX_PRICE_LABEL ] . tooltip = STR_NONE ;
window_park_price_widgets [ WIDX_PRICE ] . tooltip = STR_NONE ;
2017-10-10 11:57:25 +02:00
if ( ! park_entry_price_unlocked ( ) )
2017-06-06 23:24:18 +02:00
{
window_park_price_widgets [ WIDX_PRICE_LABEL ] . tooltip = STR_ADMISSION_PRICE_PAY_PER_RIDE_TIP ;
window_park_price_widgets [ WIDX_PRICE ] . tooltip = STR_ADMISSION_PRICE_PAY_PER_RIDE_TIP ;
}
// If the entry price is locked at free, disable the widget, unless the unlock_all_prices cheat is active.
2017-10-10 11:57:25 +02:00
if ( ( gParkFlags & PARK_FLAGS_NO_MONEY ) | | ! park_entry_price_unlocked ( ) )
{
2020-11-27 04:14:20 +01:00
window_park_price_widgets [ WIDX_PRICE ] . type = WindowWidgetType : : LabelCentred ;
window_park_price_widgets [ WIDX_INCREASE_PRICE ] . type = WindowWidgetType : : Empty ;
window_park_price_widgets [ WIDX_DECREASE_PRICE ] . type = WindowWidgetType : : Empty ;
2017-10-10 11:57:25 +02:00
}
else
{
2020-11-27 04:14:20 +01:00
window_park_price_widgets [ WIDX_PRICE ] . type = WindowWidgetType : : Spinner ;
window_park_price_widgets [ WIDX_INCREASE_PRICE ] . type = WindowWidgetType : : Button ;
window_park_price_widgets [ WIDX_DECREASE_PRICE ] . type = WindowWidgetType : : Button ;
2017-06-06 23:24:18 +02:00
}
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x00668F99
*/
2018-06-22 23:21:44 +02:00
static void window_park_price_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-16 03:05:49 +02:00
{
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
2014-04-17 20:33:31 +02:00
2020-06-20 21:09:45 +02:00
auto screenCoords = w - > windowPos
+ ScreenCoordsXY { w - > widgets [ WIDX_PAGE_BACKGROUND ] . left + 4 , w - > widgets [ WIDX_PAGE_BACKGROUND ] . top + 30 } ;
2021-07-27 20:32:27 +02:00
auto ft = Formatter ( ) ;
ft . Add < money64 > ( gTotalIncomeFromAdmissions ) ;
DrawTextBasic ( dpi , screenCoords , STR_INCOME_FROM_ADMISSIONS , ft ) ;
2019-07-23 21:47:54 +02:00
2021-04-10 17:00:50 +02:00
money64 parkEntranceFee = park_get_entrance_fee ( ) ;
2019-07-23 21:47:54 +02:00
auto stringId = parkEntranceFee = = 0 ? STR_FREE : STR_BOTTOM_TOOLBAR_CASH ;
2020-06-20 21:09:45 +02:00
screenCoords = w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_PRICE ] . left + 1 , w - > widgets [ WIDX_PRICE ] . top + 1 } ;
2021-07-27 20:32:27 +02:00
ft = Formatter ( ) ;
ft . Add < money64 > ( parkEntranceFee ) ;
DrawTextBasic ( dpi , screenCoords , stringId , ft , { w - > colours [ 1 ] } ) ;
2014-04-16 03:05:49 +02:00
}
# pragma endregion
# pragma region Stats page
/**
*
* rct2 : 0x0066928C
*/
2018-06-22 23:21:44 +02:00
static void window_park_stats_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
if ( widgetIndex = = WIDX_CLOSE )
window_close ( w ) ;
else if ( widgetIndex > = WIDX_TAB_1 & & widgetIndex < = WIDX_TAB_7 )
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-18 01:07:06 +02:00
/**
*
* rct2 : 0x00669338
*/
2018-06-22 23:21:44 +02:00
static void window_park_stats_resize ( rct_window * w )
2014-04-18 01:07:06 +02:00
{
2017-12-18 16:26:39 +01:00
window_set_resize ( w , 230 , 119 , 230 , 119 ) ;
2014-04-18 01:07:06 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x006692A8
*/
2018-06-22 23:21:44 +02:00
static void window_park_stats_update ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t i ;
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
widget_invalidate ( w , WIDX_TAB_5 ) ;
// Invalidate ride count if changed
i = ride_get_count ( ) ;
2018-06-22 23:21:44 +02:00
if ( w - > list_information_type ! = i )
{
2017-06-06 23:24:18 +02:00
w - > list_information_type = i ;
widget_invalidate ( w , WIDX_PAGE_BACKGROUND ) ;
}
// Invalidate number of staff if changed
i = peep_get_staff_count ( ) ;
2018-06-22 23:21:44 +02:00
if ( w - > numberOfStaff ! = i )
{
2017-07-28 12:31:49 +02:00
w - > numberOfStaff = i ;
2017-06-06 23:24:18 +02:00
widget_invalidate ( w , WIDX_PAGE_BACKGROUND ) ;
}
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x00669106
*/
2018-06-22 23:21:44 +02:00
static void window_park_stats_invalidate ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
rct_widget * widgets ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
widgets = window_park_page_widgets [ w - > page ] ;
2018-06-22 23:21:44 +02:00
if ( w - > widgets ! = widgets )
{
2017-06-06 23:24:18 +02:00
w - > widgets = widgets ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( w ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_park_set_pressed_tab ( w ) ;
window_park_prepare_window_title_text ( ) ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x00669198
*/
2018-06-22 23:21:44 +02:00
static void window_park_stats_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-16 03:05:49 +02:00
{
2020-06-20 21:09:45 +02:00
int32_t parkSize , stringIndex ;
2017-06-06 23:24:18 +02:00
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
2020-06-20 21:09:45 +02:00
auto screenCoords = w - > windowPos
+ ScreenCoordsXY { window_park_awards_widgets [ WIDX_PAGE_BACKGROUND ] . left + 4 ,
window_park_awards_widgets [ WIDX_PAGE_BACKGROUND ] . top + 4 } ;
2017-06-06 23:24:18 +02:00
// Draw park size
parkSize = gParkSize * 10 ;
stringIndex = STR_PARK_SIZE_METRIC_LABEL ;
2020-08-13 22:51:28 +02:00
if ( gConfigGeneral . measurement_format = = MeasurementFormat : : Imperial )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
stringIndex = STR_PARK_SIZE_IMPERIAL_LABEL ;
parkSize = squaredmetres_to_squaredfeet ( parkSize ) ;
}
2020-09-30 23:42:04 +02:00
auto ft = Formatter ( ) ;
2020-06-03 11:20:29 +02:00
ft . Add < uint32_t > ( parkSize ) ;
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords , stringIndex , ft ) ;
2020-06-20 21:09:45 +02:00
screenCoords . y + = LIST_ROW_HEIGHT ;
2017-06-06 23:24:18 +02:00
// Draw number of rides / attractions
2020-04-18 13:32:48 +02:00
if ( w - > list_information_type ! = 0xFFFF )
2018-06-22 23:21:44 +02:00
{
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
2020-06-03 11:20:29 +02:00
ft . Add < uint32_t > ( w - > list_information_type ) ;
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords , STR_NUMBER_OF_RIDES_LABEL , ft ) ;
2017-06-06 23:24:18 +02:00
}
2020-06-20 21:09:45 +02:00
screenCoords . y + = LIST_ROW_HEIGHT ;
2017-06-06 23:24:18 +02:00
// Draw number of staff
2018-06-22 23:21:44 +02:00
if ( w - > numberOfStaff ! = - 1 )
{
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
2020-06-03 11:20:29 +02:00
ft . Add < uint32_t > ( w - > numberOfStaff ) ;
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords , STR_STAFF_LABEL , ft ) ;
2017-06-06 23:24:18 +02:00
}
2020-06-20 21:09:45 +02:00
screenCoords . y + = LIST_ROW_HEIGHT ;
2017-06-06 23:24:18 +02:00
// Draw number of guests in park
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
ft . Add < uint32_t > ( gNumGuestsInPark ) ;
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords , STR_GUESTS_IN_PARK_LABEL , ft ) ;
2020-06-20 21:09:45 +02:00
screenCoords . y + = LIST_ROW_HEIGHT ;
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
ft . Add < uint32_t > ( gTotalAdmissions ) ;
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords , STR_TOTAL_ADMISSIONS , ft ) ;
2014-04-16 03:05:49 +02:00
}
# pragma endregion
# pragma region Objective page
2014-04-14 22:25:20 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-14 22:25:20 +02:00
* rct2 : 0x00667E57
*/
2018-06-22 23:21:44 +02:00
rct_window * window_park_objective_open ( )
2014-04-14 22:25:20 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * window ;
window = window_bring_to_front_by_class ( WC_PARK_INFORMATION ) ;
2018-06-22 23:21:44 +02:00
if ( window = = nullptr )
{
2017-06-06 23:24:18 +02:00
window = window_park_open ( ) ;
}
if ( input_test_flag ( INPUT_FLAG_TOOL_ACTIVE ) )
2018-06-22 23:21:44 +02:00
if ( window - > classification = = gCurrentToolWidget . window_classification
& & window - > number = = gCurrentToolWidget . window_number )
2017-06-06 23:24:18 +02:00
tool_cancel ( ) ;
2017-08-15 10:07:44 +02:00
window - > viewport = nullptr ;
2017-06-06 23:24:18 +02:00
window - > page = WINDOW_PARK_PAGE_OBJECTIVE ;
2019-06-15 17:20:16 +02:00
window - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
window - > widgets = window_park_objective_widgets ;
window - > enabled_widgets = window_park_page_enabled_widgets [ WINDOW_PARK_PAGE_OBJECTIVE ] ;
window - > hold_down_widgets = window_park_page_hold_down_widgets [ WINDOW_PARK_PAGE_OBJECTIVE ] ;
window - > event_handlers = & window_park_objective_events ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( window ) ;
2020-03-01 20:32:35 +01:00
window - > windowPos . x = context_get_width ( ) / 2 - 115 ;
window - > windowPos . y = context_get_height ( ) / 2 - 87 ;
2019-06-15 17:20:16 +02:00
window - > Invalidate ( ) ;
2017-09-05 20:55:18 +02:00
return window ;
2014-04-14 22:25:20 +02:00
}
2014-04-16 03:05:49 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x006695AA
*/
2018-06-22 23:21:44 +02:00
static void window_park_objective_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-14 22:25:20 +02:00
{
2018-06-22 23:21:44 +02:00
switch ( widgetIndex )
{
case WIDX_CLOSE :
window_close ( w ) ;
break ;
case WIDX_TAB_1 :
case WIDX_TAB_2 :
case WIDX_TAB_3 :
case WIDX_TAB_4 :
case WIDX_TAB_5 :
case WIDX_TAB_6 :
case WIDX_TAB_7 :
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
break ;
case WIDX_ENTER_NAME :
window_text_input_open (
2021-08-24 20:12:05 +02:00
w , WIDX_ENTER_NAME , STR_ENTER_NAME , STR_PLEASE_ENTER_YOUR_NAME_FOR_THE_SCENARIO_CHART , { } , 0 , 0 , 32 ) ;
2018-06-22 23:21:44 +02:00
break ;
2017-06-06 23:24:18 +02:00
}
2014-04-14 22:25:20 +02:00
}
2014-04-18 01:07:06 +02:00
/**
*
* rct2 : 0x00669681
*/
2018-06-22 23:21:44 +02:00
static void window_park_objective_resize ( rct_window * w )
2014-04-18 01:07:06 +02:00
{
2019-07-29 15:16:36 +02:00
# ifndef NO_TTF
if ( gCurrentTTFFontSet ! = nullptr )
window_set_resize ( w , 230 , 270 , 230 , 270 ) ;
else
# endif
window_set_resize ( w , 230 , 226 , 230 , 226 ) ;
2014-04-18 01:07:06 +02:00
}
2014-04-16 03:05:49 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x0066966C
*/
2018-06-22 23:21:44 +02:00
static void window_park_objective_update ( rct_window * w )
2014-04-14 22:25:20 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
widget_invalidate ( w , WIDX_TAB_6 ) ;
2014-04-14 22:25:20 +02:00
}
2014-11-30 03:17:01 +01:00
/**
2015-10-20 20:16:30 +02:00
*
2014-11-30 03:17:01 +01:00
* rct2 : 0x006695CC
*/
2018-06-22 23:21:44 +02:00
static void window_park_objective_textinput ( rct_window * w , rct_widgetindex widgetIndex , char * text )
2014-11-30 03:17:01 +01:00
{
2018-06-22 23:21:44 +02:00
if ( widgetIndex = = WIDX_ENTER_NAME & & text ! = nullptr & & text [ 0 ] ! = 0 )
{
2017-06-06 23:24:18 +02:00
scenario_success_submit_name ( text ) ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
}
2014-11-30 03:17:01 +01:00
}
2014-04-16 03:05:49 +02:00
/**
2015-10-20 20:16:30 +02:00
*
2014-04-16 03:05:49 +02:00
* rct2 : 0x006693B2
*/
2018-06-22 23:21:44 +02:00
static void window_park_objective_invalidate ( rct_window * w )
2014-04-14 22:25:20 +02:00
{
2017-06-06 23:24:18 +02:00
window_park_set_pressed_tab ( w ) ;
window_park_prepare_window_title_text ( ) ;
2014-04-14 22:25:20 +02:00
2019-07-29 15:16:36 +02:00
// Show name input button on scenario completion.
2017-06-06 23:24:18 +02:00
if ( gParkFlags & PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT )
2019-07-29 15:16:36 +02:00
{
2020-11-27 04:14:20 +01:00
window_park_objective_widgets [ WIDX_ENTER_NAME ] . type = WindowWidgetType : : Button ;
2019-07-29 15:16:36 +02:00
window_park_objective_widgets [ WIDX_ENTER_NAME ] . top = w - > height - 19 ;
window_park_objective_widgets [ WIDX_ENTER_NAME ] . bottom = w - > height - 6 ;
}
2017-06-06 23:24:18 +02:00
else
2020-11-27 04:14:20 +01:00
window_park_objective_widgets [ WIDX_ENTER_NAME ] . type = WindowWidgetType : : Empty ;
2014-04-14 22:25:20 +02:00
2017-06-06 23:24:18 +02:00
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
2014-04-14 22:25:20 +02:00
}
/**
2015-10-20 20:16:30 +02:00
*
2014-04-14 22:25:20 +02:00
* rct2 : 0x0066945C
*/
2018-06-22 23:21:44 +02:00
static void window_park_objective_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-14 22:25:20 +02:00
{
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
// Scenario description
2020-06-20 21:09:45 +02:00
auto screenCoords = w - > windowPos
+ ScreenCoordsXY { window_park_objective_widgets [ WIDX_PAGE_BACKGROUND ] . left + 4 ,
window_park_objective_widgets [ WIDX_PAGE_BACKGROUND ] . top + 7 } ;
2020-09-30 23:42:04 +02:00
auto ft = Formatter ( ) ;
2020-05-14 02:29:39 +02:00
ft . Add < rct_string_id > ( STR_STRING ) ;
ft . Add < const char * > ( gScenarioDetails . c_str ( ) ) ;
2021-02-27 17:17:17 +01:00
screenCoords . y + = DrawTextWrapped ( dpi , screenCoords , 222 , STR_BLACK_STRING , ft ) ;
2020-06-20 21:09:45 +02:00
screenCoords . y + = 5 ;
2017-06-06 23:24:18 +02:00
// Your objective:
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords , STR_OBJECTIVE_LABEL ) ;
2020-06-20 21:09:45 +02:00
screenCoords . y + = LIST_ROW_HEIGHT ;
2017-06-06 23:24:18 +02:00
// Objective
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
2020-08-12 22:03:36 +02:00
if ( gScenarioObjective . Type = = OBJECTIVE_BUILD_THE_BEST )
2020-08-13 00:23:08 +02:00
{
rct_string_id rideTypeString = STR_NONE ;
2020-08-12 22:03:36 +02:00
auto rideTypeId = gScenarioObjective . RideId ;
2020-08-13 00:23:08 +02:00
if ( rideTypeId ! = RIDE_TYPE_NULL & & rideTypeId < RIDE_TYPE_COUNT )
{
2021-02-26 10:01:00 +01:00
rideTypeString = GetRideTypeDescriptor ( rideTypeId ) . Naming . Name ;
2020-08-13 00:23:08 +02:00
}
ft . Add < rct_string_id > ( rideTypeString ) ;
}
else
{
2020-08-12 22:03:36 +02:00
ft . Add < uint16_t > ( gScenarioObjective . NumGuests ) ;
ft . Add < int16_t > ( date_get_total_months ( MONTH_OCTOBER , gScenarioObjective . Year ) ) ;
2020-12-23 21:34:04 +01:00
if ( gScenarioObjective . Type = = OBJECTIVE_FINISH_5_ROLLERCOASTERS )
ft . Add < uint16_t > ( gScenarioObjective . MinimumExcitement ) ;
else
2021-04-10 17:00:50 +02:00
ft . Add < money64 > ( gScenarioObjective . Currency ) ;
2020-08-13 00:23:08 +02:00
}
2017-06-06 23:24:18 +02:00
2021-02-27 17:17:17 +01:00
screenCoords . y + = DrawTextWrapped ( dpi , screenCoords , 221 , ObjectiveNames [ gScenarioObjective . Type ] , ft ) ;
2020-06-20 21:09:45 +02:00
screenCoords . y + = 5 ;
2017-06-06 23:24:18 +02:00
// Objective outcome
2021-04-10 17:00:50 +02:00
if ( gScenarioCompletedCompanyValue ! = MONEY64_UNDEFINED )
2018-06-22 23:21:44 +02:00
{
2020-04-18 13:46:18 +02:00
if ( gScenarioCompletedCompanyValue = = COMPANY_VALUE_ON_FAILED_OBJECTIVE )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
// Objective failed
2021-02-27 17:17:17 +01:00
DrawTextWrapped ( dpi , screenCoords , 222 , STR_OBJECTIVE_FAILED ) ;
2018-06-22 23:21:44 +02:00
}
else
{
2017-06-06 23:24:18 +02:00
// Objective completed
2020-09-30 23:42:04 +02:00
ft = Formatter ( ) ;
2021-04-10 17:00:50 +02:00
ft . Add < money64 > ( gScenarioCompletedCompanyValue ) ;
2021-02-27 17:17:17 +01:00
DrawTextWrapped ( dpi , screenCoords , 222 , STR_OBJECTIVE_ACHIEVED , ft ) ;
2017-06-06 23:24:18 +02:00
}
}
2014-04-14 22:25:20 +02:00
}
2014-04-16 03:05:49 +02:00
# pragma endregion
# pragma region Awards page
2014-05-08 17:08:52 +02:00
/**
2018-06-22 23:21:44 +02:00
*
* rct2 : 0x00667DC6
*/
rct_window * window_park_awards_open ( )
2014-05-08 17:08:52 +02:00
{
2017-06-06 23:24:18 +02:00
rct_window * window ;
window = window_bring_to_front_by_class ( WC_PARK_INFORMATION ) ;
2018-06-22 23:21:44 +02:00
if ( window = = nullptr )
{
2017-06-06 23:24:18 +02:00
window = window_park_open ( ) ;
}
if ( input_test_flag ( INPUT_FLAG_TOOL_ACTIVE ) )
2018-06-22 23:21:44 +02:00
if ( window - > classification = = gCurrentToolWidget . window_classification
& & window - > number = = gCurrentToolWidget . window_number )
2017-06-06 23:24:18 +02:00
tool_cancel ( ) ;
2017-08-15 10:07:44 +02:00
window - > viewport = nullptr ;
2017-06-06 23:24:18 +02:00
window - > page = WINDOW_PARK_PAGE_AWARDS ;
2019-06-15 17:20:16 +02:00
window - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
window - > widgets = window_park_awards_widgets ;
window - > enabled_widgets = window_park_page_enabled_widgets [ WINDOW_PARK_PAGE_AWARDS ] ;
window - > hold_down_widgets = window_park_page_hold_down_widgets [ WINDOW_PARK_PAGE_AWARDS ] ;
window - > event_handlers = & window_park_awards_events ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( window ) ;
2017-09-05 20:55:18 +02:00
return window ;
2014-05-08 17:08:52 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x00669851
*/
2018-06-22 23:21:44 +02:00
static void window_park_awards_mouseup ( rct_window * w , rct_widgetindex widgetIndex )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
if ( widgetIndex = = WIDX_CLOSE )
window_close ( w ) ;
else if ( widgetIndex > = WIDX_TAB_1 & & widgetIndex < = WIDX_TAB_7 )
window_park_set_page ( w , widgetIndex - WIDX_TAB_1 ) ;
2014-04-16 03:05:49 +02:00
}
2014-04-18 01:07:06 +02:00
/**
*
* rct2 : 0x00669882
*/
2018-06-22 23:21:44 +02:00
static void window_park_awards_resize ( rct_window * w )
2014-04-18 01:07:06 +02:00
{
2017-06-06 23:24:18 +02:00
window_set_resize ( w , 230 , 182 , 230 , 182 ) ;
2014-04-18 01:07:06 +02:00
}
2014-04-16 03:05:49 +02:00
/**
*
* rct2 : 0x0066986D
*/
2018-06-22 23:21:44 +02:00
static void window_park_awards_update ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
w - > frame_no + + ;
widget_invalidate ( w , WIDX_TAB_7 ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x006696FB
*/
2018-06-22 23:21:44 +02:00
static void window_park_awards_invalidate ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-22 23:21:44 +02:00
rct_widget * widgets ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
widgets = window_park_page_widgets [ w - > page ] ;
2018-06-22 23:21:44 +02:00
if ( w - > widgets ! = widgets )
{
2017-06-06 23:24:18 +02:00
w - > widgets = widgets ;
2020-11-04 05:52:23 +01:00
WindowInitScrollWidgets ( w ) ;
2017-06-06 23:24:18 +02:00
}
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_park_set_pressed_tab ( w ) ;
window_park_prepare_window_title_text ( ) ;
2014-04-16 03:05:49 +02:00
2017-06-06 23:24:18 +02:00
window_align_tabs ( w , WIDX_TAB_1 , WIDX_TAB_7 ) ;
window_park_anchor_border_widgets ( w ) ;
2014-04-16 03:05:49 +02:00
}
/**
*
* rct2 : 0x0066978D
*/
2018-06-22 23:21:44 +02:00
static void window_park_awards_paint ( rct_window * w , rct_drawpixelinfo * dpi )
2014-04-16 03:05:49 +02:00
{
2020-11-04 05:52:23 +01:00
WindowDrawWidgets ( w , dpi ) ;
2017-06-06 23:24:18 +02:00
window_park_draw_tab_images ( dpi , w ) ;
2020-06-20 21:09:45 +02:00
auto screenCoords = w - > windowPos
+ ScreenCoordsXY { window_park_awards_widgets [ WIDX_PAGE_BACKGROUND ] . left + 4 ,
window_park_awards_widgets [ WIDX_PAGE_BACKGROUND ] . top + 4 } ;
2018-06-20 17:28:51 +02:00
int32_t count = 0 ;
2018-06-22 23:21:44 +02:00
for ( int32_t i = 0 ; i < MAX_AWARDS ; i + + )
{
Award * award = & gCurrentAwards [ i ] ;
2017-06-06 23:24:18 +02:00
if ( award - > Time = = 0 )
continue ;
2021-03-23 11:58:09 +01:00
gfx_draw_sprite ( dpi , ImageId ( ParkAwards [ award - > Type ] . sprite ) , screenCoords ) ;
2021-02-27 17:17:17 +01:00
DrawTextWrapped ( dpi , screenCoords + ScreenCoordsXY { 34 , 6 } , 180 , ParkAwards [ award - > Type ] . text ) ;
2017-06-06 23:24:18 +02:00
2020-06-20 21:09:45 +02:00
screenCoords . y + = 32 ;
2017-06-06 23:24:18 +02:00
count + + ;
}
if ( count = = 0 )
2021-02-27 16:49:13 +01:00
DrawTextBasic ( dpi , screenCoords + ScreenCoordsXY { 6 , 6 } , STR_NO_RECENT_AWARDS ) ;
2014-04-16 03:05:49 +02:00
}
# pragma endregion
2014-04-18 23:47:25 +02:00
# pragma region Common
2014-04-26 16:49:44 +02:00
/**
*
* rct2 : 0x00668496
*/
2018-06-22 23:21:44 +02:00
static void window_park_set_page ( rct_window * w , int32_t page )
2014-04-16 03:05:49 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t listen ;
2017-06-06 23:24:18 +02:00
if ( input_test_flag ( INPUT_FLAG_TOOL_ACTIVE ) )
if ( w - > classification = = gCurrentToolWidget . window_classification & & w - > number = = gCurrentToolWidget . window_number )
tool_cancel ( ) ;
// Set listen only to viewport
listen = 0 ;
2018-06-22 23:21:44 +02:00
if ( page = = WINDOW_PARK_PAGE_ENTRANCE & & w - > page = = WINDOW_PARK_PAGE_ENTRANCE & & w - > viewport ! = nullptr
& & ! ( w - > viewport - > flags & VIEWPORT_FLAG_SOUND_ON ) )
2017-06-06 23:24:18 +02:00
listen + + ;
w - > page = page ;
w - > frame_no = 0 ;
w - > var_492 = 0 ;
2020-10-06 11:27:56 +02:00
w - > RemoveViewport ( ) ;
2017-06-06 23:24:18 +02:00
w - > enabled_widgets = window_park_page_enabled_widgets [ page ] ;
w - > hold_down_widgets = window_park_page_hold_down_widgets [ page ] ;
w - > event_handlers = window_park_page_events [ page ] ;
w - > widgets = window_park_page_widgets [ page ] ;
window_park_set_disabled_tabs ( w ) ;
2019-06-15 17:20:16 +02:00
w - > Invalidate ( ) ;
2017-06-06 23:24:18 +02:00
window_event_resize_call ( w ) ;
window_event_invalidate_call ( w ) ;
window_event_update_call ( w ) ;
2017-08-15 10:07:44 +02:00
if ( listen ! = 0 & & w - > viewport ! = nullptr )
2017-06-06 23:24:18 +02:00
w - > viewport - > flags | = VIEWPORT_FLAG_SOUND_ON ;
2014-04-16 03:05:49 +02:00
}
2018-06-22 23:21:44 +02:00
static void window_park_anchor_border_widgets ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2017-06-06 23:24:18 +02:00
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
w - > widgets [ WIDX_CLOSE ] . left = w - > width - 13 ;
w - > widgets [ WIDX_CLOSE ] . right = w - > width - 3 ;
2014-04-16 03:05:49 +02:00
}
2018-06-22 23:21:44 +02:00
static void window_park_set_pressed_tab ( rct_window * w )
2014-04-16 03:05:49 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t i ;
2017-06-06 23:24:18 +02:00
for ( i = 0 ; i < 7 ; i + + )
w - > pressed_widgets & = ~ ( 1 < < ( WIDX_TAB_1 + i ) ) ;
w - > pressed_widgets | = 1LL < < ( WIDX_TAB_1 + w - > page ) ;
2014-04-16 03:05:49 +02:00
}
2018-06-22 23:21:44 +02:00
static void window_park_draw_tab_images ( rct_drawpixelinfo * dpi , rct_window * w )
2014-04-14 22:25:20 +02:00
{
2018-06-20 17:28:51 +02:00
int32_t sprite_idx ;
2017-06-06 23:24:18 +02:00
// Entrance tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_1 ) ) )
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( SPR_TAB_PARK_ENTRANCE ) ,
w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_1 ] . left , w - > widgets [ WIDX_TAB_1 ] . top } ) ;
2017-06-06 23:24:18 +02:00
// Rating tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_2 ) ) )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
sprite_idx = SPR_TAB_GRAPH_0 ;
if ( w - > page = = WINDOW_PARK_PAGE_RATING )
sprite_idx + = ( w - > frame_no / 8 ) % 8 ;
2018-06-22 23:21:44 +02: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 } ) ;
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( SPR_RATING_HIGH ) ,
w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_2 ] . left + 7 , w - > widgets [ WIDX_TAB_2 ] . top + 1 } ) ;
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( SPR_RATING_LOW ) ,
w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_2 ] . left + 16 , w - > widgets [ WIDX_TAB_2 ] . top + 12 } ) ;
2017-06-06 23:24:18 +02:00
}
// Guests tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_3 ) ) )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
sprite_idx = SPR_TAB_GRAPH_0 ;
if ( w - > page = = WINDOW_PARK_PAGE_GUESTS )
sprite_idx + = ( w - > frame_no / 8 ) % 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 } ) ;
2017-06-06 23:24:18 +02:00
2020-10-07 17:01:43 +02:00
sprite_idx = GetPeepAnimation ( PeepSpriteType : : Normal ) . base_image + 1 ;
2017-06-06 23:24:18 +02:00
if ( w - > page = = WINDOW_PARK_PAGE_GUESTS )
sprite_idx + = w - > var_492 & 0xFFFFFFFC ;
sprite_idx | = 0xA9E00000 ;
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId : : FromUInt32 ( sprite_idx ) ,
w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_3 ] . midX ( ) , w - > widgets [ WIDX_TAB_3 ] . bottom - 9 } ) ;
2017-06-06 23:24:18 +02:00
}
// Price tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_4 ) ) )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
sprite_idx = SPR_TAB_ADMISSION_0 ;
if ( w - > page = = WINDOW_PARK_PAGE_PRICE )
sprite_idx + = ( w - > frame_no / 2 ) % 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_4 ] . left , w - > widgets [ WIDX_TAB_4 ] . top } ) ;
2017-06-06 23:24:18 +02:00
}
// Statistics tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_5 ) ) )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
sprite_idx = SPR_TAB_STATS_0 ;
if ( w - > page = = WINDOW_PARK_PAGE_STATS )
sprite_idx + = ( w - > frame_no / 4 ) % 7 ;
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_5 ] . left , w - > widgets [ WIDX_TAB_5 ] . top } ) ;
2017-06-06 23:24:18 +02:00
}
// Objective tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_6 ) ) )
2018-06-22 23:21:44 +02:00
{
2017-06-06 23:24:18 +02:00
sprite_idx = SPR_TAB_OBJECTIVE_0 ;
if ( w - > page = = WINDOW_PARK_PAGE_OBJECTIVE )
sprite_idx + = ( w - > frame_no / 4 ) % 16 ;
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_6 ] . left , w - > widgets [ WIDX_TAB_6 ] . top } ) ;
2017-06-06 23:24:18 +02:00
}
// Awards tab
2021-06-26 14:23:15 +02:00
if ( ! ( w - > disabled_widgets & ( 1ULL < < WIDX_TAB_7 ) ) )
2020-03-01 20:32:35 +01:00
gfx_draw_sprite (
2021-03-23 11:58:09 +01:00
dpi , ImageId ( SPR_TAB_AWARDS ) ,
w - > windowPos + ScreenCoordsXY { w - > widgets [ WIDX_TAB_7 ] . left , w - > widgets [ WIDX_TAB_7 ] . top } ) ;
2014-04-18 23:47:25 +02:00
}
2014-04-21 11:27:48 +02:00
# pragma endregion