From ecef614c93ed6fac3c31e71e29b75e740bf99ce4 Mon Sep 17 00:00:00 2001 From: spacek531 Date: Tue, 20 Dec 2022 22:54:38 +0100 Subject: [PATCH] Split Ride::Test into Ride::Test and Ride::Simulate --- src/openrct2/actions/RideSetStatusAction.cpp | 38 +++++------ src/openrct2/ride/Ride.cpp | 67 ++++++++++++++------ src/openrct2/ride/Ride.h | 3 +- 3 files changed, 69 insertions(+), 39 deletions(-) diff --git a/src/openrct2/actions/RideSetStatusAction.cpp b/src/openrct2/actions/RideSetStatusAction.cpp index a71e22bc3a..a8368218a2 100644 --- a/src/openrct2/actions/RideSetStatusAction.cpp +++ b/src/openrct2/actions/RideSetStatusAction.cpp @@ -90,25 +90,27 @@ GameActions::Result RideSetStatusAction::Query() const return res; } - if (_status == RideStatus::Testing || _status == RideStatus::Simulating) + ResultWithMessage modeSwitchResult = { true }; + switch (_status) { - const auto modeSwitchResult = ride->Test(_status, false); - if (!modeSwitchResult.Successful) - { - res.Error = GameActions::Status::Unknown; - res.ErrorMessage = modeSwitchResult.Message; - return res; - } + case RideStatus::Open: + modeSwitchResult = ride->Open(false); + break; + case RideStatus::Testing: + modeSwitchResult = ride->Test(false); + break; + case RideStatus::Simulating: + modeSwitchResult = ride->Simulate(false); + break; + default: + break; } - else if (_status == RideStatus::Open) + + if (!modeSwitchResult.Successful) { - const auto modeSwitchResult = ride->Open(false); - if (!modeSwitchResult.Successful) - { - res.Error = GameActions::Status::Unknown; - res.ErrorMessage = modeSwitchResult.Message; - return res; - } + res.Error = GameActions::Status::Unknown; + res.ErrorMessage = modeSwitchResult.Message; + return res; } } return GameActions::Result(); @@ -165,7 +167,7 @@ GameActions::Result RideSetStatusAction::Execute() const ride_clear_for_construction(ride); ride->RemovePeeps(); - const auto modeSwitchResult = ride->Test(_status, true); + const auto modeSwitchResult = ride->Simulate(true); if (!modeSwitchResult.Successful) { res.Error = GameActions::Status::Unknown; @@ -207,7 +209,7 @@ GameActions::Result RideSetStatusAction::Execute() const if (_status == RideStatus::Testing) { - const auto modeSwitchResult = ride->Test(_status, true); + const auto modeSwitchResult = ride->Test(true); if (!modeSwitchResult.Successful) { res.Error = GameActions::Status::Unknown; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b107f5d34f..ffcdee2dbb 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -3881,20 +3881,15 @@ TrackElement* Ride::GetOriginElement(StationIndex stationIndex) const return nullptr; } -ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) +ResultWithMessage Ride::Test(bool isApplying) { - CoordsXYE problematicTrackElement = {}; - if (type == RIDE_TYPE_NULL) { log_warning("Invalid ride type for ride %u", id.ToUnderlying()); return { false }; } - if (newStatus != RideStatus::Simulating) - { - window_close_by_number(WindowClass::RideConstruction, id.ToUnderlying()); - } + window_close_by_number(WindowClass::RideConstruction, id.ToUnderlying()); StationIndex stationIndex = {}; auto message = ChangeStatusDoStationChecks(stationIndex); @@ -3903,14 +3898,11 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) return message; } - if (newStatus != RideStatus::Simulating) + auto entranceExitCheck = ride_check_for_entrance_exit(id); + if (!entranceExitCheck.Successful) { - auto entranceExitCheck = ride_check_for_entrance_exit(id); - if (!entranceExitCheck.Successful) - { - ConstructMissingEntranceOrExit(); - return { false, entranceExitCheck.Message }; - } + ConstructMissingEntranceOrExit(); + return { false, entranceExitCheck.Message }; } CoordsXYE trackElement = {}; @@ -3920,13 +3912,10 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) return message; } - if (mode == RideMode::ContinuousCircuit || IsBlockSectioned()) + message = ChangeStatusCheckCompleteCircuit(trackElement); + if (!message.Successful) { - if (FindTrackGap(trackElement, &problematicTrackElement) && (newStatus != RideStatus::Simulating || IsBlockSectioned())) - { - ride_scroll_to_track_error(problematicTrackElement); - return { false, STR_TRACK_IS_NOT_A_COMPLETE_CIRCUIT }; - } + return message; } message = ChangeStatusCheckTrackValidity(trackElement); @@ -3937,6 +3926,44 @@ ResultWithMessage Ride::Test(RideStatus newStatus, bool isApplying) return ChangeStatusCreateVehicles(isApplying, trackElement); } + +ResultWithMessage Ride::Simulate(bool isApplying) +{ + CoordsXYE trackElement, problematicTrackElement = {}; + if (type == RIDE_TYPE_NULL) + { + log_warning("Invalid ride type for ride %u", id.ToUnderlying()); + return { false }; + } + + StationIndex stationIndex = {}; + auto message = ChangeStatusDoStationChecks(stationIndex); + if (!message.Successful) + { + return message; + } + + message = ChangeStatusGetStartElement(stationIndex, trackElement); + if (!message.Successful) + { + return message; + } + + if (IsBlockSectioned() && FindTrackGap(trackElement, &problematicTrackElement)) + { + ride_scroll_to_track_error(problematicTrackElement); + return { false, STR_TRACK_IS_NOT_A_COMPLETE_CIRCUIT }; + } + + message = ChangeStatusCheckTrackValidity(trackElement); + if (!message.Successful) + { + return message; + } + + return ChangeStatusCreateVehicles(isApplying, trackElement); +} + /** * * rct2: 0x006B4EEA diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index bf8479de43..69ca0895a9 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -346,7 +346,8 @@ public: void ValidateStations(); ResultWithMessage Open(bool isApplying); - ResultWithMessage Test(RideStatus newStatus, bool isApplying); + ResultWithMessage Test(bool isApplying); + ResultWithMessage Simulate(bool isApplying); RideMode GetDefaultMode() const;