Пять игр в меню
Русские и международные шашки, апокачи, поддавки, «Чапаев». У каждой — свой доменный движок, своя доска и свой клиентский модуль.
- checkers
y83 projects / 05 / php + typescript + phaser
в продакшне · 2026
Пять игр в меню: русские и международные шашки, апокачи, поддавки и «Чапаев» с физикой на Rapier. Ещё два движка — шахматы и морской бой — дописаны и ждут включения. Под каждым ходом стоит движок: бот шашек считает альфа-бета с таблицей транспозиций, шахматный анализ запускает настоящий Stockfish в браузере, а партию можно разобрать ход за ходом с оценкой каждой позиции.
продукт
Сделать игровую площадку, где партия идёт прямо в Telegram, и не скатиться в набор контроллеров: пять разных правил на доске разъезжаются, если у них нет явных границ, а партия в браузере разваливается, если состояние не защищено от гонок.
Правила живут в value-объектах домена и проверяются на сервере — клиент не может отправить недопустимый ход. Клиент отвечает только за представление и анимацию: пять сцен Phaser, очередь анимаций и очередь ходов на случай обрыва связи.
Игру можно выключить и включить одним флагом в таблице games, а движок бота, анализ и повторы не знают, шашки это или шахматы: им нужны только правила и список ходов.
возможности
Семь движков в коде, пять игр в меню, 47 тысяч строк клиента.
Русские и международные шашки, апокачи, поддавки, «Чапаев». У каждой — свой доменный движок, своя доска и свой клиентский модуль.
Шахматный модуль — 7 665 строк: часы, HUD, дебютная книга, повтор. Обе игры не опубликованы: нет строки в таблице games.
Rapier вместо Matter.js: гравитация выключена, стен нет — по правилам шашки должны улетать с доски. Трение пересчитано по формуле, а не взято из старого движка.
Сцены регистрируются по типу игры. В партии с ботом сцена не поднимается вообще — лишний рендер не нужен.
Отдельная сцена на 1 431 строку: два героя с HP реагируют на ходы, у каждого шесть наборов кадров. Текст ников — свой растровый шрифт с транслитерацией кириллицы.
Тема собирает скин доски, скин фигур, стиль знаков и эффект взятия. Выбор сохраняется на сервере и приходит в следующей партии.
След, призрак, прыжок, молния, цепная реакция, конфетти, тряска камеры. Звуки не файлы, а буферы, которые генерируются через WebAudio; взятие добавляет вибрацию.
1 347 строк в Web Worker: negamax, итеративное углубение, Zobrist и таблица транспозиций, killer moves, оценка из 10 весов. Пять уровней — от случайного хода до 20 полуходов за 3 секунды.
Каждая позиция оценивается движком, ходы раскладываются по классам от brilliant до blunder, строится eval-график и текстовый вердикт. Считается в воркере, интерфейс не блокируется.
Анализатор поднимает Stockfish 18 из репозитория в воркере и говорит с ним по UCI: позиция туда, bestmove обратно, ход переводится в SAN.
У апокачи своя логика сэндвича и свой воркер с ботом, у морского боя — расстановка кораблей с автораскладкой и карусель выбора клеток.
При обрыве связи ход встаёт в очередь и уходит при восстановлении. Устаревшие ответы сервера отбрасываются по номеру последовательности — доска не откатывается назад.
Опрос состояния пропускается, когда идёт анимация, ход текущего игрока, перетаскивание фигуры или отправка хода. Причина пропуска названа явно.
Свой контроллер: «Переподключение, попытка N», ping/pong, замер RTT, кнопка обновить. Reverb и Laravel Echo с приватными и presence-каналами.
Комнаты с кодами и ролями, чат с реакциями и индикатором набора прямо в партии, рейтинг, дружба, недавние соперники.
Разбор последнего хода соперника прямо в партии и полный повтор отдельной сценой: шашки, шахматы, апокачи. История с фильтрами и постраничной выдачей.
Filament: 7 ресурсов и 8 виджетов, плюс Pulse. Рассылки с расписанием, отзывы, отладочные сессии.
GitLab CI: релизный каталог, общие .env и storage, миграции, кэши, переключение симлинка, health-check, хранение 5 релизов.
AGENTS.md описывает архитектуру и рецепт добавления игры из семи шагов. В нём же правило, выросшее из инцидента: не делать git checkout на файле с незакоммиченной работой.
План по шахматам: три задачи, у каждой требования, архитектурное решение и критерии приёмки с отметкой о проверке. Рядом — расследования и разбор техдолга.
Состояние, чат, очередь ходов, вебсокет, консоль, производительность, ошибки, анализ бота, сеть, ходы, обзор. Плюс счётчик FPS и памяти с перехватом запросов.
Каталог эффектов вынесен в отдельный экран: каждый эффект можно запустить отдельно от партии и отладить. Плюс дизайн-лаб и стайлгайд.
как работает
Ход уходит в домен, применяется к серверной доске и отклоняется с текстом ошибки, если он недопустим.
Доменное событие уходит в вебсокет-канал сессии — второй игрок получает его без опроса сервера.
Клиент проверяет номер последовательности, кладёт ход в очередь анимаций и рисует его с эффектом и звуком.
По той же событийной ленте герои реагируют на партию: атака, попадание, смена HP, финальная поза.
Партия остаётся в истории: её можно пересмотреть ход за ходом и прогнать через анализатор.
результаты
строк своего кода
PHP 51 499 + TypeScript 48 738 + Blade 16 204строк клиента
199 файлов TypeScript в Web Appдвижков в коде
пять игр опубликованы в менютестов
115 PHPUnit + 181 Vitestэффектов
плюс 6 типов взятия и 20 героевшагов деплоя
атомарное переключение симлинкаЦифры сверены с релизом 20260814121948 (30.09.2026).
экраны
Скриншоты будут добавлены позже; список экранов — реальный состав интерфейса.
листайте вбок · 9 экранов
Хаб
пять игр, вход в комнату по коду
Партия с ботом
сцена Phaser, выбор сложности и цвета
Полоса боя
пиксельные герои, HP, нотация хода
Панель внешности
7 тем, 14 скинов, эффекты взятия
Чат в партии
плавающая панель, реакции, набор текста
Повтор с анализом
eval-график и классификация ходов
Шахматы
часы, HUD, список ходов, название дебюта
«Чапаев»
физика на Rapier, рогатка, HUD бойца
Стенд эффектов
каталог анимаций отдельно от партии
технологии
этапы
четыре варианта шашек, лобби, вебсокеты, реалтайм
комнаты, чат, рейтинги, история, повторы, бот-соперник
Phaser-сцены, темы, эффекты, звук, полоса боя, анализ, Stockfish
код готов, не опубликованы — ждут включения в меню
вынос 296 локальных тестов (115 PHPUnit + 181 Vitest) в обязательный пре-деплой гейт GitLab Runner
вопросы
Семь движков в коде: четыре варианта шашек, «Чапаев», морской бой и шахматы. В меню сейчас пять — шахматы и морской бой дописаны, но им нет строки в таблице games, поэтому они не видны игроку. Включаются одним флагом.
Игровая логика в браузере самостоятельна: свой движок бота на альфа-бете с таблицей транспозиций, свой анализатор партии с оценкой каждой позиции, свой UCI-клиент к Stockfish. Всё это считается в Web Worker, чтобы интерфейс не подвисал. Правила при этом остаются на сервере — клиент только показывает.
По коду — да: домен на 1 163 строки, клиент на 7 665, часы, HUD, дебутная книга на 34 дебюта, анализ на Stockfish, повтор. План по правкам правил закрыт полностью, все три задачи проверены. Не опубликованы.
Ход, отправленный при обрыве связи, встаёт в очередь и уходит после восстановления. Устаревшие ответы отбрасываются по номеру последовательности, иначе медленный ответ откатывал бы доску назад. Таймаут хода проверяется на сервере по расписанию.
GitLab CI: lint (Pint и tsc), сборка, затем деплой из master в релизный каталог, общие .env и storage симлинками, миграции и кэши под artisan down, атомарное переключение симлинка, рестарт сервисов, health-check по домену, хранение пяти последних релизов.
Y83 Games
Игровая площадка в Telegram — бот @y83_checkers_bot: пять игр в меню и семь движков в коде. Сервер — PHP 8.3 и Laravel 13 с DDD: правила живут в value-объектах, ходы идут через Reverb WebSockets с SequenceGuard и MoveQueue, выкладка атомарная в 9 шагов. Клиент — вычислительные воркеры: Phaser 4.2, бот на альфа-бета с Zobrist-хешированием, разбор партий на Stockfish 18 WASM по UCI и физика Rapier 2D.