Статья — ответ на вопрос «как считать айдлеры?», оригинал которой опубликован аж в 2016, но актуальность кажется не потрерял до сих пор.

Я рассказывал несколько раз о привлекательных чертах и общей механике айдлеров, но как создать такой на практике? Общие слова и закономерности это хорошо, но за ними стоит сложная математика. Как вообще соблюсти баланс в игре, где числа стремятся к невероятным величинам?

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

Все модели в статьях доступны как excel-таблицы. Пожалуйста, рассматривайте, копируйте, расширяйте и т.п!

Давайте определимся с терминами, чтобы облегчить понимание.

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

Генератор: Предмет в игре, производящий основную валюту. Скорость дохода или производства измеряется в единицах валюты в секунду.

Основная обменная валюта: В некоторых случаях генераторы производят другую валюту, которая обменивается на основную. Например, в Clicker Heroes генераторы производят DPS (урон в секунду), которые приносят золото при убийстве монстров. Такой дополнительный уровень разделения может дать разработчику немного больше контроля над ростом основной валюты, изменяя обменный курс со временем.

Множитель: Любой вид улучшения, который ускоряет генерацию. Для примера, явный апгрейд – это закупка дополнительных генераторов. Цель улучшений – (временно) сделать скорость роста количества валюты близкой к потребности в ней или даже её перекрыть.

Престиж: Переопределение большей части игровых предметов (в особенности генераторов и множителей), чтобы увеличить скорость получения валюты (престижной валюты) и размеры множителей. Похоже на “New Game+”

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

Пример: В игре AdVenture Capitalist есть ларьки с лимонадом. Для них:
rate_growth = 1.07
cost_base = 4 ( на самом деле технически их базовая стоимость 4/1.07 = 3.738 , потому что первый автомат достаётся бесплатно)

production_base = 1,67 / сек

Если у вас 10 ларьков с лимонадом, то купить 11й будет стоить: 

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

Вот таблица коэффициентов для различных генераторов в AdVenture Capitalist, благодарю AdCap wiki

таким образом, сначала вы зарабатываете каждую секунду куда больше, чем стоимость очередного ларька или другого генератора. Посмотрим на график. Заметьте, что в данной игре применяется оптовый множитель *2 при покупке 25 го и 50 го ларька.

На следующем графике мы видим, что происходит более чётко, прологарифмировав шкалу стоимости.

Поначалу ваша прибыль высока, вы можете продолжать покупать, а множители поднимают ваши прибыли, когда вы приблизились к равновесию. Но в конце концов стоимость очередной покупки становится неподъёмной, и вы уже не можете дождаться следующего раза, когда можно купить следующий генератор.

Математически, экспоненциальный рост (что угодно в виде N^x, где N>1) в конце концов догонит и перегонит любой полиномиальный рост (x^k) , неважно, как велико k и как мало N. Иногда это занимает много времени, и тут мы можем этим воспользоваться для балансировки игры. (С различными видами роста функций вы можете ознакомиться в этом посте пользователя Eclipse1agg, разработчика True Exponential.

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

Мы разобрали пример для одного генератора. Что если у вас есть несколько генераторов с разными прибылями и стоимостями покупки? Теперь игрок может выбрать, во что инвестировать дальше, и теперь дела становятся интереснее.Но мы можем рассчитать оптимальное поведение! Под оптимальны мы будем считать такой выбор, при котором отношение прибыль/затраты являются наибольшей. Каждый раз когда есть возможность что-то купить, мы определяем это отношение.

Игроки не будут принимать такие оптимальные выборы, потому что часто для этого нужно выбирать слишком часто. “Купи один генератор_2, потом три генератора_1, потом генератор_3, потом ещё один генератор 1…” Вместо этого они обычно покупают оптом: или чтобы упростить свои решения, или как проявление ОКР, (шутка), сохраняя количество генераторов кратным 100. Рано или поздно поти все пользователи начинают покупать сотнями.

Вот график покупок первых пяти генераторов в AdVenture Capitalist, который будет оптимален для игрока в описанной модели. Прибыльность генератора удваивается, когда игрок приобретает 25 и 50 генераторов каждого вида. Когда число генераторов у игрока около 25и или 50и, он обычно закупается ими, потому что ценность этих генераторов временно становится выше. (В этой упрощённой модели прибыль поступает каждую секунду, без учёта фиксированного времени, который нужен, чтобы генератор отработал, более медленные генераторы в реальной игре будут менее привлекательны.)

Если посмотреть на то, сколько прибыли приходит с каждого генератора в оптимальной модели в зависимости от времени (шкала прибыли на графике логарифмическая), то мы увидим, что последний генератор почти всегда самый выгодный, и его стоит покупать, как только появится возможность. Для игрока это будет скучновато, потому что нет места для интересных решений. Даже если представить, что мы стоим перед выбором: ларёк с лимонадом, производящий 💲10 / сек, за 💲5 против автомойки, которая производит 💲10к/ сек за 💲7.5к . Ларёк более выгоден, но вы не ощутите этого, поэтому купите автомойку, во время игры рассматривать покупку ларька всерьёз вам скорее всего не придёт в голову.

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

Подкрутим значения бонусов (пока не добавляем возможности улучшать генераторы за деньги.)

Тогда график прибыли в условии оптимального поведения игрока получится таким:

Так гораздо интереснее. По ходу игры разные генераторы оказываются в приоритете и в наибольшей степени влияют на прибыль. Задача игрока – определить самые прибыльные активы, (с первого взгляда не очевидные) и это предоставляет больше разнообразия и меньше предсказуемости выбора. Разнообразие также можно увеличить, с помощью магазина с  улучшениями генераторов.

Бонусный материал (сумма геометрической прогрессии)

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

  • n – число покупаемых генераторов
  • b – исходная цена
  • r – экспоненциальный множитель, с которым растёт цена
  • k – количество уже имеющихся генераторов
  • с – количество валюты на руках

Если в вашем языке программирования нет логарифма по заданному основанию, воспользуйтесь стандартным log, ln и поделите вот так.

Если у вас остались вопросы, вы нашли ошибку, придумали новый функционал к таблицам, или у вас на примете есть интересный адлер, не стесняйтесь написать мне по адресу: anthony@kongregate.com

Об авторе: Anthony Pecorella: пишет на Kongregate 8 лет. Наполняет сайт, создал мобильное приложение AdVenture Capitalist. Разрабатывает игры в Level Up Labs, среди них Defender’s Quest и CellCraft. Больше статей автора.

Перевод — Дудникова Лада, админ канала «Дикий Шиповник»