2014-11-25 00:05:35 +01:00
|
|
|
/*****************************************************************************
|
2020-07-21 15:04:34 +02:00
|
|
|
* Copyright (c) 2014-2020 OpenRCT2 developers
|
2016-05-04 19:24:41 +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
|
2016-05-04 19:24:41 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
2016-05-04 19:24:41 +02:00
|
|
|
*****************************************************************************/
|
2014-11-25 00:05:35 +01:00
|
|
|
|
2018-11-06 22:48:58 +01:00
|
|
|
#include "../interface/Dropdown.h"
|
|
|
|
#include "../interface/Widget.h"
|
|
|
|
#include "../interface/Window.h"
|
|
|
|
#include "Window.h"
|
|
|
|
|
2019-08-03 19:11:30 +02:00
|
|
|
#include <algorithm>
|
2018-11-21 23:16:04 +01:00
|
|
|
#include <iterator>
|
2017-12-27 21:57:58 +01:00
|
|
|
#include <openrct2/Context.h>
|
2019-07-21 11:33:15 +02:00
|
|
|
#include <openrct2/GameState.h>
|
2018-06-22 23:21:44 +02:00
|
|
|
#include <openrct2/OpenRCT2.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>
|
2019-07-21 11:33:15 +02:00
|
|
|
#include <openrct2/core/String.hpp>
|
2018-11-06 22:48:58 +01:00
|
|
|
#include <openrct2/drawing/Drawing.h>
|
|
|
|
#include <openrct2/drawing/Font.h>
|
|
|
|
#include <openrct2/interface/Colour.h>
|
2018-01-06 18:32:25 +01:00
|
|
|
#include <openrct2/localisation/Date.h>
|
2018-11-06 22:48:58 +01:00
|
|
|
#include <openrct2/localisation/Language.h>
|
2018-01-06 18:32:25 +01:00
|
|
|
#include <openrct2/localisation/Localisation.h>
|
2018-11-06 22:48:58 +01:00
|
|
|
#include <openrct2/localisation/StringIds.h>
|
|
|
|
#include <openrct2/ride/Ride.h>
|
2018-06-22 23:21:44 +02:00
|
|
|
#include <openrct2/scenario/Scenario.h>
|
2017-09-18 17:05:28 +02:00
|
|
|
#include <openrct2/sprites.h>
|
2017-12-13 13:02:24 +01:00
|
|
|
#include <openrct2/util/Util.h>
|
2018-03-19 23:28:40 +01:00
|
|
|
#include <openrct2/world/Park.h>
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2020-05-05 22:26:14 +02:00
|
|
|
static constexpr const rct_string_id WINDOW_TITLE = STR_OBJECTIVE_SELECTION;
|
|
|
|
static constexpr const int32_t WH = 229;
|
|
|
|
static constexpr const int32_t WW = 450;
|
2019-10-19 04:02:31 +02:00
|
|
|
|
2014-12-11 00:07:11 +01:00
|
|
|
#pragma region Widgets
|
|
|
|
|
2018-05-16 20:41:29 +02:00
|
|
|
// clang-format off
|
2014-12-11 00:07:11 +01:00
|
|
|
enum {
|
2017-06-06 23:24:18 +02:00
|
|
|
WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN,
|
|
|
|
WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_RIDES,
|
|
|
|
WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_COUNT
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
2018-01-11 14:50:31 +01:00
|
|
|
static constexpr const rct_string_id ObjectiveDropdownOptionNames[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
STR_OBJECTIVE_DROPDOWN_NONE,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_NUMBER_OF_GUESTS_AT_A_GIVEN_DATE,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_PARK_VALUE_AT_A_GIVEN_DATE,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_HAVE_FUN,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_BUILD_THE_BEST_RIDE_YOU_CAN,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_BUILD_10_ROLLER_COASTERS,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_NUMBER_OF_GUESTS_IN_PARK,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_MONTHLY_INCOME_FROM_RIDE_TICKETS,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_BUILD_10_ROLLER_COASTERS_OF_A_GIVEN_LENGTH,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_FINISH_BUILDING_5_ROLLER_COASTERS,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_REPAY_LOAN_AND_ACHIEVE_A_GIVEN_PARK_VALUE,
|
|
|
|
STR_OBJECTIVE_DROPDOWN_MONTHLY_PROFIT_FROM_FOOD_MERCHANDISE,
|
2016-07-14 14:07:49 +02:00
|
|
|
};
|
|
|
|
|
2014-12-11 00:07:11 +01:00
|
|
|
enum {
|
2017-06-06 23:24:18 +02:00
|
|
|
WIDX_BACKGROUND,
|
|
|
|
WIDX_TITLE,
|
|
|
|
WIDX_CLOSE,
|
|
|
|
WIDX_PAGE_BACKGROUND,
|
|
|
|
WIDX_TAB_1,
|
|
|
|
WIDX_TAB_2,
|
|
|
|
|
|
|
|
WIDX_OBJECTIVE = 6,
|
|
|
|
WIDX_OBJECTIVE_DROPDOWN,
|
|
|
|
WIDX_OBJECTIVE_ARG_1,
|
|
|
|
WIDX_OBJECTIVE_ARG_1_INCREASE,
|
|
|
|
WIDX_OBJECTIVE_ARG_1_DECREASE,
|
|
|
|
WIDX_OBJECTIVE_ARG_2,
|
|
|
|
WIDX_OBJECTIVE_ARG_2_INCREASE,
|
|
|
|
WIDX_OBJECTIVE_ARG_2_DECREASE,
|
|
|
|
WIDX_PARK_NAME,
|
|
|
|
WIDX_SCENARIO_NAME,
|
|
|
|
WIDX_CATEGORY,
|
|
|
|
WIDX_CATEGORY_DROPDOWN,
|
|
|
|
WIDX_DETAILS,
|
|
|
|
|
|
|
|
WIDX_RIDES = 6
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
2016-10-30 02:12:41 +01:00
|
|
|
#define MAIN_OBJECTIVE_OPTIONS_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}, {280, 106}, WindowWidgetType::Resize, WindowColour::Secondary), \
|
2020-08-29 04:31:31 +02:00
|
|
|
MakeTab ({ 3, 17}, STR_SELECT_OBJECTIVE_AND_PARK_NAME_TIP ), \
|
|
|
|
MakeTab ({ 34, 17}, STR_SELECT_RIDES_TO_BE_PRESERVED_TIP )
|
2016-10-30 02:12:41 +01:00
|
|
|
|
2014-12-11 00:07:11 +01:00
|
|
|
static rct_widget window_editor_objective_options_main_widgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_OBJECTIVE_OPTIONS_WIDGETS,
|
2020-11-27 04:14:20 +01:00
|
|
|
MakeWidget ({ 98, 48}, {344, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_NONE, STR_SELECT_OBJECTIVE_FOR_THIS_SCENARIO_TIP ),
|
|
|
|
MakeWidget ({430, 49}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_SELECT_OBJECTIVE_FOR_THIS_SCENARIO_TIP ),
|
|
|
|
MakeSpinnerWidgets({158, 65}, {120, 12}, WindowWidgetType::Button, WindowColour::Secondary ), // NB: 3 widgets
|
|
|
|
MakeSpinnerWidgets({158, 82}, {120, 12}, WindowWidgetType::Button, WindowColour::Secondary ), // NB: 3 widgets
|
|
|
|
MakeWidget ({370, 99}, { 75, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_CHANGE, STR_CHANGE_NAME_OF_PARK_TIP ),
|
|
|
|
MakeWidget ({370, 116}, { 75, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_CHANGE, STR_CHANGE_NAME_OF_SCENARIO_TIP ),
|
|
|
|
MakeWidget ({ 98, 133}, {180, 12}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_NONE, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN),
|
|
|
|
MakeWidget ({266, 134}, { 11, 10}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN),
|
|
|
|
MakeWidget ({370, 150}, { 75, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_CHANGE, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP),
|
2021-09-26 11:11:42 +02:00
|
|
|
WIDGETS_END,
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
static rct_widget window_editor_objective_options_rides_widgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_OBJECTIVE_OPTIONS_WIDGETS,
|
2020-11-27 04:14:20 +01:00
|
|
|
MakeWidget({ 3, 60}, {374, 161}, WindowWidgetType::Scroll, WindowColour::Secondary, SCROLL_VERTICAL),
|
2021-09-26 11:11:42 +02:00
|
|
|
WIDGETS_END,
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
static rct_widget *window_editor_objective_options_widgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
window_editor_objective_options_main_widgets,
|
2021-10-17 15:31:56 +02:00
|
|
|
window_editor_objective_options_rides_widgets,
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#pragma endregion
|
|
|
|
|
|
|
|
#pragma region Events
|
|
|
|
|
2017-05-01 15:41:45 +02:00
|
|
|
static void window_editor_objective_options_main_mouseup(rct_window *w, rct_widgetindex widgetIndex);
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_editor_objective_options_main_resize(rct_window *w);
|
2017-07-03 23:09:46 +02:00
|
|
|
static void window_editor_objective_options_main_mousedown(rct_window *w, rct_widgetindex widgetIndex, rct_widget* widget);
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_editor_objective_options_main_dropdown(rct_window *w, rct_widgetindex widgetIndex, int32_t dropdownIndex);
|
2014-12-11 00:07:11 +01:00
|
|
|
static void window_editor_objective_options_main_update(rct_window *w);
|
2017-05-01 15:41:45 +02:00
|
|
|
static void window_editor_objective_options_main_textinput(rct_window *w, rct_widgetindex widgetIndex, char *text);
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_editor_objective_options_main_invalidate(rct_window *w);
|
|
|
|
static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpixelinfo *dpi);
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2017-05-01 15:41:45 +02:00
|
|
|
static void window_editor_objective_options_rides_mouseup(rct_window *w, rct_widgetindex widgetIndex);
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_editor_objective_options_rides_resize(rct_window *w);
|
2014-12-11 00:07:11 +01:00
|
|
|
static void window_editor_objective_options_rides_update(rct_window *w);
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_editor_objective_options_rides_scrollgetheight(rct_window *w, int32_t scrollIndex, int32_t *width, int32_t *height);
|
2020-02-29 03:43:29 +01:00
|
|
|
static void window_editor_objective_options_rides_scrollmousedown(rct_window *w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords);
|
|
|
|
static void window_editor_objective_options_rides_scrollmouseover(rct_window *w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords);
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_editor_objective_options_rides_invalidate(rct_window *w);
|
|
|
|
static void window_editor_objective_options_rides_paint(rct_window *w, rct_drawpixelinfo *dpi);
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_editor_objective_options_rides_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int32_t scrollIndex);
|
2014-12-11 00:07:11 +01:00
|
|
|
|
|
|
|
// 0x009A9DF4
|
2020-09-28 20:36:15 +02:00
|
|
|
static rct_window_event_list window_objective_options_main_events([](auto& events)
|
|
|
|
{
|
|
|
|
events.mouse_up = &window_editor_objective_options_main_mouseup;
|
|
|
|
events.resize = &window_editor_objective_options_main_resize;
|
|
|
|
events.mouse_down = &window_editor_objective_options_main_mousedown;
|
|
|
|
events.dropdown = &window_editor_objective_options_main_dropdown;
|
|
|
|
events.update = &window_editor_objective_options_main_update;
|
|
|
|
events.text_input = &window_editor_objective_options_main_textinput;
|
|
|
|
events.invalidate = &window_editor_objective_options_main_invalidate;
|
|
|
|
events.paint = &window_editor_objective_options_main_paint;
|
|
|
|
});
|
2014-12-11 00:07:11 +01:00
|
|
|
|
|
|
|
// 0x009A9F58
|
2020-09-28 20:36:15 +02:00
|
|
|
static rct_window_event_list window_objective_options_rides_events([](auto& events)
|
|
|
|
{
|
|
|
|
events.mouse_up = &window_editor_objective_options_rides_mouseup;
|
|
|
|
events.resize = &window_editor_objective_options_rides_resize;
|
|
|
|
events.update = &window_editor_objective_options_rides_update;
|
|
|
|
events.get_scroll_size = &window_editor_objective_options_rides_scrollgetheight;
|
|
|
|
events.scroll_mousedown = &window_editor_objective_options_rides_scrollmousedown;
|
|
|
|
events.scroll_mouseover = &window_editor_objective_options_rides_scrollmouseover;
|
|
|
|
events.invalidate = &window_editor_objective_options_rides_invalidate;
|
|
|
|
events.paint = &window_editor_objective_options_rides_paint;
|
|
|
|
events.scroll_paint = &window_editor_objective_options_rides_scrollpaint;
|
|
|
|
});
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2015-07-10 02:39:16 +02:00
|
|
|
static rct_window_event_list *window_editor_objective_options_page_events[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
&window_objective_options_main_events,
|
2021-10-17 15:31:56 +02:00
|
|
|
&window_objective_options_rides_events,
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#pragma endregion
|
|
|
|
|
|
|
|
#pragma region Enabled widgets
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static uint64_t window_editor_objective_options_page_enabled_widgets[] = {
|
2021-06-26 14:23:15 +02:00
|
|
|
(1ULL << WIDX_CLOSE) |
|
|
|
|
(1ULL << WIDX_TAB_1) |
|
|
|
|
(1ULL << WIDX_TAB_2) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_DROPDOWN) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_1_INCREASE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_1_DECREASE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_2_INCREASE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_2_DECREASE) |
|
|
|
|
(1ULL << WIDX_PARK_NAME) |
|
|
|
|
(1ULL << WIDX_SCENARIO_NAME) |
|
|
|
|
(1ULL << WIDX_CATEGORY) |
|
|
|
|
(1ULL << WIDX_CATEGORY_DROPDOWN) |
|
|
|
|
(1ULL << WIDX_DETAILS),
|
|
|
|
|
|
|
|
(1ULL << WIDX_CLOSE) |
|
|
|
|
(1ULL << WIDX_TAB_1) |
|
2021-10-17 15:31:56 +02:00
|
|
|
(1ULL << WIDX_TAB_2),
|
2014-12-11 00:07:11 +01:00
|
|
|
};
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static uint64_t window_editor_objective_options_page_hold_down_widgets[] = {
|
2021-06-26 14:23:15 +02:00
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_1_INCREASE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_1_DECREASE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_2_INCREASE) |
|
|
|
|
(1ULL << WIDX_OBJECTIVE_ARG_2_DECREASE),
|
2015-02-10 21:40:33 +01:00
|
|
|
|
2021-10-17 15:31:56 +02:00
|
|
|
0,
|
2015-02-10 21:40:33 +01:00
|
|
|
};
|
2018-05-16 20:41:29 +02:00
|
|
|
// clang-format on
|
2015-02-10 21:40:33 +01:00
|
|
|
|
2014-12-11 00:07:11 +01:00
|
|
|
#pragma endregion
|
2014-11-25 00:05:35 +01:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_update_disabled_widgets(rct_window* w);
|
2015-06-28 02:57:50 +02:00
|
|
|
|
2014-11-25 00:05:35 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x0067137D
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_window* window_editor_objective_options_open()
|
2014-11-25 00:05:35 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_window* w;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2020-10-11 18:42:17 +02:00
|
|
|
w = window_bring_to_front_by_class(WC_EDITOR_OBJECTIVE_OPTIONS);
|
2017-08-15 10:07:44 +02:00
|
|
|
if (w != nullptr)
|
2017-08-12 23:06:12 +02:00
|
|
|
return w;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2020-11-04 05:52:23 +01:00
|
|
|
w = WindowCreateCentred(450, 228, &window_objective_options_main_events, WC_EDITOR_OBJECTIVE_OPTIONS, WF_10);
|
2017-06-06 23:24:18 +02:00
|
|
|
w->widgets = window_editor_objective_options_main_widgets;
|
|
|
|
w->enabled_widgets = window_editor_objective_options_page_enabled_widgets[WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN];
|
|
|
|
w->pressed_widgets = 0;
|
|
|
|
w->hold_down_widgets = window_editor_objective_options_page_hold_down_widgets[WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN];
|
2020-11-04 05:52:23 +01:00
|
|
|
WindowInitScrollWidgets(w);
|
2017-06-06 23:24:18 +02:00
|
|
|
w->selected_tab = WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN;
|
|
|
|
w->no_list_items = 0;
|
|
|
|
w->selected_list_item = -1;
|
|
|
|
window_editor_objective_options_update_disabled_widgets(w);
|
2017-08-12 23:06:12 +02:00
|
|
|
|
|
|
|
return w;
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_set_pressed_tab(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t i;
|
2017-06-06 23:24:18 +02:00
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i));
|
|
|
|
w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_anchor_border_widgets(rct_window* w)
|
2014-12-11 00:07:11 +01: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-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_draw_tab_images(rct_window* w, rct_drawpixelinfo* dpi)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_widget* widget;
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t spriteIndex;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
// Tab 1
|
|
|
|
widget = &w->widgets[WIDX_TAB_1];
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
spriteIndex = SPR_TAB_OBJECTIVE_0;
|
|
|
|
if (w->page == WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN)
|
|
|
|
spriteIndex += (w->frame_no / 4) % 16;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2021-03-23 11:58:09 +01:00
|
|
|
gfx_draw_sprite(dpi, ImageId(spriteIndex), w->windowPos + ScreenCoordsXY{ widget->left, widget->top });
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
// Tab 2
|
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
|
|
|
widget = &w->widgets[WIDX_TAB_2];
|
|
|
|
spriteIndex = SPR_TAB_RIDE_0;
|
|
|
|
if (w->page == WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_RIDES)
|
|
|
|
spriteIndex += (w->frame_no / 4) % 16;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2021-03-23 11:58:09 +01:00
|
|
|
gfx_draw_sprite(dpi, ImageId(spriteIndex), w->windowPos + ScreenCoordsXY{ widget->left, widget->top });
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00668496
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_set_page(rct_window* w, int32_t page)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
if (w->page == page)
|
|
|
|
return;
|
|
|
|
|
|
|
|
w->page = page;
|
|
|
|
w->frame_no = 0;
|
|
|
|
w->var_492 = 0;
|
|
|
|
w->no_list_items = 0;
|
|
|
|
w->selected_list_item = -1;
|
|
|
|
w->enabled_widgets = window_editor_objective_options_page_enabled_widgets[page];
|
|
|
|
w->hold_down_widgets = window_editor_objective_options_page_hold_down_widgets[page];
|
|
|
|
w->event_handlers = window_editor_objective_options_page_events[page];
|
|
|
|
w->widgets = window_editor_objective_options_widgets[page];
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2017-06-06 23:24:18 +02:00
|
|
|
window_editor_objective_options_update_disabled_widgets(w);
|
|
|
|
window_event_resize_call(w);
|
|
|
|
window_event_invalidate_call(w);
|
2020-11-04 05:52:23 +01:00
|
|
|
WindowInitScrollWidgets(w);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x0067201D
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_set_objective(rct_window* w, int32_t objective)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Type = objective;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Set default objective arguments
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (objective)
|
|
|
|
{
|
|
|
|
case OBJECTIVE_NONE:
|
|
|
|
case OBJECTIVE_HAVE_FUN:
|
|
|
|
case OBJECTIVE_BUILD_THE_BEST:
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS:
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_GUESTS_BY:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Year = 3;
|
|
|
|
gScenarioObjective.NumGuests = 1500;
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_PARK_VALUE_BY:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Year = 3;
|
|
|
|
gScenarioObjective.Currency = MONEY(50000, 00);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_GUESTS_AND_RATING:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.NumGuests = 2000;
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_MONTHLY_RIDE_INCOME:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency = MONEY(10000, 00);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.MinimumLength = 1200;
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_FINISH_5_ROLLERCOASTERS:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.MinimumExcitement = FIXED_2DP(6, 70);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
2020-11-19 19:45:40 +01:00
|
|
|
case OBJECTIVE_REPAY_LOAN_AND_PARK_VALUE:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency = MONEY(50000, 00);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_MONTHLY_FOOD_INCOME:
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency = MONEY(1000, 00);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006719CA
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_mouseup(rct_window* w, rct_widgetindex widgetIndex)
|
2014-12-11 00:07:11 +01: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:
|
|
|
|
window_editor_objective_options_set_page(w, widgetIndex - WIDX_TAB_1);
|
|
|
|
break;
|
|
|
|
case WIDX_PARK_NAME:
|
2019-07-21 11:33:15 +02:00
|
|
|
{
|
|
|
|
auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark();
|
2021-08-24 20:12:05 +02:00
|
|
|
window_text_input_raw_open(w, WIDX_PARK_NAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, {}, park.Name.c_str(), 32);
|
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_SCENARIO_NAME:
|
2021-04-05 19:01:43 +02:00
|
|
|
window_text_input_raw_open(
|
2021-08-24 20:12:05 +02:00
|
|
|
w, WIDX_SCENARIO_NAME, STR_SCENARIO_NAME, STR_ENTER_SCENARIO_NAME, {}, gScenarioName.c_str(), 64);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_DETAILS:
|
|
|
|
window_text_input_raw_open(
|
2021-08-24 20:12:05 +02:00
|
|
|
w, WIDX_DETAILS, STR_PARK_SCENARIO_DETAILS, STR_ENTER_SCENARIO_DESCRIPTION, {}, gScenarioDetails.c_str(), 256);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00672254
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_resize(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_set_resize(w, 450, 229, 450, 229);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_show_objective_dropdown(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t numItems = 0, objectiveType;
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_widget* dropdownWidget;
|
2018-06-20 17:28:51 +02:00
|
|
|
uint32_t parkFlags;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
dropdownWidget = &w->widgets[WIDX_OBJECTIVE];
|
|
|
|
parkFlags = gParkFlags;
|
|
|
|
|
2020-08-12 22:10:47 +02:00
|
|
|
for (auto i = 0; i < OBJECTIVE_COUNT; i++)
|
2017-06-29 14:00:51 +02:00
|
|
|
{
|
2020-08-12 22:10:47 +02:00
|
|
|
if (i == OBJECTIVE_NONE || i == OBJECTIVE_BUILD_THE_BEST)
|
|
|
|
continue;
|
2017-06-29 14:00:51 +02:00
|
|
|
|
2020-08-12 22:10:47 +02:00
|
|
|
const bool objectiveAllowedByMoneyUsage = !(parkFlags & PARK_FLAGS_NO_MONEY_SCENARIO) || !ObjectiveNeedsMoney(i);
|
|
|
|
// This objective can only work if the player can ask money for rides.
|
|
|
|
const bool objectiveAllowedByPaymentSettings = (i != OBJECTIVE_MONTHLY_RIDE_INCOME) || park_ride_prices_unlocked();
|
|
|
|
if (objectiveAllowedByMoneyUsage && objectiveAllowedByPaymentSettings)
|
2017-06-29 14:00:51 +02:00
|
|
|
{
|
|
|
|
gDropdownItemsFormat[numItems] = STR_DROPDOWN_MENU_LABEL;
|
2020-08-12 22:10:47 +02:00
|
|
|
gDropdownItemsArgs[numItems] = ObjectiveDropdownOptionNames[i];
|
2017-06-06 23:24:18 +02:00
|
|
|
numItems++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-03 09:16:06 +01:00
|
|
|
WindowDropdownShowTextCustomWidth(
|
2020-06-25 03:44:00 +02:00
|
|
|
{ w->windowPos.x + dropdownWidget->left, w->windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1,
|
2020-11-03 09:16:06 +01:00
|
|
|
w->colours[1], 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width() - 3);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2020-08-12 22:03:36 +02:00
|
|
|
objectiveType = gScenarioObjective.Type;
|
2018-06-20 17:28:51 +02:00
|
|
|
for (int32_t j = 0; j < numItems; j++)
|
2017-06-29 14:00:51 +02:00
|
|
|
{
|
|
|
|
if (gDropdownItemsArgs[j] - STR_OBJECTIVE_DROPDOWN_NONE == objectiveType)
|
|
|
|
{
|
2020-11-03 09:16:06 +01:00
|
|
|
Dropdown::SetChecked(j, true);
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_show_category_dropdown(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t i;
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_widget* dropdownWidget;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
dropdownWidget = &w->widgets[WIDX_CATEGORY];
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
for (i = SCENARIO_CATEGORY_BEGINNER; i <= SCENARIO_CATEGORY_OTHER; i++)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
gDropdownItemsFormat[i] = STR_DROPDOWN_MENU_LABEL;
|
|
|
|
gDropdownItemsArgs[i] = ScenarioCategoryStringIds[i];
|
|
|
|
}
|
2020-11-03 09:16:06 +01:00
|
|
|
WindowDropdownShowTextCustomWidth(
|
2020-06-25 03:44:00 +02:00
|
|
|
{ w->windowPos.x + dropdownWidget->left, w->windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1,
|
2020-11-03 09:16:06 +01:00
|
|
|
w->colours[1], 0, Dropdown::Flag::StayOpen, 5, dropdownWidget->width() - 3);
|
2021-04-05 19:01:43 +02:00
|
|
|
Dropdown::SetChecked(gScenarioCategory, true);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_arg_1_increase(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
switch (gScenarioObjective.Type)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
case OBJECTIVE_PARK_VALUE_BY:
|
|
|
|
case OBJECTIVE_MONTHLY_RIDE_INCOME:
|
2020-11-19 19:45:40 +01:00
|
|
|
case OBJECTIVE_REPAY_LOAN_AND_PARK_VALUE:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Currency >= MONEY(2000000, 00))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_INCREASE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency += MONEY(1000, 0);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_MONTHLY_FOOD_INCOME:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Currency >= MONEY(2000000, 00))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_INCREASE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency += MONEY(100, 0);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.MinimumLength >= 5000)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_INCREASE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.MinimumLength += 100;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_FINISH_5_ROLLERCOASTERS:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.MinimumExcitement >= FIXED_2DP(9, 90))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_INCREASE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.MinimumExcitement += FIXED_2DP(0, 10);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.NumGuests >= 5000)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_INCREASE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.NumGuests += 50;
|
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-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_arg_1_decrease(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
switch (gScenarioObjective.Type)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
case OBJECTIVE_PARK_VALUE_BY:
|
|
|
|
case OBJECTIVE_MONTHLY_RIDE_INCOME:
|
2020-11-19 19:45:40 +01:00
|
|
|
case OBJECTIVE_REPAY_LOAN_AND_PARK_VALUE:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Currency <= MONEY(1000, 00))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_REDUCE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency -= MONEY(1000, 0);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_MONTHLY_FOOD_INCOME:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Currency <= MONEY(1000, 00))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_REDUCE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Currency -= MONEY(100, 0);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.MinimumLength <= 1000)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_REDUCE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.MinimumLength -= 100;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_FINISH_5_ROLLERCOASTERS:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.MinimumExcitement <= FIXED_2DP(4, 00))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_REDUCE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.MinimumExcitement -= FIXED_2DP(0, 10);
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.NumGuests <= 250)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_REDUCE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.NumGuests -= 50;
|
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-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_arg_2_increase(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Year >= 25)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_INCREASE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Year++;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_arg_2_decrease(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Year <= 1)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2020-08-27 00:01:15 +02:00
|
|
|
context_show_error(STR_CANT_REDUCE_FURTHER, STR_NONE, {});
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 22:03:36 +02:00
|
|
|
gScenarioObjective.Year--;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00671A0D
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_OBJECTIVE_DROPDOWN:
|
|
|
|
window_editor_objective_options_show_objective_dropdown(w);
|
|
|
|
break;
|
|
|
|
case WIDX_OBJECTIVE_ARG_1_INCREASE:
|
|
|
|
window_editor_objective_options_arg_1_increase(w);
|
|
|
|
break;
|
|
|
|
case WIDX_OBJECTIVE_ARG_1_DECREASE:
|
|
|
|
window_editor_objective_options_arg_1_decrease(w);
|
|
|
|
break;
|
|
|
|
case WIDX_OBJECTIVE_ARG_2_INCREASE:
|
|
|
|
window_editor_objective_options_arg_2_increase(w);
|
|
|
|
break;
|
|
|
|
case WIDX_OBJECTIVE_ARG_2_DECREASE:
|
|
|
|
window_editor_objective_options_arg_2_decrease(w);
|
|
|
|
break;
|
|
|
|
case WIDX_CATEGORY_DROPDOWN:
|
|
|
|
window_editor_objective_options_show_category_dropdown(w);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00671A54
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_dropdown(rct_window* w, rct_widgetindex widgetIndex, int32_t dropdownIndex)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
uint8_t newObjectiveType;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
if (dropdownIndex == -1)
|
|
|
|
return;
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_OBJECTIVE_DROPDOWN:
|
|
|
|
// TODO: Don't rely on string ID order
|
2020-04-18 13:32:48 +02:00
|
|
|
newObjectiveType = static_cast<uint8_t>(gDropdownItemsArgs[dropdownIndex] - STR_OBJECTIVE_DROPDOWN_NONE);
|
2020-08-12 22:03:36 +02:00
|
|
|
if (gScenarioObjective.Type != newObjectiveType)
|
2018-06-22 23:21:44 +02:00
|
|
|
window_editor_objective_options_set_objective(w, newObjectiveType);
|
|
|
|
break;
|
|
|
|
case WIDX_CATEGORY_DROPDOWN:
|
2021-04-05 19:01:43 +02:00
|
|
|
if (gScenarioCategory != static_cast<uint8_t>(dropdownIndex))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2021-04-05 19:01:43 +02:00
|
|
|
gScenarioCategory = static_cast<SCENARIO_CATEGORY>(dropdownIndex);
|
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-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006721E7
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_update(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
uint32_t parkFlags;
|
|
|
|
uint8_t objectiveType;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
w->frame_no++;
|
|
|
|
window_event_invalidate_call(w);
|
|
|
|
widget_invalidate(w, WIDX_TAB_1);
|
|
|
|
|
|
|
|
parkFlags = gParkFlags;
|
2020-08-12 22:03:36 +02:00
|
|
|
objectiveType = gScenarioObjective.Type;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2020-08-12 22:10:47 +02:00
|
|
|
// Check if objective is allowed by money and pay-per-ride settings.
|
|
|
|
const bool objectiveAllowedByMoneyUsage = !(parkFlags & PARK_FLAGS_NO_MONEY_SCENARIO)
|
|
|
|
|| !ObjectiveNeedsMoney(objectiveType);
|
|
|
|
// This objective can only work if the player can ask money for rides.
|
|
|
|
const bool objectiveAllowedByPaymentSettings = (objectiveType != OBJECTIVE_MONTHLY_RIDE_INCOME)
|
|
|
|
|| park_ride_prices_unlocked();
|
|
|
|
if (!objectiveAllowedByMoneyUsage || !objectiveAllowedByPaymentSettings)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Reset objective
|
|
|
|
window_editor_objective_options_set_objective(w, OBJECTIVE_GUESTS_AND_RATING);
|
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00671A73
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_textinput(rct_window* w, rct_widgetindex widgetIndex, char* text)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2017-08-15 10:07:44 +02:00
|
|
|
if (text == nullptr)
|
2017-06-06 23:24:18 +02:00
|
|
|
return;
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_PARK_NAME:
|
2018-04-10 18:14:32 +02:00
|
|
|
{
|
|
|
|
auto action = ParkSetNameAction(text);
|
|
|
|
GameActions::Execute(&action);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2021-04-05 19:01:43 +02:00
|
|
|
if (gScenarioName.empty())
|
2019-07-21 11:33:15 +02:00
|
|
|
{
|
|
|
|
auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark();
|
2021-04-05 19:01:43 +02:00
|
|
|
gScenarioName = park.Name;
|
2019-07-21 11:33:15 +02:00
|
|
|
}
|
2018-04-10 18:14:32 +02:00
|
|
|
break;
|
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
case WIDX_SCENARIO_NAME:
|
2021-04-05 19:01:43 +02:00
|
|
|
gScenarioName = text;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_DETAILS:
|
2021-04-05 19:01:43 +02:00
|
|
|
gScenarioDetails = text;
|
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-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x0067161C
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_invalidate(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-02-11 19:56:09 +01:00
|
|
|
auto widgets = window_editor_objective_options_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_editor_objective_options_set_pressed_tab(w);
|
|
|
|
|
2020-08-12 22:03:36 +02:00
|
|
|
switch (gScenarioObjective.Type)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
case OBJECTIVE_GUESTS_BY:
|
|
|
|
case OBJECTIVE_PARK_VALUE_BY:
|
2020-11-27 04:14:20 +01:00
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1].type = WindowWidgetType::Spinner;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1_INCREASE].type = WindowWidgetType::Button;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1_DECREASE].type = WindowWidgetType::Button;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2].type = WindowWidgetType::Spinner;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2_INCREASE].type = WindowWidgetType::Button;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2_DECREASE].type = WindowWidgetType::Button;
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_GUESTS_AND_RATING:
|
|
|
|
case OBJECTIVE_MONTHLY_RIDE_INCOME:
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
|
|
|
case OBJECTIVE_FINISH_5_ROLLERCOASTERS:
|
2020-11-19 19:45:40 +01:00
|
|
|
case OBJECTIVE_REPAY_LOAN_AND_PARK_VALUE:
|
2018-06-22 23:21:44 +02:00
|
|
|
case OBJECTIVE_MONTHLY_FOOD_INCOME:
|
2020-11-27 04:14:20 +01:00
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1].type = WindowWidgetType::Spinner;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1_INCREASE].type = WindowWidgetType::Button;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1_DECREASE].type = WindowWidgetType::Button;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2_INCREASE].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2_DECREASE].type = WindowWidgetType::Empty;
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
default:
|
2020-11-27 04:14:20 +01:00
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1_INCREASE].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_1_DECREASE].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2_INCREASE].type = WindowWidgetType::Empty;
|
|
|
|
window_editor_objective_options_main_widgets[WIDX_OBJECTIVE_ARG_2_DECREASE].type = WindowWidgetType::Empty;
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-07-21 11:50:45 +02:00
|
|
|
window_editor_objective_options_main_widgets[WIDX_CLOSE].type = (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
|
2020-11-27 04:14:20 +01:00
|
|
|
? WindowWidgetType::Empty
|
|
|
|
: WindowWidgetType::CloseBox;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
window_editor_objective_options_anchor_border_widgets(w);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x0067161C
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_main_paint(rct_window* w, rct_drawpixelinfo* dpi)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-06-20 05:22:01 +02:00
|
|
|
int32_t width;
|
2017-06-06 23:24:18 +02:00
|
|
|
rct_string_id stringId;
|
|
|
|
|
2020-11-04 05:52:23 +01:00
|
|
|
WindowDrawWidgets(w, dpi);
|
2017-06-06 23:24:18 +02:00
|
|
|
window_editor_objective_options_draw_tab_images(w, dpi);
|
|
|
|
|
|
|
|
// Objective label
|
2020-06-20 05:22:01 +02:00
|
|
|
auto screenCoords = w->windowPos + ScreenCoordsXY{ 8, w->widgets[WIDX_OBJECTIVE].top };
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(dpi, screenCoords, STR_OBJECTIVE_WINDOW);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Objective value
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_OBJECTIVE].left + 1, w->widgets[WIDX_OBJECTIVE].top };
|
2021-07-27 20:32:27 +02:00
|
|
|
auto ft = Formatter();
|
|
|
|
ft.Add<rct_string_id>(ObjectiveDropdownOptionNames[gScenarioObjective.Type]);
|
|
|
|
DrawTextBasic(dpi, screenCoords, STR_WINDOW_COLOUR_2_STRINGID, ft);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2020-11-27 04:14:20 +01:00
|
|
|
if (w->widgets[WIDX_OBJECTIVE_ARG_1].type != WindowWidgetType::Empty)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Objective argument 1 label
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 28, w->widgets[WIDX_OBJECTIVE_ARG_1].top };
|
2020-08-12 22:03:36 +02:00
|
|
|
switch (gScenarioObjective.Type)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
case OBJECTIVE_GUESTS_BY:
|
|
|
|
case OBJECTIVE_GUESTS_AND_RATING:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_GUEST_COUNT;
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_PARK_VALUE_BY:
|
2020-11-19 19:45:40 +01:00
|
|
|
case OBJECTIVE_REPAY_LOAN_AND_PARK_VALUE:
|
2018-06-22 23:21:44 +02:00
|
|
|
stringId = STR_WINDOW_OBJECTIVE_PARK_VALUE;
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_MONTHLY_RIDE_INCOME:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_MONTHLY_INCOME;
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_MONTHLY_FOOD_INCOME:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_MONTHLY_PROFIT;
|
|
|
|
break;
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_MINIMUM_LENGTH;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_EXCITEMENT_RATING;
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(dpi, screenCoords, stringId);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Objective argument 1 value
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos
|
|
|
|
+ ScreenCoordsXY{ w->widgets[WIDX_OBJECTIVE_ARG_1].left + 1, w->widgets[WIDX_OBJECTIVE_ARG_1].top };
|
2021-07-27 20:32:27 +02:00
|
|
|
ft = Formatter();
|
2020-08-12 22:03:36 +02:00
|
|
|
switch (gScenarioObjective.Type)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
case OBJECTIVE_GUESTS_BY:
|
|
|
|
case OBJECTIVE_GUESTS_AND_RATING:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_VALUE_GUEST_COUNT;
|
2021-07-27 20:32:27 +02:00
|
|
|
ft.Add<uint16_t>(gScenarioObjective.NumGuests);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_PARK_VALUE_BY:
|
2020-11-19 19:45:40 +01:00
|
|
|
case OBJECTIVE_REPAY_LOAN_AND_PARK_VALUE:
|
2018-06-22 23:21:44 +02:00
|
|
|
case OBJECTIVE_MONTHLY_RIDE_INCOME:
|
|
|
|
case OBJECTIVE_MONTHLY_FOOD_INCOME:
|
|
|
|
stringId = STR_CURRENCY_FORMAT_LABEL;
|
2021-07-27 20:32:27 +02:00
|
|
|
ft.Add<money64>(gScenarioObjective.Currency);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case OBJECTIVE_10_ROLLERCOASTERS_LENGTH:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_VALUE_LENGTH;
|
2021-07-27 20:32:27 +02:00
|
|
|
ft.Add<uint16_t>(gScenarioObjective.MinimumLength);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
2020-10-28 23:55:29 +01:00
|
|
|
case OBJECTIVE_FINISH_5_ROLLERCOASTERS:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_VALUE_RATING;
|
2021-07-27 20:32:27 +02:00
|
|
|
ft.Add<uint16_t>(gScenarioObjective.MinimumExcitement);
|
2020-10-28 23:55:29 +01:00
|
|
|
break;
|
2018-06-22 23:21:44 +02:00
|
|
|
default:
|
|
|
|
stringId = STR_WINDOW_OBJECTIVE_VALUE_RATING;
|
2021-07-27 20:32:27 +02:00
|
|
|
ft.Add<money64>(gScenarioObjective.Currency);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2021-07-27 20:32:27 +02:00
|
|
|
DrawTextBasic(dpi, screenCoords, stringId, ft, COLOUR_BLACK);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2020-11-27 04:14:20 +01:00
|
|
|
if (w->widgets[WIDX_OBJECTIVE_ARG_2].type != WindowWidgetType::Empty)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Objective argument 2 label
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 28, w->widgets[WIDX_OBJECTIVE_ARG_2].top };
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(dpi, screenCoords, STR_WINDOW_OBJECTIVE_DATE);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Objective argument 2 value
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos
|
|
|
|
+ ScreenCoordsXY{ w->widgets[WIDX_OBJECTIVE_ARG_2].left + 1, w->widgets[WIDX_OBJECTIVE_ARG_2].top };
|
2021-07-27 20:32:27 +02:00
|
|
|
ft = Formatter();
|
|
|
|
ft.Add<uint16_t>((gScenarioObjective.Year * MONTH_COUNT) - 1);
|
|
|
|
DrawTextBasic(dpi, screenCoords, STR_WINDOW_OBJECTIVE_VALUE_DATE, ft);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Park name
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 8, w->widgets[WIDX_PARK_NAME].top };
|
2017-06-06 23:24:18 +02:00
|
|
|
width = w->widgets[WIDX_PARK_NAME].left - 16;
|
|
|
|
|
2019-07-21 11:33:15 +02:00
|
|
|
{
|
|
|
|
auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark();
|
|
|
|
auto parkName = park.Name.c_str();
|
|
|
|
|
2021-07-27 20:32:27 +02:00
|
|
|
ft = Formatter();
|
2020-05-14 02:29:39 +02:00
|
|
|
ft.Add<rct_string_id>(STR_STRING);
|
|
|
|
ft.Add<const char*>(parkName);
|
2021-02-28 00:22:24 +01:00
|
|
|
DrawTextEllipsised(dpi, screenCoords, width, STR_WINDOW_PARK_NAME, ft);
|
2019-07-21 11:33:15 +02:00
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Scenario name
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 8, w->widgets[WIDX_SCENARIO_NAME].top };
|
2017-06-06 23:24:18 +02:00
|
|
|
width = w->widgets[WIDX_SCENARIO_NAME].left - 16;
|
|
|
|
|
2021-07-27 20:32:27 +02:00
|
|
|
ft = Formatter();
|
2020-05-14 02:29:39 +02:00
|
|
|
ft.Add<rct_string_id>(STR_STRING);
|
2021-04-05 19:01:43 +02:00
|
|
|
ft.Add<const char*>(gScenarioName.c_str());
|
2021-02-28 00:22:24 +01:00
|
|
|
DrawTextEllipsised(dpi, screenCoords, width, STR_WINDOW_SCENARIO_NAME, ft);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Scenario details label
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 8, w->widgets[WIDX_DETAILS].top };
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(dpi, screenCoords, STR_WINDOW_PARK_DETAILS);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Scenario details value
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 16, w->widgets[WIDX_DETAILS].top + 10 };
|
2017-06-06 23:24:18 +02:00
|
|
|
width = w->widgets[WIDX_DETAILS].left - 4;
|
|
|
|
|
2020-09-28 02:09:08 +02:00
|
|
|
ft = Formatter();
|
2020-05-14 02:29:39 +02:00
|
|
|
ft.Add<rct_string_id>(STR_STRING);
|
2021-04-05 19:01:43 +02:00
|
|
|
ft.Add<const char*>(gScenarioDetails.c_str());
|
2021-02-27 17:17:17 +01:00
|
|
|
DrawTextWrapped(dpi, screenCoords, width, STR_BLACK_STRING, ft);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Scenario category label
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ 8, w->widgets[WIDX_CATEGORY].top };
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(dpi, screenCoords, STR_WINDOW_SCENARIO_GROUP);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Scenario category value
|
2020-06-20 05:22:01 +02:00
|
|
|
screenCoords = w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_CATEGORY].left + 1, w->widgets[WIDX_CATEGORY].top };
|
2021-07-27 20:32:27 +02:00
|
|
|
ft = Formatter();
|
2021-04-05 19:01:43 +02:00
|
|
|
ft.Add<rct_string_id>(ScenarioCategoryStringIds[gScenarioCategory]);
|
2021-07-27 20:32:27 +02:00
|
|
|
DrawTextBasic(dpi, screenCoords, STR_WINDOW_COLOUR_2_STRINGID, ft);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006724A4
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_rides_mouseup(rct_window* w, rct_widgetindex widgetIndex)
|
2014-12-11 00:07:11 +01: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:
|
|
|
|
window_editor_objective_options_set_page(w, widgetIndex - WIDX_TAB_1);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006725A8
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_rides_resize(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_set_resize(w, 380, 224, 380, 224);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00672544
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_rides_update(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
w->frame_no++;
|
|
|
|
window_event_invalidate_call(w);
|
|
|
|
window_event_resize_call(w);
|
|
|
|
widget_invalidate(w, WIDX_TAB_2);
|
|
|
|
|
2019-08-04 17:00:15 +02:00
|
|
|
auto numItems = 0;
|
|
|
|
for (auto& ride : GetRideManager())
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2019-08-04 17:00:15 +02:00
|
|
|
if (ride.IsRide())
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2021-09-08 16:07:41 +02:00
|
|
|
w->list_item_positions[numItems] = EnumValue(ride.id);
|
2017-06-06 23:24:18 +02:00
|
|
|
numItems++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
if (w->no_list_items != numItems)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
w->no_list_items = numItems;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006724BF
|
|
|
|
*/
|
2018-07-21 11:50:45 +02:00
|
|
|
static void window_editor_objective_options_rides_scrollgetheight(
|
|
|
|
rct_window* w, int32_t scrollIndex, int32_t* width, int32_t* height)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
*height = w->no_list_items * 12;
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006724FC
|
|
|
|
*/
|
2019-11-14 12:40:40 +01:00
|
|
|
static void window_editor_objective_options_rides_scrollmousedown(
|
2020-02-29 03:43:29 +01:00
|
|
|
rct_window* w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2019-11-14 12:40:40 +01:00
|
|
|
auto i = screenCoords.y / 12;
|
2017-06-06 23:24:18 +02:00
|
|
|
if (i < 0 || i >= w->no_list_items)
|
|
|
|
return;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2021-08-02 06:24:52 +02:00
|
|
|
const auto rideId = static_cast<ride_id_t>(w->list_item_positions[i]);
|
|
|
|
auto ride = get_ride(rideId);
|
2019-08-09 09:06:25 +02:00
|
|
|
if (ride != nullptr)
|
|
|
|
{
|
|
|
|
ride->lifecycle_flags ^= RIDE_LIFECYCLE_INDESTRUCTIBLE;
|
|
|
|
}
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006724CC
|
|
|
|
*/
|
2019-11-14 12:40:40 +01:00
|
|
|
static void window_editor_objective_options_rides_scrollmouseover(
|
2020-02-29 03:43:29 +01:00
|
|
|
rct_window* w, int32_t scrollIndex, const ScreenCoordsXY& screenCoords)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t i;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2019-11-14 12:40:40 +01:00
|
|
|
i = screenCoords.y / 12;
|
2017-06-06 23:24:18 +02:00
|
|
|
if (i < 0 || i >= w->no_list_items)
|
|
|
|
return;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
if (w->selected_list_item != i)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
w->selected_list_item = i;
|
2019-06-15 17:20:16 +02:00
|
|
|
w->Invalidate();
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006722B5
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_rides_invalidate(rct_window* w)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_widget* widgets;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
widgets = window_editor_objective_options_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-12-11 00:07:11 +01:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
window_editor_objective_options_set_pressed_tab(w);
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2018-07-21 11:50:45 +02:00
|
|
|
window_editor_objective_options_main_widgets[WIDX_CLOSE].type = (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
|
2020-11-27 04:14:20 +01:00
|
|
|
? WindowWidgetType::Empty
|
|
|
|
: WindowWidgetType::CloseBox;
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
window_editor_objective_options_anchor_border_widgets(w);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00672340
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_rides_paint(rct_window* w, rct_drawpixelinfo* dpi)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2020-11-04 05:52:23 +01:00
|
|
|
WindowDrawWidgets(w, dpi);
|
2017-06-06 23:24:18 +02:00
|
|
|
window_editor_objective_options_draw_tab_images(w, dpi);
|
2014-12-11 00:07:11 +01:00
|
|
|
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(
|
|
|
|
dpi, w->windowPos + ScreenCoordsXY{ 6, w->widgets[WIDX_PAGE_BACKGROUND].top + 3 }, STR_WINDOW_PRESERVATION_ORDER);
|
2014-12-11 00:07:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x0067236F
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_rides_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex)
|
2014-12-11 00:07:11 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t colour = ColourMapA[w->colours[1]].mid_light;
|
2020-07-10 18:59:08 +02:00
|
|
|
gfx_fill_rect(dpi, { { dpi->x, dpi->y }, { dpi->x + dpi->width - 1, dpi->y + dpi->height - 1 } }, colour);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
for (int32_t i = 0; i < w->no_list_items; i++)
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t y = i * 12;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
if (y + 12 < dpi->y || y >= dpi->y + dpi->height)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// Checkbox
|
2021-03-27 04:50:19 +01:00
|
|
|
gfx_fill_rect_inset(dpi, { { 2, y }, { 11, y + 10 } }, w->colours[1], INSET_RECT_F_E0);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Highlighted
|
2019-07-21 15:18:09 +02:00
|
|
|
auto stringId = STR_BLACK_STRING;
|
2018-06-22 23:21:44 +02:00
|
|
|
if (i == w->selected_list_item)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
stringId = STR_WINDOW_COLOUR_2_STRINGID;
|
2021-10-21 00:43:32 +02:00
|
|
|
gfx_filter_rect(dpi, { 0, y, w->width, y + 11 }, FilterPaletteID::PaletteDarken1);
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Checkbox mark
|
2021-08-02 06:24:52 +02:00
|
|
|
const auto rideId = static_cast<ride_id_t>(w->list_item_positions[i]);
|
|
|
|
auto ride = get_ride(rideId);
|
2019-08-09 09:06:25 +02:00
|
|
|
if (ride != nullptr)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2019-08-09 09:06:25 +02:00
|
|
|
if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE)
|
|
|
|
{
|
2021-02-28 00:22:24 +01:00
|
|
|
FontSpriteBase fontSpriteBase = stringId == STR_WINDOW_COLOUR_2_STRINGID ? FontSpriteBase::MEDIUM_EXTRA_DARK
|
|
|
|
: FontSpriteBase::MEDIUM_DARK;
|
2021-02-27 18:35:32 +01:00
|
|
|
gfx_draw_string(
|
|
|
|
dpi, { 2, y }, static_cast<const char*>(CheckBoxMarkString),
|
2021-02-28 00:22:24 +01:00
|
|
|
{ static_cast<colour_t>(w->colours[1] & 0x7F), fontSpriteBase });
|
2019-08-09 09:06:25 +02:00
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2019-08-09 09:06:25 +02:00
|
|
|
// Ride name
|
2020-06-25 02:02:08 +02:00
|
|
|
|
2020-08-26 22:54:12 +02:00
|
|
|
Formatter ft;
|
2020-06-25 02:02:08 +02:00
|
|
|
ride->FormatNameTo(ft);
|
2021-02-27 16:49:13 +01:00
|
|
|
DrawTextBasic(dpi, { 15, y }, stringId, ft);
|
2019-08-09 09:06:25 +02:00
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2015-06-28 02:57:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x00672609
|
|
|
|
*/
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_editor_objective_options_update_disabled_widgets(rct_window* w)
|
2015-06-28 02:57:50 +02:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Check if there are any rides (not shops or facilities)
|
2019-08-03 19:11:30 +02:00
|
|
|
const auto& rideManager = GetRideManager();
|
|
|
|
if (std::any_of(rideManager.begin(), rideManager.end(), [](const Ride& ride) { return ride.IsRide(); }))
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2021-06-26 14:23:15 +02:00
|
|
|
w->disabled_widgets &= ~(1ULL << WIDX_TAB_2);
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-06-26 14:23:15 +02:00
|
|
|
w->disabled_widgets |= (1ULL << WIDX_TAB_2);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2015-07-28 10:13:16 +02:00
|
|
|
}
|