Я делаю мобильную ролевую игру, бесконечную, в которой есть система добычи, подобная 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)
источник
damage * damage / ( damage + defense)
), просто без учета урона навыка. Причина различия в DPS заключается в том, что вы используете одну и ту же защиту. Причина, по которой вы получаете разные результаты, заключается в том, что с этой формулой медленное, но сильное оружие лучше против врагов с высоким разрешением, а быстрое, но слабое оружие лучше против врагов с низким разрешением (что кажется правдоподобным). Вы приняли противника с высокой обороной и уравновесили против него оба оружия, а это значит, что вы одолели кинжал. Расчет DPS показывает, что это сила.Ответы:
Проблемы с вычислением DPS по этой формуле заключаются в том, что то, что вы называете
BaseDamage
, на самом деле не таково.Предполагая, что все числа положительные,
BaseDamage / ( BaseDamage + Defense )
всегда будут преобразовываться в числа с плавающей точкой где-то между 1 и 0. Неважно, если у вас есть 10BaseDamage
, 1 000BaseDamage
или 1 000 000BaseDamage
, вы всегда будете в этом диапазоне. Где этот диапазон зависит от того,BaseDamage
как оружие сравнивается сDefense
целью. Это означает, что на самом деле на порядок величины реального повреждения атаки влияет в основномSkillDmg
множитель.Глядя на эти математические свойства, я бы на самом деле не назвал это свойство оружия,
BaseDamage
а скорееDefensePenetration
потому, что он описывает способность оружия преодолевать оборону противника и при этом наносить большую часть его урона. На самом деле это может быть интересная механика (или нет ... это то, что вам нужно для тестовой игры), но она мало говорит об уровне мощности оружия.Итак, как мы решаем эту проблему?
Ну, нет правильного решения этой проблемы. Но изменение, которое может сделать то, что вы хотите сделать (вдвое мощнее оружие = примерно вдвое больше урона), это добавить
BaseDamage
еще один множитель:Если вам нравится механика защитного проникновения, которую вы случайно обнаружили, вот как она будет выглядеть
Penetration
в виде отдельной характеристики оружия:Приятно то, что эта формула достаточно хорошо масштабируется:
AttackFrequency * BaseDamage / 2
Изменить: Вот несколько таблиц с примерами значений:
Как вы можете видеть из этих цифр, оружие с высоким уроном и низкой скоростью все еще номинально сильнее против того же врага, чем оружие с низким уроном и высокой скоростью, если оно имеет одинаковый DPS в соответствии с
AttackFrequency * BaseDamage / 2
. Но эффект более заметен для врагов с высоким разрешением, чем для врагов с низким разрешением. Оба одинаково хороши для врагов 0-def. Это означает, что оружие быстрой атаки менее опасно для врагов с низким разрешением, чем для врагов с высоким разрешением.Это может быть уравновешено тем фактом, что высокоскоростное оружие дает игроку больше гибкости в распределении урона и, таким образом, позволяет ему не тратить впустую DPS на излишки. Когда игрок сталкивается с очень большим количеством очень слабых врагов, которые все умирают с одного удара, то оружие с 5 атаками в секунду может убить 5 врагов в секунду, в то время как оружие с 1 атакой в секунду может убить только 1 врага в секунду. Другое возможное преимущество появляется, когда вы добавляете случайность к атакам. Из-за закона больших чиселмногие слабые атаки наносят более гладкий и надежный урон, чем несколько сильных. Игроки обычно выигрывают от надежности. Но когда такие соображения не имеют значения из-за вашей игровой механики и / или дизайна столкновения, вам придется сделать свое более быстрое оружие немного более мощным, чем оно должно было бы компенсировать.
Одним из способов повышения быстродействия оружия может быть введение эффектов, которые срабатывают с вероятностью x% за удар и не зависят от урона. Они были бы намного мощнее с быстрым оружием, потому что они будут срабатывать гораздо чаще.
источник
SkillDmg
? Я предположил, что это мультипликативный фактор. Таким образом, есть базовая атака1.0
и специальная атака с двойным уроном2.0
. Если вы хотите, чтобы они были целыми числами, вы можете добавить ихBaseDamage
вместо умножения.BaseDamage * BaseDamage
), вы умножаете на BaseDamage только один раз (что означает, что BaseDamage уменьшается в формуле).Если вы намерены использовать оружие с одинаковой «силой» для получения равного DPS, простым решением будет назначить DPS напрямую и рассчитать урон от этого удара, например:
В этом примере ваш меч будет иметь 50 ударов в секунду и 1,0 скорости атаки, а кинжал будет иметь 50 ударов в секунду и 2,0 скорости атаки. Если вы хотите отображать урон за удар, это просто DPS, деленное на скорость атаки (т.е. 50 для меча и 25 для кинжала).
Обратите внимание, что это избавляет от механики «медленное оружие лучше против высокой защиты», что, я полагаю, именно то, что вам нужно.
источник