Files
brov-macbook/tehzadanie.md
T
maksarsanjeev 750e5ad0ad Character brief for the BroV redesign (tehzadanie.md)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:01:48 +03:00

417 lines
34 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ТЗ: персонаж для BroV
## 0. Контекст
**BroV** — маленькое приложение для macOS, которое живёт в «чёлке» (notch) MacBook. Внутри сидит персонаж-маскот. Он показывает, что делают ИИ-агенты (Claude Code и другие), просит подтвердить действия, болтает в чате и реагирует на пользователя.
Название — игра слов: **BroV = «бровь»** (чёлка MacBook похожа на бровь) + «bro». Персонаж должен это обыгрывать.
Сейчас в приложении стоит временная заглушка: болотно-зелёный бугристый комок с огромной сросшейся волосатой бровью, кровавыми глазами разного размера, зубастой ухмылкой, слюной, бородавками и шрамом со швами. Её нужно заменить на нормально придуманного персонажа.
**Важно про технику.** Персонаж **рисуется кодом**: SwiftUI `Canvas`, векторные примитивы (эллипсы, кривые Безье, скруглённые прямоугольники, градиенты), 60–120 кадров/с. Картинок, спрайтов, Lottie или Rive нет. Анимация **параметрическая**: у движка есть набор чисел (поворот головы, сжатие, открытость глаз и т. п.), которые плавно меняются, и каждый кадр персонаж перерисовывается по этим числам. Значит, от тебя нужны не «кадры мультика», а **конструкция персонажа + раскадровки, привязанные к этим параметрам**. Код по твоему дизайну напишет другой ИИ (Claude).
---
## 1. Что нужно сдать (deliverables)
1. **Концепт и характер.** 3 варианта концепта (картинками), потом один финальный. Короткое описание характера: кто он, как двигается, чем бесит, чем мил.
2. **Character sheet** финального варианта: анфас, повороты головы влево/вправо (≈30°), взгляд вверх/вниз, вид в мелком размере (20 и 44 pt).
3. **Слоистый SVG** нейтральной позы (viewBox, описанный в разделе 3), каждый элемент отдельной группой с понятным `id`: `body`, `shading`, `brow`, `eye-left`, `eye-right`, `mouth`, `hand-left`, `hand-right`, `details` (бородавки, шрамы и т. п.). Только простые фигуры: `ellipse`, `rect rx`, `path` с кривыми Безье, `linearGradient`/`radialGradient`. Без фильтров, масок с растром, шрифтов и картинок.
4. **Все формы глаз** (13 штук, раздел 6) — SVG или чёткие эскизы с размерами.
5. **Все формы брови** по состояниям и эмоциям (раздел 7).
6. **Все формы рта** по состояниям, плюс «рот-щель» для режима коробки (раздел 11).
7. **Палитра** с HEX: основное тело, тени, обводки, глаза, бровь, рот, акценты. Плюс правило, как тело перекрашивается в цвет состояния (раздел 5).
8. **Раскадровки** каждой анимации из разделов 8–13: ключевые позы + тайминги в миллисекундах + какие параметры меняются. Формат описан в разделе 15.
9. **Аксессуары/наряды** (раздел 14): как каждый сидит на новой форме тела.
10. **Иконка приложения** (1024×1024, скруглённый квадрат macOS) и **иконка меню-бара** (одноцветный силуэт 22×16 pt, читается в 16 px).
---
## 2. Жёсткие ограничения
- **Фон всегда чёрный**: чёлка — это чёрный остров у верхнего края экрана. Персонаж должен хорошо читаться на `#000`–`#16171B`.
- **Размеры, в которых он живёт** (диаметр области персонажа):
- 6 pt — спрятан в чёлке (почти точка);
- 20 pt — бегунок полосы загрузки;
- 24–30 pt — свёрнутый режим (compact) и мини-боты в «пилюлях» агентов;
- 44–66 pt — основной размер в развёрнутой чёлке;
- 120 pt — режим «на рабочем столе»;
- 1024 — иконка.
**Главный размер — 44–66 pt.** При 20–30 pt мелкие детали (волоски, вены, бородавки) должны пропадать, а силуэт, бровь и глаза — оставаться узнаваемыми. Опиши, какие детали скрывать ниже какого размера.
- **Простота отрисовки**: держи в голове бюджет ~40 фигур на кадр для основного персонажа и ~10 для мини-бота. Без сложных текстур.
- **Псевдо-3D**: голова «поворачивается» (yaw/pitch, раздел 4). Глаза, бровь и рот при повороте **съезжают по поверхности** и сплющиваются по краям, как на шаре. Значит, лицо должно лежать на условной сфере, а не быть плоской наклейкой.
- **Тело перекрашивается**: мини-боты агентов заливаются сплошным цветом агента (синий, зелёный и т. д.). Дизайн должен работать и в «своих» цветах, и в однотонной заливке любого цвета.
- **Лицензия**: нельзя делать похожим на Mochi из проекта Coucou (белый мягкий квадратик-моти с двумя чёрными глазами-пилюлями). Свой оригинальный персонаж.
- **Настроение**: кринжовый, слегка жуткий, но обаятельный. Уровень «милый монстр / гадкий бро», не хоррор, от которого неприятно работать.
---
## 3. Система координат
Холст квадратный, сторона `W`. Все размеры персонажа считаются от `R = 0.3 · W`.
| Элемент | Значение |
|---|---|
| Центр тела | центр холста, чуть ниже: `cy = H/2 + 0.06R` |
| Полуширина тела `rx` | `1.14 R` |
| Полувысота тела `ry` | `0.88 R` |
| Текущая форма тела | суперэллипс (скруглённый «squircle»), показатель ≈ 2.7 |
| Глаза | на «сфере» на ±0.37 рад (≈21°) от центра по горизонтали, по вертикали чуть ниже центра (`eyeP = −0.12` рад) |
| Размер глаза | ширина `0.25R`, высота `0.27R` |
| Руки | эллипсы `0.60·ry × 0.52·ry`, прячутся за телом снизу по бокам |
Форму тела **можно менять** (не обязательно squircle), но габариты держи примерно в `2.3R × 1.8R`: под них свёрстан весь интерфейс.
Для SVG используй `viewBox="-1.5 -1.5 3 3"` с единицей = `R` и центром тела в (0, 0). Так размеры переносятся в код один в один.
---
## 4. Анимационные параметры движка
Каждый кадр движок хранит эти числа и рисует персонажа по ним. Все раскадровки описывай через них. Можешь предложить **новые параметры** (например, `browAngle`, `mouthOpen`, `drool`), но явно их перечисли и опиши диапазон.
| Параметр | Диапазон | Что делает |
|---|---|---|
| `yaw` | −0.65…0.65 рад | поворот головы влево-вправо (лицо съезжает по сфере) |
| `pitch` | −0.5…0.5 рад | взгляд вверх-вниз |
| `tilt` | ±0.2 рад | наклон всего тела (поворот вокруг центра) |
| `roll` | 0…4π | «кувырок»: лицо прокручивается по сфере, полный оборот = 2π |
| `sx`, `sy` | 0.78…1.28 | сжатие/растяжение тела (squash & stretch) |
| `ox`, `oy` | ±0.3 (в долях R) | смещение тела (тряска, подпрыгивание) |
| `open` | 0.06…1 | открытость глаз (моргание) |
| `es` | 1…1.25 | масштаб глаз (удивление, наведение мыши) |
| `tint` | 0…0.78 | насколько тело окрашено в цвет состояния (снизу вверх) |
| `blush` | 0…1 | румянец |
| `hands` | 0…1 | руки выдвинуты из-за тела |
| `morph` | 0…1 | превращение тела в коробку-почтовый ящик (раздел 11) |
| `slotH` | 0…0.5 (в долях R) | высота «рта-щели» коробки, на пружине |
| `badgeS` | 0…1 | масштаб значка над головой (раздел 9) |
| `physDx`, `physDy` | −1…1 | инерция для шапок и болтающихся деталей: отстают при движении |
| `dancingLevel` | 0…1 | танец под музыку (раздел 12) |
| `outfitPresence` | 0…1 | появление наряда |
**Как меняются значения:**
- **Твины по ключам:** `[цель, длительность мс, кривая]`, ключи идут друг за другом. Кривые: `out` (кубическое замедление), `inOut`, `back` (с перелётом и откатом, c1 = 1.7), `lin`.
- **Плавное следование к цели** каждый кадр — для взгляда, наклона и дыхания.
- **Пружины:** для рта-щели (период 0.25 с, затухание 0.6, лёгкий «клац») и для инерции аксессуаров (жёсткость 60, затухание 9).
---
## 5. Состояния (BotState)
Состояние держится долго, пока агент в нём находится. У каждого есть цвет подкраски тела, форма глаз, значок, постоянное поведение и звук при входе.
| Состояние | Когда | Цвет | Подкраска | Глаза | Значок | Постоянное поведение | При входе |
|---|---|---|---|---|---|---|---|
| `idle` | ничего не происходит | `#E6E9EE` | 0 | pill | — | следит глазами за курсором | моргание |
| `working` | агент работает | `#3B9EFF` | 0.72 | pill | три точки (синие) | следит за курсором | моргание, звук `work` |
| `thinking` | модель думает | `#8B5CF6` | 0.72 | pill | три точки | смотрит вверх-вправо (задумчиво) | звук `think` |
| `searching` | поиск | `#6365F2` | 0.72 | pill | три точки | **сканирует**: голова ходит влево-вправо `yaw = sin(2.6t)·0.6` | звук `search` |
| `approval` | ждёт разрешения | `#F5A524` | 0.78 | wide | «!» | **подпрыгивает** `oy = −|sin(5.2t)|·0.07` | прыжок `oy`: −0.2 за 150 мс (out) → 0 за 300 мс (back), звук `approval` |
| `question` | агент задал вопрос | `#22D3EE` | 0.75 | pill | «?» | голова наклонена `tilt = 0.17` | моргание, звук `question` |
| `error` | ошибка | `#F4505E` | 0.78 | flat | точка | — | тряска `ox`: 0.08 (50 мс) → −0.08 (70) → 0.05 (70) → 0 (90), звук `error` |
| `finished` | готово | `#34D499` | 0.35 | happy | точка | — | **кувырок** на 1 оборот за 950 мс + 5 искр через 0.5 с, звук `finish` |
| `ratelimit` | упёрся в лимит | `#FB923C` | 0.72 | tired | точка | **потеет**: капли пота | капля пота, звук `rate` |
| `sleeping` | давно без дела | `#94A2B8` | 0.32 | closed | — | **дышит** (sy ±0.035, sx в противофазе, частота 1.8), смотрит чуть вниз, летят «Z» | звук `sleep` |
| `dizzy` | его 3 раза шлёпнули | `#F472B6` | 0.70 | spiral | — | голова мотается `yaw = sin(9t)·0.25` | **2 кувырка** за 1300 мс, звук `dizzy` |
Подкраска: поверх основного градиента тела снизу вверх идёт градиент цвета состояния (непрозрачность `0.72·tint` внизу → 0 вверху). Цвет переключается плавно, примерно за полсекунды.
**Задача:**
- для каждого состояния нарисуй позу: бровь, рот, глаза и особые детали (например, при `error` пар из ушей, при `ratelimit` высунутый язык);
- скажи, как подкраска ложится на твою палитру;
- если хочешь заменить подкраску другим приёмом (свечение, цвет брови и т. п.), предложи.
---
## 6. Формы глаз (EyeShape)
Глаз рисуется в своей локальной системе: центр (0, 0), ширина `w`, высота `h`, сплющивание по сфере применяет движок. Нужен дизайн всех 13 форм:
| Форма | Где используется | Сейчас выглядит как |
|---|---|---|
| `pill` | норма | вертикальная пилюля; при моргании сплющивается до `max(h·open, 0.3w)` |
| `wide` | approval | pill ×1.16 по ширине, ×1.12 по высоте |
| `dot` | эмоция «удивлён» | маленький круг 0.9w |
| `line` | «раздражён» (после шлепка) | короткая наклонная полоска, наклон ±0.2 рад к центру |
| `flat` | error | горизонтальная полоска |
| `happy` | finished, «счастлив», танец | дуга-«улыбка» ∩ |
| `closed` | sleeping | дуга ∪, закрытые глаза |
| `spiral` | dizzy | **вращающаяся** спираль (2.2 витка, крутится с частотой 9 рад/с, левый и правый в разные стороны) |
| `heart` | «любовь» | красное сердце `#FF4D6D` |
| `star` | «гордость» | **вращающаяся** жёлтая звезда `#F7B32B` |
| `tired` | ratelimit, «зевок» | полуприкрытый глаз с веком |
| `wink` | «подмигивание» | левый открыт (pill), правый — дуга happy |
| `cup` | коробка, когда файл над ней | «чашка»: плоский верх, скруглённый низ |
У нормального глаза обязательно должен быть **зрачок или явное направление взгляда**: он смотрит на курсор мыши.
---
## 7. Бровь (новый ключевой элемент)
Раз персонаж «бровь», бровь должна быть **главным выразительным органом**, сильнее глаз. Нужно:
- **дизайн брови**: моно-бровь или две, волосатая или гладкая, толщина, цвет;
- **позы брови** для каждого из 11 состояний и 7 эмоций:
- угол центра (вниз = злость, вверх = тревога);
- подъём краёв;
- асимметрия (одна бровь вверх — вопрос);
- **анимации брови:**
- «поиграть бровями» (быстрый двойной подъём, ~300 мс) — для приветствия и наведения мыши;
- подёргивание в ожидании (approval);
- бровь «уползает» в сторону при головокружении;
- бровь «падает» при засыпании;
- новый параметр `browRaise` (−1…1), `browAngle` (−1…1), `browWiggle` или свои — опиши.
---
## 8. Постоянные (фоновые) поведения
Работают всегда, поверх состояний:
1. **Взгляд за курсором:** `yaw → lookX·0.62`, `pitch → lookY·0.5`, где `lookX/Y` — нормализованное направление на курсор (−1…1). Плавно, с коэффициентом `1 − 0.0025^dt`.
2. **Моргание:** каждые 2.2–5.4 с случайно. Моргание = `open`: 0.06 за 70 мс (inOut) → 1 за 130 мс (out). В 22 % случаев двойное (второе через 230 мс). Не моргает во сне и при головокружении.
3. **Дыхание** (только `sleeping` у основного): sy = 1 + sin(1.8t)·0.035, sx = 1 − sin(1.8t)·0.02.
4. **Пульс мини-ботов:** sy = 1 + sin(2.2t)·0.04, sx = 1 − sin(2.2t)·0.02, у каждого своя фаза.
5. **Блуждающий взгляд мини-ботов:** мышь игнорируют, каждые 0.5–2 с смотрят в случайную точку.
6. **Фоновые частицы:** раз в 1.3 с — «Z» во сне; капля пота (50 %) при ratelimit.
7. **Инерция аксессуаров** (`physDx/Dy`): шапки и помпоны отстают при повороте головы, прыжке и кувырке.
**Задача:** предложи 2–4 своих фоновых «тика», которые делают персонажа живым и кринжовым. Например:
- в простое иногда ковыряет в носу или чешет бровь;
- слюна медленно капает;
- раз в минуту оглядывается.
Для каждого укажи частоту, длительность и параметры.
---
## 9. Значок над головой (badge)
Маленький кружок слева сверху от тела (≈ на `−0.72R` по X). Типы:
- `dots` — три точки, работа/мышление;
- `bang` — «!», ждёт тебя;
- `question` — «?»;
- `dot` — просто точка-индикатор.
Смена значка: старый уменьшается до 0 за 90 мс, новый вырастает до 1 за 280 мс (back).
**Задача:** дизайн значков в стиле персонажа. Можно предложить заменить значок на действие самого персонажа, например бровь изгибается в «?».
---
## 10. Одноразовые анимации и эмоции
Тайминги ниже — **текущие**. Их можно менять, но в том же формате.
### 10.1 Squash (шлепок по телу, приземление)
- `sy`: 0.78 (70 мс, out) → 1.1 (130, out) → 1 (170, inOut);
- `sx`: 1.16 (70) → 0.95 (130) → 1 (170);
- плюс толчок пружины аксессуаров вниз.
### 10.2 Шлепок пользователем (slap)
- Клик по персонажу → squash + толчок вбок + глаза `line` на 800 мс + звук `slap`, затем `annoyed`.
- **3 шлепка за 1.7 с → состояние `dizzy`** (2 кувырка, спирали в глазах).
- **Задача:** реакция на 1-й, 2-й и 3-й шлепок по нарастающей (бровь, рот, слюна летит?).
### 10.3 Кувырок (roll)
- Лицо прокручивается по «сфере» на `2π · turns`: `finished` — 1 оборот за 950 мс, `dizzy` — 2 оборота за 1300 мс, кривая inOut. В конце — squash.
- **Задача:** как ведут себя бровь, рот и детали при кувырке. Сейчас лицо просто «уезжает за горизонт» шара и выезжает с другой стороны.
### 10.4 Эмоции (BotEmote)
Временные, по умолчанию 1.8 с. Глаза меняются на форму из таблицы, плюс движение:
| Эмоция | Глаза | Движение | Частицы | Звук |
|---|---|---|---|---|
| `love` | heart | румянец 1 (300 мс) → держит → 0 (300 мс); прыжок `oy` −0.1 (160) → 0 (300, back) | 4 сердца | `love` |
| `surprised` | dot | прыжок `oy` −0.3 (140) → 0 (380, back); глаза `es` 1.25 (120) → 1 (500) | — | — |
| `proud` | star | squash; наклон −0.14 (220) → держит → 0 (280); румянец 0.7 | 5 звёзд | `proud` |
| `wink` | wink | наклон 0.12 (160) → держит → 0 (240) | — | `wink` |
| `yawn` | tired → closed через 0.7 с | sy 1.12 / sx 0.94 за 500 мс и обратно | 2 «Z» | `yawn` |
| `happy` | happy | румянец 0.6 (200) → 0 (600) | — | — |
| `annoyed` | line (800 мс) | — | — | `annoyed` |
**Задача:** раскадровка каждой эмоции с бровью и ртом. Можно добавить 2–3 новые кринжовые эмоции, например:
- `disgust` — блевок;
- `smug` — самодовольная бровь;
- `cringe` — сжимается и отворачивается.
### 10.5 Частицы
Типы: `heart`, `star`, `spark`, `sweat`, `z`.
- Рождаются над головой (y ≈ −0.7…−0.9 R), летят вверх со скоростью 0.45–0.8 R/с.
- Небольшой случайный разлёт, живут 1.3–1.8 с, вращаются.
- В группе каждая следующая стартует на 140 мс позже.
- `z` смещены вправо.
**Задача:** стиль частиц под персонажа. Можно заменить: вместо сердец — сердца с каплей, вместо искр — брызги слюны и т. п.
### 10.6 Мини-боты: периодические выходки
У мини-ботов (24–30 pt, однотонные) с постоянной эмоцией раз в 2–5 с:
- `happy` — подскок `oy` −0.30 (120) → 0.03 (200) → 0 (160, back) со squash;
- `annoyed` — резкое мотание головой `yaw`: −0.65 → 0.65 → −0.5 → 0.4 → −0.2 → 0 (50/90/80/75/70/140 мс);
- `wink` — подмигнул и наклонил голову на 0.55 с;
- `love` — 2 сердца + покачивание.
**Задача:** как выглядит мини-версия (упрощённый силуэт, бровь обязательна).
---
## 11. Загрузка файла: тело → почтовый ящик
Пользователь тащит файл на чёлку, и персонаж **превращается в коробку с прорезью-ртом**, «глотает» файл и жуёт.
- `morph` 0 → 1: контур тела плавно перетекает из своей формы в скруглённый прямоугольник `1.0R × 0.94R` (полуразмеры), радиус углов `0.42R`.
- Подкраска уходит, глаза опускаются на `0.14·ry·morph` и становятся «плоскими» (сплющивание по сфере исчезает).
- **Прорезь-рот** (`slotH`, на пружине): ширина `1.8R·morph`, верх у крышки коробки.
- Позиции: 0 = закрыт, 0.20 = приоткрыт (файл рядом), 0.42 = открыт (файл над прорезью), 0.50 = максимум.
- Белый ободок у крышки, внутри тёмный градиент, светлая нижняя губа.
- Глаза: `cup`, когда файл над коробкой; `happy`, пока жуёт.
- **Глоток (gulp):**
- рот 0.42 → через 460 мс закрывается и 800 мс жуёт;
- тело: `sy` 0.78 (80) → 1.18 (130) → 1 (220, back), `sx` 1.28 → 0.92 → 1, моргание;
- звук `gulp`.
- **Таймлайн загрузки** (секунды от входа файла в зону):
| Момент | Время, с | Что происходит |
|---|---|---|
| следит за файлом | до 1.95 | коробка ездит по горизонтали за курсором |
| DROP | 1.95 | пользователь отпустил файл |
| засасывание | 2.03–2.33 | файл втягивается в прорезь |
| рот закрыт | 2.42 | |
| жевание | 2.60–2.88 | |
| уменьшение | до 3.23 | коробка сжимается в точку 20 pt |
| полоса загрузки | с 3.00 | появляется полоса |
| прогресс | с 3.25 | точка-персонаж едет по полосе как бегунок |
**Задача:**
- как выглядит **коробка в стиле персонажа**: бровь остаётся над прорезью? прорезь с зубами?
- раскадровка глотка и жевания;
- как выглядит 20-pt бегунок.
---
## 12. Танец (Apple Music)
Когда играет музыка, персонаж танцует на 112 BPM:
- подскок `0.20R·|sin(π·beat)|`;
- покачивание по X `0.08R·sin(π·beat)`;
- наклон `0.10·sin(π·beat)`;
- при приземлении приплющивание (sx +4.5 %, sy −6 %);
- глаза `happy`;
- вход за 0.3 с, выход за 0.5 с;
- точка вращения — низ тела.
**Задача:** движения брови и рта в танце (бровь качается в такт?).
---
## 13. Приветствие и появление
### 13.1 Приветствие при запуске (отдельная сцена, остров 640×150 pt, персонаж 58 pt в центре)
| Время, с | Что происходит |
|---|---|
| 0–0.85 | выезжает из чёлки вниз |
| 0.85–1.30 | осматривается, моргает |
| 1.30–1.45 | **«поп»** — выпрыгивает, растягиваясь |
| 1.45–2.40 | **машет правой рукой** (вверх-вправо), левая покачивается; руки — эллипсы, которые выдвигаются из-за тела |
| 2.40 | довольные глаза (`happy`/`content`) |
| 2.45–2.70 | прячет руки (вниз-влево) |
| 2.72 | появляется значок |
| 2.85–3.45 | съезжает вниз-вправо на своё место |
| 3.70 | второе моргание |
| 3.85–4.15 | подкраска цветом |
| 4.60 | конец сцены |
| 4.90 | автоуход (остров сворачивается за 0.34 с) |
### 13.2 Короткое «привет» (greet), когда пользователь вернулся
- 0 с: глаза `happy` на 2 с, прыжок `oy` −0.06 (220) → 0 (220, back);
- 0.25 с: руки выдвигаются (280 мс), лёгкий squash, звук `greet`;
- 0.45–1.55 с: **машет правой рукой**:
- рука поднимается к уровню глаз за 180 мс;
- потом осциллирует с частотой 13 рад/с (x ±0.06, y ±0.14 высоты тела, поворот ±0.35);
- тело покачивается `tilt = −0.06 + sin(2π·1.2t)·0.07`;
- 0.55 с и 1.50 с: моргания;
- 1.55 с: руки прячутся (200 мс);
- 1.75 с: короткие `happy`-глаза.
- Если пользователь кликнул во время приветствия, руки прячутся за 150 мс.
**Задача:**
- дизайн рук (сейчас это просто эллипсы цвета тела, торчащие снизу по бокам);
- раскадровка приветствия с бровью («поиграть бровями» вместо или вместе с маханием?).
### 13.3 Прятки в чёлке
- **hidden:** персонаж 6 pt, почти невидим.
- **compact:** при наведении на чёлку выглядывает (24–30 pt).
- **expanded:** чёлка раскрывается, персонаж 44–66 pt слева.
**Задача:** как он «выглядывает» из чёлки. Может, сначала из-под края показывается только бровь?
---
## 14. Наряды (гардероб)
Правый клик → гардероб. Наряды:
- `partyHat`, `beanie`, `crown`, `sunglasses`, `roundGlasses`, `bow`, `scarf`, `witchHat`, `pumpkin` (перекрашивает тело в оранжевый), `santaHat`, `bunnyEars`;
- `auto` — по сезону: 31.12–2.01 праздничный колпак, 1–26.12 колпак Санты, октябрь ведьмина шляпа, Пасха уши кролика, 21.06–31.08 очки.
Анимация: старый наряд исчезает за 180 мс → новый появляется за 350 мс с перелётом → squash. Шапки и помпоны болтаются по `physDx/physDy`.
**Задача:**
- адаптируй каждый наряд под новую форму головы и бровь (очки поверх брови? шапка на брови?);
- предложи 3–5 своих кринжовых нарядов (бигуди, золотая цепь «бро», накладные усы, ободок с глазами и т. п.).
---
## 15. Формат раскадровок
Для каждой анимации — таблица ключей:
```
Анимация: approval-вход
Длительность: 450 мс, однократно
Звук: approval (в 0 мс)
| t, мс | параметр | значение | кривая | комментарий |
|-------|---------------|----------|--------|------------------------------|
| 0 | oy | 0 | | старт |
| 150 | oy | -0.2 | out | подпрыгнул |
| 450 | oy | 0 | back | приземлился с перелётом |
| 0 | browAngle | 0 | | |
| 120 | browAngle | 0.8 | out | бровь резко вниз — «ну?!» |
| 0..∞ | mouthOpen | 0.3+0.1·sin(12t) | — | орёт, пока ждёт |
Ключевые позы: [картинка 1: t=0] [картинка 2: t=150] [картинка 3: t=450]
```
- Новые параметры (бровь, рот, слюна и т. д.) — с диапазоном и описанием «что значит 0, что значит 1».
- Для постоянных поведений — формула от времени `t` (как в разделе 8).
- Позы — картинками.
---
## 16. Звуки (для синхронизации)
Звуки уже есть (28 штук), раскадровки к ним привязывай по моменту:
`annoyed, approval, approve, attach, blip, close, dizzy, error, finish, greet, greeting, gulp, hover, love, open, peek, pop, proud, question, rate, search, send, slap, sleep, think, tick, wink, work, yawn`
Если для новых эмоций нужны новые звуки — опиши их словами: длительность, характер. Например: «отрыжка 0.4 с, низкая».
---
## 17. Чек-лист приёмки
- [ ] Узнаваем силуэтом при 24 pt на чёрном.
- [ ] Бровь — главный выразительный элемент, читается при 30 pt.
- [ ] Все 11 состояний различимы с первого взгляда.
- [ ] Все 13 форм глаз нарисованы.
- [ ] Работает в однотонной заливке любого цвета (мини-боты).
- [ ] Лицо корректно «едет по шару» при yaw ±0.65 и pitch ±0.5.
- [ ] Есть вариант-коробка (morph = 1) с прорезью-ртом.
- [ ] Руки, частицы, значки, наряды — в одном стиле.
- [ ] Только векторные примитивы и градиенты, без растра.
- [ ] Не похож на Mochi из Coucou.
- [ ] Иконка 1024 и иконка меню-бара.