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

Merge pull request #25099 from spacek531/vehicle/rename-data-tables

Vehicle/rename data tables
This commit is contained in:
Michael Steenbeek
2025-10-21 22:03:27 +02:00
committed by GitHub
7 changed files with 408 additions and 292 deletions

View File

@@ -543,6 +543,7 @@
<ClInclude Include="ride\Vehicle.h" />
<ClInclude Include="ride\VehicleColour.h" />
<ClInclude Include="ride\VehicleData.h" />
<ClInclude Include="ride\VehicleGeometry.h" />
<ClInclude Include="ride\VehicleRiderControl.h" />
<ClInclude Include="ride\VehicleSubpositionData.h" />
<ClInclude Include="sawyer_coding\SawyerCoding.h" />
@@ -1092,6 +1093,7 @@
<ClCompile Include="ride\TrainManager.cpp" />
<ClCompile Include="ride\Vehicle.cpp" />
<ClCompile Include="ride\VehicleData.cpp" />
<ClCompile Include="ride\VehicleGeometry.cpp" />
<ClCompile Include="ride\VehicleRiderControl.cpp" />
<ClCompile Include="ride\VehicleSubpositionData.cpp" />
<ClCompile Include="sawyer_coding\SawyerCoding.cpp" />
@@ -1196,4 +1198,4 @@
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>
</Project>

View File

@@ -21,8 +21,10 @@
#include "Track.h"
#include "Vehicle.h"
#include "VehicleData.h"
#include "VehicleGeometry.h"
using namespace OpenRCT2;
using namespace OpenRCT2::RideVehicle;
Vehicle* CableLiftSegmentCreate(
Ride& ride, int32_t x, int32_t y, int32_t z, int32_t direction, uint16_t var_44, int32_t remaining_distance, bool head)
@@ -274,19 +276,10 @@ bool Vehicle::CableLiftUpdateTrackMotionForwards()
const auto moveInfo = GetMoveInfo();
auto nextVehiclePosition = CoordsXYZ{ moveInfo->x, moveInfo->y, moveInfo->z } + TrackLocation;
uint8_t remainingDistanceFlags = 0;
nextVehiclePosition.z += GetRideTypeDescriptor(curRide->type).Heights.VehicleZOffset;
if (nextVehiclePosition.x != _vehicleCurPosition.x)
remainingDistanceFlags |= (1 << 0);
if (nextVehiclePosition.y != _vehicleCurPosition.y)
remainingDistanceFlags |= (1 << 1);
if (nextVehiclePosition.z != _vehicleCurPosition.z)
remainingDistanceFlags |= (1 << 2);
remaining_distance -= SubpositionTranslationDistances[remainingDistanceFlags];
_vehicleCurPosition.x = nextVehiclePosition.x;
_vehicleCurPosition.y = nextVehiclePosition.y;
_vehicleCurPosition.z = nextVehiclePosition.z;
remaining_distance -= Geometry::getTranslationDistance(nextVehiclePosition - _vehicleCurPosition, false);
_vehicleCurPosition = nextVehiclePosition;
Orientation = moveInfo->direction;
roll = moveInfo->roll;
@@ -294,7 +287,7 @@ bool Vehicle::CableLiftUpdateTrackMotionForwards()
if (remaining_distance >= 13962)
{
acceleration += AccelerationFromPitch[EnumValue(pitch)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
}
}
return true;
@@ -341,29 +334,20 @@ bool Vehicle::CableLiftUpdateTrackMotionBackwards()
}
track_progress = trackProgress;
const auto moveInfo = GetMoveInfo();
auto unk = CoordsXYZ{ moveInfo->x, moveInfo->y, moveInfo->z } + TrackLocation;
auto nextVehiclePosition = CoordsXYZ{ moveInfo->x, moveInfo->y, moveInfo->z } + TrackLocation;
uint8_t remainingDistanceFlags = 0;
unk.z += GetRideTypeDescriptor(curRide->type).Heights.VehicleZOffset;
if (unk.x != _vehicleCurPosition.x)
remainingDistanceFlags |= (1 << 0);
if (unk.y != _vehicleCurPosition.y)
remainingDistanceFlags |= (1 << 1);
if (unk.z != _vehicleCurPosition.z)
remainingDistanceFlags |= (1 << 2);
nextVehiclePosition.z += GetRideTypeDescriptor(curRide->type).Heights.VehicleZOffset;
remaining_distance += SubpositionTranslationDistances[remainingDistanceFlags];
_vehicleCurPosition.x = unk.x;
_vehicleCurPosition.y = unk.y;
_vehicleCurPosition.z = unk.z;
remaining_distance += Geometry::getTranslationDistance(nextVehiclePosition - _vehicleCurPosition, false);
_vehicleCurPosition = nextVehiclePosition;
Orientation = moveInfo->direction;
roll = moveInfo->roll;
pitch = moveInfo->pitch;
if (remaining_distance < 0)
{
acceleration += AccelerationFromPitch[EnumValue(pitch)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
}
}
return true;
@@ -394,7 +378,7 @@ int32_t Vehicle::CableLiftUpdateTrackMotion()
for (Vehicle* vehicle = frontVehicle; vehicle != nullptr;)
{
vehicle->acceleration = AccelerationFromPitch[EnumValue(vehicle->pitch)];
vehicle->acceleration = Geometry::getAccelerationFromPitch(vehicle->pitch);
_vehicleUnkF64E10 = 1;
vehicle->remaining_distance += _vehicleVelocityF64E0C;
@@ -415,7 +399,7 @@ int32_t Vehicle::CableLiftUpdateTrackMotion()
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= vehicle->remaining_distance - 13962;
vehicle->remaining_distance = 13962;
vehicle->acceleration += AccelerationFromPitch[EnumValue(vehicle->pitch)];
vehicle->acceleration += Geometry::getAccelerationFromPitch(vehicle->pitch);
_vehicleUnkF64E10++;
continue;
}
@@ -428,7 +412,7 @@ int32_t Vehicle::CableLiftUpdateTrackMotion()
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= vehicle->remaining_distance + 1;
vehicle->remaining_distance = -1;
vehicle->acceleration += AccelerationFromPitch[EnumValue(vehicle->pitch)];
vehicle->acceleration += Geometry::getAccelerationFromPitch(vehicle->pitch);
_vehicleUnkF64E10++;
}
vehicle->MoveTo(_vehicleCurPosition);

View File

@@ -62,6 +62,7 @@
#include "TrackData.h"
#include "TrainManager.h"
#include "VehicleData.h"
#include "VehicleGeometry.h"
#include "VehicleSubpositionData.h"
#include <cassert>
@@ -71,6 +72,7 @@ using namespace OpenRCT2;
using namespace OpenRCT2::Audio;
using namespace OpenRCT2::TrackMetaData;
using namespace OpenRCT2::Math::Trigonometry;
using namespace OpenRCT2::RideVehicle;
static bool vehicle_boat_is_location_accessible(const CoordsXYZ& location);
constexpr int16_t kVehicleMaxSpinSpeed = 1536;
@@ -378,23 +380,6 @@ static constexpr const int8_t* SwingingTimeToSpriteMaps[] = {
kSwingingTimeToSpriteMap8, kSwingingTimeToSpriteMap9, kSwingingTimeToSpriteMap10, kSwingingTimeToSpriteMap11,
};
struct Unk9A36C4Struct
{
int16_t x;
int16_t y;
uint32_t distance;
};
/** rct2: 0x009A36C4 */
static constexpr Unk9A36C4Struct kUnk9A36C4[] = {
{ -1, 0, 8716 }, { -1, 0, 8716 }, { -1, 0, 8716 }, { -1, 1, 12327 }, { -1, 1, 12327 }, { -1, 1, 12327 },
{ 0, 1, 8716 }, { -1, 1, 12327 }, { 0, 1, 8716 }, { 0, 1, 8716 }, { 0, 1, 8716 }, { 1, 1, 12327 },
{ 1, 1, 12327 }, { 1, 1, 12327 }, { 1, 0, 8716 }, { 1, 1, 12327 }, { 1, 0, 8716 }, { 1, 0, 8716 },
{ 1, 0, 8716 }, { 1, -1, 12327 }, { 1, -1, 12327 }, { 1, -1, 12327 }, { 0, -1, 8716 }, { 1, -1, 12327 },
{ 0, -1, 8716 }, { 0, -1, 8716 }, { 0, -1, 8716 }, { -1, -1, 12327 }, { -1, -1, 12327 }, { -1, -1, 12327 },
{ -1, 0, 8716 }, { -1, -1, 12327 },
};
/** rct2: 0x009A37C4 */
static constexpr CoordsXY kSurroundingTiles[] = {
{ 0, 0 },
@@ -408,34 +393,6 @@ static constexpr CoordsXY kSurroundingTiles[] = {
{ 0, +kCoordsXYStep },
};
/** rct2: 0x009A37E4 */
static constexpr int32_t kUnk9A37E4[] = {
2147483647, 2106585154, 1985590284, 1636362342, 1127484953, 2106585154, 1985590284, 1636362342, 1127484953,
58579923, 0, -555809667, -1073741824, -1518500249, -1859775391, -2074309916, -2147483647, 58579923,
0, -555809667, -1073741824, -1518500249, -1859775391, -2074309916, 1859775393, 1073741824, 0,
-1073741824, -1859775393, 1859775393, 1073741824, 0, -1073741824, -1859775393, 1859775393, 1073741824,
0, -1073741824, -1859775393, 1859775393, 1073741824, 0, -1073741824, -1859775393, 2144540595,
2139311823, 2144540595, 2139311823, 2135719507, 2135719507, 2125953864, 2061796213, 1411702590, 2125953864,
2061796213, 1411702590, 1985590284, 1636362342, 1127484953, 2115506168, 2115506168,
};
/** rct2: 0x009A38D4 */
static constexpr int32_t kUnk9A38D4[] = {
0, 417115092, 817995863, 1390684831, 1827693544, -417115092, -817995863, -1390684831, -1827693544,
2066040965, 2147483647, 2074309916, 1859775393, 1518500249, 1073741824, 555809666, 0, -2066040965,
-2147483647, -2074309916, -1859775393, -1518500249, -1073741824, -555809666, 1073741824, 1859775393, 2147483647,
1859775393, 1073741824, -1073741824, -1859775393, -2147483647, -1859775393, -1073741824, 1073741824, 1859775393,
2147483647, 1859775393, 1073741824, -1073741824, -1859775393, -2147483647, -1859775393, -1073741824, 112390610,
187165532, -112390610, -187165532, 224473165, -224473165, 303325208, 600568389, 1618265062, -303325208,
-600568389, -1618265062, -817995863, -1390684831, -1827693544, 369214930, -369214930,
};
/** rct2: 0x009A39C4 */
static constexpr int32_t kUnk9A39C4[] = {
2147483647, 2096579710, 1946281152, 2096579710, 1946281152, 1380375879, 555809667, -372906620, -1231746017, -1859775391,
1380375879, 555809667, -372906620, -1231746017, -1859775391, 0, 2096579710, 1946281152, 2096579710, 1946281152,
};
static constexpr OpenRCT2::Audio::SoundId kDoorOpenSoundIds[] = {
OpenRCT2::Audio::SoundId::null, // DoorSoundType::none
OpenRCT2::Audio::SoundId::doorOpen, // DoorSoundType::door
@@ -2926,12 +2883,6 @@ void Vehicle::UpdateCollisionSetup()
velocity = 0;
}
/** rct2: 0x009A3AC4, 0x009A3AC6 */
static constexpr CoordsXY stru_9A3AC4[] = {
{ -256, 0 }, { -236, 98 }, { -181, 181 }, { -98, 236 }, { 0, 256 }, { 98, 236 }, { 181, 181 }, { 236, 98 },
{ 256, 0 }, { 236, -98 }, { 181, -181 }, { 98, -236 }, { 0, -256 }, { -98, -236 }, { -181, -181 }, { -236, -98 },
};
/**
*
* rct2: 0x006D9EFE
@@ -2965,11 +2916,14 @@ void Vehicle::UpdateCrashSetup()
lastVehicle = trainVehicle;
trainVehicle->sub_state = 0;
int32_t trainX = stru_9A3AC4[trainVehicle->Orientation / 2].x;
int32_t trainY = stru_9A3AC4[trainVehicle->Orientation / 2].y;
auto trainZ = kUnk9A38D4[EnumValue(trainVehicle->pitch)] >> 23;
auto crashDirection = Geometry::getCrashDirectionComponents(trainVehicle->Orientation);
int32_t trainX = crashDirection.x;
int32_t trainY = crashDirection.y;
int32_t ecx = kUnk9A37E4[EnumValue(trainVehicle->pitch)] >> 15;
auto carLaunchDirection = Geometry::getPitchVector32(trainVehicle->pitch);
auto trainZ = carLaunchDirection.y >> 23;
int32_t ecx = carLaunchDirection.x >> 15;
trainX *= ecx;
trainY *= ecx;
trainX >>= 16;
@@ -3790,7 +3744,7 @@ void Vehicle::UpdateMotionBoatHire()
}
int32_t edi = (Orientation | (var_35 & 1)) & 0x1F;
loc2 = { x + kUnk9A36C4[edi].x, y + kUnk9A36C4[edi].y };
loc2 = { x + Geometry::getFreeroamVehicleMovementData(edi).x, y + Geometry::getFreeroamVehicleMovementData(edi).y };
if (UpdateMotionCollisionDetection({ loc2, z }, nullptr))
{
remaining_distance = 0;
@@ -3888,7 +3842,7 @@ void Vehicle::UpdateMotionBoatHire()
TrackLocation = { flooredLocation, TrackLocation.z };
}
remaining_distance -= kUnk9A36C4[edi].distance;
remaining_distance -= Geometry::getFreeroamVehicleMovementData(edi).distance;
_vehicleCurPosition.x = loc2.x;
_vehicleCurPosition.y = loc2.y;
if (remaining_distance < 0x368A)
@@ -4963,7 +4917,7 @@ void Vehicle::UpdateSound()
sound2_volume = soundIdVolume.volume;
// Calculate Sound Vector (used for sound frequency calcs)
int32_t soundDirection = SpriteDirectionToSoundDirection[Orientation];
int32_t soundDirection = Geometry::getSoundDirectionFromOrientation(Orientation);
int32_t soundVector = ((velocity >> 14) * soundDirection) >> 14;
soundVector = std::clamp(soundVector, -127, 127);
@@ -5070,8 +5024,8 @@ OpenRCT2::Audio::SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps
*/
GForces Vehicle::GetGForces() const
{
int32_t gForceVert = ((static_cast<int64_t>(0x280000)) * kUnk9A37E4[EnumValue(pitch)]) >> 32;
gForceVert = ((static_cast<int64_t>(gForceVert)) * kUnk9A39C4[EnumValue(roll)]) >> 32;
int32_t gForceVert = ((static_cast<int64_t>(0x280000)) * Geometry::getPitchVector32(pitch).x) >> 32;
gForceVert = ((static_cast<int64_t>(gForceVert)) * Geometry::getRollHorizontalComponent(roll)) >> 32;
const auto& ted = GetTrackElementDescriptor(GetTrackType());
const int32_t vertFactor = ted.verticalFactor(track_progress);
@@ -5227,10 +5181,10 @@ int32_t Vehicle::UpdateMotionDodgems()
CoordsXYZ location = { x, y, z };
location.x += kUnk9A36C4[oldCollisionDirection].x;
location.y += kUnk9A36C4[oldCollisionDirection].y;
location.x += kUnk9A36C4[oldCollisionDirection + 1].x;
location.y += kUnk9A36C4[oldCollisionDirection + 1].y;
location.x += Geometry::getFreeroamVehicleMovementData(oldCollisionDirection).x;
location.y += Geometry::getFreeroamVehicleMovementData(oldCollisionDirection).y;
location.x += Geometry::getFreeroamVehicleMovementData(oldCollisionDirection + 1).x;
location.y += Geometry::getFreeroamVehicleMovementData(oldCollisionDirection + 1).y;
if (collideSprite = DodgemsCarWouldCollideAt(location); !collideSprite.has_value())
{
@@ -5254,15 +5208,15 @@ int32_t Vehicle::UpdateMotionDodgems()
direction |= var_35 & 1;
CoordsXY location = _vehicleCurPosition;
location.x += kUnk9A36C4[direction].x;
location.y += kUnk9A36C4[direction].y;
location.x += Geometry::getFreeroamVehicleMovementData(direction).x;
location.y += Geometry::getFreeroamVehicleMovementData(direction).y;
if (collideSprite = DodgemsCarWouldCollideAt(location); collideSprite.has_value())
{
break;
}
remaining_distance -= kUnk9A36C4[direction].distance;
remaining_distance -= Geometry::getFreeroamVehicleMovementData(direction).distance;
_vehicleCurPosition.x = location.x;
_vehicleCurPosition.y = location.y;
if (remaining_distance < 13962)
@@ -5420,7 +5374,7 @@ void Vehicle::UpdateTrackMotionUpStopCheck() const
gForces.LateralG = std::abs(gForces.LateralG);
if (gForces.LateralG <= 150)
{
if (AccelerationFromPitch[EnumValue(pitch)] < 0)
if (Geometry::getAccelerationFromPitch(pitch) < 0)
{
if (gForces.VerticalG > -40)
{
@@ -5446,7 +5400,7 @@ void Vehicle::UpdateTrackMotionUpStopCheck() const
{
auto gForces = GetGForces();
if (AccelerationFromPitch[EnumValue(pitch)] < 0)
if (Geometry::getAccelerationFromPitch(pitch) < 0)
{
if (gForces.VerticalG > -45)
{
@@ -7275,32 +7229,18 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu
// Loc6DB706
const auto moveInfo = GetMoveInfo();
trackType = GetTrackType();
uint8_t moveInfovehicleAnimationGroup;
{
auto nextVehiclePosition = TrackLocation
+ CoordsXYZ{ moveInfo->x, moveInfo->y,
moveInfo->z + GetRideTypeDescriptor(curRide.type).Heights.VehicleZOffset };
uint8_t remainingDistanceFlags = 0;
if (nextVehiclePosition.x != _vehicleCurPosition.x)
{
remainingDistanceFlags |= 1;
}
if (nextVehiclePosition.y != _vehicleCurPosition.y)
{
remainingDistanceFlags |= 2;
}
if (nextVehiclePosition.z != _vehicleCurPosition.z)
{
remainingDistanceFlags |= 4;
}
if (TrackSubposition == VehicleTrackSubposition::ReverserRCFrontBogie
bool useReverserDistance = TrackSubposition == VehicleTrackSubposition::ReverserRCFrontBogie
&& (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser)
&& track_progress >= 30 && track_progress <= 66)
{
remainingDistanceFlags |= 8;
}
&& track_progress >= 30 && track_progress <= 66;
// Loc6DB8A5
remaining_distance -= Geometry::getTranslationDistance(
nextVehiclePosition - _vehicleCurPosition, useReverserDistance);
if (TrackSubposition == VehicleTrackSubposition::ReverserRCRearBogie
&& (trackType == TrackElemType::LeftReverser || trackType == TrackElemType::RightReverser)
@@ -7313,15 +7253,11 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu
nextVehiclePosition.y = y + moveInfo2->y;
}
// Loc6DB8A5
remaining_distance -= SubpositionTranslationDistances[remainingDistanceFlags];
_vehicleCurPosition = nextVehiclePosition;
Orientation = moveInfo->direction;
roll = moveInfo->roll;
pitch = moveInfo->pitch;
moveInfovehicleAnimationGroup = EnumValue(moveInfo->pitch);
if ((carEntry->flags & CAR_ENTRY_FLAG_WOODEN_WILD_MOUSE_SWING) && moveInfo->pitch != VehiclePitch::flat)
{
SwingSprite = 0;
@@ -7385,7 +7321,7 @@ bool Vehicle::UpdateTrackMotionForwards(const CarEntry* carEntry, const Ride& cu
return true;
}
acceleration += AccelerationFromPitch[moveInfovehicleAnimationGroup];
acceleration += Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
}
}
@@ -7607,33 +7543,18 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
// Loc6DBD42
track_progress = newTrackProgress;
VehiclePitch moveInfoVehicleAnimationGroup;
{
const VehicleInfo* moveInfo = GetMoveInfo();
auto nextVehiclePosition = TrackLocation
+ CoordsXYZ{ moveInfo->x, moveInfo->y,
moveInfo->z + GetRideTypeDescriptor(curRide.type).Heights.VehicleZOffset };
uint8_t remainingDistanceFlags = 0;
if (nextVehiclePosition.x != _vehicleCurPosition.x)
{
remainingDistanceFlags |= 1;
}
if (nextVehiclePosition.y != _vehicleCurPosition.y)
{
remainingDistanceFlags |= 2;
}
if (nextVehiclePosition.z != _vehicleCurPosition.z)
{
remainingDistanceFlags |= 4;
}
remaining_distance += SubpositionTranslationDistances[remainingDistanceFlags];
remaining_distance += Geometry::getTranslationDistance(nextVehiclePosition - _vehicleCurPosition, false);
_vehicleCurPosition = nextVehiclePosition;
Orientation = moveInfo->direction;
roll = moveInfo->roll;
pitch = moveInfo->pitch;
moveInfoVehicleAnimationGroup = moveInfo->pitch;
if ((carEntry->flags & CAR_ENTRY_FLAG_WOODEN_WILD_MOUSE_SWING) && pitch != VehiclePitch::flat)
{
@@ -7694,7 +7615,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
{
return true;
}
acceleration += AccelerationFromPitch[EnumValue(moveInfoVehicleAnimationGroup)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
}
}
@@ -7715,7 +7636,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7737,7 +7658,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7765,7 +7686,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7782,7 +7703,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7811,7 +7732,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7828,7 +7749,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7864,7 +7785,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return Vehicle::UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -7903,7 +7824,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance + 1;
remaining_distance = -1;
acceleration += AccelerationFromPitch[EnumValue(pitch)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return UpdateMiniGolfSubroutineStatus::carryOn;
}
@@ -7920,7 +7841,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
{
Loc6DCDE4(curRide);
}
acceleration += AccelerationFromPitch[EnumValue(pitch)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return UpdateMiniGolfSubroutineStatus::carryOn;
}
@@ -8078,7 +7999,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return UpdateMiniGolfSubroutineStatus::stop;
}
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
}
}
@@ -8096,7 +8017,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance + 1;
remaining_distance = -1;
acceleration += AccelerationFromPitch[EnumValue(pitch)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
continue;
}
@@ -8109,7 +8030,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_5;
_vehicleVelocityF64E0C -= remaining_distance - 0x368A;
remaining_distance = 0x368A;
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return Vehicle::UpdateMiniGolfSubroutineStatus::restart;
}
@@ -8179,7 +8100,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
vEBP->velocity = vEDI->velocity >> 1;
}
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_2;
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
return UpdateMiniGolfSubroutineStatus::restart;
}
@@ -8191,7 +8112,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
Loc6DCDE4(curRide);
return UpdateMiniGolfSubroutineStatus::stop;
}
acceleration += AccelerationFromPitch[EnumValue(pitch)];
acceleration += Geometry::getAccelerationFromPitch(pitch);
_vehicleUnkF64E10++;
}
}
@@ -8205,7 +8126,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c
void Vehicle::UpdateTrackMotionMiniGolfVehicle(const Ride& curRide, const RideObjectEntry& rideEntry, const CarEntry* carEntry)
{
_vehicleUnkF64E10 = 1;
acceleration = AccelerationFromPitch[EnumValue(pitch)];
acceleration = Geometry::getAccelerationFromPitch(pitch);
if (!HasFlag(VehicleFlags::MoveSingleCar))
{
remaining_distance = _vehicleVelocityF64E0C + remaining_distance;
@@ -8531,7 +8452,7 @@ void Vehicle::UpdateTrackMotionPreUpdate(
{
car.UpdateAdditionalAnimation();
}
car.acceleration = AccelerationFromPitch[EnumValue(car.pitch)];
car.acceleration = Geometry::getAccelerationFromPitch(car.pitch);
_vehicleUnkF64E10 = 1;
if (!car.HasFlag(VehicleFlags::MoveSingleCar))
@@ -8559,7 +8480,7 @@ void Vehicle::UpdateTrackMotionPreUpdate(
{
break;
}
car.acceleration += AccelerationFromPitch[EnumValue(car.pitch)];
car.acceleration += Geometry::getAccelerationFromPitch(car.pitch);
_vehicleUnkF64E10++;
continue;
}
@@ -8577,7 +8498,7 @@ void Vehicle::UpdateTrackMotionPreUpdate(
{
break;
}
car.acceleration = AccelerationFromPitch[EnumValue(car.pitch)];
car.acceleration = Geometry::getAccelerationFromPitch(car.pitch);
_vehicleUnkF64E10++;
continue;
}

View File

@@ -794,132 +794,4 @@ const uint8_t MotionSimulatorTimeToSpriteMap[] = {
};
const int32_t MotionSimulatorTimeToSpriteMapCount = static_cast<int32_t>(std::size(MotionSimulatorTimeToSpriteMap));
/** rct2: 0x009A2930
The distance between subposition points in a movement direction (but not distance).
*/
const int32_t SubpositionTranslationDistances[] = {
// For a base length of 8716 (0x220C) on the horizontal and 6554 (0x199A) on the vertical,
// use the Pythagoras theorem and round up.
0, // no movement
8716, // X translation
8716, // Y translation
12327, // XY translation
6554, // Z translation
10905, // XZ translation
10905, // YZ translation
13961, // XYZ translation
// For the reverser car, multiply the horizontal distance by 2.5 and the vertical distance by 4.072.
0, // no movement
21790, // X translation
21790, // Y translation
30817, // Z translation
16385, // XY translation
27262, // XZ translation
27262, // YZ translation
34902, // XYZ translation
};
/** rct2: 0x009A2970 */
const int32_t AccelerationFromPitch[] = {
0, // Flat
// The geometric angle of slopes 12.5 and 25 are actually 11.1 and 22.2 respectively.
-124548, // 1 Slope Up 12.5
-243318, // 2 Slope Up 25
-416016, // 3 Slope Up 42.5
-546342, // 4 Slope Up 60
124548, // 5 Slope Down 12.5
243318, // 6 Slope Down 25
416016, // 7 Slope Down 42.5
546342, // 8 Slope Down 60
-617604, // 9 Slope Up 75
-642000, // 10 Slope Up 90
-620172, // 11 Slope Up 105
-555972, // 12 Slope Up 120
-453894, // 13 Slope Up 135
-321000, // 14 Slope Up 150
-166278, // 15 Slope Up 165
0, // 16 Fully Inverted
617604, // 17 Slope Down 75
642000, // 18 Slope Down 90
620172, // 19 Slope Down 105
555972, // 20 Slope Down 120
453894, // 21 Slope Down 135
321000, // 22 Slope Down 150
166278, // 23 Slope Down 165
-321000, // 24 Corkscrew Right Up 0
-555972, // 25 Corkscrew Right Up 1
-642000, // 26 Corkscrew Right Up 2
-555972, // 27 Corkscrew Right Up 3
-321000, // 28 Corkscrew Right Up 4
321000, // 29 Corkscrew Right Down 4
555972, // 30 Corkscrew Right Down 3
642000, // 31 Corkscrew Right Down 2
555972, // 32 Corkscrew Right Down 1
321000, // 33 Corkscrew Right Down 0
-321000, // 34 Corkscrew Left Up 0
-555972, // 35 Corkscrew Left Up 1
-642000, // 36 Corkscrew Left Up 2
-555972, // 37 Corkscrew Left Up 3
-321000, // 38 Corkscrew Left Up 4
321000, // 39 Corkscrew Left Down 4
555972, // 40 Corkscrew Left Down 2
642000, // 41 Corkscrew Left Down 1
555972, // 42 Corkscrew Left Down 1
321000, // 43 Corkscrew Left Down 0
-33384, // 44 Half Helix Up Large
-55854, // 45 Half Helix Up Small
33384, // 46 Half Helix Down Large
55854, // 47 Half Helix Down Small
-66768, // 48 Quarter Helix Up
66768, // 49 Quarter Helix Down
// currently only diagonal elements use slopes angles 8, 16, 50. Diagonal gentle-to-steep transition uses
// diagonal sprites of slopes 25 and 42.
-90522, // 50 Slope Up 8
-179760, // 51 Slope Down 16
-484068, // 52 Slope Up 50
90522, // 53 Slope Down 8
179760, // 54 Slope Down 16
484068, // 55 Slope Down 50
243318, // 56 Inverting Loop Down 25
416016, // 57 Inverting Loop Down 42.5
546342, // 58 Inverting Loop Down 60
-110424, // 59 Slope Up Spiral Lift Hill
};
/** rct2: 0x009A3684 */
const int32_t SpriteDirectionToSoundDirection[] = {
-0x4000, // 0
-0x3000, // 1
-0x2000, // 2
-0x1000, // 3
0, // 4
0x1000, // 5
0x2000, // 6
0x3000, // 7
0x4000, // 8
0x4800, // 9
0x4800, // 10
0x4800, // 11
0x4800, // 12
0x4800, // 13
0x4800, // 14
0x4800, // 15
0x4000, // 16
0x3000, // 17
0x2000, // 18
0x1000, // 19
0, // 20
-0x1000, // 21
-0x2000, // 22
-0x3000, // 23
-0x4000, // 24
-0x4800, // 25
-0x4800, // 26
-0x4800, // 27
-0x4800, // 28
-0x4800, // 29
-0x4800, // 30
-0x4800, // 31
};
// clang-format on

View File

@@ -25,8 +25,3 @@ extern const TopSpinTimeToSpriteMap* TopSpinTimeToSpriteMaps[];
extern const uint8_t MotionSimulatorTimeToSpriteMap[];
extern const int32_t MotionSimulatorTimeToSpriteMapCount;
extern const int32_t SubpositionTranslationDistances[];
extern const int32_t AccelerationFromPitch[];
extern const int32_t SpriteDirectionToSoundDirection[];

View File

@@ -0,0 +1,298 @@
/*****************************************************************************
* Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include "VehicleGeometry.h"
#include <cstddef>
namespace OpenRCT2::RideVehicle::Geometry
{
// clang-format off
/** rct2: 0x009A2930 */
constexpr auto kSubpositionTranslationDistances = std::to_array({
// For a base length of 8716 (0x220C) on the horizontal and 6554 (0x199A) on the vertical,
// use the Pythagoras theorem and round up.
0, // no movement
8716, // X translation
8716, // Y translation
12327, // XY translation
6554, // Z translation
10905, // XZ translation
10905, // YZ translation
13961, // XYZ translation
// For the reverser car, multiply the horizontal distance by 2.5 and the vertical distance by 4.072.
0, // no movement
21790, // X translation
21790, // Y translation
30817, // Z translation
16385, // XY translation
27262, // XZ translation
27262, // YZ translation
34902, // XYZ translation
});
// clang-format on
static_assert(std::size(kSubpositionTranslationDistances) == 16);
/** rct2: 0x009A36C4 */
const auto kFreeroamVehicleMovementData = std::to_array<Unk9A36C4Struct>({
{ -1, 0, 8716 }, { -1, 0, 8716 }, { -1, 0, 8716 }, { -1, 1, 12327 }, { -1, 1, 12327 }, { -1, 1, 12327 },
{ 0, 1, 8716 }, { -1, 1, 12327 }, { 0, 1, 8716 }, { 0, 1, 8716 }, { 0, 1, 8716 }, { 1, 1, 12327 },
{ 1, 1, 12327 }, { 1, 1, 12327 }, { 1, 0, 8716 }, { 1, 1, 12327 }, { 1, 0, 8716 }, { 1, 0, 8716 },
{ 1, 0, 8716 }, { 1, -1, 12327 }, { 1, -1, 12327 }, { 1, -1, 12327 }, { 0, -1, 8716 }, { 1, -1, 12327 },
{ 0, -1, 8716 }, { 0, -1, 8716 }, { 0, -1, 8716 }, { -1, -1, 12327 }, { -1, -1, 12327 }, { -1, -1, 12327 },
{ -1, 0, 8716 }, { -1, -1, 12327 },
});
static_assert(std::size(kFreeroamVehicleMovementData) == 32);
/** rct2: 0x009A2970 */
constexpr auto kAccelerationFromPitch = std::to_array<int32_t>({
0, // Flat
-124548, // 1 Slope Up 12.5
-243318, // 2 Slope Up 25
-416016, // 3 Slope Up 42.5
-546342, // 4 Slope Up 60
124548, // 5 Slope Down 12.5
243318, // 6 Slope Down 25
416016, // 7 Slope Down 42.5
546342, // 8 Slope Down 60
-617604, // 9 Slope Up 75
-642000, // 10 Slope Up 90
-620172, // 11 Slope Up 105
-555972, // 12 Slope Up 120
-453894, // 13 Slope Up 135
-321000, // 14 Slope Up 150
-166278, // 15 Slope Up 165
0, // 16 Fully Inverted
617604, // 17 Slope Down 75
642000, // 18 Slope Down 90
620172, // 19 Slope Down 105
555972, // 20 Slope Down 120
453894, // 21 Slope Down 135
321000, // 22 Slope Down 150
166278, // 23 Slope Down 165
-321000, // 24 Corkscrew Right Up 0
-555972, // 25 Corkscrew Right Up 1
-642000, // 26 Corkscrew Right Up 2
-555972, // 27 Corkscrew Right Up 3
-321000, // 28 Corkscrew Right Up 4
321000, // 29 Corkscrew Right Down 4
555972, // 30 Corkscrew Right Down 3
642000, // 31 Corkscrew Right Down 2
555972, // 32 Corkscrew Right Down 1
321000, // 33 Corkscrew Right Down 0
-321000, // 34 Corkscrew Left Up 0
-555972, // 35 Corkscrew Left Up 1
-642000, // 36 Corkscrew Left Up 2
-555972, // 37 Corkscrew Left Up 3
-321000, // 38 Corkscrew Left Up 4
321000, // 39 Corkscrew Left Down 4
555972, // 40 Corkscrew Left Down 2
642000, // 41 Corkscrew Left Down 1
555972, // 42 Corkscrew Left Down 1
321000, // 43 Corkscrew Left Down 0
-33384, // 44 Half Helix Up Large
-55854, // 45 Half Helix Up Small
33384, // 46 Half Helix Down Large
55854, // 47 Half Helix Down Small
-66768, // 48 Quarter Helix Up
66768, // 49 Quarter Helix Down
-90522, // 50 Slope Up 8
-179760, // 51 Slope Down 16
-484068, // 52 Slope Up 50
90522, // 53 Slope Down 8
179760, // 54 Slope Down 16
484068, // 55 Slope Down 50
243318, // 56 Inverting Loop Down 25
416016, // 57 Inverting Loop Down 42.5
546342, // 58 Inverting Loop Down 60
-110424, // 59 Slope Up Spiral Lift Hill
110424, // 60 Slope Down Spiral Lift Hill
});
static_assert(std::size(kAccelerationFromPitch) == EnumValue(VehiclePitch::pitchCount));
/** rct2: 0x009A37E4
* rct2: 0x009A38D4
*/
constexpr auto kPitchToDirectionVectorInt32 = std::to_array<CoordsXY>({
{ 2147483647, 0 }, // flat
{ 2106585154, 417115092 }, // up12
{ 1985590284, 817995863 }, // up25
{ 1636362342, 1390684831 }, // up42
{ 1127484953, 1827693544 }, // up60
{ 2106585154, -417115092 }, // down12
{ 1985590284, -817995863 }, // down25
{ 1636362342, -1390684831 }, // down42
{ 1127484953, -1827693544 }, // down60
{ 58579923, 2066040965 }, // up75
{ 0, 2147483647 }, // up90
{ -555809667, 2074309916 }, // up115
{ -1073741824, 1859775393 }, // up120
{ -1518500249, 1518500249 }, // up135
{ -1859775391, 1073741824 }, // up150
{ -2074309916, 555809666 }, // up165
{ -2147483647, 0 }, // inverted
{ 58579923, -2066040965 }, // down75
{ 0, -2147483647 }, // down90
{ -555809667, -2074309916 }, // down115
{ -1073741824, -1859775393 }, // down120
{ -1518500249, -1518500249 }, // down135
{ -1859775391, -1073741824 }, // down150
{ -2074309916, -555809666 }, // down165
{ 1859775393, 1073741824 }, // corkscrewUpRight0
{ 1073741824, 1859775393 }, // corkscrewUpRight1
{ 0, 2147483647 }, // corkscrewUpRight2
{ -1073741824, 1859775393 }, // corkscrewUpRight3
{ -1859775393, 1073741824 }, // corkscrewUpRight4
{ 1859775393, -1073741824 }, // corkscrewDownLeft0
{ 1073741824, -1859775393 }, // corkscrewDownLeft1
{ 0, -2147483647 }, // corkscrewDownLeft2
{ -1073741824, -1859775393 }, // corkscrewDownLeft3
{ -1859775393, -1073741824 }, // corkscrewDownLeft4
{ 1859775393, 1073741824 }, // corkscrewUpLeft0
{ 1073741824, 1859775393 }, // corkscrewUpLeft1
{ 0, 2147483647 }, // corkscrewUpLeft2
{ -1073741824, 1859775393 }, // corkscrewUpLeft3
{ -1859775393, 1073741824 }, // corkscrewUpLeft4
{ 1859775393, -1073741824 }, // corkscrewDownRight0
{ 1073741824, -1859775393 }, // corkscrewDownRight1
{ 0, -2147483647 }, // corkscrewDownRight2
{ -1073741824, -1859775393 }, // corkscrewDownRight3
{ -1859775393, -1073741824 }, // corkscrewDownRight4
{ 2144540595, 112390610 }, // upHalfHelixLarge
{ 2139311823, 187165532 }, // upHalfHelixSmall
{ 2144540595, -112390610 }, // downHalfHelixLarge
{ 2139311823, -187165532 }, // downHalfHelixSmall
{ 2135719507, 224473165 }, // upQuarterHelix
{ 2135719507, -224473165 }, // downQuarterHelix
{ 2125953864, 303325208 }, // up8
{ 2061796213, 600568389 }, // up16
{ 1411702590, 1618265062 }, // up50
{ 2125953864, -303325208 }, // down8
{ 2061796213, -600568389 }, // down16
{ 1411702590, -1618265062 }, // down50
{ 1985590284, -817995863 }, // uninvertingDown25
{ 1636362342, -1390684831 }, // uninvertingDown42
{ 1127484953, -1827693544 }, // uninvertingDown60
{ 2115506168, 369214930 }, // curvedLifthillUp
{ 2115506168, -369214930 }, // curvedLiftHillDown
});
static_assert(std::size(kPitchToDirectionVectorInt32) == EnumValue(VehiclePitch::pitchCount));
/** rct2: 0x009A39C4 */
const auto kRollHorizontalComponent = std::to_array<int32_t>({
2147483647, 2096579710, 1946281152, 2096579710, 1946281152, 1380375879, 555809667,
-372906620, -1231746017, -1859775391, 1380375879, 555809667, -372906620, -1231746017,
-1859775391, 0, 2096579710, 1946281152, 2096579710, 1946281152,
});
static_assert(std::size(kRollHorizontalComponent) == EnumValue(VehicleRoll::rollCount));
/** rct2: 0x009A3684 */
const auto kSpriteDirectionToSoundDirection = std::to_array<int32_t>({
-0x4000, // 0
-0x3000, // 1
-0x2000, // 2
-0x1000, // 3
0, // 4
0x1000, // 5
0x2000, // 6
0x3000, // 7
0x4000, // 8
0x4800, // 9
0x4800, // 10
0x4800, // 11
0x4800, // 12
0x4800, // 13
0x4800, // 14
0x4800, // 15
0x4000, // 16
0x3000, // 17
0x2000, // 18
0x1000, // 19
0, // 20
-0x1000, // 21
-0x2000, // 22
-0x3000, // 23
-0x4000, // 24
-0x4800, // 25
-0x4800, // 26
-0x4800, // 27
-0x4800, // 28
-0x4800, // 29
-0x4800, // 30
-0x4800, // 31
});
/** rct2: 0x009A3AC4, 0x009A3AC6 */
const auto kCrashDirectionComponents = std::to_array<CoordsXY>({
{ -256, 0 },
{ -236, 98 },
{ -181, 181 },
{ -98, 236 },
{ 0, 256 },
{ 98, 236 },
{ 181, 181 },
{ 236, 98 },
{ 256, 0 },
{ 236, -98 },
{ 181, -181 },
{ 98, -236 },
{ 0, -256 },
{ -98, -236 },
{ -181, -181 },
{ -236, -98 },
});
static_assert(std::size(kCrashDirectionComponents) == 16);
Unk9A36C4Struct getFreeroamVehicleMovementData(uint8_t orientation)
{
return kFreeroamVehicleMovementData[orientation];
}
int32_t getRollHorizontalComponent(VehicleRoll roll)
{
return kRollHorizontalComponent[EnumValue(roll)];
}
int32_t getSoundDirectionFromOrientation(uint8_t orientation)
{
return kSpriteDirectionToSoundDirection[orientation];
}
CoordsXY getCrashDirectionComponents(uint8_t orientation)
{
return kCrashDirectionComponents[orientation / 2];
}
int32_t getTranslationDistance(CoordsXYZ distance, bool useReverserDistance)
{
uint8_t index = ((distance.x != 0) << 0) | ((distance.y != 0) << 1) | ((distance.z != 0) << 2)
| ((useReverserDistance) << 3);
return kSubpositionTranslationDistances[index];
}
int32_t getAccelerationFromPitch(VehiclePitch pitch)
{
if (pitch >= VehiclePitch::pitchCount)
{
return 0;
}
return kAccelerationFromPitch[EnumValue(pitch)];
}
CoordsXY getPitchVector32(VehiclePitch pitch)
{
if (pitch >= VehiclePitch::pitchCount)
{
pitch = VehiclePitch::flat;
}
return kPitchToDirectionVectorInt32[EnumValue(pitch)];
}
} // namespace OpenRCT2::RideVehicle::Geometry

View File

@@ -0,0 +1,44 @@
/*****************************************************************************
* Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../core/EnumUtils.hpp"
#include "../world/Location.hpp"
#include "Angles.h"
#include <array>
namespace OpenRCT2::RideVehicle::Geometry
{
struct Unk9A36C4Struct
{
int16_t x;
int16_t y;
uint32_t distance;
};
Unk9A36C4Struct getFreeroamVehicleMovementData(uint8_t orientation);
int32_t getRollHorizontalComponent(VehicleRoll roll);
int32_t getSoundDirectionFromOrientation(uint8_t orientation);
CoordsXY getCrashDirectionComponents(uint8_t orientation);
/** The distance between subposition points in a movement vector.
* Squashes vector components to 0 or !0, so vector length is ignored.
*/
int32_t getTranslationDistance(CoordsXYZ distance, bool useReverserDistance);
int32_t getAccelerationFromPitch(VehiclePitch pitch);
CoordsXY getPitchVector32(VehiclePitch pitch);
} // namespace OpenRCT2::RideVehicle::Geometry