16 KiB
DECISIONS — решения v1.2
Каждое решение: ID, что решили, что меняется в GDD. Дедлайн 26.10.2026 23:59 (Minsk). Источник правил —
docs/GDD.md. v1.2 (25.10.2026): D01–D17 сохранены; добавлены D18–D25. Если D19–D24 меняют числа старых решений, это указано в примечании к D12/D13/D16.
D01 — карточка запроса
Решение: в карточке запроса показывать имя требуемого файла
(до 12 символов) и его папку, а не только иконку типа. required —
конкретные id файлов, не фильтры по типу.
GDD: §7 (нужные файлы — по имени+папке, привязка по id).
D02 — расход/удаление файлов и склад
Решение: файлы не расходуются при отправке, но после успешной отправки получают cooldown 20 с (нельзя снова прикрепить). Обычные файлы можно удалять ТОЛЬКО в подготовке (долгое удержание/ПКМ); зловредные — в любой фазе. «Конец забега по складу» считается поражением, но пройденные 30+ часов засчитываются; в итоговом отчёте это указывается явно. GDD: §3, §5, §16.
D03 — заморозка таймеров модалками
Решение: пока открыта модалка мини-игры или панель соединения — спавн приёма и таймеры пакетов в буфере останавливаются; таймер активного запроса продолжает идти; при полном буфере новые пакеты не спавнятся. GDD: §6, §8, §8.4.
D04 — полоска соединения
Решение: `W = clamp(0.30 − 0.005×(hour−1) − 0.005×successes
- 0.05×zone_upgrade_level, 0.18, 0.36)`. Скорости палочек 440/340/280 px/с; окна попадания ~130–200 мс; апгрейд зоны применяется внутри формулы, cap 0.36. GDD: §11.
D05 — один источник истины
Решение: буфер = 4 + 2×buffer_upgrades (max 8); зона — только
формула D04; max_requests — только из таблицы сложности
(balance.json → difficulty); в окне «Отправка» максимум 4 видимых
карточки; при 5-м запросе — скролл и высота карточек 56 px.
GDD: §6, §7, §11.
D06 — файл в нескольких запросах
Решение: файл может входить в required нескольких запросов, но
attached — только в одном; второй запрос показывает файл серым.
При failed файла все запросы, где он required, отменяются со штрафом.
GDD: §7.
D07 — атаки вне буфера и единая таблица штрафов
Решение: атаки не занимают буфер и не вытесняются ими; отдельный слой карточек атак. Единая таблица урона: мусор −5 SLA, DDoS −15, фишинг −10, шифровальщик −10 (вместо глобального −15). GDD: §12.
D08 — видимые теллы
Решение: у пакета показывать расширение файла; у шифровальщика —
красный квадрат 4×4; у фишинга — client_id формата id_XXXX с неверным
символом (например id_7F3К, кириллическая К) и серый аватар.
locked/malicious файл остаётся кликабельным для уничтожения.
GDD: §20.
D09 — состояния-флаги
Решение: состояния — флаги, а не один enum:
FileItem.location (registry/folder/attached/locked/malicious/failed),
attached_request, malicious_kind, lock_until;
у запроса slot_reserved, connected, minigame_active.
Таблица переходов при истечении таймера (загрузка/соединение/мини-игра)
— в docs/IMPLEMENTATION.md.
GDD: §17.
D10 — поведение Esc
Решение: в час — пауза; в мини-игре — no-op; в панели соединения — отмена (слот освобождается, запрос остаётся); закрытие модалок — только кнопкой или таймаутом. GDD: §18.
D11 — устойчивость к лагам
Решение: delta = min(delta, 0.1); авто-пауза при
NOTIFICATION_APPLICATION_FOCUS_OUT; Engine.max_fps = 60.
GDD: §8.
D12 — баланс
Решение: доход/час пересчитан: ожидаемо ~500/800/1200/1800/2200 для часов 1/2/3/5/9. Цены магазина подняты так, что полный выкуп реалистичен к часу 8–9. SLA-прирост: приём +0.5, отправка +1, отражённая атака +1. Штрафы масштабируются: −(10 + 2×hour) за таймаут и подобных. Таблица сложности останавливается на часе 8; дальше те же значения, но +5 % к скорости спавна каждые 2 часа. GDD: §12, §13, §23. v1.2: старт SLA — 128/200; штраф за потерю пакета — по типу (D19).
D13 — магазин
Решение: 9 позиций: 3-й слот 250, 4-й слот 450, буфер +2 — 200×2, таймер пакетов +4 с — 350×3, зона +5 % — 300×3, канал +25 — 250×4, секция — 300×5, поиск — 250, щит — 400. Сканер и автосортировка — резерв (вырезаны из прототипа). GDD: §14. v1.2: добавлена 10-я позиция «SLA +24» (300, max 3); открытия — D23.
D14 — фон
Решение: фон — статичный градиент + слабый шум 320×180, без полноэкранного fbm; CRT-эффект убрать. GDD: §21. v1.2: фон — тёплый бумажный дизеринг/панели, см. D18. v1.2.1: VHS возвращён только в главное меню, игровой UI без CRT (D27).
D15 — шрифт
Решение: основной шрифт — Handjet (OFL 1.1, полная кириллица,
вариативный: wght 100–900, ELGR 1–2, ELSH 0–16; средняя ширина ≈0.36 em,
файл Handjet[ELGR,ELSH,wght].ttf из google/fonts/ofl/handjet + OFL.txt).
Press Start 2P остаётся только для крупных заголовков/логотипа
(слишком широкий: 17 символов не влезают в карточку 132 px).
Pixelify Sans удалить из темы (неполная кириллица: нет глифов О и П).
Допустимые кегли: 10 / 12 / 16 / 24 (Handjet узкий, поэтому 10
разрешён).
GDD: §21.
D16 — порядок P0
Решение: порядок P0: данные/реестр → слоты → приём/отправка → UI. GDD: §23. v1.2: календарь открытий — D23; в часе 1 атак нет.
D17 — quality/retry
Решение: заглушка качества возвращает 1.0; кнопка «Переделать»
оставлена, но не влияет на quality (только перезапуск заглушки);
«самый сложный тип» заменён средним коэффициентом — правило выбора
мини-игры в GDD §8.4/§10:
coeff = {text:1.0, sound:2.0, photo:3.0, video:4.0},
difficulty = sum(coeff)/n, пороги <1.5 text, <2.5 sound, <3.5 photo, иначе video; MiniGame.start(type, difficulty).
GDD: §4, §8.4, §10.
D18 — UI v2 «Kaleidos»
Решение: интерфейс переведён на тёплую бумагу, тонкие 1 px контуры,
мягкие тени #00000018, скругления 3–4 px и бирюзовый акцент #2F7F8F.
Окно — 1920×1080, логический viewport — 1280×720,
stretch/mode=canvas_items, aspect=keep, scale_mode=fractional.
Меньше декоративных подписей, меню и «коробок»; иллюстрации и иконки
по-прежнему рисуются кодом.
GDD: §1–2, §21.
D19 — SLA и магазин v1.2
Решение: старт забега — SLA 128 / 200. Потеря пакета списывает SLA
по типу: text 2, sound 4, photo 8, video 16. В магазин добавлена
10-я позиция «SLA +24» — 300, max 3 уровня. Остальные 9 позиций D13
сохраняются; итого 10.
GDD: §4, §12, §14.
D20 — таймеры и grace
Решение: таймеры пакета/запроса считаются как
(base − 0.5×(h−1)) × grace(h) + 4×timer_level, где grace:
h1 1.5, h2 1.35, h3 1.2, h4+ 1.0. Итоги: h1 30/45,
h2 26.325/39.825, h3 22.8/34.8, h4 18.5/28.5, h5 18/28, далее
плавно до h9 16/26. Апгрейд «Таймер пакетов +4 с» даёт чистые +4 с
поверх grace.
GDD: §8.
D21 — канал v1.2
Решение: в нагрузку канала входят только активные передачи
(loading/sending): load = Σ weight(active_transfers). Фон и занятые
слоты не грузят; idle = 0 %. capacity = 80 + 25×channel_level,
factor = max(1.0, load / capacity), actual_time = base_time × factor.
GDD: §9.
D22 — TCP-соединение
Решение: промах в полоске закрывает панель, автоповтора нет — игрок
снова нажимает «Соединиться». Request.connected выставляется только
после успешного прохождения; при промахе слот освобождается, запрос
остаётся. Esc — отмена с тем же результатом.
GDD: §11, §17.
D23 — открытия и мета
Решение: магазин открывается с часа 2 и скрыт во время часа
(в подготовке после часа 1). Мета-награды выдаются постепенно:
survive_hour_3 — после 3-го часа, survive_hour_5 — после 5-го,
complete_run — после 9-го. Game.run_meta_awards копит открытия забега;
RunResultModal показывает «ОТКРЫТО: …», мета сохраняется между забегами
(Game.meta_unlocks, save). Типы: text h1, sound h2, photo/video h3+.
Час 1 — без атак; junk/ddos — h2, phishing — h3, ransomware — h4
(difficulty.attacks = 0,1,1,2,2,3,3,4,4). minigame_advanced — резерв
под будущие мини-игры, контента пока нет.
GDD: §3, §10, §15, §23.
D24 — UX и читаемость
Решение: имена папок берутся из пула names_ru.json и уникализируются
внутри секции (Имя, Имя 2), пустые папки удаляются. Текущая папка и
дерево автообновляются после приёма/перемещения. У прикреплённых файлов —
зелёная галочка. «Уничтожить содержимое» папки реально удаляет файлы после
подтверждения и снимает 5 SLA, пустая папка — без штрафа. Магазин доступен
в подготовке после часа 1, без крестика («Закрыть»/Esc). После открытия
«Поиска» появляется поле поиска по имени и фильтр текущей папки. Настройки
открываются с главного экрана. «Спокойный фон» — плоская PAPER без dither.
Маскот БАЙТ ведёт короткий туториал первого часа. Esc на итогах забега
ведёт в главное меню (не soft-lock).
GDD: §18, §19, §21.
D25 — проверки и MR-ревью
Решение: единый прогон — scripts/run_all_tests.sh (21 набор +
parse-check, 22/22 PASS; ambient 74/0). MR дополнительно проходит
OpenCode-ревью агентом oracle на модели
opencode-go/deepseek-v4.1-flash: dry-run 74–90 с, комментарий с
Blockers/High/Medium/Test gaps/Verdict; бот не мержит.
GDD: §23, §25.
D26 — фиксы аудита v1.2
- Calm-фон: плоская
PAPER, без dither и серого#C0C0C0;default_clear_color= paper. - Esc на итогах забега ведёт в главное меню;
closedэмитится один раз. - «Уничтожить содержимое» папки удаляет файлы с подтверждением и −5 SLA; пустая папка — без штрафа.
- Мета выдаётся после 3/5/9 часов, копится в
run_meta_awardsи видна в итогах строкой «ОТКРЫТО: …». - Час 1 без атак:
attacks = 0,1,1,2,2,3,3,4,4; типы 1 — text, 2 — text+sound, 3+ — все. - UI: реальный лимит буфера, прогресс TCP по загрузке/отправке, drag пакета
на слот запускает соединение, тост покупки с названием, честный статус
сейва, fallback
SLA +24. minigame_advanced— зарезервированный unlock, контента пока нет.
D27 — VHS главного меню
Решение: VHS-слой только на главном меню: процедурный
scripts/ui/vhs_overlay.gd (extends RefCounted), рисуется в
MainMenu._draw до текста. Скан-линии, слабая хроматика, зерно, виньетка и
полоса; без shader/screen texture, ввод не блокирует, текст резкий.
Галочка «VHS-эффект» — в настройках, группа «ЭКРАН»; HEADLESS не рендерит.
Карточка/кнопки меню под фильтром, модалки — нет; это не CRT на весь UI.
GDD: §21, §25.
D28 — ambient machine room
Решение: ambient-слой машинного зала: 4 WAV в audio/amb
(PSU/fan/room/seek), генератор audio/generate_ambient.py, autoload
scripts/autoload/ambient.gd. Стартует после первого жеста (web autoplay),
поддерживает mute, паузу и громкость музыки. test_ambient — 74/0.
GDD: §22, §25.