Files
2026-10-25 18:05:36 +03:00

16 KiB
Raw Permalink Blame History

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.