Files

8.0 KiB
Raw Permalink Blame History

UI_REFRESH — UI v2 «Kaleidos»

Статус: реализовано в v1.2. Это короткая карта текущего UI, а не план интеграции. Стиль: тёплая бумага, тонкие 1 px контуры, мягкие тени, скругления 3–4 px, бирюзовый акцент, меньше визуального шума.

Окно и масштаб

  • Окно 1600×900, логический viewport 1280×720.
  • stretch/mode = canvas_items, aspect = keep, scale_mode = fractional.
  • Шрифты: Handjet (текст), Press Start 2P (логотип/цифры).
  • Всё рисуется кодом; внешних текстур UI нет.

Палитра

paper #E9E6DD · paper-hi #F7F5EE · paper-lo #D8D3C9
white #FFFFFF · shade #9A958A · dark #2C2A26 · ink #1F1E1B
navy-title #2C5C68 · teal #2F7F8F · teal-light #83C7D4 · teal-pale #E6F5F7
error #C25B4A · success #3F8F5E · warn #C58A2E · shadow #00000018

Контур — 1 px Theme90.BORDER; тень только у карточек/панелей/модалок. Радиус: 3 px — кнопки/строки, 4 px — карточки/панели, 6–8 px — модалки. Кегли: 10 / 12 / 16 / 24.

Компоненты

Файл Поведение v2
theme90.gd палитра, StyleBoxFlat-хелперы, бумажный фон, draw_meter, иконки кодом
button90.gd высота 24, скругление 3, teal-hover, pressed inset, active — pale-teal
panel90.gd светлые панели; GROUP — тонкая полоса заголовка
window_frame.gd светлый титлбар, тёмный текст, волосяная линия; крестик только при close_enabled
status_bar.gd одна светлая полоса, 1 px разделители, цветные шкалы
file_card.gd белая карточка, иконка 24×24, зелёная attached-галочка, tiny locked/malicious
request_card.gd компактные слоты 20 px, галочка attached, мигающее «ожидается»
folder_row.gd, tree_panel.gd, file_grid.gd мягкое teal-выделение, светлые поверхности
scroll_bar.gd тонкая дорожка, teal только при hover; скрыт без прокрутки
shop_modal.gd 10 позиций (включая SLA +24), фильтр Data.available_shop(), без крестика; «Закрыть»/Esc
main_menu.gd логотип, слоган, 4 кнопки, 3 шага смены, сводка; VHS-фон только здесь
vhs_overlay.gd процедурный CRT/VHS-слой меню (RefCounted): скан-линии, зерно, виньетка, полоса
tutorial_mascot.gd маскот БАЙТ 64–96 px + облачко, не ловит мышь
main.gd сборка экрана, магазин после часа, поиск, автообновление, скролл приёма

Ключевые сценарии

  • Магазин: виден только в подготовке и после часа 1; в час скрыт. Каталог перечитывается при открытии. Поиск/щит скрыты до мета-наград survive_hour_3 / survive_hour_5.
  • Поиск: после открытия в окне «ФАЙЛЫ» появляется поле «поиск по имени…»; фильтрует текущую папку, заголовок показывает «N ИЗ M ОБЪЕКТОВ».
  • Приём: скролл для 5–8 пакетов; после приёма/перемещения текущая папка и дерево обновляются автоматически.
  • Папки: имена из names_ru.json, уникализируются в секции (Имя, Имя 2); пустые папки можно удалять.
  • Attached: зелёная галочка у файла и слота запроса.
  • Туториал: БАЙТ и короткие подсказки в первом часе; без пошагового сценария.
  • Настройки: кнопка на главном экране открывает рабочую модалку.
  • Магазин без X: закрытие только «Закрыть» или Esc.
  • Calm-фон: при включённом «Спокойном фоне» Backdrop рисует плоскую PAPER без dither; серый #C0C0C0 не появляется.
  • Итоги забега: строка «ОТКРЫТО: …» показывает полученные мета-награды; Esc ведёт в главное меню, без soft-lock.
  • Drag пакета на слот: перетаскивание пакета на TCP-слот запускает настоящее соединение, а не только визуальный перенос.

VHS-эффект главного меню

Тонкий CRT/VHS-слой есть только на главном меню (scripts/ui/vhs_overlay.gd). Это RefCounted, а не Node/Control: меню само рисует слой в MainMenu._draw().

Порядок отрисовки:

  1. бумага;
  2. VHS по фону — скан-линии, зерно, виньетка, полоса;
  3. карточка, правая панель и декоративные фигуры;
  4. мягкий VHS-проход по карточке и панели (0.72 силы, без виньетки);
  5. текст и кнопки.

Поэтому слой не перекрывает меню, не перехватывает мышь и не может затереть кадр фоном подготовки. Кнопки — дети MainMenu, они рисуются поверх. Screen texture (hint_screen_texture) не используется: интерфейс не сэмплится и остаётся резким.

Параметры (VhsOverlay):

Параметр Значение Смысл
intensity 0.42 (макс. 0.55) общая сила слоя
SCANLINE_STEP 2 лог. px шаг скан-линий, 1 px затемнения
SCANLINE_STRENGTH 0.07 затемнение линий
проход по карточке ×0.72 мягче фона, текст рисуется поверх
зерно тайл 128×128, 2 Гц амплитуда ≤0.05, без мерцания
виньетка 0.13 затемнение к краям кадра
полоса ~18 с на проход мягкая тёмная, со светлой кромкой и дрожанием ±4 px

Скан-линии рисуются в канве меню (логические 1280×720) и масштабируются вместе с UI: на 1920×1080 шаг ≈3 физических px. Это осознанный компромисс — эффект не читает экранную текстуру, поэтому не бывает мыла и затирания UI.

В HEADLESS текстуры не создаются и слой не рисуется — тесты не тормозят.

Как отключить:

  • настройки → «ЭКРАН» → галочка «VHS-эффект» (применяется по «Подтвердить», хранится в settings);
  • кодом: main_menu.set_vhs_enabled(false) или main_menu.vhs.set_enabled(false);
  • сила эффекта: main_menu.vhs.intensity (0…0.55).

Проверки

godot --headless --path . --script scripts/ui/ui_smoke.gd
bash scripts/run_all_tests.sh

ui_smoke — 132 проверки, 0 провалов, SMOKE OK. Скриншоты для страницы — в docs/screenshots/; после смены UI их нужно переснять в 1600×900.