| 2026-09-07 |
UX-пачка: подсказки, клик-зоны, моты, коллизия домов, сундук, тихая вода
...
- Тосты держатся по длине текста (до 6 с) + подсказка сбора колокольчиков
при первом входе в пруды (флаг hint_bells).
- Клик по «телу» объекта: RouterDeps.pixelTile как фолбэк на голом клике —
bbox тел NPC/интерактивов (без подписей) + ремап на высокий тайл (дома).
- Моты: заметная насыпь с пульсирующей искрой, HUD-счётчик, вьюха
растворяется с искрами при поднятии (InteractSink.onConsumed).
- Движок: TallSpec.shadow — тайл (tx-1,ty-1) за домом блокируется
(shadowTilesOf в collision.ts + isWalkable карты, тесты).
- Интерьеры: бронзовый контур проёма + подпись «выход».
- Спрайт сундука (tiles/chest.png) вместо ящика-плейсхолдера.
- Вода прудов: radius 2.5, volume 0.22 — только вплотную и тихо.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
16 hours ago
|
| 2026-09-06 |

Тела не проходят друг сквозь друга + карта коллизий агенту
...
Расталкивание через реестр сцены: герой выталкивает себя из NPC
(PlayerController), враг — из героя, NPC и своих (EnemySystem); каждый
актор двигает только себя (separateCircles). attackStop (0.85) больше
суммы радиусов — авто-атака не дрожит.
A* не ведёт героя сквозь тело: SceneObjects.walkGrid() считает тайлы
NPC занятыми (герой застревал «на носу» у Ирвина — звон в верёвку
не поднимал флаг). Проводка: клик по миру, авто-подход к цели,
scene:route моста.
Карта коллизий агенту: слой s.collision {width, height, blocked (0/1
с footprint пропов), props} + команды scene:walkable {x, y} и
scene:raycast {from, to} (прямая видимость, вода прозрачна). Новый
сценарий checks/collision.mjs: слой валиден, walkable/raycast на
конкретных тайлах, клик в дерево — герой в проходимом, телепорт в
тело спящего ползуна — враг выталкивает себя.
Доки: agent.md (слой + 2 команды), practices.md (ситуация «проверяю
коллизии/движение» + грабли телепорта на тайл перехода).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 hours ago
|
Сцена на SceneRegistry: NPC/интерактивы/пропы/фауна/враги в одном реестре
...
- дефы получают юниты: NpcDef.pos + atlas?, InteractableDef.pos + view?
(tile вычисляется при загрузке модуля — сейвы/снапшот/валидатор без миграций)
- SceneObjects: фасад реестра области (npc/int/prop с footprint)
- клик-роутинг: npcAt/interactableAt/enemyAt через реестр; чистый
resolveClick и приоритеты не тронуты (пробы transitions/interact зелёные)
- шов врагов ECS: запись с pos по ссылке, move после шага, remove при смерти
- фауна регистрируется (kind 'fauna'), вьюхи NPC — def.atlas, интерактивов —
def.view.tex
- инвариант registry-consistent (реестр согласован с ECS)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 hours ago
|

Рефакторинг: вынос клик-роутинга и агентного моста из LocationScene
...
LocationScene (1169 строк) — god-object: каждая фича трогала один файл.
Сцена остаётся оркестратором вьюх, логика переезжает в два модуля:
- systems/ClickRouting.ts: чистый резолвер приоритетов resolveClick
(NPC → клик-переход/заперто → интерактив → цветок → враг → движение)
с юнит-тестами без Pixi + рантайм InteractionRouter (пути, отложенные
взаимодействия, step-переходы с дисармом тайла входа). Сцена получает
его deps-объектом и колбэками (talkTo/collectFlower/useTransition и
др. остаются в сцене — они трогают вьюхи/катсцены/смену сцен).
- agent/SceneAgentView.ts: агентный фасад (снапшот/инварианты/команды),
слои снапшота собираются фабриками snapshot.ts — дублирование слоёв
невозможно. LocationScene implements SceneAgent → 3 однострочника.
Попутно: TransitionSnapshot получает типизированное поле trigger
('step' | 'click') — фактический объект его уже клал.
Сцена: 1169 → 823 строки. Проверки: typecheck, 301 тест, agent check
45/45, smoke-act1. Доки: CLAUDE.md, practices.md (ситуация «меняю
клик-роутинг / агентный мост сцены»).
Co-Authored-By: Claude Code <noreply@anthropic.com>
|