From 750e5ad0adceb563b0a8859352aec69ed90c759b Mon Sep 17 00:00:00 2001 From: maksarsanjeev Date: Tue, 6 Oct 2026 20:01:48 +0300 Subject: [PATCH] Character brief for the BroV redesign (tehzadanie.md) Co-Authored-By: Claude Opus 5.5 --- tehzadanie.md | 416 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 416 insertions(+) create mode 100644 tehzadanie.md diff --git a/tehzadanie.md b/tehzadanie.md new file mode 100644 index 0000000..7b63516 --- /dev/null +++ b/tehzadanie.md @@ -0,0 +1,416 @@ +# ТЗ: персонаж для 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 и иконка меню-бара.