Comments 188
Но это еще нестрашно, ибо сразу обнаруживается проверкой синтаксиса.
Страшно становится, когда он начинает путать, скажем, MainMotor.Voltage и AuxiliaryMotor.Voltage.
Обычное. Скрипты зачастую пишут люди не сильно квалифицированные как программисты, поэтому чтобы игра не падала на каждой опечатке скриптовые движки лояльно относятся к некорректному коду. Но это не отменяет того что движок при этом должен сыпать warning'ами, и все они должны исправляться на этапе тестирования.
В таких условиях ворнинг будет на каждую вторую строчку скрипта. Ну или надо тогда изначально договариваться, что в коде скриптов использование нулевых переменных не допускается.
Недавно реверсил один движок, так у него в сетевой компоненте null можно передать пятью разными способами в зависимости от типа и назначения поля — -1
, -999
, "null"
, "xxx"
и "***"
. Но при этом отсутствующее числовое поле приравнивается не к null, а к 0, и соответственно понять, что где-то протерял массив, получилось только по тому, что в конце игры вместо перехода в меню было 20 анимаций повышения уровня, а потом вылезло шесть экранов с выигрышем ничего :-)
Если бы при очередном запуске игры она бы просто вылетела с ошибкой:
thread 'main' panicked at 'Unknown parameter 'ClassRemapping=PecanGame.PecanSeqAct_AttachXenoToTether -> PecanGame.PecanSeqAct_AttachPawnToTeather'', libcore/option.rs:914:5
То разработчик бы пожал плечами, нажал бы бекспейс, и даже не вспомнил бы на обеде про такую проблему. Не говоря уже про то, чтобы это повлияло на релиз.
Есть сроки, есть договоры, есть анонсы, есть штрафы за задержки.
А так-то да, в каждом конкретном случае исправление опечатки — секундное дело. :)
А так-то да, в каждом конкретном случае исправление опечатки — секундное дело. :)
Верно. А исправление 100 опечаток — 100 минут, то есть лишних полутора часов одного человека было бы достаточно, чтобы ни одна опечатка в прод не попало. Цифру 100 я взял от балды, просто не думаю, что игра более чем с 100 багами только в скриптах вообще работала бы.
По поводу диффов — думаю там изначально в конфиге с опечаткой написали. Если не знать в какой момент всё пошло не так — отыскать такое очень сложно.
Ничего удивительного что там никто ничего не фиксил. Скорее всего разработчики потеряли интерес к игре, после нескольких лет разработки поняв, что не получается сделать то что было запланировано, а кредит доверия покупателей уже исчерпан (т.е. даже если и получится все сделать — денег это уже не принесет).
Вот к чему метод "хуяк, хуяк и в продакшен" приводит. Похоже, разработчики не только не обеспечили корректную обработку ошибок (хотя бы логгирование), но и сами ни разу не запускали игру (могли бы заметить, что ИИ отключён).
Предвосхищая вопрос, где же была бага: в краулере, который собирал данные для отображения. Он тоже был несложный, и вполне тестируемый.
При чем тут разработчики? Уж кто-кто, а они вообще не причем, код написали, протестировали — код работал как надо.
А вот кто-то из гейм дизайнеров, левел дизайеров, тестеров и менджмента забили болт на свою работу. Причем скорее всего все сразу.
Что значит "при чём"? Некорректный код просто игнорируется, как будто всё в порядке! Это что, косяк дизайнеров?
Я не в курсе, что за "традиции" у них там в тестировании и менеджменте, но, возможно, они все виноваты. Или кто-то из них точно. Но быдлокод всё равно присутствует.
Это фантазии, никто не знает, что происходит с некорректными настройками, они вполне могут и писаться в какой-то лог. И все равно это вторично.
А по сути
Именно отдел качества должен был указать на проблему.
Именно лвл дизайнеры должны были орать что левл не работает так как задумывалось.
Именно менжмент должен был среагировать на негативные отзывы.
Но ни как не программисты.
И скажи по секрету — ты же не программист? Иначе бы ты знал главную программерскую тайну:
Всегда виноват заказчик, написавший кривое ТЗ.
Всегда виноват дизайнер, выдавший убогий UI.
И наконец всегда виноват тестер, который пропустил баг в релиз.
Ну а программист то причем?
После исправления опечатки заметна разница: генерируется в целом меньше религии (faith), но строится больше зданий и лучше развивается наука.
Кажется у мировых правительств в реальном мире тоже опечатка в конфиге.
Бог увидел это и спрашивает:
— Альберт, я вижу что-то не даёт тебе покоя — спроси меня: я разрешу все твои сомнения, отвечу на любой вопрос.
— Понимаешь, я всю жизнь пытался найти Самую Главную Формулу Мира. А ты — бог. Ты создал этот мир. Ты же знаешь её?
— Конечно знаю, Альберт!
— Напиши мне её, пожалуйста!
Бог садится писать большую формулу, Эйнштейн смотрит у него из-за плеча и вдруг говорит:
— Постой-постой! Вот тут же — явная ошибка.
Бог со вздохом, качая головой:
— И это, Альберт, я тоже знаю…
Конкретно сейчас оно на гамазавре за 91р есть… черт, возьму парочку. С женой потом поиграем :)
Да ну нафиг:
Серьезно, старая игра, которая много хуже чем та, что была в 2000м году. По своему сюжеты и фишкам даже с патчем она не стоит своих денег.
Programming Copy Editor
Gearbox Software is looking for a capable and driven full-time engineer to review all code for typos.
else
, а в данный момент условие истинно — вы можете даже не узнать о ее наличии.Обмануть джиес ничего не стоит. Питон, к его чести, делает некоторые статические проверки, поэтому с ним посложнее, но все же довольно легко.
Только:
1. Причём здесь динамическая/статическая типизация?
2. Это явно не наш случай, так как конфиг очевидно подгружался каждый раз, это не какое-то редкое ветвление else.
К вопросу о строгой статической типизации…Одна из причин, почему Delphi использую и на другое не смотрю.
Как бы это ни было грустно, но за десять лет в разработке я не видел ни одного проекта, который бы валидировал конфиг
если считалась переменная вне диапазона разрешенных значений используется значение по умолчанию
Казалось бы, сказочные игроделы из исходного поста ровно это и делали — молча использовали значение по умолчанию. У них, правда, переменная была типа "действие", поэтому значение по умолчанию оказалось "ничего не делать", но Вы уверены, что для более простых типов переменных этот подход более удачен?
Но как раз в Aliens переменная была за пределами допустимых значений. Это не важно что они текстовые, такого варианта как Teather не предусмотрено, значит не допустимое значение. От случая Civilization 6 конечно не застраховывает. Но у них и не было проверки этих «допустимых значений», просто если не поняла то не смогла.
А другого подхода я не вижу, если нельзя выдать пользователю предупреждение. Окирпичить устройство? Диапазон допустимых значений пришлось ввести после второго случая с битой памятью. (Оказалось что после обновления, которое может происходить только на заводе изготовителе, поменялась адресация памяти и данные читались с других адресов по старым конфигам. Вот тут как раз устройство и окирпичивалось. В то время как свеже изготовленное устройство имеет все конфиги по умолчанию.) Разве что, как вариант, при одном неправильном значении считывать все значения по умолчанию.
А при чем тут unmarshallinng? Структура типичного неструктурированного конфига — словарь со строковыми ключами и значениями
Зачем описывать конфигурации строковыми k=v, если можно описать их json/yaml/xml и положить на структуру?
Меньше стрельбы в ноги, типизация, понимание что и как в конфиге опционально/что обязательно.
Что на JAVA, что на Go так делал всегда.
И, как честный человек, не найдя чего-то в sendmail.cf, он устанавливал это в 0.
nginx -t
?Неужели нет ресурсов исправить хотя бы все критические ошибки в коде? Или лучше выкатить фигак-фигак в продакшн, чтобы собрать за ранний доступ деньжат, а потом свалить на Багамы?..
Причина в следующем. Дело в том, что изначальная функция AttachXenoToTether вообще ничего не делает, а вот функция AttachPawnToTether делает
У вас по тексту опечатка в одном из названий функции.
И это притом, что театр — Theater, а не Teather. Это вас не смутило)
А проблема игры, похоже, не в опечатке, но в недостаточном тестировании. Неужели перед выпуском, нормально проверив, нельзя было не заметить, что-то пошло не так?
Сюда же возможно прибавить недостаточное логирование ошибок, либо недостаточную внимательность разработчиков к предупреждениям (если движок их давал на опечатку), что косвенно говорит о не самой высокой культуре разработки.
Разгромные обзоры, провальные продажи, судебные иски… И компания за 4 года не смогла найти ошибку?!
define true false
что-нибудь незаметное, из-за чего игра падает по вторникам в нечётные дни например, а другое дело вот это.1. Обычное дело, когда у студии много проектов, разработчики и тестировщики переводятся с одного на другой. Плюс куча задач выполняется внешними разработчиками по контракту.
Один разработчик реализовал, протестировали, все ок.
Потом он и тестировщик перешли на другой проект/уволились/у них закончился контракт.
Другой разработчик вынес в конфиг (внеся ошибку).
Новый тестировщик мог быть вообще не в курсе этой функциональности (обычное дело, даже если пару лет работал параллельно с первым тестировщиком).
2. Когда игру выпустили, программисты уже давно работали над другими проектами. Заказчик за поддержку не платил либо платил мало, и игра была в стадии поддержки.
3. (вариант п.2) Цикл разработки и релиза мог был полностью разделен, и игра некоторое время вообще просто «валялась» на полке, пока готовили маркетинговые материалы и договаривались с площадками о размещении. А у разработчиков уже давно были новые проекты.
Даже если на стиме сейчас нет скидки, крайне велика вероятность найти ее у реселлеров с огромной скидкой. Эта вон сейчас за 91р продается.
Да и региональные цены стима — это лишь разумное предложение со стороны стима. Каждая контора может глубоко наплевать на это и выставить такой ценник, который пожелает. В последнее время такие игры появляются все чаще.
<Row Item="YEILD_PRODUCTION" ListType="DefaultYieldBias" Value="25"/>
Вариант в Цивилизации кстати вообще сложно отследить. Ладно, в Aliens присваивается значение из несуществующей переменной, можно было выбросить исключение, а здесь опечатка в самом названии параметра в глобальном конфиге. И если изначально не задать список возможных параметров (в котором тоже может быть опечатка), то сложно понять, используется ли это значение дальше в коде или нет.
В противном случае достаточно муторно происходит добавление новых элементов конфига.
По-моему это маркетинговая акция. Допилили промеж дела ИИ в полумертвом проекте и пытаются продажи сделать.
Кстати, другой случай — несколько раз у разных людей никак между собой не связанных встречал в коде ПО (и в текстовых блоках UI) связанного с морским транспортом именование кораблей, как sheep.
Про Марс — почитать в авторитетных источниках (научных журналах например, где каждая статья пишется ученым и рецензируется тоже учеными), отчетах НАСА и тд и проверить соответствие фактов тому что в статье написано.
Научных журналов о играх не знаю, да и проверить факты очень просто на дому, поэтому написал так.
потому что движок просто игнорировал незнакомый термин
Забавно. Но как это прошло тестирование? Почему сразу не выявили после жалоб пользователей? Мне кажется, там какой-то внутренний бардак является причиной, а не опечатка.
Но как это прошло тестирование?
Да сам вот про это думаю, по хорошему вообще в дебажных билдах должна быть предусмотрена возможность при спотыкании интерпретатора об что-то выкидывать некий «эксепшен» с описанием ошибки, но есть жутко филосАфы которые гутарят об том что программа не должна падать никак и никогда, вполне возможно что игнор ошибки в интерпретатор был встроен под хотелку такого умника.
После исправления опечатки заметна разница: генерируется в целом меньше религии (faith), но строится больше зданий и лучше развивается наука.
Вот черт, у человечества опечатку в коде бы кто исправил :)
И только спустя четыре года стало понятно, в чём корень проблем.
Ну, справедливости ради, ИИ — это вроде не единственная претензия которая была у игроков к игре (например, качество графики релиза по сравлению с трейлерами).
Создателям игры стало пофиг на неё аккурат в момент выхода — печально, но бывает.
Тестерам пофиг, что мобы начали тупить (хотя в пререлизах этого не делали) — печально,
Игрокам пофиг, что в игре мобы тупят,
Но я не об этом.
Я о разрабах движка.
На кой дьявол вообще изначально было выносить это в конфиг?
Серьёзно, у вас есть возможность вырубить AI. Покажите хоть одну причину, по которой это стоит делать в юзерском конфиге? (а не через чит-код, консоль разработчика,…, если это нужно для тестов ?)
Вчитаемся в код.
ClassRemapping=PecanGame.PecanSeqAct_AttachXenoToTether -> PecanGame.PecanSeqAct_AttachPawnToTether
Промолчу про синтаксис конфига.
Но сам подход!
Тут ремапится некий класс в другой класс. Один из них по факту не используется, второй что-то делает, оба актуальны для огромного множества объектов в игре. Хрен с ним, что из-за опечатки ремап не происходил — это всё лежит по пути
My Documents\My Games\Aliens Colonial Marines\PecanGame\Config\PecanEngine.ini
Т.е. движок писался в предположении, что под юзером Васей мы класс поведения мобов можем ремапить в одно место, а под юзером Машей — в другое — ЗАЧЕМ?
Наркоманы :)
Положили бы это в GameRoot, меньше вероятность, что кто-то невнимательный перед релизом накосячил.
У кого есть игра, много там такого в userspace? :)
это всё лежит по пути
My Documents\My Games\Aliens Colonial Marines\PecanGame\Config\PecanEngine.ini
Видимо, это затем, чтобы можно было патчить игру, не требуя прав админа (и не устанавливая в систему службу для апдейта, а то их в системе какая-то прорва уже, каждое ПО пытается пропихнуть апдейтер), или, скажем, моды на игру ставить. Reasoning ИМХО такой: на этапе проектирования строится архитектура, прикидывается, какие части и как часто придется патчить, соответствующие часто патчащимся частям файлы кладутся в user-space ака %USERPROFILE%, остальное в os-space ака %PROGRAMFILES% или %PROGRAMDATA%. Скриптовая логика ИМХО может меняться чаще, чем основной код движка, тем более если в нем требуется поправить какие-то константы, скажем, нерфнуть оружие или абилку, как следствие, была отнесена к "часто патчащимся" файлам.
Тестирование? Не, не слышали.
Никто из команды разработчиков не пытался играть до релиза в стиме?
upd: действительно, он.
В конфиге Aliens: Colonial Marines нашли опечатку, из-за которой четыре года глючил игровой ИИ