99 маленьких багов в коде: продолжение

Эх, очень давно не писал блоги. Времени нет, еще и патчи один охенней другого, да и багофиксы становятся болезненными и долгими. Однако тихонько прошел год с момента старта проекта, и карта уже распространилась на множестве локальных платформ. Поэтому, в выходной день, можно немного рассказать о провалах. А они у меня есть!

Fixed attack detection system being incorrect sometimes, causing lags or fatal errors

Мне рассказали о странном баге. Если  хускар ультовал в  Blademail, кидал копья и умирал, даже одно копье наносило в разы больше урона, чем должно. После нескольких попыток стало известно, что каждый ожог копья, кинутого перед ударом о  бм, регистрируется как атака и накладывает еще одно копьё, словно атака.

В процессе дебага стало известно, что флаг «магический урон», используемый примерно с самого начала Allstars, сбрасывался. Причиной тому стал именно  бм. Получая магический урон от копья, флаг активировался, а позже — снимался.
  1. копье активирует флаг и наносит урон;
  2. триггер горящий копий реагирует на урон, но флаг включен, т.е. это не копье;
  3. флаг снимается после реакции всех триггеров на урон.

Однако из-за участия  бм схема становилось иной —
  1. копье активирует флаг и наносит урон;
  2. урон перехватывается БМ;
  3. БМ активирует флаг и возвращает урон;
  4. БМ отключает флаг;
  5. урон от копья перехватывается любыми другими триггерами, а флаг-то уже выключен;
  6. копьё отключает флаг.

Налицо проблема с состоянием флага. Интеерсно, что этот баг не был обнаружен за целый год работы в Allstars и два — в LoD. Возможно, потому что реально от него выиграть может только  хускар и только против  BM.

Fixed Spin Web provided invisibility instantly
Баг варкрафта — при превращении юнитов из одной формы в другую они игнорируют fade time невидимости. Если бы  рики умел превращаться как  тролль, он бы мог мгновенно уходить в невидимость после каждого действия.

Пришлось поправить  бруду, чтобы невидимость выдавалась после превращения — только в этом случае игра реагирует корректно. Почему близзы так сделали — загадка.

Fixed  Dragon Tail cast range not being updated after morphing back
После обновления большей части активных способностей и оптимизации, все псевдо-касты (возвращения в нормальную форму после превращений) начали отсеиваться. Они не дают зарядов стиков, не сбивают таймер ульты в таблице и т.п. Однако при этом были забыты герои, где возвращение в форму скидывает какие-то их уникальные изменения, вроде дальности каста стана.



Обидная ошибка, но оптимизация — она такая. Увидеть проблему в одной из сотен изменных строк не было возможности.

Fixed visually incorrect selling price for  Diffusal Blade
В доте фрога у диффузов и барабанов есть проблема со стоимостью продажи. Всё из-за того, что игра считает их предметами с зарядами, а у игры на этот счет свои правила. Стоимость заряженных предметов зависит от количества зарядов, и при нуле становится равной нулю же.

Для фикса достаточно было выдавать заряды вручную, а игре сказать, что это предмет без зарядов, обычный такой стик.

Fixed fatal error if  Duel ends while one of participants cannot be attacked
В триггере дуэли был такой «конец» — когда кто-то умер, выдавался урон и отключался триггер. Но если оба выживали, то отдавался приказ бить оппонента. Проблема в том, что враг мог быть недоступен — находиться в астрале, быть скрытым с карты, да что угодно. И в результате приказ сбивался на «стоп». А что говорит дуэль, когда ты пытаешься её стопить? Правильно, отдает приказ атаки еще раз. И так мы входим в бесконечную рекурсию.

Вывод — отключайте триггер до того, как делать грязь.

Fixed bug with buying items while allied courier being dead

При выборе курьера, в которого следует положить покупку, не было проверки, жив ли курьер. Когда игра создавала предмет, он выпадал на землю, и из-за этого терял своего хозяина.



Хотфикс был очевиден, но каким образом я умудрился пролюбить проверку — вопрос.

Removed Tempest Double's duration bar due to issues with Manta Style
Попытался добавить клону  Zet полоску длительности. Конфуз вышел в том, что  Manta Style сбрасывает все бафы, и полоска длительности — один из них. Однако она крайне необходима юниту, он без неё мгновенно умирает — что и произошло. Чертова собака умудряется руинить не только катки.

Fixed fatal error with Syllabear
В первых же патчах были сняты лишние поля данных, включая те, в которых хранился мусор. По умолчанию игра воспринимает пустые поля как нули. Всё шло неплохо, пока…

Превращение в  медведя — это заклинание. Оно имеет свой уникальный ID и никак не может быть равным нулю. Проблема в псевдо-навыке обратного превращения — в форму друида. Этот скилл по какой-то причине близзард сделали иначе — он имеет ID равный нулю, однако при этом не является «нулевой» способностью. Но для абилки, которая превращает скилл с ID = 0 (потому что мусор вычищен, и теперь 0 — значение по умолчанию) в ID = 0 (опять же, из-за пустой ячейки в данных), это не имеет значения.



В итоге ульт  медведя после прокачки Synergy, который представляет собой такое превращение, но для Rabid, превращался в битый навык с нулевым ID. Естественно, его активация крашила игру, т.к. нулевой указатель и все прочие прелести чистого C без проверок на адрес обращения.

Пришлось вернуть кучу мусора, чтобы игра не воспринимала такие улучшения с нуля на ноль буквально.

Fixed fatal error with Winter Wyvern
Один из редких WC3-багов. Очень давно, еще в первые месяцы работы с LoD, я встретил баг — нельзя редактировать уровень способностей героя, если эта способность заключена в скрытую книгу заклинаний, а герой мертв. По какой-то причине* это приводило к крашу процесса.

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

Пришлось добавить проверку на то, мертв ли юнит, прежде чем настраивать уровень способности. Впрочем, это следовало делать изначально, правда?

* Возможно — по той же, что и баг с рошаном. Идет перерасчет здоровья, и текущее хп даже с бонусом остается нулем, из-за чего появляется деление на ноль. Правда, в случае с рошаном игра как-то спокойнее к этому относится, просто убивая юнита. А убить мертвого, видимо, рука уже не поднимается.

Fixed issues with Alchemist morph causing it's malfunction sometimes
Старый баг с ликаном ушел, и его место занял  химик. Воспроизвести баг с ним сложнее в разы — нужно, чтобы смерть пришла в момент превращения, причем строго до того, как появится таймер длительности. Но, конечно же, этот баг встретился уже трижды, и это только из числа тех, о которых рассказали.

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

Заключение

Количество патчей (и букв) — это не только результат распиздяйства стараний и упорной работы разработчика, но и работы тестеров. Спасибо тем, кто, несмотря на количество багов (особенно в ранних версиях) выбил из карты всё дерьмо и позволил довести её до состояния, когда лишь новые фичи могут создать баги, а не наоборот. Спасибо за поддержку!

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

avatar
пили ещё давно не было блогов
avatar
Баг варкрафта — при превращении юнитов из одной формы в другую они игнорируют fade time невидимости.

Килял абузом даунов до того как это стало мейнстримом.
avatar
«я оптимизировал! но а потом мне написали… поэтому я оптимизировал уже оптимизированное. вероятно это сработает. ыыы, не знаю»
надоже комуто потралеть
  • Loki
  • 0
avatar
Всё очень доходчево большое спасибо!:
Хотфикс был очевиден, но каким образом я умудрился пролюбить проверку — вопрос.

по сабжу:большое спасибо за проделанную работу!
avatar
Щяс уже мантой не побагают, изготовлена кастом манта не сбивающая таймеры длительности и другие полезные баффы, ждет своего внедрения в карту.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.