Clicking empty ground selected every building in the 3x3 neighbourhood, and a
deconstruct click queued all of them -- demolishing any construction site among
them outright, since sites skip the queue.
Two allowances stacked. A click that hits nothing resolves as a box drag, and a
box that never moved becomes the unit square of the tile the button went down on
(GameWorldView::getBoxWorldRect), so its edges lie exactly on tile boundaries.
boxCoversTile then counted a shared boundary as coverage -- written for the
sub-tile drag rectangles it was introduced for, where "grazes the edge" is the
generous reading, but the click box grazes all four of its neighbours, and their
diagonals through the corners.
Coverage now has to have area: the far-edge comparisons are strict, so a box
ending on a boundary does not reach past it. Drags stop grabbing the one-tile
ring around themselves too, and station bodies come along, sharing the rule
through actorsInBox.
The existing box tests use rectangles that sit inside a tile, which is why none
of them saw this; the new one queries tile-aligned boxes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x