From d03f5e594e1156fc6f7d10d70554a7b9782473bf Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Mon, 5 Dec 2022 22:39:47 -0800 Subject: [PATCH 1/2] Refactor track design creation return message --- src/openrct2-ui/windows/Ride.cpp | 8 ++++-- src/openrct2/ride/Ride.cpp | 8 ++++-- src/openrct2/ride/TrackDesign.cpp | 42 +++++++++++++++---------------- src/openrct2/ride/TrackDesign.h | 9 ++++--- 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 47ac595e57..26a096d9e0 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -5366,11 +5366,15 @@ static void WindowRideMeasurementsDesignSave(rct_window* w) if (gTrackDesignSaveMode) { auto errMessage = _trackDesign->CreateTrackDesignScenery(tds); - if (errMessage != STR_NONE) + if (!errMessage.Successful) { - ContextShowError(STR_CANT_SAVE_TRACK_DESIGN, errMessage, {}); + ContextShowError(STR_CANT_SAVE_TRACK_DESIGN, errMessage.Message, {}); return; } + if (errMessage.Message != STR_NONE) + { + ContextShowError(errMessage.Message, STR_EMPTY, {}); + } } auto trackName = ride->GetName(); diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 1fa67979e5..e6c50ccb16 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -983,11 +983,15 @@ std::unique_ptr Ride::SaveToTrackDesign(TrackDesignState& tds) cons auto td = std::make_unique(); auto errMessage = td->CreateTrackDesign(tds, *this); - if (errMessage != STR_NONE) + if (!errMessage.Successful) { - ContextShowError(STR_CANT_SAVE_TRACK_DESIGN, errMessage, {}); + ContextShowError(STR_CANT_SAVE_TRACK_DESIGN, errMessage.Message, {}); return nullptr; } + if (errMessage.Message != STR_NONE) + { + ContextShowError(errMessage.Message, STR_EMPTY, {}); + } return td; } diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 10bfa0351b..fb29e73982 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -92,7 +92,7 @@ static uint8_t TrackDesignGetEntranceStyle(const Ride& ride) return GetStationStyleFromIdentifier(objectName); } -StringId TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride) +ResultWithMessage TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride) { type = ride.type; @@ -103,7 +103,7 @@ StringId TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride) // Remove this check for new track design format if (entry.IsEmpty()) { - return STR_VEHICLE_UNSUPPORTED_TD6; + return { false, STR_VEHICLE_UNSUPPORTED_TD6 }; } vehicle_object = ObjectEntryDescriptor(entry); } @@ -172,12 +172,12 @@ StringId TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride) } } -StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& ride) +ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& ride) { CoordsXYE trackElement; if (!ride_try_get_origin_element(&ride, &trackElement)) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } ride_get_start_of_track(&trackElement); @@ -191,7 +191,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& if (!newCoords.has_value()) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } trackElement.x = newCoords->x; trackElement.y = newCoords->y; @@ -213,7 +213,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& // Remove this check for new track design format if (trackElement.element->AsTrack()->GetTrackType() > TrackElemType::HighestAlias) { - return STR_TRACK_ELEM_UNSUPPORTED_TD6; + return { false, STR_TRACK_ELEM_UNSUPPORTED_TD6 }; } TrackDesignTrackElement track{}; @@ -261,7 +261,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& if (track_elements.size() > RCT2::Limits::TD6MaxTrackElements) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } } while (trackElement.element != initialMap); @@ -322,7 +322,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& if (z > 127 || z < -126) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } entrance.z = z; @@ -347,16 +347,16 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride& space_required_x = ((tds.PreviewMax.x - tds.PreviewMin.x) / 32) + 1; space_required_y = ((tds.PreviewMax.y - tds.PreviewMin.y) / 32) + 1; - return STR_NONE; + return { true }; } -StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride) +ResultWithMessage TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride) { auto startLoc = MazeGetFirstElement(ride); if (startLoc.element == nullptr) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } tds.Origin = { startLoc.x, startLoc.y, startLoc.element->GetBaseZ() }; @@ -388,7 +388,7 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r if (maze_elements.size() >= 2000) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } } while (!(tileElement++)->IsLastForTile()); } @@ -398,7 +398,7 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r auto location = ride.GetStation().Entrance; if (location.IsNull()) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } CoordsXY entranceLoc = location.ToCoordsXY(); @@ -406,7 +406,7 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r do { if (tileElement == nullptr) - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; if (tileElement->GetType() != TileElementType::Entrance) continue; if (tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_RIDE_ENTRANCE) @@ -427,13 +427,13 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r location = ride.GetStation().Exit; if (location.IsNull()) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } CoordsXY exitLoc = location.ToCoordsXY(); tileElement = MapGetFirstElementAt(exitLoc); if (tileElement == nullptr) - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; do { if (tileElement->GetType() != TileElementType::Entrance) @@ -464,7 +464,7 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r space_required_x = ((tds.PreviewMax.x - tds.PreviewMin.x) / 32) + 1; space_required_y = ((tds.PreviewMax.y - tds.PreviewMin.y) / 32) + 1; - return STR_NONE; + return { true }; } CoordsXYE TrackDesign::MazeGetFirstElement(const Ride& ride) @@ -493,7 +493,7 @@ CoordsXYE TrackDesign::MazeGetFirstElement(const Ride& ride) return tile; } -StringId TrackDesign::CreateTrackDesignScenery(TrackDesignState& tds) +ResultWithMessage TrackDesign::CreateTrackDesignScenery(TrackDesignState& tds) { scenery_elements = _trackSavedTileElementsDesc; // Run an element loop @@ -547,17 +547,17 @@ StringId TrackDesign::CreateTrackDesignScenery(TrackDesignState& tds) if (rotatedRelativeMapPos.x > 127 * COORDS_XY_STEP || rotatedRelativeMapPos.y > 127 * COORDS_XY_STEP || rotatedRelativeMapPos.x < -126 * COORDS_XY_STEP || rotatedRelativeMapPos.y < -126 * COORDS_XY_STEP) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } if (relativeMapPosition.z > 127 * COORDS_Z_STEP || relativeMapPosition.z < -126 * COORDS_Z_STEP) { - return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; + return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY }; } scenery.loc = CoordsXYZ(rotatedRelativeMapPos, relativeMapPosition.z); } - return STR_NONE; + return { true }; } void TrackDesign::Serialise(DataSerialiser& stream) diff --git a/src/openrct2/ride/TrackDesign.h b/src/openrct2/ride/TrackDesign.h index 416f935a66..af4a38230c 100644 --- a/src/openrct2/ride/TrackDesign.h +++ b/src/openrct2/ride/TrackDesign.h @@ -20,6 +20,7 @@ #include struct Ride; +struct ResultWithMessage; #define TRACK_PREVIEW_IMAGE_SIZE (370 * 217) @@ -148,14 +149,14 @@ struct TrackDesign std::string name; public: - StringId CreateTrackDesign(TrackDesignState& tds, const Ride& ride); - StringId CreateTrackDesignScenery(TrackDesignState& tds); + ResultWithMessage CreateTrackDesign(TrackDesignState& tds, const Ride& ride); + ResultWithMessage CreateTrackDesignScenery(TrackDesignState& tds); void Serialise(DataSerialiser& stream); private: uint8_t _saveDirection; - StringId CreateTrackDesignTrack(TrackDesignState& tds, const Ride& ride); - StringId CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride); + ResultWithMessage CreateTrackDesignTrack(TrackDesignState& tds, const Ride& ride); + ResultWithMessage CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride); CoordsXYE MazeGetFirstElement(const Ride& ride); }; From 742294a86f2f10ad846984623ce9939e3c80c3ef Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Wed, 14 Dec 2022 12:55:50 -0800 Subject: [PATCH 2/2] Add HasMessage() method to ResultWithMessage --- src/openrct2-ui/windows/Ride.cpp | 2 +- src/openrct2/actions/ResultWithMessage.h | 5 +++++ src/openrct2/ride/Ride.cpp | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 26a096d9e0..35fd148cdf 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -5371,7 +5371,7 @@ static void WindowRideMeasurementsDesignSave(rct_window* w) ContextShowError(STR_CANT_SAVE_TRACK_DESIGN, errMessage.Message, {}); return; } - if (errMessage.Message != STR_NONE) + if (errMessage.HasMessage()) { ContextShowError(errMessage.Message, STR_EMPTY, {}); } diff --git a/src/openrct2/actions/ResultWithMessage.h b/src/openrct2/actions/ResultWithMessage.h index 873d7439a5..d695af40f1 100644 --- a/src/openrct2/actions/ResultWithMessage.h +++ b/src/openrct2/actions/ResultWithMessage.h @@ -16,4 +16,9 @@ struct ResultWithMessage { bool Successful{}; StringId Message = STR_NONE; + + bool HasMessage() const + { + return Message != STR_NONE; + } }; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index e6c50ccb16..754465e3a3 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -988,7 +988,7 @@ std::unique_ptr Ride::SaveToTrackDesign(TrackDesignState& tds) cons ContextShowError(STR_CANT_SAVE_TRACK_DESIGN, errMessage.Message, {}); return nullptr; } - if (errMessage.Message != STR_NONE) + if (errMessage.HasMessage()) { ContextShowError(errMessage.Message, STR_EMPTY, {}); }