Как создать формулу урона в РПГ, которая поддерживает сбалансированное оружие с разными скоростями атаки?

8

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

Формула, которую я использую:

float realDamage = SkillDmg * BaseDamage / ( BaseDamage + Defense )

Результаты хорошие, урон увеличивается, если защита снижается и не увеличивается экспоненциально из-за разделения ( BaseDamage + Defense).

Допустим, у меня есть меч со скоростью атаки 1,0, который наносит 50 урона. Это 50 дпс, и у меня есть кинжал, который я хочу атаковать быстрее, но, конечно, нанести меньше урона, для поддержания дпс логика говорит, что если скорость атаки кинжалов удваивается, урон должен быть уменьшен вдвое (скорость 2.0 с 25 дмг). Но используя формулу выше, вы увидите, что реальный урон DPS ниже, чем у меча.

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

Тем не менее, я хочу отобразить номер DPS на оружие. Если я просто покажу DPS кинжалов как 32 dmg * 2, скорость атаки составит 64 dps, по сравнению с 50 dps от меча, то ясно скажу, что кинжал лучше, но, конечно, это не так.

Возможные решения? Изменить первоначальную формулу урона? Если да, то к какому? Допустим, я не меняю формулу, есть ли решение? Мне действительно не нравится обманывать кинжал, чтобы нанести больше урона, чем половина, чтобы сделать его ровным ...

Я бы очень хотел знать формулу урона для Diablo 3. Я знаю, что DPS для оружия Diablo 3 - это просто базовый урон * скорость атаки.

Редактировать:

Lets assume defense = 50 and normal attack (skillDmg = baseDmg)

Sword 1.0 attack speed dealing 50 dmg -> real damage hit=  50 * 50 / ( 50 + 50 ) = **25 dmg** = 25 dps

Dagger 2.0 attack speed dealing 32 dmg -> real damage hit = 32 * 32 / ( 32 + 50 ) = **12.5 dmg** = 25 dps

Sword item, lets display the actual sword dps, 50 * 1.0 = **50 dps**
Dagger item, lets display the dagger dps, 32 * 2.0 = **64 dps** (SHOULD BE THE SAME)
marcg11
источник
1
В вашем редакторе у вас есть формула, которую я разместил в моем ответе ( damage * damage / ( damage + defense)), просто без учета урона навыка. Причина различия в DPS заключается в том, что вы используете одну и ту же защиту. Причина, по которой вы получаете разные результаты, заключается в том, что с этой формулой медленное, но сильное оружие лучше против врагов с высоким разрешением, а быстрое, но слабое оружие лучше против врагов с низким разрешением (что кажется правдоподобным). Вы приняли противника с высокой обороной и уравновесили против него оба оружия, а это значит, что вы одолели кинжал. Расчет DPS показывает, что это сила.
Филипп

Ответы:

20

Проблемы с вычислением DPS по этой формуле заключаются в том, что то, что вы называете BaseDamage, на самом деле не таково.

Предполагая, что все числа положительные, BaseDamage / ( BaseDamage + Defense )всегда будут преобразовываться в числа с плавающей точкой где-то между 1 и 0. Неважно, если у вас есть 10 BaseDamage, 1 000 BaseDamageили 1 000 000 BaseDamage, вы всегда будете в этом диапазоне. Где этот диапазон зависит от того, BaseDamageкак оружие сравнивается с Defenseцелью. Это означает, что на самом деле на порядок величины реального повреждения атаки влияет в основном SkillDmgмножитель.

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

Итак, как мы решаем эту проблему?

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

float realDamage = SkillDmg * BaseDamage * BaseDamage / (BaseDamage + Defense) 

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

float realDamage = SkillDmg * BaseDamage * Penetration / (Penetration + Defense) 

Приятно то, что эта формула достаточно хорошо масштабируется:

  • Даже когда защита жалкая по сравнению со значением атаки, урона никогда не бывает больше, чем атаки. Это дает вам верхний предел того, сколько урона может нанести персонаж, что значительно облегчает баланс.
  • С другой стороны, независимо от того, насколько высока защита, она никогда не сможет полностью смягчить урон (кроме как из-за ошибок округления), поэтому у защитника всегда есть место для улучшения и никогда не бывает совершенно бессмысленной атаки.
  • Когда Defence и BaseDamage (и Penetration, когда вы этого хотите) примерно одинаковы, realDamage примерно вдвое меньше, чем BaseDamage. Это верно независимо от того, насколько велики значения. Это также то, на чем вы можете основывать свою оценку DPS. Просто предположите, что у врага столько же защиты, сколько у оружия / атаки, что означает, что ваша формула DPS становитсяAttackFrequency * BaseDamage / 2

Изменить: Вот несколько таблиц с примерами значений:

 Damage by Defense for single attack     

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+------+-------+-------
       35 |    35 | 17.5  | 14.4 |  9.1
Attack 50 |    50 | 29.4  | 25.0 | 16.6
      100 |   100 | 74.0  | 66.7 | 50.0

 Dps assuming HitFrequency = 100 / Attack

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+-------+------+-------
       35 |   100 | 50.0  | 41.1 | 25.9
Attack 50 |   100 | 58.8  | 50.0 | 33.3          
      100 |   100 | 74.0  | 66.7 | 50.0

Как вы можете видеть из этих цифр, оружие с высоким уроном и низкой скоростью все еще номинально сильнее против того же врага, чем оружие с низким уроном и высокой скоростью, если оно имеет одинаковый DPS в соответствии с AttackFrequency * BaseDamage / 2. Но эффект более заметен для врагов с высоким разрешением, чем для врагов с низким разрешением. Оба одинаково хороши для врагов 0-def. Это означает, что оружие быстрой атаки менее опасно для врагов с низким разрешением, чем для врагов с высоким разрешением.

Это может быть уравновешено тем фактом, что высокоскоростное оружие дает игроку больше гибкости в распределении урона и, таким образом, позволяет ему не тратить впустую DPS на излишки. Когда игрок сталкивается с очень большим количеством очень слабых врагов, которые все умирают с одного удара, то оружие с 5 атаками в секунду может убить 5 врагов в секунду, в то время как оружие с 1 атакой в ​​секунду может убить только 1 врага в секунду. Другое возможное преимущество появляется, когда вы добавляете случайность к атакам. Из-за закона больших чиселмногие слабые атаки наносят более гладкий и надежный урон, чем несколько сильных. Игроки обычно выигрывают от надежности. Но когда такие соображения не имеют значения из-за вашей игровой механики и / или дизайна столкновения, вам придется сделать свое более быстрое оружие немного более мощным, чем оно должно было бы компенсировать.

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

Philipp
источник
Спасибо @Philipp, я думаю, что это решит. Урон будет слишком велик в данный момент, но я его подправлю.
Marcg11
@ marcg11 Для чего конкретно ваш диапазон SkillDmg? Я предположил, что это мультипликативный фактор. Таким образом, есть базовая атака 1.0и специальная атака с двойным уроном 2.0. Если вы хотите, чтобы они были целыми числами, вы можете добавить их BaseDamageвместо умножения.
Филипп
Я понял, что формула, которую вы дали, точно такая же, как моя, если я установлю skillDamage в качестве множителя. Поэтому я все еще не могу наполовину повредить кинжал, если удвою скорость атаки, чтобы сохранить урон.
marcg11
@ marcg11 Нет, это не то же самое. Основное отличие состоит в том, что я умножаю на BaseDamage squared ( BaseDamage * BaseDamage), вы умножаете на BaseDamage только один раз (что означает, что BaseDamage уменьшается в формуле).
Филипп
Но мой skillDmg никогда не был процентом, нормальная атака skillDmg такая же, как baseDmg, поэтому она такая же.
Marcg11
0

Если вы намерены использовать оружие с одинаковой «силой» для получения равного DPS, простым решением будет назначить DPS напрямую и рассчитать урон от этого удара, например:

float realDamage = (SkillDmg * DPS / ( DPS + Defense )) / AttackSpeed

В этом примере ваш меч будет иметь 50 ударов в секунду и 1,0 скорости атаки, а кинжал будет иметь 50 ударов в секунду и 2,0 скорости атаки. Если вы хотите отображать урон за удар, это просто DPS, деленное на скорость атаки (т.е. 50 для меча и 25 для кинжала).

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

Рутер Рэндом Мели
источник
Да, это более или менее идея, но вместо DPS я использую значение, одинаковое для всех видов оружия уровня x
marcg11