diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 7b3a635848..105ae15854 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -697,6 +697,34 @@ static void ViewportInteractionRemoveLargeScenery(TileElement* tileElement, cons } } +struct PeepDistance +{ + Peep* peep = nullptr; + int32_t distance = std::numeric_limits::max(); +}; + +template +PeepDistance GetClosestPeep(const ScreenCoordsXY& viewportCoords, const int32_t maxDistance, PeepDistance goal) +{ + for (auto peep : EntityList(EntityListId::Peep)) + { + if (peep->sprite_left == LOCATION_NULL) + continue; + + auto distance = abs(((peep->sprite_left + peep->sprite_right) / 2) - viewportCoords.x) + + abs(((peep->sprite_top + peep->sprite_bottom) / 2) - viewportCoords.y); + if (distance > maxDistance) + continue; + + if (distance < goal.distance) + { + goal.peep = peep; + goal.distance = distance; + } + } + return goal; +} + static Peep* ViewportInteractionGetClosestPeep(ScreenCoordsXY screenCoords, int32_t maxDistance) { rct_window* w; @@ -712,26 +740,10 @@ static Peep* ViewportInteractionGetClosestPeep(ScreenCoordsXY screenCoords, int3 auto viewportCoords = viewport->ScreenToViewportCoord(screenCoords); - Peep* closestPeep = nullptr; - auto closestDistance = std::numeric_limits::max(); - for (auto peep : EntityList(EntityListId::Peep)) - { - if (peep->sprite_left == LOCATION_NULL) - continue; + auto goal = GetClosestPeep(viewportCoords, maxDistance, {}); + goal = GetClosestPeep(viewportCoords, maxDistance, goal); - auto distance = abs(((peep->sprite_left + peep->sprite_right) / 2) - viewportCoords.x) - + abs(((peep->sprite_top + peep->sprite_bottom) / 2) - viewportCoords.y); - if (distance > maxDistance) - continue; - - if (distance < closestDistance) - { - closestPeep = peep; - closestDistance = distance; - } - } - - return closestPeep; + return goal.peep; } /**