Roshan на один удар

Когда-то давно мегакрипы умирали от одного взмаха якорем  Tidehunter. На  Forge Spirit до сих пор нельзя применять барабаны, а  Void может стереть их с одного прыжка, даже не атакуя. Но, конечно, самым заметным примером этого бага остается  Roshan на один удар.

Видео:


Причина бага

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

По какой-то причине добавление книги заклинаний (спелбука) с хотя бы одной любой абилкой юниту, максимальное здоровье которого модифицировано при помощи апгрейдов (Hit Point Bonus, Hit Point Bonus %), приводит к пересчету текущего хп. Проблема в том, что формула не имеет проверки на некорректные значения.

Примерная формула:

y = ( x + upgradeHP)/( x — upgradeHP)
, где x — базовое здоровье юнита, включающее всевозможные надбавки от бонусов и способностей, а upgradeHP — здоровье от апгрейдов. В y помещается процент здоровья, который будет установлен юниту после расчетов.

Затем здоровье юнита устанавливается на totalHP * y.

Что это значит? Когда бонус, данный юниту через апгрейд, сравняется с его реальным здоровьем, в формуле появится деление на ноль и аварийный выход из процедуры. y будет принят за 0 и мгновенно убьет юнита. Когда бонус превысит максимальное хп юнита, y станет отрицательным, что мгновенно убьет юнита.

Отсюда можно сделать простой вывод: никакие повышения хп или маны не нужно делать при помощи апгрейдтов.

Естественно, реальная формула может (и должна) быть иной, но общее представление дает и эта.

Upd: реальная причина происходящего изложена в этом блоге.

Где используются апгрейды?

Крипы
За каждый апгрейд здоровье обычного крипа вырастает на 10, супер-крипа — на 18/19 (ближнего/дальнего). Базовое здоровье крипов — 550/300 для обычных, 700/475 для мега. Видно, что только при 30 уровне апгрейдов обычные дальние крипы начнут умирать от перерасчета. Мега-крипы вдвое раньше — на 16-17 уровнях апгрейдов.

Forged Spirit
Апгрейды дают им здоровье. Базовое здоровье духа — 200, каждый уровень апгрейда, основанного на Exort, добавляет 100 хп. Т.е. уже на 3-ем уровне Exort духи умрут от перерасчета.

Roshan
Апгрейд добавляет 500 хп каждые 4 минуты. При базовом здоровье в 7500 это значит, что уже через 15 апгрейдов (60 минут) он будет мгновенно умирать от перерасчета.

Как добавить книжку?

Книжку можно обеспечить 3 способами:
  1. Любой из Maim —  Sange,  Sange'n'Yasha,  Halberd
  2.  Leech Seed
  3.  Time walk

Кто убийца?

Убийцы нет, засчитывается суицид юнита. В случае Roshan важно лишь то, к какому клану принадлежит убийца. Т.к. отсутствие убийцы возвращает 0, это все еще корректный номер игрока (красного, сенты). Поэтому в обычной игре награду золотом получат сенты. В игре со зрителями слот 0 принадлежит зрителям — награды не получит никто.

Статус бага в Allstars

Roshan и Forget Spirit неуязвимы к багу. Time Walk больше не использует книжки. Остальное по-прежнему.

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

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.