Gamedev Глеб Диденко
3 736

Слово стороне «защиты»: снижение урона в играх

Механики, помогающие нам выжить.

В закладки

Основатель студии ORC WORK, продюсер и участник сообщества «Манжеты ГД» Сергей Гимельрейх написал статью о защитных механиках в играх. Он перечислил их преимущества, недостатки и привёл формулы, по которым их можно рассчитывать.

DTF публикует материал с разрешения ресурса.

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

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

Что это такое?

Практически в любой боевой системе существует базовое отношение величин — урона (Damage) и очков жизни (HP — Hit Points). Это отношение рассматривается в контексте двух юнитов на поле боя — «нападающего» и «защищающегося».

Самый простой бой описывается так:

  • HPDefenderResult = HPDefender — DamageAttacker

В этом случае роль защиты юнита берут на себя HP «защитника». Чем больше у него очков жизни, тем легче ему выжить.

Но чаще всего защита является дополнительной надстройкой над HP. Поэтому сразу определим параметр defense (защита) как сумму всех дополнительных защитных свойств юнита. Осталось найти место защиты в нашей формуле.

Здесь могут быть два базовых варианта (на самом деле больше, но они наиболее показательны):

  1. HPDefenderResult = (HPDefender + DefenceDefender) - DamageAttacker
  2. HPDefenderResult = HPDefender - (DamageAttacker - DefenceDefender)

Первый работает на увеличение очков жизни, второй — на снижение входящего урона. Но и это ещё не всё.

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

Введём фактор времени в отношении урона атакующего:

  • DPSA = DamageAttacker / AttackFQ

DPSA — Damage Per Second (Урон в секунду) для атакующего юнита (A), DamageAttacker — базовый урон юнита, AttackFQ — частота атаки юнита (в секундах).

Снова построим отношение юнитов в бою, только теперь через понятие «время до поражения юнита».

Обозначим его сокращением TTD (Time to Defeat):

  1. TTD = HPDefender / (DPSA - DefenseDefender)
  2. TTD = (HPDefender + DefenseDefender) / DPSA

По полученным формулам вычисляется время выживания юнита в бою. По сути, TTD — показатель живучести юнита, отражающий его защитные характеристики. Чем выше TTD, тем защищённее юнит.

Исходя из этого, «защита» — время выживания юнита в бою.

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

Механики

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

  • ​ Отношение защиты и урона в бою должно быть интуитивно понятно.
  • Механика защиты хорошо работает, если она построена на более сложных взаимодействиях, чем простое абсорбирование входящего урона.
  • Доля рандома в механике защиты не должна быть слишком высокой (следует учитывать длительность и монотонность боя, а также насколько важен в бою навык игрока).
  • Используйте возможности игрового мира для создания более интересной механики защиты.

Roll to Hit

Первая в нашем списке — Roll to Hit, механика из серии настольных ролевых игр D&D. В них есть так называемый АС (Armor Class) — класс брони, определяющий, насколько тяжело попасть по персонажу в бою. Это работает так:

  1. бросаем кубик d20;
  2. прибавляем модификаторы атаки;
  3. считаем полученную сумму;
  4. если она выше или равна AC противника – всё получилось, наносим урон. Если ниже – промах.

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

В дальнейшем Roll to Hit трансформировался в более стройные модели (Block, Dodge, Evasion и так далее)

Block / Parry

Механика Block основана на вероятности блокировании всего или части урона при помощи брони/щита или оружия (Parry).

Такой тип механики популярен в RPG и основан (так же, как и Roll to Hit) на вероятностной математике. Его отличие в тонкости применения при сочетании с другими защитными механиками.

В частности, для блокирования актуально наличие отвечающих за него предметов — это элементы доспеха или щит, который персонаж держит в руках. Механика может работать как проверка навыков игрока, когда тот принимает удар на щит (например, в Dark Souls или For Honor).

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

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

К примеру, вы хотите использовать три реакции юнита на атаку:

  • юнит блокирует (block), и получает уменьшенный урон;
  • юнит уклоняется (dodge — читайте раздел ниже), и не получает никакого урона;
  • юнит не блокирует, не уклоняется и получает полный урон.

Возникает вопрос: что рассчитывать сначала — уклонение или блокировку?

Первый вариант:

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

В этом случае событие, проверяющееся первым, будет происходить чаще. Вероятность первого срабатывания не модифицирована, а второго — снижается из-за отказа первого. Поэтому, когда у первой механики есть 60% шанс на провал, а у второй — 40% шанс на успех, реальный шанс, что второе событие произойдет, составляет всего 24% (60% от 40%).

Второй вариант:

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

Допустим, у персонажа есть 40%-ый шанс блокировки и 30%-ый шанс уклонения. Случайный бросок для блока дал 30% шанс, случайный бросок для уклонения — только 25%. В этом случае блок прошёл с запасом в 10%, а уклонение — с 5%. В этом случае юнит будет блокировать, а не уворачиваться.

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

Dodge / Evasion

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

  • ​Dodge работает непосредственно с направленной атакой и требует наличия атакующего, так как бросок на шанс проверяется для каждого отдельного нападающего. Обычно применяется только для физического урона.
  • Evasion позволяет уклоняться от AoE и прочих косвенных, не таргетированных атак. Бросок на шанс работает независимо от атакующего. Чаще всего используется как механика уклонения от нефизического урона.

Dodge и Evasion могут использоваться как дополнительные «слои» защиты в боевой системе.

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

Любопытный факт: в League of Legends механика Dodge была удалена с патчем 1.0.0.124. для снижения элемента случайности и усиления зависимости игры от навыков пользователя.

Damage Absorb

Механика основана на снижении входящего урона, её используют очень часто.

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

DamageResult = DamageBase - Defense

В большинстве игр серии Final Fantasy нет отдельного параметра защиты у персонажа. Характеристики содержатся в предметах или применяются через магические заклинания. В общем случае защита делится на физическую и магическую. Например, в Final Fantasy IX (DamageBonus — модификатор урона, зависящий от силы, уровня и случайности):

DamageResult = (DamageBase - Defence) * DamageBonus

Параметр Protection в Darkest Dungeon работает как раз по модели абсорбирования входящего урона. При этом он не может быть выше 80%.

Частным случаем Damage Absorb являются разнообразные дефлекторы/щиты в фантастических играх, которые восстанавливаются со временем.

Resistance / Immune

Частный случай механики Damage Absorb, основанный на разделении поглощения урона на типы/виды атак. Самый простой пример механики — разделение урона на физический и магический. Защита также разделяется на физическую и магическую. Такие приёмы используются во множестве азиатских RPG, в том числе в Final Fantasy. Яркий пример можно встретить в старом (и ныне всё ещё здравствующем) «рогалике» Angband.

Экран резистов (нижняя половина) выглядел так:

Разбираться в отношениях атак и сопротивлений приходилось долго и скрупулёзно. Такая модель хороша для хардкорных игр с длинным сроком жизни.

В современных играх стараются использовать меньшее количество сущностей. Например, в Divinity: Original Sin сопротивлений всего шесть. Их, как правило, обозначают в процентах. Механика работает аналогично Damage Absorb (к примеру, урон умножается на коэффициент), только здесь поглощение урона идёт по нескольким каналам, в зависимости от типа наносимого урона. То есть урон огнём поглощается сопротивлением огню, водой — сопротивляемостью водному элементу и так далее.

Immune, как правило, — частный случай Resistance, в котором поглощение входящего урона на канал равно 100%.

HP-growth

Ещё одна разновидность абсорбирующей урон защиты основана на наращивании дополнительных очков здоровья. От Damage Absorb подход отличается «отбрасыванием» брони при каждом попадании.

Яркий пример применения такой механики — броня в шутерах от первого лица. Вот интересные примеры её применения.

В Doom было два вида брони — синяя, имеющая более высокую прочность и поглощающая больший процент урона (½); зелёная броня (поглощала только ⅓). Также имелись элементы «бронированного бонуса» — их можно было собирать, чтобы восстановить текущую броню и даже увеличить её выше 100% (в случае с зелёной бронёй).

Half-Life — энергия HEV-костюма Гордона Фримена работает как обычная броня на механике HP-growth, хотя часть урона от пуль всё равно проходит в HP (комбинированная механика — HP-growth+Damage Absorb).

Armor Patterns

Использование позиции и геометрии объекта с разными параметрами защиты. Обычно применяется совместно с Damage Absorb, усиливая зависимость механики от навыка игрока.

Armor Pattern — одна из ключевых механик защиты в World of Tanks. Причём учитывается не только зонирование элементов техники, но и угол наклона брони относительно удара снаряда.

Приложение Armor Inspector

В Fallout также используется механика зонирования защиты на юнитах. За счёт этого геймдизайнерам Bethesda удалось разработать режим прицеливания V.A.T.S., когда в замедлении можно целиться в конкретные области для наиболее эффективного поражения юнита.

И это ещё не всё

Какую механику выбрать для своего проекта? Зависит от многих факторов: требований к навыку игрока, сложности боевой системы и даже от сеттинга.

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

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

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

#геймдизайн

Статьи по теме
Подкаст «Как делают игры»: механики жанра батлеров
{ "author_name": "Глеб Диденко", "author_type": "self", "tags": ["\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 13, "likes": 29, "favorites": 1, "is_advertisement": false, "subsite_label": "gamedev", "id": 6769, "is_wide": false }
{ "id": 6769, "author_id": 5399, "diff_limit": 1000, "urls": {"diff":"\/comments\/6769\/get","add":"\/comments\/6769\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/6769"}, "attach_limit": 2, "max_comment_text_length": 5000 }

13 комментариев 13 комм.

Популярные

По порядку

Написать комментарий...
6

"Немного мудака вам в камменты"

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

Ответить
0

Скорее всего, причина в предисловии ДТФ:
"Он перечислил их преимущества, недостатки и привёл формулы, по которым их можно рассчитывать." - после этого тоже начал ожидать всякого интересного. Но в статье всего лишь то, что обещал автор:
"Я расскажу про разные способы реализации параметра защиты у юнита, приведу немного математики, а также выскажу собственное мнение о нескольких механиках."

Ответить
–1

Советы даю, видимо вы недостаточно хорошо читали статью.
В каких явлениях я должен достаточно глубоко разбираться, чтобы статья была "очём"?

Последнее про "кучу лишних механик в балансе" совершенно не понял. Речь идет о каких-то конкретных играх?

Ответить
4

1) Вы написали статью о защите, в которой не упоминается понятия effective health, которое является основополагающим в рассчётах в балансе. Не надо так.
2) Нахрена вообще вводить понятие брони в игру, кесли можно просто давать бонус к жизням? Чем конкретно броня/уворот отличаются от бонусных жизней? Может быть иногда не стоит вводить механики митигейшена урона?
3) Какие минусы в механике уворота? Что делать со спайковостью урона, когда это критично? Какие формулы работы со спайковостью?
4) Если защита процентная, то что делать с экпоненциальным ростом выживаемости по мере прироста процента брони? Где формулы?
5) Если защита отнимает Х от урона, то где это можно использовать? Где нельзя и почему?
6) Реген как тип защиты, что с ним?

Я могу еще десяток таких вопросов написать.

Ответить
0

1) Это не механика, а методика оценки/расчёта. Опять же, по сути, она мало чем отличается от оценки времени выживания юнита в бою. Речь идет о механиках Защиты. Когда будем писать о балансировке, это будет к месту.
2) Если речь про поглощение урона, хороший вопрос, я такой же задаю каждый раз, когда мне рассказывают про процентный damage absorb без каких либо усложнений. Но когда речь идет о разделении типа урона или используется паттерн брони, механика хорошо играет. И не стоит смешивать броню и уворот. Опять же, уворот дает совершенно другие ощущения/эмоции от геймплея, в отличии от скучного отъема жизни в единицу времени.
3) Про минусы в механике уворота я упоминал в контексте излишнего рандома, который обесценивает скилл игрока, а так же в контексте последовательности расчёта. Безусловно можно было рассказать больше, буду работать над этим.
4) Да, методы ограничения роста выживаемости стоило бы добавить, уже третий запрос на этй тему. Спасибо, учту.
5) Тут скорее вопрос не где, а в каких случаях. Не планировал настолько подробно расписывать, но если звуит запрос на более глубокий анализ плюсов и минусов, приму к сведению.
6) Про реген примеры приводил в статье, но не раскрывал отдельно как механику, рассматриваю её как частный случай HP-growth.

Спасибо, пишите ещё конечно!)

Ответить
0

1-4. Полезная статья, спасибо автору.

Ответить
0

Спасибо!

Ответить
0

Вставлю свои 5 копеек
Во-первых, расчет уклонения, а после абсорб брони/блокирования зачастую зашито в механике попадания (расчет шанса попадания агрессора по персонажу защитника и шанса второго уклониться, и только после блок).
Во-вторых, ничего не сказано о экспоненциальном расчете брони/резистов, то есть невозможности полного 100% неуязвимости к урону независимо от того сколько бы не было защиты.
Ну и, "Допустим, у персонажа есть 40%-ый шанс блокировки и 30%-ый шанс уклонения. Случайный бросок для блока дал 30% шанс, случайный бросок для уклонения — только 25%. "
Кажись механика расчета там другая, что то, вроде BlockChance <= 100 – Random(100). Суть в том, что генераторы случайных чисел чаще выкидывают значения меньшие (число будет ближе к нижней границе, чем к верхней). Но это скорее дело техники…

Ответить
0

Максим, спасибо за интерес и уточнения.

О механике попадания/меткости - это конкурирующая механика, имеющая отношение, скорее, к Атаке, чем к Защите.

"о экспоненциальном расчете", скорее о тангенциальном понижении роста брони/резиста или функции, обратной экспоненте, или просто обрзание по капу. Но это уже детали. Цель статьи - познакомить с основными механиками Защиты, а варианты детальной реализации могут быть разными.

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

Ответить
0

Хорошая статья для начинающего ГД.

Ответить
0

скорее для влажно-мечтающих стать когда-нибудь ГД)

Ответить
0

На сухую нужно больше хардкора!?)

Ответить
0

Конечно)

Но я не согласен с теми, кто от Вас тут формул требовал: ГД и сами могут/знают, а студентам не по статьям учиться нужно.

А как ознакомительная статья - гут, спасибо.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Невероятно! Skyrim портировали на...
Подписаться на push-уведомления