1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-21 05:53:02 +01:00

Merge pull request #22928 from Gymnasiast/refactor/mini-golf-goto

Clean up Mini Golf vehicle code
This commit is contained in:
Michael Steenbeek
2024-10-09 23:11:33 +02:00
committed by GitHub
2 changed files with 195 additions and 275 deletions

View File

@@ -7604,6 +7604,183 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
}
}
Vehicle::UpdateMiniGolfFlagsStatus Vehicle::UpdateTrackMotionMiniGolfFlagsStatus(const Ride& curRide)
{
if (var_D3 != 0)
{
var_D3--;
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
if (mini_golf_flags & MiniGolfFlag::Flag2)
{
uint8_t nextFrame = animation_frame + 1;
if (nextFrame < MiniGolfPeepAnimationLengths[EnumValue(mini_golf_current_animation)])
{
animation_frame = nextFrame;
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
mini_golf_flags &= ~MiniGolfFlag::Flag2;
}
if (mini_golf_flags & MiniGolfFlag::Flag0)
{
auto vehicleIdx = IsHead() ? next_vehicle_on_ride : prev_vehicle_on_ride;
Vehicle* vEDI = GetEntity<Vehicle>(vehicleIdx);
if (vEDI == nullptr)
{
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag0) || (vEDI->mini_golf_flags & MiniGolfFlag::Flag2))
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
if (vEDI->var_D3 != 0)
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
vEDI->mini_golf_flags &= ~MiniGolfFlag::Flag0;
mini_golf_flags &= ~MiniGolfFlag::Flag0;
}
if (mini_golf_flags & MiniGolfFlag::Flag1)
{
auto vehicleIdx = IsHead() ? next_vehicle_on_ride : prev_vehicle_on_ride;
Vehicle* vEDI = GetEntity<Vehicle>(vehicleIdx);
if (vEDI == nullptr)
{
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag1) || (vEDI->mini_golf_flags & MiniGolfFlag::Flag2))
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
if (vEDI->var_D3 != 0)
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
vEDI->mini_golf_flags &= ~MiniGolfFlag::Flag1;
mini_golf_flags &= ~MiniGolfFlag::Flag1;
}
if (mini_golf_flags & MiniGolfFlag::Flag3)
{
Vehicle* vEDI = this;
for (;;)
{
vEDI = GetEntity<Vehicle>(vEDI->prev_vehicle_on_ride);
if (vEDI == this || vEDI == nullptr)
{
break;
}
if (vEDI->IsHead())
continue;
if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag4))
continue;
if (vEDI->TrackLocation != TrackLocation)
continue;
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfFlagsStatus::stop;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfFlagsStatus::restart;
}
mini_golf_flags |= MiniGolfFlag::Flag4;
mini_golf_flags &= ~MiniGolfFlag::Flag3;
}
return Vehicle::UpdateMiniGolfFlagsStatus::carryOn;
}
/**
* rct2: 0x006DC3A7
*
@@ -7637,177 +7814,15 @@ void Vehicle::UpdateTrackMotionMiniGolfVehicle(const Ride& curRide, const RideOb
goto Loc6DCA9A;
Loc6DC462:
if (var_D3 != 0)
{
Vehicle::UpdateMiniGolfFlagsStatus flagsStatus = Vehicle::UpdateMiniGolfFlagsStatus::restart;
while (flagsStatus == Vehicle::UpdateMiniGolfFlagsStatus::restart)
{
var_D3--;
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
if (mini_golf_flags & MiniGolfFlag::Flag2)
{
uint8_t nextFrame = animation_frame + 1;
if (nextFrame < MiniGolfPeepAnimationLengths[EnumValue(mini_golf_current_animation)])
{
animation_frame = nextFrame;
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
mini_golf_flags &= ~MiniGolfFlag::Flag2;
}
if (mini_golf_flags & MiniGolfFlag::Flag0)
{
auto vehicleIdx = IsHead() ? next_vehicle_on_ride : prev_vehicle_on_ride;
Vehicle* vEDI = GetEntity<Vehicle>(vehicleIdx);
if (vEDI == nullptr)
{
return;
}
if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag0) || (vEDI->mini_golf_flags & MiniGolfFlag::Flag2))
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
if (vEDI->var_D3 != 0)
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
vEDI->mini_golf_flags &= ~MiniGolfFlag::Flag0;
mini_golf_flags &= ~MiniGolfFlag::Flag0;
}
if (mini_golf_flags & MiniGolfFlag::Flag1)
{
auto vehicleIdx = IsHead() ? next_vehicle_on_ride : prev_vehicle_on_ride;
Vehicle* vEDI = GetEntity<Vehicle>(vehicleIdx);
if (vEDI == nullptr)
{
return;
}
if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag1) || (vEDI->mini_golf_flags & MiniGolfFlag::Flag2))
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
if (vEDI->var_D3 != 0)
{
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
vEDI->mini_golf_flags &= ~MiniGolfFlag::Flag1;
mini_golf_flags &= ~MiniGolfFlag::Flag1;
}
if (mini_golf_flags & MiniGolfFlag::Flag3)
{
Vehicle* vEDI = this;
for (;;)
{
vEDI = GetEntity<Vehicle>(vEDI->prev_vehicle_on_ride);
if (vEDI == this || vEDI == nullptr)
{
break;
}
if (vEDI->IsHead())
continue;
if (!(vEDI->mini_golf_flags & MiniGolfFlag::Flag4))
continue;
if (vEDI->TrackLocation != TrackLocation)
continue;
remaining_distance -= 0x368A;
if (remaining_distance < 0)
{
remaining_distance = 0;
}
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
mini_golf_flags |= MiniGolfFlag::Flag4;
mini_golf_flags &= ~MiniGolfFlag::Flag3;
flagsStatus = UpdateTrackMotionMiniGolfFlagsStatus(curRide);
}
if (flagsStatus == UpdateMiniGolfFlagsStatus::stop)
return;
};
{
uint16_t trackTotalProgress = GetTrackProgress();
@@ -7824,10 +7839,6 @@ Loc6DC462:
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance + 1;
remaining_distance = -1;
if (remaining_distance >= 0)
{
Loc6DCDE4(curRide);
}
acceleration += AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DCA9A;
@@ -7837,7 +7848,7 @@ Loc6DC462:
direction = outDirection;
}
if (PitchAndRollStart(HasFlag(VehicleFlags::CarIsInverted), tileElement) != TrackPitchAndRollEnd(GetTrackType()))
if (PitchAndRollStart(false, tileElement) != TrackPitchAndRollEnd(GetTrackType()))
{
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance + 1;
@@ -7851,18 +7862,6 @@ Loc6DC462:
goto Loc6DCA9A;
}
{
int32_t rideType = ::GetRide(tileElement->AsTrack()->GetRideIndex())->type;
ClearFlag(VehicleFlags::CarIsInverted);
if (GetRideTypeDescriptor(rideType).HasFlag(RtdFlag::hasInvertedVariant))
{
if (tileElement->AsTrack()->IsInverted())
{
SetFlag(VehicleFlags::CarIsInverted);
}
}
}
TrackLocation = trackPos;
if (!IsHead())
@@ -8004,16 +8003,6 @@ Loc6DC462:
bank_rotation = moveInfo->bank_rotation;
Pitch = moveInfo->Pitch;
if (rideEntry.Cars[0].flags & CAR_ENTRY_FLAG_WOODEN_WILD_MOUSE_SWING)
{
if (Pitch != 0)
{
SwingSprite = 0;
SwingPosition = 0;
SwingSpeed = 0;
}
}
if (this == _vehicleFrontVehicle)
{
if (_vehicleVelocityF64E08 >= 0)
@@ -8042,10 +8031,6 @@ Loc6DCA9A:
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance + 1;
remaining_distance = -1;
if (remaining_distance >= 0)
{
Loc6DCDE4(curRide);
}
acceleration += AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DCA9A;
@@ -8055,33 +8040,16 @@ Loc6DCA9A:
tileElement = trackBeginEnd.begin_element;
}
if (PitchAndRollStart(HasFlag(VehicleFlags::CarIsInverted), tileElement) != TrackPitchAndRollEnd(GetTrackType()))
if (PitchAndRollStart(false, tileElement) != TrackPitchAndRollEnd(GetTrackType()))
{
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance - 0x368A;
remaining_distance = 0x368A;
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
}
{
int32_t rideType = ::GetRide(tileElement->AsTrack()->GetRideIndex())->type;
ClearFlag(VehicleFlags::CarIsInverted);
if (GetRideTypeDescriptor(rideType).HasFlag(RtdFlag::hasInvertedVariant))
{
if (tileElement->AsTrack()->IsInverted())
{
SetFlag(VehicleFlags::CarIsInverted);
}
}
}
TrackLocation = trackPos;
if (HasFlag(VehicleFlags::OnLiftHill))
@@ -8123,16 +8091,6 @@ Loc6DCA9A:
bank_rotation = moveInfo->bank_rotation;
Pitch = moveInfo->Pitch;
if (rideEntry.Cars[0].flags & CAR_ENTRY_FLAG_WOODEN_WILD_MOUSE_SWING)
{
if (Pitch != 0)
{
SwingSprite = 0;
SwingPosition = 0;
SwingSpeed = 0;
}
}
if (this == _vehicleFrontVehicle)
{
if (_vehicleVelocityF64E08 >= 0)
@@ -8151,20 +8109,12 @@ Loc6DCA9A:
Vehicle* vEDI = gCurrentVehicle;
if (abs(vEDI->velocity - vEBP->velocity) > 14.0_mph)
{
if (!(carEntry->flags & CAR_ENTRY_FLAG_BOAT_HIRE_COLLISION_DETECTION))
{
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_COLLISION;
}
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_COLLISION;
}
vEDI->velocity = vEBP->velocity >> 1;
vEBP->velocity = vEDI->velocity >> 1;
}
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_2;
if (remaining_distance < 0x368A)
{
Loc6DCDE4(curRide);
return;
}
acceleration = AccelerationFromPitch[Pitch];
_vehicleUnkF64E10++;
goto Loc6DC462;
@@ -8275,17 +8225,6 @@ int32_t Vehicle::UpdateTrackMotionMiniGolfCalculateAcceleration(const CarEntry&
newAcceleration -= velocity >> 12;
newAcceleration -= GetAccelerationDecrease2(velocity, totalMass);
if (!(carEntry.flags & CAR_ENTRY_FLAG_POWERED))
{
return newAcceleration;
}
if (carEntry.flags & CAR_ENTRY_FLAG_POWERED_RIDE_UNRESTRICTED_GRAVITY)
{
if (speed * 0x4000 < velocity)
{
return newAcceleration;
}
}
{
int32_t poweredAcceleration = speed << 14;
int32_t quarterForce = (speed * totalMass) >> 2;
@@ -8298,33 +8237,6 @@ int32_t Vehicle::UpdateTrackMotionMiniGolfCalculateAcceleration(const CarEntry&
if (quarterForce != 0)
poweredAcceleration /= quarterForce;
if (carEntry.flags & CAR_ENTRY_FLAG_WATER_RIDE)
{
if (poweredAcceleration < 0)
{
poweredAcceleration >>= 4;
}
if (carEntry.flags & CAR_ENTRY_FLAG_SPINNING)
{
spin_speed = std::clamp(spin_speed, VEHICLE_MIN_SPIN_SPEED_WATER_RIDE, VEHICLE_MAX_SPIN_SPEED_WATER_RIDE);
}
if (Pitch != 0)
{
poweredAcceleration = std::max(0, poweredAcceleration);
if (carEntry.flags & CAR_ENTRY_FLAG_SPINNING)
{
if (Pitch == 2)
{
spin_speed = 0;
}
}
newAcceleration += poweredAcceleration;
return newAcceleration;
}
}
if (abs(velocity) > 1.0_mph)
{
newAcceleration = 0;

View File

@@ -379,6 +379,14 @@ private:
void Loc6DCE02(const Ride& curRide);
void Loc6DCDE4(const Ride& curRide);
enum class UpdateMiniGolfFlagsStatus
{
carryOn,
restart,
stop,
};
UpdateMiniGolfFlagsStatus UpdateTrackMotionMiniGolfFlagsStatus(const Ride& curRide);
};
static_assert(sizeof(Vehicle) <= 512);