Секреты идеального баланса: колонка геймдизайнера компании Pixonic

Ведущий геймдизайнер компании Pixonic Артур Мостовой, один из авторов популярной мобильной игры War Robots, на конкретных примерах объясняет, как нужно выстраивать грамотный баланс в онлайн-играх.

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

Секреты идеального баланса: колонка геймдизайнера компании Pixonic

Начну с очевидного — ничего идеального нет. Так что тогда имеется в виду под идеальным балансом? Можно сказать, что идеально сбалансированная система базируется преимущественно на двух вещах — приближении и равенстве. Перед тем, как перейти непосредственно к примерам, давайте взглянем на эти два термина поближе.

Приближение

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

При попытке осмыслить сущность непосредственно из игры можно столкнуться со сложностями. Как вообще можно рассчитать, например, мощность гигантской космической улитки, которая воет как гиена, регенерирует как Росомаха и периодически стреляет зелеными разрывными паладинами? Казалось бы, это невозможно. Но суть в том, чтобы абстрагироваться от образов (даже самых экстраординарных) и думать абстракциями, которые легко разбить на более мелкие части и применить к ним математику.

Секреты идеального баланса: колонка геймдизайнера компании Pixonic

Равенство

Что такое в действительности баланс? Разные сущности обычно называются сбалансированными, если их можно считать условно равными друг другу в рамках геймплея. Баланс особенно важен в онлайн-играх. Если в одиночной игре по какой-то причине баланс не идеален, обычно это не критично. Там есть вещи, на которые игроки обращают больше внимания — персонажи, сюжет, игровой процесс и так далее.

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

А вот в онлайне люди постоянно сражаются за места в рейтингах, оттачивают мастерство десятки часов каждый день и рассчитывают на честное соревнование. Если какой-то игрок получает преимущество в бою, это сразу же берется на заметку остальными участниками, и суть этого преимущества начинает использоваться все чаще, становясь новой «метой» (в данном случае, лучшей стратегией). Это в свою очередь ведет к тому, что все больше и больше людей будут пользоваться этим «хаком», который чуть более эффективен, чем другие. Зачем пробовать что-то еще, если он работает лучше всего? Поэтому дисбаланс лишает игру сложности и разнообразия, он каннибалистичен по отношению ко всему остальному контенту игры.

Секреты идеального баланса: колонка геймдизайнера компании Pixonic

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

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

К делу

При создании игры, выбранные числа характеристик зависят от многих вещей — лора, игровой динамики, субъективного восприятия игроков и многого другого. В целях демонстрации, числа в этой статье мы для простоты возьмем из головы. Пусть у нас будет три вида оружия: назовем их А, B и C, соответственно.

Предположим, что оружие A наносит 1000 урона каждую секунду, B наносит 500 каждые 0,5 секунды и C — 250 урона каждые 0,3 секунды. Каким будет DPS (урон в секунду)?

● DPS оружия = урон за атаку/интервал атаки

● Оружие A: урон 1000/1 секунда = 1000 DPS

● Оружие B: урон 500/0,5 секунды = 1000 DPS

● Оружие C: урон 250/0,3 секунды = 833,3 DPS

Сейчас DPS видов оружия равен их еDPS, потому что у нас еще нет специальных механик или модификаторов, которые учитывались бы в еDPS.

Как видно, оружие A и B имеют одинаковый еDPS, а C примерно на 20% слабее. Чтобы уравнять его с двумя другими, нужно либо порезать (ослабить) A и B, либо бафнуть (усилить) C. Второй вариант в общем случае предпочтительнее, так как он требует меньше изменений (представьте выбор в духе «порезать одно оружие или бафнуть 49» — результат очевиден, хотя исключения бывают). Также у A и B eDPS представлен более круглым и удобным для восприятия числом.

Бафнуть DPS у C можно либо уменьшив интервал атаки, либо увеличив урон. По A и B видно, что есть пропорция вида 2-к-1 между интервалами атаки.

Для простоты восприятия пойдем тем же путем и изменим интервал атаки оружия C:

● Интервал атаки = урон за атаку/DPS

● Новый интервал атаки оружия C = 250/1000 = 0,25 секунды

Отлично, теперь показатели eDPS у всех равны. Это не значит, что и оружие теперь одинаковое: оружие A более предпочтительно для нанесения сильного мгновенного (burst) урона с более длительным откатом, в то время как C больше подходит для беспрерывных (sustained) атак, ведь оно наносит меньше урона, но чаще.

Добавим что-нибудь, чтобы стало интереснее — например, дистанцию атаки. Теперь у A дальность поражения 1 м, у B — 10 м, а вот C поражает цель на расстоянии до 25 м. Отсюда видно, что максимальная дистанция, на которой может начаться сражение, составляет 25 метров. В целях аппроксимации предположим, что игроки, использующие наше оружие, будут двигаться навстречу друг другу и начнут атаковать, как только выйдут на нужную для начала атаки дистанцию (что логично).

Имея это в виду можно перейти к цифрам. Визуализируем новые условия — оружие C эффективно на 100% на расстоянии до 25 м, B эффективно на 100% расстоянии до 10 метров и совершеннобесполезно (эффективно на 0%) в диапазоне от 10 метров и выше.

Секреты идеального баланса: колонка геймдизайнера компании Pixonic

● Эффективность оружия B на дистанции до 25 м = (10 м/25 м) * 100% + (15 м / 25 м) * 0% = 40%

Аналогично можно подсчитать эффективность A:

● Эффективность оружия A на дистанции до 25 м = (1 м/25 м) * 100% + (24 м/25 м) * 0% = 4%

Вводя новый параметр — дистанцию атаки, мы добились того, что B теперь реализует лишь 40% своей мощности, а оружие A — всего 4%.

● eDPS оружия = DPS * дистанционная эффективность

● Оружие A: 1000 DPS * 4% = 40 eDPS

● Оружие B: 1000 DPS * 40% = 400 eDPS

● Оружие C: 1000 DPS * 100% = 1000 eDPS

Чтобы сделать систему сбалансированной, поменяем несколько параметров отстающего оружия. Можно просто бафнуть только урон оружия A на условные плюс-сто-пятьсот, и технически это даже даст нужный нам эффект. Но это не лучший вариант, и вот почему — игрок с оружием A, скорее всего, уничтожит любого врага одним ударом (когда и если до него доберется). Обычно это нежелательно с точки зрения дизайна, хотя бывают исключения. Менее резким скачком было бы распределить усиление этого оружия между разными параметрами, и чем больше их — тем лучше, тогда переход будет более гладким.

Попробуем комбинацию из нескольких изменений, чтобы достичь 1000 eDPS для всех видов оружия — увеличение дистанции атаки A, уменьшение дистанции атаки C и увеличение урона A и B. Для простоты не будем трогать интервал атаки, только урон.

Секреты идеального баланса: колонка геймдизайнера компании Pixonic

Первое по порядку изменение не имеет особого значения, начнем с дистанции атаки, которая для A теперь составляет два метра, а для C — 20 метров. Я не выбирал эти числа по каким-то определенным причинам, просто 2 м видятся все еще реальными для оружия ближнего боя, хотя технически это 100% баф (но при этом в абсолютных величинах это увеличение всего на метр). Что касается оружия C, здесь изменение небольшое — нерф на 20%.

● Новая эффективность оружия A до 20 м = (2 м/20 м) * 100% + (18 м/20 м) * 0% = 10%

● Новая эффективность оружия B до 20 м = (10 м/20 м) * 100% + (10 м/20 м) * 0% = 50%

Изменив эффективность, отрегулируем урон, чтобы достичь 1000 eDPS для двух отстающих видов оружия —A теперь наносит 10000 урона, а B — 1000 урона, что дает 10000 DPS и 2000 DPS соответственно.

● Новый eDPS оружия A = 10000 DPS * 10% = 1000 eDPS

● Новый eDPS оружия B = 2000 DPS * 50% = 1000 eDPS

Неплохо. А ведь мы всего лишь ввели такие базовые параметры, как DPS и дистанция атаки. Подольем немного масла в огонь: оружие A наносит дополнительный урон по площади (АоЕ) — 30% от первоначального повреждения в радиусе двух метров от точки удара, у B есть шанс крита (20% на х1,5 урон), а C иногда стреляет мимо (15% шанс промахнуться).

Начнем с простого — оружие C. При возможности промаха, равной 15%, мы наносим 100% урона 85% времени и 0% урона 15% времени. У него появляется следующий модификатор атаки для его eDPS:

● Модификатор оружия C = 100% * 85% + 0% * 15% = 85%

С оружием B не намного сложнее. С 20% критом на х1,5 урона мы наносим 100% урона 80% времени и 150% урона 20% времени.

Секреты идеального баланса: колонка геймдизайнера компании Pixonic

А вот С оружием A есть сложности. Ранее мы рассматривали в расчетах прямую линию огня, а теперь появился урон по площади, который покрывает круг радиусом 2 м вокруг точки удара. В целях аппроксимации и упрощения мы можем предположить, что до сих пор оцениваем ситуацию 1v1, и пренебречь уроном за пределами прямой линии, и вот почему — мы точно не знаем, как сражаются игроки, и нам неизвестны другие параметры, которые могут сделать расчет более точным.

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

Зная это, мы можем пересчитать дистанционную эффективность C, а не вводить новый модификатор атаки, как мы это делали для A и B.

Визуализация eDPS оружия A с AoE
Визуализация eDPS оружия A с AoE

Формула теперь выглядит так:

● Дистанционная эффективность оружия C = (2 м/20 м) * 130% + (2 м/20 м) * 30% + (16 м/20 м) * 0% = 16%

Посмотрим, что получилось:

Новый eDPS оружия = DPS * дистанционная эффективность * модификатор атаки

● Оружие A: 10000 DPS * 16% = 1600 eDPS

● Оружие B: 2000 DPS * 50% * 110% = 1100 eDPS

● Оружие C: 1000 DPS * 100% * 80% = 800 eDPS

Дальше как обычно. Скорректируем DPS через урон, чтобы получить 1000 еDPS для каждого оружия с учетом всех параметров. Оружие A теперь наносит 6250, B — 909, а C — 312,5 урона. И тогда:

● Оружие A: 6250 DPS * 16% = 1000 eDPS

● Оружие B: 1818 DPS * 50% * 110% = 1000 eDPS

● Оружие C: 1250 DPS * 80% = 1000 eDPS

На закуску

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

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

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

Секреты идеального баланса: колонка геймдизайнера компании Pixonic
44
32 комментария

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

В частности в учёте дальности стрельбы решает архитектура уровня. Если в ней много коридоров и поворотов, то дальность начинает играть гораздо меньшую роль, потому что 80% врагов появляются в 5 метрах от игрока.

Или взять, например, баланс Овервотч. 20 героев, у которых каждая способность уникальна. И оружие. И тактика игры. Аппроксимировать, конечно, можно, но числовой результат будет далёк от балансного. Если балансер не гений-гений или не подтасовывает.

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

Или я не прав?

7

Абсолютно правы. А статью внимательно и до конца прочитали?)

1

Абсолютно согласен. Матмодель для стартового баланса и куча плейтестов с аналитикой для корректировки. Да и eDPS не панацея.

1

Фух, зря напугали неподготовленных читателей, математика элементарная, формул и спец.терминов не замечено! Или это еДПС и АоЕ страшат?

4

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

1

Было бы интересно услышать, кто как балансирует юнитов учитывая урон вместе с ХП? (именно в плане голой математики, без подкручивания после тестов)
Казалось бы, юнит1 (ХП:100 ДПС:10) равен по силе юниту2 (ХП:50 ДПС:20) поскольку обоим нужно по 5 "ударов", чтобы уничтожить друг друга. Тогда в балансе боев один на один можно использовать число ХП*ДПС
Но как только юнитов в бою больше 2ух вылазят проблемы, например: юнит с ДПС=0 перестает быть бесполезным (тем, что может забирать на себя часть урона).

1

В общем случае действительно обычно считают некую "мощность", которая определяется, как HP x DPS.

В вашем конкретном случае (бою 2 vs 1, где один юнит на перевешивающей количественно стороне просто исполняет роль танка), например, можно юнита с DPS = 0 не считать отдельной сущностью вовсе. Все, что он делает, это является щитом для юнита-союзника. Тогда можно просто учесть его в "мощности" юнита-союзника по формуле DPS * (HP1 + HP2).

Это как вариант. Я думаю, что без "подкручивания после тестов" не обойтись никак, только если у вас действительно не игра 1х1 с прозрачной математической моделью нанесения урона и простыми критериями победы. Поэтому все, что в наших силах — это прикинуть. Можно, в принципе, и на глаз (хоть формально это будет и ненаучно), если понимание игры в целом очень хорошее — т.е. зайти с позиции игрока. А можно попробовать аппроксимациями — в зависимости от конкретной игры, ее особенностей и кейса.

2