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

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.

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

Комментарии (51)


  1. sergof
    02.08.2018 13:26

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


    которая стопроцентно что???


    1. zhulan0v
      02.08.2018 13:33

      крашилась


    1. p_fox
      02.08.2018 13:33
      +4

      гранату


    1. PatientZero Автор
      02.08.2018 13:47

      Спасибо, исправил. Про опечатки лучше писать в личку.


    1. qnok
      02.08.2018 15:48

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


      1. maxzhurkin
        04.08.2018 20:18

        Это если её не выпустили к Рождеству перед високосным годом %)


    1. Nalivai
      02.08.2018 17:33

      Целиком бутылку кока колы


    1. geisha
      03.08.2018 02:38

      Знамо что
      image


  1. bogotoff
    02.08.2018 13:58

    Да, на дайлапе


    Что значит дайлап? dial-up?


    1. k102
      02.08.2018 18:25
      +3

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


      1. Areso
        02.08.2018 19:24
        +4

        Возможно человек намекает на более распространенное произношение «диалап».


        1. k102
          03.08.2018 10:40

          Ага, видимо эти же люди теперь, в попытке исправить ошибку, говорят «андройд»


    1. tommyangelo27
      02.08.2018 19:58
      +3

      die lap, мертвый круг


      1. Ktator
        02.08.2018 20:43
        +3

        Позанудствую.
        Всё же, «мёртвый круг» – это «dead lap», «die lap» – это «умри, круг».


        1. FreeNickname
          03.08.2018 19:48

          Может это на немецком



    1. WinPooh73
      02.08.2018 23:35
      +1

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


    1. maxzhurkin
      04.08.2018 20:25

      «Дайлапу, Джим, на счастье мне»


  1. labone
    02.08.2018 14:17

    Ответ на вопрос почему разработчики не могли полгода найти проблему здесь:

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


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


    1. Alexmaru
      02.08.2018 22:58
      +2

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


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


  1. Bedal
    02.08.2018 14:49

    хха, у нас от большого ума назвали поле outofwork, в котором значение 1 означало «работает». И потом больше 10 (десяти) лет это было невозможно устранить, пока не сделали полностью новый продукт.
    Все про это знали, и всё равно регулярно возникали идиотские ошибки в приложениях.


    1. Nick_Shl
      02.08.2018 16:16

      И везде всегда использовали 0 и 1??? Тут проблема явно не в названии переменной.
      Делается так:

      enum
      {
          OUT_OF_WORK = 0,
          WORK = 1
      }
      присваиваем только значения из enum'a, во всех сравнениях сравниваем только со значениями из enum'a.


      1. Bedal
        02.08.2018 16:26

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


      1. legolegs
        02.08.2018 18:18

        Хаха. В Jagged Alliance 2 был баг, из-за которого было практически невозможно при генерации персонажа получить черту характера («дружелюбный», «одиночка», «психопат» и т.д.). Дело было в том, что в игре (написанной на Си) использовался enum с чертами характера. Но не один, а два, один в движке игромеханики, а другой в GUI. И они немножко отличались (порядком и числом элементов). Но т.к. это си, когда разработчики смешали разные энумы в кашу компилятор это молча съел. А милая фича с характером главного героя, определяемым ответами в анкете была рождена мёртвой и два енум её не спасли.


        1. Zoolander
          03.08.2018 09:29

          да, разные модели для логики и отображения (а еще хранения, а еще получения данных с сервера) — боль и необходимость. Боль, потому что неизбежны расхождения и путаница, необходимость, потому что тяжело свести все к универсальной модели


          1. legolegs
            03.08.2018 12:25

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


            1. Zoolander
              03.08.2018 16:42

              в играх очень тяжело отделять графику от логики, так как игры по сути это танец графики )


              1. legolegs
                03.08.2018 20:28

                Ну это разве что в Марио каком.


    1. Zoolander
      02.08.2018 16:29

      в игровом фреймворке Phaser CE в эмиттере частиц параметр frequency означает период, а не частоту


      1. Bedal
        02.08.2018 16:34

        «И при мысли, что Степану тоже плохо, Ивану вдруг стало хорошо» :-)
        Спасибо, полегчало. Беда только в том, что описанный мной косяк был не в игрушке, а в системе оперативного управления весьма важной отраслью промышленности. Так что приходилось все эти годы с особым тщанием вылавливать постоянно нарождавшихся клопов.


      1. mayorovp
        02.08.2018 17:38

        Это очень популярная ошибка. Настолько популярная что я всегда уточняю о каком именно frequency идет речь когда я вижу это слово где-то в программе…


  1. artskep
    02.08.2018 14:50

    Я забыл применить функцию
    Звучит странно. В геймдеве и контексте этой фразы не силен, но не проблема ли в том, что он забыл вызвать функцию apply?


  1. Vsevo10d
    02.08.2018 15:52

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


    1. swelf
      02.08.2018 18:00

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

      навеки оставшиеся в коде опечатки встречаются НЕВЕРОЯТНО часто. Кроме того, очень часто их сложно устранить

      я думал я один такой) иногда и правда проще забить на опечатку/ошибку.


      1. Dvlbug
        02.08.2018 22:38

        Тут показаны видео (гифки?) как изменяется поведение ксеноморфов.
        www.pcgamer.com/all-this-time-aliens-colonial-marines-stupid-ai-may-have-been-caused-by-a-single-typo


  1. Murimonai
    02.08.2018 16:20

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


    1. Dvlbug
      03.08.2018 00:32

      А можно точнее, где прочесть? Поиск в оригинале ничего не нашел, а так заинтриговали


      1. Murimonai
        03.08.2018 23:54

        Обе статьи зачем-то были отредактированы, но в оригинальной осталась ссылка на твиттер.
        Если очень кратко, то вот она.


  1. Sokol666
    02.08.2018 19:14

    Про Aliens: Colonial Marines до сих пор не пойму. После выхода игры как только появилась рабочая таблетка проходили ее в кооперативе с другом и никаких проблем с ИИ не было. Отличная игра. Либо пиратина была уже лечена от этого бага либо в коопе он не наблюдался.


  1. klubben
    02.08.2018 20:36
    +1

    Я вот не понимаю, почему люди не пользуются спеллчекером?


    1. visput
      02.08.2018 22:08

      Потому что не все ide поддерживают auto spell-check. Xcode например не поддерживает.
      А на тот момент, когда писались эти игры, я думаю большинство ide / editor не поддерживали.
      Вручную проверить каждое полу-тривиальное слово, конечно, тоже не вариант.


  1. Kwisatz
    03.08.2018 00:56

    Тем кто делал вархаммер нужно сразу руки вырвать. Лор был сделан шикарно, художники тоже молодцы, но геймплей никакущий, идеи у игры как будто нет. Еще и позвали в консультанты всех тех кто успешных ммо в жизни своей не сделал ни одной.


    1. UberSchlag
      03.08.2018 08:06

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


      1. Areso
        03.08.2018 10:55

        А как они это делают? Это опен-сорсный сервер?


        1. aelimill
          03.08.2018 12:28

          github.com/WarEmu

          сервер Return of Reckoning


      1. Kwisatz
        03.08.2018 23:28

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

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


    1. aelimill
      03.08.2018 12:33

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


      1. x67
        03.08.2018 20:09

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


      1. Kwisatz
        03.08.2018 23:34

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

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

        тыц
        image


  1. Jeditobe
    03.08.2018 10:59
    -1


  1. Hidon
    03.08.2018 19:58

    уж не знаю, что там с этой строчкой кода было, но WHO был просто ярчайшим примером, как не надо делать ммо.
    я прекрасно помню релиз, когда игроки не могли не то, что в игру зайти, просто аккаунт зарегистрировать. те счастливчики, что всё же смогли пробиться в игру, столкнулись с ужасными лагами и постоянно отваливающимися паблик квестами.
    а через неделю самые упорные уже брали максимальный сороковой уровень развития и понимали, что делать в игре абсолютно нечего, кроме как уныло качать reknown в одном единственном сценарии serpent passage. в игре почти не было pve, а те жалкие крохи, что были… не знаю как у destruction, но у order крысятники были багнутые, там крысы ваншотили, lost vale вообще не работал, его не успели сделать к релизу, лишь только crypt был полностью проходим. ага, с откатом в неделю.
    помню как destruction впервые напал на форт, о чём объявили на весь сервер… после чего, естественно, весь сервер был там. сначала повисла только зона, потом весь сервер.
    что сделали разработчики? сделали практически невозможным штурм этих самых фортов.
    а ещё сама игра была жутко тормозной и так ею и осталась до самой смерти.
    народ всего этого не оценил(ведь распространялась игра по подписке) и платить низачто не захотел.