Previously Tab from no-lock always picked `ORDERED_IDS[0]` (alpha), so standing next to beta and pressing Tab was denied with `out_of_range` even though the client HUD clearly showed beta in range. Added `PrototypeTargetConstants.next_in_range_id_after(current, world)` which walks the cycle and returns the first anchor whose client-side horizontal distance is within the anchor radius. `TargetSelectionClient.request_tab_next()` prefers that pick when the player reference is wired (same path `set_freshness_kick` uses) and falls back to the plain cycle order when nothing is in range so the server still owns the denial reason. Server contract (NEO-23) untouched. Tests cover the beta pick, the nothing-in-range fallback, and the no-player-ref regression. Plan Decision 6 + review follow-up #3 + README + manual QA updated. |
||
|---|---|---|
| .. | ||
| architecture | ||
| decomposition | ||
| game-design | ||
| manual-qa | ||
| plans | ||
| reviews | ||