Журнал модуля «ui-controls»

План — docs/archive/plan/ui-controls.md, контракты — docs/contracts/ui-controls.md. Ветка feature/ui-controls, копия ~/deltaplan-ui-controls (от main 938d1ea).

Решения

  • 01.10 — решение пользователя: по умолчанию в полёте W/↑ = трапеция от себя, S/↓ = на себя; мышь/стик «вперёд = от себя»; инверсия остаётся, по умолчанию выключена.

  • 01.10 — разбор v1.0.0: клавиши «как в самолёте» (W = pitch_pull_in), стик вперёд = на себя, мышь bar уже дельтапланерная. Экран «Управление» показывает клавиши шага через действия тангажа — привязать к walk_*.

  • 01.10 — контракт У1 v2 (docs/contracts/ui-controls.md), тест tests/game/test_ui_controls_contracts.gd: форма 1/1 ок; test_u1_default_keys_hang_glider — цель v2, красный до UC-1.

  • 01.10 — согласование с control-fix (журнал ~/deltaplan-control-fix/docs/plan/control-fix_progress.md, контракты С1/С2 v2): CF-1 в работе, CF-3 (земля, вариант В) ещё не начат и затронет те же controls.json, экран «Управление», локали, autopilot.gd, доки. Владелец знака клавиш — этот модуль (перестановка списков в controls.json); CF-3 знак не переставляет; тест У1 ловит двойную перестановку. ground_run.gd и логику земли в input_controller.gd не трогаем; правка знака стика в _apply_gamepad (файл control-fix) — отдельным коммитом, вливается после согласования с главной сессией.

  • 01.10 — control-fix уточнил С2 v2 (addb5e5): клавиши крыла на земле — те же действия pitch_*/roll_*, что в полёте; знак — только карта ввода (наш У1). Двойной перестановки не будет.

  • 01.10 — главная сессия: стик по варианту А — правка _apply_gamepad (-gy * inv) отдельным коммитом ui-controls (7e65293), конфликт с CF-3 разрешаю при подтягивании feature/control-fix.

  • 01.10 — CHANGELOG «В работе» (6d554c2). Открытый вопрос для CF-3: автопилот и test_takeoff_latch изображают «W» на земле как walk_forward+pitch_pull_in, реальная W теперь pitch_push_out; защёлку CF-3 всё равно убирает — там и привести.

  • 01.10 — финальный шлюз: control-fix не готов (CF-1, CF-3 в работе), подтягивание feature/control-fix — после его готовности, перед слиянием в main.

  • 02.10 — пользователь одобрил слияние в main (выпуск 1.0.1). Подтянут main dcf039e (control-fix CF-1/CF-3, wing-physics-check) — слияние acf1752. Конфликты: controls.json (клавиши — У1 v2, описания — объединены, run_doc — control-fix), _apply_gamepad (код control-fix без ветвления по земле + -gy * inv), autopilot.gd и test_gameplay.gd — версия control-fix (жмут действия по имени, знак верный), docs/guide/game.md (текст control-fix + знак У1, таблица клавиш объединена), CHANGELOG (одна секция «Управление»). ui.json, locale/ui.csv слились сами (раздел «На земле» — control-fix, строки полёта и инверсия — наши). Тесты: ui_controls_contracts 5/5, contracts 45/45, game 134/0 (1 пропуск GPU), start_ 14/0 (1 пропуск GPU), liftoff_physics 5/5, flight 129/129. Стоя ↑ → pitch +1,00 (нос вверх), на бегу S → −0,75.

  • 02.10 — этап 2 (запрос пользователя: при тангаже мышью WASD — камера от 1-го лица). Разбор кода: «двигать камеру» = поворот головы в кабине (смещения глаз с клавиш в коде нет, свободное перемещение уже есть — камера «свободная»). Базовая линия: ui_controls 5/5 (в тесте осталась строка ic._was_on_ground — свойство убрано CF-3, SCRIPT ERROR без падения; уберу при правке теста). Шлюз до кода: разбег (WASD — обзор или трапеция) и камера сзади (WASD — ничего или трапеция); мелочи с дефолтом — в плане, «Этап 2».

  • 02.10 — решение пользователя (через главную сессию): WASD при тангаже мышью — поворот головы (обзор камеры кабины), не смещение точки обзора. Вписано в план («Этап 2 → Решения пользователя»); развилку не поднимаю.

  • 02.10 — остальное решил сам по принципу CF-3 «на разбеге — как в полёте» (план, «Решения координатора»): условие — bar и мышь захвачена; разбег — WASD тоже обзор (на отрыве скачка трапеции нет); стоя/шагом — без изменений; камера сзади — WASD ничего; свободная — как было; голова с клавиш 90°/с, отпустил — остаётся, V — вперёд; стрелки — трапеция всегда. Шлюз не нужен — всё дёшево поменять.

  • 02.10 — контракт У2 v1 (docs/contracts/ui-controls.md): действия look_* = W/S/A/D, InputController.keys_look(), CameraRig.keys_look_fn/head_look_deg(), camera.json → cockpit.head.key_rate_deg_s. Тест test_u2_* (4 шт.) — красные до UC-3; У1 5/5. Из теста убрана мёртвая строка ic._was_on_ground.

  • 02.10 — решение пользователя: «UI не переделывай, только камеру» — фильтр клавиш на экране «Управление» не делаем; вопрос закрыт. Базовые прогоны ветки модуля до UC-3: contracts 50/4, game 138/4 (1 пропуск), ui 93/5, flight 129/0; все падения — test_u2_* (ждут UC-3) и test_net_screen::…embedded_vs_remote (порт).

  • 02.10 — этап 2 закрыт: UC-3 и UC-4 приняты и влиты в feature/ui-controls (e16b34c). В main не вливаю — ждёт одобрения пользователя.

  • 02.10 — этап 3, решения пользователя (через главную сессию, тремя сообщениями): (1) «WASD камера нужна только в полёте, на земле не нужна» — отменяет моё решение п.2 этапа 2 (разбег — обзор); (2) поправка: на земле (стоя, шагом, разбег) W/S/A/D — движение пилота, крыло — мышь; (3) «крыло через WASD в полёте не нужно вообще, настройку убрать»: мышь всегда крыло, режим мыши look и пункт «Мышь: Обзор / Трапеция» — убрать; в полёте W/S/A/D — только голова; стрелки и геймпад — как были. Вписано в план («Этап 3»).

  • 02.10 — решения координатора этапа 3: клавиши трапеции — только стрелки (W/S/A/D сняты с pitch_*/roll_*, фильтры занятых клавиш не нужны); разбег — как в CF-3 (Shift бежит сам, курс — от крена крыла), W/S/A/D на бегу ничего не делают; захват мыши (M): без захвата мышь крыло не двигает (курсор свободен), трапеция держит положение — как было в bar; keys_look() = в полёте, ввод включён, не свободная камера — от мыши не зависит; на отрыве/касании скачка трапеции нет (W/S/A/D в неё не идут нигде), защёлок нет.

  • 02.10 — контракты: У1 v3 (стрелки, мышь всегда крыло, mouse.mode/mouse_mode() убраны), У2 v2 (W/S/A/D — пилот на земле, голова в полёте); С2 control-fix → v3 (правка потребителя в том же шаге: docs/contracts/control-fix.md, test_control_fix_contracts.gd — mouse_mode()/mouse.mode убраны). Тесты переписаны: test_ui_controls_contracts.gd (У1 v3, У2 v2, отрыв с зажатой W), test_gameplay.gd::test_ground_bar_keys (стоя/бег, с захватом и без). До UC-5: ui_controls 5 ok / 4 FAIL (ждут UC-5).

  • 02.10 — этап 3 закрыт: UC-5 и UC-6 приняты и влиты в feature/ui-controls. В main не вливаю — ждёт одобрения пользователя. Открыто (не трогал): Q назначена и на look_instrument, и на free_down (было и раньше); у пилота в user://configs/controls.json может остаться mouse.mode — код его не читает.

Задачи

ЗадачаСтатусИсполнительКопия / веткаКоммитыЧисла / решения
UC-1 Раскладка и проверкипринята (01.10)dp-engineerкопия и ветка удаленыfc09b4b, 7e65293 (стик); слияние c33a98bcontrols.json: pitch_push_out=[W,Up], pitch_pull_in=[S,Down]; стик -gy·inv; ui.json «На земле» → walk_*; локали (инверсия «как ручка самолёта»); шапка autopilot.gd. Тест У1 5/5: pitch за 0,5 с W/↑ +0,75, S/↓ −0,75, инверсия — наоборот; мышь bar от себя +1,0; α (training) трим 11,78°, W 23,10°, S −1,09°. Стик headless не проверить (нет виртуального геймпада) — выкладка. Перепроверено на ветке модуля: contracts 37/37, game 125/125, ui 88/89 (port_busy — известное), flight 112/113 (test_takeoff::test_headwind_launch atlas 4 м/с — падает и на main 938d1ea, не регрессия).
UC-2 Тексты (docs, README, сайт)принята (01.10)dp-writerкопия и ветка удаленыdb8230fdocs/guide/game.md (таблица клавиш W/↑ — от себя, S/↓ — на себя; мышь; абзац о раскладке и инверсии; геймпад; строка об автопилоте), docs/guide/flight.md FR-4, site/content/mechanics/flight.md (абзац «Трапеция»). README нет. Hugo собирается. Тексты упоминают «стик вперёд — от себя» — зависит от шлюза по стику.
UC-3 Обзор с WASD при трапеции мышьюпринята (02.10)dp-engineerкопия и ветка удаленыec4ec5e (код), 81b3f5c (test_ground_bar_keys под У2), ae013fd (флаг --hold-key=<клавиша>[,<с>] для кадров); слияние e16b34clook_* = W/S/A/D, keys_look(), CameraRig.keys_look_fn/head_look_deg(), key_rate_deg_s 90. У2: bar+захват W/S/A/D → pitch/roll 0,0; ↑ 0,75, → 1,00, action_press 0,75; без захвата W 0,75; разбег W 0,00, ↑ 0,75; голова за 0,5 с A +45°, D −45°, W +45°, S −45°, без обзора 0. Перепроверено на ветке модуля после слияния: ui_controls 9/0, contracts 50/0, game 138/0 (1 пропуск), ui 93/1 (test_net_screen::…embedded_vs_remote — было и до), flight 129/0. Кадры — build/screenshots/UC-3/ (01 вперёд, 02 A 1 с — голова влево 90°, 03 W 1 с — вверх до предела 60°). Замечено: при автопилоте зажатая физическая W/S/A/D гасит его нажатие того же действия (как стоя на земле) — в игре без автопилота не важно, оставляю.
UC-4 Тексты этапа 2принята (02.10)dp-writerкопия и ветка удалены6fc69a9; слияние 4efc60eui.json → controls_help строка controls_mouse_bar_wasd (bar); locale/ui.csv новая строка + controls_run_wing; docs/guide/game.md (абзацы о мыши и разбеге, таблица, строка «сзади — ничего»); site/content/mechanics/flight.md; CHANGELOG «В работе». --filter=ui 93/5: 4 — test_u2_* (ждут UC-3), test_net_screen::…embedded_vs_remote — падает и на ветке модуля до UC-4 (порт). hugo собирается. Открыто: экран показывает «W / ↑» у строк трапеции и в режиме bar — фильтр клавиш нужен в коде экрана.
UC-5 Мышь — всегда крыло, W/S/A/D — пилот/головапринята (02.10)dp-engineer (Opus)копия и ветка удалены0d001ba; слияние 3404a9dcontrols.json: трапеция только стрелки, mouse.mode убран; InputController: mouse_mode() и фильтры GROUND_MOVE_ACTIONS/LOOK_ACTIONS убраны, keys_look() = enabled ∧ ¬hands_off ∧ ¬on_ground; CameraRig без режима look; пункт «Мышь: Обзор / Трапеция» убран; ui.json → controls_help без mouse_mode, новая строка controls_look_keys; локали ru/en. Сверх скоупа (принято): свободная камера вбок — turn_* (A/D; было roll_*, стали бы стрелки); в свободной камере мышь не копит смещение трапеции. Перепроверено на ветке модуля после слияния: ui_controls 9/0, contracts 50/0, game 138/0 (1 пропуск GPU), ui 92/1 (test_net_screen::…embedded_vs_remote — порт, было и до), flight 129/0. Числа: ↑ +0,75 / ↓ −0,75 за 0,5 с; мышь от себя +1,0, без захвата 0; α (training) трим 10,38°, ↑ 20,77°, ↓ −1,41°; полёт W/S/A/D → pitch/roll 0 (с захватом и без); стоя W walk +1, A turn −1; разбег W/S/A/D → 0, ↑ +0,75; отрыв с W — трапеция 0 до и после; голова за 0,5 с ±45°.
UC-6 Тексты этапа 3 (docs, сайт, CHANGELOG)принята (02.10)dp-writerкопия и ветка удаленыb6ba231; слияние a1ac340docs/guide/game.md (кабина, разбег, таблица клавиш, раскладка, настройки), site/content/mechanics/flight.md (абзац трапеции, «Крен (мышь вбок, ←/→, стик)»), CHANGELOG «В работе» (пункты этапов 2/UC-4 переписаны под этап 3). hugo собирается. Старый пункт MVP 27.09 («разбег W+Shift») — история, не менялся.