From a2c7ecc6e5b3fff013448ed87b6964de2dc4c4d3 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Mon, 23 Dec 2019 04:35:41 -0300 Subject: [PATCH] Make Map::map_get_first_element_at() use CoordsXY (#10413) * Make Map::map_get_first_element_at() use CoordsXY * Fix clang-format on ClearAction.hpp * Prefer TileDIrectionDelta over hardcoded delta on RideConstruction * Use named Direction constants * Make Compat::map_get_first_element_at() use CoordsXY --- .../interface/ViewportInteraction.cpp | 2 +- src/openrct2-ui/windows/Banner.cpp | 4 +- src/openrct2-ui/windows/Footpath.cpp | 2 +- src/openrct2-ui/windows/RideConstruction.cpp | 36 ++++++----- src/openrct2-ui/windows/Sign.cpp | 8 +-- src/openrct2-ui/windows/TileInspector.cpp | 8 +-- src/openrct2/actions/BannerPlaceAction.hpp | 2 +- src/openrct2/actions/BannerRemoveAction.hpp | 2 +- src/openrct2/actions/ClearAction.hpp | 4 +- src/openrct2/actions/FootpathPlaceAction.hpp | 2 +- src/openrct2/actions/LandSetHeightAction.hpp | 10 +-- src/openrct2/actions/LandSetRightsAction.hpp | 2 +- .../actions/LargeSceneryRemoveAction.hpp | 4 +- .../actions/RideEntranceExitRemoveAction.hpp | 4 +- .../actions/SmallSceneryRemoveAction.hpp | 2 +- src/openrct2/actions/TrackRemoveAction.hpp | 8 +-- src/openrct2/actions/WallPlaceAction.hpp | 2 +- src/openrct2/actions/WallRemoveAction.hpp | 2 +- src/openrct2/interface/Screenshot.cpp | 2 +- src/openrct2/paint/VirtualFloor.cpp | 2 +- .../paint/tile_element/Paint.TileElement.cpp | 2 +- src/openrct2/peep/Guest.cpp | 26 ++++---- src/openrct2/peep/GuestPathfinding.cpp | 12 ++-- src/openrct2/peep/Peep.cpp | 8 +-- src/openrct2/peep/Staff.cpp | 14 ++--- src/openrct2/rct1/S4Importer.cpp | 4 +- src/openrct2/ride/Ride.cpp | 34 +++++----- src/openrct2/ride/RideRatings.cpp | 12 ++-- src/openrct2/ride/Station.cpp | 4 +- src/openrct2/ride/Track.cpp | 2 +- src/openrct2/ride/TrackDesign.cpp | 16 ++--- src/openrct2/ride/TrackDesignSave.cpp | 2 +- src/openrct2/ride/Vehicle.cpp | 6 +- src/openrct2/ride/transport/Chairlift.cpp | 2 +- src/openrct2/world/Banner.cpp | 8 +-- src/openrct2/world/Entrance.cpp | 4 +- src/openrct2/world/Footpath.cpp | 30 ++++----- src/openrct2/world/Fountain.cpp | 2 +- src/openrct2/world/Location.hpp | 5 ++ src/openrct2/world/Map.cpp | 63 +++++++++---------- src/openrct2/world/Map.h | 2 +- src/openrct2/world/MapAnimation.cpp | 26 ++++---- src/openrct2/world/Park.cpp | 2 +- src/openrct2/world/Scenery.cpp | 4 +- src/openrct2/world/Sprite.cpp | 2 +- src/openrct2/world/TileInspector.cpp | 8 +-- src/openrct2/world/Wall.cpp | 4 +- test/testpaint/Compat.cpp | 7 ++- 48 files changed, 213 insertions(+), 206 deletions(-) diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 7099bf636a..685b0e1607 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -527,7 +527,7 @@ static void viewport_interaction_remove_footpath(TileElement* tileElement, Coord if (w != nullptr) footpath_provisional_update(); - tileElement2 = map_get_first_element_at(mapCoords.x / 32, mapCoords.y / 32); + tileElement2 = map_get_first_element_at(mapCoords); if (tileElement2 == nullptr) return; do diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index c2cd216a7b..fe72bf4c94 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -136,7 +136,7 @@ rct_window* window_banner_open(rct_windownumber number) int32_t view_x = banner->position.x << 5; int32_t view_y = banner->position.y << 5; - TileElement* tile_element = map_get_first_element_at(view_x / 32, view_y / 32); + TileElement* tile_element = map_get_first_element_at({ view_x, view_y }); if (tile_element == nullptr) return nullptr; while (1) @@ -177,7 +177,7 @@ static void window_banner_mouseup(rct_window* w, rct_widgetindex widgetIndex) int32_t x = banner->position.x << 5; int32_t y = banner->position.y << 5; - TileElement* tile_element = map_get_first_element_at(x / 32, y / 32); + TileElement* tile_element = map_get_first_element_at({ x, y }); if (tile_element == nullptr) return; diff --git a/src/openrct2-ui/windows/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp index bf7b6097c1..ef119fd4da 100644 --- a/src/openrct2-ui/windows/Footpath.cpp +++ b/src/openrct2-ui/windows/Footpath.cpp @@ -1078,7 +1078,7 @@ static TileElement* footpath_get_tile_element_to_remove() z = (gFootpathConstructFromPosition.z >> 3) & 0xFF; zLow = z - 2; - tileElement = map_get_first_element_at(x, y); + tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); do { if (tileElement == nullptr) diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 459a79c43c..302335690d 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -2435,19 +2435,23 @@ static void sub_6CBCE2( int32_t baseZ = (originZ + trackBlock->z) >> 3; int32_t clearanceZ = ((trackBlock->var_07 + RideData5[ride->type].clearance_height) >> 3) + baseZ + 4; - auto tileCoords = TileCoordsXY{ coords }; + auto centreTileCoords = TileCoordsXY{ coords }; + auto eastTileCoords = centreTileCoords + TileDirectionDelta[TILE_ELEMENT_DIRECTION_EAST]; + auto westTileCoords = centreTileCoords + TileDirectionDelta[TILE_ELEMENT_DIRECTION_WEST]; + auto northTileCoords = centreTileCoords + TileDirectionDelta[TILE_ELEMENT_DIRECTION_NORTH]; + auto southTileCoords = centreTileCoords + TileDirectionDelta[TILE_ELEMENT_DIRECTION_SOUTH]; // Replace map elements with temporary ones containing track - _backupTileElementArrays[0] = map_get_first_element_at(tileCoords.x + 0, tileCoords.y + 0); - _backupTileElementArrays[1] = map_get_first_element_at(tileCoords.x + 1, tileCoords.y + 0); - _backupTileElementArrays[2] = map_get_first_element_at(tileCoords.x - 1, tileCoords.y + 0); - _backupTileElementArrays[3] = map_get_first_element_at(tileCoords.x + 0, tileCoords.y + 1); - _backupTileElementArrays[4] = map_get_first_element_at(tileCoords.x + 0, tileCoords.y - 1); - map_set_tile_element({ tileCoords.x + 0, tileCoords.y + 0 }, &_tempTrackTileElement); - map_set_tile_element({ tileCoords.x + 1, tileCoords.y + 0 }, &_tempSideTrackTileElement); - map_set_tile_element({ tileCoords.x - 1, tileCoords.y + 0 }, &_tempSideTrackTileElement); - map_set_tile_element({ tileCoords.x + 0, tileCoords.y + 1 }, &_tempSideTrackTileElement); - map_set_tile_element({ tileCoords.x + 0, tileCoords.y - 1 }, &_tempSideTrackTileElement); + _backupTileElementArrays[0] = map_get_first_element_at(centreTileCoords.ToCoordsXY()); + _backupTileElementArrays[1] = map_get_first_element_at(eastTileCoords.ToCoordsXY()); + _backupTileElementArrays[2] = map_get_first_element_at(westTileCoords.ToCoordsXY()); + _backupTileElementArrays[3] = map_get_first_element_at(northTileCoords.ToCoordsXY()); + _backupTileElementArrays[4] = map_get_first_element_at(southTileCoords.ToCoordsXY()); + map_set_tile_element(centreTileCoords, &_tempTrackTileElement); + map_set_tile_element(eastTileCoords, &_tempSideTrackTileElement); + map_set_tile_element(westTileCoords, &_tempSideTrackTileElement); + map_set_tile_element(northTileCoords, &_tempSideTrackTileElement); + map_set_tile_element(southTileCoords, &_tempSideTrackTileElement); // Set the temporary track element _tempTrackTileElement.SetType(TILE_ELEMENT_TYPE_TRACK); @@ -2469,11 +2473,11 @@ static void sub_6CBCE2( sub_68B2B7(session, coords); // Restore map elements - map_set_tile_element({ tileCoords.x + 0, tileCoords.y + 0 }, _backupTileElementArrays[0]); - map_set_tile_element({ tileCoords.x + 1, tileCoords.y + 0 }, _backupTileElementArrays[1]); - map_set_tile_element({ tileCoords.x - 1, tileCoords.y + 0 }, _backupTileElementArrays[2]); - map_set_tile_element({ tileCoords.x + 0, tileCoords.y + 1 }, _backupTileElementArrays[3]); - map_set_tile_element({ tileCoords.x + 0, tileCoords.y - 1 }, _backupTileElementArrays[4]); + map_set_tile_element(centreTileCoords, _backupTileElementArrays[0]); + map_set_tile_element(eastTileCoords, _backupTileElementArrays[1]); + map_set_tile_element(westTileCoords, _backupTileElementArrays[2]); + map_set_tile_element(northTileCoords, _backupTileElementArrays[3]); + map_set_tile_element(southTileCoords, _backupTileElementArrays[4]); trackBlock++; } diff --git a/src/openrct2-ui/windows/Sign.cpp b/src/openrct2-ui/windows/Sign.cpp index 175627f562..6689059a6b 100644 --- a/src/openrct2-ui/windows/Sign.cpp +++ b/src/openrct2-ui/windows/Sign.cpp @@ -159,7 +159,7 @@ rct_window* window_sign_open(rct_windownumber number) int32_t view_x = banner->position.x << 5; int32_t view_y = banner->position.y << 5; - TileElement* tile_element = map_get_first_element_at(view_x / 32, view_y / 32); + TileElement* tile_element = map_get_first_element_at({ view_x, view_y }); if (tile_element == nullptr) return nullptr; @@ -217,7 +217,7 @@ static void window_sign_mouseup(rct_window* w, rct_widgetindex widgetIndex) auto banner = GetBanner(w->number); int32_t x = banner->position.x << 5; int32_t y = banner->position.y << 5; - auto tile_element = map_get_first_element_at(x / 32, y / 32); + auto tile_element = map_get_first_element_at({ x, y }); if (tile_element == nullptr) return; while (1) @@ -408,7 +408,7 @@ rct_window* window_sign_small_open(rct_windownumber number) int32_t view_x = banner->position.x << 5; int32_t view_y = banner->position.y << 5; - TileElement* tile_element = map_get_first_element_at(view_x / 32, view_y / 32); + TileElement* tile_element = map_get_first_element_at({ view_x, view_y }); if (tile_element == nullptr) return nullptr; @@ -465,7 +465,7 @@ static void window_sign_small_mouseup(rct_window* w, rct_widgetindex widgetIndex auto banner = GetBanner(w->number); int32_t x = banner->position.x << 5; int32_t y = banner->position.y << 5; - auto tile_element = map_get_first_element_at(x / 32, y / 32); + auto tile_element = map_get_first_element_at({ x, y }); if (tile_element == nullptr) return; while (true) diff --git a/src/openrct2-ui/windows/TileInspector.cpp b/src/openrct2-ui/windows/TileInspector.cpp index 53006b0145..d667eb7328 100644 --- a/src/openrct2-ui/windows/TileInspector.cpp +++ b/src/openrct2-ui/windows/TileInspector.cpp @@ -576,8 +576,7 @@ static TileElement* window_tile_inspector_get_selected_element(rct_window* w) openrct2_assert( windowTileInspectorSelectedIndex >= 0 && windowTileInspectorSelectedIndex < windowTileInspectorElementCount, "Selected list item out of range"); - return map_get_first_element_at(windowTileInspectorToolMap.x / 32, windowTileInspectorToolMap.y / 32) - + windowTileInspectorSelectedIndex; + return map_get_first_element_at(windowTileInspectorToolMap) + windowTileInspectorSelectedIndex; } static void window_tile_inspector_select_element_from_list(rct_window* w, int32_t index) @@ -599,7 +598,7 @@ static void window_tile_inspector_load_tile(rct_window* w, TileElement* elementT windowTileInspectorSelectedIndex = -1; w->scrolls[0].v_top = 0; - TileElement* element = map_get_first_element_at(windowTileInspectorToolMap.x / 32, windowTileInspectorToolMap.y / 32); + TileElement* element = map_get_first_element_at(windowTileInspectorToolMap); int16_t numItems = 0; do { @@ -2168,8 +2167,7 @@ static void window_tile_inspector_scrollpaint(rct_window* w, rct_drawpixelinfo* if (!windowTileInspectorTileSelected) return; - const TileElement* tileElement = map_get_first_element_at( - windowTileInspectorToolMap.x / 32, windowTileInspectorToolMap.y / 32); + const TileElement* tileElement = map_get_first_element_at(windowTileInspectorToolMap); gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM; do diff --git a/src/openrct2/actions/BannerPlaceAction.hpp b/src/openrct2/actions/BannerPlaceAction.hpp index 54ef08dbae..cec67e4e32 100644 --- a/src/openrct2/actions/BannerPlaceAction.hpp +++ b/src/openrct2/actions/BannerPlaceAction.hpp @@ -173,7 +173,7 @@ public: private: PathElement* GetValidPathElement() const { - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/BannerRemoveAction.hpp b/src/openrct2/actions/BannerRemoveAction.hpp index e093ebbfe5..bdf82839a7 100644 --- a/src/openrct2/actions/BannerRemoveAction.hpp +++ b/src/openrct2/actions/BannerRemoveAction.hpp @@ -129,7 +129,7 @@ public: private: BannerElement* GetBannerElementAt() const { - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); // Find the banner element at known z and position do diff --git a/src/openrct2/actions/ClearAction.hpp b/src/openrct2/actions/ClearAction.hpp index 8ff04526ab..3c8f873d33 100644 --- a/src/openrct2/actions/ClearAction.hpp +++ b/src/openrct2/actions/ClearAction.hpp @@ -143,7 +143,7 @@ private: do { tileEdited = false; - tileElement = map_get_first_element_at(x, y); + tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) return totalCost; do @@ -240,7 +240,7 @@ private: { for (int32_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) { - auto tileElement = map_get_first_element_at(x, y); + auto tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/FootpathPlaceAction.hpp b/src/openrct2/actions/FootpathPlaceAction.hpp index 4badc3c3c6..a16d3281a3 100644 --- a/src/openrct2/actions/FootpathPlaceAction.hpp +++ b/src/openrct2/actions/FootpathPlaceAction.hpp @@ -437,7 +437,7 @@ private: TileElement* tileElement; bool isSloped = slope & FOOTPATH_PROPERTIES_FLAG_IS_SLOPED; - tileElement = map_get_first_element_at(x, y); + tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/LandSetHeightAction.hpp b/src/openrct2/actions/LandSetHeightAction.hpp index 3a3d3bbc74..15d0159ca3 100644 --- a/src/openrct2/actions/LandSetHeightAction.hpp +++ b/src/openrct2/actions/LandSetHeightAction.hpp @@ -204,7 +204,7 @@ private: TileElement* CheckTreeObstructions() const { - TileElement* tileElement = map_get_first_element_at(_coords.x / 32, _coords.y / 32); + TileElement* tileElement = map_get_first_element_at(_coords); do { if (tileElement == nullptr) @@ -227,7 +227,7 @@ private: money32 GetSmallSceneryRemovalCost() const { money32 cost{ 0 }; - TileElement* tileElement = map_get_first_element_at(_coords.x / 32, _coords.y / 32); + TileElement* tileElement = map_get_first_element_at(_coords); do { if (tileElement == nullptr) @@ -246,7 +246,7 @@ private: void SmallSceneryRemoval() const { - TileElement* tileElement = map_get_first_element_at(_coords.x / 32, _coords.y / 32); + TileElement* tileElement = map_get_first_element_at(_coords); do { if (tileElement == nullptr) @@ -263,7 +263,7 @@ private: rct_string_id CheckRideSupports() const { - TileElement* tileElement = map_get_first_element_at(_coords.x / 32, _coords.y / 32); + TileElement* tileElement = map_get_first_element_at(_coords); do { if (tileElement == nullptr) @@ -320,7 +320,7 @@ private: TileElement* CheckUnremovableObstructions(TileElement * surfaceElement, uint8_t zCorner) const { - TileElement* tileElement = map_get_first_element_at(_coords.x / 32, _coords.y / 32); + TileElement* tileElement = map_get_first_element_at(_coords); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/LandSetRightsAction.hpp b/src/openrct2/actions/LandSetRightsAction.hpp index 8ff958e642..0cb6634a4b 100644 --- a/src/openrct2/actions/LandSetRightsAction.hpp +++ b/src/openrct2/actions/LandSetRightsAction.hpp @@ -179,7 +179,7 @@ private: return res; } - TileElement* tileElement = map_get_first_element_at(loc.x / 32, loc.y / 32); + TileElement* tileElement = map_get_first_element_at(loc); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/LargeSceneryRemoveAction.hpp b/src/openrct2/actions/LargeSceneryRemoveAction.hpp index 90f5943620..e2e5f781c1 100644 --- a/src/openrct2/actions/LargeSceneryRemoveAction.hpp +++ b/src/openrct2/actions/LargeSceneryRemoveAction.hpp @@ -163,7 +163,7 @@ public: } } - TileElement* sceneryElement = map_get_first_element_at(currentTile.x / 32, currentTile.y / 32); + TileElement* sceneryElement = map_get_first_element_at(currentTile); bool element_found = false; if (sceneryElement != nullptr) { @@ -207,7 +207,7 @@ public: private: TileElement* FindLargeSceneryElement() const { - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); if (tileElement == nullptr) return nullptr; diff --git a/src/openrct2/actions/RideEntranceExitRemoveAction.hpp b/src/openrct2/actions/RideEntranceExitRemoveAction.hpp index 22c9b07dac..566dd5ae82 100644 --- a/src/openrct2/actions/RideEntranceExitRemoveAction.hpp +++ b/src/openrct2/actions/RideEntranceExitRemoveAction.hpp @@ -65,7 +65,7 @@ public: } bool found = false; - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); do { @@ -125,7 +125,7 @@ public: } bool found = false; - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); do { diff --git a/src/openrct2/actions/SmallSceneryRemoveAction.hpp b/src/openrct2/actions/SmallSceneryRemoveAction.hpp index 0b2c47b86a..ee211bd553 100644 --- a/src/openrct2/actions/SmallSceneryRemoveAction.hpp +++ b/src/openrct2/actions/SmallSceneryRemoveAction.hpp @@ -135,7 +135,7 @@ public: private: TileElement* FindSceneryElement() const { - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); if (!tileElement) return nullptr; diff --git a/src/openrct2/actions/TrackRemoveAction.hpp b/src/openrct2/actions/TrackRemoveAction.hpp index 20092b4240..4e8ad0410e 100644 --- a/src/openrct2/actions/TrackRemoveAction.hpp +++ b/src/openrct2/actions/TrackRemoveAction.hpp @@ -71,7 +71,7 @@ public: bool found = false; bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; - TileElement* tileElement = map_get_first_element_at(_origin.x / 32, _origin.y / 32); + TileElement* tileElement = map_get_first_element_at(_origin); do { @@ -157,7 +157,7 @@ public: map_invalidate_tile_full(mapLoc.x, mapLoc.y); found = false; - tileElement = map_get_first_element_at(mapLoc.x / 32, mapLoc.y / 32); + tileElement = map_get_first_element_at(mapLoc); do { if (tileElement == nullptr) @@ -267,7 +267,7 @@ public: bool found = false; bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; - TileElement* tileElement = map_get_first_element_at(_origin.x / 32, _origin.y / 32); + TileElement* tileElement = map_get_first_element_at(_origin); do { @@ -347,7 +347,7 @@ public: map_invalidate_tile_full(mapLoc.x, mapLoc.y); found = false; - tileElement = map_get_first_element_at(mapLoc.x / 32, mapLoc.y / 32); + tileElement = map_get_first_element_at(mapLoc); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/WallPlaceAction.hpp b/src/openrct2/actions/WallPlaceAction.hpp index b4163cacc8..e99ebca351 100644 --- a/src/openrct2/actions/WallPlaceAction.hpp +++ b/src/openrct2/actions/WallPlaceAction.hpp @@ -619,7 +619,7 @@ private: return false; } - TileElement* tileElement = map_get_first_element_at(_loc.x / 32, _loc.y / 32); + TileElement* tileElement = map_get_first_element_at(_loc); do { if (tileElement == nullptr) diff --git a/src/openrct2/actions/WallRemoveAction.hpp b/src/openrct2/actions/WallRemoveAction.hpp index 993e88bd60..9c9a5baeb1 100644 --- a/src/openrct2/actions/WallRemoveAction.hpp +++ b/src/openrct2/actions/WallRemoveAction.hpp @@ -96,7 +96,7 @@ public: private: TileElement* GetFirstWallElementAt(const CoordsXYZD& location, bool isGhost) const { - TileElement* tileElement = map_get_first_element_at(location.x / 32, location.y / 32); + TileElement* tileElement = map_get_first_element_at(location); if (!tileElement) return nullptr; diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index 707cf7dd9b..3b7ba59ae4 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -292,7 +292,7 @@ static CoordsXY GetEdgeTile(int32_t mapSize, int32_t rotation, EdgeType edgeType static int32_t GetHighestBaseClearanceZ(CoordsXY location) { int32_t z = 0; - auto element = map_get_first_element_at(location.x >> 5, location.y >> 5); + auto element = map_get_first_element_at(location); if (element != nullptr) { do diff --git a/src/openrct2/paint/VirtualFloor.cpp b/src/openrct2/paint/VirtualFloor.cpp index 0c70e399dc..bebb23c139 100644 --- a/src/openrct2/paint/VirtualFloor.cpp +++ b/src/openrct2/paint/VirtualFloor.cpp @@ -242,7 +242,7 @@ static void virtual_floor_get_tile_properties( // * Surfaces, which may put us underground // * Walls / banners, which are displayed as occupied edges // * Ghost objects, which are displayed as lit squares - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do diff --git a/src/openrct2/paint/tile_element/Paint.TileElement.cpp b/src/openrct2/paint/tile_element/Paint.TileElement.cpp index 2b45fa799a..bb22396302 100644 --- a/src/openrct2/paint/tile_element/Paint.TileElement.cpp +++ b/src/openrct2/paint/tile_element/Paint.TileElement.cpp @@ -154,7 +154,7 @@ static void sub_68B3FB(paint_session* session, int32_t x, int32_t y) session->MapPosition.x = x; session->MapPosition.y = y; - TileElement* tile_element = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tile_element = map_get_first_element_at({ x, y }); if (tile_element == nullptr) return; uint8_t rotation = session->CurrentRotation; diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index 168cd8c3a6..831be74d79 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -956,7 +956,7 @@ void Guest::Tick128UpdateGuest(int32_t index) { /* Peep happiness is affected once the peep has been waiting * too long in a queue. */ - TileElement* tileElement = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* tileElement = map_get_first_element_at({ next_x, next_y }); bool found = false; do { @@ -1932,7 +1932,7 @@ std::bitset Guest::FindRidesToGoOn() { if (map_is_location_valid({ tileX, tileY })) { - auto tileElement = map_get_first_element_at(tileX >> 5, tileY >> 5); + auto tileElement = map_get_first_element_at({ tileX, tileY }); if (tileElement != nullptr) { do @@ -2950,7 +2950,7 @@ static PeepThoughtType peep_assess_surroundings(int16_t centre_x, int16_t centre { for (int16_t y = initial_y; y < final_y; y += 32) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) continue; do @@ -3189,7 +3189,7 @@ template static void peep_head_for_nearest_ride(Guest* peep, bool co { if (map_is_location_valid({ x, y })) { - auto tileElement = map_get_first_element_at(x >> 5, y >> 5); + auto tileElement = map_get_first_element_at({ x, y }); if (tileElement != nullptr) { do @@ -4179,7 +4179,7 @@ void Guest::UpdateRideLeaveVehicle() if (trackType == TRACK_ELEM_FLAT || trackType > TRACK_ELEM_MIDDLE_STATION) continue; - TileElement* inner_map = map_get_first_element_at(vehicle->track_x / 32, vehicle->track_y / 32); + TileElement* inner_map = map_get_first_element_at({ vehicle->track_x, vehicle->track_y }); if (inner_map == nullptr) continue; for (;; inner_map++) @@ -4942,7 +4942,7 @@ void Guest::UpdateRideMazePathfinding() }; maze_type mazeType = maze_type::invalid; - auto tileElement = map_get_first_element_at(targetLoc.x / 32, targetLoc.y / 32); + auto tileElement = map_get_first_element_at(targetLoc); if (tileElement == nullptr) return; do @@ -5038,7 +5038,7 @@ void Guest::UpdateRideLeaveExit() CoordsXY targetLoc = { x, y }; // Find the station track element - TileElement* tileElement = map_get_first_element_at(targetLoc.x / 32, targetLoc.y / 32); + TileElement* tileElement = map_get_first_element_at(targetLoc); if (tileElement == nullptr) return; do @@ -5462,7 +5462,7 @@ void Guest::UpdateWalking() if (GetNextIsSurface() || GetNextIsSloped()) return; - TileElement* tileElement = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* tileElement = map_get_first_element_at({ next_x, next_y }); if (tileElement == nullptr) return; @@ -5880,7 +5880,7 @@ void Guest::UpdateUsingBin() return; } - TileElement* tileElement = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* tileElement = map_get_first_element_at({ next_x, next_y }); if (tileElement == nullptr) return; @@ -6050,7 +6050,7 @@ bool Guest::UpdateWalkingFindBench() if (!ShouldFindBench()) return false; - TileElement* tileElement = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* tileElement = map_get_first_element_at({ next_x, next_y }); if (tileElement == nullptr) return false; @@ -6147,7 +6147,7 @@ bool Guest::UpdateWalkingFindBin() if (peep->GetNextIsSurface()) return false; - TileElement* tileElement = map_get_first_element_at(peep->next_x / 32, peep->next_y / 32); + TileElement* tileElement = map_get_first_element_at({ peep->next_x, peep->next_y }); if (tileElement == nullptr) return false; @@ -6250,7 +6250,7 @@ static void peep_update_walking_break_scenery(Peep* peep) if (peep->GetNextIsSurface()) return; - TileElement* tileElement = map_get_first_element_at(peep->next_x / 32, peep->next_y / 32); + TileElement* tileElement = map_get_first_element_at({ peep->next_x, peep->next_y }); if (tileElement == nullptr) return; @@ -6893,7 +6893,7 @@ void Guest::UpdateSpriteType() { if ((x & 0xFFE0) < 0x1FFF && (y & 0xFFE0) < 0x1FFF) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); while (true) { if (tileElement == nullptr) diff --git a/src/openrct2/peep/GuestPathfinding.cpp b/src/openrct2/peep/GuestPathfinding.cpp index 312f70769e..9bfd6a1252 100644 --- a/src/openrct2/peep/GuestPathfinding.cpp +++ b/src/openrct2/peep/GuestPathfinding.cpp @@ -236,7 +236,7 @@ static uint8_t footpath_element_next_in_direction(TileCoordsXYZ loc, PathElement } loc += TileDirectionDelta[chosenDirection]; - nextTileElement = map_get_first_element_at(loc.x, loc.y); + nextTileElement = map_get_first_element_at(loc.ToCoordsXY()); do { if (nextTileElement == nullptr) @@ -287,7 +287,7 @@ static uint8_t footpath_element_dest_in_dir( return PATH_SEARCH_LIMIT_REACHED; loc += TileDirectionDelta[chosenDirection]; - tileElement = map_get_first_element_at(loc.x, loc.y); + tileElement = map_get_first_element_at(loc.ToCoordsXY()); if (tileElement == nullptr) { return PATH_SEARCH_FAILED; @@ -649,7 +649,7 @@ static void peep_pathfind_heuristic_search( /* Get the next map element of interest in the direction of test_edge. */ bool found = false; - TileElement* tileElement = map_get_first_element_at(loc.x, loc.y); + TileElement* tileElement = map_get_first_element_at(loc.ToCoordsXY()); if (tileElement == nullptr) { return; @@ -1188,7 +1188,7 @@ Direction peep_pathfind_choose_direction(TileCoordsXYZ loc, Peep* peep) #endif // defined(DEBUG_LEVEL_1) && DEBUG_LEVEL_1 // Get the path element at this location - TileElement* dest_tile_element = map_get_first_element_at(loc.x, loc.y); + TileElement* dest_tile_element = map_get_first_element_at(loc.ToCoordsXY()); /* Where there are multiple matching map elements placed with zero * clearance, save the first one for later use to determine the path * slope - this maintains the original behaviour (which only processes @@ -1722,7 +1722,7 @@ static int32_t guest_path_find_park_entrance(Peep* peep, uint8_t edges) static void get_ride_queue_end(TileCoordsXYZ& loc) { TileCoordsXY queueEnd = { 0, 0 }; - TileElement* tileElement = map_get_first_element_at(loc.x, loc.y); + TileElement* tileElement = map_get_first_element_at(loc.ToCoordsXY()); if (tileElement == nullptr) { @@ -1770,7 +1770,7 @@ static void get_ride_queue_end(TileCoordsXYZ& loc) } nextTile += TileDirectionDelta[direction]; - tileElement = map_get_first_element_at(nextTile.x, nextTile.y); + tileElement = map_get_first_element_at(nextTile.ToCoordsXY()); found = false; if (tileElement == nullptr) break; diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 8c5cc1044a..4b210f61cb 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -472,7 +472,7 @@ bool Peep::CheckForPath() return true; } - TileElement* tile_element = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* tile_element = map_get_first_element_at({ next_x, next_y }); uint8_t map_type = TILE_ELEMENT_TYPE_PATH; if (GetNextIsSurface()) @@ -899,7 +899,7 @@ void Peep::UpdateFalling() } // If not drowning then falling. Note: peeps 'fall' after leaving a ride/enter the park. - TileElement* tile_element = map_get_first_element_at(x / 32, y / 32); + TileElement* tile_element = map_get_first_element_at({ x, y }); TileElement* saved_map = nullptr; int32_t saved_height = 0; @@ -2540,7 +2540,7 @@ static void peep_interact_with_entrance(Peep* peep, int16_t x, int16_t y, TileEl int16_t next_y = (y & 0xFFE0) + CoordsDirectionDelta[entranceDirection].y; // Make sure there is a path right behind the entrance, otherwise turn around - TileElement* nextTileElement = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* nextTileElement = map_get_first_element_at({ next_x, next_y }); do { if (nextTileElement == nullptr) @@ -3096,7 +3096,7 @@ void Peep::PerformNextAction(uint8_t& pathing_result, TileElement*& tile_result) return; } - TileElement* tileElement = map_get_first_element_at(newLoc.x / 32, newLoc.y / 32); + TileElement* tileElement = map_get_first_element_at(newLoc); if (tileElement == nullptr) return; int16_t base_z = std::max(0, (z / 8) - 2); diff --git a/src/openrct2/peep/Staff.cpp b/src/openrct2/peep/Staff.cpp index ddf6621c7f..180caba2eb 100644 --- a/src/openrct2/peep/Staff.cpp +++ b/src/openrct2/peep/Staff.cpp @@ -267,7 +267,7 @@ bool staff_can_ignore_wide_flag(Peep* staff, int32_t x, int32_t y, uint8_t z, Ti } /* Search through all adjacent map elements */ - TileElement* test_element = map_get_first_element_at(adjac_x / 32, adjac_y / 32); + TileElement* test_element = map_get_first_element_at({ adjac_x, adjac_y }); if (test_element == nullptr) return false; bool pathfound = false; @@ -475,7 +475,7 @@ static uint8_t staff_handyman_direction_to_nearest_litter(Peep* peep) int16_t nextZ = ((peep->z + 8) & 0xFFF0) / 8; - TileElement* tileElement = map_get_first_element_at(nextTile.x / 32, nextTile.y / 32); + TileElement* tileElement = map_get_first_element_at(nextTile); if (tileElement == nullptr) return 0xFF; do @@ -491,7 +491,7 @@ static uint8_t staff_handyman_direction_to_nearest_litter(Peep* peep) nextTile.x = (peep->x & 0xFFE0) + CoordsDirectionDelta[nextDirection].x; nextTile.y = (peep->y & 0xFFE0) + CoordsDirectionDelta[nextDirection].y; - tileElement = map_get_first_element_at(nextTile.x / 32, nextTile.y / 32); + tileElement = map_get_first_element_at(nextTile); if (tileElement == nullptr) return 0xFF; @@ -1256,7 +1256,7 @@ void Staff::UpdateWatering() int32_t actionX = next_x + CoordsDirectionDelta[var_37].x; int32_t actionY = next_y + CoordsDirectionDelta[var_37].y; - TileElement* tile_element = map_get_first_element_at(actionX / 32, actionY / 32); + TileElement* tile_element = map_get_first_element_at({ actionX, actionY }); if (tile_element == nullptr) return; @@ -1323,7 +1323,7 @@ void Staff::UpdateEmptyingBin() if (action_frame != 11) return; - TileElement* tile_element = map_get_first_element_at(next_x / 32, next_y / 32); + TileElement* tile_element = map_get_first_element_at({ next_x, next_y }); if (tile_element == nullptr) return; @@ -1641,7 +1641,7 @@ static int32_t peep_update_patrolling_find_watering(Peep* peep) int32_t x = peep->next_x + CoordsDirectionDelta[chosen_position].x; int32_t y = peep->next_y + CoordsDirectionDelta[chosen_position].y; - TileElement* tile_element = map_get_first_element_at(x / 32, y / 32); + TileElement* tile_element = map_get_first_element_at({ x, y }); // This seems to happen in some SV4 files. if (tile_element == nullptr) @@ -1709,7 +1709,7 @@ static int32_t peep_update_patrolling_find_bin(Peep* peep) if (peep->GetNextIsSurface()) return 0; - TileElement* tileElement = map_get_first_element_at(peep->next_x / 32, peep->next_y / 32); + TileElement* tileElement = map_get_first_element_at({ peep->next_x, peep->next_y }); if (tileElement == nullptr) return 0; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index dac96a1548..6548c717dd 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2746,7 +2746,7 @@ private: { for (int32_t y = 0; y < RCT1_MAX_MAP_SIZE; y++) { - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) continue; do @@ -3002,7 +3002,7 @@ private: { for (int32_t y = 0; y < RCT1_MAX_MAP_SIZE; y++) { - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) continue; do diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 48dc1a2c25..c477ebc34a 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -502,7 +502,7 @@ bool track_block_get_next_from_zero( y += CoordsDirectionDelta[direction_start].y; } - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) { output->element = nullptr; @@ -629,7 +629,7 @@ bool track_block_get_previous_from_zero( y += CoordsDirectionDelta[direction].y; } - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) { outTrackBeginEnd->end_x = x; @@ -1166,7 +1166,7 @@ void ride_clear_blocked_tiles(Ride* ride) { for (int32_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) { - auto element = map_get_first_element_at(x, y); + auto element = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (element != nullptr) { do @@ -3294,7 +3294,7 @@ static void ride_shop_connected(Ride* ride) return; TrackElement* trackElement = nullptr; - TileElement* tileElement = map_get_first_element_at(shopLoc.x, shopLoc.y); + TileElement* tileElement = map_get_first_element_at(shopLoc.ToCoordsXY()); do { if (tileElement == nullptr) @@ -3953,7 +3953,7 @@ static void sub_6B5952(Ride* ride) // This will fire for every entrance on this x, y and z, regardless whether that actually belongs to // the ride or not. - TileElement* tileElement = map_get_first_element_at(location.x, location.y); + TileElement* tileElement = map_get_first_element_at(location.ToCoordsXY()); if (tileElement != nullptr) { do @@ -4291,7 +4291,7 @@ static void ride_set_maze_entrance_exit_points(Ride* ride) int32_t y = (*position).y << 5; int32_t z = (*position).z; - TileElement* tileElement = map_get_first_element_at((*position).x, (*position).y); + TileElement* tileElement = map_get_first_element_at(position->ToCoordsXY()); do { if (tileElement == nullptr) @@ -4941,7 +4941,7 @@ static bool ride_initialise_cable_lift_track(Ride* ride, bool isApplying) int32_t z = ride->stations[stationIndex].Height; bool success = false; - TileElement* tileElement = map_get_first_element_at(location.x, location.y); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return success; do @@ -5181,7 +5181,7 @@ static TileElement* loc_6B4F6B(ride_id_t rideIndex, int32_t x, int32_t y) if (ride == nullptr) return nullptr; - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -6258,7 +6258,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(ScreenCoordsX mapY = entranceExitCoords.y + CoordsDirectionDelta[entranceExitCoords.direction].y; if (map_is_location_valid({ mapX, mapY })) { - tileElement = map_get_first_element_at(mapX >> 5, mapY >> 5); + tileElement = map_get_first_element_at({ mapX, mapY }); if (tileElement == nullptr) continue; do @@ -6316,7 +6316,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(ScreenCoordsX entranceMaxY = mapY; mapX -= CoordsDirectionDelta[entranceExitCoords.direction].x; mapY -= CoordsDirectionDelta[entranceExitCoords.direction].y; - tileElement = map_get_first_element_at(mapX >> 5, mapY >> 5); + tileElement = map_get_first_element_at({ mapX, mapY }); if (tileElement == nullptr) break; bool goToNextTile = false; @@ -6663,7 +6663,7 @@ static int32_t ride_get_track_length(Ride* ride) trackStart = stationTileLoc.ToCoordsXY(); auto z = ride->stations[i].Height; - tileElement = map_get_first_element_at(stationTileLoc.x, stationTileLoc.y); + tileElement = map_get_first_element_at(stationTileLoc.ToCoordsXY()); if (tileElement == nullptr) continue; do @@ -6927,7 +6927,7 @@ void sub_6CB945(Ride* ride) location.x -= CoordsDirectionDelta[direction].x; location.y -= CoordsDirectionDelta[direction].y; } - tileElement = map_get_first_element_at(location.x >> 5, location.y >> 5); + tileElement = map_get_first_element_at(location); if (tileElement == nullptr) break; @@ -6976,7 +6976,7 @@ void sub_6CB945(Ride* ride) auto blockTileHeight = TileCoordsXYZ(blockLocation).z; bool trackFound = false; - tileElement = map_get_first_element_at(blockLocation.x >> 5, blockLocation.y >> 5); + tileElement = map_get_first_element_at(blockLocation); if (tileElement == nullptr) break; do @@ -7043,7 +7043,7 @@ void sub_6CB945(Ride* ride) CoordsXY location = { locationCoords.x * 32, locationCoords.y * 32 }; - TileElement* tileElement = map_get_first_element_at(location.x >> 5, location.y >> 5); + TileElement* tileElement = map_get_first_element_at(location); if (tileElement == nullptr) continue; do @@ -7060,7 +7060,7 @@ void sub_6CB945(Ride* ride) nextLocation.y += CoordsDirectionDelta[tileElement->GetDirection()].y; bool shouldRemove = true; - TileElement* trackElement = map_get_first_element_at(nextLocation.x >> 5, nextLocation.y >> 5); + TileElement* trackElement = map_get_first_element_at(nextLocation); if (trackElement == nullptr) continue; do @@ -7308,7 +7308,7 @@ money16 ride_get_price(const Ride* ride) TileElement* get_station_platform(int32_t x, int32_t y, int32_t z, int32_t z_tolerance) { bool foundTileElement = false; - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement != nullptr) { do @@ -7716,7 +7716,7 @@ void determine_ride_entrance_and_exit_locations() { for (uint8_t y = 1; y < MAXIMUM_MAP_SIZE_TECHNICAL - 1; y++) { - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement != nullptr) { diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 33503079bf..55d26b251c 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -206,7 +206,7 @@ static void ride_ratings_update_state_2() int32_t z = gRideRatingsCalcData.proximity_z / 8; int32_t trackType = gRideRatingsCalcData.proximity_track_type; - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) { gRideRatingsCalcData.state = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; @@ -317,7 +317,7 @@ static void ride_ratings_update_state_5() int32_t z = gRideRatingsCalcData.proximity_z / 8; int32_t trackType = gRideRatingsCalcData.proximity_track_type; - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) { gRideRatingsCalcData.state = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; @@ -428,7 +428,7 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi if (x < 0 || y < 0 || x >= (32 * 256) || y >= (32 * 256)) return; - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -482,7 +482,7 @@ static void ride_ratings_score_close_proximity_in_direction(TileElement* inputTi static void ride_ratings_score_close_proximity_loops_helper(TileElement* inputTileElement, int32_t x, int32_t y) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -558,7 +558,7 @@ static void ride_ratings_score_close_proximity(TileElement* inputTileElement) gRideRatingsCalcData.proximity_total++; int32_t x = gRideRatingsCalcData.proximity_x; int32_t y = gRideRatingsCalcData.proximity_y; - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -1453,7 +1453,7 @@ static int32_t ride_ratings_get_scenery_score(Ride* ride) for (int32_t xx = std::max(x - 5, 0); xx <= std::min(x + 5, 255); xx++) { // Count scenery items on this tile - TileElement* tileElement = map_get_first_element_at(xx, yy); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ xx, yy }.ToCoordsXY()); if (tileElement == nullptr) continue; do diff --git a/src/openrct2/ride/Station.cpp b/src/openrct2/ride/Station.cpp index 0e0e2f89a4..94c56e9254 100644 --- a/src/openrct2/ride/Station.cpp +++ b/src/openrct2/ride/Station.cpp @@ -339,7 +339,7 @@ TileElement* ride_get_station_start_track_element(Ride* ride, int32_t stationInd int32_t z = ride->stations[stationIndex].Height; // Find the station track element - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) return nullptr; do @@ -355,7 +355,7 @@ TileElement* ride_get_station_start_track_element(Ride* ride, int32_t stationInd TileElement* ride_get_station_exit_element(int32_t x, int32_t y, int32_t z) { // Find the station track element - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) return nullptr; do diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index 1931a3b8d4..d9f4df8427 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -598,7 +598,7 @@ const rct_preview_track* get_track_def_from_ride_index(ride_id_t rideIndex, int3 static TileElement* find_station_element(int32_t x, int32_t y, int32_t z, int32_t direction, ride_id_t rideIndex) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 5256a82328..b791514781 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -279,7 +279,7 @@ rct_string_id TrackDesign::CreateTrackDesignTrack(const Ride& ride) CoordsXY mapLocation{ location.x * 32, location.y * 32 }; - TileElement* tileElement = map_get_first_element_at(location.x, location.y); + TileElement* tileElement = map_get_first_element_at(location.ToCoordsXY()); if (tileElement == nullptr) continue; @@ -359,7 +359,7 @@ rct_string_id TrackDesign::CreateTrackDesignMaze(const Ride& ride) { for (; x < 8192; x += 32) { - auto tileElement = map_get_first_element_at(x / 32, y / 32); + auto tileElement = map_get_first_element_at({ x, y }); do { if (tileElement == nullptr) @@ -392,8 +392,8 @@ rct_string_id TrackDesign::CreateTrackDesignMaze(const Ride& ride) return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; } - CoordsXY entranceLoc = { location.x * 32, location.y * 32 }; - auto tileElement = map_get_first_element_at(location.x, location.y); + CoordsXY entranceLoc = location.ToCoordsXY(); + auto tileElement = map_get_first_element_at(entranceLoc); do { if (tileElement == nullptr) @@ -421,8 +421,8 @@ rct_string_id TrackDesign::CreateTrackDesignMaze(const Ride& ride) return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; } - CoordsXY exitLoc = { location.x * 32, location.y * 32 }; - tileElement = map_get_first_element_at(location.x, location.y); + CoordsXY exitLoc = location.ToCoordsXY(); + tileElement = map_get_first_element_at(exitLoc); if (tileElement == nullptr) return STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; do @@ -465,7 +465,7 @@ CoordsXYE TrackDesign::MazeGetFirstElement(const Ride& ride) { for (tile.x = 0; tile.x < 8192; tile.x += 32) { - tile.element = map_get_first_element_at(tile.x / 32, tile.y / 32); + tile.element = map_get_first_element_at({ tile.x, tile.y }); do { if (tile.element == nullptr) @@ -1671,7 +1671,7 @@ static bool track_design_place_ride(TrackDesign* td6, int16_t x, int16_t y, int1 if (_trackDesignPlaceOperation != PTD_OPERATION_PLACE_QUERY) { auto tile = CoordsXY{ x, y } + CoordsDirectionDelta[rotation]; - TileElement* tile_element = map_get_first_element_at(tile.x >> 5, tile.y >> 5); + TileElement* tile_element = map_get_first_element_at(tile); z = gTrackPreviewOrigin.z / 8; z += entrance.z; if (tile_element == nullptr) diff --git a/src/openrct2/ride/TrackDesignSave.cpp b/src/openrct2/ride/TrackDesignSave.cpp index bdafdc0950..98120f2cdf 100644 --- a/src/openrct2/ride/TrackDesignSave.cpp +++ b/src/openrct2/ride/TrackDesignSave.cpp @@ -521,7 +521,7 @@ static void track_design_save_select_nearby_scenery_for_tile(ride_id_t rideIndex { for (int32_t x = cx - TRACK_NEARBY_SCENERY_DISTANCE; x <= cx + TRACK_NEARBY_SCENERY_DISTANCE; x++) { - tileElement = map_get_first_element_at(x, y); + tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement == nullptr) continue; do diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 0caaa17daf..e695ad6c8d 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1836,7 +1836,7 @@ static void vehicle_update_measurements(rct_vehicle* vehicle) { // Set tile_element to first element. Since elements aren't always ordered by base height, // we must start at the first element and iterate through each tile element. - auto tile_element = map_get_first_element_at(x / 32, y / 32); + auto tile_element = map_get_first_element_at({ x, y }); if (tile_element == nullptr) return; @@ -4642,7 +4642,7 @@ static void vehicle_update_boat_location(rct_vehicle* vehicle) */ static bool vehicle_boat_is_location_accessible(const TileCoordsXYZ& location) { - TileElement* tileElement = map_get_first_element_at(location.x, location.y); + TileElement* tileElement = map_get_first_element_at(location.ToCoordsXY()); if (tileElement == nullptr) return false; do @@ -5136,7 +5136,7 @@ static void vehicle_update_doing_circus_show(rct_vehicle* vehicle) */ static TileElement* vehicle_check_collision(int16_t x, int16_t y, int16_t z) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) { return nullptr; diff --git a/src/openrct2/ride/transport/Chairlift.cpp b/src/openrct2/ride/transport/Chairlift.cpp index 16252354ab..9d0ea83f99 100644 --- a/src/openrct2/ride/transport/Chairlift.cpp +++ b/src/openrct2/ride/transport/Chairlift.cpp @@ -110,7 +110,7 @@ static void chairlift_paint_util_draw_supports(paint_session* session, int32_t s static const TileElement* chairlift_paint_util_map_get_track_element_at_from_ride_fuzzy( int32_t x, int32_t y, int32_t z, ride_id_t rideIndex) { - const TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + const TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) { return nullptr; diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index 3ce876ceb5..193e3e8553 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -79,7 +79,7 @@ size_t Banner::FormatTextTo(void* argsV) const */ static uint8_t banner_get_ride_index_at(int32_t x, int32_t y, int32_t z) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); ride_id_t resultRideIndex = RIDE_ID_NULL; if (tileElement == nullptr) return resultRideIndex; @@ -162,7 +162,7 @@ TileElement* banner_get_tile_element(BannerIndex bannerIndex) auto banner = GetBanner(bannerIndex); if (banner != nullptr) { - auto tileElement = map_get_first_element_at(banner->position.x, banner->position.y); + auto tileElement = map_get_first_element_at(banner->position.ToCoordsXY()); if (tileElement != nullptr) { do @@ -183,7 +183,7 @@ WallElement* banner_get_scrolling_wall_tile_element(BannerIndex bannerIndex) if (banner == nullptr) return nullptr; - auto tileElement = map_get_first_element_at(banner->position.x, banner->position.y); + auto tileElement = map_get_first_element_at(banner->position.ToCoordsXY()); if (tileElement == nullptr) return nullptr; @@ -267,7 +267,7 @@ void fix_duplicated_banners() { for (int x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) { - auto tileElement = map_get_first_element_at(x, y); + auto tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (tileElement != nullptr) { do diff --git a/src/openrct2/world/Entrance.cpp b/src/openrct2/world/Entrance.cpp index d50145a2d2..dfc5506e4b 100644 --- a/src/openrct2/world/Entrance.cpp +++ b/src/openrct2/world/Entrance.cpp @@ -136,7 +136,7 @@ void maze_entrance_hedge_replacement(int32_t x, int32_t y, TileElement* tileElem int32_t z = tileElement->base_height; ride_id_t rideIndex = tileElement->AsEntrance()->GetRideIndex(); - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -174,7 +174,7 @@ void maze_entrance_hedge_removal(int32_t x, int32_t y, TileElement* tileElement) int32_t z = tileElement->base_height; ride_id_t rideIndex = tileElement->AsEntrance()->GetRideIndex(); - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index 59470aee35..44a9e51b34 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -113,7 +113,7 @@ static bool entrance_has_direction(TileElement* tileElement, int32_t direction) TileElement* map_get_footpath_element(int32_t x, int32_t y, int32_t z) { - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); do { if (tileElement == nullptr) @@ -458,7 +458,7 @@ bool fence_in_the_way(int32_t x, int32_t y, int32_t z0, int32_t z1, int32_t dire { TileElement* tileElement; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return false; do @@ -486,7 +486,7 @@ static TileElement* footpath_connect_corners_get_neighbour(int32_t x, int32_t y, return nullptr; } - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -660,7 +660,7 @@ static TileElement* footpath_get_element(int32_t x, int32_t y, int32_t z0, int32 TileElement* tileElement; int32_t slope; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -786,7 +786,7 @@ static void loc_6A6D7E( } else { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -1076,7 +1076,7 @@ void footpath_chain_ride_queue( x += CoordsDirectionDelta[direction].x; y += CoordsDirectionDelta[direction].y; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement != nullptr) { do @@ -1203,7 +1203,7 @@ void footpath_update_queue_chains() if (location.isNull()) continue; - TileElement* tileElement = map_get_first_element_at(location.x, location.y); + TileElement* tileElement = map_get_first_element_at(location.ToCoordsXY()); if (tileElement != nullptr) { do @@ -1296,7 +1296,7 @@ static int32_t footpath_is_connected_to_map_edge_recurse( if (x >= gMapSizeUnits || y >= gMapSizeUnits) return FOOTPATH_SEARCH_SUCCESS; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return level == 1 ? FOOTPATH_SEARCH_NOT_FOUND : FOOTPATH_SEARCH_INCOMPLETE; do @@ -1623,7 +1623,7 @@ void PathElement::SetShouldDrawPathOverSupports(bool on) */ static void footpath_clear_wide(int32_t x, int32_t y) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -1642,7 +1642,7 @@ static void footpath_clear_wide(int32_t x, int32_t y) */ static TileElement* footpath_can_be_wide(int32_t x, int32_t y, uint8_t height) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -1695,7 +1695,7 @@ void footpath_update_path_wide_flags(int32_t x, int32_t y) // footpath_clear_wide(x, y); // y -= 0x20; - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -1935,7 +1935,7 @@ static void footpath_remove_edges_towards_here( x += CoordsDirectionDelta[direction].x; y += CoordsDirectionDelta[direction].y; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -1966,7 +1966,7 @@ static void footpath_remove_edges_towards(int32_t x, int32_t y, int32_t z0, int3 return; } - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -2005,7 +2005,7 @@ static void footpath_remove_edges_towards(int32_t x, int32_t y, int32_t z0, int3 // entrances and exits, shops, paths). bool tile_element_wants_path_connection_towards(TileCoordsXYZD coords, const TileElement* const elementToBeRemoved) { - TileElement* tileElement = map_get_first_element_at(coords.x, coords.y); + TileElement* tileElement = map_get_first_element_at(coords.ToCoordsXY()); if (tileElement == nullptr) return false; do @@ -2096,7 +2096,7 @@ static void footpath_fix_corners_around(int32_t x, int32_t y, TileElement* pathE if (xOffset == 0 && yOffset == 0) continue; - TileElement* tileElement = map_get_first_element_at(x + xOffset, y + yOffset); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x + xOffset, y + yOffset }.ToCoordsXY()); if (tileElement == nullptr) continue; do diff --git a/src/openrct2/world/Fountain.cpp b/src/openrct2/world/Fountain.cpp index e991f79fb3..10dd9f364d 100644 --- a/src/openrct2/world/Fountain.cpp +++ b/src/openrct2/world/Fountain.cpp @@ -236,7 +236,7 @@ bool JumpingFountain::IsJumpingFountain(const int32_t newType, const CoordsXYZ n const int32_t pathBitFlagMask = newType == JUMPING_FOUNTAIN_TYPE_SNOW ? PATH_BIT_FLAG_JUMPING_FOUNTAIN_SNOW : PATH_BIT_FLAG_JUMPING_FOUNTAIN_WATER; - TileElement* tileElement = map_get_first_element_at(newLoc.x / 32, newLoc.y / 32); + TileElement* tileElement = map_get_first_element_at(newLoc); if (tileElement == nullptr) return false; do diff --git a/src/openrct2/world/Location.hpp b/src/openrct2/world/Location.hpp index 65f544dcab..0a94ba0857 100644 --- a/src/openrct2/world/Location.hpp +++ b/src/openrct2/world/Location.hpp @@ -180,6 +180,11 @@ struct TileCoordsXY { } + const TileCoordsXY operator+(const TileCoordsXY& rhs) const + { + return { x + rhs.x, y + rhs.y }; + } + TileCoordsXY& operator+=(const TileCoordsXY rhs) { x += rhs.x; diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 3f901bdbd4..3243c51d8b 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -114,14 +114,14 @@ void tile_element_iterator_begin(tile_element_iterator* it) { it->x = 0; it->y = 0; - it->element = map_get_first_element_at(0, 0); + it->element = map_get_first_element_at({ 0, 0 }); } int32_t tile_element_iterator_next(tile_element_iterator* it) { if (it->element == nullptr) { - it->element = map_get_first_element_at(it->x, it->y); + it->element = map_get_first_element_at(TileCoordsXY{ it->x, it->y }.ToCoordsXY()); return 1; } @@ -134,7 +134,7 @@ int32_t tile_element_iterator_next(tile_element_iterator* it) if (it->x < (MAXIMUM_MAP_SIZE_TECHNICAL - 1)) { it->x++; - it->element = map_get_first_element_at(it->x, it->y); + it->element = map_get_first_element_at(TileCoordsXY{ it->x, it->y }.ToCoordsXY()); return 1; } @@ -142,7 +142,7 @@ int32_t tile_element_iterator_next(tile_element_iterator* it) { it->x = 0; it->y++; - it->element = map_get_first_element_at(it->x, it->y); + it->element = map_get_first_element_at(TileCoordsXY{ it->x, it->y }.ToCoordsXY()); return 1; } @@ -154,20 +154,20 @@ void tile_element_iterator_restart_for_tile(tile_element_iterator* it) it->element = nullptr; } -TileElement* map_get_first_element_at(int32_t x, int32_t y) +TileElement* map_get_first_element_at(const CoordsXY& elementPos) { - if (!map_is_location_valid({ x * 32, y * 32 })) + if (!map_is_location_valid(elementPos)) { log_error("Trying to access element outside of range"); return nullptr; } - return gTileElementTilePointers[x + y * MAXIMUM_MAP_SIZE_TECHNICAL]; + auto tileElementPos = TileCoordsXY{ elementPos }; + return gTileElementTilePointers[tileElementPos.x + tileElementPos.y * MAXIMUM_MAP_SIZE_TECHNICAL]; } TileElement* map_get_nth_element_at(const CoordsXY& coords, int32_t n) { - auto tileCoords = TileCoordsXY{ coords }; - TileElement* tileElement = map_get_first_element_at(tileCoords.x, tileCoords.y); + TileElement* tileElement = map_get_first_element_at(coords); if (tileElement == nullptr) { return nullptr; @@ -204,8 +204,7 @@ void map_set_tile_element(const TileCoordsXY& tilePos, TileElement* elements) SurfaceElement* map_get_surface_element_at(const CoordsXY& coords) { - auto tileCoords = TileCoordsXY{ coords }; - TileElement* tileElement = map_get_first_element_at(tileCoords.x, tileCoords.y); + TileElement* tileElement = map_get_first_element_at(coords); if (tileElement == nullptr) return nullptr; @@ -224,7 +223,7 @@ SurfaceElement* map_get_surface_element_at(const CoordsXY& coords) PathElement* map_get_path_element_at(const TileCoordsXYZ& loc) { - TileElement* tileElement = map_get_first_element_at(loc.x, loc.y); + TileElement* tileElement = map_get_first_element_at(loc.ToCoordsXY()); if (tileElement == nullptr) return nullptr; @@ -248,7 +247,7 @@ PathElement* map_get_path_element_at(const TileCoordsXYZ& loc) BannerElement* map_get_banner_element_at(const CoordsXYZ& bannerPos, uint8_t position) { auto bannerTilePos = TileCoordsXYZ{ bannerPos }; - TileElement* tileElement = map_get_first_element_at(bannerTilePos.x, bannerTilePos.y); + TileElement* tileElement = map_get_first_element_at(bannerPos); if (tileElement == nullptr) return nullptr; @@ -574,7 +573,7 @@ int16_t tile_element_water_height(const CoordsXY& loc) */ bool map_coord_is_connected(const TileCoordsXYZ& loc, uint8_t faceDirection) { - TileElement* tileElement = map_get_first_element_at(loc.x, loc.y); + TileElement* tileElement = map_get_first_element_at(loc.ToCoordsXY()); if (tileElement == nullptr) return false; @@ -1069,7 +1068,7 @@ void map_reorganise_elements() { for (int32_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) { - TileElement* startElement = map_get_first_element_at(x, y); + TileElement* startElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); if (startElement == nullptr) continue; TileElement* endElement = startElement; @@ -1285,7 +1284,7 @@ bool map_can_construct_with_clear_at( return true; } - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return false; do @@ -1718,7 +1717,7 @@ static void clear_elements_at(const CoordsXY& loc) [x = loc.x, y = loc.y](const auto& spawn) { return floor2(spawn.x, 32) == x && floor2(spawn.y, 32) == y; }), gPeepSpawns.end()); - TileElement* tileElement = map_get_first_element_at(loc.x / 32, loc.y / 32); + TileElement* tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return; @@ -1752,7 +1751,7 @@ int32_t map_get_highest_z(const CoordsXY& loc) LargeSceneryElement* map_get_large_scenery_segment(int32_t x, int32_t y, int32_t z, int32_t direction, int32_t sequence) { - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) { return nullptr; @@ -1776,7 +1775,7 @@ LargeSceneryElement* map_get_large_scenery_segment(int32_t x, int32_t y, int32_t EntranceElement* map_get_park_entrance_element_at(const CoordsXYZ& entranceCoords, bool ghost) { auto entranceTileCoords = TileCoordsXYZ(entranceCoords); - TileElement* tileElement = map_get_first_element_at(entranceTileCoords.x, entranceTileCoords.y); + TileElement* tileElement = map_get_first_element_at(entranceCoords); if (tileElement != nullptr) { do @@ -1802,7 +1801,7 @@ EntranceElement* map_get_park_entrance_element_at(const CoordsXYZ& entranceCoord 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); + TileElement* tileElement = map_get_first_element_at(entranceCoords); if (tileElement != nullptr) { do @@ -1828,7 +1827,7 @@ EntranceElement* map_get_ride_entrance_element_at(const CoordsXYZ& entranceCoord 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); + TileElement* tileElement = map_get_first_element_at(exitCoords); if (tileElement != nullptr) { do @@ -1854,7 +1853,7 @@ EntranceElement* map_get_ride_exit_element_at(const CoordsXYZ& exitCoords, bool SmallSceneryElement* map_get_small_scenery_element_at(CoordsXYZ sceneryCoords, int32_t type, uint8_t quadrant) { auto sceneryTileCoords = TileCoordsXYZ{ sceneryCoords }; - TileElement* tileElement = map_get_first_element_at(sceneryTileCoords.x, sceneryTileCoords.y); + TileElement* tileElement = map_get_first_element_at(sceneryCoords); if (tileElement != nullptr) { do @@ -2134,7 +2133,7 @@ void map_clear_all_elements() */ TrackElement* map_get_track_element_at(int32_t x, int32_t y, int32_t z) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -2158,7 +2157,7 @@ TrackElement* map_get_track_element_at(int32_t x, int32_t y, int32_t z) */ TileElement* map_get_track_element_at_of_type(int32_t x, int32_t y, int32_t z, int32_t trackType) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -2184,7 +2183,7 @@ TileElement* map_get_track_element_at_of_type(int32_t x, int32_t y, int32_t z, i */ TileElement* map_get_track_element_at_of_type_seq(int32_t x, int32_t y, int32_t z, int32_t trackType, int32_t sequence) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); do { if (tileElement == nullptr) @@ -2206,7 +2205,7 @@ TileElement* map_get_track_element_at_of_type_seq(int32_t x, int32_t y, int32_t TrackElement* map_get_track_element_at_of_type(CoordsXYZD location, int32_t trackType) { - auto tileElement = map_get_first_element_at(location.x / 32, location.y / 32); + auto tileElement = map_get_first_element_at(location); if (tileElement != nullptr) { do @@ -2229,7 +2228,7 @@ TrackElement* map_get_track_element_at_of_type(CoordsXYZD location, int32_t trac TrackElement* map_get_track_element_at_of_type_seq(CoordsXYZD location, int32_t trackType, int32_t sequence) { - auto tileElement = map_get_first_element_at(location.x / 32, location.y / 32); + auto tileElement = map_get_first_element_at(location); if (tileElement != nullptr) { do @@ -2260,7 +2259,7 @@ TrackElement* map_get_track_element_at_of_type_seq(CoordsXYZD location, int32_t */ TileElement* map_get_track_element_at_of_type_from_ride(int32_t x, int32_t y, int32_t z, int32_t trackType, ride_id_t rideIndex) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -2288,7 +2287,7 @@ TileElement* map_get_track_element_at_of_type_from_ride(int32_t x, int32_t y, in */ TileElement* map_get_track_element_at_from_ride(int32_t x, int32_t y, int32_t z, ride_id_t rideIndex) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -2316,7 +2315,7 @@ TileElement* map_get_track_element_at_from_ride(int32_t x, int32_t y, int32_t z, TileElement* map_get_track_element_at_with_direction_from_ride( int32_t x, int32_t y, int32_t z, int32_t direction, ride_id_t rideIndex) { - TileElement* tileElement = map_get_first_element_at(x >> 5, y >> 5); + TileElement* tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return nullptr; do @@ -2339,7 +2338,7 @@ TileElement* map_get_track_element_at_with_direction_from_ride( WallElement* map_get_wall_element_at(CoordsXYZD wallCoords) { auto tileWallCoords = TileCoordsXYZ(wallCoords); - TileElement* tileElement = map_get_first_element_at(tileWallCoords.x, tileWallCoords.y); + TileElement* tileElement = map_get_first_element_at(wallCoords); if (tileElement == nullptr) return nullptr; do @@ -2358,7 +2357,7 @@ WallElement* map_get_wall_element_at(CoordsXYZD wallCoords) uint16_t check_max_allowable_land_rights_for_tile(uint8_t x, uint8_t y, uint8_t base_z) { - TileElement* tileElement = map_get_first_element_at(x, y); + TileElement* tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); uint16_t destOwnership = OWNERSHIP_OWNED; // Sometimes done deliberately. diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index f210e68c57..c076a8c910 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -136,7 +136,7 @@ void map_init(int32_t size); void map_count_remaining_land_rights(); void map_strip_ghost_flag_from_elements(); void map_update_tile_pointers(); -TileElement* map_get_first_element_at(int32_t x, int32_t y); +TileElement* map_get_first_element_at(const CoordsXY& elementPos); TileElement* map_get_nth_element_at(const CoordsXY& coords, int32_t n); void map_set_tile_element(const TileCoordsXY& tilePos, TileElement* elements); int32_t map_height_from_slope(const CoordsXY& coords, int32_t slope, bool isSloped); diff --git a/src/openrct2/world/MapAnimation.cpp b/src/openrct2/world/MapAnimation.cpp index 08da123bfc..5c0cf7045b 100644 --- a/src/openrct2/world/MapAnimation.cpp +++ b/src/openrct2/world/MapAnimation.cpp @@ -90,7 +90,7 @@ void map_animation_invalidate_all() static bool map_animation_invalidate_ride_entrance(CoordsXYZ loc) { TileCoordsXYZ tileLoc{ loc }; - auto tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + auto tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -127,7 +127,7 @@ static bool map_animation_invalidate_queue_banner(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -164,7 +164,7 @@ static bool map_animation_invalidate_small_scenery(CoordsXYZ loc) rct_sprite* sprite; Peep* peep; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -238,7 +238,7 @@ static bool map_animation_invalidate_park_entrance(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -268,7 +268,7 @@ static bool map_animation_invalidate_track_waterfall(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -297,7 +297,7 @@ static bool map_animation_invalidate_track_rapids(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -326,7 +326,7 @@ static bool map_animation_invalidate_track_onridephoto(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -367,7 +367,7 @@ static bool map_animation_invalidate_track_whirlpool(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -396,7 +396,7 @@ static bool map_animation_invalidate_track_spinningtunnel(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -434,7 +434,7 @@ static bool map_animation_invalidate_banner(CoordsXYZ loc) TileCoordsXYZ tileLoc{ loc }; TileElement* tileElement; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -461,7 +461,7 @@ static bool map_animation_invalidate_large_scenery(CoordsXYZ loc) rct_scenery_entry* sceneryEntry; bool wasInvalidated = false; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do @@ -496,7 +496,7 @@ static bool map_animation_invalidate_wall_door(CoordsXYZ loc) return false; bool removeAnimation = true; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return removeAnimation; do @@ -558,7 +558,7 @@ static bool map_animation_invalidate_wall(CoordsXYZ loc) rct_scenery_entry* sceneryEntry; bool wasInvalidated = false; - tileElement = map_get_first_element_at(tileLoc.x, tileLoc.y); + tileElement = map_get_first_element_at(loc); if (tileElement == nullptr) return true; do diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index 598f26a169..2dbeabcbad 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -116,7 +116,7 @@ void update_park_fences(const CoordsXY coords) { bool fenceRequired = true; - TileElement* tileElement = map_get_first_element_at(coords.x / 32, coords.y / 32); + TileElement* tileElement = map_get_first_element_at(coords); if (tileElement == nullptr) return; // If an entrance element do not place flags around surface diff --git a/src/openrct2/world/Scenery.cpp b/src/openrct2/world/Scenery.cpp index f5df790a29..05d1b529e5 100644 --- a/src/openrct2/world/Scenery.cpp +++ b/src/openrct2/world/Scenery.cpp @@ -72,7 +72,7 @@ void scenery_update_tile(int32_t x, int32_t y) { TileElement* tileElement; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -198,7 +198,7 @@ void scenery_remove_ghost_tool_placement() if (gSceneryGhostType & SCENERY_GHOST_FLAG_1) { gSceneryGhostType &= ~SCENERY_GHOST_FLAG_1; - TileElement* tileElement = map_get_first_element_at(x / 32, y / 32); + TileElement* tileElement = map_get_first_element_at({ x, y }); do { diff --git a/src/openrct2/world/Sprite.cpp b/src/openrct2/world/Sprite.cpp index 1d6a663e13..e282fe9288 100644 --- a/src/openrct2/world/Sprite.cpp +++ b/src/openrct2/world/Sprite.cpp @@ -719,7 +719,7 @@ static bool litter_can_be_at(int32_t x, int32_t y, int32_t z) if (!map_is_location_owned({ x, y, z })) return false; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return false; do diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index d5a0b491ce..148eb5225d 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -337,7 +337,7 @@ GameActionResult::Ptr tile_inspector_paste_element_at(CoordsXY loc, TileElement windowTileInspectorElementCount++; // Select new element if there was none selected already - int16_t newIndex = (int16_t)(pastedElement - map_get_first_element_at(loc.x / 32, loc.y / 32)); + int16_t newIndex = (int16_t)(pastedElement - map_get_first_element_at(loc)); if (windowTileInspectorSelectedIndex == -1) windowTileInspectorSelectedIndex = newIndex; else if (windowTileInspectorSelectedIndex >= newIndex) @@ -354,7 +354,7 @@ GameActionResult::Ptr tile_inspector_sort_elements_at(CoordsXY loc, bool isExecu { if (isExecuting) { - const TileElement* const firstElement = map_get_first_element_at(loc.x / 32, loc.y / 32); + const TileElement* const firstElement = map_get_first_element_at(loc); if (firstElement == nullptr) return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); @@ -788,7 +788,7 @@ GameActionResult::Ptr tile_inspector_track_base_height_offset( map_invalidate_tile_full(elem.x, elem.y); bool found = false; - TileElement* tileElement = map_get_first_element_at(elem.x >> 5, elem.y >> 5); + TileElement* tileElement = map_get_first_element_at({ elem.x, elem.y }); do { if (tileElement == nullptr) @@ -895,7 +895,7 @@ GameActionResult::Ptr tile_inspector_track_set_chain( map_invalidate_tile_full(elem.x, elem.y); bool found = false; - TileElement* tileElement = map_get_first_element_at(elem.x >> 5, elem.y >> 5); + TileElement* tileElement = map_get_first_element_at({ elem.x, elem.y }); do { if (tileElement == nullptr) diff --git a/src/openrct2/world/Wall.cpp b/src/openrct2/world/Wall.cpp index 67aec95153..95fff912d5 100644 --- a/src/openrct2/world/Wall.cpp +++ b/src/openrct2/world/Wall.cpp @@ -40,7 +40,7 @@ void wall_remove_at(int32_t x, int32_t y, int32_t z0, int32_t z1) z0 /= 8; z1 /= 8; repeat: - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do @@ -76,7 +76,7 @@ void wall_remove_intersecting_walls(int32_t x, int32_t y, int32_t z0, int32_t z1 { TileElement* tileElement; - tileElement = map_get_first_element_at(x >> 5, y >> 5); + tileElement = map_get_first_element_at({ x, y }); if (tileElement == nullptr) return; do diff --git a/test/testpaint/Compat.cpp b/test/testpaint/Compat.cpp index 23f1b6ea77..a41a31eaff 100644 --- a/test/testpaint/Compat.cpp +++ b/test/testpaint/Compat.cpp @@ -183,14 +183,15 @@ bool TrackElement::BlockBrakeClosed() const return (flags & TILE_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED) != 0; } -TileElement* map_get_first_element_at(int x, int y) +TileElement* map_get_first_element_at(const CoordsXY& elementPos) { - if (x < 0 || y < 0 || x > 255 || y > 255) + if (elementPos.x < 0 || elementPos.y < 0 || elementPos.x > 255 || elementPos.y > 255) { log_error("Trying to access element outside of range"); return nullptr; } - return gTileElementTilePointers[x + y * 256]; + auto tileElementPos = TileCoordsXY{ elementPos }; + return gTileElementTilePointers[tileElementPos.x + tileElementPos.y * 256]; } bool ride_type_has_flag(int rideType, uint32_t flag)