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)
{
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.HasMessage())
{
ContextShowError(errMessage.Message, STR_EMPTY, {});
}
}
auto trackName = ride->GetName();

View File

@ -16,4 +16,9 @@ struct ResultWithMessage
{
bool Successful{};
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 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.HasMessage())
{
ContextShowError(errMessage.Message, STR_EMPTY, {});
}
return td;
}

View File

@ -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)

View File

@ -20,6 +20,7 @@
#include <memory>
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);
};