Skip to content

Commit

Permalink
Fix desync caused due to ghost tiles changing the ride mode
Browse files Browse the repository at this point in the history
  • Loading branch information
manuelVo committed Oct 26, 2020
1 parent c440dac commit e4e7a0f
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 59 deletions.
63 changes: 33 additions & 30 deletions src/openrct2/actions/TrackPlaceAction.hpp
Expand Up @@ -546,43 +546,46 @@ DEFINE_GAME_ACTION(TrackPlaceAction, GAME_COMMAND_PLACE_TRACK, TrackPlaceActionR

cost += ((supportHeight / (2 * COORDS_Z_STEP)) * RideTypeDescriptors[ride->type].BuildCosts.SupportPrice) * 5;

invalidate_test_results(ride);
switch (_trackType)
if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST))
{
case TrackElemType::OnRidePhoto:
ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO;
break;
case TrackElemType::CableLiftHill:
if (trackBlock->index != 0)
invalidate_test_results(ride);
switch (_trackType)
{
case TrackElemType::OnRidePhoto:
ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO;
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;
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;

ride->mode = RideMode::ContinuousCircuitBlockSectioned;
if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER)
ride->mode = RideMode::PoweredLaunchBlockSectioned;
ride->mode = RideMode::ContinuousCircuitBlockSectioned;
if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER)
ride->mode = RideMode::PoweredLaunchBlockSectioned;

break;
}
break;
}

if (trackBlock->index == 0)
{
switch (_trackType)
if (trackBlock->index == 0)
{
case TrackElemType::Up25ToFlat:
case TrackElemType::Up60ToFlat:
case TrackElemType::DiagUp25ToFlat:
case TrackElemType::DiagUp60ToFlat:
if (!(_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED))
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;
[[fallthrough]];
case TrackElemType::CableLiftHill:
ride->num_block_brakes++;
break;
}
}
}

Expand Down
61 changes: 32 additions & 29 deletions src/openrct2/actions/TrackRemoveAction.hpp
Expand Up @@ -457,40 +457,43 @@ DEFINE_GAME_ACTION(TrackRemoveAction, GAME_COMMAND_REMOVE_TRACK, GameActions::Re
}
}

switch (trackType)
if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST))
{
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;
break;
case TrackElemType::BlockBrakes:
ride->num_block_brakes--;
if (ride->num_block_brakes == 0)
{
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING;
ride->mode = RideMode::ContinuousCircuit;
if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER)
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;
break;
case TrackElemType::BlockBrakes:
ride->num_block_brakes--;
if (ride->num_block_brakes == 0)
{
ride->mode = RideMode::PoweredLaunch;
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING;
ride->mode = RideMode::ContinuousCircuit;
if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER)
{
ride->mode = RideMode::PoweredLaunch;
}
}
}
break;
}
break;
}

switch (trackType)
{
case TrackElemType::Up25ToFlat:
case TrackElemType::Up60ToFlat:
case TrackElemType::DiagUp25ToFlat:
case TrackElemType::DiagUp60ToFlat:
if (!isLiftHill)
switch (trackType)
{
case TrackElemType::Up25ToFlat:
case TrackElemType::Up60ToFlat:
case TrackElemType::DiagUp25ToFlat:
case TrackElemType::DiagUp60ToFlat:
if (!isLiftHill)
break;
[[fallthrough]];
case TrackElemType::CableLiftHill:
ride->num_block_brakes--;
break;
[[fallthrough]];
case TrackElemType::CableLiftHill:
ride->num_block_brakes--;
break;
}
}

money32 price = RideTypeDescriptors[ride->type].BuildCosts.TrackPrice;
Expand Down

0 comments on commit e4e7a0f

Please sign in to comment.