Статья — пишем последней
Эмоциональная статья-история о проекте синтезирует весь разбор, когда остальные табы будут проработаны. Статья не предваряет анализ, а рождается из него.
Внутренний рабочий дашборд. Введи пароль.
Эмоциональная статья-история о проекте синтезирует весь разбор, когда остальные табы будут проработаны. Статья не предваряет анализ, а рождается из него.
Механике тамагочи 29 лет, и она пережила всё — брелок 1996-го, бум Neopets, эру говорящих котов и крипто-истерику 2024-го. За это время жанр похоронил сотни клонов и вырастил нескольких тихих чемпионов, которые зарабатывают десятки миллионов без единого рубля рекламы. Значит, вопрос не в том, работает ли идея «ухаживать за существом» — она доказанно работает четверть века. Вопрос острее и полезнее для нас: почему одни питомцы живут десятилетиями, а другие умирают за три месяца — и что из этого следует для того, которого делаем мы.
Чтобы понять, что делает питомца живым, надо вернуться к первому и самому честному решению жанра: существо может умереть.
В 1996-м Bandai выпустили брелок с пиксельным существом, и внутри него пряталась идея, которая держит жанр до сих пор: ставка. Не покормил — питомец голодает. Не убрал за ним — болеет. Забыл на сутки — умирает навсегда. Это звучит жестоко, но именно риск потери рождал подлинную заботу: ребёнок носил брелок в школу, просил учителя разрешить «покормить», плакал над умершим питомцем. 82 миллиона проданных устройств — это не про графику (её там не было), это про эмоциональную ставку, которую не повторил почти никто после.
Дальше жанр двадцать лет сглаживал эту жестокость — и одновременно терял её силу. Neopets и Nintendogs перенесли питомца в веб и на консоль, добавили мир, коллекцию и кастомизацию, но смягчили смертность. Мобильная эра (Pou, Talking Tom, My Tamagotchi Forever) сделала питомца массовым и добавила мини-игры и магазины — но вместе с ними пришла и первая расплата: агрессивная реклама и микротранзакции, нацеленные на детей, за которые эти продукты клянут до сих пор. А в 2020-х жанр повзрослел окончательно: Neko Atsume, Finch и Egg Inc доказали, что можно держать людей годами вообще без наказания — на любопытстве, коллекции и тёплом ритуале.
Брелок с пиксельным существом. Двигатель — смертность: ставка рождает заботу. 82+ млн устройств, мировой феномен. Урок, который потом забыли: привязанность держится на риске что-то потерять.
Питомцы уходят в веб и на консоли. Забота + коллекция + мир вокруг. Смертность смягчается — на первый план выходит привязанность и обустройство, но острота ставки падает.
Эра мобильных: питомец + мини-игры + магазин. Массовость — ценой репутации: реклама и микротранзакции на детях, штрафы, критика Common Sense Media.
Жанр взрослеет: ноль наказания, награда за возвращение, «прощающий» дизайн. Finch — $30 млн в год без инвесторов. Доказано: питомец как ритуал кормит бизнес.
Оригинал держался на том, что можно потерять. Наследники научились удерживать без жестокости — но те, кто выкинул ставку целиком, выкинули вместе с ней и привязанность.
Сегодня «виртуальный питомец» живёт в двух параллельных вселенных. В одной — тихие долгожители, которые зарабатывают годами. В другой — братская могила крипто-тапалок. И обе вселенные учат нас одному и тому же.
В мире мобильных долгожителей побеждают те, кто дал игроку смысл возвращаться не ради награды, а ради самого питомца. Finch растёт, пока ты живёшь свою жизнь, и мягко зовёт обратно через виджет, а не пушами-напоминаниями. Neko Atsume вообще не требует ничего — коты приходят сами, ты лишь ставишь плошки и ловишь азарт «кто заглянул во двор». Egg Inc держит месяцами за счёт компаундного сброса, когда всё «как новое». Объединяет их не жанр, а устройство удержания: мягкость, коллекция и награда за возврат.
В мире Telegram всё наоборот. Tap-to-earn-волна 2024-го собрала сотни миллионов игроков за недели — и схлопнулась почти целиком. Потому что ценность там была не в питомце, а в обещании будущего токена. Когда обещание наступало (или разочаровывало) — возвращаться становилось незачем. Выжили единицы, и ровно те, кто успел отрастить жизнь после токена.
Питомец растёт, когда ты живёшь свою жизнь. Виджет + мягкий возврат, без насилия пушами. Забота о себе через заботу о нём.
Коты приходят сами — ты ставишь еду и любуешься. Ноль наказания, азарт открытия «кто пришёл». Коллекция как двигатель.
Компаундный сброс (prestige): всё «как новое», плато ломается. Долгий смысл на месяцы.
Кастомизация + мини-игры + эволюция/возраст. Самовыражение держит, но тянет репутационный шлейф рекламы на детях.
300+ млн → 41 млн → ~12 млн к июлю 2025. Вся ценность — в одном будущем токене. Символ обвала всей ниши.
Оригинал тапалки. Выжил, но перестал быть игрой — стал инфраструктурой экосистемы TON.
Спасся не «котом», а контент-хабом из 50+ мини-игр + реальной монетизацией (покупки + реклама), а не ставкой на токен. $34M выручки.
Робо-питомец с PvP и прямой тамагочи на TON. Спрос на питомца есть — но завёрнут в токен и бои, а не в привязанность.
Это не «мобильные хорошие, а Telegram плохой». Это один закон в двух декорациях: живёт тот продукт, у которого есть смысл возвращаться ПОСЛЕ любой выплаты — а умирает тот, у кого вся ценность сложена в один будущий момент. Telegram просто довёл этот закон до карикатурной наглядности, потому что токен — самая чистая форма «отложенной ценности вместо привязанности».
Hamster Kombat стоит разобрать поштучно — это не просто «не повезло», а четыре системные ошибки, каждую из которых мы обязаны обойти по имени.
Игрок тапал месяцами ради будущего аирдропа. Пока его нет — ты работаешь «в долг». Как только он случился — причин открывать приложение не осталось. Ноль привязанности к самому существу.
После главного события не оставалось свежего геймплея — нечем было зацепить. Сравни с Catizen, который заранее отрастил хаб из 50+ мини-игр и потому пережил обвал токена.
Задержки, техсбои, мизерные выплаты «на доллар-два», плюс анти-чит забанил ~2,3 млн аккаунтов с конфискацией. Доверие — ресурс невозобновляемый: сгорело разом.
Ставка на инфлюенсеров и реферальные деревья, а не на то, ради чего возвращаться. Вирусность без удержания = ведро без дна: налили сотни миллионов — вытекли за квартал.
Если перевернуть кладбище и посмотреть на долгожителей, у всех до единого повторяются три одни и те же вещи. Это не советы — это условия, без которых питомец не живёт.
Возвращаешься ради самого существа и того, что с ним происходит, а не ради награды «снаружи». Finch, Neko — ценность внутри отношений, а не в токене или призе.
Поверх «покорми» — коллекция, открытие, обустройство, долгий прогресс. То, ради чего открываешь на третьей неделе, а не только в первый день.
Питомец не умирает от одного пропуска и не пилит тебя виной. Вернулся — тебя ждёт приятное, а не выговор. Забота, а не долг.
Оригинальный тамагочи нарушил бы закон 3 (смерть за пропуск), Hamster нарушил закон 1 и 2 (токен вместо питомца, пустота после). Наш питомец должен выполнить все три одновременно — и в этом ещё никто в Telegram не преуспел.
Сложив историю и реальность, мы упираемся в дыру, и она не случайна.
Почти все питомцы в Telegram завязаны на крипто-ожидание — потому что экосистема так устроена: токен давал мгновенный взрывной рост, и все бежали за ним. Ниша «питомец ради самого питомца», на эмоции и привязанности, как Finch и Neko, в Telegram практически пуста — туда просто никто не шёл, там «медленные» деньги.
Вторая, ещё более узкая пустота — зрелищность. Живые хиты Telegram (Notcoin, Hamster, TapSwap) осознанно остались на 2D-спрайтах ради охвата слабых устройств под крипто-аудиторию. Эмоциональный 3D-персонаж с настоящей мимикой не делает никто. А именно мимика — это то, за что привязываются. Получается редкое сочетание: проверенная механика (тамагочи 29 лет), бесфрикционная дистрибуция (Telegram), и при этом незанятое пересечение «эмоция + 3D + привязанность».
Окно открыто — но не навсегда. Tap-to-earn схлопнулся, аудитория устала от «play-to-earn», и рынок начинает искать продукты, которые держат не обещанием денег, а чувством. Мы заходим ровно в этот разворот.
Тамагочи, которого не бросают, потому что за него переживают — а не фармят.
Вывод первого таба — в одной связке:
История показывает двигатель: привязанность рождается из ставки и из отношений с существом, а не из внешней награды. Реальность показывает пустую нишу: в Telegram побеждает эмоция, но туда все ходили за токеном. Три закона задают проверку, которую наш питомец обязан пройти целиком. Всё, что мы проектируем дальше — сам питомец, его комната, взаимодействие, экономика — должно служить одной-единственной цели: сделать существо, за которое переживаешь. Если это получится — остальное приложится; если нет — не спасёт ни один красивый домик.
Telegram Mini Apps — это не просто вебвью, в котором крутится наша игра. Это платформа с конкретным набором возможностей, и она не нейтральна: одни её способности прямо включают нашу концепцию, другие — жёстко её ограничивают. Весь фокус этого таба — отделить то, что для нас стратегически важно, от общего списка API. Потому что именно три возможности SDK превращают «игру в вебвью» в питомца, который живёт в твоём Telegram — а пара ограничений диктует, как вообще устроена его «жизнь».
Главный технический вопрос концепции закрыт положительно — с одной важной оговоркой про то, КАК достигать «вау».
Mini App — это полноценный вебвью (WKWebView на iOS, WebView/Chrome на Android), внутри которого доступен WebGL 1.0/2.0. Three.js, Babylon, PlayCanvas, даже Unity WebGL — всё запускается. Доказательство промышленного масштаба: Catizen (30+ млн игроков) крутит 2D/3D-сцены на движке Cocos. То есть живой 3D-питомец в Telegram — не фантазия, а проверенная практика.
Оговорка — в производительности. Вебвью медленнее нативного рендера, а сам Telegram ест ресурсы поверх нашей сцены: двойной оверхед. Показательно, что топовые хиты (Notcoin, Hamster, TapSwap) намеренно остались на лёгких 2D-спрайтах ради охвата слабых устройств. Отсюда наш рецепт, совпадающий с уже принятым решением по движку: зрелищность — через арт-дирекшн, свет и анимацию, а не через полигоны и фотореализм. Стилизованный low-poly/toon, сжатые текстуры (KTX2/Basis), ленивая догрузка, critical-бандл в пределах пары мегабайт — чтобы холодный старт укладывался в 1–3 секунды. Человек открывает нас в лифте; если он 15 секунд смотрит на прогресс-бар — он уже не вернётся.
Это ровно то, почему мы выбрали web-native (R3F/Three.js), а не Unity: в вебвью потолок «вау» задаёт платформа, а не движок, — поэтому лёгкий старт и полный контроль над каждым килобайтом важнее мощного, но тяжёлого рантайма.
Телесность и «физическое» ощущение питомца достижимы родными средствами Telegram, а не хрупкими браузерными хаками.
В Bot API 8.0 Telegram добавил нативные объекты Accelerometer, Gyroscope и DeviceOrientation — с управляемой частотой опроса и единым поведением на iOS и Android (в отличие от сырого браузерного DeviceOrientationEvent, который в вебвью капризен и требует отдельных разрешений). Для питомца это значит: наклонил телефон — он скатывается, тянется взглядом, просыпается от встряхивания; параллакс даёт глубину сцене. Хаптика (Bot API 6.1) добавляет тактильный слой — мягкая серия вибраций под мурлыканье, «успех» на радости, «предупреждение» на недовольстве. Плюс полноэкранный режим, блокировка ориентации и нативные кнопки под сцену. Всё, что нужно, чтобы питомец ощущался живым и материальным, — в наличии.
Здесь спрятана ключевая архитектурная правда, на которой стоит вся наша бардак-механика.
Прямой ответ неожиданный: Mini App не выполняется в фоне. Закрыл или свернул — JavaScript останавливается. Нет фоновых таймеров, нет симуляции «внутри клиента», пока приложение закрыто. Это звучит как проблема для идеи «он живёт сам по себе» — но на деле решается стандартным паттерном idle-игр и решает её полностью.
Состояние питомца живёт на нашем сервере: голод, настроение и, главное, timestamp последнего визита. При открытии приложение считает Δt = сейчас − последний визит и server-side генерит «что произошло за отсутствие»: проголодался, заскучал, набедокурил. Именно так технически реализуется «открываешь — а там бардак»: не фоновая жизнь, а пересчёт при входе. Для хранения есть CloudStorage (до 1024 ключей × 4 КБ), DeviceStorage/SecureStorage (Bot API 9.0) — но полноценное состояние держим на своём бэкенде. А зовёт обратно — бот (см. ниже), а не фоновый процесс.
Вот здесь SDK перестаёт быть сантехникой и становится отстройкой. Эти три возможности — разница между «игрой, которую открываешь» и «сожителем, который присутствует в твоём мессенджере постоянно».
С Bot API 8.0 мини-апп может (с разрешения пользователя) ставить кастомный эмодзи-статус — тот, что видят все твои контакты рядом с именем. Идея твиста: настроение питомца становится твоим статусом в Telegram. Поспал — 😴, соскучился — 🥺, обиделся за двухдневное отсутствие — и это видят все, накормил и поиграл — 😻. Питомец выходит за пределы игры в твою цифровую личность. Ни одна другая поверхность не даёт такого присутствия — и никто в нише этого не делает.
Бот может сгенерить пользователю стикерпак с эмоциями его питомца (createNewStickerSet). Ты пишешь друзьям стикерами со своим Барсиком — он живёт во всех твоих чатах. Польза + присутствие + виральность. Ограничение: обычные стикеры, не кастом-эмодзи.
Бот шлёт «я кое-что натворил, посмотри» с кнопкой прямо в нужный экран. А shareToStory даёт виральный виток: «смотри, что он устроил» → в Stories со ссылкой на игру. Возврат на любопытстве, шеринг на эмоции.
addToHomeScreen (8.0): «посели питомца на главный экран» — иконка-мордочка как у обычного приложения. Ощущение постоянного присутствия рядом, ещё один крючок привязанности.
Сводка того, что есть, с какой версии — и как это применяет питомец.
| Возможность | Статус | Что делает питомец |
|---|---|---|
| WebGL / 3D | есть | Живая стилизованная 3D-сцена с питомцем (Three.js/R3F) |
| Гироскоп / акселерометр | 8.0 | Наклон → реакция, параллакс, «встряхни, чтобы разбудить» |
| Хаптика | 6.1 | Мурлыканье, радость, недовольство на ощупь |
| Эмодзи-статус | 8.0 | ⭐ Настроение питомца в профиле, видят контакты |
| Стикерпак | Bot API | Личные стикеры с эмоциями питомца во всех чатах |
| Пуши бота | есть | Деликатный возврат: «я кое-что натворил» |
| Stories / шеринг | 8.0 | shareToStory — виральный виток «смотри, что он устроил» |
| Home screen | 8.0 | Иконка-мордочка на главном экране телефона |
| Хранение (Cloud/Device) | 6.9 / 9.0 | Кэш сейвов; полное состояние — на своём бэкенде |
| Полноэкранный режим | 8.0 | Погружение в сцену без интерфейса чата |
| Фоновое исполнение | нельзя | «Жизнь пока не было» = пересчёт на сервере + пуш |
| Камера / микрофон | ненадёжно | Только сырой getUserMedia, на ядро не закладываем |
| Кастом-эмодзи паки | нельзя | Через Bot API не создать — только обычные стикеры |
Честные ограничения платформы. Не баги, а рамки, которые надо уважать в дизайне с первого дня.
Обходим серверным пересчётом по timestamp + пушами. Это даже лучше: бэкенд — надёжный «мозг» питомца, не зависящий от того, открыт ли клиент.
Лимит деликатности: 1–2 мягких напоминания в день, с реальной пользой, легко отключаемые. Возврат на любопытстве, а не на «claim your reward».
Экономику строим на десктоп/Fragment-покупках (комиссия 3–4%) + рекламе, а не на мобильных Stars в лоб. Деталь для таба монетизации.
Твист-поверхности включаются по желанию пользователя — это и юридически правильно, и снимает «тёмную сторону» (не всем нужен грустный питомец в статусе при коллегах).
Вывод второго таба:
Платформа зелёная по всем трём китам концепции. Зрелищный стилизованный 3D-питомец с мимикой, гироскопом и хаптикой — технически реалистичен. Твист «сожитель» — не мечта, а конкретные API: эмодзи-статус, стикерпак, пуши-возврат, появившиеся как раз в Bot API 8.0. «Жизнь, пока тебя не было» — стандартный серверный пересчёт, а не магия. Единственное, что платформа диктует жёстко: лёгкий старт, уважительные пуши и серверный мозг питомца. Это не препятствия, а рамки, внутри которых наша идея не просто помещается — она будто специально под Telegram 2024–2026 и задумана.
Питомец — длинный шест всего проекта. Если существо заставляет улыбнуться с первой секунды — концепт доказан, а мир, экономика и друзья лишь надстраиваются сверху. Если нет — не спасёт ни один красивый домик. Поэтому этот таб — самый глубокий, и он устроен в две части: сначала из чего вообще состоит питомец (всё поле возможностей), затем как выбрать первого героя не вслепую — по критериям от человечески-эмоциональных до технически-реализуемых.
Герой первого релиза — пушистый длинношёрстный КОТ. Лук: настоящий параметрический shell-мех (тюним ползунками density / length / quality под 60 fps на реальном телефоне), утрированные пропорции по детской схеме, мех короче вокруг глаз и морды ради читаемой мимики. Faux-fur (Fresnel-ободок) — страховка, если бенчмарк на целевых телефонах не сядет. Ниже — полная анатомия и матрица, на которых это решение стоит.
Восемь осей, по которым проектируется питомец. Каждая — отдельный слой «жизни»; вместе они и создают то, за что привязываются.
База «милоты» — детская схема (Лоренц): крупная голова, большие глаза ниже средней линии, округлость, короткие лапки. Язык форм: круг = тепло и безопасность, квадрат = надёжность, острые углы = угроза. Тест: узнаётся ли существо чёрным силуэтом.
Наш главный UI — вместо полосок морда. Носители без слов: глаза (размер зрачка, взгляд, блик), брови (угол = радость/грусть/гнев), наклон головы. Ключ: упрощение усиливает эмоцию — мультяшное лицо считывается точнее реалистичного.
У питомца должен быть нрав ещё до ИИ: ленивый, хулиган, застенчивый, гурман. Характер проявляется в реакциях и выходках. На платном уровне — генеративная личность на LLM: реплики и поведение рождаются, а не выбираются из списка.
Idle-жизнь (сам что-то делает) + реакции на тебя + репертуар выходок — ядро бардак-механики. Разбросал, спрятал, заболел, набедокурил. Это генератор свежих микро-сцен, который и держит «что он учудил на этот раз».
Где живёт «вау»: squash & stretch, вес, пружинистость, сочность. Живой слоистый idle (дыхание, моргание, фиджеты) важнее числа клипов — именно вариативность покоя проходит «порог живого».
Не слова, а звуки — мурлыканье, писк, бурчание + хаптика (тактильное мурлыканье через вибро). Звук и вибрация добавляют телесности без единой реплики и без языкового барьера.
Изменение во времени: стадии, возраст, эволюция. Настоящий ров — накопленная история: питомец помнит, растёт вместе с тобой, копит ваше общее прошлое. Чем дольше вы вместе, тем дороже бросить.
Как взаимодействует с комнатой, предметами и питомцами друзей. Каждый предмет меняет поведение (живой террариум), а дружба двух существ рождает сцены, которых нет у одного. Детали — в табах 4 и дружбы.
Детская схема (Kindchenschema) — большие глаза и округлость врождённо активируют систему вознаграждения мозга и инстинкт заботы (подтверждено PNAS на томографии). И работает межвидово — значит можно лепить хоть «инопланетянина», лишь бы черты были на месте. Усиление через упрощение (McCloud) — чем проще лицо, тем точнее читается эмоция (до ~60%) и тем легче спроецировать себя. Оба факта говорят одно: простое округлое существо с выразительной стилизацией бьёт фотореализм по привязанности.
Без выбора героя крафт не стартует, а ошибка здесь дороже всех. Поэтому выбираем по матрице критериев от эмоций к технике, а не по вкусу.
Критерии разложены по трём ярусам — именно так, как ты просил, от человечески-эмоциональных до технически-реализуемых:
Мгновенная любовь (детская схема), узнаваемость без объяснений, мемность/виральность, ширина эмоц. диапазона морды, сигнал «я нуждаюсь в тебе».
Проецируемость (вкладываешь себя), уникальность и защищаемость образа (не «ещё один кот»), широта аудитории, потенциал коллекции и шеринга.
Простота рига, выразительность на полигон в low-poly, вес модели и старт в вебе, объём набора анимаций, безопасность от «зловещей долины».
Независимость, грация, король интернет-мемов. Встроенный язык тела (уши/хвост/мурлык).
Верность, безусловная любовь, «нужен тебе». Сильнейший сигнал привязанности.
Круг + лицо + 1–2 уникальных якоря. Не «ещё один кот», но и не «непонятное».
Тайна и крючок «что вылупится». Холодное, пока не оживёт.
Шкала 1–5 (5 — максимально выгодно для нашей задачи). Источник — принципы дизайна персонажей и кейсы, не вкус.
| Критерий | 🐱 Кот | 🐶 Собака | 🫧 Блоб | 🥚 Яйцо |
|---|---|---|---|---|
| Мгновенная любовь (детская схема) | 4 | 5 | 4 | 2 |
| Узнаваемость без объяснений | 5 | 5 | 3 | 2 |
| Мемность / виральность | 5 | 3 | 4 | 3 |
| Проецируемость («вкладываю себя») | 3 | 3 | 5 | 5 |
| Широта аудитории | 4 | 4 | 4 | 3 |
| Эмоц. диапазон без слов (уши/хвост) | 5 | 5 | 3 | 2 |
| Сигнал «я нуждаюсь в тебе» (ядро) | 3 | 5 | 4 | 5 |
| Уникальность / защита бренда | 2 | 2 | 5 | 4 |
| Безопасность от «зловещей долины» | 4 | 3 | 5 | 5 |
| Простота рига | 3 | 3 | 5 | 5 |
| Выразительность на полигон (low-poly) | 4 | 4 | 5 | 4 |
| Вес модели / старт в вебе | 4 | 4 | 5 | 5 |
| Простота набора анимаций | 3 | 3 | 4 | 4 |
Собака — чемпион мгновенной любви и сигнала «нужности» (это и есть ядро тамагочи), но слабее по мемности, уникальности и технике, плюс тянет ожидание реализма → затраты и риск долины.
Кот — чемпион мемности/виральности и богатства языка тела, широкая аудитория. Минусы: перенасыщенный рынок («ещё один кот») и слабый сигнал нужности (коты самодостаточны).
Своё существо-блоб на базе круга — единственный кандидат, который максимизирует сразу все три яруса: эмоции добирает через детскую схему и masking-эффект, технику выигрывает вчистую (простой риг, максимум эмоции на полигон, минимальный вес, безопасность от долины), и даёт защищаемый бренд. Его слабое место — узнаваемость «из коробки» — снимается проверенной стратегией: круг + лицо + 1–2 сильных якоря (уникальный цвет, деталь-хук), как сделаны Kirby, Pikachu, Slime, Fall Guys. Это «своё на базе знакомого» — не кот, но и не непонятное.
Яйцо/непонятное — проваливает мгновенную любовь, но это идеальная стадия 0: из яйца вылупляется твой блоб. Крючок «что вырастет» добавляется почти бесплатно и работает на прогрессию.
Первый герой — своё округлое существо по детской схеме: плоские 2D-глаза-текстурой + пара блендшейпов на рот, один мемный якорь. Эволюция из яйца — как стадия 0 сверху.
Если приоритетом станет мгновенная виральность — сильный альтернативный путь стилизованный кот; если максимальная привязанность и «нужность» — собака. Матрица не отменяет твой выбор, она делает его зрячим: теперь видно, чем именно ты платишь за каждый вариант.
Выбор сделан в пользу знакомого: фавориты — кот и пёс, в духе Pixar. Риск «ещё один кот/пёс» принимаем и отбиваем обаянием, характером и живостью. Но знакомое животное сразу поднимает вопрос производства — и на нём стоит остановиться отдельно.
«Pixar-дух» в вебвью раскладывается на три производственные оси — и они радикально разные по цене. Две почти бесплатны, одна — реальный потолок.
Выразительная морда — вопрос рига и арта, не производительности. Плоские 2D-глаза-текстурой + пара блендшейпов на пасть/брови дают огромный эмоциональный диапазон почти даром. Сюда идёт главная любовь — и вебвью тянет это легко.
«Милота Pixar» = утрированная детская схема: крупная голова, большие глаза, короткие лапки, мягкий силуэт. Стилизованное low-poly тело с такими пропорциями весит столько же, сколько реалистичное, — а обаяния даёт в разы больше. Стены нет, есть работа арт-директора.
Прядевый груминг, shell-слои, hair-cards — прозрачные слои, жрущие fillrate (overdraw) и draw-calls. Цена не в загрузке, а в рендере кадра. На десктопе летает; риск — на слабом мобильном GPU в вебвью. Для одного героя на современных телефонах — стретч-вариант под бенчмарк, не закрытая дверь.
Мех — не геометрией, а текстурой: painted-fur карта + пушистый контровой ободок (Fresnel rim-light) + пара геометрических «клочков» на ушах и хвосте для намёка. Читается пушистым, стоит копейки. Ближе к «настоящему» животному.
Намеренно без меха: винил-тойс, плюшевая игрушка, гладкая стилизация в духе Animal Crossing. Не компромисс, а сильный тренд и отдельное обаяние — плюшевого котика хочется тискать не меньше. Проблема шерсти снимается целиком.
Обаяние Pixar — это не разрешение шерсти, а пропорции, глаза, мимика, свет и анимация. Мех — последние 5% картинки, которые в вебвью не окупаются. Берём твоего кота или пса с утрированными пропорциями и очень живой мордой, а шерсть решаем путём А или Б — и получаем Pixar-заряд, который платформа переживёт.
Модели ниже крутятся прямо здесь — нажми ▶ и тащи мышью/пальцем. Внешние арты и живые демо — ссылками.
Тот же shell-мех, но уже на коте — крути вживую. Слева реалистичный (тяжёлый, 174k полигонов только на мех — это «планка цены»), справа стилизованный мультяшный (ближе к нашему луку). Наш кот будет между: стилизованный силуэт + параметрический мех, притюненный ползунками под телефон.
Максимальная детская схема: огромные низко посаженные глянцевые глаза с ярким бликом-искоркой (главный носитель эмоции и «живости»), крошечные нос и рот, розовые щёчки, мягкий круглый контур, ноль резких линий. Глаза — звёзды, мех — оправа: вокруг глаз и мордочки шерсть короткая и чистая, чтобы взгляд читался. Техника: большие глаза как 2D-текстура/шейдер с бликом + блендшейпы на моргание и эмоции — дёшево и максимально выразительно.
То, что вебвью тянет идеально. Смотри на формы, пропорции и мягкий матовый материал.
Мех не геометрией, а контровым ободком (Fresnel) + painted-normal + редкими клочками. Открой живое демо ободка — вот она «пушистость» без прядей.
Важно: на десктопе демо летает — мощный GPU ест мех не замечая, и загрузка тут ни при чём. Цена прячется в рендере каждого кадра: shell-слои перерисовывают меш 16–32 раза, и каждый пиксель под мехом закрашивается столько же раз (overdraw/fillrate). Это бьёт только по слабому мобильному GPU в вебвью Telegram — там, где мы живём, а не на компьютере. Плюс демо — один простой объект, а у нас персонаж + сцена. Вердикт не «никогда»: мех на одном герое, умеренные слои, современные телефоны — стретч-вариант под бенчмарк на реальном телефоне (этап прототипа), а не закрытая дверь.
База — гладкий плюш: MeshToonMaterial с gradientMap в 2–3 ступени (тёплая мягкая ступень = намёк на подповерхностное свечение), высокий roughness, ноль металла, никакой прозрачности. Опционально +пушистость: тёплый Fresnel-ободок по силуэту + painted-fur normal-map + 10–30 alpha-клочков на ушах и хвосте (через MeshSurfaceSampler + InstancedMesh, один draw-call). Почти бесплатно — холодный старт 1–3 сек жив.
Что копировать у эталонов (My Talking Tom — 500 млн+ загрузок; коты Animal Crossing): детская схема (крупная голова, большие низкие глаза, маленький нос), округлые силуэты без острых углов, мягкий 2–3-ступенчатый toon-свет, тёплый ободок. Pixar-заряд = пропорции + глаза + свет, а не шерсть.
Комната — это не фон, а движок поведения. Разница между мёртвой диорамой-одевалкой и живым террариумом в одном: каждый предмет должен менять то, что кот ДЕЛАЕТ. Купил мячик — гоняет и раскидывает; поставил коробку — прячется и выглядывает; лежанку — спит. Мир не украшается, а оживает с каждым вложением. И, что важно для нас, есть проверенный геймдизайн-паттерн, который делает это дёшево и бесконечно расширяемо.
Ключевая находка ресёрча. Именно этот паттерн из The Sims, а не ручное программирование реакций кота, даёт экспоненциальную живость на минимум кода.
Гениальность в инверсии: логика живёт не в коте, а в предметах. В The Sims каждый объект «рекламирует» (advertisements), какие потребности он закрывает и на сколько очков: кровать вещает «поспи на мне → +энергия», холодильник — «поешь → +голод». Персонаж просто собирает все «рекламы» вокруг и выбирает — но не тупо максимум, а случайно из топ-2–3, отчего и рождается непредсказуемость и «характер».
Перенос на кота почти дословный. Каждый предмет комнаты публикует, что он предлагает:
Каждые несколько секунд кот прогоняет простой цикл:
Смотрит все предметы в комнате и их предложения.
×множитель текущей потребности (сонный → лежанка взлетает; скучающий → мячик) + новизна + близость.
Случайно из топ-2–3 вариантов — отсюда «характер» и непредсказуемость.
Привязанная анимация. Действие меняет состояние предмета → новая реклама → новая сцена.
Новая выходка = новый ассет + одна строчка «рекламы», ядро кота не трогается. Непредсказуемость даётся бесплатно, а поведение само подстраивается под то, что игрок купил и поставил — это и есть ощущение живого террариума. И это же напрямую кормит бардак-механику: поиграл → мячик раскидан → новое состояние → новое поведение → «что он тут устроил».
Принцип Neko Atsume — «предмет = свой персонаж поведения». Не число предметов создаёт живость, а то, что каждый запускает КАЧЕСТВЕННО разную выходку. Шесть штук покрывают все потребности и легко влезают в мобильный бюджет.
| Предмет | Поведение / выходка | Тип |
|---|---|---|
| 🍲 Миска (еда+вода) | Приходит, ест; отказывается когда сыт или однообразно. База заботы. | баллы |
| 🧶 Мячик | Играет, гоняет и раскидывает → порождает уборку и следующую выходку. Главный генератор живости. | баллы |
| 📦 Картонная коробка | Залезает, прячется, выглядывает. Максимально «котно», дёшево, мемно-шерабельно. | баллы |
| 🛏️ Лежанка / подушка | Спит, сворачивается, «намял место». Спокойные тёплые кадры, восстановление энергии. | баллы |
| 🪵 Когтеточка | Точит когти характерным циклом; без неё — дерёт мебель (поведение-стейк). | поведение |
| 🪟 Окно с видом | Смотрит наружу, реагирует на реальные утро/ночь/дождь. Cozy-якорь + кусочек «сожителя». | Telegram-контекст |
Каждый запускает своё: ест / играет-раскидывает / прячется / спит / точит / наблюдает — все базовые потребности закрыты, и каждый предмет узнаваемо кошачий. Окно — отдельно вкусное: кот реагирует на реальное время суток и погоду (через геолокацию), и это уже первый шаг к «питомцу, который живёт в твоём Telegram».
Шесть предметов выше — это игрушки и нужды кота. Но кот живёт не на голом полу: нужна настоящая комната — диван, полки, картины, ковёр, растение, тёплая лампа. И ключевое: эта обстановка не просто декорация — бОльшая часть её сама работает умными объектами и сценой для бардака.
Запрыгивает, спит на спинке, точит подлокотник, прячется под ним.
Залезает наверх и скидывает предметы вниз — классика кошачьего хаоса, мемно и шерабельно.
Запрыгивает, роняет чашку, разваливается сверху.
Заденет — висит набок, пока не поправишь. Мелкая, но живая выходка.
Живая деталь + тёплый свет уюта. Растение кот может погрызть/повалить.
Тепло, обжитость, мягкость. Шторами кот играет/запутывается.
Характер комнаты. Их смена — кастомизация и бренд «мой уют».
Сменил стиль всей комнаты → своё пространство → повод показать друзьям.
1. Бардак получает сцену. Не «раскидал мячик», а живёт по всей комнате: скинул книги с полки, сбил картину набок, уронил чашку, запутался в шторах, повалил растение. Каждая единица мебели через умные объекты добавляет свой набор выходок. 2. Комната = самовыражение = виральность. Смена дивана, картин, темы — это кастомизация за Stars И та самая сцена, куда придут коты друзей: «смотри, какой у меня уют».
Бюджет держим так: декор (картины, ковёр, растение, шторы) — дешёвая статика, создаёт уют почти даром; интерактивной мебели для первого релиза берём 2–3 ключевые (диван, стеллаж, столик) — они и умные объекты, и сцена бардака. Так комната ощущается настоящей и обжитой, но ассеты не взрываются.
Вот направление обстановки — стилизованные уютные комнаты в low-poly, тёплый свет, диван/полки/декор. Нажми ▶ и покрути. Наша будет камернее (одна комната под кота), но язык — вот такой.
Наш формат — уютная диорама: объёмный обжитой мирок, в который заглядываешь сверху-сбоку, как в кукольный домик или витрину-террариум. Идеальная форма для нас: «живой террариум», сделанный буквально + камерный кадр (легко для вебвью) + «tiny cozy world» врождённо милый и шеро-достойный.
Важно про размер: диорама — это про подачу (открытый передок, тёплый свет, весь мирок в кадре), а НЕ про буквальную миниатюрность. Берём не спичечный коробок, а просторную обжитую комнату — где коту есть где разгуляться и бедокурить (диван, полки, окно на расстоянии). Обаяние «маленького мирка» рождается стилем и светом, а не тем, что всё мелкое.
Камера подвижная, а не застывший кадр: по умолчанию видишь всю комнату; можешь орбитить/панить/зумить (+ гироскоп — наклон поворачивает и параллаксит, заглянуть за угол); зум к коту — крупный план морды с глянцевыми глазами, и он же лечит читаемость мимики, когда кот далеко. Рекомендация подачи — открытый передок (пара стен срезана), как у кукольного домика.
Уют — не случайность, а три столпа (рамка Lost Garden / Project Horseshoe). Все три ложатся на нашу сцену.
Ни угроз, ни принуждения, ни потерь. Всё добровольно и предсказуемо. Для кота: никакого фейла — только забота. Стейки есть, но обратимые (см. таб питомца).
Базовые нужды видимо закрыты — полная миска, тёплый свет, обжитость. Тогда игрок переходит к высшему: самовыражение и привязанность.
Медленный темп, камерный масштаб, мягкий свет. Низкое возбуждение при сохранении вовлечённости — за котом просто приятно смотреть.
Конкретные приёмы уюта для нашей одной сцены: тёплая палитра (жёлтые/оранжевые) и мягкий рассеянный свет вместо резких источников; натуральные материалы — дерево, живое растение; камерный, чуть приподнятый ракурс на одну комнату. И классический приём — окно как контраст-убежище: дождь или вечер за окном при тёплой комнате внутри. Комната = укрытие от внешнего мира, и это ощущение само по себе греет.
Мы решили ещё в табе питомца: зрелищность живёт в свете, а не в полигонах. В диораме это буквально так — свет отличает «коробку с мебелью» от «уютного дома». Он делает четыре работы.
Тёплый, мягкий, мотивированный свет (от лампы, из окна), тёплая палитра, рассеянные тени. Именно это превращает набор мебели в обжитой дом.
Свет задаёт эмоцию всей сцены: золотой вечер — тепло и покой, синяя ночь с пятном лампы — уют перед сном. Одна и та же комната звучит по-разному.
Свет комнаты меняется с реальным временем и погодой: мягкое утро, золотой вечер, сумерки, пасмурный дождь с тёплой лампой. Комната дышит вместе с твоим настоящим днём — сильнейший штрих «жизни в твоём Telegram».
Контровой свет отделяет пушистого кота от фона и подсвечивает мех по краю (тот самый Fresnel-пушок), а блик в глазах (catch-light) — та самая искра «живости».
Технически — дёшево и роскошно: запечённые лайтмапы для статичной комнаты (мягкие тени и рассеянный свет «впечены» в текстуры, ноль стоимости в рантайме — стандарт красивых веб-диорам) + пара живых источников (лампа, свет из окна) + мягкий ключ на коте. Смена времени суток — блендим лайтмапы и тонируем общий свет, двигаем и красим главный источник. Блик в глазах — крошечная деталь ценой в пиксель, а работает как «оживление».
Одна из сильнейших фишек всего продукта. Не игровое время, а твоё реальное локальное — комната и кот проживают тот же день, что и ты. Четыре нити синхронизируются с часами и погодой за окном.
| Фаза дня | 🌅 Свет | 🪟 Окно | 🐱 Кот |
|---|---|---|---|
| Утро | мягкий тёплый, низкое солнце | рассвет, розовое небо | потягивается, зевает, ждёт завтрак |
| День | яркий, ясный | солнце / реальная погода | активен, играет, бедокурит |
| Вечер | золотой, тёплый | закат | спокоен, ластится |
| Ночь | синий сумрак + пятно лампы | звёзды, тьма | спит калачиком у лампы |
Плюс погода через геолокацию: пошёл дождь по-настоящему — идёт и за окном, кот сидит и смотрит на струи. И ритуалы возврата: утренний пуш «доброе утро, кот проснулся», вечерний — «сворачивается спать». Часы кормёжки — ждёт у миски.
Магия в том, что это твой день. Заглянул в обед — там день и кот играет; поздно ночью — кот спит калачиком при свете лампы, тихо. Весь мирок дышит в такт твоей жизни — не игрушка, которую открываешь, а сожитель, живущий в твоём времени.
Технически дёшево: сервер знает реальное время и погоду (геолокация из таба SDK), делит сутки на 4 фазы → под каждую своё состояние света (блендим лайтмапы + тонируем) + веса поведения кота + слой окна. Никакой магии, чистая логика на бэкенде — том самом «мозге питомца», что считает жизнь между визитами.
Модель, проверенная в Neko Atsume и Pocket Love: двухвалютность — заработанные баллы (кот «дарит» их за заботу) на базовые предметы, Stars на премиум. Много бесплатных путей получить предмет (ежедневные подарки, опциональная реклама «для нетерпеливых») — без давления.
Главное правило, и оно же защита от провала (урок Dreamlight Valley, которую обвинили в «cash grab»): ядро живости — всегда за бесплатные предметы. Кот играет, спит, ест — за баллы. За деньги только украшение и ускорение: косметика, редкая мебель, сезонный декор. Косметика не влияет на баланс — она продаёт идентичность и самовыражение, а сезонные предметы продаются заметно лучше обычных.
И тут замыкается наш прежний узел: обустроенная комната — это та самая сцена, куда придут коты друзей. Декор = самовыражение = «смотри, какой у меня уют» = повод показать = виральность. Экономика, долгая цель и социальность сходятся в одной точке — в комнате.
Клик по предметам в R3F — это raycasting (готовые onClick/onPointerOver на любом меше, свой слушатель писать не надо); дорого на каждый кадр — значит кастим по клику/таймеру, для десятка пропов это вообще не узкое место. Состояния предметов (полный/пустой, целый/раскиданный) держим как данные в стейте — меняем материал/позицию/видимость под-меша, не пересоздавая геометрию. Это же состояние питает «рекламу» умных объектов.
Бюджет вебвью: главный враг — не полигоны, а draw-calls (каждый уникальный материал — отдельный вызов). Значит атлас текстур и общие материалы, минимум прозрачности. Ориентир — кот-«герой» ~5 000 треугольников, вся комната с ~6–12 пропами держится в несколько десятков тысяч при аккуратных материалах. Для первого релиза — фиксированные слоты под предметы (как 5 слотов двора в Neko Atsume), а не свободная расстановка: проще, надёжнее, быстрее в продакшене.
Одна уютная обжитая комната · 6 предметов-нужд + 2–3 интерактивные мебели (диван/стеллаж/столик) + дешёвый декор (картины/ковёр/растение) · движок «умных объектов» вместо ручных реакций · бардак живёт по всей комнате · тёплый свет + окно-убежище · живость за баллы, красота за Stars · фиксированные слоты.
Здесь всё сходится в конкретику. Цель — первый полноценный самодостаточный релиз: не демо и не задел, а завершённый опыт, который можно показать людям и который доказывает главную ставку — питомец живой, и в него влюбляешься. Ниже: что входит, что осознанно НЕ входит, в каком порядке лепим и когда считаем готовым.
Открываешь — и у тебя есть кот, которого хочется любить, в уютной живой комнате, проживающей твой день. Его можно покормить, поиграть, погладить, прибрать за ним бардак; он реагирует, бедокурит, меняется от утра к ночи. Этого достаточно, чтобы поймать «то самое» чувство и захотеть вернуться. Всё остальное (друзья, ИИ, коллекция) — надстройки фазы 2, без которых первый релиз уже живёт.
Главная защита от утопания — честная граница. Слева то, что делает первый релиз живым; справа то, что мы намеренно откладываем, чтобы не размазаться.
Пушистый, параметрический мех, морда по детской схеме с глянцевыми глазами. ~10–15 анимаций (слоистый idle + эмоции + реакции + выходки).
Одна просторная уютная комната, открытый передок, подвижная камера (орбита/зум/гироскоп). Запечённый свет.
6 предметов-нужд + 2–3 интерактивные мебели. Движок «рекламы» — кот сам выбирает поведение.
Свет + окно + поведение по 4 фазам суток, погода через геолокацию.
Покормить, поиграть, погладить (хаптика), прибрать бардак.
Пуш-возврат от бота обязательно; эмодзи-статус ИЛИ стикерпак — один twist-канал.
Состояние на сервере, пересчёт по timestamp, баллы за заботу на базовые предметы.
Большая соц-фича — отдельная фаза, когда ядро доказано.
Платный слой фазы 2. В v1 — рукотворная база поведения.
Одна комната заморожена. Расширение — потом.
Один кот. Зоопарк и эволюция — фаза 2.
Можно в v1.1. Сначала баллы и базовая петля.
Отдельный продукт на том же движке, сильно позже.
Строго по твоей логике: сперва персонаж, потом комната. Но с одним обязательным шагом в самом начале — бенчмарком меха, пока на него не завязано всё остальное.
Кот-болванка с параметрическим shell-мехом → гоняем на целевом среднем телефоне в Telegram. Ловим 60 fps и старт, фиксируем бюджет density/length/quality. Если не сядет — включаем faux-fur (Fresnel). Делаем ПЕРВЫМ, чтобы не переделывать.
Blender: модель (mesh) → риг (скелет + блендшейпы лица) → мех → материалы (toon + мех, короче у морды) → набор анимаций (слоистый idle, эмоции, реакции, выходки). Главная инвестиция проекта.
Blender: мебель + декор (2–3 интерактивные, остальное дешёвая статика) → запекание света на 4 фазы суток (лайтмапы) → камера (орбита/зум/гироскоп).
«Реклама» действий + состояния предметов + привязка анимаций кота к предметам. Тут оживает бардак-механика.
Фазы света/окна/поведения по реальному времени + погода + ритуалы-пуши.
Состояние на сервере, пересчёт по timestamp, бот-пуши, баллы. Деплой на инфраструктуру.
Хаптика, звук, блик в глазах, мягкие переходы. Первые 60 секунд онбординга — чтобы «то самое» ловилось сразу.
Вся ставка на «питомец живой». Снимаем: львиная доля сил — в морду, мимику и анимацию; проверка на живых людях РАНО (не в конце), до вылизывания остального.
Снимаем фазой 0: ранний бенчмарк + параметрические ползунки + faux-fur как страховка. Не закладываем мех в остальное, пока не подтверждён.
Снимаем: бюджет ассетов (кот ~5k тр, атлас текстур, минимум материалов), запечённый свет, ленивая догрузка, стилизация вместо тяжести.
Снимаем жёсткой границей слева/справа. Любая новая идея по умолчанию — фаза 2, пока первый релиз не живёт.
Релиз готов не когда «сделаны все фичи», а когда проходит эти проверки.
Кот живой, морда цепляет, хочется просто смотреть. Живые люди в тесте улыбаются и хотят вернуться.
Свет и поведение меняются от утра к ночи, кот реагирует на тебя и бедокурит, зашёл после паузы — что-то натворил.
Старт ≤3 сек, приемлемый fps на целевом телефоне, пуш от бота реально возвращает в апп.
Пушистый кот, которого хочется любить, живёт свой день в уютной диораме — реагирует, бедокурит, зовёт обратно. Этого достаточно, чтобы поймать чувство. Всё остальное — фаза 2.
Основано на решениях табов 1–4: ниша «питомец ради эмоции» (01), возможности и рамки Telegram (02), герой-кот с параметрическим мехом (03), живая диорама с умными объектами и живым днём (04). Детальный план работ — в соседнем подтабе «В чём и где».
Разбивка всего продакшна по дисциплинам: каждая задача — чем и где делаем и что на выходе. Несущий пайплайн: 3D-часть лепим в Blender → экспорт в glTF/GLB → оживляем в вебе на React Three Fiber → «мозг» на бэкенде. Стек намеренно совпадает с твоими проектами (React/Vite, Hono, grammY, PostgreSQL, VPS) — меньше нового, быстрее старт.
Ускоряемся ИИ-генерацией (Higgsfield прямо в Blender / Meshy) — с разделением. Предметы, мебель, декор и комната (жёсткая статика) — генерим и слегка чистим: огромная экономия и точное попадание в лук. Кот-герой — генерим БАЗУ/концепт для скорости и образа, но риг + блендшейпы + анимации остаются крафтом (он должен деформироваться и эмоционировать — на этом вся ставка). Мех — рантайм-шейдер поверх, не из генерации. Важно: сперва концепт-картинка (мудборд) фиксирует стиль, затем всё 3D под неё — иначе ассеты не склеятся. Higgsfield гонится прямо в Blender-сцену (интегрировано), Meshy — запасной источник.
| Задача | В чём (инструмент) | Выход |
|---|---|---|
| Модель, low-poly ~5k тр | Blender (моделинг) | .blend → GLB |
| UV-развёртка | Blender | UV-раскладка |
| Текстуры: toon base + painted-fur (normal/roughness) | Substance Painter или ручная роспись в Blender/Procreate | PNG-карты |
| Мех — параметрический shell | Blender (референс) + рантайм-шейдер в R3F (GLSL, по мотивам fur-threejs) | шейдер + ползунки |
| Риг: скелет + кости ушей/хвоста | Blender (Rigify / кастом) | арматура в GLB |
| Мимика — блендшейпы | Blender (shape keys) | морф-таргеты |
| Глаза: 2D + блик-искра | спрайты в Procreate/Figma + шейдер (UV-swap) в R3F | атлас глаз + шейдер |
| Анимации ~10–15 (idle-слои, эмоции, реакции, выходки) | Blender (кейфрейм) | клипы в GLB |
| Дыхание / моргание | процедурно в R3F (кости/шейдер) | код |
| Задача | В чём | Выход |
|---|---|---|
| Комната (открытый передок) + мебель (2–3 интерактивные) | Blender | GLB |
| Декор-статика (картины/ковёр/растение/шторы) | Blender + готовый cozy-кит как база (Sketchfab/Fab) | GLB |
| Свет: запекание лайтмапов на 4 фазы суток | Blender (Cycles bake) | 4 набора lightmap-текстур |
| Атлас текстур (минимум draw-calls) | Blender / texture atlas | атлас |
| Задача | В чём |
|---|---|
| Каркас приложения | React + Vite + TypeScript |
| 3D-сцена, загрузка GLB, лайтмапы | React Three Fiber + Three.js + drei |
| Камера: орбита/зум/пан | drei (Controls) + жесты |
| Гироскоп (наклон → параллакс диорамы) | Telegram Gyroscope API (Bot API 8.0) |
| Мех-шейдер (shell, параметрический) | кастомный материал Three.js (GLSL) |
| Движок умных объектов («реклама» действий) | TypeScript-логика |
| Живой день (4 фазы: свет+окно+поведение) | клиент + сервер, блендинг лайтмапов |
| Стейт приложения | Zustand |
| Звук (мяу, мурлык, шорохи) | Howler.js / Web Audio |
| Хаптика (тактильное мурлыканье) | Telegram HapticFeedback API |
| TMA-интеграция: статус, шеринг, сенсоры | Telegram WebApp SDK (@telegram-apps/sdk) |
| Задача | В чём |
|---|---|
| API + состояние питомца | Hono (Node.js) — как в твоих проектах |
| БД: состояние, баллы, инвентарь предметов | PostgreSQL |
| Пересчёт «жизни между визитами» по timestamp | серверная логика |
| Бот + пуши-возврат | grammY (long-polling; +прокси, т.к. api.telegram.org с VPS в РФ заблокирован) |
| Погода для живого дня | внешний Weather API по геолокации |
| Платежи (Stars) — позже | Telegram Stars API (через Fragment на десктопе) |
| Задача | В чём / где |
|---|---|
| Хостинг | VPS (твой, vdsina) |
| Веб-сервер (статика SPA) | nginx + Mini-App CSP |
| Процессы (API, бот) | PM2 |
| Деплой | rsync / scp |
| Домен + регистрация Mini App | поддомен rkvartalnov.ru + Menu Button в @BotFather |
Figma — UI и 2D-ассеты (глаза, иконки). Midjourney / концепт-арт — мудборд и референсы кота перед моделингом (не в продакшн, а для попадания в образ). Meshy (опц.) — быстрая болванка меша как старт для скульпта. GitHub — версионирование (в отличие от текущих проектов — стоит завести с нуля).
Blender (модель · риг · блендшейпы · анимации · запекание света) → экспорт GLB + лайтмапы → React Three Fiber (рантайм-сцена, мех-шейдер, умные объекты, живой день) → Hono + PostgreSQL (состояние, пересчёт, баллы) → grammY (бот, пуши-возврат) → VPS · nginx · PM2 (деплой). Всё, кроме GitHub, — уже знакомый тебе стек.
Фаза 0 в Blender + R3F: кот-болванка с параметрическим мехом → экспорт GLB → сцена R3F → сборка в Telegram Mini App → бенчмарк на реальном телефоне. Пока мех не подтверждён на устройстве — остальное не лепим.
План производства отвечает на одно требование: первый результат, который ты видишь, — уже тот самый. Каждый показ — финальное качество своего слоя: ключевой арт — финальный ключевой арт, блокаут — финальная геометрия с точными размерами, кот в стенде — финальный кот в финальном свете на твоём телефоне.
Всё про внешний вид решается на дешёвых картинках до 3D. Дальше 3D не ищет, а воспроизводит утверждённую картинку и проверяется по ней численно.
Каждую генерацию я сначала проверяю по паспорту: пропорции наложением схемы, палитра по цвету, читаемость на маленьком размере, запреты. Ты видишь 2–3 финалиста с разбором — никогда сырой поток.
Настройка инструментов — формулировки для Meshy, рецепт запекания, замер меха — идёт на служебных объектах и не выдаётся за результат.
До массового производства одна чашка проходит всю цепочку: концепт → 3D → текстура → «стоит / упала» → свет → телефон. Рецепт фиксируется и повторяется для остальных вещей, а не изобретается заново.
3D показывается не серым в Blender, а в стенде на телефоне — в свете фазы суток, с правильным цветом.
Каждая генерация записывается с вердиктом. Удачный рецепт в момент первого прохода становится навыком — второй раз уже не ищем.
| Стадия | Что делаем | Гейт | Решает |
|---|---|---|---|
| К1 Ключевой арт | широкий поиск вариантов на дешёвой модели → отбор по паспорту → доводка лучших на сильной. Стиль — мягкий стилизованный 3D-рендер «как игрушка», мех массами: картинка должна выглядеть как будущий кадр, иначе 3D её не повторит | голова 40–50% роста · глаза по схеме · кисточки, грива, хвост · окрас · силуэт узнаётся на 64 px · характер без подписи | ты, из 2–3 |
| К2 Лист эмоций | 10 выражений из утверждённого арта | каждое узнаётся на 128 px · язык тела без ловушек | ты |
| К3 Разворот | виды спереди, сбоку, сзади, ¾ | одинаковые пропорции и рисунок ±5% | я |
| К4 3D-база | дешёвая проба → два финальных прогона → лучший | силуэт с 4 ракурсов совпадает с разворотом на 90%+ | я; тебе — вращение в стенде |
| К5 Чистка и сетка | зеркалирование, масштаб, глаза-сферы, петли вокруг глаз и рта | асимметрия < 1% · автопроверка Д4 | я |
| К6 Окрас | буква «М» на лбу, полосы, белая манишка, «снегоступы», маски меха | цвет совпадает с паспортом и артом | я |
| К7 Лицо | ~20 форм лица, глаза с глубиной и бликами | 10 эмоций К2 повторяются в 3D | ты |
| К8 Скелет | ≈ 50–60 костей, имена по контракту | позы сидит / буханка / калачик / прыжок без заломов | я |
| К9 Мех | слои по зонам: грива, «штаны», хвост, кисточки | цвет · 60 кадров на Galaxy среднего класса | ты, на своём телефоне |
| К10 Анимация | 24 клипа первого релиза, числа из конфига Д3 | петли без шва · лапы не скользят | я |
| К11 Приёмка | выгрузка, сжатие, автопроверка | кот ходит, прыгает по лесенке, моргает — на телефоне | ты: «кот живой» |
| Стадия | Что делаем | Гейт | Решает |
|---|---|---|---|
| П1 Блокаут | финальная геометрия по канону: пол, стены, окно, мебель по лесенке, места кота; в стенде вместе с болванкой кота | голова кота в кадре ≥ 40 pt · видны все зоны · высоты = прыжки | ты: планировка |
| П2 Стилевой кадр | 2D-кадр хюгге-комнаты точно поверх ракурса блокаута — картинка ложится на нашу геометрию — с утверждённым котом | палитра · контраст кота с фоном · запреты | ты |
| П3 Лист предметов | все ~16 вещей одной картинкой — так они гарантированно из одного мира | единый язык форм · читаются в кадре «зона кота» | ты |
| П4 Сквозной эталон | чашка проходит всю цепочку до телефона; рецепт фиксируется | все проверки · роняется и возвращается тапом | я; тебе — чашка в стенде |
| П5 Все предметы | мебель с точными размерами — моделирую в Blender по лесенке; органика и мелочь — Meshy по вырезкам с листа | бюджеты · общая палитра · силуэт совпадает с листом | я; тебе — комната целиком |
| П6 Свет | 4 фазы суток запекаются в Blender по рецепту Д5, окно тремя слоями с параллаксом | цвет совпадает с Blender · кот контрастен в каждой фазе | ты: 4 фазы на телефоне |
Почему мебель не через генерацию: лесенка требует точности ±5 см, а генерация даёт приблизительную форму — подгонка съела бы больше, чем моделирование по размерам. Meshy берёт то, где важна форма, а не размер. Финал — С1 «первый живой кадр»: кот в комнате ходит, прыгает по лесенке, роняет чашку, ты возвращаешь её тапом, фазы суток сменяются — на твоём телефоне.
Эталон-кадры Д9 собираются из уже утверждённых кота и стилевого кадра комнаты и сразу становятся «северной звездой» для 3D. Первый показ — финальный.
Эталоны генерируются по описанию. В них будет «какой-то кот», не наш, — это и есть пробный результат, которого хотим избежать.
Кредиты Meshy на всё производство — около 400–650 из 3000 в месяц; перед каждой пачкой проверяю баланс и спрашиваю тебя.
В проекте 21 готовый навык — проверенные инструкции для Blender, React Three Fiber и сборки 3D для браузера. Правило: перед каждой стадией загружаются её навыки, работа идёт по ним; если навык расходится с нашим каноном — побеждает канон. Удачный рецепт, найденный впервые, сразу становится нашим собственным навыком.
| Стадия | Навыки |
|---|---|
| Генерация кота в Meshy (К1–К4) | рецепт проекта → свой навык «кот в Meshy» после К4 |
| Чистка сетки, блокаут комнаты | blender-mcp, blender-assembly |
| Окрас, развёртка, запекание света | blender-uv-texturing |
| Формы лица, анимация | blender-animation, animation-quality-gate |
| Скелет | blender-mcp → свой навык «скелет кота» после К8 |
| Мех | r3f-shaders, r3f-geometry, r3f-materials |
| Выгрузка и сжатие | blender-export, web-3d-asset-pipeline, r3f-loaders, r3f-textures |
| Тест-стенд, сборка сцены | react-three-fiber-game, r3f-fundamentals, r3f-interaction, r3f-lighting, r3f-animation, game-playtest |
Паспорт героя — единственный источник правды для всех этапов создания кота. Каждая генерация проверяется на соответствие ему, поэтому она становится проверкой, а не поиском. Там, где нужен вкус, — варианты с разбором и рекомендацией; решение за тобой.
Пушистый котёнок мейн-куна — добродушный неуклюжий великан с кисточками на ушах. Проживает твой день у тебя в Telegram: ходит за тобой как собака, чирикает на птиц за окном и лезет лапой в миску с водой. Бедокурит не со зла — и сам первым прибегает мириться.
Кот — носитель пяти механик продукта. Каждое решение ниже проверяется против них.
| Роль | Что требует от героя |
|---|---|
| Эмоциональный центр | «нужность» и ласка: тянется к игроку, радуется ему |
| Генератор бардака | проказливость: трогает, роняет, лезет куда не надо |
| Двигатель виральности | комедийная выразительность, «мемный» момент |
| Сожитель, живой день | ритм суток: утром потягушки, днём шалости, вечером ласка, ночью сон |
| Прощающий дизайн | бардак не выглядит злым, последствия — милые |
Внешность решена, нрав — нет. От нрава зависят поза и выражение по умолчанию, репертуар выходок и силуэт. Оценка по пяти ролям (максимум 25).
Бардак случается сам: полез посмотреть, задел, уронил, сам испугался. Снимает вину — главный риск тамагочи.
Роняет нарочно с хитрым прищуром, потом ластится. Самый мемный, но может раздражать.
Важный, ленивый, сдержанный. Смешной контраст, но мало бардака и «нужности».
Очень милый и робкий, вызывает заботу, но мало действия и комедии.
«Любопытный неуклюжка с хитринкой». Мейн-кун по натуре добродушный великан: любопытный, игривый, ходит за хозяином. Большой неуклюжий котёнок задевает всё хвостом и лапами-снегоступами — естественный носитель случайного бардака. Изредка — мемный бит: смотрит в камеру и медленно сталкивает чашку с полки. Подписи: наклон головы · ходит за пальцем игрока · медленное моргание (доверие) · трели и чириканье вместо мяуканья · лапа в миске с водой · «кто, я?» после бардака.
Цифры измеримы — по ним проверяются ключевой арт, разворот и 3D-база. H — высота головы, W — ширина головы по щёчному жабо.
| Параметр | Значение | Зачем |
|---|---|---|
| Полная высота в стойке (лапы → кончики ушей) | ≈ 2,2 H → голова ≈ 45% роста | детская схема |
| Ширина головы W | ≈ 1,15 H | «круглость» |
| Ширина груди | 0,9–1,0 W | голова не уже тела |
| Длина тела (сбоку) | ≈ 1,4 H | компактность |
| Видимая длина лап / лапы-«снегоступы» | ≈ 0,45 H / диаметр ≈ 0,32 H, пучки между пальцами | неуклюжесть, породный якорь |
| Диаметр глаза / промежуток | ≈ 0,24 W, слегка овальные / ≈ 0,9 глаза | главный носитель эмоции |
| Центр глаз по высоте | ≈ 55% от макушки | детская схема |
| Морда, нос, рот | чуть квадратнее, светлая «муфта»; нос ≈ 0,07 W; «ω» ≈ 0,14 W | порода, но мягко |
| Уши + кисточки | высота ≈ 0,5 H, основание ≈ 0,38 W; кисточки ≈ 0,15 H, толстые | силуэт «рысь», мемный якорь |
| Грива-жабо / хвост | грива расширяет силуэт ~20%; хвост 1,4 H, плюмаж ≈ 0,55 H, кольца | львиный силуэт, енотовидный хвост |
| Размер в мире | ≈ 0,5 м — мейн-кун крупная порода | читаемость на телефоне |
Язык форм: главная форма — круг (голова-шар в гриве, тело-боб, лапы-капли, хвост-плюмаж), кисточки — толстые «языки пламени», острых углов нет, ритм «большое — малое — большое». Тест силуэта: узнаётся чёрным силуэтом на 64 px в трёх позах — кисточки, грива и хвост работают как подпись.
Критерии: выделяется на фоне тёплой комнаты, помогает читать мимику, узнаётся как мейн-кун, ложится на мех-шейдер. Рисунок для всех вариантов — крупный упрощённый табби: «M» на лбу, полосы на щеках, подводка глаз, 3–4 полосы на боках, кольца на хвосте. Без мелкого тиккинга и мраморности.
Серебро, чёрные полосы, белая грудка и лапы, зелёно-золотые глаза. Холодный на тёплом — максимальный контраст; тёмная подводка и «M» делают мимику читаемой.
Самый узнаваемый мейн-кун: тёплые коричневые полосы, белая грудка, золотые глаза. Тёплый на тёплом — сливается, понадобится холоднее палитра комнаты.
Мем «рыжий кот», очень узнаваем, но тонет в тёплой комнате.
Драматично и красиво, но тёмная морда съедает мимику — главный риск для нашего героя.
Отдельные сферы, слегка овальные; крупная радужка (~70% глаза), зелёная с золотым кольцом; природная тёмная «подводка» табби; без ресниц.
Круглый по умолчанию, щель — только в «хитром» бите. Расширение 0,4 (спокоен) → 0,9 (восторг, испуг, просьба).
Крупный сверху-слева + маленький снизу-справа, всегда в сторону камеры.
Shape keys: моргание, полусонный, прищур радости, широко открытые.
Львиная грива-жабо (щёки, шея, грудь), хвост-плюмаж, лохматые «штанишки», «юбка» на животе, мех внутри ушей, пучки между пальцами. Кисточки ушей — отдельные толстые формы.
Спина, бока, макушка.
Вокруг глаз, спинка носа, светлая «муфта», подушечки — чтобы мимика читалась.
От носа назад и вниз; на гриве — веером от центра морды; на хвосте — к кончику.
Проверка: каждая эмоция узнаётся по картинке 128 px без подписи.
| Эмоция | Глаза | Зрачок | Рот | Уши | Хвост и тело |
|---|---|---|---|---|---|
| Любопытство (по умолчанию) | открыты | 0,5 | закрыт | вперёд | наклон головы |
| Радость | прищур «^ ^» | 0,6 | улыбка | вперёд | хвост вверх крючком |
| Доверие | медленное моргание | 0,5 | лёгкая улыбка | расслаблены | лежит, лапы подобраны |
| «Кто, я?» | широко | 0,85 | виноватая улыбка | чуть назад | застыл |
| Испуг | распахнуты | 0,95 | приоткрыт | «самолётом» | хвост ёршиком, прыжок |
| Сонливость | полуприкрыты | 0,5 | зевок | расслаблены | буханка |
| Хитрость (редко) | прищур одного | щель | ухмылка | вперёд | лапа на предмете, взгляд в камеру |
| Обида v1.1 | в сторону, взгляд через плечо | 0,5 | надутые щёки | чуть назад (не в стороны — это читается как боль) | сидит спиной, кончик хвоста подёргивается |
| Просьба | огромные | 0,95 | закрыт | вперёд | сидит столбиком |
| Азарт у окна | прикованы к птице | 0,9 | чирикает, дрожит челюсть | вперёд | кончик хвоста подёргивается |
Позы-подписи: буханка · калачик сна · потягушка · столбик · лапа на краю полки · лапа в миске с водой · наклон головы · игровая стойка · на спине · у окна, чирикает на птиц. Голос: трели и чириканье — фирменный голос мейн-куна вместо мяуканья («мрр-р?» — вопрос и приветствие, трель — радость); громкое мурлыканье с мягкой вибрацией; шипения нет.
8–12 тыс. треугольников + глаза отдельно; кольца вокруг глаз, «ω»-рот, петли суставов, кольца живота и хвоста.
Нейтральная стойка, просветы между лапами, хвост не касается тела, рот закрыт, морда по +Z.
Rigify Cat → чистый деформ-риг, ≤ 4 влияния, 50–70 костей. Через API Meshy не ригается.
~20 shape keys (включая трель); оболочки меха с картами длины и зачёса из Blender; рисунок табби — цветовая карта меха; кисточки — 2–4 карточки на ухо + кость для подёргивания.
Пряди в геометрии (кисточки — только толстыми формами) · усы в сетке · прочие детали тоньше 2% роста · открытый рот в базе · острые углы и реализм · мелкий рисунок (тиккинг, мрамор) · ресницы, одежда, аксессуары · агрессия.
Голова 40–50% роста · глаза ниже середины, 22–26% ширины головы · мех массами · окрас по паспорту · мейн-кун узнаётся без подписи (кисточки, грива, хвост) · характер назван одним словом тремя людьми · силуэт на 64 px.
Глаза и пропорции одинаковы на всех видах (±5%) · просветы между лапами · хвост свободен · без теней и перспективы · ≥ 1024 px · рот закрыт.
Силуэт с 4 ракурсов совпадает с разворотом (IoU ≥ 0,9) · пропорции ±5% · асимметрия < 1% · сетка замкнута · бюджет граней.
Паспорт сцены — канон комнаты-диорамы. Он связан с паспортом героя: окрас кота задаёт палитру комнаты, характер — набор предметов, размер кота — масштаб и камеру.
Тёплая просторная комната-диорама — дом кота и маленький мир в твоём Telegram. Живёт в такт твоему дню, полна вещей, с которыми можно набедокурить, и её хочется показать друзьям.
| Роль сцены | Что требует |
|---|---|
| Сцена для бардака | предметы, которые можно уронить, раскидать, в которые можно залезть |
| Живой день | окно и свет по реальному времени и погоде |
| Фон для героя | кот всегда читается: контраст и свободные зоны вокруг него |
| Виральный кадр | любой момент — готовый скриншот, «мир в коробочке» |
| Самовыражение (фаза 2) | мебель, декор и темы комнаты меняются |
Атмосфера: три столпа уюта (безопасность, изобилие, мягкость) · убежище — тепло внутри против погоды снаружи · обжитость — плед сполз, книга открыта · тихий юмор — поцарапанный угол дивана, мячик под креслом.
Кот-мейн-кун ≈ 0,5 м, комната ≈ 2,6 × 2,6 м, экран телефона ≈ 390 pt по ширине. Сколько кот занимает на экране?
| Кадр | Ширина сцены в кадре | Кот | Голова | Глаз |
|---|---|---|---|---|
| Вся комната | ≈ 4,0 м | 49 pt | 22 pt | 6 pt — эмоцию не прочитать |
| Зона кота | ≈ 1,8 м | 108 pt | 49 pt | 14 pt — читается |
| Крупный план | ≈ 0,8 м | 244 pt | 111 pt | 31 pt — эмоция крупно |
Если по умолчанию показывать всю комнату, кот крошечный, и главная ставка — эмоциональная морда — пропадает. Поэтому по умолчанию камера показывает зону кота (~1,8 м) и мягко следует за ним; вся диорама — состояние «отъехать» для обзора, скриншота и обустройства; крупный план включается сам в эмоциональные моменты.
Критерии: понятность глобальной аудитории, уют, кот выделяется, круглые формы, реалистичный продакшн, виральность. Максимум 30.
Светлое дерево, текстиль, пледы, растения, гирлянда. Универсален и спокоен — кот главный.
Терракота, горчица, круглые формы, торшер-гриб. Очень мемно, но тёплое — кот может сливаться.
Котацу — кот прячется под столом-одеялом! Низкая мебель. Мемно для котов, но нишевее.
Скошенный потолок, круглое окно, балки — узнаваемый силуэт «гнезда». Сложнее по геометрии.
Ковёр на стене, сервант. Сильная ностальгия, но узко для глобальной аудитории.
Ретро, мансарда, котацу и бабушкина — готовые темы комнаты для фазы 2, которые продаются за Stars как самовыражение.
Вид сверху в масштабе (2,6 × 2,6 м). Видны задняя и левая стены, передок открыт, камера смотрит спереди-справа.
Предметы для «роняния» выбраны под характер любопытного неуклюжки: ему нужно, что задеть, уронить, запутать и где спрятаться. Мейн-кун добавляет водяной бардак и «охоту» у окна.
| Предмет | Класс | Выходка | Бюджет, тр | Источник |
|---|---|---|---|---|
| Стены, пол, окно | статика | подоконник — место кота | ~1100 | процедурно |
| Диван, стеллаж | статика + места | сидит, спит на спинке, точит, лазает | 1200–1500 | CC0 / процедурно |
| Ковёр, плед, шторы, картины, торшер | статика | атмосфера, свет ночью | 200–400 | процедурно |
| Растение большое | статика | атмосфера | 800 | Meshy / CC0 |
| Лежанка, миски, мячик, коробка, когтеточка | умные | спит, ест, лезет лапой в воду и расплёскивает, гоняет, прячется, точит | 200–800 | процедурно / Meshy |
| Чашка на полке | умный | роняет (стоит / упала) | 300 | процедурно |
| Горшок-малыш | умный | роняет (стоит / лежит, земля) | 400 | Meshy |
| Книги | умный | сталкивает | 300 | процедурно |
| Клубок | умный | распутывает (клубок / нитка по полу) | 300 | процедурно |
Правило контраста: кот — холодное серебро с тёмными полосами → тёплая комната в средних тонах даёт максимальный контраст; избегать больших серых и холодных плоскостей за котом. Стартовая палитра под хюгге и серебристого табби:
Серебристый кот с чёрными полосами читается и на медовом полу, и на бирюзовом диване; тёплые акценты (терракота, горчица) подсвечивают холодное серебро; зелёно-золотые глаза перекликаются с зеленью растений.
Поверх — погода: дождь делает кадр темнее и холоднее, на стекле капли, кот смотрит на струи. Излучающие: торшер и гирлянда на стеллаже. Техника: 4 запечённые карты света + маска ламп, смешивание соседних фаз.
Птицы садятся на ветку — кот реагирует чириканьем; ночью огоньки в окнах крыш. Три плоских слоя с параллаксом от гироскопа.
Сад (много природы, меньше уюта ночью) · только небо (мало жизни) · двор.
Угол ~25°, база 45° спереди-справа, наклон ~60°; поворот ±25°, наклон 50–70°, зум 1–2,5×.
Верх ~12% — полоса состояния, низ ~18% — кнопки, кот в средних 70%; безопасные зоны Telegram; гироскоп ±5°.
≤ 30 вызовов отрисовки · сцена 30–60 тыс. тр · два файла: статика и умные предметы · карты света 1024 / 2048 по классу устройства · ≤ 2 МБ до первого кадра · имена SO_ / SLOT_ / HIT_.
Фотореализм · пёстрые узоры · мелкий хлам · текст и логотипы · большие чисто-белые и чёрные плоскости · хлам в зонах кота · предметы, закрывающие кота от камеры.
Схема зон утверждена.
Серые формы + болванка кота: в кадре по умолчанию голова кота ≥ 40 pt; при отъезде видны все зоны; ≤ 30 вызовов отрисовки.
4 фазы различимы, но в одном стиле; в каждой кот контрастирует с фоном (разница яркости ≥ 0,25).
Паспорт движения и поведения — это «мозг кота»: чего он хочет, что делает, как двигается и что из этого следует для скелета, мебели и кода. Самый связующий документ предпродакшна: из него выводятся кости, список анимаций, высоты полок и темп всей игры. Все числа продублированы в одном файле-конфиге, который читают и код игры, и тестовая сцена в Blender — расхождения между ними исключены.
В Stray «каждый прыжок успешен» — промахи ломают ощущение, что ты кот. Неуклюжесть нашего котёнка — вариант анимации, а не неудача: скребётся задними лапами, посмотрел наверх и передумал. Ветеринары пишут, что мейн-куны «ошибаются с высотой».
Мейн-кун не прыгает сразу высоко, а идёт ступенями. Поэтому мебель выстраивается лесенкой под прыжки.
Нормальный ритм казуальной игры по данным GameAnalytics. Neko Atsume рассчитана на «пару раз в день». Отсюда темп потребностей.
В Untitled Goose Game люди прибирают почти всё, и гусь может набедокурить снова. Бардак — игра, а не вина.
Уши в стороны по ветеринарной шкале — боль, сгорбленная буханка — недомогание, хлещущий хвост — страх. Для «милых» эмоций эти позы запрещены.
Пять шкал от 0 до 100: сытость, энергия, игра, любопытство, ласка. У каждой есть пол — ниже 15–20 она не падает, поэтому кот никогда не «умирает» и не заболевает, как бы долго тебя ни было. Лотка нет намеренно: это рутина-обязанность, а не забота. Темп подобран под реальный ритм казуальных игр: при 2–4 заходах в день потребности встречают тебя на уровне 40–55 — ровно на 2–3 действия заботы за 3–4 минуты. Пока тебя нет больше двух часов, всё убывает вдвое медленнее, а ночью по твоему местному времени — вчетверо.
| Потребность | Убывает в час | Что восполняет | Когда низкая |
|---|---|---|---|
| Сытость | −8 · от полной до «хочу» ≈ 7,5 ч | миска | смотрит на миску, сидит столбиком |
| Энергия | суточный ритм: −12 бодрствуя, +25 во сне | лежанка, подоконник на солнце, калачик у лампы | зевает, ложится буханкой |
| Игра | −10, пока не спит | мячик, клубок, коробка, ты, выходки | ищет развлечение → бардак |
| Любопытство | −10, пока не спит | окно и птицы, полки, миска с водой | исследует, трогает лапой, роняет |
| Ласка | −6 | гладишь, зовёшь, играешь | подходит к камере, реже трелит |
Кот выбирает, чем заняться, по модели The Sims: предметы «рекламируют», какие потребности закрывают, кот оценивает выгоду и выбирает случайно из трёх лучших вариантов. Поэтому он предсказуем по характеру, но не по конкретному шагу — это и создаёт ощущение живого.
Ориентиры рынка — от Desktop Goose (намеренно раздражающий гусь пакостит раз в 20–40 секунд) до первого Тамагочи (около 4 шалостей за всю жизнь). Наша середина: не больше одной выходки за заход и не раньше чем через 2–3 минуты игры; пока тебя нет — не больше трёх; за сутки — не больше пяти с паузой от 30 минут; ночью кот спит. Вероятность растёт, когда кот скучает, — выходка сигнализирует скуку. Ресёрч советует даже 1–3 в сутки: стартуем с пяти и режем на тест-стенде, если бардак превратится в уборку.
Кот живёт сам до 12 часов, дальше — «проспал». Возвращаешься — в комнате 1–3 последствия (одно главное, два мелких: мокрые следы у миски, мячик под диваном) и один живой момент до 6 секунд, где кота «застали». Перед этим бот зовёт от лица кота: «я кое-что натворил, посмотри». Никогда — «ты забыл».
Меньше суток — сразу радость, хвост вверх крючком. От суток — обида 3–5 секунд: сидит спиной, смотрит через плечо, щёки надуты, кончик хвоста подёргивается — и бежит к тебе с трелью. От трёх дней — обида такая же короткая, а встреча больше: трётся, трелит, сидит рядом. Извиняться не нужно никогда.
Не больше одного в день и четырёх в неделю, тишина с 22 до 9 по твоему времени. Два пропущенных подряд — пауза три дня, четыре — раз в неделю. По опросам, уже при 2–5 уведомлениях в неделю 43% людей их отключают. Писать можно только после разрешения из мини-аппа.
Скорости пересчитаны с взрослой кошки на наш рост по законам подобия — так же биомеханики сравнивают животных разного размера. Шаг — 0,35 м/с (уютный темп для комнаты 2,6 м), крадучись — 0,18, рысь — около 1, бег — не быстрее 1,7 м/с, иначе в комнате не остаётся места на разгон. Цикл шага — 32 кадра по классическому разбору аниматора Rusty; порядок лап — как у настоящих кошек на беговой дорожке. Голова и хвост отстают на кадр на каждое звено — отсюда плавная «волна» кошачьего движения.
Всё мелкое, что делает кота живым, собирает код поверх анимаций. Моргание — редкое, в среднем раз в 15 секунд: кошки моргают 4 раза в минуту против 29 у человека. Медленное моргание — отдельный жест доверия: по исследованию, после него кошки чаще подходят к человеку, и ты сможешь моргнуть коту в ответ. Дыхание — 27 вдохов в минуту бодрствуя, 18 во сне, в пределах ветеринарной нормы. Уши подёргиваются раз в 5–20 секунд, хвост качается пружиной, глаза опережают поворот головы на три кадра.
Одна анимация прыжка покрывает разброс высот не больше ±7 см. Поэтому не прыжки подстраиваются под мебель, а мебель — под три прыжка.
| Прыжок | Длина | Как устроен |
|---|---|---|
| Вверх на 0,42 | 40 кадров · 1,3 с | присел, толчок 4 кадра (у настоящей кошки ≈ 150 мс), полёт, приземление на передние лапы, доводка |
| Вверх на 0,70 | 51–71 кадр | сначала «прицеливается» взглядом; в 10–15% случаев — неуклюжий вариант: зацепился передними, скребётся задними, подтянулся |
| Вниз с 0,42 / 0,70 | 29 / 38 кадров | тянется вниз, мягкая амортизация; с высоты дольше — нагрузка на лапы растёт |
| «Передумал» | 45 кадров | посмотрел наверх, взвесил, сел — черта характера неуклюжки |
Полёт посчитан по физике и растянут в 1,2 раза, чтобы прыжок читался на маленьком экране; код ведёт кота по той же дуге с пониженной «гравитацией», поэтому лапы не проскальзывают. Прямого прыжка на метр нет вовсе: всё выше подоконника — цепочкой по 0,42, как делает настоящий мейн-кун. Это минус один сложный клип.
Все анимации записываются на месте — по комнате кота ведёт код — и начинаются и заканчиваются в одной из трёх нейтральных поз, чтобы переходить друг в друга без рывков. Полный каталог — около 45 клипов с длиной в кадрах; первый релиз — 24: покой сидя и буханкой, ходьба, рысь, сон, еда, «чаттер» у окна, повороты, четыре прыжка и «передумал», удар лапой, столкнуть с полки, лапа в воде, испуг, «кто, я?», трель и обида. Было 15 — выросло, потому что твои решения по обиде и прыжкам вниз требуют своих клипов.
Из движений выводится скелет — около 50–60 костей: челюсть для трели и «чаттера» (беззвучная дрожь челюсти на птиц), по три кости в каждом ухе, пружинные кисточки, 8–10 костей хвоста, пальцы на лапах, чтобы трясти мокрой лапой и мять лежанку. Little Kitty Big City обходится похожим минимумом.
| Сигнал | У настоящих кошек | Правило для нашего кота |
|---|---|---|
| Хвост вверх вопросительным знаком | дружелюбие, «подход с улыбкой» | радость, встреча |
| Уши, развёрнутые в стороны | боль по ветеринарной шкале | запрещено для обиды, сна, удовольствия |
| Хлещущий хвост | страх, дискомфорт, перевозбуждение | только испуг и азарт — не обида |
| Сгорбленная буханка, голова опущена | недомогание | запрещено — никогда как «грусть» |
| Медленное моргание | доверие; после него кошки подходят | доверие, ответ игроку |
| Трель, чириканье, редкое мяуканье | голос мейн-куна | основной звуковой словарь |
«Обида» в листе выражений была с ушами вбок и хлещущим хвостом — у настоящих кошек это читается как боль и страх. Теперь: сидит спиной, смотрит через плечо, уши чуть назад, кончик хвоста подёргивается. Характер и внешность не менялись.
Технический контракт — это договор между Blender и браузером. Он делает так, чтобы любой файл, собранный в Blender, открывался в Telegram без ручных правок: кот стоит на полу, смотрит вперёд, анимации находят свои кости, предметы помнят свои состояния. Всё в нём проверяется скриптом, а не глазами.
Самые дорогие ошибки 3D-производства — не кривая модель, а несовпадения на стыках: кот в Blender смотрит в одну сторону, а в браузере в другую; кость называется «ear.L», а браузер молча превращает её в «earL», и анимация уха перестаёт работать; предмет «склеился» при сжатии и потерял имя, по которому код его находит. Каждая такая ошибка всплывает поздно и чинится переделкой. Контракт снимает их все одним списком правил и одним скриптом проверки.
Одна единица в Blender — один метр, и в браузере тоже метр: цифры из паспортов переносятся как есть.
| Правило | Значение | Зачем |
|---|---|---|
| Куда смотрит кот | в Blender — на зрителя в виде «спереди»; после экспорта — вперёд по оси, которую three.js считает «вперёд» | код разворачивает кота по ходу движения без поправочных углов |
| Рост кота | 0,50 м от пола до кончиков ушей без кисточек, допуск ±2% | скрипт мерит габарит и не пропускает «подросшего» кота |
| Точка опоры кота | на полу между четырьмя лапами | кот ставится на место одной командой, без подпрыгивания |
| Точка опоры предмета | центр дна | упавшая чашка лежит на полу, а не висит в воздухе |
| Место кота (SLOT) | невидимая метка на поверхности; её направление — куда кот смотрит, сидя там | код сажает кота на диван, полку, подоконник по метке |
| Анимация | 30 кадров в секунду | как в списке клипов Д3 |
Браузерный движок молча вырезает из имён точки, двоеточия, пробелы и слэши. Blender по привычке называет кости «spine.001» и «ear.L» — в браузере они превращаются в другие имена, и анимации, записанные на старые, перестают двигать кота. Поэтому правило одно: латиница, нижний регистр, слова через подчёркивание, сторона — «_L» и «_R». Blender понимает такие суффиксы для зеркалирования так же, как привычные «.L».
| Что | Как называем | Пример |
|---|---|---|
| Исходник | ассет + номер версии | cat_v003.blend |
| Кости | часть + номер + сторона | spine_03, ear_02_L, tail_07 |
| Формы лица | группа + название + сторона; имя в Blender = имя в коде | lid_blink_L, mouth_trill, cheek_puff |
| Клипы | строго по списку Д3: петли, разовые действия, добавочные слои | LOOP_idle_sit, ACTN_jump_up_low |
| Умные предметы | SO_ + тип + номер; состояния — дочерние объекты | SO_cup_01 → __st_shelf, __st_floor |
| Места кота, зоны нажатия | SLOT_ и HIT_ | SLOT_sleep_bed_01, HIT_cup_01 |
| Материалы и текстуры | M_ и T_ + ассет + карта (+ фаза суток) | T_room_light_evening |
У умных предметов и мест есть «паспорт внутри файла» — свойства, которые браузер получает вместе с моделью: что с предметом можно сделать, в каких он бывает состояниях, в каком стоит по умолчанию; у места — на какой оно высоте и с какими местами соединено для прокладки пути. Высота места сверяется с таблицей прыжков Д3: полка, до которой кот не допрыгивает ни одним из двух прыжков, не пройдёт проверку.
Разбивка подчинена одному: первый кадр — быстро, остальное догружается в фоне.
| Файл | Что внутри | Когда грузится |
|---|---|---|
| cat | кот, скелет, формы лица, клипы покоя и ходьбы | до первого кадра |
| cat_anims | остальные клипы — подключаются к коту по именам костей | в фоне |
| static | комната: стены, пол, окно, неподвижная мебель — склеено в минимум кусков | до первого кадра |
| objects | умные предметы с состояниями, места кота, зоны нажатия — ничего не склеивается | до первого кадра |
| карты света ×4 | утро, день, вечер, ночь — отдельными картинками | текущая фаза сразу, остальные в фоне |
| заставка ×4 | готовая картинка той же комнаты из той же камеры, ≈ 100 КБ — видна мгновенно, пока грузится 3D, и плавно сменяется живой сценой | самой первой |
Сборка — только скриптом: Blender запускается без окна, берёт нужную коллекцию и выгружает файл с зафиксированными настройками. Все 103 настройки экспортёра сняты с установленного Blender 5.2.1, а не по памяти; в контракте записано, какие включены для кота, комнаты и предметов и почему. Затем постобработка: проверка, чистка лишнего, сжатие картинок в формат, который телефон держит в видеопамяти сжатым, сжатие геометрии и повторная проверка. Для файла предметов запрещены «оптимизации», которые склеивают объекты, — они стирают имена, по которым код находит чашку.
| Класс | Треугольники | Кости | Вызовы отрисовки | Вес готового файла |
|---|---|---|---|---|
| Кот | 8–12 тыс. | ≤ 70 (план 50–60), ≤ 4 на вершину | 3: тело, глаза, мех | ≤ 1,2 МБ с клипами покоя |
| Набор клипов | — | — | — | ≤ 300 КБ |
| Умный предмет | 300–1 500 | 0–1 | все предметы ≤ 8 | ≤ 60 КБ |
| Комната | 15–30 тыс. | — | 1–3 | ≤ 600 КБ без карт света |
| Мех | 8 / 16 / 24 слоя по уровню качества | — | 1 | — |
| Вся сцена | 30–60 тыс. без меха, с мехом ≤ 120–300 тыс. | ≤ 30 | ≤ 1,5 МБ до первого живого кадра + картинка-заставка ≈ 100 КБ |
Масштаб и повороты применены · точки опоры на месте · у каждой вершины кота не больше 4 костей · асимметрия после зеркалирования меньше 1% роста · на коте нет лишних модификаторов · все имена по правилам · все клипы из списка Д3 есть и начинаются и заканчиваются в нейтральной позе.
Официальный валидатор формата — 0 ошибок · все счётчики в бюджете · формы лица и клипы только из канонических списков · у каждого предмета есть все состояния и своя зона нажатия · высоты мест совпадают с таблицей прыжков · рост кота 0,50 м ±2% · кот смотрит вперёд.
Отчёт проверки лежит рядом с файлом и показывается на тест-стенде. Файл с хотя бы одним «не прошёл» дальше не идёт — так контракт превращает «кажется, всё нормально» в измеримое правило.
Паспорт устройств отвечает на три вопроса: на каких телефонах кот обязан быть красивым, как быстро игра открывается и как она сама подстраивает качество под телефон. Всё, что в нём сказано про скорость, превращается в замер — никаких «вроде летает».
Кот обязан быть красивым и плавным — 60 кадров с полным мехом — начиная с iPhone 13 и Android среднего класса. Телефоны слабее мы не отрезаем — игру пересылают друзьям с любыми телефонами, — они получают упрощённый мех и работают без гарантий.
В России 69% телефонов — Android и 31% — iPhone; среди производителей после Apple идут Xiaomi (20%) и Samsung (18%). Массовый российский Android — это телефоны вроде Redmi Note 11 и Galaxy A15: 4–6 ГБ памяти и видеочипы начального уровня. iPhone почти все на iOS 26, а она работает начиная с iPhone 11. 3D-движок браузера (WebGL2) есть у 99% телефонов, сжатые текстуры — у всех. Два важных ограничения: пост-эффекты на части Android не гарантированы, а время работы видеочипа на телефоне измерить нельзя вообще — поэтому мерим только время кадра.
| Класс | iPhone | Android | Что обещаем |
|---|---|---|---|
| Сильный | 15 и новее | флагманы | 60 кадров, самый густой мех (24 слоя), мягкая тень под котом |
| Минимум с гарантией | 13, 14 | средний класс (Snapdragon 7-й серии и ровесники) | 60 кадров, полный мех (16 слоёв) — под этот класс проектируется и утверждается весь визуал |
| Ниже минимума | 11, 12, SE | Redmi Note 11, Galaxy A15 и ровесники | упрощённый мех, цель 60; если не тянет — ровные 30 вместо дёрганых; без гарантий |
| Совсем старые | без 3D-движка браузера или с постоянными сбоями | красивая картинка-заставка и обычный интерфейс | |
Следствие решения стоит проговорить честно: массовый бюджетный Android попадает в «ниже минимума». Кот там будет жить, но мех проще, а плавность не обещана. Взамен мы не упрощаем визуал ради самых слабых телефонов.
Готовая картинка той же комнаты, около 100 КБ. Человек сразу видит кота, а не белый экран.
Код, кот, комната, карта света — всё, что нужно, чтобы кот ожил. Остальное догружается в фоне.
На средней скорости мобильного интернета в России (19 Мбит/с). Заставка и 3D одного цвета — смена незаметна.
Отдельная российская деталь: с лета 2025 провайдеры режут трафик к Cloudflare и ряду зарубежных хостингов до первых 16 КБ на файл — мы уже наступали на это в «Голосовании Лагеря». Поэтому все файлы игры раздаются с нашего сервера на российском хостинге, без посредников.
| Параметр | Ниже минимума | Минимум с гарантией | Сильный |
|---|---|---|---|
| Слои меха | 8 (при нехватке 4) | 16 | 24 |
| Чёткость картинки | 1× | до 1,5× | до 2× |
| Карта света комнаты | 1024, одна фаза в памяти | 2048, две фазы для плавной смены | 2048, две фазы |
| Тень кота | пятно | пятно | мягкая контактная |
| Пост-эффекты | нет нигде — они ломают совпадение цвета с Blender (Д5) | ||
Стартовый уровень игра угадывает сама: на Android Telegram прямо сообщает класс телефона, на iPhone работает библиотека определения видеочипа. Дальше следит монитор производительности: если кадры проседают, он по очереди снижает чёткость, число слоёв меха, тень и карту света и запоминает удачный уровень. Когда Telegram свёрнут, отрисовка на паузе — батарея не тратится.
Кот на четверти экрана с 16 слоями меха — это около 216 миллионов закрашенных точек в секунду при 60 кадрах. Поэтому самый первый технический замер проекта — бенчмарк меха на iPhone 13 и Android среднего класса. Если 60 кадров с полным мехом там не держатся, решаем до ключевого арта, а не после.
Эталоны гарантии — iPhone 13 и Android на Snapdragon 7-й серии; плюс сильный iPhone, флагман и два телефона ниже минимума, чтобы убедиться, что упрощённый уровень не ломается. Условия одинаковые: заряд больше половины, яркость 50%, телефон остыл, всё закрыто. Игра открывается по специальной ссылке и сама прогоняет три сценария по минуте — кот в покое, худший случай (крупный план, мех на 60% экрана) и смена времени суток, — плюс 10 минут на нагрев: плавность не должна падать больше чем на 20%. Три прогона на телефон, в отчёт — медиана; результаты сами уходят на наш сервер.
Главный экран проекта: на нём утверждаем картинку, проверяем жесты, вырез Dynamic Island и экран 120 Гц. На тест-стенде будет переключатель уровней — ты увидишь, как кот выглядит на минимуме и ниже. Но скорость минимума он не подтверждает: он заметно мощнее iPhone 13. Раннее предупреждение: если худший сценарий на твоём телефоне съедает больше половины времени кадра — на iPhone 13 60 кадров не будет, чиним сразу.
Все замеры скорости — бесплатно в удалённой лаборатории Samsung на настоящих Galaxy. Главный ориентир — слабый Android (серия A1x–A2x): на упрощённом уровне держит 60 и никогда не падает ниже ровных 30. Гейт гарантии — Galaxy среднего класса: 60 кадров с полным мехом. iPhone 13 не нужен: его видеочип сильнее любого из этих Android, а особенности iPhone — движок, жесты, память — проверяем на твоём телефоне.
Контракт внешнего вида делает так, чтобы кот и комната в Telegram выглядели так же, как в Blender — и одинаково на всех телефонах. Главное правило: картинку утверждаем в браузере на телефоне, Blender — место производства, а не утверждения.
Blender и браузерный движок по-разному «проявляют» свет — как два фотолаборанта с разной химией. Даже одноимённые режимы у них разные: сверка исходного кода показала, что «AgX» в Blender и в three.js — разные формулы, а готовые настройки R3F включают третий режим. Совпадает только один — Khronos PBR Neutral. Его и берём на обе стороны.
В Blender во всех сценах проекта стоит одна и та же настройка цвета: вид Khronos PBR Neutral, без «луков», кривых и баланса белого — браузер не умеет их повторить. Экспозиция фиксирована и одним числом передаётся в код. Рабочее цветовое пространство Blender совпадает с браузерным. Всё это проверено по файлу настроек цвета, установленному вместе с нашим Blender 5.2.
Весь свет, отражения и мягкие тени считаются в Blender заранее, на четыре фазы суток, и «впекаются» в картинку. Телефон ничего не считает — просто показывает картинку на стенах: это самый дешёвый и самый красивый способ. Точный рецепт записан по шагам: запечь → сохранить без потерь → применить «проявку» → сжать в формат, который телефон держит сжатым в памяти. Главная ловушка — не «проявить» комнату второй раз в браузере: для этого материал комнаты помечается «без освещения».
Кот двигается, поэтому его свет считается прямо в телефоне: основной источник по фазе суток, мягкое окружающее освещение, снятое в Blender из точки, где сидит кот, и контровой свет, чтобы серебристый мех отделялся от стены. Когда кот заходит в тень дивана, код берёт яркость пола под лапами из карты света и приглушает его — кот «входит» в тень, как настоящий.
Тени — без дорогих живых теней: под котом и предметами мягкое пятно-тень, на сильных телефонах — контактная тень. Мех — полупрозрачные слои вокруг тела, рисуются строго после всего непрозрачного и без приёмов, которые на мобильных видеочипах ломают экономию (так советуют и Arm, и Apple); число слоёв — по уровню качества. Если мех не пройдёт замер на слабых телефонах, есть запасной путь: мягкость формой и текстурой, крупные массы шерсти и так живут в силуэте. Глаза — отдельный материал: радужка с глубиной, зрачок сужается и расширяется по эмоции, два блика всегда смотрят в камеру, поэтому глаза сияют с любого ракурса.
Пост-эффектов нет вообще: любой эффект на весь экран заставляет браузер «проявить» комнату второй раз и сломать цвет. Сглаживание — встроенное, виньетка — слоем интерфейса, свечение ламп — лёгкие спрайты.
Один и тот же кадр — кот, серая карта, цветовая шкала — рендерится в Blender и в браузере и сравнивается численно: комната — среднее отличие ΔE меньше 1,5 (глаз не различает), кот — меньше 3.
Картинка-заставка проходит тот же гейт — поэтому смена заставки на живую сцену незаметна.
Оставить настройку цвета R3F по умолчанию · добавить пост-эффекты · сохранить запечённый свет без «проявки» · перепутать тип цвета у текстуры · кривые и баланс белого в Blender.