Чаще всего от разработчиков игр можно услышать очень простую фразу: удивительно, что игры вообще выходят. Игры — это усложнённые, неприручённые чудовища, соединённые чем-то вроде цифровой изоленты. Не удивительно, что они разваливаются на части.
Aliens: Colonial Marines была проблемной по многим причинам, но быстро стала всеобщим посмешищем, когда появились подобные виральные клипы, в которых ксеноморфы бессмысленно бродят по уровням. В этом месяце разработчик модов обнаружил, что причиной глупейшего поведения ИИ «чужих» стала одна ошибка в коде игры. (Об этом была статья на Хабре.) Упс. Но это не единственный случай за этот год, когда игра оказывалась унижена из-за упущенной клавиатурной опечатки. В начале 2018 года фанаты обнаружили, что ИИ Civilization VI подозрительно ударяется в религию: дело оказалось в том, что слово «yield» в коде было написано как «yeild».
Поэтому неудивительно узнать, что в разработке игр полно таких моментов.
Леа Миллер несколько лет работала дизайнером в бывшем разработчике MMO-игр Mythic Entertainment. Она занималась сценариями, дизайном контента и систем для Dark Age of Camelot и Warhammer Online: Age of Reckoning. В момент выпуска студия стала получать от фанатов жалобы: игра казалась медленной и малоотзывчивой. Игроки не могли определить, в чём конкретно была причина.
Это было просто… ощущение?
«Команда разработчиков пересмотрела систему боя, чтобы он ощущался более быстрым, и искала неэффективные операции на стороне сервера, от которых можно было избавиться», — рассказывает Миллер. «Но всё равно отзывы были слишком расплывчатыми, никто не мог сказать точно, в чём причина. Был ли это недостаток в общем дизайне игры? Вносилось множество изменений, чтобы улучшить ощущения от игры, и хотя многие из них были настоящими улучшениями, корень всех проблем устранить не удалось».
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.
Потрясающе. Непонятно, как видеоигры вообще существуют.
sergof
которая стопроцентно что???
zhulan0v
крашилась
p_fox
гранату
PatientZero Автор
Спасибо, исправил. Про опечатки лучше писать в личку.
qnok
Похоже эта ошибка занимает первое место. Хотя, впрочем, если игра спустя год-два была всеми позабыта, то и не страшно.
maxzhurkin
Это если её не выпустили к Рождеству перед високосным годом %)
Nalivai
Целиком бутылку кока колы
geisha
bogotoff
Что значит дайлап? dial-up?
k102
Если это не сарказм, то сейчас половина хабра ощутила свою стартость
Areso
Возможно человек намекает на более распространенное произношение «диалап».
k102
Ага, видимо эти же люди теперь, в попытке исправить ошибку, говорят «андройд»
tommyangelo27
die lap, мертвый круг
Ktator
Позанудствую.
Всё же, «мёртвый круг» – это «dead lap», «die lap» – это «умри, круг».
FreeNickname
Может это на немецком
k102
en.wikipedia.org/wiki/Euthanasia_Coaster?
WinPooh73
Это из классики. "Дай, Джим, на счастье лапу мне" (С.Есенин)
maxzhurkin
«Дайлапу, Джим, на счастье мне»
labone
Ответ на вопрос почему разработчики не могли полгода найти проблему здесь:
Если так относится к разработке и оправдывать это, то ничего хорошего не будет. Либо проблема была сложнее, чем описано в статье, либо их производственные процессы были хламом. Снятие нетстатистики это рутинная процедура, которая должна выполняться каждую неделю.
Alexmaru
Есть очень много продуктов, с одной стороны у которых может быть архитектор, мечтающий о розовых понях, а с другой люди, жклающие увидеть этот продукт при своей жизни.
И если вдруг побеждает архитектор — то мы об этом случае, скорее всего, не узнаем.
Bedal
хха, у нас от большого ума назвали поле outofwork, в котором значение 1 означало «работает». И потом больше 10 (десяти) лет это было невозможно устранить, пока не сделали полностью новый продукт.
Все про это знали, и всё равно регулярно возникали идиотские ошибки в приложениях.
Nick_Shl
И везде всегда использовали 0 и 1??? Тут проблема явно не в названии переменной.
присваиваем только значения из enum'a, во всех сравнениях сравниваем только со значениями из enum'a.Делается так:
Bedal
ну, ёлки-палки, ясно же, что не так всё примитивно. И не надо так радоваться, думая, что енумы никому, кроме Вас, неизвестны. Речь вообще шла о модели данных в хранении, а не о языковой структуре. Просто не стал вываливать всю внутреннюю кухню, потому что не об этом речь, а о том, что значение действовало строго обратным по отношению к названию образом.
legolegs
Хаха. В Jagged Alliance 2 был баг, из-за которого было практически невозможно при генерации персонажа получить черту характера («дружелюбный», «одиночка», «психопат» и т.д.). Дело было в том, что в игре (написанной на Си) использовался enum с чертами характера. Но не один, а два, один в движке игромеханики, а другой в GUI. И они немножко отличались (порядком и числом элементов). Но т.к. это си, когда разработчики смешали разные энумы в кашу компилятор это молча съел. А милая фича с характером главного героя, определяемым ответами в анкете была рождена мёртвой и два енум её не спасли.
Zoolander
да, разные модели для логики и отображения (а еще хранения, а еще получения данных с сервера) — боль и необходимость. Боль, потому что неизбежны расхождения и путаница, необходимость, потому что тяжело свести все к универсальной модели
legolegs
В джаге код графики, гуя и геймлогики даже не пытались как-то разделять, оттого множество багов. Просто студентам надо показывать как не надо делать.
Zoolander
в играх очень тяжело отделять графику от логики, так как игры по сути это танец графики )
legolegs
Ну это разве что в Марио каком.
Zoolander
в игровом фреймворке Phaser CE в эмиттере частиц параметр frequency означает период, а не частоту
Bedal
«И при мысли, что Степану тоже плохо, Ивану вдруг стало хорошо» :-)
Спасибо, полегчало. Беда только в том, что описанный мной косяк был не в игрушке, а в системе оперативного управления весьма важной отраслью промышленности. Так что приходилось все эти годы с особым тщанием вылавливать постоянно нарождавшихся клопов.
mayorovp
Это очень популярная ошибка. Настолько популярная что я всегда уточняю о каком именно frequency идет речь когда я вижу это слово где-то в программе…
artskep
Vsevo10d
Ну не знаю. Про чужих был действительно эпичный баг, и про диалап. А остальные примеры — вещи рядовые, случающиеся со всеми играми. Кстати, никто не знает, где жена Мэнкрика?
swelf
В чужих не играл, но кроме видео где альбинос чужой ходит в развалочку, чет ничего не видел. Было бы прикольно увидеть сравнения до и после, типа «До исправления чужой сидит в углу, пускает слюни и мычит, после исправления — накидывается и разрывает на части».
я думал я один такой) иногда и правда проще забить на опечатку/ошибку.
Dvlbug
Тут показаны видео (гифки?) как изменяется поведение ксеноморфов.
www.pcgamer.com/all-this-time-aliens-colonial-marines-stupid-ai-may-have-been-caused-by-a-single-typo
Murimonai
Шутку про Defiance не перевели, жаль. Историю с выкидыванием других игроков из машин я застал, а вывалиться прямо на ходу самому — и сейчас можно запросто, если пинг выростет или скакать будет.
Dvlbug
А можно точнее, где прочесть? Поиск в оригинале ничего не нашел, а так заинтриговали
Murimonai
Обе статьи зачем-то были отредактированы, но в оригинальной осталась ссылка на твиттер.
Если очень кратко, то вот она.
Sokol666
Про Aliens: Colonial Marines до сих пор не пойму. После выхода игры как только появилась рабочая таблетка проходили ее в кооперативе с другом и никаких проблем с ИИ не было. Отличная игра. Либо пиратина была уже лечена от этого бага либо в коопе он не наблюдался.
klubben
Я вот не понимаю, почему люди не пользуются спеллчекером?
visput
Потому что не все ide поддерживают auto spell-check. Xcode например не поддерживает.
А на тот момент, когда писались эти игры, я думаю большинство ide / editor не поддерживали.
Вручную проверить каждое полу-тривиальное слово, конечно, тоже не вариант.
Kwisatz
Тем кто делал вархаммер нужно сразу руки вырвать. Лор был сделан шикарно, художники тоже молодцы, но геймплей никакущий, идеи у игры как будто нет. Еще и позвали в консультанты всех тех кто успешных ммо в жизни своей не сделал ни одной.
UberSchlag
Про лор и художку — это бесспорно. Возможно именно за счет антуража дело вахи не умирает: группа энтузиастов успешно завела маленький свечной
зав...шардик. За три-четыре года поднялись от базового уровня до полной реализации всех механик боя и потихоньку перепиливают неудачные решения в механике.Areso
А как они это делают? Это опен-сорсный сервер?
aelimill
github.com/WarEmu
сервер Return of Reckoning
Kwisatz
Дак там игра неудачная. Что там перепиливать? Я конечно бросил задолго до закрытие серверов но:
— енгдейма нет
— пвп тупое просто досмерти
— механика боя неудачная
— система наград омерзительная
Книжка была шикарная, но почему в ней, например, небыло драконов? Где нормальные ачивки? Такое ощущение что делать начали и забыли зачем это делали.
Паблик квесты например очень интересно: когда толпа нубов собирается в кучу, чтобы убить дракона — это эпично, но система наград при этом работает в обратную сторону. Так же у них низкая сложность и околонулевая реиграбельность.
aelimill
По мне так основная проблема в гиперамбициях EA, которые всю жизнь хотели свой WoW. И после не сильно удачного старта уволив основного гейм-дизайнера оборвали любые шансы на исправление ситуации — первый DLC (Мертвые земли), который подготавливался еще при нем показал, что они двигались в правильном направлении.
x67
Ea много хороших игр запороли
Kwisatz
Там дело не только в дизайнере. Там у них ужас мрак и кошмар был в компании.
А позвать в консультанты тех же биоварей, который ни одной ммо годной ни сделали — эпичное решение.
Ендгейма у игры не было, она сразу была обречена.
А вообще по поводу «свой WoW»:
Я всегда смотрю на окно группы, если там есть морды, то про игру сразу можно забыть.
Jeditobe
Hidon
уж не знаю, что там с этой строчкой кода было, но WHO был просто ярчайшим примером, как не надо делать ммо.
я прекрасно помню релиз, когда игроки не могли не то, что в игру зайти, просто аккаунт зарегистрировать. те счастливчики, что всё же смогли пробиться в игру, столкнулись с ужасными лагами и постоянно отваливающимися паблик квестами.
а через неделю самые упорные уже брали максимальный сороковой уровень развития и понимали, что делать в игре абсолютно нечего, кроме как уныло качать reknown в одном единственном сценарии serpent passage. в игре почти не было pve, а те жалкие крохи, что были… не знаю как у destruction, но у order крысятники были багнутые, там крысы ваншотили, lost vale вообще не работал, его не успели сделать к релизу, лишь только crypt был полностью проходим. ага, с откатом в неделю.
помню как destruction впервые напал на форт, о чём объявили на весь сервер… после чего, естественно, весь сервер был там. сначала повисла только зона, потом весь сервер.
что сделали разработчики? сделали практически невозможным штурм этих самых фортов.
а ещё сама игра была жутко тормозной и так ею и осталась до самой смерти.
народ всего этого не оценил(ведь распространялась игра по подписке) и платить низачто не захотел.