Valve запустила серию блогов о разработке Dota 2. В первом выпуске рассказали о баге с бомбами Techies

Valve представила новую серию блогов под названием «Между линий». В ней разработчики будут рассказывать о сложностях, ошибках и счастливых случайностях, с которыми они сталкиваются во время работы над такой уникальной игрой, как Dota 2.

[Публикуется с сохранением орфографии и пунктуации источника]

Между линий: как мы бомбу чинили

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

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

Прекрасным примером последнего послужит ошибка с бомбами-липучками от способности Sticky Bomb Sticky Bomb у Techies Techies. Предпосылки к ней появились ещё в прошлогоднем обновлении, когда мы изменили способности героя и его стиль игры. Эти правки привели к тому, что при определённых условиях бомба-липучка существовала вечно, а создавший её игрок мог ей управлять. Любопытно, что тогда в игре не существовало обстоятельств, при которых эта ошибка могла бы возникнуть — так что она оставалась незамеченной до весеннего обновления «Новые горизонты», в которых появились Парные порталы.

Внезапно у героя появилась возможность создавать управляемые бомбы-липучки, которые можно было перемещать по всей карте и обрушивать на врагов в неограниченном количестве. Это, мягко говоря, давало некоторое преимущество, и вскоре о проблеме вовсю трубили на нашем GitHub.

В программировании игр в целом, и особенно в Доте, принято создавать что-то новое (не ломающее игру), взяв за основу что-то похожее (то, что работает и не ломает игру) и постепенно внося изменения. Прообразом бомб-липучек послужили классические мины от способности Remote Mines Remote Mines, которые использовали тот же базовый тип призываемого существа под названием npc_dota_techies_remote_mine.

Бомбы используют последовательность из броска, погони и отсчёта до взрыва, которая управляется набором серверных модификаторов (проще говоря, эффектов), регулирующих передвижение и поведение существа на каждом этапе. Запрет на управление игроками встроен в модификаторы погони и отсчёта, а эффект броска блокировал многие команды игрока, поскольку управлял движением. Всё это дополняли характеристики самого типа npc_dota_techies_remote_mine — в частности то, что код игры запрещает такому существу атаковать.

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

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

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

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

В общем, вот как ошибка с бомбами-липучками случайно появилась в игре, наделала шуму и исчезла благодаря тому, что сообщество рассказало нам о ней. «Что теперь?» — спросите вы. А теперь мы ждём, когда выяснится, что удалённая нами строчка кода отвечала за что-то ещё. Если что-то заметите — ждём вас на GitHub.

Читайте также

В комментариях под материалами на сайте действуют все правила портала, с которыми можно ознакомиться на специальной странице — https://dota2.ru/forum/rules/. Помимо этого, в комментариях к новостям существуют дополнительные ограничения:

  • Запрещены прямые и косвенные оскорбления авторов материалов, как и любые комментарии, не относящиеся к сути новости;
  • Указание на ошибки в материале происходит с помощью специального функционала. Комментарии с таким содержанием будут удалены;
  • Критика — это нормально, но выражать ее нужно без злоупотреблений. Ваши слишком грубые комментарии про личностей, представленных в новостях, могут быть удалены.
Аватар пользователя

Круто. Теперь жду статью в которой объясняется почему за меня 4 твари. А иногда и 5 даже.

Аватар пользователя
Аватар пользователя

Втф?PepePFF.png
Уборщицу решили навестить или еду ей принести?
Что случилось с разрабами?

Аватар пользователя
Аватар пользователя

Типикал изменения в доте:
взять старый код и старую абилку и на ней написать новую))
"ой откуда эта у нас баааги хмммм"

Аватар пользователя

Судя по скрину у Валв дикое легаси в коде, не удивлён, что над дотой никто работать не хочет и баги годами не исчезают

Аватар пользователя

Таак, молодой человек, объясняйте, что вы там такого увидели плохого)

Аватар пользователя

Возврат голых указателей и сравнение их руками с nullptr - это днище 15 летней давности, это не современный С++.
Я не удивлён, что в Валв такое говно никто поддерживать не хочет, кто будет в нашем 2173 году дремучей доткой заниматься, если в Валв под рукой всегда доступны проекты новее и интереснее.

Аватар пользователя

Ну хотя ладно, согласен
Мой аргумент был в том, что крупные древние проекты редко переносят версию со старой на новую ввиду того, что на это никто денег не выделяет (например со старых java8 на java17, столько лет прошло)

Аватар пользователя

Да так и есть, я подозреваю, что тут тоже никто ничего переписывать не будет как минимум до доты 3 (в компании из 400 человек при наличии новых проектов на это просто рук не хватит), и что внутри доты за 12 лет накопилось много очень страшных вещей и людей, желающих добровольно работать с этим, в компании просто нет.

Аватар пользователя

Можешь пояснить, в чем проблема легаси? Я практически ничего не понимаю.

Аватар пользователя

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

Аватар пользователя

Приятно, что они начали общение, заметно было еще с выхода патча

Аватар пользователя
Аватар пользователя
Комментарии
Форум