Маленькая ретроспектива

730 дней — именно такой срок потребовался для многострадальной DotA Allstars 6.88, чтобы увидеть свет в качестве стабильной версии. Полторы тысячи строк ченжлогов, десятки перекрестных багов, долгие дни ожидания баг-репортов, личностные проблемы с мотивацией, временем и целями, да и просто личные проблемы — всё играло против проекта.

Патч 6.86 вышел в DotA2 в середине декабря 2015 года. Большинство изменений были достаточно тривиальными, но были и те, которые явно ломали возможности варкрафта. Пожалуй, самой невозможной тогда была новая способность войда увеличивать кулдауны заклинаний на ходу, о чем и было написано в блоге чуть позже. Тем не менее, заниматься переделкой патча было некогда — жизнь била ключом по голове.





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

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

Я заставлю тебя страдать


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

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

Количество фаталов резко выросло, а причина всё так же оставалась неизвестной — судя по логам, вылетал какой-то штатный модуль игры, в который мы вообще не лезли. Более того, повторить баг ни мне, ни Князю не удавалось — автору для этого требовалось 5 секунд, нам — и часа мало. И только по чистой случайности мы обнаружили проблему в звуковом модуле! Все эти новые вылеты случались только у тех, кто играл со звуком. А мы (команда доты), имея десять лет КВ опыта, играем только под свой саундтрек, и поэтому воспроизвести фатал не могли. Но дальше больше — оказалось, что так и должно быть! Звуковой блок часто возвращает исключение при попытке воспроизвести звук, например, реплики юнита при клике. Сама игра обрабатывает их бесследно — просто игнорирует, а вот наш обработчик исключений не знал о таких тонкостях. Пришлось отказаться от автоматической передачи краш-логов на сервер по причине этих самых ложных срабатываний, из-за которых происходил реальный фатал.



Мало-помалу, но к началу 2017 года большинство проблем удалось устранить, так или иначе. Спасибо РГЦ, которые согласились приютить бета-версию в отдельной комнате для ускорения тестов. Фактически, они спасли карту от забвения — из-за сложностей ИРЛ в ноябре 2016 года были серьезные мысли забросить всё и отдать исходники в паблик, авось кто-нибудь подхватит. Но, благодаря поддержке РГЦ и появлению бета-тестирования, мотивация была возвращена обратно.

Переход к активным тестам
Бета велась довольно широкой аудиторией — местные игроки, ставшие первой волной тестеров, натащили своих друзей и проводили десятки матчей в день. После 85, которой тогда уже было более полутора лет, это было глотком свежего воздуха — новые предметы и фишки никого не оставили равнодушным. Тем не менее, из-за того, что РГЦ перешли на патч 1.27 ради поддержки современных операционных систем, мы снова начали воевать не с картой, а с самой игрой.

О проблеме случайного повреждения памяти я косвенно упоминал, как и о баге с чтением игровых файлов на новом патче. Просто уточню, что даже сами Blizzard признали наличие в 27 серии патчей проблем с управлением памятью, из-за чего иногда игра сама по себе умирала. Но были и более экзотичные баги.

Например, новые проблемы с синхронизацией. Очередное качественное изменение, никак не документированное, заключалось в изменении учета способностей юнита. Если в 1.26 можно было подменить способность так, чтобы у одного игрока это была способность X, а для всех других — Y, то в 1.27 это приводило к десинхронизации. Мы предприняли все необходимые меры, но стабилизировать больного не удавалось — новый патч просто сломал эту фишку, создав очередные трудности на ровном месте. Ловить этот десинк тоже пришлось долго, потому что такая подмена используется буквально в одном месте — при работе с гемом, чтобы отобразить анимацию над головой для союзников, но не для врагов.

Нам удалось найти компромисс в виде переключателя 1.26 на DirectX9, после чего патч откатили и работать над картой снова стало легче. Следующий мажорный баг удалось решить только в июле этого года, когда были найдены хоть какие-то зацепки. Он мучил карту на протяжении полугода, мешая ей попасть в категорию «ну хоть как-то стабильна». Остальные ошибки и проблемы имели реальные причины и воспроизводились так или иначе. Начиная с августа, карта развивалась в сторону новых фишек и полировки старых острых углов — частых фаталов уже не осталось, лишь единичные случаи.

Пилите, Шура


Нередко я слышал вопрос — почему нельзя забить на эти фаталы и просто добавлять контент из новых патчей? Для меня это звучит немного странно. Мы не какая-то фирма вроде Apple, которой хочешь или нет, а надо выпустить новую линейку строго к определенному сроку. Создавая новое на базе старого, возможно — с серьезными ошибками, мы лишь увеличиваем объем последующих багов. В начале пути мемхака большинство изменений проводилось локальными патчами значений — и это рискованное решение, т.к. многие игровые структуры зависимы друг от друга. Многих проблем можно было бы избежать, знай мы об этом раньше.

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

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



Эти два года были самыми настоящими американскими горками для мотивации и успехов. Резкий подъем с появлением мемхака, падение под гнетом реальной жизни и бесчисленных багов, вызванных вмешательством в мозги игры. Затем переход на новый уровень понимания байт-кода и появление собственных средств для дебага, первые релизы с относительно редкими фаталами — и полное фиаско на сетевом уровне. Первые полноценные партнерские предложения (девичьи ломки икапа даже предложением назвать-то нельзя) и возвращение к активному развитию проекта перетекли в плавающие фаталы и проблемы 27-го патча. На данный момент всё завершилось на приятной ноте — карта стабильна и выдерживает ряд последовательных каток у большинства пользователей.

Итак
Что принесли нам эти два года в плане изменений?
  • расширенные подсказки по броне, скорости передвижения, атаке и т.п.;
  • поддержку широкоэкранных мониторов;
  • манабар и просмотр скиллов на союзниках без расшаривания контроля;
  • собственные хоткеи, что позволяет избавиться от доп. программ;
  • бинды на инвентарь, позиции скиллов, шмотки в магазинах;
  • модифицируемый интерфейс;
  • информационные клики;
  • поддержка HP-баров а-ля дота2, красное бей, зеленое хиль;
  • двойные клики по хоткею для быстрого использования таргет-скиллов на себя самого;
  • улучшенная отзывчивость за счет снижения встроенной задержки -lat;
  • сотни оптимизаций для ускорения работы игры на слабых компьютерах;
  • сотни исправлений багов, взаимодействий скиллов и предметов.

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

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

Спасибо, что с нами и помогаете тестировать эту махину. Без вас всего этого уже бы не существовало.

2 комментария

avatar
Большое спасибо!
avatar
такое чувство что изначальный текст составлял вдвое больше и даже в нём не было описано всех перипетий и открытий произошедших за два года
  • Loki
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.