[Перевод] Как единственная строка древнего кода целых полгода сводила с ума разработчиков MMORPG

99461ebbff8a40ea51f15d7b00ab075f.jpg


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

Aliens: Colonial Marines была проблемной по многим причинам, но быстро стала всеобщим посмешищем, когда появились подобные виральные клипы, в которых ксеноморфы бессмысленно бродят по уровням. В этом месяце разработчик модов обнаружил, что причиной глупейшего поведения ИИ «чужих» стала одна ошибка в коде игры. (Об этом была статья на Хабре.) Упс. Но это не единственный случай за этот год, когда игра оказывалась унижена из-за упущенной клавиатурной опечатки. В начале 2018 года фанаты обнаружили, что ИИ Civilization VI подозрительно ударяется в религию: дело оказалось в том, что слово «yield» в коде было написано как «yeild».

Поэтому неудивительно узнать, что в разработке игр полно таких моментов.

Леа Миллер несколько лет работала дизайнером в бывшем разработчике MMO-игр Mythic Entertainment. Она занималась сценариями, дизайном контента и систем для Dark Age of Camelot и Warhammer Online: Age of Reckoning. В момент выпуска студия стала получать от фанатов жалобы: игра казалась медленной и малоотзывчивой. Игроки не могли определить, в чём конкретно была причина.
Это было просто… ощущение?

«Команда разработчиков пересмотрела систему боя, чтобы он ощущался более быстрым, и искала неэффективные операции на стороне сервера, от которых можно было избавиться», — рассказывает Миллер. «Но всё равно отзывы были слишком расплывчатыми, никто не мог сказать точно, в чём причина. Был ли это недостаток в общем дизайне игры? Вносилось множество изменений, чтобы улучшить ощущения от игры, и хотя многие из них были настоящими улучшениями, корень всех проблем устранить не удалось».

image


Warhammer Online не собрал большую аудиторию и в результате был закрыт в 2013 году.

Копаясь в коде полгода, команда разработчиков так и не могла найти решение.

Один из относительно новых программистов изучал код Age of Reckoning и обнаружил нечто странное. В нём по-прежнему оставалась строка, относившаяся к предыдущей MMO студии, Dark Age of Camelot. Она выполняла обработку игроков на дайлапе. Да, на дайлапе. Dark Age of Camelot была выпущена в 2001 году, в эпоху, когда широкополосное подключение ещё не стало стандартом. В то время игрокам приходилось следить, чтобы никто не поднимал телефонную трубку, иначе соединение разрывалось. (День, когда моя семья купила модем на 56K, был волшебным.)

«Он довольно недавно работал в компании и не был знаком с кодом», — рассказывает Миллер. «И возможно поэтому он изучал этот фрагмент более внимательно, чем остальные до него».

После удаления строки проблема исчезла. Игра снова стала плавной.

Так что же произошло? В наши дни компьютеры мощны, а Интернет быстр. Но в начале эпохи MMO всё было иначе, то есть играм приходилось идти на компромиссы.

«В сетевом коде Dark Age of Camelot была единственная строка, искусственно замедлявшая частоту передачи определённого типа данных клиентом и сервером», — объясняет Миллер. «Полагаю, основная цель этого заключалась в оптимизации загрузки сети, однако возможно это была часть системы, предназначенной для того, чтобы подключающиеся по дайлапу игроки были конкурентоспособны в PvP. Эта задержка была почти незаметна для игроков в Dark Age of Camelot, потому что боёвка игры была подстроена под стандартную ширину полосы и вычислительные мощности той эры. Только у очень малой доли игроков были системы, способные обрабатывать данные быстрее, чем они отправлялись и принимались».

c36609979079c464fdaad1eabc3ed9a5.jpg


В отличие от Warhammer Online, Dark Age of Camelot по-прежнему на плаву.

В процессе развития Dark Age of Camelot его сетевой код тоже эволюционировал и занимался такими функциями, как управление пиковыми значениями задержек, вход на серверы и другими задачами. Спустя десятилетие работы Dark Age of Camelot студия Mythic решила перенести тот же код в Age of Reckoning.

Как оказалось, он сломал функционал в совершенно неожиданном месте.

К тому времени, когда Mythic устранила проблему, большинство игроков вернулось обратно к World of Warcraft. Этот баг не был единственной причиной проблем Age of Reckoning, но он внёс в них свой вклад.

Миллер написала мне, когда я публично попросил в Twitter рассказать о других ужасных историях, даже если примеры касались не только таких нелепостей, как опечатки. Дискуссия совпала с обсуждениями в других кругах после инцидента с Colonial Marines, и мне хотелось бы поделиться самыми выдающимися историями.

Literally every single time I type the word «acquired» I have a PTSD flashback to Deus Ex 2 where we had a misspelled asset directory called AquiredDataText that we could never ever rename so I typed «aquired» for three years.

 — Brian Sharp (@bhsharp) June 29, 2018


Брайан Шарп: Буквально каждый раз, когда пишу слово «acquired», я испытываю посттравматический флешбэк с Deus Ex 2, в котором мы ошибочно назвали папку с ресурсами AquiredDataText, и не могли её переименовать. Мне пришлось три года подряд писать «aquired».

Right before launch of Undead Nightmare, the script on the zombie bait dynamite got a misplaced comment in the iterator that directed «actors» to walk to it. So, uh, it suddenly started working on Marston himself.
Plot twist!

 — Trick Dempsey (@TrickDempsey) July 17, 2018


Трик Демпси: Прямо перед выпуском Red Dead Redemption: Undead Nightmare в итераторе скрипта динамитной приманки для зомби была раскомментирована строка, направлявшая акторов прямо на приманку. Поэтому она внезапно стала срабатывать и на самого Марстона (главного героя).
Неожиданный поворот сюжета!

I shipped a game on PSP (so before patches) that would 100% crash on load if it was a leap year…

 — Matt Lacey (@LaceMattley) July 14, 2018


Мэтт Лейси: Я выпустил игру на PSP (то есть без возможности её пропатчить), которая стопроцентно, если год был високосным…

Typos that are enshrined into code are INCREDIBLY common. They’re also hard to remove in many cases because you have to consistently rename everything that uses the typo in order to not introduce new bugs.This is why the medical stats software I work on has Surigcal all over

 — Ailie (@cenuji) July 17, 2018


Эйли: навеки оставшиеся в коде опечатки встречаются НЕВЕРОЯТНО часто. Кроме того, очень часто их сложно устранить, ведь чтобы не добавлять новых багов, нужно постоянно всё переименовывать. Именно поэтому в медицинском ПО, над которым я работаю, повсюду встречается слово Surigcal (вместо Surgical).

I was once in a huge demo and pressed a button while saying «now you’ll see a blue ball» as a giant green ball appeared. Forgot to call the apply function. Tried to talk my way out of it but nobody bought it.

 — Andrew Eiche (@buddingmonkey) July 14, 2018


Эндрю Эйке: однажды я был на серьёзном демо-показе, нажал на кнопку со словами «сейчас вы увидите синий шар», и появился огромный зелёный шар. Я забыл применить функцию. Попробовал заболтать этот фейл, но никто не купился.

A few days ago, @cukiakimani reports Semblance was suddenly running at 19 Frames Per Second out of nowhere.

Turns out 1 line of my code was consuming 41 FPS. I found that absolutely hilarious. pic.twitter.com/V21hLfmrTg

 — South African Articulate Dolph Ziggler (@_benjamming) January 12, 2018


Дольф Зиглер: Несколько дней назад @cukiakimani сообщил мне, что игра Semblance внезапно начала работать при 19 кадрах в секунду.

Оказалось, что одна строка моего кода пожирает 41 FPS. Мне кажется, это совершенно восхитительно.

I had a project due at midnight but it wasn«t working right. i had an hour left, i had waited for a ta for 3 hours, and i was ready to cry. TA finally comes over, looks at my code for 30 seconds, tells me to change one variable on one line. It runs perfectly.

 — Trying his Best (@Willipossiblyam) July 14, 2018


Trying his Best: У меня был проект, который требовалось закончить к полуночи, но он не работал правильно. Оставался всего час, я ждал ассистента преподавателя уже три часа и был готов расплакаться. Наконец ассистент пришёл, полминуты посмотрел на мой код и сказал изменить одну переменную в одной строке. Всё заработало идеально.

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

В детстве я был одержим Super Mario 64. Это была первая игра, в которую я играл на японском, спасибо магазину импорта, находившемуся рядом с кинотеатром, в который мы часто ходили. (Они брали с людей деньги за час игры в импортную копию первого 3D-платформера про Марио! И оно того стоило.) Когда мне наконец удалось приобрести домой собственную копию Super Mario 64, я был одним из того множества людей, которые в процессе сбора 120 звёзд и поиска Йоши недоумевали, почему так невероятно сложно проплыть через подводные кольца. И причина нашлась!

You see this in a few Mario games. Lakitu was supposed to throw spinies directly at you in Super Mario Bros., but a typo in the code prevented him from aiming. And there’s this bug in Super Mario 64: https://t.co/GddMkpMZh4

 — Vincent Kinian (@Video_Game_King) July 17, 2018


Винсент Киниан: Этот баг можно увидеть в нескольких играх про Марио. В Super Mario Bros. Лакиту должен был бросать шипастых черепах Spiny прямо в игрока, но из-за опечатки в коде этого не происходило. А вот этот баг в Super Mario 64: https://t.co/GddMkpMZh4.

Потрясающе. Непонятно, как видеоигры вообще существуют.

© Habrahabr.ru