Журнал модуля «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 (стик); слияние c33a98b | controls.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 | копия и ветка удалены | db8230f | docs/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=<клавиша>[,<с>] для кадров); слияние e16b34c | look_* = 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; слияние 4efc60e | ui.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; слияние 3404a9d | controls.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; слияние a1ac340 | docs/guide/game.md (кабина, разбег, таблица клавиш, раскладка, настройки), site/content/mechanics/flight.md (абзац трапеции, «Крен (мышь вбок, ←/→, стик)»), CHANGELOG «В работе» (пункты этапов 2/UC-4 переписаны под этап 3). hugo собирается. Старый пункт MVP 27.09 («разбег W+Shift») — история, не менялся. |