From 72404f1b85602f8ffdbd393273d882a7fcab6cd9 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 31 Jul 2021 22:18:15 +0200 Subject: [PATCH 1/3] Eliminate _trackDesignPlaceCost --- src/openrct2/ride/TrackDesign.cpp | 122 +++++++++++++++--------------- src/openrct2/ride/TrackDesign.h | 2 +- 2 files changed, 64 insertions(+), 60 deletions(-) diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 4a6655993f..add3914c5f 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -73,7 +73,6 @@ static CoordsXYZ _trackPreviewOrigin; bool _trackDesignDrawingPreview; static uint8_t _trackDesignPlaceOperation; -static money32 _trackDesignPlaceCost; static int16_t _trackDesignPlaceZ; static int16_t _trackDesignPlaceSceneryZ; @@ -965,23 +964,24 @@ static bool TrackDesignPlaceSceneryElementGetPlaceZ(const TrackDesignSceneryElem return true; } -static bool TrackDesignPlaceSceneryElement( - CoordsXY mapCoord, uint8_t mode, const TrackDesignSceneryElement& scenery, uint8_t rotation, int32_t originZ) +static std::pair TrackDesignPlaceSceneryElement( + CoordsXY mapCoord, uint8_t mode, const TrackDesignSceneryElement& scenery, uint8_t rotation, int32_t originZ, + money32 totalCost) { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES && mode == 0) { track_design_add_selection_tile(mapCoord); - return true; + return std::pair(true, totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_REMOVE_GHOST && mode == 0) { - return TrackDesignPlaceSceneryElementRemoveGhost(mapCoord, scenery, rotation, originZ); + return std::pair(TrackDesignPlaceSceneryElementRemoveGhost(mapCoord, scenery, rotation, originZ), totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return TrackDesignPlaceSceneryElementGetPlaceZ(scenery); + return std::pair(TrackDesignPlaceSceneryElementGetPlaceZ(scenery), totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY || _trackDesignPlaceOperation == PTD_OPERATION_PLACE @@ -992,7 +992,7 @@ static bool TrackDesignPlaceSceneryElement( ObjectEntryIndex entry_index; if (TrackDesignPlaceSceneryElementGetEntry(entry_type, entry_index, scenery)) { - return true; + return std::pair(true, totalCost); } money32 cost; @@ -1006,11 +1006,11 @@ static bool TrackDesignPlaceSceneryElement( { if (mode != 0) { - return true; + return std::pair(true, totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return true; + return std::pair(true, totalCost); } rotation += scenery.flags; @@ -1054,11 +1054,11 @@ static bool TrackDesignPlaceSceneryElement( { if (mode != 0) { - return true; + return std::pair(true, totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return true; + return std::pair(true, totalCost); } rotation += scenery.flags; @@ -1098,11 +1098,11 @@ static bool TrackDesignPlaceSceneryElement( { if (mode != 0) { - return true; + return std::pair(true, totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return true; + return std::pair(true, totalCost); } z = scenery.z * COORDS_Z_STEP + originZ; @@ -1141,7 +1141,7 @@ static bool TrackDesignPlaceSceneryElement( case ObjectType::Paths: if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return true; + return std::pair(true, totalCost); } z = (scenery.z * COORDS_Z_STEP + originZ) / COORDS_Z_STEP; @@ -1193,14 +1193,14 @@ static bool TrackDesignPlaceSceneryElement( { if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY) { - return true; + return std::pair(true, totalCost); } auto* pathElement = map_get_path_element_at({ mapCoord.x / 32, mapCoord.y / 32, z }); if (pathElement == nullptr) { - return true; + return std::pair(true, totalCost); } footpath_queue_chain_reset(); @@ -1222,40 +1222,40 @@ static bool TrackDesignPlaceSceneryElement( } footpath_connect_edges(mapCoord, reinterpret_cast(pathElement), flags); footpath_update_queue_chains(); - return true; + return std::pair(true, totalCost); } break; default: _trackDesignPlaceStateSceneryUnavailable = true; - return true; + return std::pair(true, totalCost); } - _trackDesignPlaceCost = add_clamp_money32(_trackDesignPlaceCost, cost); + totalCost = add_clamp_money32(totalCost, cost); if (_trackDesignPlaceOperation != PTD_OPERATION_PLACE) { if (cost == MONEY32_UNDEFINED) { - _trackDesignPlaceCost = MONEY32_UNDEFINED; + totalCost = MONEY32_UNDEFINED; } } - if (_trackDesignPlaceCost != MONEY32_UNDEFINED) + if (totalCost != MONEY32_UNDEFINED) { - return true; + return std::pair(true, totalCost); } if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE) { - return true; + return std::pair(true, totalCost); } - return false; + return std::pair(false, totalCost); } - return true; + return std::pair(true, totalCost); } /** * * rct2: 0x006D0964 */ -static int32_t track_design_place_all_scenery( - const std::vector& sceneryList, const CoordsXYZ& origin) +static std::pair track_design_place_all_scenery( + const std::vector& sceneryList, const CoordsXYZ& origin, money32 cost) { for (uint8_t mode = 0; mode <= 1; mode++) { @@ -1279,16 +1279,20 @@ static int32_t track_design_place_all_scenery( auto mapCoord = CoordsXYZ{ tileCoords.ToCoordsXY(), origin.z }; track_design_update_max_min_coordinates(mapCoord); - if (!TrackDesignPlaceSceneryElement(mapCoord, mode, scenery, rotation, origin.z)) + auto [placementSuccess, newCost] = TrackDesignPlaceSceneryElement( + mapCoord, mode, scenery, rotation, origin.z, cost); + cost = newCost; + if (!placementSuccess) { - return 0; + return std::pair(false, cost); } } } - return 1; + return std::pair(true, cost); } -static int32_t track_design_place_maze(TrackDesign* td6, const CoordsXYZ& coords, Ride* ride) +static std::pair track_design_place_maze( + TrackDesign* td6, const CoordsXYZ& coords, Ride* ride, money32 totalCost) { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES) { @@ -1298,7 +1302,7 @@ static int32_t track_design_place_maze(TrackDesign* td6, const CoordsXYZ& coords } _trackDesignPlaceZ = 0; - _trackDesignPlaceCost = 0; + totalCost = 0; for (const auto& maze_element : td6->maze_elements) { @@ -1435,12 +1439,11 @@ static int32_t track_design_place_maze(TrackDesign* td6, const CoordsXYZ& coords break; } - _trackDesignPlaceCost += cost; + totalCost += cost; if (cost == MONEY32_UNDEFINED) { - _trackDesignPlaceCost = cost; - return 0; + return std::pair(false, MONEY32_UNDEFINED); } } @@ -1487,10 +1490,11 @@ static int32_t track_design_place_maze(TrackDesign* td6, const CoordsXYZ& coords } _trackPreviewOrigin = coords; - return 1; + return std::pair(true, totalCost); } -static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, Ride* ride) +static std::pair track_design_place_ride( + TrackDesign* td6, const CoordsXYZ& origin, Ride* ride, money32 totalCost) { _trackPreviewOrigin = origin; if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES) @@ -1501,7 +1505,7 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R } _trackDesignPlaceZ = 0; - _trackDesignPlaceCost = 0; + totalCost = 0; uint8_t rotation = _currentTrackPieceDirection; // Track elements @@ -1587,11 +1591,10 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R : GameActions::QueryNested(&trackPlaceAction); money32 cost = res->Error == GameActions::Status::Ok ? res->Cost : MONEY32_UNDEFINED; - _trackDesignPlaceCost += cost; + totalCost += cost; if (cost == MONEY32_UNDEFINED) { - _trackDesignPlaceCost = cost; - return false; + return std::pair(false, MONEY32_UNDEFINED); } break; } @@ -1609,7 +1612,7 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R auto surfaceElement = map_get_surface_element_at(tile); if (surfaceElement == nullptr) { - return false; + return std::pair(false, MONEY32_UNDEFINED); } int32_t surfaceZ = surfaceElement->GetBaseZ(); @@ -1682,8 +1685,7 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R newCoords.z += entrance.z; if (tile_element == nullptr) { - _trackDesignPlaceCost = MONEY32_UNDEFINED; - return false; + return std::pair(false, MONEY32_UNDEFINED); } do @@ -1724,12 +1726,11 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R auto res = flags & GAME_COMMAND_FLAG_APPLY ? GameActions::ExecuteNested(&rideEntranceExitPlaceAction) : GameActions::QueryNested(&rideEntranceExitPlaceAction); - _trackDesignPlaceCost += res->Cost; + totalCost += res->Cost; if (res->Error != GameActions::Status::Ok) { - _trackDesignPlaceCost = MONEY32_UNDEFINED; - return false; + return std::pair(false, MONEY32_UNDEFINED); } _trackDesignPlaceStateEntranceExitPlaced = true; break; @@ -1743,12 +1744,11 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R auto res = RideEntranceExitPlaceAction::TrackPlaceQuery(newCoords, false); if (res->Error != GameActions::Status::Ok) { - _trackDesignPlaceCost = MONEY32_UNDEFINED; - return false; + return std::pair(false, MONEY32_UNDEFINED); } else { - _trackDesignPlaceCost += res->Cost; + totalCost += res->Cost; _trackDesignPlaceStateEntranceExitPlaced = true; } } @@ -1762,7 +1762,7 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R sub_6CB945(ride); ride->Delete(); } - return true; + return std::pair(true, totalCost); } /** @@ -1778,7 +1778,7 @@ static bool track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, R * bl == 6, Clear white outlined track. * rct2: 0x006D01B3 */ -int32_t place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeScenery, Ride* ride, const CoordsXYZ& coords) +money32 place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeScenery, Ride* ride, const CoordsXYZ& coords) { // Previously byte_F4414E was cleared here _trackDesignPlaceStatePlaceScenery = placeScenery; @@ -1799,22 +1799,26 @@ int32_t place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeSc _trackPreviewMax = coords; _trackDesignPlaceSceneryZ = 0; - uint8_t track_place_success = 0; + bool trackPlaceSuccess = false; + money32 trackPlaceCost = 0; if (td6->type == RIDE_TYPE_MAZE) { - track_place_success = track_design_place_maze(td6, coords, ride); + std::tie(trackPlaceSuccess, trackPlaceCost) = track_design_place_maze(td6, coords, ride, trackPlaceCost); } else { - track_place_success = track_design_place_ride(td6, coords, ride); + std::tie(trackPlaceSuccess, trackPlaceCost) = track_design_place_ride(td6, coords, ride, trackPlaceCost); } // Scenery elements - if (track_place_success) + if (trackPlaceSuccess) { - if (!track_design_place_all_scenery(td6->scenery_elements, _trackPreviewOrigin)) + bool success = false; + std::tie(success, trackPlaceCost) = track_design_place_all_scenery( + td6->scenery_elements, _trackPreviewOrigin, trackPlaceCost); + if (!success) { - return _trackDesignPlaceCost; + return MONEY32_UNDEFINED; } } @@ -1833,7 +1837,7 @@ int32_t place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeSc // from _trackDesignPlaceZ, causing bug #259. return _trackDesignPlaceZ - _trackDesignPlaceSceneryZ; } - return _trackDesignPlaceCost; + return trackPlaceCost; } static money32 track_design_ride_create_command(int32_t type, int32_t subType, int32_t flags, ride_id_t* outRideIndex) diff --git a/src/openrct2/ride/TrackDesign.h b/src/openrct2/ride/TrackDesign.h index 68587c8c34..e7da3a3328 100644 --- a/src/openrct2/ride/TrackDesign.h +++ b/src/openrct2/ride/TrackDesign.h @@ -204,7 +204,7 @@ std::unique_ptr track_design_open(const utf8* path); void track_design_mirror(TrackDesign* td6); -int32_t place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeScenery, Ride* ride, const CoordsXYZ& coords); +money32 place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeScenery, Ride* ride, const CoordsXYZ& coords); /////////////////////////////////////////////////////////////////////////////// // Track design preview From c071b61d3ee5b25894ef4640db820e11f9d0e5fa Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Aug 2021 12:27:06 +0200 Subject: [PATCH 2/3] Use std::optional instead of std::pair --- src/openrct2/ride/TrackDesign.cpp | 106 ++++++++++++++++-------------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index add3914c5f..dbcbcf4b32 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -964,24 +964,30 @@ static bool TrackDesignPlaceSceneryElementGetPlaceZ(const TrackDesignSceneryElem return true; } -static std::pair TrackDesignPlaceSceneryElement( +static std::optional TrackDesignPlaceSceneryElement( CoordsXY mapCoord, uint8_t mode, const TrackDesignSceneryElement& scenery, uint8_t rotation, int32_t originZ, money32 totalCost) { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES && mode == 0) { track_design_add_selection_tile(mapCoord); - return std::pair(true, totalCost); + return totalCost; } if (_trackDesignPlaceOperation == PTD_OPERATION_REMOVE_GHOST && mode == 0) { - return std::pair(TrackDesignPlaceSceneryElementRemoveGhost(mapCoord, scenery, rotation, originZ), totalCost); + if (TrackDesignPlaceSceneryElementRemoveGhost(mapCoord, scenery, rotation, originZ)) + return totalCost; + + return std::nullopt; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return std::pair(TrackDesignPlaceSceneryElementGetPlaceZ(scenery), totalCost); + if (TrackDesignPlaceSceneryElementGetPlaceZ(scenery)) + return totalCost; + + return std::nullopt; } if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY || _trackDesignPlaceOperation == PTD_OPERATION_PLACE @@ -992,7 +998,7 @@ static std::pair TrackDesignPlaceSceneryElement( ObjectEntryIndex entry_index; if (TrackDesignPlaceSceneryElementGetEntry(entry_type, entry_index, scenery)) { - return std::pair(true, totalCost); + return totalCost; } money32 cost; @@ -1006,11 +1012,11 @@ static std::pair TrackDesignPlaceSceneryElement( { if (mode != 0) { - return std::pair(true, totalCost); + return totalCost; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return std::pair(true, totalCost); + return totalCost; } rotation += scenery.flags; @@ -1054,11 +1060,11 @@ static std::pair TrackDesignPlaceSceneryElement( { if (mode != 0) { - return std::pair(true, totalCost); + return totalCost; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return std::pair(true, totalCost); + return totalCost; } rotation += scenery.flags; @@ -1098,11 +1104,11 @@ static std::pair TrackDesignPlaceSceneryElement( { if (mode != 0) { - return std::pair(true, totalCost); + return totalCost; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return std::pair(true, totalCost); + return totalCost; } z = scenery.z * COORDS_Z_STEP + originZ; @@ -1141,7 +1147,7 @@ static std::pair TrackDesignPlaceSceneryElement( case ObjectType::Paths: if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return std::pair(true, totalCost); + return totalCost; } z = (scenery.z * COORDS_Z_STEP + originZ) / COORDS_Z_STEP; @@ -1193,14 +1199,14 @@ static std::pair TrackDesignPlaceSceneryElement( { if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY) { - return std::pair(true, totalCost); + return totalCost; } auto* pathElement = map_get_path_element_at({ mapCoord.x / 32, mapCoord.y / 32, z }); if (pathElement == nullptr) { - return std::pair(true, totalCost); + return totalCost; } footpath_queue_chain_reset(); @@ -1222,12 +1228,12 @@ static std::pair TrackDesignPlaceSceneryElement( } footpath_connect_edges(mapCoord, reinterpret_cast(pathElement), flags); footpath_update_queue_chains(); - return std::pair(true, totalCost); + return totalCost; } break; default: _trackDesignPlaceStateSceneryUnavailable = true; - return std::pair(true, totalCost); + return totalCost; } totalCost = add_clamp_money32(totalCost, cost); if (_trackDesignPlaceOperation != PTD_OPERATION_PLACE) @@ -1239,22 +1245,22 @@ static std::pair TrackDesignPlaceSceneryElement( } if (totalCost != MONEY32_UNDEFINED) { - return std::pair(true, totalCost); + return totalCost; } if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE) { - return std::pair(true, totalCost); + return totalCost; } - return std::pair(false, totalCost); + return std::nullopt; } - return std::pair(true, totalCost); + return totalCost; } /** * * rct2: 0x006D0964 */ -static std::pair track_design_place_all_scenery( +static std::optional track_design_place_all_scenery( const std::vector& sceneryList, const CoordsXYZ& origin, money32 cost) { for (uint8_t mode = 0; mode <= 1; mode++) @@ -1279,20 +1285,18 @@ static std::pair track_design_place_all_scenery( auto mapCoord = CoordsXYZ{ tileCoords.ToCoordsXY(), origin.z }; track_design_update_max_min_coordinates(mapCoord); - auto [placementSuccess, newCost] = TrackDesignPlaceSceneryElement( - mapCoord, mode, scenery, rotation, origin.z, cost); - cost = newCost; - if (!placementSuccess) + auto placementCost = TrackDesignPlaceSceneryElement(mapCoord, mode, scenery, rotation, origin.z, cost); + if (!placementCost.has_value() || placementCost == MONEY32_UNDEFINED) { - return std::pair(false, cost); + return std::nullopt; } + cost = placementCost.value(); } } - return std::pair(true, cost); + return cost; } -static std::pair track_design_place_maze( - TrackDesign* td6, const CoordsXYZ& coords, Ride* ride, money32 totalCost) +static std::optional track_design_place_maze(TrackDesign* td6, const CoordsXYZ& coords, Ride* ride) { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES) { @@ -1302,7 +1306,7 @@ static std::pair track_design_place_maze( } _trackDesignPlaceZ = 0; - totalCost = 0; + money32 totalCost = 0; for (const auto& maze_element : td6->maze_elements) { @@ -1443,7 +1447,7 @@ static std::pair track_design_place_maze( if (cost == MONEY32_UNDEFINED) { - return std::pair(false, MONEY32_UNDEFINED); + return std::nullopt; } } @@ -1490,11 +1494,10 @@ static std::pair track_design_place_maze( } _trackPreviewOrigin = coords; - return std::pair(true, totalCost); + return totalCost; } -static std::pair track_design_place_ride( - TrackDesign* td6, const CoordsXYZ& origin, Ride* ride, money32 totalCost) +static std::optional track_design_place_ride(TrackDesign* td6, const CoordsXYZ& origin, Ride* ride) { _trackPreviewOrigin = origin; if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES) @@ -1505,7 +1508,7 @@ static std::pair track_design_place_ride( } _trackDesignPlaceZ = 0; - totalCost = 0; + money32 totalCost = 0; uint8_t rotation = _currentTrackPieceDirection; // Track elements @@ -1594,7 +1597,7 @@ static std::pair track_design_place_ride( totalCost += cost; if (cost == MONEY32_UNDEFINED) { - return std::pair(false, MONEY32_UNDEFINED); + return std::nullopt; } break; } @@ -1612,7 +1615,7 @@ static std::pair track_design_place_ride( auto surfaceElement = map_get_surface_element_at(tile); if (surfaceElement == nullptr) { - return std::pair(false, MONEY32_UNDEFINED); + return std::nullopt; } int32_t surfaceZ = surfaceElement->GetBaseZ(); @@ -1685,7 +1688,7 @@ static std::pair track_design_place_ride( newCoords.z += entrance.z; if (tile_element == nullptr) { - return std::pair(false, MONEY32_UNDEFINED); + return std::nullopt; } do @@ -1730,7 +1733,7 @@ static std::pair track_design_place_ride( if (res->Error != GameActions::Status::Ok) { - return std::pair(false, MONEY32_UNDEFINED); + return std::nullopt; } _trackDesignPlaceStateEntranceExitPlaced = true; break; @@ -1744,7 +1747,7 @@ static std::pair track_design_place_ride( auto res = RideEntranceExitPlaceAction::TrackPlaceQuery(newCoords, false); if (res->Error != GameActions::Status::Ok) { - return std::pair(false, MONEY32_UNDEFINED); + return std::nullopt; } else { @@ -1762,7 +1765,7 @@ static std::pair track_design_place_ride( sub_6CB945(ride); ride->Delete(); } - return std::pair(true, totalCost); + return totalCost; } /** @@ -1799,27 +1802,27 @@ money32 place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeSc _trackPreviewMax = coords; _trackDesignPlaceSceneryZ = 0; - bool trackPlaceSuccess = false; - money32 trackPlaceCost = 0; + std::optional trackPlaceCost; if (td6->type == RIDE_TYPE_MAZE) { - std::tie(trackPlaceSuccess, trackPlaceCost) = track_design_place_maze(td6, coords, ride, trackPlaceCost); + trackPlaceCost = track_design_place_maze(td6, coords, ride); } else { - std::tie(trackPlaceSuccess, trackPlaceCost) = track_design_place_ride(td6, coords, ride, trackPlaceCost); + trackPlaceCost = track_design_place_ride(td6, coords, ride); } // Scenery elements - if (trackPlaceSuccess) + if (trackPlaceCost.has_value()) { - bool success = false; - std::tie(success, trackPlaceCost) = track_design_place_all_scenery( - td6->scenery_elements, _trackPreviewOrigin, trackPlaceCost); - if (!success) + auto trackPlusSceneryCost = track_design_place_all_scenery( + td6->scenery_elements, _trackPreviewOrigin, trackPlaceCost.value()); + if (!trackPlusSceneryCost.has_value()) { return MONEY32_UNDEFINED; } + + trackPlaceCost = trackPlusSceneryCost; } // 0x6D0FE6 @@ -1837,7 +1840,8 @@ money32 place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeSc // from _trackDesignPlaceZ, causing bug #259. return _trackDesignPlaceZ - _trackDesignPlaceSceneryZ; } - return trackPlaceCost; + + return trackPlaceCost.has_value() ? trackPlaceCost.value() : MONEY32_UNDEFINED; } static money32 track_design_ride_create_command(int32_t type, int32_t subType, int32_t flags, ride_id_t* outRideIndex) From 33b0963f5362920b1a247a85f06534d62aef0fba Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 15 Aug 2021 13:39:04 +0200 Subject: [PATCH 3/3] Move scenery cost addition to the caller --- src/openrct2/ride/TrackDesign.cpp | 50 ++++++++++++++++--------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index dbcbcf4b32..6c8c745329 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -965,19 +965,18 @@ static bool TrackDesignPlaceSceneryElementGetPlaceZ(const TrackDesignSceneryElem } static std::optional TrackDesignPlaceSceneryElement( - CoordsXY mapCoord, uint8_t mode, const TrackDesignSceneryElement& scenery, uint8_t rotation, int32_t originZ, - money32 totalCost) + CoordsXY mapCoord, uint8_t mode, const TrackDesignSceneryElement& scenery, uint8_t rotation, int32_t originZ) { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES && mode == 0) { track_design_add_selection_tile(mapCoord); - return totalCost; + return 0; } if (_trackDesignPlaceOperation == PTD_OPERATION_REMOVE_GHOST && mode == 0) { if (TrackDesignPlaceSceneryElementRemoveGhost(mapCoord, scenery, rotation, originZ)) - return totalCost; + return 0; return std::nullopt; } @@ -985,11 +984,12 @@ static std::optional TrackDesignPlaceSceneryElement( if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { if (TrackDesignPlaceSceneryElementGetPlaceZ(scenery)) - return totalCost; + return 0; return std::nullopt; } + money32 totalCost = 0; if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY || _trackDesignPlaceOperation == PTD_OPERATION_PLACE || _trackDesignPlaceOperation == PTD_OPERATION_PLACE_GHOST || _trackDesignPlaceOperation == PTD_OPERATION_PLACE_TRACK_PREVIEW) @@ -998,7 +998,7 @@ static std::optional TrackDesignPlaceSceneryElement( ObjectEntryIndex entry_index; if (TrackDesignPlaceSceneryElementGetEntry(entry_type, entry_index, scenery)) { - return totalCost; + return 0; } money32 cost; @@ -1012,11 +1012,11 @@ static std::optional TrackDesignPlaceSceneryElement( { if (mode != 0) { - return totalCost; + return 0; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return totalCost; + return 0; } rotation += scenery.flags; @@ -1060,11 +1060,11 @@ static std::optional TrackDesignPlaceSceneryElement( { if (mode != 0) { - return totalCost; + return 0; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return totalCost; + return 0; } rotation += scenery.flags; @@ -1104,11 +1104,11 @@ static std::optional TrackDesignPlaceSceneryElement( { if (mode != 0) { - return totalCost; + return 0; } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return totalCost; + return 0; } z = scenery.z * COORDS_Z_STEP + originZ; @@ -1147,7 +1147,7 @@ static std::optional TrackDesignPlaceSceneryElement( case ObjectType::Paths: if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return totalCost; + return 0; } z = (scenery.z * COORDS_Z_STEP + originZ) / COORDS_Z_STEP; @@ -1199,14 +1199,14 @@ static std::optional TrackDesignPlaceSceneryElement( { if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY) { - return totalCost; + return 0; } auto* pathElement = map_get_path_element_at({ mapCoord.x / 32, mapCoord.y / 32, z }); if (pathElement == nullptr) { - return totalCost; + return 0; } footpath_queue_chain_reset(); @@ -1228,12 +1228,12 @@ static std::optional TrackDesignPlaceSceneryElement( } footpath_connect_edges(mapCoord, reinterpret_cast(pathElement), flags); footpath_update_queue_chains(); - return totalCost; + return 0; } break; default: _trackDesignPlaceStateSceneryUnavailable = true; - return totalCost; + return 0; } totalCost = add_clamp_money32(totalCost, cost); if (_trackDesignPlaceOperation != PTD_OPERATION_PLACE) @@ -1261,8 +1261,10 @@ static std::optional TrackDesignPlaceSceneryElement( * rct2: 0x006D0964 */ static std::optional track_design_place_all_scenery( - const std::vector& sceneryList, const CoordsXYZ& origin, money32 cost) + const std::vector& sceneryList, const CoordsXYZ& origin) { + money32 cost = 0; + for (uint8_t mode = 0; mode <= 1; mode++) { if (!sceneryList.empty()) @@ -1285,14 +1287,15 @@ static std::optional track_design_place_all_scenery( auto mapCoord = CoordsXYZ{ tileCoords.ToCoordsXY(), origin.z }; track_design_update_max_min_coordinates(mapCoord); - auto placementCost = TrackDesignPlaceSceneryElement(mapCoord, mode, scenery, rotation, origin.z, cost); + auto placementCost = TrackDesignPlaceSceneryElement(mapCoord, mode, scenery, rotation, origin.z); if (!placementCost.has_value() || placementCost == MONEY32_UNDEFINED) { return std::nullopt; } - cost = placementCost.value(); + cost += placementCost.value(); } } + return cost; } @@ -1815,14 +1818,13 @@ money32 place_virtual_track(TrackDesign* td6, uint8_t ptdOperation, bool placeSc // Scenery elements if (trackPlaceCost.has_value()) { - auto trackPlusSceneryCost = track_design_place_all_scenery( - td6->scenery_elements, _trackPreviewOrigin, trackPlaceCost.value()); - if (!trackPlusSceneryCost.has_value()) + auto sceneryCost = track_design_place_all_scenery(td6->scenery_elements, _trackPreviewOrigin); + if (!sceneryCost.has_value()) { return MONEY32_UNDEFINED; } - trackPlaceCost = trackPlusSceneryCost; + trackPlaceCost = trackPlaceCost.value() + sceneryCost.value(); } // 0x6D0FE6