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;