Firerate не работает на героях с бёрстами

Что мы имеем?

Вы когда нибудь задумывались почему в Deadlock герои с очередями практически не играются через ган урон? Я помню только мету, когда можно было играть ган лэша — это было ещё в сентябре прошлого года и причиной этому был откровенно перебафаный базовый урон пули. После его нерфа больше такого не было, хотя любой другой герой так или иначе когда-то игрался в ган. Так в чем же причина?

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

Так что же не так с оружием стреляющим очередями? Дело в том, что на них очень плохо работает файррейт. Вот смотрите: для всех героев, кроме героев с бёрстами, файррейт является линейным множителем урона, то есть если у вас $50\%$ дополнительного файррейта, то ваш DPS уменьшается $×1.5$. В случае с очередями это не так, на парадокс $50\%$ файррейта дадут $×1,16$ урона, на лэше $×1,24$ и на севене $×1,23$. Как говорили классики — “почему так нах*й”.

Давайте разберемся. Что оружию даёт файррейт? Он увеличивает количество пуль, которое вы можете выпустить за один и тот же промежуток времени. Как он это делает? Фактически он просто снижает задержку между выстрелами, но вот в чём дело — у большинства героев выстрел происходит моментально, он буквально занимает $0$ времени, в то время как у героев с бёрстами выстрел длится какое-то время. Если расписать это в виде формул, то получается так:
$cycleTime = shotTime + \dfrac{pauseTime}{1 + fireRate}$

$dpsMultiplier = \dfrac{shotTime + pauseTime}{shotTime + \dfrac{pauseTime}{1 + fireRate}}$

Но так как для героев без берста $shotTime = 0$, для них получается:
$cycleTime = 0 + \dfrac{pauseTime}{1 + fireRate} = \dfrac{pauseTime}{1 + fireRate}$

$dpsMultiplier = \dfrac{0 + pauseTime}{0 + \dfrac{pauseTime}{1 + fireRate}} = \dfrac{pauseTime}{\dfrac{pauseTime}{1 + fireRate}} = 1 + fireRate$

Теперь попробуем посчитать $dpsMultiplier$ для случая, где время выстрела очереди $= 1$, время паузы между очередями $= 1$, а бонусный файррейт $= 50\%$:
$dpsMultiplier = \dfrac{1 + 1}{1 + \dfrac{1}{1 + 0.5}} = \dfrac{2}{1 + \dfrac{1}{1.5}} = \dfrac{2}{1.67} = 1.2 = 120\%$

То есть вместо того, чтобы наш урон умножился на $1.5$, мы получили прибавку к урону, которую другой герой получил бы за $20\%$ файррейта вместо $50\%$. Если вместо $50\%$ взять $100\%$ бонусного файррейта то прибавка в уроне будет всего $34\%$, то есть зависимость даже не линейная, а логарифмическая. Для наглядности приведу ниже график зависимости множителя урона от бонусного файррейта. Прямая диагональная линия - это линия, которая обозначает рост DPS для всех героев с автоматическим и полуавтоматическим оружием, далее идут линии для Seven, Lash и Paradox.

    xychart-beta

    title "Зависимость DPS от бонусного firerate"

    x-axis "Бонусный firerate в %" [0, 25, 50, 75, 100, 125, 150]

    y-axis "Множитель урона" 1.0 --> 2.5

    line "Base" [1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5]

    line "Paradox" [1.0, 1.09, 1.16, 1.22, 1.27, 1.31, 1.34]

    line "Lash" [1.0, 1.13, 1.24, 1.33, 1.41, 1.47, 1.53]

    line "Seven" [1.0, 1.13, 1.23, 1.31, 1.39, 1.45, 1.50]

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

fullCycleshotTimepauseTime
Paradox0,660,380,28
Lash0,520,220,3
Seven0,520,230,29

Что можно сделать?

Первое, что можно сделать – это просто забить. В таком случае мы будем считать, что данная несправедливость это не баг, а фича, такая вот часть баланса игры.

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

Самый понятный вариант - в зависимости от бонусного файррейта сокращать время выстрела очереди так же, как сокращается время паузы между выстрелами: $$ cycleTime = \dfrac{shotTime + pauseTime}{1 + fireRate} $$ Этот вариант может нам не угодить, так как время выстрела очереди будет становится слишком быстрым, а анимация, возможно, станет неприятной.

Вариант чуть посложнее – всё так же сокращать только время паузы, но сокращать его так, чтобы $$ cycleTime = \dfrac{shotTime + pauseTime}{1 + fireRate} $$ Такой вариант имеет ограничение, ибо пауза между выстрелами не может быть ниже нуля, а значит $cycleTime \ge shotTime$, а $dpsMultiplier \le 1 + \dfrac{pauseTime}{shotTime}$. Если приводить конкретные цифры, то для героев, у которых $shotTime = pauseTime$ максимальный $dpsMultiplier$ равен $2$ и достигается при $fireRate = 100\%$.

Ну и третий вариант, как мне кажется самый лучший, но при этом требующий больше всего усилий от разработчиков, – при котором $shotTime$ и $pauseTime$ меняются по разному, но в сумме $cycleTime$ всё так же линейно зависит от $fireRate$: $cycleTime = \dfrac{shotTime + pauseTime}{1 + fireRate}$. Например, разработчик может решить, что $pauseTime$ должна снижаться в $2$ раза быстрее чем $shotTime$, тогда достаточно решить следующую систему уравнений: $$ \begin{cases} cycleTime = \dfrac{shotTime + pauseTime}{1 + fireRate} \\ cycleTime = \dfrac{shotTime}{x} + \dfrac{pauseTime}{2 \cdot x} \end{cases} $$ Ответом для неё является данная формула ниже, по которой прям в коде игры можно рассчитывать коэффициенты снижения $shotTime$ и $pauseTime$: $$ x = \frac{ -B + \sqrt{B^2 + 8,\text{fireRate}(\text{shotTime} + \text{pauseTime})^2} }{ 4(\text{shotTime} + \text{pauseTime}) } $$ где $$ B = \text{shotTime} + 2,\text{pauseTime} - \text{fireRate}(2,\text{shotTime} + \text{pauseTime}) $$

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

Конечно любой из вариантов исправления потребует дополнительной балансировки статов и способностей героев с бёрстами. Представьте, если итак имбовому Севену добавить возможность собрать файррейт и дополнительно увеличить свой урон в $2$ раза, не поменяв значения на его power surge — эта херня будет паблики насиловать так, как никогда не насиловал.

Заключение

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


tg: @kremovdl

После публикации этой статьи я планирую её перевод на английский, чтобы запостить на форуме forums.playdeadlock.com, а дальше будем посмотреть сделает ли Йоши что-то по этому поводу или нет.

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