Статьи

Защити меня, Защита

…in one game I played there were objects with 99 DEF. This reduced damage to 1 for everyone, so that it would take 10 hits to harvest items from the object. It made more sense to do it unarmed, since unarmed attack speed was faster.
This simulated digging it up!

RJ McReady
из обсуждений механик Защиты на форуме Unity3D

В начале

В играх, основанных на конфликте, Защита/Броня (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

girl_with_diceПервой в нашем хит-параде механик будет Roll to Hit, механика из серии настольных ролевых игр D&D.

В игре существует так называемый АС (Armor Class) — класс брони, который определяет, насколько тяжело попасть по персонажу в бою.

Механика работает так:

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

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

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

Block / Parry

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

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

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

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

Если опустить прямой скилл игрока и считать Block только на вероятностях, то можно увидеть, что механика чувствительна к алгоритму счёта.

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

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

Здесь возникает вопрос приоритета расчёта: уклонение или блокировка?

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

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

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

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

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

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

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

Dodge / Evasion

o-THE-MATRIX-facebookОбе механики основаны на вероятности полного уклонения от входящего урона. Я объединил их, так как большой разницы между Dodge и Evasion, как правило, нет.

Но есть нюансы, о которых пойдёт речь ниже.

Dodge — работает непосредственно с направленной атакой и требует наличие атакующего, так как бросок на шанс работает именно на каждого отдельного атакующего. Механика Dodge обычно работает только с физическим уроном.

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

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

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

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

Damage Absorb

xena_arrowsМеханика основана на снижении входящего Урона. Одна из наиболее часто используемых механик.

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

DamageResult = DamageBase - Defense

В большинстве игр серии Final Fantasy нет отдельного параметра Защиты у персонажа. Характеристики Защиты содержатся в предметах или применяются через магические заклинания. В общем случае Защита делится на физическую и магическую.

Пример формулы (Final Fantasy IX):

DamageResult = (DamageBase - Defence) * DamageBonus

где DamageBonus — модификатор урона, зависящий от силы, уровня и рандома.

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

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

Resistance / Immune

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

Яркий пример навороченной системы Resistance/Immune в старом (и ныне всё ещё здравствующем) рогалике Angband.

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

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

В современных играх стараются использовать меньшее количество сущностей.

В Divinity: Original Sin резистов всего 6:

divinityРезисты, как правило, обозначаются в процентах. Механика работает аналогично Damage Absorb (к примеру, урон умножается на коэффициент резиста), только здесь поглощение Урона идёт по нескольким каналам, в зависимости от типа наносимого урона. Т.е. Урон Огнем поглощается резистом Огня, Урон Воды поглощается резистом Воды и т.д.

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

HP-growth

sumoЕщё одна разновидность абсорбирующей урон механики Защиты, основанная на наращивании HP дополнительными очками. Разница с Damage Absorb заключается в “отбрасывании” брони при каждом попадании.

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

Некоторые интересные примеры использования такой механики:

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

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

Armor Patterns

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

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

Рисунок из приложения Armor Inspector.

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

fallout4

Что в конце?

А в конце рассуждения на тему…

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

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

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

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

Отдельную благодарность выражаю коллеге по цеху - Николаю Шаповалову
из компании PlayFlock за интересные беседы по теме и идею для этой статьи.

11 комментариев

  • Николай Кузнецов

    По формулам было бы неплохо еще пару слов о принципе расчета Damage Absorb, когда первая единица брони дает большой процент поглощения, а 99ая – почти ничего не дает.
    Например, такая формула в wc3 и вышедшей оттуда доте:
    Damage reduction = ((0.06 × armor) ÷ (1 + 0.06 × armor))

    • Serge Himmelreich

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

      Вот формула из ArcheAge, тоже используется подобная модель:
      Damage reduction = def/(5300+def)*100%

      • Alexey Totmyanin

        А что, геймдизы ещё %% используют, вместо десятичных дробей? Шутю, канешь… 🙂
        Классная статья. А я вот всё Илье обещал практику по балансу экшен-шутеров написать на своём примере…

  • Алексей

    Как игрок с большим стажем, к сожалению, не почерпнул из статьи ничего нового. Все достаточно баннально. Хотелось бы более глубокого материала. Например, историй о том, как модель защиты выбиралась для конкретного проекта, взвешивались плюсы и минусы, последствия. Что-то из неочевидного. А не а-ля “у нас казуальный хак-н-слэш, поэтому вместо 100500 резистов, будет только один”. Еще интереснее – почитать о “работе над ошибками”, когда решения приводили к каким-то неожиданным проблемам. Надеюсь, на продолжение.

  • Serge Himmelreich

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

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

    Можно было бы просто перечислять игры с боевкой с разными системами защиты и приводить формулы. Такой вариант вам был бы инетресен?

    • Alex

      Сергей, спасибо за ответ!

      Перечислять игры с боевкой с разными системами защиты и приводить формулы не нужно :). Думаю, многие вдумчивые игроки и сами легко опишут системы защиты и распишут формулы для своих любимых игр. А некоторые даже классификацию предложат. Простое описание системы, или 10 систем – не совсем то…

      В конце статьи Вы ставите очень хороший вопрос: “Какую механику выбрать для своего проекта?” Но ответ очень краток: “Зависит от многих факторов: от участия скилла игрока, от сложности боевой системы, даже от сеттинга.” Хотелось бы развить эту мысль. Мне, как игроку (хоть и почти “бывшему”), это представляется больше как “чистое творчество” помноженное на большой кругозор в области механик. Также имеет место некое “чутье”, которое приходит с опытом.. Но, может быть, можно сформулировать какие-то паттерны, принципы?

      Если говорить о конкретной игре, то можно, например, посмотреть в сторону серии Heroes of Might&Magic. Наверняка, ее многие знают. Что если бы перед Вами стояла задача немного изменить механику боя (защиты) так, чтобы она “заиграла новыми красками”? Как бы вы оценивали идеи и выбирали решения? Например:
      1. Что если для юнитов ввести “броню” по типу StarCraft’а (когда она вычитается из урона). Крестьяне не смогли бы “пробить” титана… это плохо? а может, наоборот, интересные возможности для новых тактик и механик боя? Но это сложно сбалансировать? Вы бы стали обсчитывать такой вариант или сразу отвергли?
      2. А что если использовать более ярко выраженную механику по принципу “камень-ножницы-бумага”. Например: стрелки бьют летающих, летающие – воинов, воины – стрелков? Или использовать разные типы брони? Но так, чтобы армии в сумме были сбалансированы. Плюсы, минусы?
      3. Что можно было бы предложить вместо механики с атакой/защитой юнитов (те, что увеличивают/уменьшают урон на ~5% за очко)? К чему привела бы ликвидация этих параметров у юнитов (не героев! – им нужна прокачка) и соразмерное масштабирование HP(hit points) и урона? возможно, тогда старшие юниты имели бы слишком много HP и магия урона действовала бы на них слишком слабо по сравнению с low-tier юнитами?
      4. …

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

      В общем нужно что-то такое, “закулисное”… Надеюсь, мысль понятна… 🙂

  • Andrey Katorgin

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

Добавить комментарий