Эссе о разработке игр, мышлении и книгах

Ресурсная модель игры: ресурсы

заг-заг (c) ~~World of~~ Warcraft.

заг-заг (c) World of Warcraft.

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

Первую попытку описать игру с ресурсной точки зрения я сделал на Хабре в посте время, деньги и фан в ММО, после чего немного расширил её при описания следующего фронтира геймдизайна.

Теперь пора потихоньку вдаваться в детали. Начну, как видно из названия, с самих ресурсов.

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

Воспринимайте этот текст как интересное интеллектуальное упражнение. Агитировать за использование ресурсной модели в реальных проектах я пока не готов.

Точка взгляда

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

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

Кардинальной новизны в этом нет. Частные случаи управления динамикой ресурсов давно и успешно применяются в геймдеве. Например:

  • Управление напряженностью сюжета.
  • Управление уровнем сложности.
  • Управление динамикой боя.
  • Управление скоростью прокачки.

Однако я встречал мало описаний ресурсного подхода к игре в целом. Из интересного знаю только о machinations.io — сервисе для анализа поведения игры как раз через описание модели преобразования ресурсов. Он сейчас находится в бете и выглядит очень интересно.

Ресурсы

Разговаривая о ресурсах, будем помнить, что у нас ещё есть некие «правила преобразования ресурсов», в детали которых пока не будем вдаваться — это тема для отдельного поста. Можно считать, что каждое правило представляют собой множество утверждений вида: «забрать (выдать) A единиц ресурса B у сущности C».

Как я уже говорил, ресурсом мы будем считать всё, что может быть потрачено или получено. Ресурс может быть как предельно конкретной, так и весьма абстрактной сущностью. Вот некоторые примеры:

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

Многими ресурсами игроки управляют напрямую или косвенно. Например, в случае ресурса «урон группы», задача игроков — сформировать группу так, чтобы максимизировать DPS (Damage Per Second) и тем самым увеличить скорость прироста (добычу) урона. Урон в свою очередь можно обменять на положительный исход боя: награду, эмоции, продвижение по сюжету.

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

Какая модель правильнее? Обе правильны и заслуживают право на существование. Как и любая другая модель, «ресурсная» отображает только некоторый срез моделируемой сущности (игры). Поэтому моделей может (и должно быть) несколько, в том числе может быть несколько ресурсных моделей. В этом случае, первая предложенная модель больше подошла бы для взгляда на игру «в целом», а вторая — для глубокого анализа боёвки.

Чтобы упростить оперирование понятием ресурса, разберём их свойства.

Количественные и качественные ресурсы

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

К качественным ресурсам однозначно можно отнести эмоции и навыки игрока. Но есть и более интересные случаи:

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

Не будем пытаться сходу впихнуть невпихуемое в нашу модель. Вместо этого подумаем над удобным способом представления качественных ресурсов в количественном виде.

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

Первым делом необходимо выделить качественные уровни ресурса и зафиксировать их порядок. Для эмоции «радость», этими уровнями могут быть: очень грустный, грустный, никакой, весёлый, очень весёлый.

Далее у нас есть два варианта:

  1. Представлять ресурс полностью квантованным, когда переход между уровнями соответствует квантовому скачку.
  2. Разделить ресурс на два: скалярный и квантовый. В этом случае все изменения происходят со скалярным отображением, а качественное отображение ресурса получается неравномерным квантованием.

Примеры:

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

Внешние и внутренние ресурсы

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

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

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

Внешние ресурсы

Внешние ресурсы не подконтрольны разработчикам игры. Если у игрока не хватает времени, он не будет играть, если нет денег — не купит игру, если «кончился запал» — перестанет играть.

Перечень и свойства этих ресурсов обусловлены нашей реальностью и никак изменить их нельзя.

Видов внешних ресурсов не так много, перечислим их:

  • Деньги — в идеальном мире мы бы не учитывали этот ресурс, к сожалению разработчикам необходимо есть, и другого способа получать еду за игры пока не придумали.
  • Время — основной ресурс игрока, его можно разделить на два типа, по способу взаимодействия с игрой:
    • активное — игрок непосредственно играет (сидит за монитором и жмёт кнопки);
    • пассивное — игрок не играет, но механики игры конвертируют время без него (примером могут быть шахты в Travian или изучение навыков в EVE).
  • Эмоции — то, ради чего игрок (обычно) играет.
  • Навыки — наиболее актуальны в случае обучающих игр, но каждая игра, как минимум,  вырабатывает навык играния в себя.
  • Вычислительные ресурсы — новый ресурс, ставший актуальным с появлением криптовалют и умных контрактов. Также может быть задействован в играх с моделированием (Creatures) или хостингом собственных серверов.

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

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

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

Внутренние ресурсы

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

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

Владение ресурсом

Каждый ресурс должен иметь владельца. Но владелец не обязан быть явным, например, владельцем ресурса может быть вся игра.

С первого взгляда можно выделить два случая:

  1. Одним типом ресурса могут владеть несколько сущностей одного типа (золото есть у каждого героя).
  2. Одним типом ресурса могут владеть сущности разных типов (золото есть у героя,  сундука, города).

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

Поэтому второй случай удобно свести к первому. Для этого один тип ресурса можно разделить на несколько типов по признаку владения. Например, золото можно разделить на «золото героя», «золото сундука», «золото города».

Благодаря такому разделению мы можем создать уникальные списки правил работы с ресурсом для каждого типа сущностей. Кроме того, мы увеличиваем и гибкость правил «передачи»  ресурса между разными типами сущностей. Например, при получении золота  из сундука, часть его может идти герою, а часть в казну ближайшего города.

Операции над ресурсами

Ресурсы можно хранить и и изменять количественно (получать, тратить).

Выглядит просто, но есть нюансы.

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

Изменение ресурса имеет несколько ограничений:

  1. Наличие и величина нижней и верхней границ количества ресурса.
  2. Минимальная величина, на которую допустимо изменять количество ресурсов.

Границы количества ресурсов

Первое правило говорит о том, что некоторые ресурсы могут изменяться только в заданных пределах. Например, игровая hard валюта может быть в интервале [0; +∞), а soft валюта может быть и в интервале (-∞; +∞).

Стойте, разве количества ресурса может быть отрицательным?

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

Но если хочется, то формально этот парадокс можно разрешить двумя способами:

  • Нормализовав представления ресурса и его границы. Например, интервал [-100; 100] превратить в интервал [0, 200], а оригинальный интервал отображать только в интерфейсах.
  • Разделить ресурс на два типа: «ресурс А» и «долг ресурса А» — количество каждого из которых может быть только положительным.

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

Квант изменения ресурса и детерминированность

Когда-нибудь тут появится ссылка на мой пост о важности детерминированности логики ПО (в том числе игр). Пока же выскажу просто несколько своих соображений. Будет что-то вроде экспертного неаргументированного мнения в посте состоящем из сплошного экспертного неаргументированного мнения.

Самое главное: детерминированность очень важна, поэтому мы должны стремиться делать предсказуемым всё, что можем.

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

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

Например, проценты можно домножать на 100, тогда  17.33% в логике игры станет равно 1733 базисных пунктов.

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

Целочисленное представление всех величин не только позволяет избавиться от ошибок операций с плавающей точкой, но и делает игру прозрачной как для игрока, так и для разработчика — восприятие чисел вроде 0.33242422223432 затруднительно для любого человека.

Открытые вопросы

Поверхностный обзор свойств ресурсов на этом, надеюсь, можно считать законченным.

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

Всё ли в игре можно описать как ресурс? Например, как представить через преобразование ресурсов перемещением героя по карте и необходимость его нахождения в конкретном месте для срабатывания тригера?

Некоторые метаресурсы могут иметь уникальные составные части. Например, предметы в инвентаре: с одной стороны это общий ресурс «экипировка героя», с другой — каждый предмет может быть уникальным. Как ввести такие ресурсы в модель?