From 5456899afc04dcdd045c5e5e39b1bfd0df41e9e6 Mon Sep 17 00:00:00 2001 From: Kevin Strehl Date: Fri, 24 Apr 2020 18:07:36 -0500 Subject: [PATCH] Close #10572: Add cheat to allow building at invalid heights --- data/language/en-GB.txt | 2 ++ distribution/changelog.txt | 1 + src/openrct2-ui/windows/Cheats.cpp | 39 +++++++++++++++-------- src/openrct2/Cheats.cpp | 9 ++++++ src/openrct2/Cheats.h | 2 ++ src/openrct2/actions/SetCheatAction.hpp | 3 ++ src/openrct2/actions/TrackPlaceAction.hpp | 19 ++++++----- src/openrct2/localisation/StringIds.h | 2 ++ src/openrct2/network/Network.cpp | 4 ++- 9 files changed, 59 insertions(+), 22 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 34ad9b7a56..a7f9f0c82a 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3682,6 +3682,8 @@ STR_6365 :Ride casualties STR_6366 :Stuck or stalled vehicles STR_6367 :{WINDOW_COLOUR_2}Animation frame: STR_6368 :For compatibility reasons, it is not recommended to run OpenRCT2 with Wine. OpenRCT2 has native support for macOS, Linux, FreeBSD and OpenBSD. +STR_6369 :Allow building track at invalid heights +STR_6370 :{SMALLFONT}{BLACK}Allows placing track pieces at any height interval ############# # Scenarios # diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 017362e6ce..5ab6921030 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,6 +1,7 @@ 0.2.6+ (in development) ------------------------------------------------------------------------ - Feature: [#9029] Open doors with the tile inspector. +- Feature: [#10572] Cheat to allow building at invalid heights. - Feature: [#11231] Change shortcut window list order to be more intuitive, and split it into logical sections. - Feature: [#11306] Path additions are now kept when replacing the path. - Change: [#11209] Warn when user is running OpenRCT2 through Wine. diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index 0f313d527e..c425642392 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -160,6 +160,7 @@ enum WINDOW_CHEATS_WIDGET_IDX 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_FAST_LIFT_HILL, @@ -303,21 +304,22 @@ static rct_widget window_cheats_rides_widgets[] = { WWT_BUTTON, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_CHEAT_MAKE_DESTRUCTABLE_TIP }, // All destructible { WWT_BUTTON, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_RESET_CRASH_STATUS, STR_CHEAT_RESET_CRASH_STATUS_TIP }, // Reset crash status { WWT_BUTTON, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_10_MINUTE_INSPECTIONS, STR_CHEAT_10_MINUTE_INSPECTIONS_TIP }, // 10 minute inspections - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(3.25), HPL(6.25), STR_CHEAT_GROUP_CONSTRUCTION, STR_NONE }, // Construction group + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(3.25), HPL(7.25), STR_CHEAT_GROUP_CONSTRUCTION, STR_NONE }, // Construction group { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(4), OHPL(4), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_CHEAT_BUILD_IN_PAUSE_MODE_TIP }, // Build in pause mode { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(5), OHPL(5), STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES, STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES_TIP}, // Show all drawable track pieces { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(6), OHPL(6), STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK_TIP }, // Enable chain lift on all track - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(7.25), HPL(12.25), STR_CHEAT_GROUP_OPERATION, STR_NONE }, // Construction group - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(8), OHPL(8), STR_CHEAT_SHOW_ALL_OPERATING_MODES, STR_NONE }, // Show all operating modes - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(9), OHPL(9), STR_CHEAT_UNLOCK_OPERATING_LIMITS, STR_CHEAT_UNLOCK_OPERATING_LIMITS_TIP },// 410 km/h lift hill etc. - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_DISABLE_BRAKES_FAILURE, STR_CHEAT_DISABLE_BRAKES_FAILURE_TIP }, // Disable brakes failure - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(11), OHPL(11), STR_CHEAT_DISABLE_BREAKDOWNS, STR_CHEAT_DISABLE_BREAKDOWNS_TIP }, // Disable all breakdowns - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(12), OHPL(12), STR_CHEAT_DISABLE_RIDE_VALUE_AGING, STR_CHEAT_DISABLE_RIDE_VALUE_AGING_TIP }, // Disable ride ageing - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(13.25), HPL(17.25), STR_CHEAT_GROUP_AVAILABILITY, STR_NONE }, // Construction group - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(14), OHPL(14), STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP }, // Allow arbitrary ride type changes - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(15), OHPL(15), STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, STR_NONE }, // Show vehicles from other track types - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(16), OHPL(16), STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP }, // Disable train length limits - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(17), OHPL(17), STR_CHEAT_IGNORE_RESEARCH_STATUS, STR_CHEAT_IGNORE_RESEARCH_STATUS_TIP}, // Ignore Research Status + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(7), OHPL(7), STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS_TIP }, // Enable chain lift on all track + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(8.25), HPL(13.25), STR_CHEAT_GROUP_OPERATION, STR_NONE }, // Construction group + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(9), OHPL(9), STR_CHEAT_SHOW_ALL_OPERATING_MODES, STR_NONE }, // Show all operating modes + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_UNLOCK_OPERATING_LIMITS, STR_CHEAT_UNLOCK_OPERATING_LIMITS_TIP },// 410 km/h lift hill etc. + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(11), OHPL(11), STR_CHEAT_DISABLE_BRAKES_FAILURE, STR_CHEAT_DISABLE_BRAKES_FAILURE_TIP }, // Disable brakes failure + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(12), OHPL(12), STR_CHEAT_DISABLE_BREAKDOWNS, STR_CHEAT_DISABLE_BREAKDOWNS_TIP }, // Disable all breakdowns + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(13), OHPL(13), STR_CHEAT_DISABLE_RIDE_VALUE_AGING, STR_CHEAT_DISABLE_RIDE_VALUE_AGING_TIP }, // Disable ride ageing + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(14.25), HPL(18.25), STR_CHEAT_GROUP_AVAILABILITY, STR_NONE }, // Construction group + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(15), OHPL(15), STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP }, // Allow arbitrary ride type changes + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(16), OHPL(16), STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, STR_NONE }, // Show vehicles from other track types + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(17), OHPL(17), STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP }, // Disable train length limits + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(18), OHPL(18), STR_CHEAT_IGNORE_RESEARCH_STATUS, STR_CHEAT_IGNORE_RESEARCH_STATUS_TIP}, // Ignore Research Status { WIDGETS_END }, }; @@ -577,7 +579,8 @@ static uint64_t window_cheats_page_enabled_widgets[] = { (1ULL << WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES) | (1ULL << WIDX_DISABLE_RIDE_VALUE_AGING) | (1ULL << WIDX_IGNORE_RESEARCH_STATUS) | - (1ULL << WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES) + (1ULL << WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES) | + (1ULL << WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS) }; static uint64_t window_cheats_page_hold_down_widgets[] = { @@ -1074,6 +1077,15 @@ static void window_cheats_rides_mouseup(rct_window* w, rct_widgetindex widgetInd 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; } } @@ -1168,6 +1180,7 @@ static void window_cheats_invalidate(rct_window* w) widget_set_checkbox_value(w, WIDX_DISABLE_RIDE_VALUE_AGING, gCheatsDisableRideValueAging); widget_set_checkbox_value(w, WIDX_IGNORE_RESEARCH_STATUS, gCheatsIgnoreResearchStatus); widget_set_checkbox_value(w, WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES, gCheatsEnableAllDrawableTrackPieces); + widget_set_checkbox_value(w, WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, gCheatsAllowTrackPlaceInvalidHeights); break; } diff --git a/src/openrct2/Cheats.cpp b/src/openrct2/Cheats.cpp index 342b90cb1a..7203c9bb28 100644 --- a/src/openrct2/Cheats.cpp +++ b/src/openrct2/Cheats.cpp @@ -52,6 +52,7 @@ bool gCheatsAllowArbitraryRideTypeChanges = false; bool gCheatsDisableRideValueAging = false; bool gCheatsIgnoreResearchStatus = false; bool gCheatsEnableAllDrawableTrackPieces = false; +bool gCheatsAllowTrackPlaceInvalidHeights = false; void CheatsReset() { @@ -75,6 +76,8 @@ void CheatsReset() gCheatsAllowArbitraryRideTypeChanges = false; gCheatsDisableRideValueAging = false; gCheatsIgnoreResearchStatus = false; + gCheatsEnableAllDrawableTrackPieces = false; + gCheatsAllowTrackPlaceInvalidHeights = false; } void CheatsSet(CheatType cheatType, int32_t param1 /* = 0*/, int32_t param2 /* = 0*/) @@ -122,6 +125,7 @@ void CheatsSerialise(DataSerialiser& ds) CheatEntrySerialise(ds, CheatType::DisableRideValueAging, gCheatsDisableRideValueAging, count); CheatEntrySerialise(ds, CheatType::IgnoreResearchStatus, gCheatsIgnoreResearchStatus, count); CheatEntrySerialise(ds, CheatType::EnableAllDrawableTrackPieces, gCheatsEnableAllDrawableTrackPieces, count); + CheatEntrySerialise(ds, CheatType::AllowTrackPlaceInvalidHeights, gCheatsAllowTrackPlaceInvalidHeights, count); // Remember current position and update count. uint64_t endOffset = stream.GetPosition(); @@ -206,6 +210,9 @@ void CheatsSerialise(DataSerialiser& ds) case CheatType::EnableAllDrawableTrackPieces: ds << gCheatsEnableAllDrawableTrackPieces; break; + case CheatType::AllowTrackPlaceInvalidHeights: + ds << gCheatsAllowTrackPlaceInvalidHeights; + break; default: break; } @@ -309,6 +316,8 @@ const char* CheatsGetName(CheatType cheatType) return language_get_string(STR_CHEAT_IGNORE_RESEARCH_STATUS); case CheatType::EnableAllDrawableTrackPieces: return language_get_string(STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES); + case CheatType::AllowTrackPlaceInvalidHeights: + return language_get_string(STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS); default: return "Unknown Cheat"; } diff --git a/src/openrct2/Cheats.h b/src/openrct2/Cheats.h index 8c70820a9b..82595b8ba3 100644 --- a/src/openrct2/Cheats.h +++ b/src/openrct2/Cheats.h @@ -33,6 +33,7 @@ extern bool gCheatsEnableChainLiftOnAllTrack; extern bool gCheatsAllowArbitraryRideTypeChanges; extern bool gCheatsIgnoreResearchStatus; extern bool gCheatsEnableAllDrawableTrackPieces; +extern bool gCheatsAllowTrackPlaceInvalidHeights; enum class CheatType : int32_t { @@ -85,6 +86,7 @@ enum class CheatType : int32_t EnableAllDrawableTrackPieces, CreateDucks, RemoveDucks, + AllowTrackPlaceInvalidHeights, Count, }; diff --git a/src/openrct2/actions/SetCheatAction.hpp b/src/openrct2/actions/SetCheatAction.hpp index 20de14eb3b..13839973a9 100644 --- a/src/openrct2/actions/SetCheatAction.hpp +++ b/src/openrct2/actions/SetCheatAction.hpp @@ -237,6 +237,9 @@ public: case CheatType::RemoveDucks: duck_remove_all(); break; + case CheatType::AllowTrackPlaceInvalidHeights: + gCheatsAllowTrackPlaceInvalidHeights = _param1 != 0; + break; default: { log_error("Unabled cheat: %d", _cheatType.id); diff --git a/src/openrct2/actions/TrackPlaceAction.hpp b/src/openrct2/actions/TrackPlaceAction.hpp index 658d21be5e..ef24a56b4d 100644 --- a/src/openrct2/actions/TrackPlaceAction.hpp +++ b/src/openrct2/actions/TrackPlaceAction.hpp @@ -183,18 +183,21 @@ public: return std::make_unique(GA_ERROR::NO_FREE_ELEMENTS, STR_TILE_ELEMENT_LIMIT_REACHED); } const uint16_t* trackFlags = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? FlatTrackFlags : TrackFlags; - if (trackFlags[_trackType] & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) + if (!gCheatsAllowTrackPlaceInvalidHeights) { - if ((_origin.z & 0x0F) != 8) + if (trackFlags[_trackType] & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) { - return std::make_unique(GA_ERROR::INVALID_PARAMETERS, STR_CONSTRUCTION_ERR_UNKNOWN); + if ((_origin.z & 0x0F) != 8) + { + return std::make_unique(GA_ERROR::INVALID_PARAMETERS, STR_CONSTRUCTION_ERR_UNKNOWN); + } } - } - else - { - if ((_origin.z & 0x0F) != 0) + else { - return std::make_unique(GA_ERROR::INVALID_PARAMETERS, STR_CONSTRUCTION_ERR_UNKNOWN); + if ((_origin.z & 0x0F) != 0) + { + return std::make_unique(GA_ERROR::INVALID_PARAMETERS, STR_CONSTRUCTION_ERR_UNKNOWN); + } } } diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 7ec2b1d984..ea3dd6897f 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3919,6 +3919,8 @@ enum STR_TILE_INSPECTOR_WALL_ANIMATION_FRAME = 6367, STR_WINE_NOT_RECOMMENDED = 6368, + STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS = 6369, + STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS_TIP = 6370, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index c3bdcd9537..34467d2aa5 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -31,7 +31,7 @@ // This string specifies which version of network stream current build uses. // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "6" +#define NETWORK_STREAM_VERSION "7" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION static Peep* _pickup_peep = nullptr; @@ -2729,6 +2729,7 @@ bool Network::LoadMap(IStream* stream) gGamePaused = stream->ReadValue(); _guestGenerationProbability = stream->ReadValue(); _suggestedGuestMaximum = stream->ReadValue(); + gCheatsAllowTrackPlaceInvalidHeights = stream->ReadValue() != 0; gCheatsEnableAllDrawableTrackPieces = stream->ReadValue() != 0; gCheatsSandboxMode = stream->ReadValue() != 0; gCheatsDisableClearanceChecks = stream->ReadValue() != 0; @@ -2777,6 +2778,7 @@ bool Network::SaveMap(IStream* stream, const std::vectorWriteValue(gGamePaused); stream->WriteValue(_guestGenerationProbability); stream->WriteValue(_suggestedGuestMaximum); + stream->WriteValue(gCheatsAllowTrackPlaceInvalidHeights); stream->WriteValue(gCheatsEnableAllDrawableTrackPieces); stream->WriteValue(gCheatsSandboxMode); stream->WriteValue(gCheatsDisableClearanceChecks);