Reverse Design: Diablo 2. Реализация рандома в Diablo

Мы продолжаем перевод книги Reverse Design: Diablo 2, и в этот раз речь пойдет о том, как в игре реализован рандом. Мы пройдемся по многим аспектам, начиная от базовых механик боевой системы и заканчивая теми алгоритмами, по которым создаются карты, и постараемся показать, насколько хорошо у разработчиков получилось сделать игру интересной благодаря использованию случайных величин.

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

Студенты отвечают, что эти фаерболы пролетают по экрану основываясь на чистой случайности. Тогда я спрашиваю: "Значит эти фаерболы могут прилететь все одновременно или не прилететь вовсе?". После этого студенты быстро начинают осознавать, что все не так просто. Даже поверхностное наблюдение сразу же покажет, что эти фаерболы прилетают с определенной периодичностью. После этого я задаю дополнительные вопросы относительно скорости полета этих огненных снарядов, их количества и так далее.

В конце концов студенты понимают, что у фаерболов есть лишь несколько характеристик, которые основываются на случайности. Если быть точным, то случайна траектория полета фаербола. Их количество, частота, скорость и размер не подвержены рандому. К тому же даже их траектория ограничена лишь половиной экрана. Приложив немного усилий, начинающие гейм-дизайнеры начинают понимать, что рандом в игровом дизайне имеет множество всевозможных нюансов. Это утверждения верно и для Diablo 2. В этой игре у случайных событий не только множество всевозможных нюансов, но и самих видов случайности гораздо больше, чем кажется на первый взгляд. В этой секции книги мы постараемся осветить все различные виды рандома, которые можно найти в Diablo 2.


Типы случайных событий

Разбор механик Diablo 2 может стать отличным уроком того, какие типы случайных событий присутствуют в игре потому что в творении Blizzard их действительно много. К тому же игра не только использует огромное количество различных видов рандомизации, но и заставляет их взаимодействовать между собой достаточно причудливыми способами. Изучая Diablo 2, можно очень много узнать о случайностях в игровом дизайне. И первым шагом является определение всех типов случайных событий, которые присутствуют в игре и объяснение того, как они работают.

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

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


Случайность в заданных пределах

Наиболее понятным и традиционным типом случайного события в Diablo 2 является то, что я называю случайностью в заданных пределах, или "СЗП", сокращенно. Случайность в заданных пределах это то, о чем люди думают в первую очередь, когда слышат о рандоме. К примеру, если вас попросят загадать случайное число, то скорее всего вы подумаете о натуральном числе от 1 до 10, или, возможно, между 1 и 100. Примерно так работает мозг среднестатистического человека. По настоящему случайное число может быть чем угодно от семи, умноженного на пи в квадрате до 41,286,317,91, или абсолютно любого другого числа. Как и в случае с человеческим мозгом, Diablo использует случайные числа в определенных пределах, которые помогают контролировать количество возможных вариантов.

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

Для игры в жанре RPG у Diablo 2 крайне динамичный геймплей: игроки могут наносить и получать тысячи атак в час. Поэтому в понимании игрока, сила атаки основывается на среднем показателе урона атаки(или нескольких атак). При получении нового оружия, игрок достаточно быстро поймет, что средний урон обновки сильно вырос, благодаря тому, что толпы врагов начнут умирать быстрее. Вот только серьезные прибавки(или уменьшения) к урону не являются проблемой — проблема лежит в небольших изменениях показателей, и в том, как интерфейс игры отображает СЗП в отношении урона.

Экран персонажа отображает урон в формате случайности в заданных пределах, а не в виде среднего числа. Конечно же подсчитать средний урон достаточно просто, но Diablo 2 эта не та игра, в которой пользователи должны сидеть с блокнотом и калькулятором под рукой. Такое иногда практиковалось в старых RPG, вроде D&D пятой редакции, в которой каждый раунд боя длился 6 игровых секунд, но занимал от 90 секунд до пяти минут реального времени, в зависимости от того, сколько игроков было задействовано. В такой системе у вас есть возможность и время просчитать все свою будущие ходы, сравнить характеристики оружия и умений, чтобы понять, какой способностью стоит воспользоваться дальше. Если бы нечто подобное присутствовало в Diablo, то вы никогда бы не выбрались из первого подземелья из-за огромного количества монстров и всевозможных видов оружия и скиллов, которые можно использовать.

Если же мы исключим возможность замедления игрового процесса ради проведения базовых математических операций, то насколько же серьезной проблемой является отсутствие показателя среднего урона от оружия? Давайте представим, что вам выпало 2 магических меча. У них одинаковые показатели по статам, но различные магических модификаторы. Первый меч даст вам +10 к максимальному урону. Второй меч даст вам +10 к минимальному урону. Какой из них лучше?

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

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


Влияние случайности в заданных пределах на боевую систему

Здоровье монстров также определяется случайным образом в определенных рамках. Возьмем Падшего на сложности Nightmar: среднее здоровье этого представителя демонических орд составляет 209HP. Однако оно может варьироваться от 131 до 288HP. Из-за того, что у каждого представителя группы врагов может быть разное количество здоровья, во время боя могут возникать достаточно интересные ситуации, особенно при использовании игроком заклинания массового поражения. Ниже показано группа Падших до и после использования Ледяного Копья.


Волшебница кастует свое заклинание, а монстры начинают бежать к ней. Некоторые монстры с маленьким количеством здоровья умирают после применения Ледяного Копья. Но так как количество здоровья врагов является случайной величиной, то монстры, которым повезло пережить атаку, образуют группу новой формы. Из-за этого игроку приходится принимать тактическое решение относительного того, куда ему нужно бежать, чтобы спокойно запустить следующее заклинание. Это один из лучших примеров того, как рандом в RPG системах может привести к игровым последствиям. Игрок не знает, что произойдет после применения умения(ведь урон и жизни врагов случайны и не отображаются на экране), поэтому ему приходится принимать тактические решения в реальном времени.


Но иногда влияние рандома чувствуется куда сильнее

В стиле стандартном для жанра roguelike игр, но крайне неприятном для широкой аудитории, все лучшее оружие и броня в Diablo 2 имеют встроенные характеристики и аффиксы основанные на СЗП. Лучший одноручные меч в игре (Azurewrath), к примеру, может иметь аффикс на увеличение урона на любое число от 230 до 270%. Это является причиной припадков у игроков топового уровня, которые тратят сотни часов стараясь найти хоть какую-то версию данного меча, но, естественно, хотят получить ту, в которой увеличение урона будет максимальным.

Любой, кто не полениться провести небольшое математическое изыскание, сможет понять, что случайное значение в аффиксе может изменить DPS Azurewrath'a всего лишь на 30, что составляет менее чем два процента. Однако подобное верно далеко не для всех предметов. Другой меч, под названием The Grandfather, имеет разброс до 100% в своих показателях, и разница по DPS у данного предмета может изменяться на 23% в зависимости от тех статов, которые вы получили. Однако, в среднем, разброс по прибавкам к урону зачастую меньше 50%, и даже эта цифра является крайне редкой и найти ее можно только на двуручном оружии.

Куда более серьезной проблемой являются предметы с маленьким разбросом. К примеру, уникальный шлем Valkyre Wing может предложить вам аффикс на +1-2 к умениям амазонки. На высоких уровнях игрокам достаточно просто компенсировать потерю 30DPS, но аффиксы на +умения полезны всем как на 5, так и на 85 уровне(некоторым билдам ближнего боя не нужны такие аффиксы, но большинство классов очень трепетно относятся к каждому предмету на +умения).

Ondal's Wisdom, высокоуровневый посох, всегда был одним из наиболее полезных предметов для кастеров. Он дает прибавку 45% к скорости каста, 5% к бонусному опыту и 40-50 энергии; просто великолепный посох. Однако он также дает +2-4 ко всем умениям. Максимальное значение дает куда больше бонусов чем минимальное, и игроки вполне закономерно будут расстроены, если им выпадет +2 вместо +3 или +4. В третьей части книги мы куда подробнее остановимся на том, как изменяется ценность предмета в зависимости от его аффиксов, однако уже сейчас должно быть понятно, что небольшой разброс в важных атрибутах куда ценее чем большой разброс в уроне. Конечно же это не значит, что игроки будут просто выбрасывать уникальные предметы, которые не получили максимальный бонус к статам. Все таки такое оружие и броню очень сложно найти. Они не завязаны исключительно на случайные аффиксы и могут помочь игроку даже при минимальных значениях случайных характеристик. Подробнее обо всем это мы поговорим немного позже.


Случайность в заданных пределах и генерация карт

Несмотря на то, что это можно не сразу заметить, Diablo 2 использует СЗП даже при создании карт. Процедурная генерация локаций является той темой, в которой в остальном невероятно подробная документация Diablo 2 оказывается бессильна(во многом из-за того, что опытные игроки используют мапхаки, которые сразу же открывают им всю карту, избавляя от необходимости вникать в подробности генерации локаций). К тому же создатели Diablo 2, с которым мне удалось пообщаться, не смогли в подробностях воссоздать каждый шаг тех методов, которые использует игра. Мы еще поговорим о создании карт в разделе посвященном рандомизации с помощью колоды карт, но в целом создание карты следует приведенному ниже алгоритму:

  1. Определяется общий размер карты.
  2. Определяется ориентация карты.
  3. Созданная зона обрамляется стеной, у которой есть свой алгоритм генерации.
  4. На карту добавляется основная ее особенность.
  5. Добавляются комнаты и/или объекты обстановки вроде домов или деревьев, которые заполняют место(рандомизация с помощью колоды карт, которую мы рассмотрим ниже).
  6. Добавляются монстры, основываясь на количестве врагов на квадратный метр карты(тоже рандомизация колодой карт).

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

На четвертом шаге генерации карты, алгоритм находит место основной особенности каждой конкретной зоны. Зачастую это вход в подземелье, вроде Cairn Stones в Stony Field, или портал в демонический мир, если мы говорим о пятом акте. Иногда эта особенность может быть каким-нибудь квестовым местом, вроде Tree of Inifus в Dark Wood. Независимо от типа этого "особого места" разработчики создали определенные правила, которые не дают ему накладываться на другие объекты, которые могли бы перекрыть к нему доступ.

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

Xкоордината = (Ось-X + 20 ярдов) / (МаксимумОсь-X – 20 ярдов)

Yкоордината = (Ось-Y + 20 ярдов) / (МаксимумОсь-Y – 20 ярдов)

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


Итоги случайности в заданных пределах

  • При создании СЗП всегда очень важно помнить, что игрок будет воспринимать только среднее значение между максимумом и минимумом, даже если они не знают, чему это среднее значение будет равно. Поэтому намного проще будет сразу сказать игрокам, чему будет равняться это среднее значение.
  • Маленький разброс величин(1-2) куда сложнее правильно сбалансировать чем большой разброс(1-100), особенно если речь идет о таких важных показателях как урон от оружия или модификаторы умений.
  • Случайность в заданных пределах является отличным способом установить ограничения для объектов на карте.

Предыдущие части:

  1. Вступление.
  2. История жанра ролевых игр.
  3. Базовые характеристики.
  4. Элементальный урон и синергия.
  5. Обзор Амазонки.
  6. Обзор Некроманта.
  7. Обзор Паладина и Убийцы.
  8. Обзор Друида и Волшебницы.
  9. Обзор Варвара.
  10. Историческое наследие action-игр.
  11. Особенности движения персонажей в игре.
  12. Эффекты контроля.
  13. Подведение итогов экшн-механик и проблемы интерфейса.