8.0 KiB
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().
Порядок отрисовки:
- бумага;
- VHS по фону — скан-линии, зерно, виньетка, полоса;
- карточка, правая панель и декоративные фигуры;
- мягкий VHS-проход по карточке и панели (0.72 силы, без виньетки);
- текст и кнопки.
Поэтому слой не перекрывает меню, не перехватывает мышь и не может затереть
кадр фоном подготовки. Кнопки — дети 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.