Я делаю математические модели для слот-машин. За 15 лет — больше 50 (а м.б. и 100) игр в продакшене. Каждый день я считаю RTP, волатильность и вероятности, чтобы казино гарантированно зарабатывало.
А потом я сделал игру, где казино не может выиграть. Вообще. Что это такое Duelastik — PvP-дуэль в реальном времени внутри Telegram. Два игрока, эластичная лента, шарик, 30 секунд. Представьте перетягивание каната, но с физикой. Каждый игрок двигает свой конец ленты слайдером. Шарик на пружине колеблется между ними. Задача — загнать его в зону противника, где начисляются очки. Заехал в штрафную зону — получаешь ещё больше, но и рискуешь. Партия длится 30 секунд. Этого хватает, чтобы адреналин подскочил, но не хватает, чтобы заскучать. После матча — реванш одной кнопкой. Не хочешь ждать живого соперника — можно сыграть против ИИ. Он не поддаётся.
Почему слот-математик делает скилл-игру Потому что устал от индустрии, где 90% продукта — клоны. Телеграм-игры повторяют ту же ошибку: сотни тапалок, кликеров и "play-to-earn", где зарабатывает только создатель. Мне хотелось сделать игру, где результат определяется реакцией и стратегией. Где нет генератора случайных чисел, который решает всё за тебя. Где два живых человека соревнуются в реальном времени, а не по очереди тыкают в экран. Профессиональная деформация помогла: я знаю, как балансировать механики. Физика шарика настроена так, что опытный игрок стабильно побеждает новичка — но за счёт резонанса пружины новичок иногда может удивить. Это не баг, это баланс.
Как это устроено внутри Telegram Mini App — это по сути веб-страница в WebView мессенджера. Ограничения жёсткие: мгновенная загрузка, мобильный экран, никаких фреймворков ради размера бандла. Фронтенд — один HTML-файл. Vanilla JavaScript, DOM-рендеринг, CSS-анимации. Никакого React, Vue или Canvas. Меньше 100 КБ всего. Бэкенд — Node.js с WebSocket. И вот тут ключевой момент: физика считается на сервере. Не на клиенте. Сервер гоняет пружинную модель (закон Гука + демпфирование) с частотой 60 тиков в секунду и раздаёт состояние клиентам 20 раз в секунду. Клиент только рисует и отправляет позицию слайдера. Это делает читерство бессмысленным: вы можете подменить клиент, но физику считает сервер.
Хостинг: Cloudflare Workers (статика) + Render (WebSocket). Стоимость инфраструктуры: $0 в месяц. С чем намучился Синхронизация. В PvP-игре задержка в 100мс — это катастрофа. Пришлось делать интерполяцию на клиенте, чтобы движение шарика выглядело плавным даже при потере пакетов. Серверный тик 60fps даёт запас. Telegram WebView. Это не обычный браузер. Некоторые API работают иначе, событие event.target в обработчиках может вести себя непредсказуемо. Fullscreen Mode требует пользовательского жеста. Safe area на iPhone отъедает пространство. Каждый баг — полдня гугления по закрытым issues. Управление одним пальцем. Слайдер должен быть достаточно чувствительным, чтобы чувствовать контроль, но достаточно инертным, чтобы не дёргать. Я перебрал пять вариантов, прежде чем нашёл баланс. Валидация identity. Telegram передаёт данные пользователя через initData. Чтобы никто не притворился другим игроком, сервер проверяет HMAC-SHA256 подпись каждого подключения по токену бота. Без этого любой может подделать запрос.
Ранний доступ Игра работает: t.me/duelastik_bot Нажимаете Play — попадаете в лобби. Можно создать дуэль и отправить ссылку другу, встать в очередь на случайного соперника, или размяться с ИИ. Мне интересно мнение тех, кто играет и тех, кто делает игры. Геймплей цепляет? Физика ощущается? Что бы вы добавили? Что дальше? Турнирный режим. Рейтинг ELO. Кастомизация. И, возможно, самое интересное — SDK для операторов, которые хотят встроить skill-based PvP в свои проекты. Но сначала — обратная связь. Ломайте, критикуйте, предлагайте. Вопрос к аудитории: есть ли будущее у настоящих игр в Telegram, или мессенджер обречён быть платформой для кликеров? Так же ищу единомышленников. Пишите