From e3a1af3d05f192a7a0f67db5d677a3a517e3cc6e Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 30 Jan 2021 15:16:17 +0100 Subject: [PATCH] Use getters/setters for track type and direction --- src/openrct2/GameStateSnapshots.cpp | 2 +- src/openrct2/rct1/RCT1.h | 15 +++++++-- src/openrct2/rct1/S4Importer.cpp | 6 ++-- src/openrct2/rct12/RCT12.h | 3 ++ src/openrct2/rct2/RCT2.h | 17 +++++----- src/openrct2/rct2/S6Importer.cpp | 3 +- src/openrct2/ride/CableLift.cpp | 11 ++++--- src/openrct2/ride/Ride.cpp | 6 ++-- src/openrct2/ride/Vehicle.cpp | 49 ++++++++++++++++++----------- src/openrct2/ride/Vehicle.h | 21 ++++++------- src/openrct2/ride/VehiclePaint.cpp | 6 ++-- src/openrct2/scripting/ScEntity.hpp | 5 ++- test/tests/S6ImportExportTests.cpp | 2 +- 13 files changed, 86 insertions(+), 60 deletions(-) diff --git a/src/openrct2/GameStateSnapshots.cpp b/src/openrct2/GameStateSnapshots.cpp index f9c8f2a5ba..9f5262d132 100644 --- a/src/openrct2/GameStateSnapshots.cpp +++ b/src/openrct2/GameStateSnapshots.cpp @@ -336,7 +336,7 @@ struct GameStateSnapshots final : public IGameStateSnapshots COMPARE_FIELD(Vehicle, vehicle_type); COMPARE_FIELD(Vehicle, colours); COMPARE_FIELD(Vehicle, track_progress); - COMPARE_FIELD(Vehicle, track_direction); + COMPARE_FIELD(Vehicle, TrackTypeAndDirection); COMPARE_FIELD(Vehicle, TrackLocation.x); COMPARE_FIELD(Vehicle, TrackLocation.y); COMPARE_FIELD(Vehicle, TrackLocation.z); diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index ae44f19e7b..1d237e1a67 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -242,9 +242,8 @@ struct rct1_vehicle : RCT12SpriteBase }; union { - int16_t track_direction; // 0x36 (0000 0000 0000 0011) - int16_t track_type; // 0x36 (0000 0011 1111 1100) - RCT12xy8 boat_location; // 0x36 + int16_t TrackTypeAndDirection; // 0x36 + RCT12xy8 boat_location; // 0x36 }; uint16_t track_x; // 0x38 uint16_t track_y; // 0x3A @@ -321,6 +320,16 @@ struct rct1_vehicle : RCT12SpriteBase uint8_t mini_golf_flags; // 0xD5 uint8_t ride_subtype; // 0xD6 uint8_t colours_extended; // 0xD7 + + uint16_t GetTrackType() const + { + return TrackTypeAndDirection >> 2; + } + + uint8_t GetTrackDirection() const + { + return TrackTypeAndDirection & RCT12VehicleTrackDirectionMask; + } }; struct rct1_peep : RCT12SpriteBase diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 77723e782c..adf7183c36 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1245,12 +1245,14 @@ private: if (src->boat_location.isNull() || ride->mode != RideMode::BoatHire || statusSrc != Vehicle::Status::TravellingBoat) { dst->BoatLocation.setNull(); - dst->track_type = src->track_type; + dst->SetTrackDirection(src->GetTrackDirection()); + dst->SetTrackType(src->GetTrackType()); } else { dst->BoatLocation = TileCoordsXY{ src->boat_location.x, src->boat_location.y }.ToCoordsXY(); - dst->track_type = 0; + dst->SetTrackDirection(0); + dst->SetTrackType(0); } dst->track_progress = src->track_progress; dst->vertical_drop_countdown = src->vertical_drop_countdown; diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index 48e72a1f10..19b8898928 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -79,6 +79,9 @@ constexpr const uint8_t RCT12_MAX_ELEMENT_HEIGHT = 255; constexpr const uint16_t RCT12_PEEP_SPAWN_UNDEFINED = 0xFFFF; +constexpr const uint16_t RCT12VehicleTrackDirectionMask = 0b0000000000000011; +constexpr const uint16_t RCT12VehicleTrackTypeMask = 0b1111111111111100; + enum class SpriteIdentifier : uint8_t; enum class RCT12TrackDesignVersion : uint8_t diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 374e9831d3..ecde383fd7 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -482,9 +482,8 @@ struct RCT2SpriteVehicle : RCT12SpriteBase }; union { - int16_t track_direction; // 0x36 - int16_t track_type; // 0x36 - RCT12xy8 boat_location; // 0x36 + int16_t TrackTypeAndDirection; // 0x36 + RCT12xy8 boat_location; // 0x36 }; uint16_t track_x; // 0x38 uint16_t track_y; // 0x3A @@ -574,23 +573,23 @@ struct RCT2SpriteVehicle : RCT12SpriteBase uint16_t GetTrackType() const { - return track_type >> 2; + return TrackTypeAndDirection >> 2; } uint8_t GetTrackDirection() const { - return track_direction & 3; + return TrackTypeAndDirection & RCT12VehicleTrackDirectionMask; } void SetTrackType(uint16_t trackType) { // set the upper 14 bits to 0 - track_type &= 3; - track_type |= trackType << 2; + TrackTypeAndDirection &= ~RCT12VehicleTrackTypeMask; + TrackTypeAndDirection |= trackType << 2; } void SetTrackDirection(uint8_t trackDirection) { // set the lower 2 bits only - track_direction &= ~3; - track_direction |= trackDirection & 3; + TrackTypeAndDirection &= ~RCT12VehicleTrackDirectionMask; + TrackTypeAndDirection |= trackDirection & RCT12VehicleTrackDirectionMask; } }; assert_struct_size(RCT2SpriteVehicle, 0xDA); diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index ea17512d29..86aa840eb5 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1396,7 +1396,8 @@ public: else { dst->BoatLocation = TileCoordsXY{ src->boat_location.x, src->boat_location.y }.ToCoordsXY(); - dst->track_type = 0; + dst->SetTrackDirection(0); + dst->SetTrackType(0); } dst->next_vehicle_on_train = src->next_vehicle_on_train; diff --git a/src/openrct2/ride/CableLift.cpp b/src/openrct2/ride/CableLift.cpp index cfb5c249d5..118b3c96e0 100644 --- a/src/openrct2/ride/CableLift.cpp +++ b/src/openrct2/ride/CableLift.cpp @@ -72,7 +72,8 @@ Vehicle* cable_lift_segment_create( z += RideTypeDescriptors[ride.type].Heights.VehicleZOffset; current->MoveTo({ 16, 16, z }); - current->track_type = (TrackElemType::CableLiftHill << 2) | (current->sprite_direction >> 3); + current->SetTrackType(TrackElemType::CableLiftHill); + current->SetTrackDirection(current->sprite_direction >> 3); current->track_progress = 164; current->update_flags = VEHICLE_UPDATE_FLAG_COLLISION_DISABLED; current->SetState(Vehicle::Status::MovingToEndOfStation, 0); @@ -259,8 +260,8 @@ bool Vehicle::CableLiftUpdateTrackMotionForwards() return false; TrackLocation = { output, outputZ }; - track_direction = outputDirection; - track_type |= output.element->AsTrack()->GetTrackType() << 2; + SetTrackDirection(outputDirection); + SetTrackType(output.element->AsTrack()->GetTrackType()); trackProgress = 0; } @@ -319,8 +320,8 @@ bool Vehicle::CableLiftUpdateTrackMotionBackwards() return false; TrackLocation = { output.begin_x, output.begin_y, output.begin_z }; - track_direction = output.begin_direction; - track_type |= output.begin_element->AsTrack()->GetTrackType() << 2; + SetTrackDirection(output.begin_direction); + SetTrackType(output.begin_element->AsTrack()->GetTrackType()); if (output.begin_element->AsTrack()->GetTrackType() == TrackElemType::EndStation) { diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index dd4034a46a..4cc1e85fff 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -4188,7 +4188,8 @@ static Vehicle* vehicle_create_car( dodgemPos.z += RideTypeDescriptors[ride->type].Heights.VehicleZOffset; - vehicle->track_type = trackElement->GetTrackType() << 2; + vehicle->SetTrackDirection(0); + vehicle->SetTrackType(trackElement->GetTrackType()); vehicle->track_progress = 0; vehicle->SetState(Vehicle::Status::MovingToEndOfStation); vehicle->update_flags = 0; @@ -4277,7 +4278,8 @@ static Vehicle* vehicle_create_car( vehicle->current_station = trackElement->GetStationIndex(); vehicle->MoveTo(chosenLoc); - vehicle->track_type = (trackElement->GetTrackType() << 2) | (vehicle->sprite_direction >> 3); + vehicle->SetTrackType(trackElement->GetTrackType()); + vehicle->SetTrackDirection(vehicle->sprite_direction >> 3); vehicle->track_progress = 31; if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_MINI_GOLF) { diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index bd93f32993..bf7e023ddb 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -736,8 +736,11 @@ template<> bool SpriteBase::Is() const return sprite_identifier == SpriteIdentifier::Vehicle; } -static bool vehicle_move_info_valid(VehicleTrackSubposition trackSubposition, int32_t typeAndDirection, int32_t offset) +static bool vehicle_move_info_valid( + VehicleTrackSubposition trackSubposition, track_type_t type, uint8_t direction, int32_t offset) { + uint16_t typeAndDirection = (type << 2) | (direction & 3); + if (trackSubposition >= VehicleTrackSubposition{ std::size(gTrackVehicleInfo) }) { return false; @@ -789,9 +792,11 @@ static bool vehicle_move_info_valid(VehicleTrackSubposition trackSubposition, in } static const rct_vehicle_info* vehicle_get_move_info( - VehicleTrackSubposition trackSubposition, int32_t typeAndDirection, int32_t offset) + VehicleTrackSubposition trackSubposition, track_type_t type, uint8_t direction, int32_t offset) { - if (!vehicle_move_info_valid(trackSubposition, typeAndDirection, offset)) + uint16_t typeAndDirection = (type << 2) | (direction & 3); + + if (!vehicle_move_info_valid(trackSubposition, type, direction, offset)) { static constexpr const rct_vehicle_info zero = {}; return &zero; @@ -801,12 +806,14 @@ static const rct_vehicle_info* vehicle_get_move_info( const rct_vehicle_info* Vehicle::GetMoveInfo() const { - return vehicle_get_move_info(TrackSubposition, track_type, track_progress); + return vehicle_get_move_info(TrackSubposition, GetTrackType(), GetTrackDirection(), track_progress); } -static uint16_t vehicle_get_move_info_size(VehicleTrackSubposition trackSubposition, int32_t typeAndDirection) +static uint16_t vehicle_get_move_info_size(VehicleTrackSubposition trackSubposition, track_type_t type, uint8_t direction) { - if (!vehicle_move_info_valid(trackSubposition, typeAndDirection, 0)) + uint16_t typeAndDirection = (type << 2) | (direction & 3); + + if (!vehicle_move_info_valid(trackSubposition, type, direction, 0)) { return 0; } @@ -815,7 +822,7 @@ static uint16_t vehicle_get_move_info_size(VehicleTrackSubposition trackSubposit uint16_t Vehicle::GetTrackProgress() const { - return vehicle_get_move_info_size(TrackSubposition, track_type); + return vehicle_get_move_info_size(TrackSubposition, GetTrackType(), GetTrackDirection()); } void Vehicle::MoveRelativeDistance(int32_t distance) @@ -2572,7 +2579,7 @@ void Vehicle::UpdateWaitingToDepart() int32_t zUnused; int32_t direction; - uint8_t trackDirection = (track_direction & 0x3); + uint8_t trackDirection = GetTrackDirection(); if (track_block_get_next_from_zero(TrackLocation, curRide, trackDirection, &track, &zUnused, &direction, false)) { if (track.element->AsTrack()->HasCableLift()) @@ -3161,7 +3168,8 @@ void Vehicle::UpdateTravellingBoatHireSetup() BoatLocation = location; var_35 = 0; // No longer on a track so reset to 0 for import/export - track_type = 0; + SetTrackDirection(0); + SetTrackType(0); SetState(Vehicle::Status::TravellingBoat); remaining_distance += 27924; @@ -4328,7 +4336,8 @@ void Vehicle::TryReconnectBoatToTrack(const CoordsXY& currentBoatLocation, const auto curRide = GetRide(); if (curRide != nullptr) { - track_type = (trackElement->GetTrackType() << 2) | (curRide->boat_hire_return_direction & 3); + SetTrackType(trackElement->GetTrackType()); + SetTrackDirection(curRide->boat_hire_return_direction); BoatLocation.setNull(); } @@ -7477,7 +7486,7 @@ void Vehicle::UpdateSceneryDoor() const } const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; auto wallCoords = CoordsXYZ{ x, y, TrackLocation.z - trackBlock->z + trackCoordinates->z_end }.ToTileStart(); - int32_t direction = (track_direction + trackCoordinates->rotation_end) & 3; + int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_end) & 3; AnimateSceneryDoor( { wallCoords, static_cast(direction) }, TrackLocation, next_vehicle_on_train == SPRITE_INDEX_NULL); @@ -7570,7 +7579,7 @@ void Vehicle::UpdateSceneryDoorBackwards() const const rct_preview_track* trackBlock = TrackBlocks[trackType]; const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; auto wallCoords = CoordsXYZ{ TrackLocation, TrackLocation.z - trackBlock->z + trackCoordinates->z_begin }; - int32_t direction = (track_direction + trackCoordinates->rotation_begin) & 3; + int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_begin) & 3; direction = direction_reverse(direction); AnimateSceneryDoor( @@ -8147,8 +8156,8 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, Ride* cur { target_seat_rotation = tileElement->AsTrack()->GetSeatRotation(); } - track_direction = location.direction % NumOrthogonalDirections; - track_type |= trackType << 2; + SetTrackDirection(location.direction); + SetTrackType(trackType); brake_speed = tileElement->AsTrack()->GetBrakeBoosterSpeed(); if (trackType == TrackElemType::OnRidePhoto) { @@ -8548,8 +8557,8 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(uint16_t trackType, Ride* cu target_seat_rotation = tileElement->AsTrack()->GetSeatRotation(); } direction &= 3; - track_type = trackType << 2; - track_direction |= direction; + SetTrackType(trackType); + SetTrackDirection(direction); brake_speed = tileElement->AsTrack()->GetBrakeBoosterSpeed(); // There are two bytes before the move info list @@ -8875,7 +8884,8 @@ loc_6DC476: } ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL); - track_type = (tileElement->AsTrack()->GetTrackType() << 2) | (direction & 3); + SetTrackType(tileElement->AsTrack()->GetTrackType()); + SetTrackDirection(direction); var_CF = tileElement->AsTrack()->GetBrakeBoosterSpeed(); track_progress = 0; @@ -9083,7 +9093,8 @@ loc_6DCA9A: } } - track_type = (tileElement->AsTrack()->GetTrackType() << 2) | (direction & 3); + SetTrackType(tileElement->AsTrack()->GetTrackType()); + SetTrackDirection(direction); var_CF = tileElement->AsTrack()->GetSeatRotation() << 1; // There are two bytes before the move info list @@ -9677,7 +9688,7 @@ int32_t Vehicle::UpdateTrackMotion(int32_t* outStation) } } - if ((vehicle->GetTrackType()) == TrackElemType::Watersplash) + if (vehicle->GetTrackType() == TrackElemType::Watersplash) { if (vehicle->track_progress >= 48 && vehicle->track_progress <= 128) { diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index 4a0dd3003c..99fa1a03c7 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -157,6 +157,9 @@ struct rct_vehicle_info struct SoundIdVolume; +constexpr const uint16_t VehicleTrackDirectionMask = 0b0000000000000011; +constexpr const uint16_t VehicleTrackTypeMask = 0b1111111111111100; + struct Vehicle : SpriteBase { enum class Type : uint8_t @@ -218,11 +221,7 @@ struct Vehicle : SpriteBase uint8_t var_35; }; }; - union - { - int16_t track_direction; // (0000 0000 0000 0011) - int16_t track_type; // (1111 1111 1111 1100) - }; + uint16_t TrackTypeAndDirection; CoordsXYZ TrackLocation; uint16_t next_vehicle_on_train; @@ -342,23 +341,23 @@ struct Vehicle : SpriteBase void MoveRelativeDistance(int32_t distance); track_type_t GetTrackType() const { - return track_type >> 2; + return TrackTypeAndDirection >> 2; } uint8_t GetTrackDirection() const { - return track_direction & 3; + return TrackTypeAndDirection & VehicleTrackDirectionMask; } void SetTrackType(track_type_t trackType) { // set the upper 14 bits to 0, then set track type - track_type &= 3; - track_type |= trackType << 2; + TrackTypeAndDirection &= ~VehicleTrackTypeMask; + TrackTypeAndDirection |= trackType << 2; } void SetTrackDirection(uint8_t trackDirection) { // set the lower 2 bits only - track_direction &= ~3; - track_direction |= trackDirection & 3; + TrackTypeAndDirection &= ~VehicleTrackDirectionMask; + TrackTypeAndDirection |= trackDirection & VehicleTrackDirectionMask; } bool HasUpdateFlag(uint32_t flag) const { diff --git a/src/openrct2/ride/VehiclePaint.cpp b/src/openrct2/ride/VehiclePaint.cpp index 7f66c3878b..0fb8460eb1 100644 --- a/src/openrct2/ride/VehiclePaint.cpp +++ b/src/openrct2/ride/VehiclePaint.cpp @@ -2339,7 +2339,7 @@ static void vehicle_sprite_17( { if (vehicle->HasUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES)) { - if ((vehicle->GetTrackType()) != TrackElemType::Down90ToDown60 + if (vehicle->GetTrackType() != TrackElemType::Down90ToDown60 && (vehicle->GetTrackType()) != TrackElemType::Down60ToDown90) { vehicleEntry--; @@ -2364,7 +2364,7 @@ static void vehicle_sprite_18( { if (vehicle->HasUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES)) { - if ((vehicle->GetTrackType()) != TrackElemType::Down90 && (vehicle->GetTrackType()) != TrackElemType::Down90ToDown60 + if (vehicle->GetTrackType() != TrackElemType::Down90 && (vehicle->GetTrackType()) != TrackElemType::Down90ToDown60 && (vehicle->GetTrackType()) != TrackElemType::Down60ToDown90) { vehicleEntry--; @@ -2963,7 +2963,7 @@ static constexpr const vehicle_sprite_func vehicle_sprite_funcs[] = { */ static void vehicle_visual_splash1_effect(paint_session* session, int32_t z, const Vehicle* vehicle) { - if ((vehicle->GetTrackType()) != TrackElemType::Watersplash) + if (vehicle->GetTrackType() != TrackElemType::Watersplash) { return; } diff --git a/src/openrct2/scripting/ScEntity.hpp b/src/openrct2/scripting/ScEntity.hpp index d59794b132..46932893d8 100644 --- a/src/openrct2/scripting/ScEntity.hpp +++ b/src/openrct2/scripting/ScEntity.hpp @@ -522,7 +522,7 @@ namespace OpenRCT2::Scripting auto vehicle = GetVehicle(); if (vehicle != nullptr) { - auto coords = CoordsXYZD(vehicle->TrackLocation, vehicle->track_direction & 3); + auto coords = CoordsXYZD(vehicle->TrackLocation, vehicle->GetTrackDirection()); return ToDuk(ctx, coords); } return ToDuk(ctx, nullptr); @@ -535,8 +535,7 @@ namespace OpenRCT2::Scripting { auto coords = FromDuk(value); vehicle->TrackLocation = CoordsXYZ(coords.x, coords.y, coords.z); - vehicle->track_direction &= ~3; - vehicle->track_direction |= coords.direction & 3; + vehicle->SetTrackDirection(coords.direction); } } diff --git a/test/tests/S6ImportExportTests.cpp b/test/tests/S6ImportExportTests.cpp index 1aa22e6daa..04bfce0bb9 100644 --- a/test/tests/S6ImportExportTests.cpp +++ b/test/tests/S6ImportExportTests.cpp @@ -278,7 +278,7 @@ static void CompareSpriteDataVehicle(const Vehicle& left, const Vehicle& right) COMPARE_FIELD(colours.body_colour); COMPARE_FIELD(colours.trim_colour); COMPARE_FIELD(track_progress); - COMPARE_FIELD(track_direction); + COMPARE_FIELD(TrackTypeAndDirection); COMPARE_FIELD(TrackLocation.x); COMPARE_FIELD(TrackLocation.y); COMPARE_FIELD(TrackLocation.z);