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: реальная причина происходящего изложена в этом блоге.
Видео:
Причина бага
Большинство хардкодных функций, влияющих на хп юнита, производят округление текущего здоровья до целого значения. Но абилки, сохраняющие текущее здоровья юнита в процентах, работают по другой формуле, чтобы точно знать, сколько хп должно остаться у юнита после добавления к максимальному хп.По какой-то причине добавление книги заклинаний (спелбука) с хотя бы одной любой абилкой юниту, максимальное здоровье которого модифицировано при помощи апгрейдов (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 способами:- Любой из Maim — Sange, Sange'n'Yasha, Halberd
- Leech Seed
- Time walk
11 комментариев