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

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

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

А сейчас я расскажу, какие же методы работы с 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–12. Скопируйте формулу из столбца, где настраиваются кривые, в поле «у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.

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

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

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

В случае с ценой оружия я бы добавил две новые переменные в общую таблицу переменных: 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, который написал Вольфганг Гребнер.

Спасибо, что читаете наши материалы! Подписывайтесь на наш блог и следите за новым интересными статьями и переводами.

© Habrahabr.ru