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

Автор оригинала: Patrick Klepek
  • Перевод

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

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, потому что боёвка игры была подстроена под стандартную ширину полосы и вычислительные мощности той эры. Только у очень малой доли игроков были системы, способные обрабатывать данные быстрее, чем они отправлялись и принимались».


В отличие от 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, и мне хотелось бы поделиться самыми выдающимися историями.


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


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



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


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


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


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

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



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

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

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


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

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

Похожие публикации

Комментарии 80

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


    которая стопроцентно что???
      0
      крашилась
        +16

        гранату

          +4
          Спасибо, исправил. Про опечатки лучше писать в личку.
            +1
            Похоже эта ошибка занимает первое место. Хотя, впрочем, если игра спустя год-два была всеми позабыта, то и не страшно.
              0
              Это если её не выпустили к Рождеству перед високосным годом %)
              +4
              Целиком бутылку кока колы
                +2
                Знамо что
                image
                  0
                  «главное выпустить», «бизнес цели важнее технического долга», «потом поправите». итд и итп. ой, вложили миллион долларов и все просрали. ну. бывает.
                    0
                    Да, но только если год был високосным
                    –12
                    Да, на дайлапе


                    Что значит дайлап? dial-up?
                      +17
                      Если это не сарказм, то сейчас половина хабра ощутила свою стартость
                        +8
                        Возможно человек намекает на более распространенное произношение «диалап».
                          0
                          Ага, видимо эти же люди теперь, в попытке исправить ошибку, говорят «андройд»
                          0
                          «стартость»
                          в комментариях к посту про опечатки зашкаливает количество опечаток
                            0
                            Стартость — антоним тормознутости.
                          +5
                          die lap, мертвый круг
                            +8
                            Позанудствую.
                            Всё же, «мёртвый круг» – это «dead lap», «die lap» – это «умри, круг».
                              0
                              Может это на немецком
                              0
                              +3

                              Это из классики. "Дай, Джим, на счастье лапу мне" (С.Есенин)

                                0
                                «Дайлапу, Джим, на счастье мне»
                                –3
                                Ответ на вопрос почему разработчики не могли полгода найти проблему здесь:
                                Игры — это усложнённые, неприручённые чудовища, соединённые чем-то вроде цифровой изоленты. Не удивительно, что они разваливаются на части.


                                Если так относится к разработке и оправдывать это, то ничего хорошего не будет. Либо проблема была сложнее, чем описано в статье, либо их производственные процессы были хламом. Снятие нетстатистики это рутинная процедура, которая должна выполняться каждую неделю.
                                  +5

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


                                  И если вдруг побеждает архитектор — то мы об этом случае, скорее всего, не узнаем.

                                  +1
                                  хха, у нас от большого ума назвали поле outofwork, в котором значение 1 означало «работает». И потом больше 10 (десяти) лет это было невозможно устранить, пока не сделали полностью новый продукт.
                                  Все про это знали, и всё равно регулярно возникали идиотские ошибки в приложениях.
                                    –5
                                    И везде всегда использовали 0 и 1??? Тут проблема явно не в названии переменной.
                                    Делается так:
                                    enum
                                    {
                                        OUT_OF_WORK = 0,
                                        WORK = 1
                                    }
                                    присваиваем только значения из enum'a, во всех сравнениях сравниваем только со значениями из enum'a.
                                      +7
                                      ну, ёлки-палки, ясно же, что не так всё примитивно. И не надо так радоваться, думая, что енумы никому, кроме Вас, неизвестны. Речь вообще шла о модели данных в хранении, а не о языковой структуре. Просто не стал вываливать всю внутреннюю кухню, потому что не об этом речь, а о том, что значение действовало строго обратным по отношению к названию образом.
                                        +2
                                        Хаха. В Jagged Alliance 2 был баг, из-за которого было практически невозможно при генерации персонажа получить черту характера («дружелюбный», «одиночка», «психопат» и т.д.). Дело было в том, что в игре (написанной на Си) использовался enum с чертами характера. Но не один, а два, один в движке игромеханики, а другой в GUI. И они немножко отличались (порядком и числом элементов). Но т.к. это си, когда разработчики смешали разные энумы в кашу компилятор это молча съел. А милая фича с характером главного героя, определяемым ответами в анкете была рождена мёртвой и два енум её не спасли.
                                          0
                                          да, разные модели для логики и отображения (а еще хранения, а еще получения данных с сервера) — боль и необходимость. Боль, потому что неизбежны расхождения и путаница, необходимость, потому что тяжело свести все к универсальной модели
                                            0
                                            В джаге код графики, гуя и геймлогики даже не пытались как-то разделять, оттого множество багов. Просто студентам надо показывать как не надо делать.
                                              0
                                              в играх очень тяжело отделять графику от логики, так как игры по сути это танец графики )

                                                0
                                                Ну это разве что в Марио каком.
                                            +1
                                            гм… типа такого?
                                            Заголовок спойлера




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

                                            outofwork bit not null,


                                            И куда там эти ваши константы пихать?
                                            0
                                            в игровом фреймворке Phaser CE в эмиттере частиц параметр frequency означает период, а не частоту
                                              +1
                                              «И при мысли, что Степану тоже плохо, Ивану вдруг стало хорошо» :-)
                                              Спасибо, полегчало. Беда только в том, что описанный мной косяк был не в игрушке, а в системе оперативного управления весьма важной отраслью промышленности. Так что приходилось все эти годы с особым тщанием вылавливать постоянно нарождавшихся клопов.
                                                0
                                                Пол всегда указывался 1 — мужской, 0 — женский (даже не знаю почему, смайлик), но в одном месте сделали наоборот. Приходит текстовый файл с такими данными (csv), вгружается и вызывает удивление (пол 1,0 и там и там, программист даже не подумал при написании импорта,, а просто присвоил значение).
                                                  0
                                                  По нынешним временам даже простое указание на то, что пол вообще задан — немало.
                                                    0
                                                    В системах, с которыми работал, пол должен быть задан (для пользователя магазина, конечно, пол опционален).
                                                      0
                                                      Скоро эти системы устареют, судя по всему :-)
                                                      Или, по крайней мере, битом не обойдёшься. Надо добавить «не помню», «в процессе смены» и прочие состояния.
                                                        0
                                                        Только в мечтах анархистов. Я понимаю что вы на всякие ГДПРы намекаете, но тут такое дело — взрослые запрещают детям брать спички, но не себе. ГДПР как раз такие спички, а коммерческие компании — такие дети.
                                                      0
                                                      Господи, раньше даже для партийности 1 бита хватало, а сейчас поле пол требует строки неограниченной длины…
                                                        0
                                                        Господи, раньше даже для партийности 1 бита хватало, а сейчас поле пол требует строки неограниченной длины

                                                        А-а-а! Вот это отточенность формулы! Украду, непременно украду. Спасибо.

                                                        2 mayorovp:
                                                        Вот потому-то я всегда вместо sex/gender предлагаю писать isMale/isFemale
                                                        … а также InProcess, NotSure и Obsolete.
                                                          0
                                                          А-а-а! Вот это отточенность формулы! Украду, непременно украду. Спасибо.
                                                          Все уже украдено до вас, если честно.
                                                            0
                                                            ага, public domain, отсюда и отточенность. Ну, тем лучше.
                                                      0
                                                      Вот потому-то я всегда вместо sex/gender предлагаю писать isMale/isFemale
                                                        0
                                                        Вот сейчас всякие FTM G*y обидеться могли.
                                                        PS. И нет, не спрашиваете откуда я эти термины знаю
                                                          0
                                                          Не вижу причин, по которым они могут на isMale обидеться сильнее чем на булев sex
                                                            0
                                                            Знаете, у нас раз в заявке был пол не указан, и по результатам анализа было выдано два диапазона референсных значений (и для м, и для ж этого возраста).
                                                            На вопрос «какого фига?», программист ответил: «а что надо было выдавать?». А выдавать-то не надо было ничего, ибо то были анализы для лошадок…
                                                            Так что булевое поле вообще так себе вариант для некоторых поля, ведь в какой-то момент вдруг окажется, что модель данных немного не подходит к ситуациям.
                                                              0
                                                              Я вас не понимаю. Сначала вы про каких-то FTM G*y упомянули что они обидятся, сейчас защищаете булево поле… Зачем?
                                                                0
                                                                Я наоборот, так-то, про то, что isMale/isFemale — маловато будет.
                                                          0
                                                          Это хорошо если Sex/Gender. Там, вроде, вооще Pol был. Импортозамещение.
                                                            0
                                                            PACIENT, KLIENT, VOZRAST, POL и при этом NAME, DATE, USER…
                                                            мне кажется, это болезнь некоторых программистов смешивать английские слова с транскрипцией в наименованиях переменных и полей бд…
                                                              0
                                                              От незнания языков, мне так кажется. Name — понятно ещё со школы: my name is Vasya. Всякие юзердейты тоже встречались в системе, а klient — отголосок забытого школьного немецкого. Вот с sex хуже — «с СССР секса нет», потому pol. И путаница с этими Fist/Last Name, хорошо хоть не Otchestvo (MiddleТame/mname видел только), но поле с вычисленным Иванов И.И. — FIO (и даже был UserFIO).
                                                                +1
                                                                Fist/Last Name, хорошо хоть не Otchestvo (MiddleТame/mname видел только), но поле с вычисленным Иванов И.И. — FIO (и даже был UserFIO).
                                                                NAME1, NAME2 и FAMIL…
                                                      +1
                                                      Это очень популярная ошибка. Настолько популярная что я всегда уточняю о каком именно frequency идет речь когда я вижу это слово где-то в программе…
                                                        0
                                                        Ещё одно больное слово — «скважность». Звучит необычно, и применяют его частенько по Алисиным правилам.
                                                    +2
                                                    Я забыл применить функцию
                                                    Звучит странно. В геймдеве и контексте этой фразы не силен, но не проблема ли в том, что он забыл вызвать функцию apply?
                                                      0

                                                      Ну не знаю. Про чужих был действительно эпичный баг, и про диалап. А остальные примеры — вещи рядовые, случающиеся со всеми играми. Кстати, никто не знает, где жена Мэнкрика?

                                                        0
                                                        В чужих не играл, но кроме видео где альбинос чужой ходит в развалочку, чет ничего не видел. Было бы прикольно увидеть сравнения до и после, типа «До исправления чужой сидит в углу, пускает слюни и мычит, после исправления — накидывается и разрывает на части».
                                                        навеки оставшиеся в коде опечатки встречаются НЕВЕРОЯТНО часто. Кроме того, очень часто их сложно устранить

                                                        я думал я один такой) иногда и правда проще забить на опечатку/ошибку.
                                                      0
                                                      Шутку про Defiance не перевели, жаль. Историю с выкидыванием других игроков из машин я застал, а вывалиться прямо на ходу самому — и сейчас можно запросто, если пинг выростет или скакать будет.
                                                        0
                                                        А можно точнее, где прочесть? Поиск в оригинале ничего не нашел, а так заинтриговали
                                                          0
                                                          Обе статьи зачем-то были отредактированы, но в оригинальной осталась ссылка на твиттер.
                                                          Если очень кратко, то вот она.
                                                        0
                                                        Про Aliens: Colonial Marines до сих пор не пойму. После выхода игры как только появилась рабочая таблетка проходили ее в кооперативе с другом и никаких проблем с ИИ не было. Отличная игра. Либо пиратина была уже лечена от этого бага либо в коопе он не наблюдался.
                                                          0
                                                          Я вот не понимаю, почему люди не пользуются спеллчекером?
                                                            0
                                                            Потому что не все ide поддерживают auto spell-check. Xcode например не поддерживает.
                                                            А на тот момент, когда писались эти игры, я думаю большинство ide / editor не поддерживали.
                                                            Вручную проверить каждое полу-тривиальное слово, конечно, тоже не вариант.
                                                            +2
                                                            Тем кто делал вархаммер нужно сразу руки вырвать. Лор был сделан шикарно, художники тоже молодцы, но геймплей никакущий, идеи у игры как будто нет. Еще и позвали в консультанты всех тех кто успешных ммо в жизни своей не сделал ни одной.
                                                              0
                                                              Про лор и художку — это бесспорно. Возможно именно за счет антуража дело вахи не умирает: группа энтузиастов успешно завела маленький свечной зав... шардик. За три-четыре года поднялись от базового уровня до полной реализации всех механик боя и потихоньку перепиливают неудачные решения в механике.
                                                                0
                                                                А как они это делают? Это опен-сорсный сервер?
                                                                0
                                                                Дак там игра неудачная. Что там перепиливать? Я конечно бросил задолго до закрытие серверов но:
                                                                — енгдейма нет
                                                                — пвп тупое просто досмерти
                                                                — механика боя неудачная
                                                                — система наград омерзительная

                                                                Книжка была шикарная, но почему в ней, например, небыло драконов? Где нормальные ачивки? Такое ощущение что делать начали и забыли зачем это делали.
                                                                Паблик квесты например очень интересно: когда толпа нубов собирается в кучу, чтобы убить дракона — это эпично, но система наград при этом работает в обратную сторону. Так же у них низкая сложность и околонулевая реиграбельность.
                                                                0
                                                                По мне так основная проблема в гиперамбициях EA, которые всю жизнь хотели свой WoW. И после не сильно удачного старта уволив основного гейм-дизайнера оборвали любые шансы на исправление ситуации — первый DLC (Мертвые земли), который подготавливался еще при нем показал, что они двигались в правильном направлении.
                                                                  0

                                                                  Ea много хороших игр запороли

                                                                    0
                                                                    Там дело не только в дизайнере. Там у них ужас мрак и кошмар был в компании.
                                                                    А позвать в консультанты тех же биоварей, который ни одной ммо годной ни сделали — эпичное решение.
                                                                    Ендгейма у игры не было, она сразу была обречена.

                                                                    А вообще по поводу «свой WoW»:
                                                                    Я всегда смотрю на окно группы, если там есть морды, то про игру сразу можно забыть.
                                                                    тыц
                                                                    image



                                                                    Что собственно и подтверждается:
                                                                    — пвп в форме тупого зерга крепостей на скорость
                                                                    — механика боя настолько неудачная, что сколько бы магов не фиксили, они все равно заливают всю комнату AoE из-за угла
                                                                    — итд итп
                                                                  –2
                                                                    0
                                                                    уж не знаю, что там с этой строчкой кода было, но WHO был просто ярчайшим примером, как не надо делать ммо.
                                                                    я прекрасно помню релиз, когда игроки не могли не то, что в игру зайти, просто аккаунт зарегистрировать. те счастливчики, что всё же смогли пробиться в игру, столкнулись с ужасными лагами и постоянно отваливающимися паблик квестами.
                                                                    а через неделю самые упорные уже брали максимальный сороковой уровень развития и понимали, что делать в игре абсолютно нечего, кроме как уныло качать reknown в одном единственном сценарии serpent passage. в игре почти не было pve, а те жалкие крохи, что были… не знаю как у destruction, но у order крысятники были багнутые, там крысы ваншотили, lost vale вообще не работал, его не успели сделать к релизу, лишь только crypt был полностью проходим. ага, с откатом в неделю.
                                                                    помню как destruction впервые напал на форт, о чём объявили на весь сервер… после чего, естественно, весь сервер был там. сначала повисла только зона, потом весь сервер.
                                                                    что сделали разработчики? сделали практически невозможным штурм этих самых фортов.
                                                                    а ещё сама игра была жутко тормозной и так ею и осталась до самой смерти.
                                                                    народ всего этого не оценил(ведь распространялась игра по подписке) и платить низачто не захотел.
                                                                      +1
                                                                      Брайан Шарп: Буквально каждый раз, когда пишу слово «acquired», я испытываю посттравматический флешбэк с Deus Ex 2, в котором мы ошибочно назвали папку с ресурсами AquiredDataText, и не могли её переименовать. Мне пришлось три года подряд писать «aquired».
                                                                      Когда мы открываем нашу медицинскую БД-ку и начинаем искать таблицу/поле, или писать SQL запросы под неё, или настраивать отчеты через XML — мы просто вечно материмся от альтернативного английского в смеси с транслитом программиста, делавшего её.

                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.