1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Refactor TrackPlaceAction so block brake logic only runs once (#18777)

* move block brake incrementation out of trackblock loop

* add comment to new code block
This commit is contained in:
spacek531
2023-01-25 13:09:36 -08:00
committed by GitHub
parent c260a95abc
commit 9844532112

View File

@@ -441,6 +441,8 @@ GameActions::Result TrackPlaceAction::Execute() const
money32 costs = 0;
money64 supportCosts = 0;
const PreviewTrack* trackBlock = ted.Block;
CoordsXYZ originLocation = CoordsXYZ{ _origin.x, _origin.y, _origin.z }
+ CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(_origin.direction), trackBlock->z };
for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++)
{
auto rotatedTrack = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(_origin.direction), trackBlock->z };
@@ -525,60 +527,6 @@ GameActions::Result TrackPlaceAction::Execute() const
supportCosts += (supportHeight / (2 * COORDS_Z_STEP)) * ride->GetRideTypeDescriptor().BuildCosts.SupportPrice;
if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST))
{
InvalidateTestResults(*ride);
switch (_trackType)
{
case TrackElemType::OnRidePhoto:
ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO;
break;
case TrackElemType::CableLiftHill:
if (trackBlock->index != 0)
break;
ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED;
ride->CableLiftLoc = mapLoc;
break;
case TrackElemType::BlockBrakes:
{
ride->num_block_brakes++;
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING;
// change the current mode to its circuit blocked equivalent
RideMode newMode = RideMode::ContinuousCircuitBlockSectioned;
if (ride->mode == RideMode::PoweredLaunch)
{
if (ride->GetRideTypeDescriptor().SupportsRideMode(RideMode::PoweredLaunchBlockSectioned)
|| gCheatsShowAllOperatingModes)
newMode = RideMode::PoweredLaunchBlockSectioned;
else
newMode = RideMode::PoweredLaunch;
}
auto rideSetSetting = RideSetSettingAction(ride->id, RideSetSetting::Mode, static_cast<uint8_t>(newMode));
GameActions::ExecuteNested(&rideSetSetting);
break;
}
}
if (trackBlock->index == 0)
{
switch (_trackType)
{
case TrackElemType::Up25ToFlat:
case TrackElemType::Up60ToFlat:
case TrackElemType::DiagUp25ToFlat:
case TrackElemType::DiagUp60ToFlat:
if (!(_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED))
break;
[[fallthrough]];
case TrackElemType::CableLiftHill:
ride->num_block_brakes++;
break;
}
}
}
int32_t entranceDirections = 0;
if (!ride->overall_view.IsNull())
{
@@ -701,6 +649,56 @@ GameActions::Result TrackPlaceAction::Execute() const
MapInvalidateTileFull(mapLoc);
}
// Update ride stats and block brake count if the piece was successfully built
if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST))
{
InvalidateTestResults(*ride);
switch (_trackType)
{
case TrackElemType::OnRidePhoto:
ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO;
break;
case TrackElemType::CableLiftHill:
ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED;
ride->CableLiftLoc = originLocation;
break;
case TrackElemType::BlockBrakes:
{
ride->num_block_brakes++;
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING;
// change the current mode to its circuit blocked equivalent
RideMode newMode = RideMode::ContinuousCircuitBlockSectioned;
if (ride->mode == RideMode::PoweredLaunch)
{
if (ride->GetRideTypeDescriptor().SupportsRideMode(RideMode::PoweredLaunchBlockSectioned)
|| gCheatsShowAllOperatingModes)
newMode = RideMode::PoweredLaunchBlockSectioned;
else
newMode = RideMode::PoweredLaunch;
}
auto rideSetSetting = RideSetSettingAction(ride->id, RideSetSetting::Mode, static_cast<uint8_t>(newMode));
GameActions::ExecuteNested(&rideSetSetting);
break;
}
}
switch (_trackType)
{
case TrackElemType::Up25ToFlat:
case TrackElemType::Up60ToFlat:
case TrackElemType::DiagUp25ToFlat:
case TrackElemType::DiagUp60ToFlat:
if (!(_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED))
break;
[[fallthrough]];
case TrackElemType::CableLiftHill:
ride->num_block_brakes++;
break;
}
}
money64 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice;
price *= ted.PriceModifier;