Merge pull request #18771 from spacek531/ride/refactor-track-design-creation

Refactor track design creation return message
This commit is contained in:
Michael Steenbeek 2022-12-14 23:25:52 +01:00 committed by GitHub
commit 5f2b663580
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 29 deletions

View File

@ -5366,11 +5366,15 @@ static void WindowRideMeasurementsDesignSave(rct_window* w)
if (gTrackDesignSaveMode) if (gTrackDesignSaveMode)
{ {
auto errMessage = _trackDesign->CreateTrackDesignScenery(tds); 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; return;
} }
if (errMessage.HasMessage())
{
ContextShowError(errMessage.Message, STR_EMPTY, {});
}
} }
auto trackName = ride->GetName(); auto trackName = ride->GetName();

View File

@ -16,4 +16,9 @@ struct ResultWithMessage
{ {
bool Successful{}; bool Successful{};
StringId Message = STR_NONE; StringId Message = STR_NONE;
bool HasMessage() const
{
return Message != STR_NONE;
}
}; };

View File

@ -983,11 +983,15 @@ std::unique_ptr<TrackDesign> Ride::SaveToTrackDesign(TrackDesignState& tds) cons
auto td = std::make_unique<TrackDesign>(); auto td = std::make_unique<TrackDesign>();
auto errMessage = td->CreateTrackDesign(tds, *this); 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; return nullptr;
} }
if (errMessage.HasMessage())
{
ContextShowError(errMessage.Message, STR_EMPTY, {});
}
return td; return td;
} }

View File

@ -92,7 +92,7 @@ static uint8_t TrackDesignGetEntranceStyle(const Ride& ride)
return GetStationStyleFromIdentifier(objectName); return GetStationStyleFromIdentifier(objectName);
} }
StringId TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride) ResultWithMessage TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride)
{ {
type = ride.type; type = ride.type;
@ -103,7 +103,7 @@ StringId TrackDesign::CreateTrackDesign(TrackDesignState& tds, const Ride& ride)
// Remove this check for new track design format // Remove this check for new track design format
if (entry.IsEmpty()) if (entry.IsEmpty())
{ {
return STR_VEHICLE_UNSUPPORTED_TD6; return { false, STR_VEHICLE_UNSUPPORTED_TD6 };
} }
vehicle_object = ObjectEntryDescriptor(entry); 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; CoordsXYE trackElement;
if (!ride_try_get_origin_element(&ride, &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); ride_get_start_of_track(&trackElement);
@ -191,7 +191,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride&
if (!newCoords.has_value()) 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.x = newCoords->x;
trackElement.y = newCoords->y; trackElement.y = newCoords->y;
@ -213,7 +213,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride&
// Remove this check for new track design format // Remove this check for new track design format
if (trackElement.element->AsTrack()->GetTrackType() > TrackElemType::HighestAlias) if (trackElement.element->AsTrack()->GetTrackType() > TrackElemType::HighestAlias)
{ {
return STR_TRACK_ELEM_UNSUPPORTED_TD6; return { false, STR_TRACK_ELEM_UNSUPPORTED_TD6 };
} }
TrackDesignTrackElement track{}; TrackDesignTrackElement track{};
@ -261,7 +261,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride&
if (track_elements.size() > RCT2::Limits::TD6MaxTrackElements) 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); } while (trackElement.element != initialMap);
@ -322,7 +322,7 @@ StringId TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, const Ride&
if (z > 127 || z < -126) 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; 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_x = ((tds.PreviewMax.x - tds.PreviewMin.x) / 32) + 1;
space_required_y = ((tds.PreviewMax.y - tds.PreviewMin.y) / 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); auto startLoc = MazeGetFirstElement(ride);
if (startLoc.element == nullptr) 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() }; 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) 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()); } while (!(tileElement++)->IsLastForTile());
} }
@ -398,7 +398,7 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r
auto location = ride.GetStation().Entrance; auto location = ride.GetStation().Entrance;
if (location.IsNull()) 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(); CoordsXY entranceLoc = location.ToCoordsXY();
@ -406,7 +406,7 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r
do do
{ {
if (tileElement == nullptr) 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) if (tileElement->GetType() != TileElementType::Entrance)
continue; continue;
if (tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_RIDE_ENTRANCE) if (tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_RIDE_ENTRANCE)
@ -427,13 +427,13 @@ StringId TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& r
location = ride.GetStation().Exit; location = ride.GetStation().Exit;
if (location.IsNull()) 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(); CoordsXY exitLoc = location.ToCoordsXY();
tileElement = MapGetFirstElementAt(exitLoc); tileElement = MapGetFirstElementAt(exitLoc);
if (tileElement == nullptr) if (tileElement == nullptr)
return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY };
do do
{ {
if (tileElement->GetType() != TileElementType::Entrance) 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_x = ((tds.PreviewMax.x - tds.PreviewMin.x) / 32) + 1;
space_required_y = ((tds.PreviewMax.y - tds.PreviewMin.y) / 32) + 1; space_required_y = ((tds.PreviewMax.y - tds.PreviewMin.y) / 32) + 1;
return STR_NONE; return { true };
} }
CoordsXYE TrackDesign::MazeGetFirstElement(const Ride& ride) CoordsXYE TrackDesign::MazeGetFirstElement(const Ride& ride)
@ -493,7 +493,7 @@ CoordsXYE TrackDesign::MazeGetFirstElement(const Ride& ride)
return tile; return tile;
} }
StringId TrackDesign::CreateTrackDesignScenery(TrackDesignState& tds) ResultWithMessage TrackDesign::CreateTrackDesignScenery(TrackDesignState& tds)
{ {
scenery_elements = _trackSavedTileElementsDesc; scenery_elements = _trackSavedTileElementsDesc;
// Run an element loop // 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 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) || 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) 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); scenery.loc = CoordsXYZ(rotatedRelativeMapPos, relativeMapPosition.z);
} }
return STR_NONE; return { true };
} }
void TrackDesign::Serialise(DataSerialiser& stream) void TrackDesign::Serialise(DataSerialiser& stream)

View File

@ -20,6 +20,7 @@
#include <memory> #include <memory>
struct Ride; struct Ride;
struct ResultWithMessage;
#define TRACK_PREVIEW_IMAGE_SIZE (370 * 217) #define TRACK_PREVIEW_IMAGE_SIZE (370 * 217)
@ -148,14 +149,14 @@ struct TrackDesign
std::string name; std::string name;
public: public:
StringId CreateTrackDesign(TrackDesignState& tds, const Ride& ride); ResultWithMessage CreateTrackDesign(TrackDesignState& tds, const Ride& ride);
StringId CreateTrackDesignScenery(TrackDesignState& tds); ResultWithMessage CreateTrackDesignScenery(TrackDesignState& tds);
void Serialise(DataSerialiser& stream); void Serialise(DataSerialiser& stream);
private: private:
uint8_t _saveDirection; uint8_t _saveDirection;
StringId CreateTrackDesignTrack(TrackDesignState& tds, const Ride& ride); ResultWithMessage CreateTrackDesignTrack(TrackDesignState& tds, const Ride& ride);
StringId CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride); ResultWithMessage CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride);
CoordsXYE MazeGetFirstElement(const Ride& ride); CoordsXYE MazeGetFirstElement(const Ride& ride);
}; };