Tidewill
Tidewill · неофициальная фан-игра по One Piece

Судовой журнал разработки

Карточная игра-дуэль по миру One Piece. Один разработчик, Rust и Godot. Здесь записываем, что решили, сделали и проверили, в том порядке, в каком это случилось.

Вопросы дизайна

35 из 36 решено

Каждый вопрос — отдельное обсуждение: от формата игры до звука и редактора миссий.

Вехи до первого плейтеста

8 из 8 начато
M0M1M2M3M4M5M7M8

M0 — фундамент кода, M8 — закрытый плейтест. Код начинается с M0.

Время работы

81,3 ч всего
  • M0 план 10–200,6 ч
  • M1 план 16–241,3 ч
  • M2 план 60–1002,2 ч
  • M39,0 ч
  • M41,0 ч
  • M50,8 ч
  • M617,5 ч
  • M79,6 ч
  • M80,7 ч
  • Проектирование19,6 ч
  • Процесс8,2 ч
  • Качество кода5,0 ч
  • Арт и звук3,2 ч
  • Инструменты и инфраструктура1,9 ч
  • S10,8 ч

Часы работы по этапам — по журналу сессий; у вех — план. Работа на втором компьютере складывается.

Дата · №Запись
14.10.2026запись 26

Свой сервер, вход и сайт

серверинструментысайт

До сих пор игра жила только на компьютере игрока: партии против ИИ, коллекция, колоды. Для онлайна нужны сервер и аккаунты, и первая часть сервера уже работает.

Кнопка «Войти» стоит на главном экране справа сверху. Можно зарегистрироваться почтой и паролем, тогда на почту придёт шестизначный код. Можно войти через Google: игра откроет браузер, ты выберешь аккаунт и вернёшься в игру уже вошедшим. Пароль и код из письма хранятся только в виде стойкого хеша. Сессия живёт месяц с последнего входа. Аккаунт удаляется прямо в игре за два нажатия.

Без аккаунта игра работает как раньше. Он понадобится, когда появятся дуэли и онлайн-кампания.

Данных я храню по минимуму: почту, хеш пароля и, при входе через Google, идентификатор аккаунта. IP-адреса в базу не пишутся, в журналах сервера нет ни почт, ни адресов. Всё это описано в политике конфиденциальности на сайте игры.

Кроме дневника, на сайте теперь есть главная с описанием игры, план работ, ответы на частые вопросы и список авторов звуков и шрифтов. Основные страницы есть на русском и английском. Страница скачивания откроется вместе с открытой альфой.

10.10.2026запись 25

Игра для старого рабочего ноутбука

оптимизацияrustgodotпроизводительность

Всё в игре я проверяю на своём рабочем ноутбуке: HP EliteBook 745 G5, процессор AMD Ryzen 3 PRO 2300U на четыре ядра по 2 ГГц и встроенная графика Radeon Vega 6. Ни одной игровой видеокарты. Логика простая: если игра идёт на нём, она пойдёт почти у всех.

Планку я поставил заранее: 1920×1080, высокие настройки, 60 кадров в секунду, и видеокарте на кадр не больше 14 мс из 16,7. Мерю только от сети, после десяти минут прогрева и на свободной машине, иначе цифры врут.

Четыре тяжёлых сцены сейчас укладываются так (95-й процентиль времени видеокарты на кадр):

  • поле боя — 3,7 мс;
  • крупный просмотр карты — 4,7 мс;
  • худший случай, поле с просмотром и десятком эффектов сразу, — 5,6 мс;
  • коллекция, где на экране десятки карт с артом, — 10,0 мс.

Коллекция самая дорогая, и так было с самого начала. Включение mip-уровней у арта сделало её сетку в пять раз дешевле. Ещё 16 % кадра в главном меню отыграл, когда перестал перерисовывать листовки, которые не меняются.

Арт карт поначалу лежал в сборке огромными PNG: вместе с интерфейсом 234 МБ. Я перевёл его в webp нужного размера, и стало 20,6 МБ. Загрузка боя ускорилась с шести секунд до трёх с небольшим, а когда бой научился брать арт из общего кеша с меню, до полутора.

Больше всего меня порадовал ИИ-соперник. Он думает перебором: на каждый ход разыгрывает в уме сотни вариантов. В начале одна партия ИИ против ИИ занимала 94 мс. Я по одной проверял гипотезы, и каждую с замером до и после: свой быстрый ключ для склейки одинаковых позиций сразу дал −54 %, потом пул позиций вместо копирования, лёгкая сводка стола для оценки, ключ, который пересчитывается только для изменившихся карт. Сейчас партия занимает 15 мс. Это больше 200 тысяч партий в час на одном ядре, а для подбора баланса мне нужно пять тысяч.

Не всё прошло. Декодирование картинок своими силами в нескольких потоках оказалось медленнее, чем у движка, и я его выкинул. Сборка с усиленной оптимизацией компилятора давала около 4 %, и её я тоже не взял: правило такое, что ниже 5 % выигрыш не стоит усложнения. Каждое такое решение я записываю с цифрами, даже отвергнутое.

04.10.2026запись 24

Карта-листовка и новый стол

дизайнинтерфейсинструменты

Экран боя был черновым: всё в одну колонку по центру, по высоте упиралось в край, лидер нависал над рукой, а корабль и засады были строками текста. Доводить бой и карты без макета смысла не было, так что этот шаг целиком про внешний вид.

Для перебора вариантов я сделал конструктор макетов. Элементы карты, жетона и экрана раскладываются мышью и сразу сохраняются, а варианты стоят рядом в натуральную величину, как в руке и на столе.

Карта стала листовкой «разыскивается»: портрет во всю ширину, под ним чёрная полоса с именем, ниже бумага с правилами. Стоимость в левом верхнем углу, потому что в веере руки видна левая часть карты. Атака и здоровье выбиты штампом в нижних углах, защита столбиком над здоровьем. В руке читаются числа, имя и значки, а весь текст правил виден, когда карта поднимается под курсором.

Персонаж на поле стал медальоном: круглый портрет в бумажном кольце, вокруг значки: как он бьёт, к чему устойчив, какие на нём эффекты. У каждого слоя своё место, и эффекты состояний никогда не закрывают атаку и здоровье.

Слева на столе лидеры, между ними история ходов. В чужой ход игрок ничего не делает, и история показывает, что сделал соперник. Справа колода, ресурс, корабль, ловушки и кнопка конца хода. Центр свободен для рядов и боя, а под своими персонажами появились крупные кнопки приёмов.

Следующий шаг — набор бумаги, штампов и значков в одном стиле. Три способа его сделать я сравню вслепую, а выбранный перенесу в игру.

03.10.2026запись 23

Соперник, который думает, и пять тысяч партий за пять минут

кодиибаланссимуляции

До этой вехи соперник выбирал случайный допустимый ход. Теперь он думает.

Перед каждым решением ИИ перемешивает всё, чего не видит: свою колоду, руку и колоду противника, его засады (в пределах их цвета, который видит и игрок). Ход он планирует на одной из возможных версий партии, так что подсмотреть чужие карты не может даже случайно. Он перебирает цепочки действий до конца хода, отбрасывает повторы позиций и оценивает каждую по весам: здоровье лидеров, силы на столе, карты в руке, засады. Веса лежат в данных, и другой характер соперника — это другой файл весов. Сделав первое действие лучшей цепочки, ИИ смотрит, что изменилось, и думает снова.

Случайного игрока он обыгрывает в 399 партиях из 400 и тратит на решение миллисекунды. Уровней сложности три: на лёгком он смотрит меньше вариантов и иногда ошибается с ходом.

Прогон симулятора описывается файлом: колоды, игроки, число партий. Партии идут порциями на нескольких ядрах, каждая порция сразу ложится на диск, и после обрыва прогон продолжается с места остановки. Итог не зависит ни от обрыва, ни от числа потоков. 5 000 партий ИИ против ИИ занимают на ноутбуке пять минут.

Первые прогоны нашли две проблемы. Первый ход выигрывал 73 % партий. Я проверил все заранее записанные способы компенсации второму игроку: лишнюю карту, запас Воли, пропуск добора у первого игрока в его первый ход и их пары. Лучший давал 58 % при цели 50 ± 3. Из вариантов сильнее в цель попал один: второй игрок получает две лишние карты и одну Волю в запасе, а первый не берёт карту в свой первый ход. Вышло 50,2 %, его я и принял.

Колода «Ловушки» проигрывала, и наполовину по вине ИИ: засады он почти не ставил, потому что засада на столе стоила в его оценке меньше той же карты в руке. После исправления «Ловушки» подтянулись, но остальным колодам всё ещё проигрывают, так что дальше правлю карты.

Все эти выводы пока сделаны на партиях ИИ против ИИ. Проверят их живые люди на закрытом тесте.

03.10.2026запись 22

Шестьдесят одна карта первой версии

кодконтентлоринструменты

После третьей вехи правила работали на нейтральных тестовых картах. На четвёртой в игру пришёл настоящий набор первой версии, 61 карта: Мугивары, их приёмы, заклинания, модули корабля и три капитана.

Карта — это текстовый файл с данными: стоимость, характеристики, эффекты из закрытого словаря механик. Текст правил собирается из них на русском и на английском, и много сил ушло на то, чтобы он выходил коротким и правильным: «3 раза: нанести 1 урон…» вместо трёх одинаковых фраз, «…своему персонажу, он получает…» вместо повтора цели.

При каждой сборке автоматически проверяется:

  • правила дизайна: на карте не больше двух ключевых слов, приём добавляет не больше одного, «Рывок» и «Снайпер» вместе не встречаются. Исключение допускается с записанной причиной;
  • три строки: движок без окна верстает каждую карту, как в игре, на обоих языках;
  • срабатывание способностей: случайные партии на всём наборе идут, пока каждая из 54 способностей, приёмов и модулей не сработает хотя бы раз, и каждая партия играется дважды с одинаковым итогом;
  • линейка ценности: очки карты против нормы для её стоимости. Персонажи совпали с расчётом, у заклинаний есть расхождения, их уточнят симуляции следующей вехи.

Для сверки с каноном появилась база знаний по лору: снимки английской, русской и японской вики в локальной базе. Она знает награду персонажа на конкретной главе, момент его вступления в команду и тип фрукта на то время. Сверка задала мне два вопроса: в выбранных версиях Робин и Фрэнки на конец своих арок ещё не в команде, а русская вики пишет «Дзимбэй», а не «Джинбэй».

Ещё появилась галерея со всем набором на одном экране. Если поменять файл карты, игра сама перечитает и проверит данные и переиграет текущую партию с теми же ходами. Если ход стал невозможен (скажем, карта подорожала), переигрывание остановится и покажет причину.

03.10.2026запись 21

Все правила первой версии уже в коде

кодrustgodotправила

После «ходячего скелета» игра умела самое простое: выставить персонажа, атаковать, победить. В третьей вехе в код легли все правила первой версии:

  • Засады. Карта лежит в зоне лицом вниз и срабатывает на ход противника: атаку, розыгрыш персонажа или заклинания, гибель вашего персонажа. Засада может отменить заклинание.
  • Модификаторы: приёмы и предметы персонажа за Волю, одни разовые, другие с перезарядкой.
  • Корабль и его модули, капитаны, барьер и броня у персонажей.
  • Типы урона, иммунитеты, сопротивления и уязвимости.
  • Выбор посреди эффекта: игрок смотрит верх колоды, выбирает карту, и эффект продолжается.
  • Смерти пачкой: если в одном обмене гибнут несколько персонажей, их последние эффекты срабатывают по порядку выхода на поле.
  • Муллиган, предел ходов и защита от бесконечных цепочек эффектов.

Каждую механику уже можно сыграть мышью, пока в минимальном виде. Для отладки позиция партии собирается из текстового сценария, а ход событий проходится по шагам.

На каждую механику есть тест и короткая запись партии, записи сверяются при каждой сборке. Случайные партии на наборе всех механик проверяют то, что должно держаться всегда: скрытое не видно сопернику, недопустимый ход ничего не меняет, одна и та же партия дважды идёт одинаково. Копия состояния игры занимает 0,57 микросекунды при пороге в 5. Это пригодится ИИ-сопернику, которому предстоит перебирать ходы.

Перед закрытием вехи весь свежий код прошёл ревью и нашлись три тонкие ошибки правил, которые случайные партии не ловили. Например, «убийцей» считался последний, кто ранил персонажа, хотя смертельный удар нанёс другой. В новом сетевом коде нашлись тихие ошибки: один отвергнутый файл мог навсегда остановить отправку логов. Всё исправлено, и у каждой правки есть тест, который до неё падал.

Ещё в этой вехе появились черновой английский перевод, сбор логов для будущих тестеров и проверка на сборочном сервере, что текст карты не длиннее трёх строк на обоих языках.

Живых тестеров я позову только на готовую первую версию. До тех пор игру проверяют автоматические прогоны и мои собственные партии.

02.10.2026запись 20

Первая партия от начала до победы

кодrustgodotправила

Теперь партию можно сыграть мышью от первого хода до победы. Карты пока тестовые, без арта и эффектов, зато партия проходит через все части игры, и каждая работает по-настоящему. Такую сборку называют «ходячим скелетом».

Экран боя: полный ряд у обоих игроков и рука из десяти карт (тестовые карты без арта)
Экран боя: полный ряд у обоих игроков и рука из десяти карт (тестовые карты без арта)

Что уже есть:

  • Правила: ход, Воля, добор, розыгрыш персонажа с эффектом «Выход», атака, ключевое слово «Прикрытие», барьер и броня, гибель, усталость при пустой колоде, победа и ничья. Правила отделены от экрана, ими одинаково пользуются игра, ИИ-соперник и симулятор.
  • Экран боя. Карту перетаскиваешь в ряд на нужное место, для эффекта с целью выбираешь цель, атакуешь тоже перетаскиванием. Карта под курсором приподнимается и чуть наклоняется за мышью.
  • ИИ-соперник пока ходит случайно, но уже думает в отдельном потоке и видит только то, что видел бы игрок. В чужую руку он не подглядывает.
  • Запись каждой партии, которую можно воспроизвести. После каждого хода сверяется «отпечаток» состояния, и расхождение сразу видно с номером хода.
  • Тексты. В коде нет ни одной строки для игрока, текст карты собирается из её данных, а «псевдоязык» показывает, где текст не влез или забыт перевод.
  • Шрифты со свободной лицензией и проверка, что в них есть все буквы.

Тысяча случайных партий ИИ против ИИ проходит меньше чем за десятую долю секунды, без единой ошибки. Полное поле из 14 персонажей и рука из десяти карт занимают встроенную видеокарту моего ноутбука (Radeon Vega 6) примерно на 1,3 мс из 16,7 мс, отведённых на кадр, и это после десяти минут прогрева.

По ходу я принял два решения по правилам: место персонажа в ряду выбирает игрок, а персонаж с атакой 0 атаковать не может.

Проверял игру бот. Он сыграл несколько партий «синтетической мышью», снимал кадры, искал обрезанный текст и элементы за краем экрана, сверял записи партий. Мне остались решения по правилам и по виду эффектов.

Дальше — полный набор правил: остальные ключевые слова, засады, модификаторы, корабль. Потом первые партии с живыми людьми.

01.10.2026запись 19

Связка Rust и Godot выдержала

кодrustgodot

Самый большой технический риск проекта в том, что правила пишутся на Rust отдельно от движка, а экран и анимации делает Godot. Окажись связка неудобной, клиент пришлось бы переписывать. Поэтому до основного кода я собрал пробный прототип и прошёлся по списку всего, что нужно карточной игре.

Пробная сцена: карту перетащили в ряд, и на ней играет эффект взрыва
Пробная сцена: карту перетащили в ряд, и на ней играет эффект взрыва

Что заработало:

  • рука: карта приподнимается при наведении, её можно перетащить мышью в ряд;
  • розыгрыш: игра получает действие «сыграть карту», отвечает событиями, и клиент проигрывает их по очереди (полёт карты, эффект, расход Воли), не принимая новых действий, пока идёт анимация;
  • текст правил с подсвеченным ключевым словом, иконкой Воли прямо в строке и подсказкой при наведении;
  • сетка из 45 карт с прокруткой для будущего конструктора колод;
  • эффект взрыва из редактора частиц, в котором я делаю все эффекты;
  • сборка под Linux и Windows.

Больше всего порадовала скорость: от правки кода до картинки на экране 2–3 секунды, а открытый редактор подхватывает новый код сам.

Один подводный камень нашёлся. Движок иногда вызывает мой код изнутри моего же кода, и связка падает. Для таких мест я вывел простое правило и записал его.

Каждый пункт проверялся автоматически: скрипт снимал кадры и раскадровки игры и выгружал устройство экрана, мне оставалось посмотреть итог.

Следующий шаг — «ходячий скелет», первая настоящая партия против ИИ-соперника от первого хода до победы.

01.10.2026запись 18

Игру зовут Tidewill

дизайнинтерфейс

У проекта было только рабочее название, теперь появилось настоящее: Tidewill. Полностью игра называется «One Piece: Tidewill», это неофициальная фан-игра.

Главный ресурс в бою называется Воля. На неё разыгрываются карты, и каждый ход её становится больше, как поднимается прилив. Отсюда «воля прилива». Я перебрал около двадцати морских слов: почти все заняты другими играми, а это свободно. Пишется латиницей на всех языках, как Hearthstone.

Шрифты я выбирал в «примерочной»: макеты настоящих карт на двух языках в трёх размерах (в руке, при наведении, крупно) и счётчик строк, ведь текст правил должен влезать в три строки. Победила пара: компактная Fira Sans Condensed, которая хорошо читается мелким кеглем, для правил и интерфейса и тяжёлая Russo One для имён карт и цифр атаки и здоровья. Флейвор идёт курсивом основного шрифта. Оба шрифта свободные, с полной кириллицей. Выбор рабочий, утвержу его, когда появятся настоящий интерфейс и рамка карты.

И несколько решений для будущих онлайн-дуэлей:

  • В партии общаются короткими фразами вроде «Хорошая игра», соперника можно заглушить. Свободного чата не будет: модерировать его некому, а фразы уже переведены на оба языка.
  • Реплей своей партии смотришь только со своей стороны, рука и колода соперника скрыты и после боя.
  • Колода фиксируется, когда встаёшь в очередь. Править её, пока ждёшь, можно: изменения пойдут в следующий бой.
01.10.2026запись 17

Карта производства и правила для своих инструментов

инструментыпроцесс

Игру я делаю один, и многое держится на инструментах. Чтобы в них не утонуть, я нарисовал полную карту производства: от идеи карты или миссии через данные, проверки, баланс, арт, анимацию, эффекты, звук, сценарий и перевод до релиза. Вышло 19 этапов, и для каждого я записал, кто что делает и где всё застревает.

Застревает всё на проверке, и этого я не ждал. Арт генерируется, карты пишутся, тысячи партий считаются сами, а красиво ли, интересно ли и честно ли, решаю только я. Поэтому каждый мой инструмент обязан ускорять эту проверку: показывать все карты одним листом, ставить варианты рядом, выдавать короткий отчёт «что изменилось».

Правила для своих инструментов:

  • сначала беру готовое, потом готовое со своими скриптами, и только потом пишу своё;
  • первая версия укладывается в один рабочий день, иначе останавливаюсь и ищу путь проще;
  • на новые инструменты уходит не больше пятой части времени этапа;
  • всё хранится текстом, чтобы скрипты могли сами это читать, править и проверять.

Дальше разбираю инструменты по одному. Первыми идут кадры игры по команде и офлайн-справочник по движку.

01.10.2026запись 16

Игра заговорит по-английски

локализацияинструменты

Игра пишется на русском, но второй язык я закладывал с самого начала. Теперь решил, как устроить английский.

Текст на картах никто не пишет руками: он собирается из данных карты по шаблонам вида «нанесите N урона цели». Поэтому перевести игру значит перевести около сотни шаблонов, а не каждую карту. Заодно текст карты не может разойтись с тем, что она делает.

Что я закрепил:

  • Грамматику описывает сам язык, программа о ней ничего не знает. В русском у цели меняется падеж («персонажу противника» / «персонажа противника»), в английском артикль (an enemy character / the enemy character). Новый язык добавляется без правки программы.
  • Рядом с каждым новым русским шаблоном сразу появляется английский черновик, так видно, влезает ли текст карты в три строки на обоих языках.
  • Имена пишутся, как привыкли фанаты, по вики. Названия механик свои, терминов официальной карточной игры у меня нет.
  • У каждого термина одна запись в словаре на русском, английском и японском, с главой манги, где он впервые появился. Программа проверяет, что термин везде переведён одинаково.
  • Для проверки есть «поддельный язык». В отладочной версии весь текст превращается в «Ħeeŀŀoo Ẇoořŀḓ», на треть длиннее и с диакритикой. Если надпись осталась обычной, её забыли отправить в перевод. Если обрезалась, дело в вёрстке.

Черновик перевода собирается по словарю и правилам стиля, а каждую строку перед выходом я читаю сам. Для корявых фраз в английской версии у тестеров будет отдельный канал.

01.10.2026запись 15

Как будут выглядеть удары

эффектыинструменты

Огонь оранжевый, холод голубой, молния жёлто-фиолетовая: тип урона должен читаться по цвету, без текста. Это одно из правил, которые я закрепил для эффектов: огня, разрезов, молний, лечения, оглушения.

Эффект собирается из частей:

  • взрыв, пламя, след клинка или молнию я рисую в редакторе частиц и сохраняю готовой анимацией, потому что такое движок на слабом железе вживую не потянет;
  • вспышку попадания, свечение и статусы вроде «Скован» делаю прямо в движке на самой карте;
  • полёт атаки от карты к карте тоже считает движок, ведь расстояние и угол каждый раз разные;
  • вес удару дают короткий стоп-кадр и лёгкая тряска экрана.

Сильный удар крупнее и сильнее трясёт экран, хотя эффект тот же. Обычный эффект длится меньше секунды, и кнопка «ускорить» сжимает и его. Тряску и вспышки можно ослабить или выключить в настройках, а частых ярких вспышек в игре не будет совсем.

Редактор частиц сделал другой разработчик и выложил под открытой лицензией. Я доработаю его под игру (экспорт одной командой, отметка момента удара) и буду забирать к себе удачные обновления автора.

Для первой играбельной версии нужно около 14 базовых эффектов. Сначала сравню на слабом ноутбуке три способа сделать один огненный удар, потом возьмусь за остальные.

01.10.2026запись 14

Сверяю лор на трёх языках

лоринструменты

Фанаты One Piece замечают любую неточность: не та награда за голову, не тот порядок событий, герой оказался там, где его по сюжету ещё не было. Поэтому справочник по миру я собираю из открытых источников на трёх языках:

  • английская фанатская вики самая подробная, у каждого факта там ссылка на главу манги;
  • японская Википедия даёт взгляд тех, кто читает мангу в оригинале, и японские имена;
  • русская фанатская вики хранит устоявшиеся написания имён и терминов, а игра выходит сначала на русском.

Последнее слово за мангой. Сцену, которую добавило аниме, взять можно, но с пометкой, а если аниме с мангой расходится, верна манга.

У фактов есть время. Карта персонажа — это его версия из конкретной арки, и награда на ней та, что была тогда. Зоро в начале истории вообще не разыскивается.

Когда источники спорят, решаю сам и записываю, чтобы не спорить второй раз. Всё придуманное мной помечаю как своё. Тексты энциклопедий в игру не попадают: описания карт и сцены сюжета я пишу сам.

Первая версия справочника появится, когда начну переносить карты в игру. Сначала проверю по нему десять карт команды Соломенной Шляпы.

01.10.2026запись 13

Как я собираю боссов

кампанияинструменты

В сюжетной кампании будут десятки боёв: дуэли, боссы с особыми правилами, бои на выживание, головоломки. Новый бой должен собираться за минуты.

Босс собирается из того же конструктора, что и карты: здоровье, защита, колода и одно-три правила поля вроде «каждый ход пушка бьёт по случайному персонажу». Правила складываются из тех же действий, что и эффекты карт, так что новый босс почти никогда не требует нового кода. Так делали боссов в приключениях Hearthstone и в Path of Champions у Legends of Runeterra, и мне этот подход нравится.

Путь от идеи до боя:

  • я описываю идею словами, она превращается в данные, и проверка сразу ищет ошибки;
  • получается лист миссии: противник, правила, условие победы, награда;
  • за несколько минут компьютер играет с боссом пару сотен партий колодой неопытного игрока и говорит, проходим ли бой;
  • бой можно сразу сыграть в тестовом режиме и перезапустить с той же раздачей;
  • ночью длинный прогон подбирает лучшую колоду против каждого боя острова.

Честный ли бой, покажут числа. Интересный ли, покажет только партия, поэтому каждого босса и каждый необычный бой я прохожу сам.

Между боями идут короткие диалоги с портретами героев. Факты в них я сверяю с вики по One Piece, а придуманное мной помечаю как своё.

Первого тестового босса соберу ещё до первой играбельной версии, чтобы заранее пройти весь путь.

01.10.2026запись 12

Справочник ровно под мою версию Godot

инструментыкод

Игру я делаю на Godot, код пишу на Rust. Справка по движку, которая попадается под руку, перемешана: что-то из Godot 3, что-то из свежего Godot 4. Неправильное название функции заметит компилятор. А то, что эффект частиц не работает в режиме, на котором идёт игра, всплывёт только на экране.

Поэтому я собираю свой справочник. Godot умеет сам выгрузить описание всех классов с пометками, где что не работает, и я беру его из той самой сборки, на которой делаю игру. Рядом лежат руководства по шейдерам и частицам, документация связки Rust и Godot и самого Rust, тоже по закреплённым версиям. Интернет не нужен, а после обновления движка всё пересобирается одной командой. Онлайн-документация остаётся про запас: мою версию она знает только примерно.

Сначала проверю, есть ли польза. Десять типовых вопросов про движок, на каждый три ответа: по памяти, по онлайн-документации и по справочнику. Сравню точность и сколько уходит на поиск. Сделаю это в начале работы над первым прототипом клиента, и если справочник не окажется лучше, лишнего строить не буду.

01.10.2026запись 11

Как я буду слушать первых игроков

плейтестыинструменты

Кроме меня, первыми в игру сыграют один-два друга, потом небольшой закрытый круг. Их впечатления я собираю из трёх источников.

  • Записи партий показывают, что игрок сделал: сколько думал над ходом, какие карты рассматривал, куда пытался положить карту и не смог.
  • Наблюдение показывает, почему. Первую партию тестера я смотрю молча и только отмечаю, где он спросил или застрял. Любая подсказка спрятала бы проблему, на которую потом наткнулся бы каждый новый игрок.
  • Разговор показывает, важно ли это. После третьей партии мы вместе смотрим запись его игры: «Что ты тут думал? Чего ждал?»

После партии игра спрашивает «понятно было?» и «интересно было?», оба вопроса пропускаются одним кликом. Если тестер согласился при первом запуске, записи партий приходят мне сами. Имён в них нет, только код тестера.

Труднее всего не обмануть себя маленькими числами. По десятку партий не скажешь, сильная карта или слабая, поэтому в отчёте у каждого числа написано, на скольких партиях оно посчитано, а один раздел так и называется: «чего сказать нельзя». Тонкий баланс я по-прежнему проверяю тысячами партий компьютера против компьютера. От людей мне нужно другое: где игра непонятна или скучна и играют ли они так, как предполагает компьютерный противник.

Интерес я буду мерить по тому, сыграл ли человек ещё партию, когда его никто не просил.

01.10.2026запись 10

Персонажи начинают дышать

анимацияинструменты

Карты в игре уже двигаются, а арт живёт за счёт параллакса и бликов. Теперь очередь самих персонажей, прежде всего лидеров, которые стоят на поле всю партию.

В цифровых карточных играх полноценную анимацию обычно получают только «герои», остальные карты оживляют эффектами поверх картинки. Я делаю так же.

Первую пробу я сделал прямо на арте Зоро. На картинку натянута невидимая сетка из полутора тысяч точек, под ней 11 «костей»: таз, грудь, голова, руки, мечи, полы одежды. Кости чуть поворачиваются, сетка гнётся за ними, и персонаж дышит, а от удара отшатывается.

Резать картинку на части и дорисовывать спрятанное под руками не нужно. Описание занимает несколько десятков строк текста, остальное строит мой небольшой инструмент, и даже на слабом компьютере такой персонаж почти ничего не стоит.

Пределы есть. Мечи на цельной картинке гнутся вместе с одеждой, это поправлю разметкой «жёстких» предметов. Замах так не сделать: для него попробую раскладывать арт на части с помощью ИИ.

В первой играбельной версии три лидера будут дышать и реагировать на урон, победу и поражение. Позже так же оживут портреты в сюжетных диалогах и особые анимированные версии карт. Весь арт в игре сделан с помощью ИИ.

01.10.2026запись 9

Первый код: случайность, которая повторяется

кодrust

Проектирование закончено, и у игры появился первый код. Играть в него пока нельзя, это фундамент для правил.

В карточной игре случайно почти всё: тасовка, добор, выбор цели. При этом партию нужно уметь переиграть ход в ход. По записи партии я буду искать ошибки, проверять баланс на тысячах партий и показывать повторы. Поэтому вся случайность в игре идёт от одного числа-«зерна», и одно и то же зерно на любом компьютере даёт одну и ту же тасовку.

Что сделано:

  • свой генератор случайных чисел на известном алгоритме PCG. Его выдачу, включая бросок кубика и тасовку колоды из 52 карт, я сверил с эталоном автора алгоритма, и совпало всё до последней карты;
  • у правил, у ИИ-соперника и у будущей добычи свои потоки случайности. Если соперник «подумает» лишний раз, тасовка колоды не сдвинется;
  • «отпечаток» состояния партии одним числом. Если два прогона одной партии разошлись хоть в одной карте, отпечатки разные, и сразу видно, на каком ходу;
  • в коде правил запрещены дробные числа, системное время и коллекции с непредсказуемым порядком. Запрет проверяет сборка: нарушишь его, и код не соберётся;
  • автоматические проверки на Linux и Windows при каждом изменении: сборка, линтер, тесты.

Следующий шаг — пробный запуск движка. Хочу убедиться, что связка Rust и Godot выдержит то, что я задумал.

01.10.2026запись 8

Стиль карт: цветная манга

артинструменты

Арт я генерирую локальными моделями на своём компьютере. Пять раундов сравнения, около 1300 картинок, и каждую я оценил вручную. Победила цветная манга. Теперь нужно, чтобы весь набор выглядел нарисованным одной рукой: для этого я обучу свою стилевую модель на лучших артах.

Макет карты — «окно»: арт сверху, текст на отдельной плашке, чтобы всегда читался. Под именем персонажа стоят его команда и арка. Предметы рисуются крупным планом, приёмы в действии. Для первой версии нужна 61 картинка.

Анимированные карты оживит шейдер: глубина, параллакс, частицы, фольга. Видео ещё попробую. Проверяю всё на слабом ноутбуке: если игра идёт на нём, пойдёт почти везде.

Дольше всех модели не давался Гир 5: персонаж выходил крошечной фигуркой в облаках. Помогли точное название формы и крупный план.

Дальше на очереди база по лору для сценария, редактор миссий, звук и анимация.

01.10.2026запись 7

Сколько стоит объёмная карта на слабом ноутбуке

клиентпроизводительность

Прежде чем решать, какой будет объёмная карта, я померил обе версии на том самом слабом ноутбуке, на котором делаю игру: EliteBook 745 G5 со встроенной графикой Radeon Vega 6.

Карта из настоящего 3D-меша с рельефной рамкой в полмиллиона треугольников отнимает больше половины кадра, даже когда она одна на пустом экране. В самом тяжёлом режиме игра падает примерно до 20 кадров в секунду, а карт на экране будут десятки.

Плоской карте объём дают шейдеры: наклон, параллакс слоёв, ложный свет на рамке, фольга. 40 карт коллекции или поле с рукой, увеличенной картой и десятком эффектов укладываются примерно в четверть бюджета кадра.

Больше всего меня удивили mip-уровни текстур. Без уменьшенных копий картинок сетка коллекции стоила в пять раз дороже. Одна галочка при импорте дала больше, чем выбор движка рендера.

Что я решил:

  • карты остаются 2D, а рамку я один раз леплю в 3D и запекаю в карты нормалей и блеска;
  • цель — стабильные 60 кадров, в самые тяжёлые моменты не ниже 30;
  • в настройках будут качество «низкое/высокое» и ограничение частоты кадров;
  • свёрнутая игра почти не нагружает ноутбук.

Этот замер я повторю на первом клиенте игры, а потом буду гонять его после каждой правки эффектов.

01.10.2026запись 6

Как будет звучать бой

звукмузыкаинструменты

Удар без звука — как удар в вату. Я решил, откуда возьмутся звуки и музыка и как сделать, чтобы они не надоедали.

Музыки, мелодий и голосов из аниме в игре не будет, даже каверов опенингов. Звуки ударов и эффектов я генерирую на своём компьютере открытыми ИИ-моделями, лицензии которых разрешают свободно раздавать результат, и пишу об этом прямо в игре. Звуки интерфейса беру из библиотек, которые авторы отдали в общественное достояние. Музыка тоже своя: попробую приключенческий оркестр с морским колоритом и пиратский фолк с аккордеоном и скрипкой, а выберу на слух.

В бою:

  • у каждого типа урона свой удар: огонь шипит и трещит, холод звенит, молния щёлкает, а сильный удар звучит тяжелее слабого;
  • звук попадает ровно в кадр попадания, вместе со вспышкой;
  • у каждого звука несколько вариантов, чтобы десятый удар подряд не звучал как пулемёт;
  • когда здоровье одного из капитанов падает до трети, музыка становится напряжённой: развязка близко;
  • громкость музыки, эффектов и интерфейса настраивается отдельно, а играть можно и без звука, вся информация есть на экране.

Голосов персонажей в первой версии не будет: синтезировать голоса героев под актёров аниме я не стану.

Для первой играбельной версии нужно около тридцати звуков с вариантами и несколько треков. Начну с того, что сравню на слух сгенерированные удары с библиотечными и сделаю пробный боевой трек.

01.10.2026запись 5

Дневник становится открытым

проектсообщество

До сих пор я вёл дневник для себя, черновиком. Теперь он станет открытым.

Полная история лежит на сайте. В Telegram выходят посты на русском, в Bluesky короткие заметки на английском. Позже появится сервер в Discord для обсуждений.

На сайт попадает каждая запись, а в соцсети уходит не больше двух постов в неделю, чтобы не засыпать вас мелочами.

Пишу о правилах и механиках, о том, почему решил именно так, об инструментах, показываю «было → стало». Это фан-проект, игру я делаю один в свободное время, поэтому сроков не обещаю. Денег проект не берёт: ни донатов, ни рекламы, ни платного контента. Если картинка сделана с помощью ИИ, это написано прямо под ней.

01.10.2026запись 4

Как проверки будут смотреть на экран

инструменты

Тесты экрана не видят. Текст может вылезти за карту, анимация может дёргаться, и ни один тест этого не заметит. Поэтому я решил, как автоматика будет смотреть на игру.

Способы я расставил по цене, дешёвые пробуются первыми:

  • числа и записи партии: что произошло, сколько кадров в секунду, сколько памяти;
  • устройство экрана: какие элементы есть, где они стоят, сколько строк занимает надпись;
  • снимок экрана, когда важно, как всё выглядит;
  • раскадровка для анимаций и эффектов, десяток кадров на одной картинке.

Опробовал это на пустом пробном проекте. Проверка сама запустила игру, сделала снимок, прочитала устройство экрана и посчитала строки в подписях. Слишком длинное имя персонажа заняло четыре строки, и она это поймала.

Основной способ — снимки по заранее заданной ситуации: одинаковая раздача и один и тот же момент партии, поэтому кадр каждый раз выходит тот же. К запущенной игре можно подключиться вживую, но только смотреть, менять сцены так нельзя. Для отладки будут готовые позиции (нужные карты на руке и на поле) и отладочные команды. Каждая команда пишется в журнал партии, так что отладочную партию можно повторить ход в ход. В сборке для игроков этих команд нет.

Проверки ловят то, что сломалось. Красиво ли вышло, решаю я сам. Первым их испытанием станет пробный запуск движка.

30.09.2026запись 3

Фракции, кампания и первый набор карт

геймдизайнкампаниябаланс

Резиновый Луффи иммунен к удару и молнии, но уязвим к резу. Всего типов урона пять (удар, рез, огонь, холод, молния) плюс урон без типа, и к каждому персонаж может быть иммунен, устойчив или уязвим.

Фракций шесть: Морской дозор, Ёнко, Пираты, Революционеры, Мировое правительство и Кросс-Гильдия, плюс нейтральные персонажи. Ещё у персонажа есть группы вроде «Мугивар» или «Худшего поколения». Колоду фракция не ограничивает.

Кампания идёт по аркам, а на островах есть параллельные ветки и чекпоинты. Версия 1.0 охватывает сагу Ист Блю.

В первом наборе 10 Мугивар в версиях арок, где они вступили в команду, 25 модификаторов, 15 заклинаний, 3 капитана и 8 модулей корабля. Хаки я отдал модификаторам как «приём из будущего».

Для баланса я спроектировал исследователя колод: он сам собирает и испытывает колоды, чтобы слишком сильные сочетания нашлись раньше игроков.

29.09.2026запись 2

Фан-игра без денег и со своими правилами

проект

Я решил, на каких условиях игра выйдет к людям.

Это неофициальная фан-игра, некоммерческая и бесплатная. Денег в ней не будет ни в какой форме, включая донаты, рекламу и платные сборки.

Официальную карточную игру я не копирую: дизайн, рамка карт и названия механик у меня свои. Кадров из манги и аниме в игре не будет. Арт я делаю с помощью ИИ на своём компьютере и честно помечаю это на странице игры и в титрах. Голоса и музыку из аниме я тоже не беру, звук будет свой.

Сначала будет закрытый тест для небольшого круга, потом открытая альфа.

28.09.2026запись 1

Отдать швартовы: сначала правила, потом код

геймдизайнархитектура

Проект я начал с документа и первым делом ответил на пятнадцать больших вопросов о том, какой будет игра.

Партия — дуэль один на один, как в Hearthstone, по плану на 10–15 минут. Ресурс называется Волей. У каждого игрока есть капитан и свой корабль, и модули корабля меняют стиль игры.

Оружие, предметы и приёмы персонажей стали модификаторами. Места в колоде они не занимают: их подбирают персонажу в редакторе колоды, а в бою включают за Волю. Меч Зоро и «Гому-гому Гатлинг» Луффи как раз модификаторы.

Крафт идёт по чертежам, без случайности в результате. Улучшенная карта становится анимированной вариацией, это чистая косметика. В словаре механик девять ключевых слов и ещё лор-механики, знакомые любому фанату.

Клиент делаю на Godot 4, весь код пишу на Rust. Ядро правил детерминированное: любую партию можно переиграть из реплея, а ИИ-соперники сыграют тысячи матчей для проверки баланса.

Последним я составил план: вехи от фундамента до закрытого плейтеста.