1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-23 06:44:38 +01:00
Files
OpenRCT2/src/openrct2-ui/windows/Cheats.cpp
Hielke Morsink 7f29e4e39c Make rct_windowclass strong type WindowClass
This already revealed some places where implicit conversions were done, including some where its use was nonsense (MouseInput.cpp).
The changes to the Intent class were necessary to keep things working, and this splits things up more neatly.
2022-08-21 18:38:25 +02:00

1113 lines
53 KiB
C++

/*****************************************************************************
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include <algorithm>
#include <iterator>
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Widget.h>
#include <openrct2-ui/windows/Window.h>
#include <openrct2/Context.h>
#include <openrct2/Game.h>
#include <openrct2/OpenRCT2.h>
#include <openrct2/actions/ParkSetDateAction.h>
#include <openrct2/actions/SetCheatAction.h>
#include <openrct2/config/Config.h>
#include <openrct2/localisation/Date.h>
#include <openrct2/localisation/Formatter.h>
#include <openrct2/localisation/Localisation.h>
#include <openrct2/network/network.h>
#include <openrct2/sprites.h>
#include <openrct2/util/Util.h>
#include <openrct2/world/Climate.h>
#include <openrct2/world/Park.h>
#include <openrct2/world/Surface.h>
constexpr auto CHEATS_MONEY_DEFAULT = 10000.00_GBP;
constexpr auto CHEATS_MONEY_INCREMENT_DIV = 5000.00_GBP;
// clang-format off
enum
{
WINDOW_CHEATS_PAGE_MONEY,
WINDOW_CHEATS_PAGE_GUESTS,
WINDOW_CHEATS_PAGE_MISC,
WINDOW_CHEATS_PAGE_RIDES,
WINDOW_CHEATS_PAGE_COUNT,
};
static StringId _staffSpeedNames[] =
{
STR_FROZEN,
STR_NORMAL,
STR_FAST,
};
static constexpr const StringId WeatherTypes[] =
{
STR_SUNNY,
STR_PARTIALLY_CLOUDY,
STR_CLOUDY,
STR_RAIN,
STR_HEAVY_RAIN,
STR_THUNDERSTORM,
STR_SNOW,
STR_HEAVY_SNOW,
STR_BLIZZARD,
};
enum WindowCheatsWidgetIdx
{
WIDX_BACKGROUND,
WIDX_TITLE,
WIDX_CLOSE,
WIDX_PAGE_BACKGROUND,
WIDX_TAB_1,
WIDX_TAB_2,
WIDX_TAB_3,
WIDX_TAB_4,
WIDX_TAB_CONTENT,
WIDX_NO_MONEY = WIDX_TAB_CONTENT,
WIDX_ADD_SET_MONEY_GROUP,
WIDX_MONEY_SPINNER,
WIDX_MONEY_SPINNER_INCREMENT,
WIDX_MONEY_SPINNER_DECREMENT,
WIDX_ADD_MONEY,
WIDX_SET_MONEY,
WIDX_CLEAR_LOAN,
WIDX_DATE_GROUP,
WIDX_YEAR_BOX,
WIDX_YEAR_UP,
WIDX_YEAR_DOWN,
WIDX_MONTH_BOX,
WIDX_MONTH_UP,
WIDX_MONTH_DOWN,
WIDX_DAY_BOX,
WIDX_DAY_UP,
WIDX_DAY_DOWN,
WIDX_DATE_SET,
WIDX_DATE_RESET,
WIDX_GUEST_PARAMETERS_GROUP = WIDX_TAB_CONTENT,
WIDX_GUEST_HAPPINESS_MAX,
WIDX_GUEST_HAPPINESS_MIN,
WIDX_GUEST_ENERGY_MAX,
WIDX_GUEST_ENERGY_MIN,
WIDX_GUEST_HUNGER_MAX,
WIDX_GUEST_HUNGER_MIN,
WIDX_GUEST_THIRST_MAX,
WIDX_GUEST_THIRST_MIN,
WIDX_GUEST_NAUSEA_MAX,
WIDX_GUEST_NAUSEA_MIN,
WIDX_GUEST_NAUSEA_TOLERANCE_MAX,
WIDX_GUEST_NAUSEA_TOLERANCE_MIN,
WIDX_GUEST_TOILET_MAX,
WIDX_GUEST_TOILET_MIN,
WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1,
WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15,
WIDX_GUEST_IGNORE_RIDE_INTENSITY,
WIDX_DISABLE_VANDALISM,
WIDX_DISABLE_LITTERING,
WIDX_GIVE_ALL_GUESTS_GROUP,
WIDX_GIVE_GUESTS_MONEY,
WIDX_GIVE_GUESTS_PARK_MAPS,
WIDX_GIVE_GUESTS_BALLOONS,
WIDX_GIVE_GUESTS_UMBRELLAS,
WIDX_TRAM_GUESTS,
WIDX_REMOVE_ALL_GUESTS,
WIDX_GENERAL_GROUP = WIDX_TAB_CONTENT,
WIDX_OPEN_CLOSE_PARK,
WIDX_CREATE_DUCKS,
WIDX_OWN_ALL_LAND,
WIDX_REMOVE_DUCKS,
WIDX_OBJECTIVE_GROUP,
WIDX_NEVERENDING_MARKETING,
WIDX_FORCE_PARK_RATING,
WIDX_PARK_RATING_SPINNER,
WIDX_INCREASE_PARK_RATING,
WIDX_DECREASE_PARK_RATING,
WIDX_WIN_SCENARIO,
WIDX_HAVE_FUN,
WIDX_WEATHER_GROUP,
WIDX_WEATHER,
WIDX_WEATHER_DROPDOWN_BUTTON,
WIDX_FREEZE_WEATHER,
WIDX_MAINTENANCE_GROUP,
WIDX_REMOVE_LITTER,
WIDX_FIX_VANDALISM,
WIDX_CLEAR_GRASS,
WIDX_MOWED_GRASS,
WIDX_WATER_PLANTS,
WIDX_DISABLE_PLANT_AGING,
WIDX_STAFF_GROUP,
WIDX_STAFF_SPEED,
WIDX_STAFF_SPEED_DROPDOWN_BUTTON,
WIDX_FIX_ALL = WIDX_TAB_CONTENT,
WIDX_RENEW_RIDES,
WIDX_MAKE_DESTRUCTIBLE,
WIDX_RESET_CRASH_STATUS,
WIDX_10_MINUTE_INSPECTIONS,
WIDX_CONSTRUCTION_GROUP,
WIDX_BUILD_IN_PAUSE_MODE,
WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES,
WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK,
WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS,
WIDX_OPERATION_MODES_GROUP,
WIDX_SHOW_ALL_OPERATING_MODES,
WIDX_UNLOCK_OPERATING_LIMITS,
WIDX_DISABLE_BRAKES_FAILURE,
WIDX_DISABLE_ALL_BREAKDOWNS,
WIDX_DISABLE_RIDE_VALUE_AGING,
WIDX_TRACK_PIECES_GROUP,
WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES,
WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES,
WIDX_DISABLE_TRAIN_LENGTH_LIMITS,
WIDX_IGNORE_RESEARCH_STATUS,
};
#pragma region MEASUREMENTS
static constexpr const StringId WINDOW_TITLE = STR_CHEAT_TITLE;
static constexpr const int32_t WW = 249;
static constexpr const int32_t WH = 300;
static constexpr ScreenSize CHEAT_BUTTON = {110, 17};
static constexpr ScreenSize CHEAT_CHECK = {221, 12};
static constexpr ScreenSize CHEAT_SPINNER = {117, 14};
static constexpr ScreenSize MINMAX_BUTTON = {55, 17};
static constexpr const int32_t TAB_WIDTH = 31;
static constexpr const int32_t TAB_START = 3;
#pragma endregion
#define MAIN_CHEATS_WIDGETS \
WINDOW_SHIM(WINDOW_TITLE, WW, WH), \
MakeWidget({ 0, 43}, {WW, 257}, WindowWidgetType::Resize, WindowColour::Secondary), /* tab content panel */ \
MakeTab ({ 3, 17}, STR_FINANCIAL_CHEATS_TIP ), /* tab 1 */ \
MakeTab ({34, 17}, STR_GUEST_CHEATS_TIP ), /* tab 2 */ \
MakeTab ({65, 17}, STR_PARK_CHEATS_TIP ), /* tab 3 */ \
MakeTab ({96, 17}, STR_RIDE_CHEATS_TIP ) /* tab 4 */
static rct_widget window_cheats_money_widgets[] =
{
MAIN_CHEATS_WIDGETS,
MakeWidget ({ 11, 48}, CHEAT_BUTTON, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAKE_PARK_NO_MONEY), // No money
MakeWidget ({ 5, 69}, {238, 69}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_ADD_SET_MONEY ), // add / set money group frame
MakeSpinnerWidgets({ 11, 92}, CHEAT_SPINNER, WindowWidgetType::Spinner, WindowColour::Secondary ), // money value
MakeWidget ({ 11, 111}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_ADD_MONEY ), // add money
MakeWidget ({127, 111}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_SET_MONEY ), // set money
MakeWidget ({ 11, 153}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_CLEAR_LOAN ), // Clear loan
MakeWidget ({ 5, 184}, {238, 101}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_DATE_SET ), // Date group
MakeSpinnerWidgets({120, 197}, CHEAT_SPINNER, WindowWidgetType::Spinner, WindowColour::Secondary ), // Year box
MakeSpinnerWidgets({120, 218}, CHEAT_SPINNER, WindowWidgetType::Spinner, WindowColour::Secondary ), // Month box
MakeSpinnerWidgets({120, 239}, CHEAT_SPINNER, WindowWidgetType::Spinner, WindowColour::Secondary ), // Day box
MakeWidget ({ 11, 258}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_DATE_SET ), // Set Date
MakeWidget ({127, 258}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_DATE_RESET ), // Reset Date
WIDGETS_END,
};
static rct_widget window_cheats_guests_widgets[] =
{
MAIN_CHEATS_WIDGETS,
MakeWidget({ 5, 48}, {238, 279}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_SET_GUESTS_PARAMETERS ), // Guests parameters group frame
MakeWidget({183, 69}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // happiness max
MakeWidget({127, 69}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // happiness min
MakeWidget({183, 90}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // energy max
MakeWidget({127, 90}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // energy min
MakeWidget({183, 111}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // hunger max
MakeWidget({127, 111}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // hunger min
MakeWidget({183, 132}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // thirst max
MakeWidget({127, 132}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // thirst min
MakeWidget({183, 153}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // nausea max
MakeWidget({127, 153}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // nausea min
MakeWidget({183, 174}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // nausea tolerance max
MakeWidget({127, 174}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // nausea tolerance min
MakeWidget({183, 195}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MAX ), // toilet max
MakeWidget({127, 195}, MINMAX_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_MIN ), // toilet min
MakeWidget({127, 237}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_MORE_THAN_1 ), // ride intensity > 1
MakeWidget({ 11, 237}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_LESS_THAN_15 ), // ride intensity < 15
MakeWidget({ 11, 258}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_IGNORE_INTENSITY, STR_CHEAT_IGNORE_INTENSITY_TIP ), // guests ignore intensity
MakeWidget({ 11, 279}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_VANDALISM, STR_CHEAT_DISABLE_VANDALISM_TIP), // disable vandalism
MakeWidget({ 11, 300}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_LITTERING, STR_CHEAT_DISABLE_LITTERING_TIP), // disable littering
MakeWidget({ 5, 342}, {238, 69}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GIVE_ALL_GUESTS ), // Guests parameters group frame
MakeWidget({ 11, 363}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CURRENCY_FORMAT ), // give guests money
MakeWidget({127, 363}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_SHOP_ITEM_PLURAL_PARK_MAP ), // give guests park maps
MakeWidget({ 11, 384}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_SHOP_ITEM_PLURAL_BALLOON ), // give guests balloons
MakeWidget({127, 384}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_SHOP_ITEM_PLURAL_UMBRELLA ), // give guests umbrellas
MakeWidget({ 11, 426}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_LARGE_TRAM_GUESTS_TIP), // large tram
MakeWidget({127, 426}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_REMOVE_ALL_GUESTS_TIP), // remove all guests
WIDGETS_END,
};
//Strings for following moved to window_cheats_paint()
static rct_widget window_cheats_misc_widgets[] =
{
MAIN_CHEATS_WIDGETS,
MakeWidget ({ 5, 48}, {238, 60}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GENERAL_GROUP ), // General group
MakeWidget ({ 11, 62}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_OPEN_PARK, STR_CHEAT_OPEN_PARK_TIP ), // open / close park
MakeWidget ({ 11, 83}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CREATE_DUCKS, STR_CREATE_DUCKS_TIP ), // Create ducks
MakeWidget ({127, 62}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_OWN_ALL_LAND, STR_CHEAT_OWN_ALL_LAND_TIP ), // Own all land
MakeWidget ({127, 83}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_REMOVE_DUCKS, STR_REMOVE_DUCKS_TIP ), // Remove ducks
MakeWidget ({ 5, 112}, {238, 75}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_OBJECTIVE_GROUP ), // Objective group
MakeWidget ({ 11, 127}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_NEVERENDING_MARKETING, STR_CHEAT_NEVERENDING_MARKETING_TIP), // never ending marketing campaigns
MakeWidget ({ 11, 144}, {281, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_FORCE_PARK_RATING ), // Force park rating
MakeSpinnerWidgets({156, 142}, { 81, 14}, WindowWidgetType::Spinner, WindowColour::Secondary ), // park rating (3 widgets)
MakeWidget ({ 11, 162}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_WIN_SCENARIO ), // Win scenario
MakeWidget ({127, 162}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_HAVE_FUN ), // Have fun!
MakeWidget ({ 5, 190}, {238, 50}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_WEATHER_GROUP ), // Weather group
MakeWidget ({126, 204}, {111, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_NONE, STR_CHANGE_WEATHER_TOOLTIP ), // Force weather
MakeWidget ({225, 205}, { 11, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH, STR_CHANGE_WEATHER_TOOLTIP ), // Force weather
MakeWidget ({ 11, 222}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_FREEZE_WEATHER, STR_CHEAT_FREEZE_WEATHER_TIP ), // Freeze weather
MakeWidget ({ 5, 244}, {238, 99}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_MAINTENANCE_GROUP ), // Maintenance group
MakeWidget ({ 11, 259}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_REMOVE_LITTER ), // Remove litter
MakeWidget ({127, 259}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_FIX_VANDALISM ), // Fix vandalism
MakeWidget ({ 11, 280}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_CLEAR_GRASS ), // Clear grass
MakeWidget ({127, 280}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_MOWED_GRASS ), // Mowed grass
MakeWidget ({ 11, 301}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_WATER_PLANTS ), // Water plants
MakeWidget ({ 11, 322}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_PLANT_AGING, STR_CHEAT_DISABLE_PLANT_AGING_TIP ), // Disable plant ageing
MakeWidget ({ 5, 347}, {238, 35}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_STAFF_GROUP ), // Staff group
MakeWidget ({126, 361}, {111, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary ), // Staff speed
MakeWidget ({225, 362}, { 11, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH ), // Staff speed
WIDGETS_END,
};
static rct_widget window_cheats_rides_widgets[] =
{
MAIN_CHEATS_WIDGETS,
MakeWidget({ 11, 48}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_FIX_ALL_RIDES, STR_CHEAT_FIX_ALL_RIDES_TIP ), // Fix all rides
MakeWidget({127, 48}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_RENEW_RIDES, STR_CHEAT_RENEW_RIDES_TIP ), // Renew rides
MakeWidget({ 11, 69}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_MAKE_DESTRUCTABLE, STR_CHEAT_MAKE_DESTRUCTABLE_TIP ), // All destructible
MakeWidget({127, 69}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_RESET_CRASH_STATUS, STR_CHEAT_RESET_CRASH_STATUS_TIP ), // Reset crash status
MakeWidget({ 11, 90}, CHEAT_BUTTON, WindowWidgetType::Button, WindowColour::Secondary, STR_CHEAT_10_MINUTE_INSPECTIONS, STR_CHEAT_10_MINUTE_INSPECTIONS_TIP ), // 10 minute inspections
MakeWidget({ 5, 116}, {238, 101}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_CONSTRUCTION ), // Construction group
MakeWidget({ 11, 132}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_CHEAT_BUILD_IN_PAUSE_MODE_TIP ), // Build in pause mode
MakeWidget({ 11, 153}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES, STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES_TIP ), // Show all drawable track pieces
MakeWidget({ 11, 174}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK_TIP ), // Enable chain lift on all track
MakeWidget({ 11, 195}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS_TIP), // Allow track place at invalid heights
MakeWidget({ 5, 221}, {238, 122}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_OPERATION ), // Construction group
MakeWidget({ 11, 237}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_SHOW_ALL_OPERATING_MODES ), // Show all operating modes
MakeWidget({ 11, 258}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_UNLOCK_OPERATING_LIMITS, STR_CHEAT_UNLOCK_OPERATING_LIMITS_TIP ), // 410 km/h lift hill etc.
MakeWidget({ 11, 279}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_BRAKES_FAILURE, STR_CHEAT_DISABLE_BRAKES_FAILURE_TIP ), // Disable brakes failure
MakeWidget({ 11, 300}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_BREAKDOWNS, STR_CHEAT_DISABLE_BREAKDOWNS_TIP ), // Disable all breakdowns
MakeWidget({ 11, 321}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_RIDE_VALUE_AGING, STR_CHEAT_DISABLE_RIDE_VALUE_AGING_TIP ), // Disable ride ageing
MakeWidget({ 5, 347}, {238, 101}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_AVAILABILITY ), // Construction group
MakeWidget({ 11, 363}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP), // Allow arbitrary ride type changes
MakeWidget({ 11, 384}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES ), // Show vehicles from other track types
MakeWidget({ 11, 405}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP ), // Disable train length limits
MakeWidget({ 11, 426}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_IGNORE_RESEARCH_STATUS, STR_CHEAT_IGNORE_RESEARCH_STATUS_TIP ), // Ignore Research Status
WIDGETS_END,
};
static rct_widget *window_cheats_page_widgets[] =
{
window_cheats_money_widgets,
window_cheats_guests_widgets,
window_cheats_misc_widgets,
window_cheats_rides_widgets,
};
static uint64_t window_cheats_page_hold_down_widgets[] = {
(1ULL << WIDX_MONEY_SPINNER_INCREMENT) |
(1ULL << WIDX_MONEY_SPINNER_DECREMENT) |
(1ULL << WIDX_ADD_MONEY) |
(1ULL << WIDX_YEAR_UP) |
(1ULL << WIDX_YEAR_DOWN) |
(1ULL << WIDX_MONTH_UP) |
(1ULL << WIDX_MONTH_DOWN) |
(1ULL << WIDX_DAY_UP) |
(1ULL << WIDX_DAY_DOWN),
0,
(1ULL << WIDX_INCREASE_PARK_RATING) |
(1ULL << WIDX_DECREASE_PARK_RATING),
0,
};
static StringId window_cheats_page_titles[] = {
STR_CHEAT_TITLE_FINANCIAL,
STR_CHEAT_TITLE_GUEST,
STR_CHEAT_TITLE_PARK,
STR_CHEAT_TITLE_RIDE,
};
// clang-format on
class CheatsWindow final : public Window
{
private:
char _moneySpinnerText[MONEY_STRING_MAXLENGTH]{};
money32 _moneySpinnerValue = CHEATS_MONEY_DEFAULT;
int32_t _selectedStaffSpeed = 1;
int32_t _parkRatingSpinnerValue{};
int32_t _yearSpinnerValue = 1;
int32_t _monthSpinnerValue = 1;
int32_t _daySpinnerValue = 1;
public:
void OnOpen() override
{
SetPage(WINDOW_CHEATS_PAGE_MONEY);
_parkRatingSpinnerValue = get_forced_park_rating() >= 0 ? get_forced_park_rating() : 999;
}
void OnUpdate() override
{
frame_no++;
InvalidateWidget(WIDX_TAB_1 + page);
}
void OnMouseDown(rct_widgetindex widgetIndex) override
{
switch (page)
{
case WINDOW_CHEATS_PAGE_MONEY:
OnMouseDownMoney(widgetIndex);
break;
case WINDOW_CHEATS_PAGE_MISC:
OnMouseDownMisc(widgetIndex);
break;
}
}
void OnMouseUp(rct_widgetindex widgetIndex) override
{
switch (widgetIndex)
{
case WIDX_CLOSE:
Close();
break;
case WIDX_TAB_1:
case WIDX_TAB_2:
case WIDX_TAB_3:
case WIDX_TAB_4:
SetPage(widgetIndex - WIDX_TAB_1);
break;
default:
switch (page)
{
case WINDOW_CHEATS_PAGE_MONEY:
OnMouseUpMoney(widgetIndex);
break;
case WINDOW_CHEATS_PAGE_GUESTS:
OnMouseUpGuests(widgetIndex);
break;
case WINDOW_CHEATS_PAGE_MISC:
OnMouseUpMisc(widgetIndex);
break;
case WINDOW_CHEATS_PAGE_RIDES:
OnMouseUpRides(widgetIndex);
break;
}
break;
}
}
void OnDropdown(rct_widgetindex widgetIndex, int32_t selectedIndex) override
{
if (page == WINDOW_CHEATS_PAGE_MISC)
{
OnDropdownMisc(widgetIndex, selectedIndex);
}
}
void OnPrepareDraw() override
{
auto* targetWidgets = window_cheats_page_widgets[page];
if (widgets != targetWidgets)
{
widgets = targetWidgets;
WindowInitScrollWidgets(*this);
}
pressed_widgets = 0;
disabled_widgets = 0;
// Set correct active tab
for (auto i = 0; i < WINDOW_CHEATS_PAGE_COUNT; i++)
SetWidgetPressed(WIDX_TAB_1 + i, false);
SetWidgetPressed(WIDX_TAB_1 + page, true);
// Set title
widgets[WIDX_TITLE].text = window_cheats_page_titles[page];
switch (page)
{
case WINDOW_CHEATS_PAGE_MONEY:
{
auto moneyDisabled = (gParkFlags & PARK_FLAGS_NO_MONEY) != 0;
SetCheckboxValue(WIDX_NO_MONEY, moneyDisabled);
SetWidgetDisabled(WIDX_ADD_SET_MONEY_GROUP, moneyDisabled);
SetWidgetDisabled(WIDX_MONEY_SPINNER, moneyDisabled);
SetWidgetDisabled(WIDX_MONEY_SPINNER_INCREMENT, moneyDisabled);
SetWidgetDisabled(WIDX_MONEY_SPINNER_DECREMENT, moneyDisabled);
SetWidgetDisabled(WIDX_ADD_MONEY, moneyDisabled);
SetWidgetDisabled(WIDX_SET_MONEY, moneyDisabled);
SetWidgetDisabled(WIDX_CLEAR_LOAN, moneyDisabled);
break;
}
case WINDOW_CHEATS_PAGE_GUESTS:
{
auto ft = Formatter::Common();
ft.Add<money64>(1000.00_GBP);
SetCheckboxValue(WIDX_GUEST_IGNORE_RIDE_INTENSITY, gCheatsIgnoreRideIntensity);
SetCheckboxValue(WIDX_DISABLE_VANDALISM, gCheatsDisableVandalism);
SetCheckboxValue(WIDX_DISABLE_LITTERING, gCheatsDisableLittering);
break;
}
case WINDOW_CHEATS_PAGE_MISC:
widgets[WIDX_OPEN_CLOSE_PARK].text = (gParkFlags & PARK_FLAGS_PARK_OPEN) ? STR_CHEAT_CLOSE_PARK
: STR_CHEAT_OPEN_PARK;
SetCheckboxValue(WIDX_FORCE_PARK_RATING, get_forced_park_rating() >= 0);
SetCheckboxValue(WIDX_FREEZE_WEATHER, gCheatsFreezeWeather);
SetCheckboxValue(WIDX_NEVERENDING_MARKETING, gCheatsNeverendingMarketing);
SetCheckboxValue(WIDX_DISABLE_PLANT_AGING, gCheatsDisablePlantAging);
break;
case WINDOW_CHEATS_PAGE_RIDES:
SetCheckboxValue(WIDX_UNLOCK_OPERATING_LIMITS, gCheatsUnlockOperatingLimits);
SetCheckboxValue(WIDX_DISABLE_BRAKES_FAILURE, gCheatsDisableBrakesFailure);
SetCheckboxValue(WIDX_DISABLE_ALL_BREAKDOWNS, gCheatsDisableAllBreakdowns);
SetCheckboxValue(WIDX_BUILD_IN_PAUSE_MODE, gCheatsBuildInPauseMode);
SetCheckboxValue(WIDX_SHOW_ALL_OPERATING_MODES, gCheatsShowAllOperatingModes);
SetCheckboxValue(WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, gCheatsShowVehiclesFromOtherTrackTypes);
SetCheckboxValue(WIDX_DISABLE_TRAIN_LENGTH_LIMITS, gCheatsDisableTrainLengthLimit);
SetCheckboxValue(WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, gCheatsEnableChainLiftOnAllTrack);
SetCheckboxValue(WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES, gCheatsAllowArbitraryRideTypeChanges);
SetCheckboxValue(WIDX_DISABLE_RIDE_VALUE_AGING, gCheatsDisableRideValueAging);
SetCheckboxValue(WIDX_IGNORE_RESEARCH_STATUS, gCheatsIgnoreResearchStatus);
SetCheckboxValue(WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES, gCheatsEnableAllDrawableTrackPieces);
SetCheckboxValue(WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, gCheatsAllowTrackPlaceInvalidHeights);
break;
}
// Current weather
window_cheats_misc_widgets[WIDX_WEATHER].text = WeatherTypes[EnumValue(gClimateCurrent.Weather)];
// Staff speed
window_cheats_misc_widgets[WIDX_STAFF_SPEED].text = _staffSpeedNames[_selectedStaffSpeed];
if (gScreenFlags & SCREEN_FLAGS_EDITOR)
{
SetWidgetDisabled(WIDX_TAB_2, true);
SetWidgetDisabled(WIDX_TAB_3, true);
SetWidgetDisabled(WIDX_NO_MONEY, true);
}
}
void OnDraw(rct_drawpixelinfo& dpi) override
{
UpdateTabPositions();
DrawWidgets(dpi);
DrawTabImages(dpi);
static constexpr int16_t _xLcol = 14;
static constexpr int16_t _xRcol = 208;
if (page == WINDOW_CHEATS_PAGE_MONEY)
{
auto colour = colours[1];
auto ft = Formatter();
ft.Add<money64>(_moneySpinnerValue);
if (IsWidgetDisabled(WIDX_MONEY_SPINNER))
{
colour |= COLOUR_FLAG_INSET;
}
int32_t actual_month = _monthSpinnerValue - 1;
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 93 }, STR_BOTTOM_TOOLBAR_CASH, ft, { colour });
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 198 }, STR_YEAR);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 219 }, STR_MONTH);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 240 }, STR_DAY);
ft = Formatter();
ft.Add<int32_t>(_yearSpinnerValue);
DrawTextBasic(
&dpi, windowPos + ScreenCoordsXY{ _xRcol, 198 }, STR_FORMAT_INTEGER, ft, { colours[1], TextAlignment::RIGHT });
ft = Formatter();
ft.Add<int32_t>(actual_month);
DrawTextBasic(
&dpi, windowPos + ScreenCoordsXY{ _xRcol, 219 }, STR_FORMAT_MONTH, ft, { colours[1], TextAlignment::RIGHT });
ft = Formatter();
ft.Add<int32_t>(_daySpinnerValue);
DrawTextBasic(
&dpi, windowPos + ScreenCoordsXY{ _xRcol, 240 }, STR_FORMAT_INTEGER, ft, { colours[1], TextAlignment::RIGHT });
}
else if (page == WINDOW_CHEATS_PAGE_MISC)
{
{
auto& widget = widgets[WIDX_WEATHER];
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol - 3, widget.top + 1 }, STR_CHANGE_WEATHER);
}
{
auto ft = Formatter();
ft.Add<int32_t>(_parkRatingSpinnerValue);
auto& widget = widgets[WIDX_PARK_RATING_SPINNER];
DrawTextBasic(
&dpi, windowPos + ScreenCoordsXY{ widget.left + 1, widget.top + 2 }, STR_FORMAT_INTEGER, ft,
{ colours[1] });
}
{
auto& widget = widgets[WIDX_STAFF_SPEED];
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol - 3, widget.top + 1 }, STR_CHEAT_STAFF_SPEED);
}
}
else if (page == WINDOW_CHEATS_PAGE_GUESTS)
{
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 72 }, STR_CHEAT_GUEST_HAPPINESS);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 93 }, STR_CHEAT_GUEST_ENERGY);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 114 }, STR_CHEAT_GUEST_HUNGER);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 135 }, STR_CHEAT_GUEST_THIRST);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 156 }, STR_CHEAT_GUEST_NAUSEA);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 177 }, STR_CHEAT_GUEST_NAUSEA_TOLERANCE);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 198 }, STR_CHEAT_GUEST_TOILET);
DrawTextBasic(&dpi, windowPos + ScreenCoordsXY{ _xLcol, 219 }, STR_CHEAT_GUEST_PREFERRED_INTENSITY);
}
}
void OnTextInput(rct_widgetindex widgetIndex, std::string_view text) override
{
if (page == WINDOW_CHEATS_PAGE_MONEY && widgetIndex == WIDX_MONEY_SPINNER)
{
auto val = string_to_money(std::string(text).c_str());
if (val != MONEY32_UNDEFINED)
{
_moneySpinnerValue = val;
}
Invalidate();
}
}
OpenRCT2String OnTooltip(rct_widgetindex widgetIndex, StringId fallback) override
{
if (page == WINDOW_CHEATS_PAGE_RIDES && widgetIndex == WIDX_UNLOCK_OPERATING_LIMITS)
{
auto ft = Formatter{};
ft.Add<uint16_t>(255);
return { fallback, ft };
}
return { fallback, {} };
}
private:
void SetPage(int32_t p)
{
page = p;
frame_no = 0;
hold_down_widgets = window_cheats_page_hold_down_widgets[p];
pressed_widgets = 0;
widgets = window_cheats_page_widgets[p];
auto maxY = 0;
auto* widget = &widgets[WIDX_TAB_CONTENT];
while (widget->type != WindowWidgetType::Last)
{
maxY = std::max<int32_t>(maxY, widget->bottom);
widget++;
}
maxY += 6;
Invalidate();
height = maxY;
widgets[WIDX_BACKGROUND].bottom = maxY - 1;
widgets[WIDX_PAGE_BACKGROUND].bottom = maxY - 1;
Invalidate();
}
void UpdateTabPositions()
{
constexpr const uint16_t tabs[] = {
WIDX_TAB_1,
WIDX_TAB_2,
WIDX_TAB_3,
WIDX_TAB_4,
};
auto left = TAB_START;
for (auto tab : tabs)
{
widgets[tab].left = left;
if (!IsWidgetDisabled(tab))
{
left += TAB_WIDTH;
}
}
}
void DrawTabImages(rct_drawpixelinfo& dpi)
{
// Money tab
if (!IsWidgetDisabled(WIDX_TAB_1))
{
uint32_t sprite_idx = SPR_TAB_FINANCES_SUMMARY_0;
if (page == WINDOW_CHEATS_PAGE_MONEY)
sprite_idx += (frame_no / 2) % 8;
gfx_draw_sprite(
&dpi, ImageId(sprite_idx), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_1].left, widgets[WIDX_TAB_1].top });
}
// Guests tab
if (!IsWidgetDisabled(WIDX_TAB_2))
{
uint32_t sprite_idx = SPR_TAB_GUESTS_0;
if (page == WINDOW_CHEATS_PAGE_GUESTS)
sprite_idx += (frame_no / 3) % 8;
gfx_draw_sprite(
&dpi, ImageId(sprite_idx), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_2].left, widgets[WIDX_TAB_2].top });
}
// Misc tab
if (!IsWidgetDisabled(WIDX_TAB_3))
{
gfx_draw_sprite(
&dpi, ImageId(SPR_TAB_PARK), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_3].left, widgets[WIDX_TAB_3].top });
}
// Rides tab
if (!IsWidgetDisabled(WIDX_TAB_4))
{
uint32_t sprite_idx = SPR_TAB_RIDE_0;
if (page == WINDOW_CHEATS_PAGE_RIDES)
sprite_idx += (frame_no / 4) % 16;
gfx_draw_sprite(
&dpi, ImageId(sprite_idx), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_4].left, widgets[WIDX_TAB_4].top });
}
}
void OnMouseDownMoney(rct_widgetindex widgetIndex)
{
switch (widgetIndex)
{
case WIDX_MONEY_SPINNER_INCREMENT:
_moneySpinnerValue = add_clamp_money32(
CHEATS_MONEY_INCREMENT_DIV * (_moneySpinnerValue / CHEATS_MONEY_INCREMENT_DIV), CHEATS_MONEY_INCREMENT_DIV);
InvalidateWidget(WIDX_MONEY_SPINNER);
break;
case WIDX_MONEY_SPINNER_DECREMENT:
_moneySpinnerValue = add_clamp_money32(
CHEATS_MONEY_INCREMENT_DIV * (_moneySpinnerValue / CHEATS_MONEY_INCREMENT_DIV),
-CHEATS_MONEY_INCREMENT_DIV);
InvalidateWidget(WIDX_MONEY_SPINNER);
break;
case WIDX_ADD_MONEY:
CheatsSet(CheatType::AddMoney, _moneySpinnerValue);
break;
case WIDX_YEAR_UP:
_yearSpinnerValue++;
_yearSpinnerValue = std::clamp(_yearSpinnerValue, 1, MAX_YEAR);
InvalidateWidget(WIDX_YEAR_BOX);
break;
case WIDX_YEAR_DOWN:
_yearSpinnerValue--;
_yearSpinnerValue = std::clamp(_yearSpinnerValue, 1, MAX_YEAR);
InvalidateWidget(WIDX_YEAR_BOX);
break;
case WIDX_MONTH_UP:
_monthSpinnerValue++;
_monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast<int32_t>(MONTH_COUNT));
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
InvalidateWidget(WIDX_MONTH_BOX);
InvalidateWidget(WIDX_DAY_BOX);
break;
case WIDX_MONTH_DOWN:
_monthSpinnerValue--;
_monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast<int32_t>(MONTH_COUNT));
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
InvalidateWidget(WIDX_MONTH_BOX);
InvalidateWidget(WIDX_DAY_BOX);
break;
case WIDX_DAY_UP:
_daySpinnerValue++;
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
InvalidateWidget(WIDX_DAY_BOX);
break;
case WIDX_DAY_DOWN:
_daySpinnerValue--;
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
InvalidateWidget(WIDX_DAY_BOX);
break;
case WIDX_DATE_SET:
{
auto setDateAction = ParkSetDateAction(_yearSpinnerValue, _monthSpinnerValue, _daySpinnerValue);
GameActions::Execute(&setDateAction);
window_invalidate_by_class(WindowClass::BottomToolbar);
break;
}
case WIDX_DATE_RESET:
{
auto setDateAction = ParkSetDateAction(1, 1, 1);
GameActions::Execute(&setDateAction);
window_invalidate_by_class(WindowClass::BottomToolbar);
InvalidateWidget(WIDX_YEAR_BOX);
InvalidateWidget(WIDX_MONTH_BOX);
InvalidateWidget(WIDX_DAY_BOX);
break;
}
}
}
void OnMouseUpMoney(rct_widgetindex widgetIndex)
{
switch (widgetIndex)
{
case WIDX_NO_MONEY:
CheatsSet(CheatType::NoMoney, gParkFlags & PARK_FLAGS_NO_MONEY ? 0 : 1);
break;
case WIDX_MONEY_SPINNER:
money_to_string(_moneySpinnerValue, _moneySpinnerText, MONEY_STRING_MAXLENGTH, false);
WindowTextInputRawOpen(
this, WIDX_MONEY_SPINNER, STR_ENTER_NEW_VALUE, STR_ENTER_NEW_VALUE, {}, _moneySpinnerText,
MONEY_STRING_MAXLENGTH);
break;
case WIDX_SET_MONEY:
CheatsSet(CheatType::SetMoney, _moneySpinnerValue);
break;
case WIDX_CLEAR_LOAN:
CheatsSet(CheatType::ClearLoan, CHEATS_MONEY_DEFAULT);
break;
}
}
void OnMouseDownMisc(rct_widgetindex widgetIndex)
{
auto* widget = &widgets[widgetIndex];
switch (widgetIndex)
{
case WIDX_INCREASE_PARK_RATING:
_parkRatingSpinnerValue = std::min(999, 10 * (_parkRatingSpinnerValue / 10 + 1));
InvalidateWidget(WIDX_PARK_RATING_SPINNER);
if (get_forced_park_rating() >= 0)
{
auto setCheatAction = SetCheatAction(CheatType::SetForcedParkRating, _parkRatingSpinnerValue);
GameActions::Execute(&setCheatAction);
}
break;
case WIDX_DECREASE_PARK_RATING:
_parkRatingSpinnerValue = std::max(0, 10 * (_parkRatingSpinnerValue / 10 - 1));
InvalidateWidget(WIDX_PARK_RATING_SPINNER);
if (get_forced_park_rating() >= 0)
{
CheatsSet(CheatType::SetForcedParkRating, _parkRatingSpinnerValue);
}
break;
case WIDX_WEATHER_DROPDOWN_BUTTON:
{
rct_widget* dropdownWidget = widget - 1;
for (size_t i = 0; i < std::size(WeatherTypes); i++)
{
gDropdownItems[i].Format = STR_DROPDOWN_MENU_LABEL;
gDropdownItems[i].Args = WeatherTypes[i];
}
WindowDropdownShowTextCustomWidth(
{ windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1,
colours[1], 0, Dropdown::Flag::StayOpen, std::size(WeatherTypes), dropdownWidget->width() - 3);
auto currentWeather = gClimateCurrent.Weather;
Dropdown::SetChecked(EnumValue(currentWeather), true);
}
break;
case WIDX_STAFF_SPEED_DROPDOWN_BUTTON:
{
rct_widget* dropdownWidget;
dropdownWidget = widget - 1;
for (size_t i = 0; i < std::size(_staffSpeedNames); i++)
{
gDropdownItems[i].Args = _staffSpeedNames[i];
gDropdownItems[i].Format = STR_DROPDOWN_MENU_LABEL;
}
WindowDropdownShowTextCustomWidth(
{ windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1,
colours[1], 0, Dropdown::Flag::StayOpen, 3, dropdownWidget->width() - 3);
Dropdown::SetChecked(_selectedStaffSpeed, true);
}
}
}
void OnMouseUpMisc(rct_widgetindex widgetIndex)
{
switch (widgetIndex)
{
case WIDX_FREEZE_WEATHER:
CheatsSet(CheatType::FreezeWeather, !gCheatsFreezeWeather);
break;
case WIDX_OPEN_CLOSE_PARK:
CheatsSet(CheatType::OpenClosePark);
break;
case WIDX_CREATE_DUCKS:
CheatsSet(CheatType::CreateDucks, CHEATS_DUCK_INCREMENT);
break;
case WIDX_REMOVE_DUCKS:
CheatsSet(CheatType::RemoveDucks);
break;
case WIDX_CLEAR_GRASS:
CheatsSet(CheatType::SetGrassLength, GRASS_LENGTH_CLEAR_0);
break;
case WIDX_MOWED_GRASS:
CheatsSet(CheatType::SetGrassLength, GRASS_LENGTH_MOWED);
break;
case WIDX_WATER_PLANTS:
CheatsSet(CheatType::WaterPlants);
break;
case WIDX_FIX_VANDALISM:
CheatsSet(CheatType::FixVandalism);
break;
case WIDX_REMOVE_LITTER:
CheatsSet(CheatType::RemoveLitter);
break;
case WIDX_DISABLE_PLANT_AGING:
CheatsSet(CheatType::DisablePlantAging, !gCheatsDisablePlantAging);
break;
case WIDX_WIN_SCENARIO:
CheatsSet(CheatType::WinScenario);
break;
case WIDX_HAVE_FUN:
CheatsSet(CheatType::HaveFun);
break;
case WIDX_OWN_ALL_LAND:
CheatsSet(CheatType::OwnAllLand);
break;
case WIDX_NEVERENDING_MARKETING:
CheatsSet(CheatType::NeverEndingMarketing, !gCheatsNeverendingMarketing);
break;
case WIDX_FORCE_PARK_RATING:
if (get_forced_park_rating() >= 0)
{
CheatsSet(CheatType::SetForcedParkRating, -1);
}
else
{
CheatsSet(CheatType::SetForcedParkRating, _parkRatingSpinnerValue);
}
break;
}
}
void OnDropdownMisc(rct_widgetindex widgetIndex, int32_t dropdownIndex)
{
if (dropdownIndex == -1)
{
return;
}
if (widgetIndex == WIDX_WEATHER_DROPDOWN_BUTTON)
{
CheatsSet(CheatType::ForceWeather, dropdownIndex);
}
if (widgetIndex == WIDX_STAFF_SPEED_DROPDOWN_BUTTON)
{
int32_t speed = CHEATS_STAFF_FAST_SPEED;
switch (dropdownIndex)
{
case 0:
speed = CHEATS_STAFF_FREEZE_SPEED;
break;
case 1:
speed = CHEATS_STAFF_NORMAL_SPEED;
}
CheatsSet(CheatType::SetStaffSpeed, speed);
_selectedStaffSpeed = dropdownIndex;
}
}
void OnMouseUpGuests(rct_widgetindex widgetIndex)
{
switch (widgetIndex)
{
case WIDX_GUEST_HAPPINESS_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_HAPPINESS, PEEP_MAX_HAPPINESS);
break;
case WIDX_GUEST_HAPPINESS_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_HAPPINESS, 0);
break;
case WIDX_GUEST_ENERGY_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_ENERGY, PEEP_MAX_ENERGY);
break;
case WIDX_GUEST_ENERGY_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_ENERGY, PEEP_MIN_ENERGY);
break;
case WIDX_GUEST_HUNGER_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_HUNGER, 0);
break;
case WIDX_GUEST_HUNGER_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_HUNGER, PEEP_MAX_HUNGER);
break;
case WIDX_GUEST_THIRST_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_THIRST, 0);
break;
case WIDX_GUEST_THIRST_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_THIRST, PEEP_MAX_THIRST);
break;
case WIDX_GUEST_NAUSEA_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_NAUSEA, PEEP_MAX_NAUSEA);
break;
case WIDX_GUEST_NAUSEA_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_NAUSEA, 0);
break;
case WIDX_GUEST_NAUSEA_TOLERANCE_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_NAUSEA_TOLERANCE, EnumValue(PeepNauseaTolerance::High));
break;
case WIDX_GUEST_NAUSEA_TOLERANCE_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_NAUSEA_TOLERANCE, EnumValue(PeepNauseaTolerance::None));
break;
case WIDX_GUEST_TOILET_MAX:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_TOILET, PEEP_MAX_TOILET);
break;
case WIDX_GUEST_TOILET_MIN:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_TOILET, 0);
break;
case WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY, 1);
break;
case WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15:
CheatsSet(CheatType::SetGuestParameter, GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY, 0);
break;
case WIDX_TRAM_GUESTS:
CheatsSet(CheatType::GenerateGuests, CHEATS_TRAM_INCREMENT);
break;
case WIDX_REMOVE_ALL_GUESTS:
CheatsSet(CheatType::RemoveAllGuests);
break;
case WIDX_GIVE_GUESTS_MONEY:
CheatsSet(CheatType::GiveAllGuests, OBJECT_MONEY);
break;
case WIDX_GIVE_GUESTS_PARK_MAPS:
CheatsSet(CheatType::GiveAllGuests, OBJECT_PARK_MAP);
break;
case WIDX_GIVE_GUESTS_BALLOONS:
CheatsSet(CheatType::GiveAllGuests, OBJECT_BALLOON);
break;
case WIDX_GIVE_GUESTS_UMBRELLAS:
CheatsSet(CheatType::GiveAllGuests, OBJECT_UMBRELLA);
break;
case WIDX_GUEST_IGNORE_RIDE_INTENSITY:
CheatsSet(CheatType::IgnoreRideIntensity, !gCheatsIgnoreRideIntensity);
break;
case WIDX_DISABLE_VANDALISM:
CheatsSet(CheatType::DisableVandalism, !gCheatsDisableVandalism);
break;
case WIDX_DISABLE_LITTERING:
CheatsSet(CheatType::DisableLittering, !gCheatsDisableLittering);
break;
}
}
void OnMouseUpRides(rct_widgetindex widgetIndex)
{
switch (widgetIndex)
{
case WIDX_RENEW_RIDES:
CheatsSet(CheatType::RenewRides);
break;
case WIDX_MAKE_DESTRUCTIBLE:
CheatsSet(CheatType::MakeDestructible);
break;
case WIDX_FIX_ALL:
CheatsSet(CheatType::FixRides);
break;
case WIDX_UNLOCK_OPERATING_LIMITS:
CheatsSet(CheatType::FastLiftHill, !gCheatsUnlockOperatingLimits);
break;
case WIDX_DISABLE_BRAKES_FAILURE:
CheatsSet(CheatType::DisableBrakesFailure, !gCheatsDisableBrakesFailure);
break;
case WIDX_DISABLE_ALL_BREAKDOWNS:
CheatsSet(CheatType::DisableAllBreakdowns, !gCheatsDisableAllBreakdowns);
break;
case WIDX_BUILD_IN_PAUSE_MODE:
CheatsSet(CheatType::BuildInPauseMode, !gCheatsBuildInPauseMode);
break;
case WIDX_RESET_CRASH_STATUS:
CheatsSet(CheatType::ResetCrashStatus);
break;
case WIDX_10_MINUTE_INSPECTIONS:
CheatsSet(CheatType::TenMinuteInspections);
break;
case WIDX_SHOW_ALL_OPERATING_MODES:
{
if (!gCheatsShowAllOperatingModes)
{
context_show_error(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {});
}
CheatsSet(CheatType::ShowAllOperatingModes, !gCheatsShowAllOperatingModes);
}
break;
case WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES:
{
if (!gCheatsShowVehiclesFromOtherTrackTypes)
{
context_show_error(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {});
}
CheatsSet(CheatType::ShowVehiclesFromOtherTrackTypes, !gCheatsShowVehiclesFromOtherTrackTypes);
}
break;
case WIDX_DISABLE_TRAIN_LENGTH_LIMITS:
{
if (!gCheatsDisableTrainLengthLimit)
{
context_show_error(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {});
}
CheatsSet(CheatType::DisableTrainLengthLimit, !gCheatsDisableTrainLengthLimit);
}
break;
case WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK:
CheatsSet(CheatType::EnableChainLiftOnAllTrack, !gCheatsEnableChainLiftOnAllTrack);
break;
case WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES:
{
if (!gCheatsAllowArbitraryRideTypeChanges)
{
context_show_error(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {});
}
CheatsSet(CheatType::AllowArbitraryRideTypeChanges, !gCheatsAllowArbitraryRideTypeChanges);
}
break;
case WIDX_DISABLE_RIDE_VALUE_AGING:
CheatsSet(CheatType::DisableRideValueAging, !gCheatsDisableRideValueAging);
break;
case WIDX_IGNORE_RESEARCH_STATUS:
CheatsSet(CheatType::IgnoreResearchStatus, !gCheatsIgnoreResearchStatus);
break;
case WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES:
CheatsSet(CheatType::EnableAllDrawableTrackPieces, !gCheatsEnableAllDrawableTrackPieces);
break;
case WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS:
{
if (!gCheatsAllowTrackPlaceInvalidHeights)
{
context_show_error(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {});
}
CheatsSet(CheatType::AllowTrackPlaceInvalidHeights, !gCheatsAllowTrackPlaceInvalidHeights);
}
break;
}
}
};
rct_window* WindowCheatsOpen()
{
auto* window = window_bring_to_front_by_class(WindowClass::Cheats);
if (window == nullptr)
{
window = WindowCreate<CheatsWindow>(WindowClass::Cheats, ScreenCoordsXY(32, 32), WW, WH);
}
return window;
}