From 03e7e29b211c3b8c6bc06ce748bbc82770047596 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Sat, 14 Dec 2019 12:12:43 -0300 Subject: [PATCH 1/4] Make map entrance/exit fetching functions use Coords objects --- src/openrct2/actions/FootpathPlaceAction.hpp | 4 ++-- .../actions/FootpathPlaceFromTrackAction.hpp | 4 ++-- .../actions/ParkEntranceRemoveAction.hpp | 2 +- .../actions/PlaceParkEntranceAction.hpp | 7 +++---- src/openrct2/rct1/S4Importer.cpp | 4 ++-- src/openrct2/ride/Ride.cpp | 4 ++-- src/openrct2/world/Entrance.cpp | 2 +- src/openrct2/world/Map.cpp | 19 ++++++++++--------- src/openrct2/world/Map.h | 6 +++--- test/tests/TileElements.cpp | 4 ++-- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/openrct2/actions/FootpathPlaceAction.hpp b/src/openrct2/actions/FootpathPlaceAction.hpp index 5b81cd3fd0..4badc3c3c6 100644 --- a/src/openrct2/actions/FootpathPlaceAction.hpp +++ b/src/openrct2/actions/FootpathPlaceAction.hpp @@ -221,7 +221,7 @@ private: zHigh += 2; } - auto entranceElement = map_get_park_entrance_element_at(_loc.x, _loc.y, zLow, false); + auto entranceElement = map_get_park_entrance_element_at(_loc, false); // Make sure the entrance part is the middle if (entranceElement != nullptr && (entranceElement->GetSequenceIndex()) == 0) { @@ -286,7 +286,7 @@ private: zHigh += 2; } - auto entranceElement = map_get_park_entrance_element_at(_loc.x, _loc.y, zLow, false); + auto entranceElement = map_get_park_entrance_element_at(_loc, false); // Make sure the entrance part is the middle if (entranceElement != nullptr && (entranceElement->GetSequenceIndex()) == 0) { diff --git a/src/openrct2/actions/FootpathPlaceFromTrackAction.hpp b/src/openrct2/actions/FootpathPlaceFromTrackAction.hpp index 8a22800c3a..411ce62648 100644 --- a/src/openrct2/actions/FootpathPlaceFromTrackAction.hpp +++ b/src/openrct2/actions/FootpathPlaceFromTrackAction.hpp @@ -130,7 +130,7 @@ private: zHigh += 2; } - auto entranceElement = map_get_park_entrance_element_at(_loc.x, _loc.y, zLow, false); + auto entranceElement = map_get_park_entrance_element_at(_loc, false); // Make sure the entrance part is the middle if (entranceElement != nullptr && (entranceElement->GetSequenceIndex()) == 0) { @@ -198,7 +198,7 @@ private: zHigh += 2; } - auto entranceElement = map_get_park_entrance_element_at(_loc.x, _loc.y, zLow, false); + auto entranceElement = map_get_park_entrance_element_at(_loc, false); // Make sure the entrance part is the middle if (entranceElement != nullptr && (entranceElement->GetSequenceIndex()) == 0) { diff --git a/src/openrct2/actions/ParkEntranceRemoveAction.hpp b/src/openrct2/actions/ParkEntranceRemoveAction.hpp index f0c5d1ae65..29a2352304 100644 --- a/src/openrct2/actions/ParkEntranceRemoveAction.hpp +++ b/src/openrct2/actions/ParkEntranceRemoveAction.hpp @@ -95,7 +95,7 @@ public: private: void ParkEntranceRemoveSegment(CoordsXYZ loc) const { - auto entranceElement = map_get_park_entrance_element_at(loc.x, loc.y, loc.z / 8, true); + auto entranceElement = map_get_park_entrance_element_at(loc, true); if (entranceElement == nullptr) { return; diff --git a/src/openrct2/actions/PlaceParkEntranceAction.hpp b/src/openrct2/actions/PlaceParkEntranceAction.hpp index d697697b97..32ecd1b5d3 100644 --- a/src/openrct2/actions/PlaceParkEntranceAction.hpp +++ b/src/openrct2/actions/PlaceParkEntranceAction.hpp @@ -79,13 +79,12 @@ public: int8_t zLow = _loc.z / 8; int8_t zHigh = zLow + 12; - LocationXY16 entranceLoc = { (int16_t)_loc.x, (int16_t)_loc.y }; + CoordsXYZ entranceLoc = _loc; for (uint8_t index = 0; index < 3; index++) { if (index == 1) { - entranceLoc.x += CoordsDirectionDelta[(_loc.direction - 1) & 0x3].x; - entranceLoc.y += CoordsDirectionDelta[(_loc.direction - 1) & 0x3].y; + entranceLoc += CoordsDirectionDelta[(_loc.direction - 1) & 0x3]; } else if (index == 2) { @@ -100,7 +99,7 @@ public: } // Check that entrance element does not already exist at this location - EntranceElement* entranceElement = map_get_park_entrance_element_at(entranceLoc.x, entranceLoc.y, zLow, false); + EntranceElement* entranceElement = map_get_park_entrance_element_at(entranceLoc, false); if (entranceElement != nullptr) { return std::make_unique( diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 9d2fdfb7cd..3b8e986f71 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2971,9 +2971,9 @@ private: ride->stations[0].Exit = exitCoords; auto entranceElement = map_get_ride_exit_element_at( - entranceCoords.x * 32, entranceCoords.y * 32, entranceCoords.z, false); + { entranceCoords.x, entranceCoords.y, entranceCoords.z }, false); entranceElement->SetEntranceType(ENTRANCE_TYPE_RIDE_ENTRANCE); - auto exitElement = map_get_ride_entrance_element_at(exitCoords.x * 32, exitCoords.y * 32, exitCoords.z, false); + auto exitElement = map_get_ride_entrance_element_at({ exitCoords.x, exitCoords.y, exitCoords.z }, false); exitElement->SetEntranceType(ENTRANCE_TYPE_RIDE_EXIT); // Trigger footpath update diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b1432a9506..b8f28d1fec 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -7678,7 +7678,7 @@ void determine_ride_entrance_and_exit_locations() if (!entranceLoc.isNull()) { const EntranceElement* entranceElement = map_get_ride_entrance_element_at( - entranceLoc.x * 32, entranceLoc.y * 32, entranceLoc.z, false); + { entranceLoc.x, entranceLoc.y, entranceLoc.z }, false); if (entranceElement == nullptr || entranceElement->GetRideIndex() != ride.id || entranceElement->GetStationIndex() != stationIndex) @@ -7694,7 +7694,7 @@ void determine_ride_entrance_and_exit_locations() if (!exitLoc.isNull()) { const EntranceElement* entranceElement = map_get_ride_exit_element_at( - exitLoc.x * 32, exitLoc.y * 32, exitLoc.z, false); + { exitLoc.x, exitLoc.y, exitLoc.z }, false); if (entranceElement == nullptr || entranceElement->GetRideIndex() != ride.id || entranceElement->GetStationIndex() != stationIndex) diff --git a/src/openrct2/world/Entrance.cpp b/src/openrct2/world/Entrance.cpp index a25d06f0b3..297abd8644 100644 --- a/src/openrct2/world/Entrance.cpp +++ b/src/openrct2/world/Entrance.cpp @@ -215,7 +215,7 @@ void fix_park_entrance_locations(void) std::remove_if( gParkEntrances.begin(), gParkEntrances.end(), [](const auto& entrance) { - return map_get_park_entrance_element_at(entrance.x, entrance.y, entrance.z >> 3, false) == nullptr; + return map_get_park_entrance_element_at(entrance, false) == nullptr; }), gParkEntrances.end()); } diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 19605ada17..0a991efae8 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -1765,9 +1765,10 @@ LargeSceneryElement* map_get_large_scenery_segment(int32_t x, int32_t y, int32_t return nullptr; } -EntranceElement* map_get_park_entrance_element_at(int32_t x, int32_t y, int32_t z, bool ghost) +EntranceElement* map_get_park_entrance_element_at(const CoordsXYZ& entranceCoords, bool ghost) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + auto entranceTileCoords = TileCoordsXYZ(entranceCoords); + TileElement* tileElement = map_get_first_element_at(entranceTileCoords.x, entranceTileCoords.y); if (tileElement != nullptr) { do @@ -1775,7 +1776,7 @@ EntranceElement* map_get_park_entrance_element_at(int32_t x, int32_t y, int32_t if (tileElement->GetType() != TILE_ELEMENT_TYPE_ENTRANCE) continue; - if (tileElement->base_height != z) + if (tileElement->base_height != entranceTileCoords.z) continue; if (tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_PARK_ENTRANCE) @@ -1790,9 +1791,9 @@ EntranceElement* map_get_park_entrance_element_at(int32_t x, int32_t y, int32_t return nullptr; } -EntranceElement* map_get_ride_entrance_element_at(int32_t x, int32_t y, int32_t z, bool ghost) +EntranceElement* map_get_ride_entrance_element_at(const TileCoordsXYZ& entranceTileCoords, bool ghost) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at(entranceTileCoords.x, entranceTileCoords.y); if (tileElement != nullptr) { do @@ -1800,7 +1801,7 @@ EntranceElement* map_get_ride_entrance_element_at(int32_t x, int32_t y, int32_t if (tileElement->GetType() != TILE_ELEMENT_TYPE_ENTRANCE) continue; - if (tileElement->base_height != z) + if (tileElement->base_height != entranceTileCoords.z) continue; if (tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_RIDE_ENTRANCE) @@ -1815,9 +1816,9 @@ EntranceElement* map_get_ride_entrance_element_at(int32_t x, int32_t y, int32_t return nullptr; } -EntranceElement* map_get_ride_exit_element_at(int32_t x, int32_t y, int32_t z, bool ghost) +EntranceElement* map_get_ride_exit_element_at(const TileCoordsXYZ& exitTileCoords, bool ghost) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at(exitTileCoords.x, exitTileCoords.y); if (tileElement != nullptr) { do @@ -1825,7 +1826,7 @@ EntranceElement* map_get_ride_exit_element_at(int32_t x, int32_t y, int32_t z, b if (tileElement->GetType() != TILE_ELEMENT_TYPE_ENTRANCE) continue; - if (tileElement->base_height != z) + if (tileElement->base_height != exitTileCoords.z) continue; if (tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_RIDE_EXIT) diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index e1d9b4e7fa..3d89135034 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -148,9 +148,9 @@ SurfaceElement* map_get_surface_element_at(const CoordsXY& coords); PathElement* map_get_path_element_at(const TileCoordsXYZ& loc); WallElement* map_get_wall_element_at(int32_t x, int32_t y, int32_t z, int32_t direction); SmallSceneryElement* map_get_small_scenery_element_at(int32_t x, int32_t y, int32_t z, int32_t type, uint8_t quadrant); -EntranceElement* map_get_park_entrance_element_at(int32_t x, int32_t y, int32_t z, bool ghost); -EntranceElement* map_get_ride_entrance_element_at(int32_t x, int32_t y, int32_t z, bool ghost); -EntranceElement* map_get_ride_exit_element_at(int32_t x, int32_t y, int32_t z, bool ghost); +EntranceElement* map_get_park_entrance_element_at(const CoordsXYZ& entranceCoords, bool ghost); +EntranceElement* map_get_ride_entrance_element_at(const TileCoordsXYZ& entranceTileCoords, bool ghost); +EntranceElement* map_get_ride_exit_element_at(const TileCoordsXYZ& exitTileCoords, bool ghost); int16_t tile_element_height(const CoordsXY& loc); int16_t tile_element_water_height(const CoordsXY& loc); uint8_t map_get_highest_land_height(const MapRange& range); diff --git a/test/tests/TileElements.cpp b/test/tests/TileElements.cpp index 83d50c1fd0..ef30d5d08b 100644 --- a/test/tests/TileElements.cpp +++ b/test/tests/TileElements.cpp @@ -94,7 +94,7 @@ TEST_F(TileElementWantsFootpathConnection, Stall) TEST_F(TileElementWantsFootpathConnection, RideEntrance) { // Ride entrances and exits want a connection in one direction - const EntranceElement* const entranceElement = map_get_ride_entrance_element_at(18 << 5, 8 << 5, 14, false); + const EntranceElement* const entranceElement = map_get_ride_entrance_element_at({ 18, 8, 14 }, false); ASSERT_NE(entranceElement, nullptr); EXPECT_TRUE(tile_element_wants_path_connection_towards({ 18, 8, 14, 0 }, nullptr)); EXPECT_FALSE(tile_element_wants_path_connection_towards({ 18, 8, 14, 1 }, nullptr)); @@ -106,7 +106,7 @@ TEST_F(TileElementWantsFootpathConnection, RideEntrance) TEST_F(TileElementWantsFootpathConnection, RideExit) { // The exit has been rotated; it wants a path connection in direction 1, but not 0 like the entrance - const EntranceElement* const exitElement = map_get_ride_exit_element_at(18 << 5, 10 << 5, 14, false); + const EntranceElement* const exitElement = map_get_ride_exit_element_at({ 18, 10, 14 }, false); ASSERT_NE(exitElement, nullptr); EXPECT_FALSE(tile_element_wants_path_connection_towards({ 18, 10, 14, 0 }, nullptr)); EXPECT_TRUE(tile_element_wants_path_connection_towards({ 18, 10, 14, 1 }, nullptr)); From 72d19f779b3250f5cdf59a51750c2703f69e1ec9 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Sat, 14 Dec 2019 23:07:45 -0300 Subject: [PATCH 2/4] Fix clang-format --- src/openrct2/world/Entrance.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/openrct2/world/Entrance.cpp b/src/openrct2/world/Entrance.cpp index 297abd8644..7ffce18957 100644 --- a/src/openrct2/world/Entrance.cpp +++ b/src/openrct2/world/Entrance.cpp @@ -214,9 +214,7 @@ void fix_park_entrance_locations(void) gParkEntrances.erase( std::remove_if( gParkEntrances.begin(), gParkEntrances.end(), - [](const auto& entrance) { - return map_get_park_entrance_element_at(entrance, false) == nullptr; - }), + [](const auto& entrance) { return map_get_park_entrance_element_at(entrance, false) == nullptr; }), gParkEntrances.end()); } From c71c4284d0664396f3d9b10da8b9589cc4ca26c6 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Tue, 17 Dec 2019 23:55:46 -0300 Subject: [PATCH 3/4] Make map entrance/exit fetching functions use only CoordsXY objects --- src/openrct2/rct1/S4Importer.cpp | 5 +++-- src/openrct2/ride/Ride.cpp | 4 ++-- src/openrct2/world/Map.cpp | 6 ++++-- src/openrct2/world/Map.h | 4 ++-- test/tests/TileElements.cpp | 4 ++-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 3b8e986f71..732838c457 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2971,9 +2971,10 @@ private: ride->stations[0].Exit = exitCoords; auto entranceElement = map_get_ride_exit_element_at( - { entranceCoords.x, entranceCoords.y, entranceCoords.z }, false); + { entranceCoords.x << 5, entranceCoords.y << 5, entranceCoords.z << 3 }, false); entranceElement->SetEntranceType(ENTRANCE_TYPE_RIDE_ENTRANCE); - auto exitElement = map_get_ride_entrance_element_at({ exitCoords.x, exitCoords.y, exitCoords.z }, false); + auto exitElement = map_get_ride_entrance_element_at( + { exitCoords.x << 5, exitCoords.y << 5, exitCoords.z << 3 }, false); exitElement->SetEntranceType(ENTRANCE_TYPE_RIDE_EXIT); // Trigger footpath update diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b8f28d1fec..5770fbca2f 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -7678,7 +7678,7 @@ void determine_ride_entrance_and_exit_locations() if (!entranceLoc.isNull()) { const EntranceElement* entranceElement = map_get_ride_entrance_element_at( - { entranceLoc.x, entranceLoc.y, entranceLoc.z }, false); + { entranceLoc.x << 5, entranceLoc.y << 5, entranceLoc.z << 3 }, false); if (entranceElement == nullptr || entranceElement->GetRideIndex() != ride.id || entranceElement->GetStationIndex() != stationIndex) @@ -7694,7 +7694,7 @@ void determine_ride_entrance_and_exit_locations() if (!exitLoc.isNull()) { const EntranceElement* entranceElement = map_get_ride_exit_element_at( - { exitLoc.x, exitLoc.y, exitLoc.z }, false); + { exitLoc.x << 5, exitLoc.y << 5, exitLoc.z << 3 }, false); if (entranceElement == nullptr || entranceElement->GetRideIndex() != ride.id || entranceElement->GetStationIndex() != stationIndex) diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 0a991efae8..89f14b26ac 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -1791,8 +1791,9 @@ EntranceElement* map_get_park_entrance_element_at(const CoordsXYZ& entranceCoord return nullptr; } -EntranceElement* map_get_ride_entrance_element_at(const TileCoordsXYZ& entranceTileCoords, bool ghost) +EntranceElement* map_get_ride_entrance_element_at(const CoordsXYZ& entranceCoords, bool ghost) { + auto entranceTileCoords = TileCoordsXYZ{ entranceCoords }; TileElement* tileElement = map_get_first_element_at(entranceTileCoords.x, entranceTileCoords.y); if (tileElement != nullptr) { @@ -1816,8 +1817,9 @@ EntranceElement* map_get_ride_entrance_element_at(const TileCoordsXYZ& entranceT return nullptr; } -EntranceElement* map_get_ride_exit_element_at(const TileCoordsXYZ& exitTileCoords, bool ghost) +EntranceElement* map_get_ride_exit_element_at(const CoordsXYZ& exitCoords, bool ghost) { + auto exitTileCoords = TileCoordsXYZ{ exitCoords }; TileElement* tileElement = map_get_first_element_at(exitTileCoords.x, exitTileCoords.y); if (tileElement != nullptr) { diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index 3d89135034..42a5229c8a 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -149,8 +149,8 @@ PathElement* map_get_path_element_at(const TileCoordsXYZ& loc); WallElement* map_get_wall_element_at(int32_t x, int32_t y, int32_t z, int32_t direction); SmallSceneryElement* map_get_small_scenery_element_at(int32_t x, int32_t y, int32_t z, int32_t type, uint8_t quadrant); EntranceElement* map_get_park_entrance_element_at(const CoordsXYZ& entranceCoords, bool ghost); -EntranceElement* map_get_ride_entrance_element_at(const TileCoordsXYZ& entranceTileCoords, bool ghost); -EntranceElement* map_get_ride_exit_element_at(const TileCoordsXYZ& exitTileCoords, bool ghost); +EntranceElement* map_get_ride_entrance_element_at(const CoordsXYZ& entranceCoords, bool ghost); +EntranceElement* map_get_ride_exit_element_at(const CoordsXYZ& exitCoords, bool ghost); int16_t tile_element_height(const CoordsXY& loc); int16_t tile_element_water_height(const CoordsXY& loc); uint8_t map_get_highest_land_height(const MapRange& range); diff --git a/test/tests/TileElements.cpp b/test/tests/TileElements.cpp index ef30d5d08b..6c37c09c10 100644 --- a/test/tests/TileElements.cpp +++ b/test/tests/TileElements.cpp @@ -94,7 +94,7 @@ TEST_F(TileElementWantsFootpathConnection, Stall) TEST_F(TileElementWantsFootpathConnection, RideEntrance) { // Ride entrances and exits want a connection in one direction - const EntranceElement* const entranceElement = map_get_ride_entrance_element_at({ 18, 8, 14 }, false); + const EntranceElement* const entranceElement = map_get_ride_entrance_element_at({ 18 << 5, 8 << 5, 14 << 3 }, false); ASSERT_NE(entranceElement, nullptr); EXPECT_TRUE(tile_element_wants_path_connection_towards({ 18, 8, 14, 0 }, nullptr)); EXPECT_FALSE(tile_element_wants_path_connection_towards({ 18, 8, 14, 1 }, nullptr)); @@ -106,7 +106,7 @@ TEST_F(TileElementWantsFootpathConnection, RideEntrance) TEST_F(TileElementWantsFootpathConnection, RideExit) { // The exit has been rotated; it wants a path connection in direction 1, but not 0 like the entrance - const EntranceElement* const exitElement = map_get_ride_exit_element_at({ 18, 10, 14 }, false); + const EntranceElement* const exitElement = map_get_ride_exit_element_at({ 18 << 5, 10 << 5, 14 << 3 }, false); ASSERT_NE(exitElement, nullptr); EXPECT_FALSE(tile_element_wants_path_connection_towards({ 18, 10, 14, 0 }, nullptr)); EXPECT_TRUE(tile_element_wants_path_connection_towards({ 18, 10, 14, 1 }, nullptr)); From aea755bd701ed227ad838ea801750f48122bf5a0 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Thu, 19 Dec 2019 00:11:26 -0300 Subject: [PATCH 4/4] Allow TileCoordsXYZD to generate CoordsXYZD equivalent --- src/openrct2/rct1/S4Importer.cpp | 6 ++---- src/openrct2/ride/Ride.cpp | 6 ++---- src/openrct2/world/Location.hpp | 5 +++++ test/tests/TileElements.cpp | 5 +++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 732838c457..61e338ba41 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2970,11 +2970,9 @@ private: ride->stations[0].Entrance = entranceCoords; ride->stations[0].Exit = exitCoords; - auto entranceElement = map_get_ride_exit_element_at( - { entranceCoords.x << 5, entranceCoords.y << 5, entranceCoords.z << 3 }, false); + auto entranceElement = map_get_ride_exit_element_at(entranceCoords.ToCoordsXYZD(), false); entranceElement->SetEntranceType(ENTRANCE_TYPE_RIDE_ENTRANCE); - auto exitElement = map_get_ride_entrance_element_at( - { exitCoords.x << 5, exitCoords.y << 5, exitCoords.z << 3 }, false); + auto exitElement = map_get_ride_entrance_element_at(exitCoords.ToCoordsXYZD(), false); exitElement->SetEntranceType(ENTRANCE_TYPE_RIDE_EXIT); // Trigger footpath update diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 5770fbca2f..ba2688e7d5 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -7677,8 +7677,7 @@ void determine_ride_entrance_and_exit_locations() // Skip if the station has no entrance if (!entranceLoc.isNull()) { - const EntranceElement* entranceElement = map_get_ride_entrance_element_at( - { entranceLoc.x << 5, entranceLoc.y << 5, entranceLoc.z << 3 }, false); + const EntranceElement* entranceElement = map_get_ride_entrance_element_at(entranceLoc.ToCoordsXYZD(), false); if (entranceElement == nullptr || entranceElement->GetRideIndex() != ride.id || entranceElement->GetStationIndex() != stationIndex) @@ -7693,8 +7692,7 @@ void determine_ride_entrance_and_exit_locations() if (!exitLoc.isNull()) { - const EntranceElement* entranceElement = map_get_ride_exit_element_at( - { exitLoc.x << 5, exitLoc.y << 5, exitLoc.z << 3 }, false); + const EntranceElement* entranceElement = map_get_ride_exit_element_at(exitLoc.ToCoordsXYZD(), false); if (entranceElement == nullptr || entranceElement->GetRideIndex() != ride.id || entranceElement->GetStationIndex() != stationIndex) diff --git a/src/openrct2/world/Location.hpp b/src/openrct2/world/Location.hpp index fc02a12663..098ba1ed7b 100644 --- a/src/openrct2/world/Location.hpp +++ b/src/openrct2/world/Location.hpp @@ -384,6 +384,11 @@ struct TileCoordsXYZD { return x == COORDS_NULL; }; + + CoordsXYZD ToCoordsXYZD() const + { + return { x * 32, y * 32, z * 8, direction }; + } }; /** diff --git a/test/tests/TileElements.cpp b/test/tests/TileElements.cpp index 6c37c09c10..c4e6285a2e 100644 --- a/test/tests/TileElements.cpp +++ b/test/tests/TileElements.cpp @@ -94,7 +94,8 @@ TEST_F(TileElementWantsFootpathConnection, Stall) TEST_F(TileElementWantsFootpathConnection, RideEntrance) { // Ride entrances and exits want a connection in one direction - const EntranceElement* const entranceElement = map_get_ride_entrance_element_at({ 18 << 5, 8 << 5, 14 << 3 }, false); + const EntranceElement* const entranceElement = map_get_ride_entrance_element_at( + TileCoordsXYZ{ 18, 8, 14 }.ToCoordsXYZ(), false); ASSERT_NE(entranceElement, nullptr); EXPECT_TRUE(tile_element_wants_path_connection_towards({ 18, 8, 14, 0 }, nullptr)); EXPECT_FALSE(tile_element_wants_path_connection_towards({ 18, 8, 14, 1 }, nullptr)); @@ -106,7 +107,7 @@ TEST_F(TileElementWantsFootpathConnection, RideEntrance) TEST_F(TileElementWantsFootpathConnection, RideExit) { // The exit has been rotated; it wants a path connection in direction 1, but not 0 like the entrance - const EntranceElement* const exitElement = map_get_ride_exit_element_at({ 18 << 5, 10 << 5, 14 << 3 }, false); + const EntranceElement* const exitElement = map_get_ride_exit_element_at(TileCoordsXYZ{ 18, 10, 14 }.ToCoordsXYZ(), false); ASSERT_NE(exitElement, nullptr); EXPECT_FALSE(tile_element_wants_path_connection_towards({ 18, 10, 14, 0 }, nullptr)); EXPECT_TRUE(tile_element_wants_path_connection_towards({ 18, 10, 14, 1 }, nullptr));