Честность, которую можно пересчитать: как мы строили платформу кейсов CS2

Шансы каждого предмета до оплаты, сид, зафиксированный заранее, и апгрейд, формула которого видна игроку. Разбираем механику Gocase.gg и решения, которые сделали её проверяемой.

Команда YAVKA

· 4 мин чтения

Кейс-сайты держатся на доверии, а доверия к ним немного: игрок по умолчанию уверен, что результат подкручен. Поэтому, когда мы начинали платформу кейсов CS2 Gocase.gg, правило было одно: каждый исход решает сервер, и любой может его перепроверить. Всё остальное — рулетка в стиле CS2, апгрейд, контракты — строилось уже вокруг этого правила.

Шансы — до оплаты, а не после

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

Шансы считаются из целевого RTP кейса и текущих оценок предметов и пересчитываются, когда меняются цены в Steam. Базовый RTP каталога — 90%. И важная деталь: в генераторе нет скрытых ограничений на дорогие дропы. Будь они там, проверка честности потеряла бы смысл — показанные шансы перестали бы совпадать с настоящими.

Страница кейса с включёнными шансами: у ножей и перчаток — тысячные доли процента, у дешёвых скинов — десятки процентов.
Страница кейса с включёнными шансами: у ножей и перчаток — тысячные доли процента, у дешёвых скинов — десятки процентов.

Как устроен provably fair

Перед открытием сервер генерирует секретный серверный сид и показывает игроку только его хеш SHA-256. Игрок задаёт свой клиентский сид, а у каждого открытия есть порядковый номер. Число, которое выбирает предмет, — это HMAC-SHA256 от пары сидов и номера, а сам предмет выбирается по весам из той же таблицы шансов, что видна на странице кейса.

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

Страница «Честность»: хеш текущего серверного сида, свой клиентский сид и форма, которая пересчитывает любое открытие.
Страница «Честность»: хеш текущего серверного сида, свой клиентский сид и форма, которая пересчитывает любое открытие.

Рулетка подстраивается под ответ сервера

В браузер приходит уже готовый результат, и витрина строит ленту под него: победитель стоит в заранее известной позиции, а вокруг — предметы того же кейса. Прокрутка повторяет кривую торможения CS2 и звучит как в игре. Можно открыть до пяти кейсов разом параллельными колонками, включить быстрый режим или автооткрытие с лимитами прибыли и убытка. Баланс списывается в одной транзакции с выдачей предмета, так что подкрутить что-то из браузера не выйдет.

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

Апгрейд: формула на виду

В апгрейде игрок ставит предмет из инвентаря ради более дорогого. Шанс считается так: цена ставки делится на цену цели и умножается на RTP 90%, а сверху стоит потолок 85%, чтобы почти равный обмен не превращался в гарантированный. Ставка 100 монет на предмет за 300 даёт 30%. Цель должна быть дороже ставки как минимум в 1,05 раза и не больше чем в 20 раз.

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

Схема provably fair на Gocase.gg и формула шанса апгрейда с примером.
Схема provably fair на Gocase.gg и формула шанса апгрейда с примером.

Что осталось за кадром

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

Чему нас научил проект

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

Кейсы — развлечение для взрослых (18+), и на дистанции отдача всегда меньше потраченного; мы проектировали Gocase так, чтобы игрок видел это заранее. Подробнее о стеке, админке и дизайн-системе — в кейсе Gocase.gg.