В Path of Exile очень много цифр. Относительно сложный предмет или навык может иметь двадцать и более скрытых параметров, учитывающих величину урона, расстояние до врага, факторы времени и многое другое. Сбалансировать все числовые величины игровых параметров – задача не из лёгких, но точность и ясность в этом вопросе очень важна. Мы потратили кучу времени на разработку системы, которая позволяла бы легко управлять балансом всех показателей в игре.
Баланс своими руками
Ещё в 2007-м году, работая над ядром геймплея Path of Exile, мы осознали необходимость начального баланса в игре. На этом этапе нам надо было определиться, сколько будет жизни у персонажей и монстров, и сколько единиц урона будет наносить оружие. Мы работали с относительно небольшими цифрами для небольшой группы монстров и предметов, поэтому выбрали произвольные числа, казавшиеся нам верными. Если короткий меч наносит 5-10 единиц урона, то для двуручного меча разумным будет 9-28 урона. У скелета должно быть 30 жизни – в среднем он умрёт после 4 ударов коротким мечом или 2,2 ударов двуручником. Так, вручную, мы подбирали эти значения, получая относительно сбалансированный геймплей.
Введение дополнительных расчётов системы боя усложнило систему баланса. В середине 2008-го года у нас накопилось множество видов магических атак, расчётов точности попадания, уменьшения урона и критических ударов. У предметов появились свойства, влияющие на вышеперечисленные параметры. Нам пришлось потратить много времени на изменение имеющихся параметров в численном выражении, поскольку все цифры подбирались вручную и приходилось переделывать систему расчётов. Потом мы добавили к урону холодом эффект заморозки противника и пришлось вручную исправлять все параметры персонажа, оружия и монстров, связанные с уроном холодом, чтобы избежать перекосов в игровом балансе.
Динамические таблицы
Изменение цифр в десятках файлов стало непосильным бременем. И тогда мы переключились на генерацию всех чисел в больших Excel'евских файлах. Мы придумали систему коэффициентов, которая давала приблизительную оценку игровой механики. Например, монстр может выдержать 50% урона огнём. Таблица «знает», что каждая единица урона огнём равна 0,8 единицам физического урона, отсюда можно получить правильные данные. Если мы хотим, чтобы монстр 10 уровня мог с 80% вероятностью нанести урон врагу со средним значением уклонения, мы сможем подсчитать нужный для этого параметр точности.
Спустя некоторое время мы отказались и от Excel'евских таблиц. Работа с коэффициентами, учитывающими все возможные параметры, превратилась в кошмар, даже встроенные скрипты Excel'а не облегчали её. Ещё нам надо было решить вопрос ускорения загрузки всех данных о параметрах в игру.
Ранняя Excel'евская таблица, содержащая 100 столбцов с цифрами
Наша собственная система баланса
В начале 2009 года мы решили разработать собственную систему редактирования метаданных. На первый взгляд она была похожа на динамические таблицы, но обладала бОльшими скриптовыми возможностями и могла экспортировать данные сразу в двоичный формат, загружаемый в игру. В дополнение к управлению балансом, наша система позволяла редактировать и локализовать весь игровой текст.
Закончив работу над этой системой, мы пересмотрели свои предыдущие достижения в балансе игры. Стало ясно, что трудности возникали не только при выборе значений, которые соответствовали бы друг другу, но и при решении вопросов типа «насколько велико должно быть значение какого-либо параметра предмета по отношению к пассивному умению?».
Эффективность
Очевидным решением стала разработка концепции, получившей название эффективности. Величину эффективности можно было рассчитать для каждого параметра определённого уровня. Все данные связаны иерархично, поэтому мы можем относительно оценивать параметры с помощью коэффициентов между ними и родительскими блоками в иерархии. Например, урон огнём стОит в 1,42 раза больше, чем физический урон, потому что он может поджигать людей. Прибавка к наносимым повреждениям от предметов, которые не являются оружием, стоит в 2,08 раза больше, чем та же самая величина у оружия. Если в игре есть запас эффективности, который можно распределить, то коэффициент эффективности можно использовать, чтобы сравнить, например, повреждения огнём, которые даёт предмет, не являющийся оружием и физический урон от оружия.
Если всё измерять коэффициентами эффективности, то управлять балансом становится очень легко. Мы дали игроку определеннее количество эффективности, увеличивающееся по мере того, как персонаж получает новые уровни. Можно рассчитать эффективность для каждого уровня персонажа с учётом экипированных предметов, их бонусов, пассивных навыков и активных умений. Например, на 3-м уровне мы ожидаем, что у персонажа будет 1,6 камней умений, 2 пассивных навыка и 3 бонуса от 6-ти экипированных предметов. На 35-м уровне у персонажа должно быть 9,75 камней умений, 34 пассивных навыка и 28 бонусов от 9-ти экипированных предметов.
Таблица бонусов, которые даёт экипировка в нашей системе баланса
Вот примеры некоторых расчётов:
- Камень умений (skill gem) 2-го уровня имеет эффективность 15. Это значит, что простой фаербол будет наносить 11-16 повреждений огнём. Камень умений (skill gem) 50-го уровня имеет эффективность 106. Фаербол при таком уровне будет наносить 78-113 повреждений огнём.
- Предмет экипировки 10-го уровня имеет эффективность 28. Если вся эффективность уходит в нанесение повреждений, то в среднем получаем 27 единиц физического урона в секунду. Для одноручной дубинки с параметрами 90% к силе и 10% к ловкости урон составит 18-42 единицы при скорости атаки 0,9 раз в секунду.
- Пассивное умение 6-го уровня имеет эффективность 10. Примером такого распределения эффективности будет умение «+7% урона и +4% скорости атаки при использовании меча».
- Улучшение предмета 1-го уровня имеет эффективность 15. Для 11-го уровня улучшения эффективность будет 18. На ранних уровнях развития персонажа, умение, дающее прирост к жизни 1-го уровня будет давать 37-45 жизни, 11-го уровня — 45-54 к жизни.
Баланс для монстров строится по той же системе. Мы определили, что в среднем эффективность монстров составляет 16% по сравнению с персонажами. Расчёт их умений идёт по тем же коэффициентам. У разных монстров эффективность по-разному распределяется между атакой и защитой. Также на распределение эффективности влияет ориентация монстров на силу/ловкость/интеллект. Например, монстр, такой, как зомби, чьи параметры распределяются исключительно на силу, получает способность к уменьшению получаемого физического урона. У монстра, параметры которого распределены пополам между ловкостью и интеллектом, эффективность распределится между жизнью, уклонением и энергетическим щитом.
Главной особенностью нашей системы эффективности является то, что баланс игры можно легко настраивать. Например:
- Если нам кажется, что урон огнём излишне высок, мы можем изменить его коэффициент эффективности так, чтобы величина урона огнём уменьшится одновременно во всей игре.
- Если игрокам становится трудно убивать зомби, мы можем изменит параметры зомби в определённой зоне, всех зомби в игре или вообще всех монстров в зависимости от того, что именно не устраивает игроков.
- Если те или иные умения становятся популярными или наоборот, теряют популярность среди тестеров, мы слегка подстраиваем их эффективность, пока не выявятся оптимальные значения.
- Если мы добавляем новый камень (skill gem или support gem), то выбираем, на какие параметры он будет влиять, и система автоматически распределяет эффективность по нужным параметрам. Настройка после такого распределения практически не требуется.
Нам очень нравится наша система баланса в Path of Exile. Конечно, управлять ей приходится вручную, зато она очень сильно помогает при добавлении нового контента и для учёта пожеланий растущего штата альфа (а скора и бета) тестеров.
This post has been promoted to an article