Как работают игровые автоматы: современный HTML5-слот слой за слоем
Наберите в поиске «как работают игровые автоматы» — и получите два типа ответов: конспирологию («казино может подкрутить из бэк-офиса») и клише («это всё генератор случайных чисел»). Ни то ни другое не описывает, что на самом деле пишет разработчик слотов. Это архитектура современного HTML5-слота, слой за слоем: от числа, которое решает исход, до пикселя, который его показывает.
Слой 1: исход
Раунд в слоте решает одна вещь: набор позиций остановки барабанов (или, для сеточных игр, набор символов). Где принимается это решение, зависит от платформы.
- Серверный ГСЧ. Классическая модель. Игровой сервер берёт случайные числа из сертифицированного генератора, сопоставляет их со стопами на виртуальных лентах, считает выигрыши и возвращает результат клиенту. Клиент — устройство отображения; повлиять на исход он не может.
- Предрасчитанные исходы. Более новая модель, которую используют платформы вроде Stake Engine. Студия симулирует игру заранее; каждый возможный раунд хранится с весом, и сервер выбирает один на каждую ставку. Живого ГСЧ в коде игры нет вовсе — случайность в том, какой сохранённый раунд выбран.
На старый вопрос «какой алгоритм у игрового автомата» в обоих случаях ответ прост: выбрать стоп на каждом барабане из взвешенного списка, затем посмотреть выигрыши по таблице. Никакой памяти о предыдущих вращениях, никакого «созревшего» джекпота, никакого счётчика, который «зажимает» после выигрыша. RTP — свойство лент и таблицы выплат, зафиксированное при проектировании и проверенное при сертификации. Это и есть принцип работы игровых автоматов, если убрать из него мифологию.
Слой 2: математический модуль
Отдельно и от сервера, и от клиента живёт математика: ленты барабанов, таблица выплат, логика бонусов и код подсчёта. Хорошие студии держат этот модуль независимым от платформы — написанным один раз (на Python, C# или TypeScript) и исполняемым в трёх местах: в симуляторе, который производит PAR-лист; на сервере (или в конвейере предрасчёта); и — только для показа — в клиенте, которому нужно знать, какие позиции подсвечивать. Если трое когда-нибудь разойдутся, сертификация провалится; поэтому модуль версионируется по хешу и считается единственным источником истины.
Слой 3: протокол раунда
Клиент и сервер обмениваются небольшим набором сообщений: авторизация, получение конфигурации игры (таблица выплат, уровни ставки, текущий баланс), ставка, получение результата, подтверждение конца раунда, а для бонусов — сообщение «продолжить» или «выбор». Полезная нагрузка результата несёт всё, что нужно клиенту, чтобы воспроизвести раунд детерминированно: стопы, выигрыши с позициями, шаги бонуса, баланс до и после. Обработка переподключения — часть протокола: после перезагрузки клиент спрашивает «есть ли незавершённый раунд?» и возобновляет показ из сохранённого состояния, а не с начала. Лаборатории проверяют именно это.
Слой 4: клиент — машина состояний
HTML5-клиент — это машина состояний, нарисованная на WebGL-холсте. Типичные состояния: ожидание → ставка сделана → барабаны крутятся → барабаны останавливаются (с предвкушением) → подсчёт выигрыша → показ выигрыша (по уровням) → интро бонуса → раунды бонуса → финал бонуса → ожидание. Каждое состояние владеет своими анимациями, звуками и доступностью интерфейса (нельзя менять ставку, пока крутятся барабаны). Движок под этим — обычно PixiJS, тот же рендерер, на котором построен Frontend SDK Stake, или собственная прослойка над ним. Phaser тоже встречается, особенно у команд с опытом в казуальных играх, но для слотов чаще выбирают Pixi: он ближе к «голому» рендеру и легче держит кадры на слабых телефонах.
Ключевые компоненты клиента:
- Рендерер барабанов — прокручиваемая лента спрайтов символов с размытием, отскоком и умением остановиться на заданной позиции; предвкушение замедляет последние барабаны, когда до бонуса остаётся один символ.
- Презентер выигрышей — подсвечивает линии или кластеры, проигрывает анимации символов по уровням, накручивает сумму, поднимает экран до Big / Mega / Epic на заданных порогах.
- Загрузчик ассетов — текстурные атласы, спрайт-листы, Spine-риги и звук, загружаемые в порядке приоритета, чтобы в игру можно было играть до того, как докачается сцена большого выигрыша.
- Аудиоконтроллер — многослойная музыка на каждое состояние, стемы предвкушения, пул эффектов, правила приглушения.
- Слой интерфейса — управление ставкой, баланс, автоигра, турбо, таблица выплат, настройки, плюс флаги юрисдикций, которые скрывают или ограничивают элементы.
Слой 5: производительность
Слот должен держать 60 кадров в секунду на трёхлетнем Android-телефоне через мобильную сеть. Это диктует всё: атласы не больше 2048 пикселей, листы символов, общие для разных состояний, ограниченное число частиц, звук, сжатый до нескольких мегабайт, и первая загрузка не тяжелее 8–12 МБ — остальное подгружается потоком. Разница между двумя и тремя звёздами на курируемой платформе часто именно здесь — не в математике, а в сцене большого выигрыша, которая дёргается.
Слой 6: тестирование
Трёх видов. Симуляционные тесты математического модуля (миллиарды вращений, распределения сравниваются с целями). Протокольные тесты с фиктивным сервером, который может навязать любой исход — включая обрыв связи посреди бонуса. И тесты на устройствах — на матрице реальных телефонов и браузеров, потому что WebGL и звук ведут себя в Safari на iOS иначе, чем в Chrome на Android.
Почему «исходный код игрового автомата» редко бывает открытым
Математический модуль — интеллектуальная собственность студии и сертифицированный артефакт; клиент — её ремесло. Открытые примеры существуют и полезны, чтобы понять машину состояний, но продакшн-игра отличается от них ровно в тех частях, которые сложны: интеграция математики, устойчивость протокола и работа над производительностью.
Сборка такого клиента — движок, протокол, производительность и сертификационные билды — это услуга разработка HTML5-слотов в Giro Games, на Stake Engine или под собственный RGS клиента.
Дополнительное чтение: русскоязычные объяснения ГСЧ и свойства «без памяти» у исходов слотов на kazino.wiki и shambalacasino.ru; архитектура выше — из нашего собственного производства.
Giro Games