Gamedev Артемий Леонов
14 071

Как одна строчка кода испортила Warhammer Online

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

В закладки

Не так давно автор мода для Aliens: Colonial Marines улучшил поведение искусственного интеллекта в игре, изменив всего одну букву в файле конфигурации. Эта история вызвала бурное обсуждение, а создатели игры даже открыли у себя на сайте вакансию редактора, «который «любит искать опечатки в коде».

Патрик Клепек, журналист Vice, решил напомнить читателям, что история Aliens: Colonial Marines далеко не уникальна. Например, в марте 2018-го игроки выяснили истинную причину странного поведения искусственного интеллекта в Civilization VI. Зачастую управляемые компьютером правители полностью игнорировали экономику и военное дело и вкладывали все ресурсы в религию. Как оказалось, виной всему был баг: слово «yield» (доход) в коде игры было записано как «yeild».

Журналист решил выяснить, насколько часто в индустрии происходят подобные казусы, и задал соответствующий вопрос в твиттере. С ним связалась Лия Миллер, одна из создателей MMORPG Dark Age of Camelot и Warhammer Online: Age of Reckoning, и рассказала свою историю.

Вскоре после того, как разработчики Mythic Entertainment выпустили Warhammer Online, в их адрес стали поступать многочисленные жалобы от игроков. Все, как один, утверждали, что игра ощущалась медленной, а управление неотзывчивым. Ничего более конкретного недовольные игроки сказать не могли.

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

Лия Миллер

Разработчики делали попытку за попыткой, но решить проблему так и не удавалось. Так прошло шесть месяцев.

Спустя полгода недавно устроившийся в компанию программист заметил нечто странное в коде игры — в нём содержалась строчка, доставшаяся Warhammer Online по наследству от предыдущей игры студии — Dark Age of Camelot. Она была связана с телефонными линиями — строчка была родом из тех далёких времён, когда высокоскоростным подключением могли наслаждаться лишь избранные, а пользоваться телефоном и играть онлайн одновременно было невозможно.

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

Лия Миллер
геймдизайнер
Dark Age of Camelot

Как только разработчики избавились от этой «древней» строчки, Warhammer Online немедленно заработала так, как и должна была — быстро и «гладко».

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

Лия Миллер
геймдизайнер

В Dark Age of Camelot эта задержка была практически незаметна — система была рассчитана на стандартные компьютеры своего времени. Однако затем Mythic Entertainment решила использовать тот же самый код для Warhammer Online, совершенно забыв об этой строчке.

Миллер не утверждает, что игра провалилась исключительно из-за ошибки в коде, но она точно не сыграла разработчикам на руку. К тому моменту, как код успели починить, большая часть игроков уже «мигрировала обратно в World of Warcraft».

Другие разработчики также поделились историями о масштабных багах, вызванных незначительными ошибками в коде. Например, разработчик Мэтт Лэйси признался, что как-то раз выпустил игру, которая вылетала в 100% случаев в високосный год, а создатель Semblance рассказал о строчке кода, которая из-за ошибки «съедала» 41 fps, так что в 2D-платформер приходилось играть при 19 кадрах в секунду.

Брайан Шарп, один из разработчиков Deus Ex 2, рассказал о том, как ему в течение трёх лет приходилось неправильно писать слово «acquired» (приобретённый), потому что на самом раннем этапе разработки кто-то впечатал его с ошибкой («aquired»).

Сам журналист вспомнил о знаменитом своей сложностью уровне из Super Mario 64 — в какой-то момент выяснилось, что проплывать через подводные кольца настолько тяжело по вполне определённой причине. Из-за мелкой ошибки в коде физическое расположение колец не соответствовало их визуальному отображению.

#истории #опыт

{ "author_name": "Артемий Леонов", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442","\u0438\u0441\u0442\u043e\u0440\u0438\u0438"], "comments": 61, "likes": 113, "favorites": 30, "is_advertisement": false, "subsite_label": "gamedev", "id": 23999, "is_wide": false, "is_ugc": false, "date": "Sat, 28 Jul 2018 18:23:12 +0300" }
{ "id": 23999, "author_id": 3792, "diff_limit": 1000, "urls": {"diff":"\/comments\/23999\/get","add":"\/comments\/23999\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/23999"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "possessions": [] }

61 комментарий 61 комм.

Популярные

По порядку

Написать комментарий...
19

Буквально сегодня столкнулся с такой проблемой. Заканчивал добавление нового босса в свою игру. Прописал ему анимацию появления, уничтожения и три типа поведения. Финальная проверка! И тут оказалось, что босс в случайные моменты начинает двигаться без причины. Я перелопатил весь код паттернов, проверил взаимодействия с другими объектами, даже вырезал целые куски кода - все бесполезно. И вот, когда уже совсем отчаялся заметил одну строку. Удалив ее, все заработало. А дело оказалось в том, что изначально для отладки босса я настроил ручное управление им, и, по всей видимости, одну строку пропустил, когда чистил код от мусора.

Ответить
4

Потому что код управления боссом надо выносить в интерфейс с 2мя реализациями. Одна ручная и вторая на основе ии :)

Ответить
12

YS VIII на ПК шла медленно, потому что в 100% случаев рендерилась в 4к разрешении. Но там не в одной строке ошибка, просто отсутствовала поддержка 1080р и 720р.

Ответить
2

Хм, разве у пк-бояр не стоят поголовно 1080ti? В консолесрачах это главный аргумент - 4к 60фпс

Ответить
10

Но-но, попрошу. Не 4к 60фпс, а 21:9 144fps.

Ответить
0

В игру поддержку 21:9 так и не ввели, только экран растянуть, либо с полосками гамать.

Ответить
0

Так шутливый коммент же.

Ответить
0

Но на форуме стима такие люди есть и они активно жалуются.

Ответить
0

Я не уверен конкретно на счёт YS, но для некоторых игр помогает Flawless Widescreen. Я так в Binary Domain играл, например.

Ответить
4

Никогда такого не было - большинству на 4к откровенно насрать, лучше уж 60/144 фпс в 1080п получить.

Ответить
16

Escape from Tarkov - пример, где вся игра - баг и большая ошибка.

Ответить
2

Сюда можно отнести и Survarium. Ну и слепленный из его же ассетов в стиле "хуяк-хуяк и в Ранний Доступ" Fear the Wolves :)

Ответить
1

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

Ответить
4

А потом разработчики спрашивают, зачем нужна строгая статическая типизация, юнит тесты и прочие практики верификации, ведь "и так ведь работает". Повбывав бы.

(Вечная боль мейнтейнера).

Ответить
2

зачем нужна строгая статическая типизация

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

Ответить
2

В огромном проекте всегда будут какие-либо косяки.

Можно, конечно, по TDD всё делать, разбавлять годовыми циклами тестирования, но при наличии дедлайнов и высокой динамичности проекта это не сработает.

Ответить
4

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

Ответить
4

Ты был в потоке с игрой короче.

Ответить
0

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

Ответить
4

Как-то в коде антивирусного движка по ошибке интвертировали значение "чистый" и "заражённый". В те времена ещё не было защиты от ложных срабатываний, потому антивирус быстро выкосил системы тестировщиков.
Как-то в коде движка допустили ошибку, которая приводила к удалению папки, вместо файла в нём. А я eicar положил в system32.
Когда пилили движок, полноценно поддерживающий мультиядерность и мультипроцессность, столкнулись с проблемой, что если вредоносный файл обнаруживается одновременно более чем одним видом сканера, то всё становится раком. Каждый из вариантов сканера лочил файл драйвером, дабы ничего в системе больше не смогло его случайно или намеренно запустить. В том числе, как оказалось, и другие варианты сканера. Каждый из них пытался во-первых запретить доступ, во-вторых снять чужие локи с этого файла.
---
Но это всё было найдено ещё на этапе тестирования, разумеется :)

Ответить
0

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

А самим поиграть было не судьба? И тестеров у команды никаких не было?

Ответить
25

А они сидели на модеме, и им было норм.

Ответить
0

Черт так же подумал :)

Ответить
3

Другие разработчики также поделились историями о масштабных багах, вызванных незначительными ошибками в коде. Например, разработчик Мэтт Лэйси признался, что как-то раз выпустил игру, которая вылетала в 100% случаев в високосный год, а создатель Semblance рассказал о строчке кода, которая из-за ошибки «съедала» 41 fps, так что в 2D-платформер приходилось играть при 19 кадрах в секунду.

интересно было бы почитать подробнее, что именно к этому привело

Ответить
2

Баги как в Colonial Marines и Civ6 можно было бы легко избежать, используя для конфигов любой бесплатный редактор кода с проверкой орфографии. Но неет, мы купим лицензий на дикие тыщи баксов и будем писать в ide, которая даже в подсветку синтаксиса толком не умеет.

Ответить
1

В Colonial Marines слово «teather» вместо «tether», т.е. правильное но не то.

Ответить
0

А что такое teather? Не могу нагуглить (urban dictionary не считается).

Ответить
0

(«связь», «привязывать»)
Из статьи на дтф про этот баг.

Ответить
3

Как раз таки «tether» - это связь. А вот слово «teather» не правильное, его не существует.

Ответить
2

Сорри тогда, я пьяный был

Ответить
0

любой бесплатный редактор кода с проверкой орфографии

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

Ответить
0

Сокращения можно внести в исключения.

Ответить
0

Т.е. каждому, кто будет править конфиг, надо будет добавлять исключения?) Проще утилиту написать, и не так сильно подвержено ошибкам (могут добавить неправильный вариант, или написать правильный, а уже в коде будет пытаться загрузить неправильный).

Я тут подумал - он вообще-то будет ругаться на каждую строчку конфига.
Условно - Max - ок, Health - ок, а MaxHealth - уже не ок будет.

Ответить
0

А кто будет проверять, что в этой утилите нет багов и опечаток?:)

Ответить
0

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

Т.е. всем делается рассылка "вот email инструментальщика, скиньте ему все используемые вами параметры конфига с описание возможных состояний". Разрабы просто будут смотреть код и скидывать ему, как есть, он пишет на основе такого ТЗ утилиту.
Несколько команд кинули один и тот же параметр - проверяем, правда ли все его используют. Если кинули лишнее - втык. Утилита сгенерировала минимальный корректный конфиг, а билд с ним ругается при запуске - втык. Автоматические тесты могут перебрать хоть все возможные комбинации конфига. Утилита сгенерировала некорректные значения параметров конфига, а билд запустился - втык.

Ответить
0

Звучит неплохо, согласен. Конечно, при условии, что в команде есть инструментальщик и есть время и политическая воля такую тулзу сделать. А так удобно, да.

Ответить
2

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

А потом, спястя пол года работы на проектом (а до меня он существовал еще год), в одном из плейтестов я заметил что туррель убила пехотинца не с 4, а с 2 выстрелов. Показал это программисту как баг.

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

Ответить
–1

Кхе-Кхе (Не реклама, но все же вроде подобный инструмент не один существует в мире, неужели их не используют для дорогих проектах?)
https://habr.com/company/pvs-studio/

Ответить
2

Эмм? То что было в код - это был не баг, а намеренное ограничение установленное самими разработчиками. Чем тут можем помочь тулза для статического анализа?

Ответить
0

Я скорее про опечатки/утечки памяти и прочее. В статье не только о Вахе речь идет.

Ответить
0

Как такой тул поможет допустим в том же моменте с марио? Статичиские анализаторы конечно хороши, но не тут.

Ответить
0

А, пардон. Я тому и удивился.

Ответить
0

С каких пор статические анализаторы C++ научились проверять конфиги?

Ответить
1

Интересные истории... Так а что там за ошибка в слове "acquired"?

Ответить
0

В тексте статьи же написано с ошибкой) «aquired»

Ответить
0

А, ясно. Это гугл ошибочные слова тоже переводит, исправляя на правильные. А я не заметила.

Ответить
0

Вся печальная суть Google. Он лучше пользователя знает, что искать :(

Ответить
0

На счет переменных именованных ошибочно - это, конечно, боль.

Ответить
0

Вся Warhammer Online ощущалась так, будто сделана на соплях. Отчасти тут опять виновата ЕА, выкинувшая игру слишком рано в релиз, но у разработчиков было достаточно времени, чтобы починить все остальное, и этого не произошло.

Дошло до того, что они убрали из игры форты, потому что она банально не могла осилить такое количество игроков: там не то что лагало — сервера банально крашились во время осад (впрочем, крашились они даже во время осад обычных замков).

Ответить
0

Складывается ощущение, что до сих пор куча народу кодит в Вордпаде.

Ответить
0

Вордпад бы им как раз опечаточки подсветил!

Ответить
0

Вот кстати когда на старте стал играть в Warhammer Online замечал что игра как-то не так себя ведёт.....

Ответить
0

warhammer online была офигенной, до сих пор скорблю о ней

Ответить
0

Что далеко ходить, сейчас (пере)запускается официальный русский сервер Ragnarok Online, так там механика перемещения и взаимодействия персонажа еще со времен модемов осталась. С соответствующей скоростью отклика (читай - фризы, телепортирование, позиционка и т.д.)

Ответить
0

Один обиженный программист как-то перед увольнением отомстил
#define TRUE rand()

Ответить
0

Что-то уже сутки специалисты комментируют все, и никого журналистский перевод yield для Цивы не покоробил? Ооок.

Ответить
0

Запомните
OnTriggerEnter, а не как написал OnTriggarEnter

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
10 самых лучших блюд
(согласно инстаграму Хидео Кодзимы)
Подписаться на push-уведомления