From dbbfc2f1d1932a43bacfc974c18a62397f4218cc Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 20 Apr 2024 14:47:18 +0200 Subject: [PATCH 1/4] Create kMaximumBrakeSpeed --- data/language/en-GB.txt | 1 + src/openrct2-ui/windows/RideConstruction.cpp | 3 +-- src/openrct2/actions/TrackPlaceAction.cpp | 7 +++++++ src/openrct2/actions/TrackSetBrakeSpeedAction.cpp | 6 ++++++ src/openrct2/localisation/StringIds.h | 2 ++ src/openrct2/ride/Track.h | 2 ++ 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 307cd9f5d4..5efb4deb23 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3698,6 +3698,7 @@ STR_6623 :Type ‘help’ for a list of available commands. Type ‘hide’ t STR_6624 :Tile Inspector: Sort elements STR_6625 :Invalid colour STR_6626 :Animation is backwards +STR_6627 :Track speed too high! ############# # Scenarios # diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 7c1a5bd134..f0cb661dba 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -1336,9 +1336,8 @@ static Widget _rideConstructionWidgets[] = { else { uint8_t* brakesSpeedPtr = &_currentBrakeSpeed2; - uint8_t maxBrakesSpeed = 30; uint8_t brakesSpeed = *brakesSpeedPtr + 2; - if (brakesSpeed <= maxBrakesSpeed) + if (brakesSpeed <= kMaximumBrakeSpeed) { if (_rideConstructionState == RideConstructionState::Selected) { diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index c20f2c1ae7..14a14e0117 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -104,6 +104,13 @@ GameActions::Result TrackPlaceAction::Query() const GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_ERR_VALUE_OUT_OF_RANGE); } + if (_brakeSpeed > kMaximumBrakeSpeed) + { + LOG_WARNING("Invalid speed for track placement, speed = %d", _brakeSpeed); + return GameActions::Result( + GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_SPEED_TOO_HIGH); + } + auto res = GameActions::Result(); res.Expenditure = ExpenditureType::RideConstruction; res.Position.x = _origin.x + 16; diff --git a/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp b/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp index 9a96d6dcd9..b72d4a0e23 100644 --- a/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp +++ b/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp @@ -68,6 +68,12 @@ GameActions::Result TrackSetBrakeSpeedAction::QueryExecute(bool isExecuting) con GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_TILE_ELEMENT_NOT_FOUND); } + if (_brakeSpeed > kMaximumBrakeSpeed) + { + LOG_WARNING("Invalid speed for track, speed = %d", _brakeSpeed); + return GameActions::Result(GameActions::Status::InvalidParameters, STR_SPEED_TOO_HIGH, STR_NONE); + } + if (isExecuting) { GetTrackElementOriginAndApplyChanges( diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index c078ae0144..9cb6ed8e8a 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -4045,6 +4045,8 @@ enum : uint16_t STR_TILE_INSPECTOR_WALL_ANIMATION_IS_BACKWARDS = 6626, + STR_SPEED_TOO_HIGH = 6627, + // 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/ride/Track.h b/src/openrct2/ride/Track.h index 4bb779476d..52f393a714 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -22,6 +22,8 @@ constexpr uint8_t kRCT2DefaultBlockBrakeSpeed = 2; constexpr int32_t kBlockBrakeBaseSpeed = 0x20364; constexpr int32_t kBlockBrakeSpeedOffset = kBlockBrakeBaseSpeed - (kRCT2DefaultBlockBrakeSpeed << 16); +constexpr uint8_t kMaximumBrakeSpeed = 30; + using track_type_t = uint16_t; struct ResultWithMessage; From 22e7ad598bd2932949f11ab91c4a5d9b803675a9 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 20 Apr 2024 14:55:55 +0200 Subject: [PATCH 2/4] Default-initialise all fields of RideTypeDescriptor --- src/openrct2/ride/RideData.h | 50 ++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index f7369c8509..1be1f3eb01 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -306,45 +306,45 @@ struct TrackDrawerDescriptor struct RideTypeDescriptor { - uint8_t Category; + uint8_t Category{}; /** rct2: 0x0097CC68 */ - track_type_t StartTrackPiece; + track_type_t StartTrackPiece{}; TrackDrawerDescriptor TrackPaintFunctions{}; TrackDrawerDescriptor InvertedTrackPaintFunctions{}; - uint64_t Flags; + uint64_t Flags{}; /** rct2: 0x0097C8AC */ - uint64_t RideModes; - RideMode DefaultMode; + uint64_t RideModes{}; + RideMode DefaultMode{}; /** rct2: 0x0097CF40 */ - RideOperatingSettings OperatingSettings; - RideNaming Naming; - RideNameConvention NameConvention; - const char* EnumName; - uint8_t AvailableBreakdowns; + RideOperatingSettings OperatingSettings{}; + RideNaming Naming{}; + RideNameConvention NameConvention{}; + const char* EnumName{}; + uint8_t AvailableBreakdowns{}; /** rct2: 0x0097D218 */ - RideHeights Heights; - uint8_t MaxMass; + RideHeights Heights{}; + uint8_t MaxMass{}; /** rct2: 0x0097D7C8, 0x0097D7C9, 0x0097D7CA */ - RideLiftData LiftData; + RideLiftData LiftData{}; // rct2: 0x0097CD1E - RatingTuple RatingsMultipliers; - UpkeepCostsDescriptor UpkeepCosts; + RatingTuple RatingsMultipliers{}; + UpkeepCostsDescriptor UpkeepCosts{}; // rct2: 0x0097DD78 - RideBuildCost BuildCosts; - money64 DefaultPrices[RCT2::ObjectLimits::MaxShopItemsPerRideEntry]; - std::string_view DefaultMusic; + RideBuildCost BuildCosts{}; + money64 DefaultPrices[RCT2::ObjectLimits::MaxShopItemsPerRideEntry]{}; + std::string_view DefaultMusic{}; /** rct2: 0x0097D7CB */ - ShopItemIndex PhotoItem; + ShopItemIndex PhotoItem{}; /** rct2: 0x0097D21E */ - uint8_t BonusValue; - TrackColourPresetList ColourPresets; - RideColourPreview ColourPreview; - RideColourKey ColourKey; + uint8_t BonusValue{}; + TrackColourPresetList ColourPresets{}; + RideColourPreview ColourPreview{}; + RideColourKey ColourKey{}; // json name lookup - std::string_view Name; + std::string_view Name{}; - RideRatingsDescriptor RatingsData; + RideRatingsDescriptor RatingsData{}; UpdateRotatingFunction UpdateRotating = UpdateRotatingDefault; From 00618c79d27de6fed71ab90aa79bb6e0c32a80bf Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 20 Apr 2024 15:14:36 +0200 Subject: [PATCH 3/4] Rename _currentBrakeSpeed2 to _currentBrakeSpeed --- src/openrct2-ui/windows/RideConstruction.cpp | 12 ++++++------ src/openrct2/ride/RideConstruction.cpp | 2 +- src/openrct2/ride/RideConstruction.h | 2 +- src/openrct2/windows/_legacy.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index f0cb661dba..e6d11f3440 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -219,7 +219,7 @@ static Widget _rideConstructionWidgets[] = { ShowGridlines(); _currentTrackPrice = kMoney64Undefined; - _currentBrakeSpeed2 = 8; + _currentBrakeSpeed = 8; _currentSeatRotationAngle = 4; _currentTrackCurve = currentRide->GetRideTypeDescriptor().StartTrackPiece | RideConstructionSpecialPieceSelected; @@ -1335,7 +1335,7 @@ static Widget _rideConstructionWidgets[] = { } else { - uint8_t* brakesSpeedPtr = &_currentBrakeSpeed2; + uint8_t* brakesSpeedPtr = &_currentBrakeSpeed; uint8_t brakesSpeed = *brakesSpeedPtr + 2; if (brakesSpeed <= kMaximumBrakeSpeed) { @@ -1361,7 +1361,7 @@ static Widget _rideConstructionWidgets[] = { } else { - uint8_t* brakesSpeedPtr = &_currentBrakeSpeed2; + uint8_t* brakesSpeedPtr = &_currentBrakeSpeed; uint8_t brakesSpeed = *brakesSpeedPtr - 2; if (brakesSpeed >= 2) { @@ -1449,7 +1449,7 @@ static Widget _rideConstructionWidgets[] = { break; case TrackElemType::BlockBrakes: case TrackElemType::DiagBlockBrakes: - _currentBrakeSpeed2 = kRCT2DefaultBlockBrakeSpeed; + _currentBrakeSpeed = kRCT2DefaultBlockBrakeSpeed; } _currentTrackCurve = trackPiece | RideConstructionSpecialPieceSelected; WindowRideConstructionUpdateActiveElements(); @@ -1507,7 +1507,7 @@ static Widget _rideConstructionWidgets[] = { if (_currentlyShowingBrakeOrBoosterSpeed) { - uint16_t brakeSpeed2 = ((_currentBrakeSpeed2 * 9) >> 2) & 0xFFFF; + uint16_t brakeSpeed2 = ((_currentBrakeSpeed * 9) >> 2) & 0xFFFF; if (TrackTypeIsBooster(_selectedTrackType) || TrackTypeIsBooster(_currentTrackCurve & ~RideConstructionSpecialPieceSelected)) { @@ -3050,7 +3050,7 @@ static Widget _rideConstructionWidgets[] = { { _selectedTrackType = tileElement->AsTrack()->GetTrackType(); if (TrackTypeHasSpeedSetting(tileElement->AsTrack()->GetTrackType())) - _currentBrakeSpeed2 = tileElement->AsTrack()->GetBrakeBoosterSpeed(); + _currentBrakeSpeed = tileElement->AsTrack()->GetBrakeBoosterSpeed(); _currentSeatRotationAngle = tileElement->AsTrack()->GetSeatRotation(); } } diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 135a39355a..3103bd5992 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -74,7 +74,7 @@ TrackPitch _previousTrackPitchEnd; CoordsXYZ _previousTrackPiece; -uint8_t _currentBrakeSpeed2; +uint8_t _currentBrakeSpeed; uint8_t _currentSeatRotationAngle; CoordsXYZD _unkF440C5; diff --git a/src/openrct2/ride/RideConstruction.h b/src/openrct2/ride/RideConstruction.h index a4679faa5a..fbfead2504 100644 --- a/src/openrct2/ride/RideConstruction.h +++ b/src/openrct2/ride/RideConstruction.h @@ -62,7 +62,7 @@ extern TrackPitch _previousTrackPitchEnd; extern CoordsXYZ _previousTrackPiece; -extern uint8_t _currentBrakeSpeed2; +extern uint8_t _currentBrakeSpeed; extern uint8_t _currentSeatRotationAngle; extern CoordsXYZD _unkF440C5; diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index c749fb40e0..57c78cd18d 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -372,7 +372,7 @@ bool WindowRideConstructionUpdateState( if (TrackTypeHasSpeedSetting(trackType)) { - properties = _currentBrakeSpeed2; + properties = _currentBrakeSpeed; } else { From 938f3cd783f5446ccb96c7981678f531414f310c Mon Sep 17 00:00:00 2001 From: Gymnasiast <> Date: Tue, 30 Apr 2024 13:40:39 +0200 Subject: [PATCH 4/4] Bump network version --- src/openrct2/network/NetworkBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 052bc1cbbf..23da4dcf01 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -46,7 +46,7 @@ using namespace OpenRCT2; // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "3" +#define NETWORK_STREAM_VERSION "4" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION