План: группы задач

Верхний уровень плана. Работа делится на группы (области кода). Для каждой группы отдельный планировщик пишет карточки задач в docs/plan/<папка группы>/NN-кратко.md (цель, контекст, владения, шаги, критерий приёмки, модель, размер S/M/L, закрываемые требования).

Объём плана — доделать основу: все открытые пункты TODO.md и требования REQUIREMENTS.md, кроме разделов TODO «Идеи», «Позже», «Места» (новые места), требований «Позже»/«на будущее»/«далёкое будущее» (VR-23…VR-30, FR-14c, сменные вариометры FR-25a, английский NFR-4) и явно отложенного пользователем (слабое железо/Compatibility, CI, поломка крыла, настоящая аэродинамика, аэробуксировка). Вех «показа» нет: после выполнения пользователь сам всё посмотрит и попробует (только Linux; Windows-сборка — позже). Разделы «Вопросы пилотам» — открытые вопросы из questions.md: ответы поправят конфиги, но работу не блокируют.

Правила для планировщиков групп:

  • карточка трогает только папки своей группы; изменения чужого API — отдельной карточкой в группе-владельце;
  • стык двух групп (например, «ветер → трава») делает группа-потребитель через уже опубликованный API; если API нет, сначала идёт карточка у владельца;
  • отложено пользователем, не планировать: оптимизация под слабое железо / Compatibility, CI, поломка крыла (FR-14c), настоящая аэродинамика, аэробуксировка, новые места из раздела «Места» TODO.md;
  • сейчас работают агенты (их задачи не планировать заново, учитывать как незавершённые): integration, terrain2, atmosphere, vegetation, sounds — см. отметки «в работе» ниже.

Размер группы — объём оставшейся работы: S ≈ 1–2 карточки, M ≈ 3–5, L ≈ 6+.

Объём (уточнение координатора)

Делаем основу: этапы 0–5 TODO. Не планируем этап 6 «Полировка и хорошая графика» (кроме уже сделанного), время суток (VR-5), смог и дождь под тучами (записаны «в TODO, не в работу»), векторную карту через martin, а также «Идеи», «Позже», «Места».

Сводка

#ГруппаПапка планаОбъёмСейчас в работе
1Физика полётаflight/S—
2Физика атмосферыatmosphere/Matmosphere (частично)
3Графика облаков и атмосферных явленийclouds/Matmosphere (Cb, пыль, пелена, лентикуляры)
4Рельеф, земля, небо и дымкаterrain/Lterrain2
5Растительностьvegetation/Mvegetation, terrain2 (колыхание травы)
6Объекты мираworld_objects/S—
7Модели и визуал крыла/пилотаmodels/Lintegration (позы пилота)
8Приборыinstruments/S— (пункты TODO «в работе» устарели — проверить)
9Звукsound/Msounds
10Задания, тренировки, рекордыtasks/S—
11Интерфейс (меню и экраны)ui/Mintegration (меню, «Управление»)
12Сцена игры и управлениеgame/Mintegration (кабина, разбег, позы)
13Сборка, проверка и выпускbuild/M— (черновики карточек уже есть)

1. Физика полёта — flight/ (S)

  • Владения: scripts/flight/ (кроме glider_visual.gd → группа 7), configs/wings/, configs/pilot.json, configs/flight.json, tests/flight/. Документ — docs/guide/flight.md.
  • API: FlightModel (setup, step(dt, input, air_fn, ground_fn), reset_on_ground/in_air, phase(), сигналы took_off, landed(result), takeoff_failed), Glider (setup, set_input, set_air_fn, set_ground_fn, step(dt), get_marker(name), сигнал telemetry_updated(t)), Telemetry.
  • Сделано: поляра, масса, 3 крыла, тангаж/крен с инерцией, сваливание, ветер, воздействие воздуха на крыло, разбег, выравнивание, оценка посадки, перегрузка (load_meter).
  • Открыто: подгонка по отзывам пилотов (поляра спорт-крыла, инерция крена у тяжёлого пилота, выравнивание во встречный ветер, момент отрыва); FR-1/FR-3 — сверка с реальным крылом пилота.
  • Вопросы пилотам (⏳): цифры крыла пилота и его вес; крыло у тяжёлого пилота «тяжелее» в крене?; как садились в сильный встречный — выравнивали полностью или слегка?; какие цифры поляры привычны.
  • Объём мал: модель готова; параметры поправят ответы пилотов, когда придут (работу групп не блокирует).

Ждёт ответа пилота (questions.md → «Вираж»): устойчивость по крену по типам крыльев (учебное выравнивается, спортивное нейтрально/заваливается в крутом вираже), обратное рыскание на входе, потеря скорости в вираже и подтягивание трапеции.

2. Физика атмосферы — atmosphere/ (M)

  • Владения: в scripts/atmosphere/ — модель воздуха: atmosphere.gd, thermal_field.gd, atmo_thermal.gd, wind_model.gd, ground_field.gd, wave_field.gd, storm_field.gd (физика), dust_model.gd, cloud_physics.gd, bird_flock.gd (поведение); configs/atmosphere.json, configs/weather/, tests/atmosphere/. Документ — docs/guide/atmosphere.md. Файлы делятся с группой 3 по списку выше.
  • API: set_weather, set_wind, set_ground(height_fn, sun_fn, surface_fn), set_sun_direction, air_velocity_at(pos), mean_wind_at, step(dt), get_cloudbase_msl, cloud_density_at, get_insolation, thermals_near, set_thermal_mode, load_static_thermals, focus_node.
  • Сделано: термики с профилем, кольцом опускания, сносом, жизненным циклом и привязкой к рельефу; склоновый подъём, подветренные роторы, фоновое опускание, пресеты, облачный подсос; Cb с нисходняком и фронтом порывов, волна, пыль, пелена гасит прогрев (физика).
  • Открыто: FR-14d тучи с дождём не только у Cb (ливневое облако → нисходняк, холодный порывистый ветер); FR-34a проверка проходимости маршрута на всех местах в средний/сильный день (тест-статистика термиков); VR-22 птицы держатся в более слабом подъёме; суточный цикл термиков (часть VR-5, ждёт солнца из группы 4); волна: физика волнового подъёма и роторов проверить против облаков группы 3 (VR-27 — в TODO этапа 2).
  • Вопросы пилотам (⏳): болтает сильнее/слабее, чем в жизни?; с чего чаще отрывалось — опушки, каменные гребни, сёла/дороги? (веса world.json → surface.thermal, владелец — группа 4).

3. Графика облаков и атмосферных явлений — clouds/ (M)

  • Владения: в scripts/atmosphere/ — рендер: cloud_layer.gd, cloud_model.gd, cloud_compositor_effect.gd, cloud_*.gdshader*, cirrus*, dust_devil*, dust_devils.gd, bird.gdshader; ключи clouds.* конфига. scripts/game/cloud_whiteout.gd — у группы 12.
  • API: облака рисует сама Atmosphere (дочерние Clouds, Birds); качество clouds.quality.
  • Сделано: объёмные облака (compute, low-res буфер), стадии жизни, плоская кромка, тени, улицы, переразвитие, Cb с наковальней и виргой, лентикуляры/шапки/роторные, пыльные вихри, перистая пелена с гало.
  • Открыто: известные проблемы из docs/guide/atmosphere.md (Cb «гриб», лентикуляры без «стопки тарелок»); дождевые полосы до земли под тучами (FR-14d, визуал к физике группы 2); проверка FR-14a «читаемость стадии и подсоса» на 1–20 км и снизу — скриншот-сравнение с фото; облака и дымка — порядок наложения (questions terrain2.3).
  • Вопросы пилотам: «по облакам видно, где сосёт / где распадается?» (необязательный).

4. Рельеф, земля, небо и дымка — terrain/ (L)

  • Владения: scripts/terrain/ (кроме файлов растительности → группа 5), scripts/world/, tools/terrain/, data/terrain/, configs/locations/, configs/world.json, tests/terrain/. Документ — docs/guide/terrain.md.
  • API: Terrain: height_at, normal_at, get_start_sites, get_landing_sites, sun_exposure_at, surface_at, thermal_source_strength_at, latlon_to_local, set_clearings, set_wind_sources, set_pilot, get_grass_palette, сигнал loaded; MapPicker.point_picked; SkyEnvironment: setup_camera, set_inversion_height_msl, get_haze_top_msl.
  • Сделано: места Онгудай, Аскарово, Манжерок/Алтай, рантайм-загрузка по координатам, LOD до 110 км, карта поверхности WorldCover — общая для цвета и термиков (VR-4), фактура лугов/полей, лес в три плана, небо, солнце, дымка с верхней границей на инверсии (VR-3).
  • В работе (terrain2): цвета, лес/поля с высоты, скалы, Аушкуль, просеки, колыхание травы.
  • Открыто: смог над городами и посёлками до ~500 м (VR-3, слова пилота); вода: рябь и пятна от порывов (VR-16); реки/озёра OSM вместо масок стока (VR-9, данные у группы 6); солнце по координатам, дате и времени + выбор времени старта (VR-5, база для суточного цикла); кромка леса как триггер и препятствие (VR-21 — проверить, что закрыто работой terrain2); векторная карта выбора старта через martin (TODO этап 6, сейчас отмывка MapPicker).
  • Вопросы пилотам (⏳, необязательные по решению пользователя): точные старты/посадки Онгудая, Биягоды, Аушкуля.

5. Растительность — vegetation/ (M)

  • Владения: scripts/vegetation/ (создаёт агент vegetation), configs/vegetation.json; из scripts/terrain/ — grass_field.gd, grass.gdshader, tree_placer.gd, terrain_tree_models.gd, tree_model.gdshader, forest_impostors.*, terrain_trees.gd, trees.gdshader (договориться с terrain2 о переносе после его завершения); tools/blender/build_trees.py, assets/models/trees/.
  • API: ветер в шейдеры — TerrainWind (группа 4); просеки — Terrain.set_clearings; палитра — get_grass_palette.
  • Сделано: деревья 5 пород × 3 LOD, импостеры 0,35–3,5 км, травинки ≤ 30 м с приминанием, качание от ветра.
  • В работе: vegetation — травинки вблизи; terrain2 — колыхание травы и нивы волнами (VR-17).
  • Открыто: порывы и термики «бегут» по траве/посевам как читаемый признак (VR-17 — проверка с пилотом); лес с объёмом и кромкой (VR-21, вместе с группой 4); вариации деревьев (2–3 сида, импостеры 8 ракурсов).
  • Вопросы пилотам: «по траве видно подход термика?» (необязательный).

Рекомендации для GrassField (от агента vegetation, не реализовано):

  1. Прореживание вдали: пучкам в куске — случайный rank 0..1; виден, если rank < плотность(расстояние); дальние пучки шире (far_width_k). Вершин вдали в 5–8 раз меньше.
  2. Волны порывов: смещение копить на CPU (offset += dir·speed·dt) → uniform; порывистость = |air_velocity_at − mean_wind_at|, сглаженная экспонентой — иначе рисунок скачет при смене ветра.
  3. Приминание гасить по высоте ног над землёй: полное до ~0,4 м, ноль выше ~1,2 м; нормаль травинки явно, без переворота (иначе обратные стороны темнеют при cull_disabled).
  4. Посадки — прямоугольником (axis_deg, length_m, width_m из WorldObjects.get_landing_sites), не кругом; сухость травинок по локации поверх палитры (Онгудай +0,35, Аскарово +0,25).

6. Объекты мира — world_objects/ (S)

  • Владения: scripts/world_objects/, scenes/world_objects/, configs/world_objects.json, data/osm/, tools/osm/, tests/world_objects/, assets/models/world/. Документ — docs/guide/world-objects.md.
  • API: WorldObjects.setup(terrain, air), wire_hit(a, b), obstacle_hit(a, b), get_landing_sites(), clearing_mask_for(id), is_clear_at, WorldClearings.build_for(id), сигнал built.
  • Сделано: ветроуказатели по локальному ветру и в роторе (VR-7, VR-20), посадки с препятствиями (VR-12), дороги, дома, ЛЭП с проводами и столкновением (VR-9 частично, VR-10), просеки.
  • Открыто: дым от труб и костров (VR-15: поднимается в термике, сносится, растекается под инверсией); выдача рек/озёр OSM группе 4.
  • Вопросы пилотам (необязательные): где садились на каждом месте.

7. Модели и визуал крыла/пилота — models/ (L)

  • Владения: tools/blender/ (кроме build_trees.py), assets/models/ (glider_*, pilot, instrument, vario_90s, bird), assets/source/, assets/shaders/sail/, scripts/flight/glider_visual.gd, scenes/glider/*_visual.tscn, scenes/models_preview/. Документ — docs/guide/models.md (контракт маркеров и осей).
  • API: маркеры HangPoint, PilotHead, BaseBar, InstrumentMount, VarioMount, WingTipL/R, CockpitCamera; SailMaterial (параметры паруса); анимации пилота stand/walk/run/run_air/climb_in/prone/ climb_out/flare (запускает PilotAnimator группы 12).
  • Сделано: 3 крыла, пилот со скелетом и 8 позами, планшет, вариометр 90-х, птица; шейдер паруса с просвечиванием и нормалями.
  • Открыто (главное в кадре №1): тень крыла на земле (VR-5/VR-6 — сейчас cast_shadows: false, нужна для оценки высоты ниже 100 м); мягкий колышущийся парус на малой скорости синхронно со звуком (VR-11) и трепет задней кромки (VR-19); парус и пилот высокого качества (майлар, латы, руки на стойках, перчатки, IK рук к трапеции конкретного крыла); детали приборов (кнопки, стекло с бликом, карабины).
  • Вопросы пилотам: нет открытых.

8. Приборы — instruments/ (S)

  • Владения: scripts/instruments/, scenes/instruments/, configs/instruments.json, tests/instruments/. Документ — docs/guide/instruments.md.
  • API: Vario, FlightInstrument (update, get_texture, set_page, set_task, set_task_state, set_sound_settings, get_wind, reset), Instrument3D, InstrumentOverlay, ThermalAssistant, WindEstimator, InstrumentTask.
  • Сделано: 5 страниц (полёт, карта, ветер/глиссада, задание/настройки, помощник центровки), честная оценка ветра, прибор в углу для внешних камер, экран вариометра 90-х.
  • Открыто: vario_90s_3d.tscn указан в configs/game.json, но сцены нет — модель на стойке + выбор звука в настройках (FR-25a, без сменных моделей — это «далёкое будущее»); читаемость планшета из кабины (размер шрифта, контраст — вместе с группой 7 по корпусу); часть TODO этапа 4 помечена «в работе» без агента (помощник центровки, прибор в углу) — сверить с кодом и закрыть.
  • Вопросы пилотам (⏳): какие приборы у пилота и где закреплены — подогнать вид.

9. Звук — sound/ (M)

  • Владения: scripts/audio/, scenes/audio/, configs/audio.json, assets/sounds/, tools/sounds/, tests/audio/. Документы — docs/guide/instruments.md («Звуки полёта»), docs/research/sounds.md.
  • API: VarioAudio (set_vario, set_volume_db, set_enabled), FlightAudio (update(t, extra), play_landing, play_step, play_carabiner), аудиошины Master/Vario/Wind/Effects/Ambient.
  • Сделано: вариометр (XC Tracer и classic_90s), поток, тросы, парус, каркас, разбег, посадка, окружение.
  • В работе (sounds): генерация на GPU и оригиналы Freesound вместо превью.
  • Открыто: сведение громкостей по фазам (вариометр слышен всегда, поток не утомляет) — с замерами громкости, а не только на слух; хлопание паруса синхронно с визуалом группы 7; звук дождя/порывов для FR-14d.
  • Вопросы: прослушать звуки (пользователь, sounds.6); пилоту — похож ли поток/вариометр.

10. Задания, тренировки, рекорды — tasks/ (S)

  • Владения: scripts/tasks/, scenes/tasks/, configs/tasks/, tests/tasks/. Документ — docs/guide/tasks.md.
  • API: Task.load_config / list_available, TaskTracker (setup, update(t), get_state, result, сигналы turnpoint_reached, start_taken, goal_reached, task_failed), TrainingMode (update, on_landed, result, сигнал finished), FlightRecords.add_flight.
  • Сделано: вся логика FR-35…FR-37 без нод, импорт .xctsk, оптимизатор маршрута, 3 тренировки, рекорды.
  • Открыто: в игру не подключено — выбор режима, трекер в Game.tick(), итог и «Новый рекорд!» (делают группы 11 и 12 по API из docs/guide/tasks.md); здесь — только правки логики по их запросам и старт ongudai_demo на kayancha_south.

11. Интерфейс — ui/ (M)

  • Владения: scripts/ui/, scenes/ui/, locale/, configs/ui.json. Документ — docs/guide/game.md («Как добавить экран»).
  • API: экраны наружу — только сигналы; UiKit, AssetsCredits, UserSettings.save_patch.
  • Сделано: меню, «Полёт…» (крыло, масса, погода, ветер, место), пауза, настройки, «Об игре», итог, tr().
  • В работе (integration): простое меню «фото + кнопки», экран «Управление», выбор старта на карте.
  • Открыто: выбор режима (свободный / задание / тренировка) и итог с рекордами (FR-34…FR-37 — с группой 12); выбор времени старта (VR-5, после группы 4); выбор вариометра/звука 90-х в настройках (FR-25a); «Как летать» — экран в меню или расширение «Управления» (по желанию пользователя); английский (NFR-4) — вне объёма.

12. Сцена игры и управление — game/ (M)

  • Владения: scenes/main.*, scenes/game/, scripts/game/, scripts/core/, configs/game.json, configs/controls.json, configs/camera.json, tests/game/. Документ — docs/guide/game.md.
  • API: Game.start/restart/tick, InputController, CameraRig, PilotAnimator, WorldLink, GraphicsPresets, UserSettings, LaunchOptions (командная строка, --smoke, --autopilot).
  • Сделано: сборка всех модулей, порядок шага, камеры, мышь-голова, геймпад, белая мгла в облаке, столкновения, пресеты графики, автопилот, 5-минутный тест полёта.
  • В работе (integration): кабина (VR-11), разбег W+Shift с защёлкой (FR-30), позы пилота по фазам.
  • Открыто: подключение заданий/тренировок/рекордов (FR-35…37); часы симуляции и ускорение времени (VR-5, после группы 4); подключение дождя/смога/дыма по мере появления API.

13. Сборка, проверка и выпуск (Linux) — build/ (M)

  • Владения: tools/build.sh, tools/check.sh, tools/lint.sh, новые tools/soak.sh, tools/bench/, tests/stability/, export_presets.cfg (Linux), project.godot (окно), TODO.md, docs/guide/architecture.md (таблица модулей), ключи graphics* в configs/game.json (по согласованию с группой 12).
  • Сделано: tools/check.sh (линтер, тесты, сборка Linux, smoke), tools/build.sh linux.
  • Открыто: матрица стабильности (места × крылья × погоды, 30-мин прогон сборки); замеры NFR-1 (60 FPS на дискретной) и NFR-2 (≤ 10 с) с подбором пресета medium; дефолты первого запуска; синхронизация TODO.md и ARCHITECTURE с кодом (многие «в работе» уже сделаны). Windows-сборка — вне объёма (позже).
  • Черновики карточек: build/ (помечены «черновик»; 01 и часть 02 про показ — неактуальны).

Зависимости между группами

4 Рельеф ──surface_at, height, солнце──▶ 2 Атмосфера ──air_velocity_at, облака, cloudbase──▶ 3 Облака
   │  TerrainWind ◀── mean_wind/thermals (2)        │
   ├──▶ 5 Растительность (ветер, просеки, палитра)   ├──▶ 6 Объекты (ветер для колдунов, дыма)
   ├──▶ 6 Объекты (height_at, latlon)  ── OSM реки ──▶ 4
7 Модели ──маркеры, анимации, SailMaterial──▶ 1 Полёт (glider_visual) и 12 Сцена (PilotAnimator)
1 Полёт ──Telemetry──▶ 8 Приборы, 9 Звук, 10 Задания
10 Задания ──API──▶ 11 Интерфейс + 12 Сцена (подключение)
12 Сцена собирает всё; 11 — экраны сцены 12
13 Сборка — последняя: проверяет всё сразу

Ключевые цепочки:

  • VR-5 время суток: 4 (солнце по дате/времени) → 2 (суточный цикл термиков) → 11/12 (выбор времени, часы).
  • FR-14d тучи с дождём: 2 (физика) → 3 (дождевые полосы) → 9 (звук дождя) → 12 (подключение, если нужен новый API).
  • VR-3 смог: 4 (дымка/смог по классу «застройка») — сам; 6 (дым VR-15) может брать высоту инверсии у 4.
  • Тень крыла / колыхание паруса: 7 → 9 (синхронный звук хлопания).
  • Задания в игре: 10 готово → 12 (трекер в tick) → 11 (меню режима, итог и рекорды).
  • Ответы пилотов (когда придут) → правки конфигов в 1, 2, 4, 9; работу не блокируют.

Что можно вести параллельно

Сейчас (папки свободны от текущих агентов): 1 (только подготовка, основное ждёт отзывов), 6 (дым VR-15), 7 (тень крыла, парус; scripts/game/pilot_animator.gd не трогать — это integration), 8 (вариометр 90-х на стойке, читаемость), 10 (правки по запросам), 13 (синхронизация TODO, tools/soak.sh, tools/bench/).

После текущих агентов:

  • atmosphere закончил → 2 и 3 (делят scripts/atmosphere/ по файлам; при конфликте — 2 раньше 3);
  • terrain2 закончил → 4 и 5 (5 забирает файлы растительности из scripts/terrain/, после этого параллельно);
  • sounds закончил → 9;
  • integration закончил → 12 и 11 (11 после карточки 12 «задания в Game.tick», экраны — параллельно);
  • все закончили → 13: матрица стабильности, замеры FPS/загрузки, сборка.

Зависят от ответов пилотов (не блокируют): подгонка группы 1 (поляра, крен, выравнивание), болтанка и веса источников термиков (2, 4), точные старты/посадки (4, 6). Если ответов нет — оставляем правдоподобные значения (решение пользователя).