ТЗ T5 — «Как у референса»: заставка, обучение, бой и всё между ними (релизы 0.60–0.64)
Заказ владельца 25.10.2026: «открой игру в Steam, протестируй: там много визуальных эффектов, которые стоит добавить. Подготовь ТЗ на приведение игры к варианту референса — от заставки, включая обучающие вещи, и до самой игры». Набор фигур 0.59.0 (мировые силуэты в размере референса) владельцем принят — он становится опорой визуального языка.
Источники: покадровые записи референса 28.09–02.10 (
docs/reference/playtest/NOTES.md, 55 разделов, 30 fps, 122 серии), прогон «как новый игрок» 25.10 (tools/ref_fresh_study.py, свежий профиль; §1.3 ниже), планки ТЗ v3.1 §10.3 (✓/○), разрывdocs/audit/T4-gap-analysis.md. Арт, тексты и имена референса не копируются (инвариант №1) — копируем ГЛАГОЛЫ сцен и их тайминги, рисуем своё.
0. Цель, рамки, принципы
Цель. Игрок, видевший референс, узнаёт в VIRURO тот же уровень «живости»: каждая сцена — цепочка событий с паузами, панели движутся, а не мигают; каждое действие имеет искру, звук и отклик; обучение ведёт за руку, но не блокирует молча.
Рамки. Android-телефон (портрет) — основной формат; Fold/планшет — проверка; десктоп — те же сцены (мышь даёт
наведение и drag). Ядро правил не меняется (кроме флагов У1–У10 там, где отмечено). Сеточный пиксель-арт 24 px: фигуры
набора world, доска и HUD переводятся в тот же язык.
Принципы приёмки (как раньше, S-серия):
1. Каждая сцена — покадровая лента (build/anim/<scene> → GIF на dev.html) с таймингами в пределах ±20 % от референса.
2. Десктоп-тесты сцен (*FramesTest): сцена живёт, фазы различимы, финальный кадр = состояние покоя.
3. Телефон: скриншоты на 412×892 и Fold (740×900); ничего не режется, тексты видны (правило «описания всегда видны»).
4. Симулятор 1000 забегов без крэшей при любом касании ядра; эмулятор-смок перед выкладкой.
5. Своё: названия, портреты, тексты, звуки (синтез tools/gen_sfx_*), палитра «чёрный мрамор + кость + коралл + латунь».
1. Что видно у референса и чего нет у нас — сводка
1.1 Сделано (✓, не трогаем, только полируем под новые фигуры)
Заставка-сборка (0.50), новый забег = автомат → сбор доски роями → столбы света (0.46), магазин → расстановка (S1a), ход врага с монохромом и «!» (S1b), победа в 6 с без кликов (S1c), обвал в 4 фазы + виньетка + пепел + огонь (S3/S11), гача с редкостью-событием и кузница (S7b/S10b/S14), плинко (S7c), автомат фигур (S7a), подсказки в три слоя (S10a), путь забега (S13), боссы: явление, способность видимо, бой, смерть, поражение (S8/S14), подписи взятия шести фигур (T4), обучающая партия на событиях (T3), пиксельные фигуры в размере референса (0.59.0).
1.2 Не сделано (○) — предмет этого ТЗ
| # | Сцена | У референса (измерено) | У нас | Батч |
|---|---|---|---|---|
| A1 | Старт боя | панели расстановки уезжают вниз 500 мс с искрами по краям; через 1.1 с въезжает панель действий; «дин» 100 мс / 3.6 кГц на «ваш ход» | ✅ 0.60.0: уход панелей с искрами, «дин» + вспышка каймы | T5 |
| A2 | Взятие | t+130 мс белое облако накрывает клетку целиком, тёмные осколки веером, облако редеет к 1.1 с | ✅ 0.60.0: облако из пиксельных клубов | T5 |
| A3 | Тень под фигурой | плотный тёмный эллипс под подставкой у каждой фигуры | ✅ 0.60.0: эллипс пиксельными строками | T5 |
| A4 | Последняя фигура под ударом | красная виньетка по периметру, пока опасность есть, красный «!»-огонёк над фигурой | ✅ уже было (S3, DangerSignals.vignette) |
— |
| A5 | Пропуск хода | веер жёлтых искр из кнопки 200 мс, щелчок | ✅ уже было (Button(sparks)) |
— |
| A6 | Доска и HUD | пиксельные плиты с фаской, латунный кант, чипы HUD в том же языке | ✅ 0.60.0: плиты с фаской и жилками, заклёпки канта, основа скинов; чипы HUD — остаток T8 | T5 |
| A7 | Подсветка ходов | drag: ВСЕ легальные клетки зелёным, враг под ударом — красной рамкой, зелёный «след» на исходной | ✅ 0.60.0: свет + рамка, прицел взятия; drag опцией — T9 | T5 |
| B1 | Награда → казна | «получить $N» выстреливает искрами, панель улетает вверх 400 мс, монеты летят в казну 1.4 с, казна считает по прилёту | ✅ 0.61.0 | T6 |
| B2 | Кладбище | отдельный экран над уменьшенной доской: последние 5 потерянных, первая покупка $0, остальные +$3 до конца забега, «скрыть», возврат в магазин панелями ≈ 3 с | ✅ 0.61.0: ядро + экран + тумблер «показывать кладбище» | T6 |
| B3 | Поражение | фон темнеет в бордовый 300 мс, сток и полка уезжают за края, «конец игры» раскрывается над доской 200 мс, доска стоит 1 с «местом смерти», звук 1.1 с | ✅ 0.61.0 | T6 |
| B4 | «Открыт новый гамбит» | модалка после итогов: портрет с сиянием, условие серым, конфетти, крестик через 1 с | тоста нет | T6/T8 |
| C1 | Первый запуск | §1.3: язык → заставка → меню без «продолжить» → диалог «начать» | ✅ как есть (наш выбор языка лучше) | — |
| C2 | Наставник | фигурка на светящейся подставке справа от доски, реплика ПЕЧАТАЕТСЯ 40 симв/с с тиканьем, ключевое слово оранжевым капсом, «далее» появляется после допечатки, цепочка 2–4 реплик на событие, советы по первому появлению механики (сток, высадка, взятие); ввод гейтится молча (не копируем) | ✅ 0.61.0: MentorPlate в обучении и подсказках первого забега; цепочки по новым механикам — остаток T9 |
T7 |
| C3 | Подсказки первого забега | «продумайте стратегию!» на расстановке, «!» у фигуры под угрозой с «дин», карточка врага «приближается босс» | подсказки только в партии-уроке | T7 |
| C4 | Меню | ряд второстепенных кнопок внизу (настройки · коллекция · авторы · выход), рост кнопки 8–10 % за 80–100 мс | ✅ 0.61.0: «Правила · Обучение · Настройки» (Коллекция — T8) | T7 |
| D1 | Справка/коллекция | один экран с вкладками: прогресс · гамбиты 97/200 с цепями и «новым» · фигуры с диаграммой · клетки с «???» · враги (5 модификаторов) · боссы-карусель · помехи (заперта) | карта пути, справочник боссов, глоссарий, правила — порознь | T8 |
| D2 | Разблокировки гамбитов | ~40 % пула заперто условиями; диалог после поражения; цепи на портретах | заперты 6 секретных, диалога нет | T8 |
| D3 | Настройки | «улучшенный ИИ» с пояснением под тумблером, «сбросить данные», координаты клеток, карусель скинов доски (превью 3×3) | тумблеры доступности есть; остального нет | T8 |
| E1 | Магазин/расстановка | продажа с доски по наведению/долгому тапу, тост «открыто новое» в углу, подорожание карточек после сброса | ○ | T9 |
| E2 | Портреты гамбитов | крупные персонажи-фигуры вместо иконок | медальоны | T9 (12 «семейств» по типу эффекта) |
| E3 | Статусы и эффекты гамбитов | защита — щит, благословение — нимб, капкан — зубья, стазис — лёд; у 8 гамбитов свой арт эффекта (1.5.4b) | кольца; общий язык FX | T9 |
1.3 Прогон «как новый игрок» (25.10, logs/ref/timelapse/fresh, logs/ref/bot/fresh)
Два прогона (logs/ref/timelapse/fresh, fresh2, бот-скриншоты logs/ref/bot/fresh2_*):
- Флаг «первый запуск на устройстве» (FirstLaunchOnThisDevice) перезапускает игру в ПОЛНОЭКРАННОМ родном разрешении
и на английском (язык — системный, экрана выбора языка нет); меню для нового игрока то же: лента-титул, «Play!»,
ряд «Settings · Collection · Credits · Quit», промо мобильной версии, Discord/Steam. Никаких приветственных окон.
→ У нас экран выбора языка при первом запуске (сделан) — оставляем, это лучше.
- Сейв нельзя «обнулить» локально — Steam Cloud возвращает забег владельца (диалог сразу с «Продолжить»); значит,
состояние обучения (какие советы показаны) живёт в сейве, подсказки наставника выдаются ПО СОБЫТИЮ один раз за профиль.
- Наставник (кадры fresh2_0009…0013, таймлапс 93–126 с): розовая пиксельная фигурка (король с короной, ~2 клетки
высотой) на зелёной круглой подставке со свечением, СПРАВА от доски на уровне её верхней трети; над ней плашка
(кость, тёмная рамка, 260×100 px при 1280×720) с текстом, который ПЕЧАТАЕТСЯ (в таймлапсе 150 мс видно по 5–6 новых
символов на кадр ≈ 40 симв/с); ключевое слово ОРАНЖЕВЫМ капсом («классный совет!», «ПЕРЕНЕСТИ»); кнопка «ДАЛЕЕ» под
фигуркой ПОЯВЛЯЕТСЯ ТОЛЬКО ПОСЛЕ допечатки (кадр 0010 — текста половина, кнопки нет; 0013 — текст полный, кнопка есть).
Пока плашка на экране, ходы не принимаются (бот 6 раз подряд пытался — «STUCK»): гейт молчаливый, что мы НЕ копируем.
- Цепочка на одно событие: «Привет, это снова я! Дам тебе классный совет!» → «Если лимит фигур не исчерпан, в свой ход
ты можешь ПЕРЕНЕСТИ фигуру, перетащив её из запаса!» — две реплики через «ДАЛЕЕ», триггер — в стоке появилась фигура при
свободном лимите. Это тот же наставник, что в §7 NOTES (взятие, высадка): подсказки привязаны к первому появлению
механики, а не к первой партии.
- Расстановка: наведение на фигуру/клетку даёт карточки с язычком («Защитная клетка», «Гамбит тамплиера» — свои
названия у нас), «ВПЕРЁД!» при нажатии выстреливает веером жёлтых искр (кадр 61 с) — подтверждает единый язык кнопок.
- Превращение ВРАЖЕСКОЙ пешки глазами игрока (кадры 67–73 с): титул «ПРЕВРАЩЕНИЕ» над доской, вся сцена
окрашивается радужным градиентом (зелёный → синий → фиолетовый → розовый → золотой за ~3 с), панель с шестью
силуэтами фигур раскрывается слева направо, над доской подпись «Враг пропускает ход!», затем столб света на клетке и
новая фигура белым силуэтом → цвет. У нас (S9) свой диалог для СВОЕЙ пешки; для вражеской — проверить, что сцена
столба и подпись «враг пропускает ход» есть (планка 16/19 NOTES) — иначе в T5.
- Подсказка угрозы в бою: красный «!» над своей фигурой под ударом и над вражеской — крошечная корона-метка
«ходила последней» (кадры 57–62 с) — у нас есть (S1b).
2. Сцены — что делаем (глаголы и тайминги)
2.1 Заставка и главное меню (T7)
- Заставка 0.50 остаётся (пешка падает 0.8 с → вспышка-сборка → титул → «играть» пружиной 250 мс → ряд кнопок 150 мс);
заменить пешку-талисман на пешку набора
world(та же, что иконка), искры из титула — в цвете латуни. - Ряд второстепенных кнопок внизу: «Коллекция · Авторы · Настройки» (телефон: три иконки-плашки по ширине, высота 48 dp), въезжают снизу через 150 мс после «играть». На десктопе — рост 8–10 % за 80–100 мс при наведении, на телефоне — вжатие 4 % при нажатии (у нас уже есть у «играть»).
- Промо/соцсети/«сообщить об ошибке» не копируем: вместо них одна плашка «Что нового 0.60» (из
updates.html, офлайн-текст). - Приёмка: лента заставки, скриншот меню 412 и Fold, тест
MainMenuScreenshotTest(три кнопки видны, не режутся).
2.2 Первый запуск и обучение (T7)
Наш принцип сохраняется: обучение — настоящая партия 5×5 (T3), уроки идут за событиями, ввод не блокируется молча.
Добавляем язык референса:
- Наставник: пиксельный персонаж (своя фигура-«советник» в той же сетке 24 px, два кадра: покой и «говорит»), стоит на
плашке у нижнего края (телефон) или справа от доски (ландшафт). Реплика печатается посимвольно 40 симв/с с тиканьем
3.6 кГц (−40 дБ), ключевое слово ОРАНЖЕВЫМ, кнопка «далее» (пружина 200 мс). Тап по плашке — допечатать сразу.
- Цепочки: на событие — до 3 реплик («далее» между ними); пока реплика печатается, ход принимается, но подсветка целей
приглушена на 50 % и над доской мелкая строка «наставник говорит…» (гейт явный, не молчаливый — §10.4).
- События урока (как T3) + новые: первый магазин («сброс», «замок», «жетоны» по одной реплике при наведении/тапе),
первая расстановка («перетащи фигуру на первые две линии», «продумайте стратегию!»), первый «!» угрозы («дин» + реплика),
первый обвал-предупреждение, первая награда (строки итогов — «откуда деньги»).
- Повтор и пропуск: «Пропустить обучение» остаётся; из настроек — «Обучение» (есть), плюс «Подсказки наставника» тумблер.
- Содержимое — content/tutorial.json (RU+EN), lint-тест на пары языков; ядро не трогаем.
- Приёмка: лента печати реплики (кадр на 10 символов), тест TutorialOverlayTest (цепочка, «далее», тап-допечатать),
скриншоты 412/Fold на каждом шаге.
2.3 Новый забег → расстановка (T5, полировка)
Сцена S6 сделана; под новые фигуры: силуэты в столбах — чёрный силуэт сетки world (а не старого набора), посадка = белая
вспышка 100 мс; маркер-скобка по садящимся клеткам — в пиксельном языке доски (2.6).
2.4 Старт боя (T5)
- «Вперёд!»/«В бой» — веер жёлтых искр из кнопки (единый язык крупных кнопок: «пропуск», «получить», «далее»).
- Панели расстановки УЕЗЖАЮТ вниз 500 мс с брызгами искр по верхнему краю; штриховка врага гаснет; пауза; через 1.1 с панель действий въезжает снизу со стуком (есть); «дин» 100 мс / 3.6 кГц на «ваш ход» + короткая вспышка по кайме доски.
- Приёмка:
BattleStartFramesTest— 0, 250, 500 (панели вне экрана), 1100 (панель действий), 1200 («дин» в логе звука).
2.5 Бой: выбор, ход, взятие, угрозы (T5)
- Подсветка светом, не точками: выбранная фигура — зелёная рамка + имя капсом над клеткой (есть); легальные клетки — зелёная заливка 25 % + рамка; враг под ударом — красная рамка + «прицел»; исходная клетка — зелёный «след»-овал. Десктоп: drag как у референса (все цели при захвате, посадка ≤ 2 кадра). Телефон: тап остаётся.
- Дым взятия: t+130 мс белое облако (пиксельные клубы 3 кадра) накрывает клетку целиком, жертва исчезает под ним, тёмные осколки 2–4 px веером вверх с гравитацией 0.8 с, облако растёт/редеет и сносится вверх-вправо, победитель проступает к t+450, чисто к t+1.1 с. Подписи взятия (T4) рисуются ПОВЕРХ облака. Два звука: своё 360 мс / 1.6 кГц, потеря 340 мс / 5.6 кГц (проверить, что оба есть и различимы).
- Тень под фигурой: плотный тёмный эллипс (ширина 0.8 клетки, высота 0.18, альфа 0.45), прыжок — тень сжимается.
- Угрозы: «!» + «дин» через 200 мс после посадки врага (есть); последняя своя фигура под ударом — красная виньетка по периметру (та же, что при обвале) + «!»-огонёк, держится, пока опасность есть.
- Пропуск: веер искр 200 мс из кнопки + щелчок; враг ходит быстрее (1 с).
- Приёмка: ленты
capture_cloud,threat_last_piece,skip_sparks;BattleFxScreenshotTestдополняется кадром облака (белых пикселей на клетке жертвы > 40 % в t+200).
2.6 Доска и HUD в пиксельном языке (T5, остаток Task R)
- Клетки — пиксельные плиты: 2 тона по чётности + фаска 1 px сверху-слева светлее, снизу-справа темнее, редкие «жилки»; рамка доски — латунный кант 2 px с заклёпками по углам; дыра обвала — чёрный квадрат с рваным пиксельным краем (наш «лучше референса» дым остаётся).
- Чипы HUD (стадия, казна, ожидания, страйки, обвал, счётчики) — пиксельные плашки с 1-px обводкой; шрифт остаётся.
- Два скина доски сразу (мрамор, обсидиан) как основа D3.
- Приёмка:
BoardStyleScreenshotTestна 412/Fold/1920, сравнение «до/после» на dev.html.
2.7 Победа → награда → кладбище → магазин (T6)
- «Получить $N!» → искры из кнопки → панель итогов улетает вверх 400 мс → монеты (латунные кубики-искры) летят в казну 1.4 с, казна считает по прилёту (звон 460 мс / 7 кГц + стук посадки).
- Кладбище (экран): доска уменьшается в фон, фон — наш узор (не глаза референса); язычок падает сверху, строка
«последние 5 потерянных», карточки по одной 200 мс, цена «$0» на первой, после покупки все «+$3» до конца забега
(«ⓘ» объясняет); «далее» и «скрыть» (глаз, галочка и в настройках). Ядро
graveyardуже есть. - Возврат: панель кладбища улетает вверх 300 мс → доска целиком 200 мс → панель магазина падает сверху 200 мс с отскоком → превью доски уезжает влево 1 с → «далее» выходит последней. Итого ≈ 3 с, тап — перемотка.
- Приёмка:
GraveyardFramesTest, экономика кладбища — unit на инфляцию +$3 (есть в ядре, проверить UI-связку).
2.8 Поражение (T6)
- Взятие врагом → 300 мс фон темнеет в бордовый → сток и полка уезжают за края → панель действий вниз → «конец игры» раскрывается из точки над доской 200 мс → доска стоит 1 с → экран статистики (есть) раскрывается из вертикальной полосы 600 мс, плашки каскадом по 2–3 за кадр. Звук поражения 1.1 с / 1.2 кГц (низкий).
- «Открыт новый гамбит» — модалка ДО статистики: портрет с сиянием, условие серым, конфетти, крестик через 1 с.
- Приёмка:
DefeatFramesTest, скриншоты 412/Fold.
2.9 Боссы (T5–T6, полировка)
Сцены S8/S14 остаются; под новые фигуры — силуэты в столбах и осколки из сетки world; «пропуск» мелким текстом всю сцену
(есть). Новых планок нет.
2.10 Справка, коллекция, разблокировки, настройки (T8)
- Один экран «Справка» в забеге с вкладками: Прогресс (путь забега S13 + кладбище 5 точек + страйки 3 точки + 6 достижений с «!»/галочкой) · Гамбиты (N/200, сетка 2×5, страницы-точки, ОРАНЖЕВАЯ точка = есть новое, закрытые — цепи с замком) · Фигуры (6 карточек с диаграммой хода 5×5 — есть в глоссарии) · Клетки (карточки, не встреченная — «???» с чёрным квадратом) · Враги (5 модификаторов со значками, как над фигурой) · Боссы (карусель 8, не встреченный — чёрный силуэт + три «?») · Помехи (вкладка видна, заперта). Из меню — «Коллекция» = то же без «Прогресса».
- Разблокировки: 60–80 гамбитов с условиями из
achievements.json(взять N фигур, пережить обвал, победить босса X…), диалог после итогов/поражения, цепи на портретах, тост в бою ненавязчиво. - Настройки: вкладки (игра / графика / звук / дополнительно); «Улучшенный ИИ» (второй профиль ИИ: 2-ply, штраф за трещины, без «элиты») с пояснением под тумблером; «Показывать координаты клеток»; «Сбросить данные» с подтверждением; карусель скинов доски (превью 3×3, 4–6 скинов, часть открывается достижениями).
- Приёмка:
HelpTabsTest,UnlocksTest(условия → разблокировка), ИИ — симулятор 1000 забегов обоими профилями.
2.11 Магазин и расстановка — остатки (T9)
- Продажа с доски: десктоп — наведение → «продать $N»; телефон — долгий тап (есть «удерживать для продажи» тумблер) → плашка.
- Тост «открыто новое» в углу у полки (не блокирует).
- Подорожание карточек после сброса — баланс в
balance.json(флаг). - Портреты гамбитов: 12 «семейств» по типу эффекта (монета, превращение, фантом, защита, обвал, пешка, конь, слон, ладья, ферзь, король, клетка) × 4 редкости цветом — пиксельные персонажи-фигуры в сетке 32×32; генератор из композиции спрайта фигуры + атрибута.
- Статусы как предметы: защита — щит-вуаль, благословение — нимб, капкан — зубья, стазис — лёд с трещинами (сейчас кольца); тап по фигуре объясняет (есть).
- Эффекты 10 самых частых гамбитов «со своим лицом» (монеты — звон и россыпь, превращение — столб зелёного света, фантом — призрачный след…).
2.12 Звук (сквозное)
Единый язык (NOTES §17): щелчок 20–70 мс на любой клик (есть), стук посадки на панели/фигуры (есть), «вжух» на движение
панелей (есть), «дин» угрозы/«ваш ход» (A1), искры крупных кнопок (A5/B1), печать наставника (C2), монеты (B1), поражение
1.1 с (B3). Наведение без звука. Все — tools/gen_sfx_t5.py, слоты SoundFx.
3. Батчи, порядок и релизы
| Батч | Содержимое | Релиз | Оценка |
|---|---|---|---|
| T5 | A1–A7: старт боя с искрами и «дин», дым взятия, плотная тень, виньетка «последняя фигура», искры пропуска, доска/HUD в пиксельном языке (+2 скина), подсветка светом; полировка S6/боссов под фигуры world |
0.60.0 | 2 дня |
| T6 | B1–B4: монеты в казну, кладбище-экран, возврат панелями, поражение с уездом панелей и «конец игры» над доской, модалка «открыт гамбит» | 0.61.0 | 1.5 дня |
| T7 | C1–C4: наставник с печатью и цепочками, подсказки первого забега, ряд кнопок меню, заставка под новую пешку, «что нового» | 0.62.0 | 1.5 дня |
| T8 | D1–D3: справка/коллекция с вкладками, разблокировки 60–80 гамбитов с диалогом, настройки (улучшенный ИИ, координаты, сброс, скины доски) | 0.63.0 | 2 дня |
| T9 | E1–E3: продажа с доски, тост, дорогие карточки, портреты-семейства, статусы-предметы, эффекты 10 гамбитов | 0.64.0 | 2 дня |
Порядок — по видимости для игрока: бой (60 % времени) → победа/поражение (каждая партия) → первый запуск (каждый новый игрок) → справка/коллекция → витрины. Каждый батч: гейт (lint, ядро, desktopTest, симулятор при касании ядра, сборка), эмулятор-смок, выкладка APK на сайт, dev.html с лентами, отчёт владельцу; AAB в Play — по решению владельца после проверки на телефоне.
4. Что не копируем и что делаем по-своему
- Молчаливый гейт обучения, Esc не закрывает справку, «вперёд!» при перекрытии молчит, «продолжить» со второго клика — не повторяем (§10.4). Тряска у нас сильнее референса — оставляем.
- Промо мобильной версии, соцсети, Twitch-вкладка — не нужны.
- Фон кладбища (глаза), портреты-персонажи с колбами/муравьями, имена боссов и гамбитов, звуки — только свои.
- Путь забега (S13) и подписи взятия (T4) — наше преимущество, остаются.
5. Открытые вопросы владельцу
- Наставник — кто он? Предложение: «Советник» — фигура-слон с латунным моноклем, два кадра; или абстрактный «голос» без персонажа (дешевле, но слабее).
- Drag на телефоне: оставить тап (как сейчас) или дать drag как опцию в настройках («управление: тап / перетаскивание»)?
- Скины доски: сколько и какие первыми (мрамор, обсидиан, дуб, песчаник, лёд, латунь)?
- Порядок батчей: T5 → T6 → T7 → T8 → T9 (предложен) или сначала обучение (T7)?