[F8-07] Cargo routes: расстояние с учётом torus-wrap #50

Closed
opened 2026-05-25 21:40:19 +00:00 by owner · 3 comments
Collaborator

Подзадача полировки UI (этап F8), родительский #43.

Цель: Учитывать torus-wrap при расчёте расстояний в picker маршрутов (сейчас считается «в лоб» через всю карту).

Пункты из #43:

15. Инспектор. Cargo routes. При выборе типа маршрута и активации picker, ощущение такое, что не учитывается torus-wrap и расстояние до доступных планет считается "в лоб" через всю карту. Это баг.

Заметка. Проверить, есть ли общий хелпер расстояния с учётом тора (на карте), и переиспользовать его.


Порядок обработки: F8-07 из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач.

Подзадача полировки UI (этап **F8**), родительский #43. **Цель:** Учитывать torus-wrap при расчёте расстояний в picker маршрутов (сейчас считается «в лоб» через всю карту). **Пункты из #43:** > **15.** Инспектор. Cargo routes. При выборе типа маршрута и активации picker, ощущение такое, что не учитывается torus-wrap и расстояние до доступных планет считается "в лоб" через всю карту. Это баг. _Заметка._ Проверить, есть ли общий хелпер расстояния с учётом тора (на карте), и переиспользовать его. --- _Порядок обработки: **F8-07** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._
owner added the Kind/Bug
Priority
Medium
3
ready
labels 2026-05-25 21:40:19 +00:00
developer was assigned by owner 2026-05-25 21:40:19 +00:00
developer added
claude
working
and removed ready labels 2026-05-26 10:25:03 +00:00
developer added ready and removed
claude
working
labels 2026-05-26 10:27:09 +00:00
developer added
claude
working
and removed ready labels 2026-05-26 12:00:06 +00:00
Owner

Привет, @owner! Посмотрела код — расчёт зоны достижимости в picker'е уже учитывает torus-wrap:

  • ui/frontend/src/lib/inspectors/planet/cargo-routes.svelte:106-126 собирает достижимые через torusShortestDelta + Math.hypot, ровно как движок: calc.ShortDistance (pkg/calc/map.go:7), проверка range <= FlightDistance() = driveTech * 40 в controller/route.go:31.
  • visibility.ts для фильтра unreachable-планет делает ту же математику через convenience-обёртку torusShortestDistance.
  • В picker'е (map/pick-mode.ts) затемнение идёт строго по reachableIds, который инспектор подаёт уже torus-aware.

То есть планета через шов не должна оказываться в недостижимых. Что в picker'е реально считается "в лоб" — это линия от источника к курсору (pick-mode.ts:110-118): прямая через канвас, без wrap'а. Когда наводишь курсор на отрисовку планеты в центральном тайле (а не на wrap-копию рядом), линия идёт длинной дорогой через всю карту. Возможно, именно она и создавала ощущение, что torus не учитывается?

Хочу свериться, прежде чем менять код. Что ты увидел:

  1. Реальный баг в reach — планета, которую ты считал достижимой через wrap, в picker'е была затемнена (picker её не пускает в назначения). В коде я этого не вижу; если воспроизводится — дай координаты/размер карты/drive, проиграю сценарий.
  2. Визуальный hint — линия курсора шла длинной дорогой, и отсюда вывод "считается в лоб". Тогда фикс другой: wrap'нуть линию (есть тонкости с положением hover-обводки относительно курсора через шов — могу набросать варианты).
  3. Что-то третье — расскажи.

По заметке про общий хелпер: формально inline-математика уже использует тот же torusShortestDelta из math.ts, что и torusShortestDistance под капотом. Перевод на convenience-обёртку чисто косметика, готова сделать заодно, но это не источник предполагаемого бага.

Привет, @owner! Посмотрела код — расчёт зоны достижимости в picker'е уже учитывает torus-wrap: - `ui/frontend/src/lib/inspectors/planet/cargo-routes.svelte:106-126` собирает достижимые через `torusShortestDelta` + `Math.hypot`, ровно как движок: `calc.ShortDistance` (`pkg/calc/map.go:7`), проверка `range <= FlightDistance() = driveTech * 40` в `controller/route.go:31`. - `visibility.ts` для фильтра unreachable-планет делает ту же математику через convenience-обёртку `torusShortestDistance`. - В picker'е (`map/pick-mode.ts`) затемнение идёт строго по `reachableIds`, который инспектор подаёт уже torus-aware. То есть планета через шов **не должна** оказываться в недостижимых. Что в picker'е реально считается "в лоб" — это **линия от источника к курсору** (`pick-mode.ts:110-118`): прямая через канвас, без wrap'а. Когда наводишь курсор на отрисовку планеты в центральном тайле (а не на wrap-копию рядом), линия идёт длинной дорогой через всю карту. Возможно, именно она и создавала ощущение, что torus не учитывается? Хочу свериться, прежде чем менять код. Что ты увидел: 1. **Реальный баг в reach** — планета, которую ты считал достижимой через wrap, в picker'е была затемнена (picker её не пускает в назначения). В коде я этого не вижу; если воспроизводится — дай координаты/размер карты/drive, проиграю сценарий. 2. **Визуальный hint** — линия курсора шла длинной дорогой, и отсюда вывод "считается в лоб". Тогда фикс другой: wrap'нуть линию (есть тонкости с положением hover-обводки относительно курсора через шов — могу набросать варианты). 3. **Что-то третье** — расскажи. По заметке про общий хелпер: формально inline-математика уже использует тот же `torusShortestDelta` из `math.ts`, что и `torusShortestDistance` под капотом. Перевод на convenience-обёртку чисто косметика, готова сделать заодно, но это не источник предполагаемого бага.
Owner
Working log (issue-agent) — click to expand

State: blocked
Updated: 2026-05-26T12:11:12Z
Branch / PR:
Confirmed:

  • Reach calc in ui/frontend/src/lib/inspectors/planet/cargo-routes.svelte:106-126 already wraps the torus (torusShortestDelta + Math.hypot).
  • Matches engine pkg/calc/map.go.ShortDistance + controller/route.go:31 (range <= Race.FlightDistance() = driveTech * 40).
  • visibility.ts.computeHiddenPlanetNumbers uses the convenience helper torusShortestDistance (map/math.ts:44) — same math.
  • map/pick-mode.ts dims primitives by reachableIds; the set passed in is already torus-aware (built by the inspector).
  • The cursor line pick-mode.ts:110-118 and the hover outline pick-mode.ts:120-135 are drawn at absolute world coords — straight across the canvas, no wrap. Likely source of the owner's "straight-line" perception when the hovered planet is across the seam.

Open question:
Need the owner's exact observation: (1) a wrap-reachable planet appeared dimmed (real reach bug — not seen in code), (2) the cursor line/hover outline drew the long way across the canvas and looked "straight-line" (visual only), or (3) something else.

Decisions: none yet — waiting on owner before touching code.

Next: read owner's reply. If (1), get a repro and fix reachableSet. If (2), redesign the picker visuals (cursor line + hover outline) to follow the wrap-shortest delta. If pure cosmetic, still refactor inline math to torusShortestDistance per the owner's note and add a torus-wrap regression test for reachableSet.

<!-- issue-agent:worklog --> <details> <summary>Working log (issue-agent) — click to expand</summary> **State:** blocked **Updated:** 2026-05-26T12:11:12Z **Branch / PR:** — **Confirmed:** - Reach calc in `ui/frontend/src/lib/inspectors/planet/cargo-routes.svelte:106-126` already wraps the torus (`torusShortestDelta` + `Math.hypot`). - Matches engine `pkg/calc/map.go.ShortDistance` + `controller/route.go:31` (range <= `Race.FlightDistance() = driveTech * 40`). - `visibility.ts.computeHiddenPlanetNumbers` uses the convenience helper `torusShortestDistance` (`map/math.ts:44`) — same math. - `map/pick-mode.ts` dims primitives by `reachableIds`; the set passed in is already torus-aware (built by the inspector). - The cursor line `pick-mode.ts:110-118` and the hover outline `pick-mode.ts:120-135` are drawn at absolute world coords — straight across the canvas, no wrap. Likely source of the owner's "straight-line" perception when the hovered planet is across the seam. **Open question:** Need the owner's exact observation: (1) a wrap-reachable planet appeared dimmed (real reach bug — not seen in code), (2) the cursor line/hover outline drew the long way across the canvas and looked "straight-line" (visual only), or (3) something else. **Decisions:** none yet — waiting on owner before touching code. **Next:** read owner's reply. If (1), get a repro and fix `reachableSet`. If (2), redesign the picker visuals (cursor line + hover outline) to follow the wrap-shortest delta. If pure cosmetic, still refactor inline math to `torusShortestDistance` per the owner's note and add a torus-wrap regression test for `reachableSet`. </details>
developer added
claude
blocked
and removed
claude
working
labels 2026-05-26 12:11:17 +00:00
Author
Collaborator

Попытаюсь описать. Смотри, у меня попалась такая карта размером (201, 201), где на нулевом ходу две домашние планеты расположены как бы в правом нижнем углу карты: округленно, координаты (184,137) + (191,145). А третья планета имеет координаты в левом нижнем углу карты (1, 146)

И вот ситуация: когда я активирую picker планеты для маршрута первых двух планет, то ВЛЕВО от планеты всё считается хорошо, а ВПРАВО (то есть когда веду курсор через wrap) вообще ничего не происходит, будто бы нет достижимых планет.

А когда активирую picker для третьей планеты, picker вообще ломается: его начало уходит куда-то далеко влево viewport, и из всех доступных планет даёт выбрать только какую-то домашнюю. Я сделал скриншот по этой ситуации, может, удастся увидеть. Выбранная планета - самая крайняя справа и её координаты тоже видны на скрине: image.png

При этом, уточню, что сломан только picker. Когда всё-таки удаётся выбрать планету для маршрута, стрелочка рисуется адекватно (btw, стрелка слишком толстая, давай заодно уменьшим до 2-3 пикселей её ширину).

Попытаюсь описать. Смотри, у меня попалась такая карта размером (201, 201), где на нулевом ходу две домашние планеты расположены как бы в правом нижнем углу карты: округленно, координаты (184,137) + (191,145). А третья планета имеет координаты в левом нижнем углу карты (1, 146) И вот ситуация: когда я активирую picker планеты для маршрута первых двух планет, то ВЛЕВО от планеты всё считается хорошо, а ВПРАВО (то есть когда веду курсор через wrap) вообще ничего не происходит, будто бы нет достижимых планет. А когда активирую picker для третьей планеты, picker вообще ломается: его начало уходит куда-то далеко влево viewport, и из всех доступных планет даёт выбрать только какую-то домашнюю. Я сделал скриншот по этой ситуации, может, удастся увидеть. Выбранная планета - самая крайняя справа и её координаты тоже видны на скрине: <img width="1433" alt="image.png" src="attachments/e3c6565b-154d-47b3-89ac-3e24406a6d48"> При этом, уточню, что сломан только picker. Когда всё-таки удаётся выбрать планету для маршрута, стрелочка рисуется адекватно (btw, стрелка слишком толстая, давай заодно уменьшим до 2-3 пикселей её ширину).
369 KiB
owner added
claude
done
and removed
claude
blocked
labels 2026-05-27 08:12:04 +00:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/galaxy-game#50