GrabDuck

Мой подход к настройке экономики игры: электронные таблицы

:

Этот пост был написан в ответ на предложение Бренды Ромеро и Яна Шрайбера о том, чтобы разработчики поделились своими любимым методами работы в Excel.

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



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

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

Колонки с цветовыми маркерами

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

1. Зеленый – значения в этих столбцах редактируются вручную. Кроме того, такие значения требуют более частых изменений.

2. Желтый – в этих колонках значения рассчитываются на основе вычислений значений определенной области (обычно значений из колонки слева), и изменение этих значений затрагивает определенный диапазон ячеек. Формулы в этих колонках требуют корректировок, однако изменения в них вносятся реже, чем в ячейки «зеленых» колонок.

3. Белый – значения в этих колонках рассчитываются по формулам, которые не требуют каких-то серьезных изменений, так как результаты вычислений напрямую зависят от значений «желтых» колонок, связанных контрольных переменных (например, диапазон «минимум-максимум») или факторов значимости (можно найти в общей таблице переменных). Таким образом, формулы в этих колонках требуют изменений в самых крайних случаях.

Диапазоны нормированных значений

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

Например, скажем, столбец D – зеленый в таблице Оружие, и в нем содержится информация о том, какую степень повреждения наносит каждое оружие. После заполнения этих значений вручную я бы добавил новую переменную в свою таблицу переменных под названием «WeaponDamageMax» и установил бы ее значение как «=МАКС (Оружие [D:D])», а также еще одну переменную «WeaponDamageMin», которая рассчитывается по формуле «= МИН (Оружие [D:D]).

Затем бы я создал новый столбец в таблице Оружие, столбец Е, для хранения нормированных значений повреждений с формулой «= (D1 — WeaponDamageMin) / (WeaponDamageMax — WeaponDamageMin)».

Формулы распределения

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

Например, если разработчик добавляет новое, мощнейшее оружие, которое наносит ущерб в 5 000 000, а остальные значения ущерба оружия в колонке D находятся в диапазоне 1-200, одно такое большое значение исказит другие значения с более низкими показателями в диапазоне 0-1, когда они будут распределяться с помощью WeaponDamageMax, для того, чтобы получить нормированные значения ущерба в колонке Е. В некоторых случаях это желательно, но бывает, что вы хотите разбить эти кластеры данных и распространить их более равномерно по всему диапазону.

Вот где пригодится формула распределения. Нормированные значения можно легко преобразовать для получения желаемого значения распространения, применив кривую распределения к существующим данным. В этом случае мы создадим новый «желтый» столбец, колонку F, для хранения измененных значений из колонки D.

Хотя этот метод очень мощный и гибкий, все-таки визуализировать и генерировать кривые гораздо легче с помощью сторонних инструментов. Эти задачи могут выполняться и в Excel, но лично я предпочитаю использовать следующие инструменты для визуализации и изменений моих формул распределения:

Визуализацияграфический калькулятор:

1. Увеличьте оси до диапазона 0-1
2. Скопируйте формулу из столбца, где настраиваются кривые, в поле «у1=»
3. Замените букву колонки с нормированными значениями на «x»
4. Нажмите кнопку «График» для того, чтобы увидеть кривую перехода

Изменениягенератор функции плавности

1. Изменяйте контрольные точки кривой до тех пор, пока она не станет выглядеть так, как вам нужно
2. Из поля «function» скопируйте часть после «b+c*» в последней строке функции (часть в скобках)
3. Вставьте скопированную формулу в столбец, где настраивается кривая
4. Замените название «t» на букву столбца с нормированными значениями (nvcID), название «ts» на «nvcID^2», а «tc» — на «nvcID^3».

В случае с нормированными значениями ущерба от оружия в колонке Е мы можем попытаться растянуть кластер значений в нижнюю часть нашего диапазона, используя исходную формулу столбца F в виде «= (-6,885 * (Е1 ^ 3) * (Е1 ^ 2) + 19,885 * (Е1 ^ 2) * (Е1 ^ 2) + -18,395 * (Е1 ^ 3) + 3,825 * (E1 ^ 2) + 2,57 * E1),».

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

Вне зависимости от того, какую формулу распределения вы используете, убедитесь, что полученные значения остаются в пределах 0-1.


Просто… возьми, что тебе нужно и оставь немного денег…

Контрольные переменные диапазона

Для значений, которые будут автоматически рассчитываться по формуле (в данном примере – это цена каждого оружия), я считаю, что будет полезно иметь возможность контролировать минимальные и максимальные значения этого параметра, чтобы удерживать их в пределах установленного диапазона. Для этого я добавляю регулируемые минимальные/максимальные переменные, которые соответствуют каждой «белой» колонке (где расчеты производятся по формуле), которые заполняются автоматически рассчитанными значениями.

В случае с ценой оружия я бы добавил две новые переменные в общую таблицу переменных: WeaponCostMin и WeaponCostMax. Их можно изменить вручную в любое время – например, если WeaponCostMax – 90000, но игрок может собрать максиму 50000 монет, вы можете легко опустить верхний предел диапазона, установив значение WeaponCostMax в 50000, для того, чтобы гарантировать, что в игре рано или поздно, но можно приобрести все оружие.

Средневзвешенные факторы

Значения свойств, рассчитываемые по формуле, можно высчитать с использованием одного или нескольких исходных значений, которые я называю «факторы». С их помощью можно получить окончательное сгенерированное значение. Например, при расчете стоимости оружия, такими факторами являются:

Объем ущерба, который наносит оружие (больше ущерб = выше цена)
Количество места, которое требуется в инвентаре (больше места = ниже цена).

На данном этапе мы считаем, что каждый фактор уже нормализован и регулируется с помощью функции распределения (т.е. в колонке D внесены исходные значения ущерба от оружия, в колонке Е – нормированные значения ущерба от оружия, а в колонке F – окончательные значения ущерба от оружия, отрегулированные по распределению, которые и будут использоваться в нашей формуле определения стоимости).

Давайте предположим, что окончательные значения ущерба от оружия содержатся в «желтой» колонке F, а окончательные значения количества места, которое требуется в инвентаре для конкретного оружия – в «желтой» колонке U. Мы хотим составить формулу для «белой» колонки С, где будет храниться автоматически рассчитанная цена для каждого оружия. Одна из самых простых формул для столбца С, в которой учтутся наши желания и требования – это нахождение среднего арифметического этих двух коэффициентов путем:

«= WeaponCostMin + ((WeaponCostMax — WeaponCostMin) * ((F1 + (1,0 — У1)) / 2.0))».

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

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

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

В этом случае мы добавим две новые переменные в общую таблицу переменных: WeaponCost_DamageFactorWeight и WeaponCost_SpaceFactorWeight. Эти значения – всего лишь относительные целые «веса», поэтому если я хочу, чтобы при расчете стоимости оружия его ущерб значил больше, чем требования к месту в инвентаре для этого оружия, можно установить следующие значения: WeaponCost_DamageFactorWeight — «= 5» и WeaponCost_SpaceFactorWeight – «= 1».

В конце концов, наша формула в колонке С для расчета стоимости оружия с помощью средневзвешенного значения будет выглядеть так:

«= WeaponCostMin + ((WeaponCostMax — WeaponCostMin) * (((F1 * WeaponCost_DamageFactorWeight) + ((1.0 — U1) * WeaponCost_SpaceFactorWeight)) / (WeaponCost_DamageFactorWeight + WeaponCost_SpaceFactorWeight)))»

Обратите внимание, что такая формула работает только в случае, если исходные значения для ущерба и пространства в инвентаре находятся в пределах 0-1. И это еще одна причина для того, чтобы нормализовать исходные данные до выполнения различных дополнительных операций с ними.

Выводы

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

Например, я обнаружил, что процесс регулировки кривых распределения может стать камнем преткновения для разработчиков, которые пытаются применить такие методы на практике, не имея должного опыта работы с балансировкой и настройкой игр. Если вы, работая с кривыми, найдете, что вычисления очень громоздкие, вы можете изучить альтернативные методики: например, метод линейных сегментных кривых. Чтобы узнать о примерах использования линейных сегментных кривых для балансировки и настройки игры ознакомьтесь с подробным анализом формул временной монетизации на примере Clash of Clans, который написал Вольфганг Гребнер.