Убить Рошана с одного удара - пояснение

В связи с тем, что информация о природе бага, описанного в топике про Рошана, была результатом предположений, её правдивость также находилась под вопросом. После лоботомии варкрафта Фукей сумел найти, в чем именно заключалась загвоздка игры с апгрейдами и спеллбуками. Далее приведен миниатюрный разбор ситуации by Fukkei.


Псевдокод того, как происходит добавление абилки

class AbilityBase
{
 virtual void OnAbilityAdded(UnitBase* u) = 0;
}

class SpellBook : public AbilityBase
{
 std::list<AbilityBase*> _abilitiesContainer;
 virtual void OnAbilityAdded(u)
 {
  for (auto a : _abilitiesContainer)
  {
   UnitAddAbilityInternal(u, a);
  }
 }
}

void UnitAddAbilityInternal(UnitBase* u, AbilityBase* a)
{
 RemoveUnitAbilities(u);
 abilTable[u->GetID()].push_back(a);
 a->OnAbilityAdded(u);
 RestoreUnitAbilities(u);
}

По коду можно понять, что если абилка — спеллбук с абилкой внутри, то UnitAddAbilityInternal вызывается 2й раз рекурсивно, что приводит, например, вот к такому результату:

Форж, exort lvl 1 (300 hp: 200 + 100), не получал урон:
  1. вызывается UnitAddAbilityInternal из jass api, добавляется спеллбук, дропается бафф от апгрейда хп, 300 — 100 = 200 макс хп, текущее хп ставится в 200 (ч-з SetUnitState UNIT_STATE_LIFE)
  2. вызывается UnitAddAbilityInternal из коллбэка спеллбука(OnAbilityAdded), он теперь должен добавить все свои внутренние абилки. добавляется абилка из спеллбука, опять дропается бафф ХП, 200 — 100 = 100 макс хп, текущее хп ставится в 100
  3. абилка внутри спеллбука добавилась, восстанавливаем баффы, 100 + 100 = 200хп
  4. спеллбук добавился, восстанавливаем баффы, 200 + 100 = 300хп

Если повторить шаги для exort lvl 2+, то видно, что на степе 2 максимальное хп юнита становится 0 и меньше.
Соответственно, перерасчет текущего хп юнита возвращает ноль (берет по модулю), т.к. текущее хп не может быть больше максимального и не может быть меньше нуля.
Что получается после SetUnitState(u, UNIT_STATE_LIFE, 0), думаю, не нуждается в комментариях.

Сама функция перерасчета текущего ХП работает корректно и деления на ноль там нет — после такой операции FPU бы кинул исключение и приложение упало.

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

avatar
Ром плиз выставляй приоритеты, на 60ой минуте рошана убьёт джагер с двух удраов или с одного, как раз вообще не важно, тем более на 60ой минуте он не будет соло там. Да мб у меня такой неготив потому что я ничо не понял, перечитываю 10 раз уже, все остальные посты, и даже стрим твой мне был понятен. Вообще не пойму причом тут эескорт?
ну про сашу-яшу все знают, да и редко
напишите хоть кто-то, кто на DCL видел что рошан упал с одного удара и это повлияло на игру как-то!
с уважением, просто первый пост от тебя который не понял, обидно
avatar
вот то что шторм не смог вылететь из когов, я видел, сейчас на дцл, и это повлияло на ход игры, при чем ни раз, щас вот дцл, и против шторма всегда берут клока, и он не может безболезнено вылететь из когов
дать вод?
avatar
Ты серьезно чувак? Рошана специально придумали жирным и дали ему аегис чтобы за него файты были а не кто то пришел ваншотнул и ушел!?!
avatar
Exort при том, что форж спирит умирает от прыжка воида из-за того же самого бага. Я тоже не понял, как эта объектно-ориентированная хуета вообще работает и как можно так кодить.

Но суть бага, видимо, в том, что, при добавлении некоторых бафов, игра сначала дважды снимает бонусное HP юнита.
avatar
Ну неужели никто не может обьяснить посты на корейском языке, которыми кто-то спамит
Зачем/кому это надо, почему айкап не может справиться с ними
И Куда пропали джас рассказы, почему нет новых выпусков?
avatar
Джасс расказ про свап венги, (напримиер как она свапает в бкб юнитов и т.д.)
avatar
Ну могу рассказать, если так интересно — свап венги основан на способности некромантов «Cripple' (рус. Увечье), что обеспечивает визуальный эффект, кнопку на панели приказов и прицел. Из за требования уровня больше 1 (ну тебе же нужно 6 лв), потому и кастуется в маг имунных юнитов. Само перемещение триггерное, тупо перемещает грубым перемещением юнитов местами, при этом сбивая все приказы…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.