Том первый
Каждая игра за время своего существования дает приют полчищам разнообразных багов — тысячи изничтожаются до ее выхода, какие-то устраняются только патчами или даже остаются жить вечно. Большинство из них ничем особенно не интересны: в одной ситуации игра падает или зависает, в другой — нельзя завершить задание, где-то забыли картинку, вместо нее возникает пустой квадрат либо серый шарик, где-то текст вылезает за рамки окна или не нажимается кнопка... Но есть и другие баги, наблюдать которые занятно и познавательно.
Переполнения и неверные адреса
Широко размахнувшись, Мак-Мэд со всей силы метнул снаряд. Бумеранг с тихим шелестом рванул в сторону края мира. Ксен уткнулся в бинокль, провожая его взглядом. Снаряд достиг «края мира» и, пройдя сквозь «небо», исчез. Ксен уткнулся в терминал.
— Ну что?
— Пока ничего. Его координаты продолжают изменяться, что уже баг: это когда-нибудь приведет к переполнению. Хотя... Дай-ка прикинуть: если он движется по кривой, у него есть все шансы вернуться...
Призрак, «Следствие ведут тестеры»
В былые времена самыми популярными багами оказывались попытки записать данные не в ту область памяти, в какую нужно, а также переполнения ячеек. Сейчас они тоже случаются, но реже (современные средства программирования помогают от них избавляться); к тому же в наши дни они чаще приводят к «синему экрану смерти» (или взлому плохо защищенного сервера), чем к чему-то забавному. Раньше бывало интереснее.
В играх 80-х годов память приходилось бешено экономить, буквально до бита, и такая экономия приводила к любопытным эффектам.
Например, известно, что одно время в Карибском море разница между пиратом и охотником на пиратов была примерно как в известном анекдоте о границе между Колумбией и Венесуэлой: кто первый выстрелит, тот и пограничник. Этот факт воплотился в «Пиратах» Сида Мейера. И пираты, и охотники на них порой оказывались в трюме нашего корабля в качестве пленников; посидев там некоторое время, они нередко забывали, кто из них пират, а кто — охотник, и менялись этими статусами произвольно. Наблюдать за их попытками самоопределиться было чрезвычайно интересно. Особенно когда в трюме собиралась компания родственников: полковник Квеведо — пират, барон Квеведо — охотник, адмирал Квеведо — тоже охотник... А завтра на семейном совете они все перерешат.
В «Войне в Средиземье» бывало и покруче. Однажды Арагорну было предложено возглавить отряд из Фарамира с 200 следопытами и Эомера со 120 всадниками. Но он остался недоволен командирскими талантами обоих капитанов и... клонировался. Так в подчинении у него оказался Арагорн со следопытами и еще один Арагорн — со всадниками. Последнему было труднее всех, потому что пешком командовать кавалерией обременительно. Но зато — теперь в отряде были все свои!
The Horde, замечательная, хоть и полузабытая игра от авторов Star Control, изредка дает увидеть удивительное превращение. Если тварь из Стаи сжирает кого-нибудь, его еще можно спасти, быстро убив тварь — пока та не рыгнет, что означает успешное завершение пищеварительного процесса (и пробуждение голода). Однако как минимум трижды я наблюдал, как в желудке твари корова подвергается генетической модификации и проходит усиленную подготовку, после чего на свет божий выходит уже... рыцарем. Мозг у него, к сожалению, остается коровий: на воле рыцарь начинает мирно щипать травку. А вот рефлексы меняются вместе с внешностью — если тварь подойдет в упор, он ей врежет промеж глаз.
Если переполнению подвергается, как в эпиграфе, числовая переменная, то она не выйдет за пределы ячейки, но будет как в известной переделке «10 негритят»:
0 программистов ругал сердитый шеф,
Потом уволил одного — и стало их FF.
В тех же «Пиратах» мы частенько становились обладателями минус 655350 золотых, но интереснее это проявлялось в «Принце персидском»: там нашлась одна точка, запускающая принца на орбиту. Он падал вниз... пролетал невредимым мимо ножей, после чего зарывался в землю. Нетерпеливые тут начинали заново и пропускали поучительное зрелище: через минуту или около того принц возникал в небесах — и снова рушился туда же. И так до полного удовлетворения игрока; по-видимому, запас воздуха в скафандре достаточен.
Хуже для персонажа заканчивался подобный эффект в одном из предшественников PlanetSide. Там бои происходили на крошечном планетоиде, и заряд, если он вдруг не встречал ни противника, ни другого препятствия, порой облетал мир по окружности и тюкал стрелкá между лопаток. Удивительное, скажу вам, ощущение — застрелиться из гранатомета в спину!
Трагическая история разыгрывается порой с падением NPC из окна в GTA: San Andreas. Они разбиваются, но это их ничему не учит; там можно наблюдать известную историю «А старушки все падали и падали».
Зато в Lionheart переполнение в ячейке сопротивляемости какому-то виду вреда (не исключено, что это было сделано намеренно, но очень странно) приводила к тому, что этим эффектом можно было лечиться. Набрали вещей на 110% устойчивости к яду? Отлично! Если вас ранили, откушайте цианистого калия, зажуйте мышьяком, и будете как новенький.
Другой благотворный для героя баг переполнения украшал собой Daggerfall. Порой там зарождался персонаж с тысячей очков здоровья! Сплошная радость для игрока... пока тот не выяснял, что для излечения ему придется провести на стоянке... пару месяцев. Потому что регенерирует-то он с обычной скоростью. Зато война со стражей в городе там могла привести к такому падению вашей репутации, что вами начинали восхищаться.
Перепутанный знак
История с колбасой и правда вышла прямо-таки мистической. Ксенобайт так и не смог понять, каким образом Кеше удалось изуродовать самый обычный продукт до такой степени, чтобы при условном съедении он не исчезал из мира, а складировался внутри виртуального тела персонажа.
И ведь поначалу все было ничего, за исключением того, что постоянные потребители колбасы стали стремительно набирать вес — впрочем, без малейшего ущерба для фигуры. Некоторые игроки начали робко жаловаться, что их немного заносит на поворотах, настилы порой проваливаются у них под ногами, а транспорт зачастую ведет себя как при перегрузе. Другие, напротив, очень быстро оценили возможность, разбежавшись, попросту проломить кирпичную стену, а связав новые возможности с колбасой (и ведь догадались же!), стали целенаправленно отъедаться.
Призрак, «Частная жизнь рейд-босса»
Другой очень распространенный баг: где-то в проверках условий перепутали знаки «больше», «меньше» и «равно». Вариант — добавили лишний нолик в вероятность успеха. Заметить такое при отладке порой бывает очень нелегко, а результаты...
Широко известен «баг 56-го года» в Medieval: Total War — Viking Invasion, где королевский сан означал для его владельца гарантированную гибель в 56-летнем возрасте. По идее, там должна была стоять проверка (с этих лет для персонажа была возможна смерть от старости), а оказалась — констатация факта.
Варварские племена в Pax Romana в результате похожего эффекта обзавелись шизофренией: обнаружив на своей территории некое племя, они с некоторым шансом объявляли ему войну... и не замечали, что это племя — они сами! Забыли одну проверочку, и вот результат: галльский вождь вынужден вести поход против себя самого.
А вот похожий внешне эффект из Medieval II, когда дипломат отвергает ваше предложение и в ответ выдвигает то же самое, по всей вероятности, немного другой природы. Это похоже на ошибку округления, когда согласие с предложением вычисляется по формулам большей точности, нежели само предложение.
В Daggerfall была заразная ликантропия двух видов; однако волк ли вас укусил или кабан — все равно быть вам свиньей. Опять-таки не все в порядке с проверкой.
Из этой же оперы — крайне распространенные, но не слишком интересные баги, когда NPC после важного разговора атакует вас независимо от результата переговоров.
По слухам, багом изначально была одна странная особенность сидмейеровских «Пиратов» 2004 года рождения. Там за всеми сведениями обо всех ваших пропавших родственниках вас отправляют к одному и тому же «злобному испанцу» барону Раймондо — так что вы вынуждены отпускать его раз за разом, а затем ловить. Сперва предполагалось сделать их разными, но допустили ту самую ошибку в программе; а потом решили, что раз все равно нет возможности сделать «злым испанцам» дюжину разных лиц, то пусть это будет один и тот же барон, «рассудку вопреки, наперекор стихиям».
Караул, говорящий помидор!
— Мужики, может, договоримся? — предложил Ксенобайт, нервно перебирая пальцами по полированному дереву посоха.
— Ы-ы-ы!
— Я же почти свой!
— У-у-у!
Призрак, «Переполох в городе»
Молодые игроки едва ли помнят, сколько радости доставляла во времена оные попытка... расшифровать то, что говорят вам персонажи. Потому что если говорят они это голосом, а воспроизводятся сии звуки на встроенном динамике «РС-скрипер», то результат оставляет массу возможностей для трактовок.
Так, русскому уху было очень трудно не услышать в речи священника-дейна из Wizardry VII обличительный возглас: «Пьяный дурак!» Последующие изыскания показали, что это было «Братие, покайтесь!», причем, разумеется, по-английски, но на РС-спикере речь шла точно о пьяном дураке.
Мертвые тела в другой ролевке, по замыслу авторов, должны были источать жужжание мух. Увы, вместо этого из динамика раздавались... страстные стоны.
Согласно книге руководств к компьютерным играм, немецкие солдаты в Wolfenstein 3D при виде героя кричали: «Шушпан!» Авторы игры, однако, полагали, что это «Шуцштаффель!» — «Эй, охрана!»
Это, конечно, не баги в прямом смысле слова, но вспоминаются наравне с ними. И неудивительно.
Чудеса анимации
Кругом суетились зомби из Енотограда, штук двадцать, не меньше. Глаза у них были совсем уж остекленевшие, по всему было видно, что чужеродный скрипт, внедренный где-то в глубинах собора, окончательно переклинил им остатки мозгов. С какой-то механической обреченностью, характерной, если верить старым фильмам, для потерявших надежду зэков, они валили лес.
По одному или по два они становились на четвереньки перед деревом и принимались его грызть, и правда напоминая обалделых бобров. Процесс это, по всему видать, был не быстрый: кругом имелось много деревьев разной степени погрызенности.
Призрак, «Беглые мертвецы»
В современных играх стал популярным другой способ развлекать багами мировую общественность: сбои и нестыковки анимаций. И эти зрелища не покинут нас еще долго, потому что стыковка анимаций — одна из самых трудных задач программиста и художника.
Впрочем, это бывало и раньше. Вспомним хотя бы летучую телегу из Daggerfall (эта игра — вообще отличный заповедник багов всех мастей). В наши дни летают не только телеги; в S.T.A.L.K.E.R.: Чистое небо в небесах парила грузовая фура. Не иначе, «гравитационная аномалия»!
Медициной в стратегии Myth ведал странный товарищ, похожий на дворника в тулупе с лопатой для расчистки мостовой. Его целительные действия частенько напоминали средневековую анестезию методом «лопатой по башке». По крайней мере, пациент больше не мучился...
А был еще знаменитый эффект из Baldur's Gate, когда стрела из лука в погоне за персонажем бодро сворачивает за угол. Хотя тут виной не анимация, а логика игры: поскольку она идет в реальном времени, а бой между тем считается пошагово, попала стрела или нет — определяется в момент выстрела. Пока она летит, вполне реально успеть спрятаться за углом дома... но возмездие все равно неотвратимо.
Assassin's Creed прославился загадочным поведением своих лошадей: они время от времени решают переквалифицироваться в страусов и бодро бегут на двух передних ногах, помахивая задними в воздухе. Большой Папочка из Bioshock временами начинал заниматься чем-то малоприличным безо всякого «горячего кофе». А Mass Effect запомнился, помимо прочего, загадочными танцами, которые один из героев начинал исполнять в бою.
В FIFA 2007 многие были свидетелями того, как футболист, которого судья приглашает пробить штрафной, игнорирует мяч и начинает от всей души пинать ногами судью — видно, наболело... Мяч, впрочем, исправно летит в направлении ворот.
В раннем World of Warcraft случалось, что во время плясок на столе игрок проваливался в столешницу по пояс. И что же? Крякнув, так и уходил со столом на поясе. Столоверчение заканчивалось только со сменой локации (малой, то есть когда меняется надпись под мини-картой). Вообще, онлайновые игры, позволяя слишком многим игрокам слишком много свободы, частенько даже после сотни патчей разрешают игроку зарыться задом в землю или пробить стенку и заглянуть в соседнюю комнату. Порой это удается в WoW и посейчас.
В Xenus любопытные мирные жители иногда начинают тереться о вашу машину и погружаются внутрь; само по себе это не слишком интересно, но удивительно, что, если тронуться с места — все равно в какую сторону! — автомобилефил немедленно погибнет в страшных муках.
Однако больше всего по части застреваний друг в друге запомнилась История войн: Наполеон. Там кавалерия обожала выстраиваться в боевой порядок, известный в народе как «шестизадая кусака»: конники становятся на одно и то же место и поворачиваются головами в разные стороны, так что всадники сливаются в нечто вроде шахматного ферзя, а лошади, выставив во всех направлениях хвосты, выглядят совершенно неописуемо!
В Master of Magic теневые демоны недосчитались одной анимации, в результате чего выбрасывали игру в DOS. В этом не было бы ничего интересного, если бы не один факт: происходило это обычно тогда, когда их дела были плохи. Что и заставило игроков назвать это еще одним заклинанием демонов — Exit to DOS. А в Realms of Arkania иногда после выигранной тяжелейшей битвы перед нами появлялась... надпись Loading. А что, монстры тоже имеют право на Save/Load! Правда, это был баг чисто графический, надпись возникала вместо другого сообщения. Но адреналина враз прибавлялось.
Том второй
Места, которых нет и не может быть
— Знаю! — завопил он. — Буферный коллектор! Мусорник!
— Что за мусорник? — строго спросил Мак-Мэд.
— Специальная такая зона... Мне как-то объясняли, но я не очень понял. Там это... В общем, там сначала создаются экземпляры классов и объектов, перед тем как их устанавливают в игровой «реальности». Кроме того, туда, как в корзину, удаляются объекты, которые надо бы удалить, но, с другой стороны, терять не хочется. Например, надо тебе что-нибудь срочно вытащить из игрового пространства — вытаскиваешь туда. Там его можно почистить, немного отладить — и обратно.
Призрак, «Сбежавший город»
Примерно до середины 90-х игровые миры делались буквально вручную: куски скриптов и карт сшивались воедино усилиями программиста. Место экономили, абы что приделать не могли; к тому же карта могла попасть в игру только после долгих и сложных процедур компиляции. Поэтому, если в каком-нибудь Might & Magic III обнаруживалось «Очень Странное Место», то это было, скорее всего, не просто так, а по воле дизайнеров. Стало быть, не баг, а «пасхальное яйцо».
Первым исключением стала, видимо, серия Eye of Beholder: там практиковалась глобальная карта, где пустоты заполнялись залами без окон и дверей. Причем в некоторые из них можно было каким-то образом телепортироваться, в другие — просочиться случайно, в третьи — при помощи кодов хождения сквозь стены. Но эпоха несуществующих локаций была еще впереди.
Однако ближе к концу века началась активная разработка игровых редакторов. Чем дальше, тем больше они напоминали саму игру: находясь прямо внутри виртуального мира, дизайнер менял параметры монстров, что-то добавлял, убирал, копировал... Поэтому «служебные» и «временные» локации существовали на том же основании, что и «настоящие». И нередко попадали в игру. Впрочем, прошедшее время тут неуместно: попадают до сих пор.
Громче всех прославился несуществующими областями, пожалуй, World of Warcraft. Еще в 2005-м году прогремел ролик Exploration: The Movie — в нем мы, вытаращив глаза, любовались Каражаном, Зул-Гурубом, Ан-Кираем, Пещерами Времени... Повторюсь, в 2005-м году, когда всех этих областей в игре не то что не было — их даже не ждали! Нашлись там и «рабочие» локации вроде «Острова Программиста».
Они не просто «уже были» в клиенте игры; в них можно было попасть, не ломая код. Техника «хождения по стенам» (баг, исправленный, если я правильно помню, в конце 2005-го), эликсир левитации и другие возможности, легальные или не очень, породили целую серию роликов о несуществующих локациях.
World of Warcraft, конечно, делали с большим размахом, но он по этой части не уникален. Тут чаще всего отличается онлайн, хотя и однопользовательским игрушкам есть чем похвастаться.
В EverQuest какое-то время оказался подключенным «заповедник гоблинов» — огромный зал, битком набитый монстрами. Точнее, их чучелами, потому что они были абсолютно неактивны. В Star Wars: Knights of the Old Republic 2 остался фрагмент целой планеты, которую, по-видимому, не успели доделать — а убрали не до конца. Весьма изобильны «недолокациями» игры от Bethesda: Oblivion, Fallout 3...
В Vanguard неподалеку от родины вулменов (волколюдей) нашлась проходимая стена в пещере — а за ней загадочная территория, известная как «танцплощадка». Там представители разных рас без передышки... выражают друг другу разные эмоции. Видимо, там их тестировали на совмещение, чтобы поклон не казался ударом головой в солнечное сплетение, а салют мечом — предательским ударом в подмышку.
В Hellgate: London нашлась более неприятная «секретная» локация: тот, кто радостно обнаруживал неизвестную комнату и вбегал туда сквозь щель в стене, был вознагражден... постепенным пропаданием своего снаряжения. Наверное, невидимые rust monsters?
Ultima Online однажды обзавелась «хитрой ловушкой на вампиров»: закуток между скал, где лежало что-то очень похожее на золото. Но стоило его подобрать — и в вещмешке оно обращалось в чеснок!
Неразменные пятаки
Неожиданно на поясе Мак-Мэда, щелкнув, появился новый бумеранг.
— Вот! — лихорадочно заорал Ксен. — Старый бумеранг чего-то достиг!
Призрак, «Следствие ведут бета-тестеры»
Постоянная в игре ситуация. Приходит, скажем, приключенец к работодателю и говорит: ты, дескать, просил голову дракона — так вот она... И получает награду. Работодатель не хранит эту голову у себя, иначе он через день игры будет носить с собой палеонтологический музей. Он ее, строго говоря, даже не берет: в момент «передачи» голова просто уничтожается.
Но иногда автор скрипта забывает уничтожить голову. И тогда возникает нештатная ситуация. Дальше все зависит от логики игры.
Если квест можно взять и сдать снова — с нами бесконечный источник как минимум опыта, а может, и наград (если, конечно, за голову дракона не причитается рука принцессы). Такие дыры имелись в Baldur’s Gate, Neverwinter Nights и много где еще.
Если нельзя, то с нами просто бесполезный предмет; но порой этот квест оказывается «критическим», необходимым для сюжета, и тогда выкинуть драконью башку нам тоже не дадут! Особенно весело, если башка занимает кучу места или весит с полцентнера (а нагрузка в игре при этом учитывается). Классический чемодан без ручки.
Временами неразменность проявляется, когда кладешь вещь в сундук или банк. Все мы наслышаны об удвоении вещей в полусотне разных игр — она происходит как раз от этого.
А бывает, что неразменность — плановый эффект; так, например, в игру закладывается невозможность избавиться навсегда от стартовой экипировки. Конечно, продать «тренировочный меч» тогда нельзя. Но однажды я набрел на такой забавный эффект: выбрасывая новичковое снаряжение, ты получаешь его заново, однако, как оказалось, оно не создается игрой заново, а берется из какого-то запасника! И если этот запасник израсходовать (что непросто — придется методично выбрасывать 255 мечей), то в дальнейшем у вас в мешке будут появляться другие мечи из разнообразных запасников. К сожалению, продавать их тоже нельзя и никуда не припрячешь. Только выкидывать, а ведь нет никакой гарантии, что на оставшемся складе есть что-то лучше.
А в Montrouge MUD остроумные французы сделали «тест на жадность». Выглядел он как типичный баг неразменности: сдаешь квест, получаешь награду (но почему-то только золото, а не опыт!), а требуемый предмет остается, и можно сдать его снова. Деньги в «Монруже» были весьма актуальны, поэтому как не попытаться получить таким манером миллион?
Но только вот беда: всякий раз, как вы сдавали этот квест, в прихожей работодателя создавался паук. Один. Если вы, как честный человек, получали награду один раз (ну, или как не очень честный — два-три), то выходили с деньгами спокойно, потому что паука забить не проблема. А жадина-говядина сталкивалась в дверях с парой сотен агрессивных членистоногих, которые загрызали его в два укуса, а потом утаскивали с собой в небытие все снаряжение с трупа (это же MUD, а в них при гибели персонажа все пожитки обычно остаются на теле). А если зайти к квестодателю снова, он сообщал что-то вроде: «Так будет с каждым, кто польстится искать дыры в ткани мироздания!»
Игры со смертью
Покинутая игроком оболочка-персонаж имела жалкий, порой даже пугающий вид. Застывшее лицо, абсолютная неподвижность. Чаще всего такие оболочки сидели, привалившись к стене, или вообще лежали.
Призрак, «Следствие ведут бета-тестеры»
В свое время журнал Dragon публиковал серию вопросов, на которые должен себе ответить мастер D&D, если хочет, чтобы в его приключениях смерть персонажей не приводила к глупым ситуациям. Например: если герой умер, а впоследствии был воскрешен — кому принадлежат его вещи, ему или наследникам? А если он умер, а вдова вышла снова замуж — чья она теперь жена?
В компьютерных играх проблемы со смертью обычно не настолько пикантны. Зато многочисленны.
Например, в Wizardry VII (и еще многих играх) учитывается вес экипировки, но при этом считается — и не без оснований, что заставлять выжившего героя тащить с собой трупы павших будет садизмом. Поэтому мертвые как бы перемещаются вместе с живыми... и волокут свои вещички. Итог — схема для игры с одним или несколькими героями-«мулами»: мертвец тащит все тяжести группы, не устает, есть не просит и опыт у команды не отъедает.
В Ultima Online участники клановых войн непременно обзаводились «разведпризраками». Привидению что сделаешь? А сообщить о результатах разведки можно либо спиритуалисту, способному говорить с духами... либо его астральной сущности при помощи телефона.
В The Lord of the Rings Online в мертвом виде удобно путешествовать. Если вас убили в бою, ремонт экипировки обойдется в кругленькую сумму; но если погибнуть от падения со скалы, будете как новенький. Только штраф к максимуму хитов на несколько минут. Иногда эту жертву стоит принести... Например, в Мории честный путь от Перекрестка до подземного шлюза — через много пересадок, долго и дорого. А нечестный — прыг в колодец и уже там.
В какой-то из версий Heroes of Might & Magic IV вор мог водить с собой героя-покойничка, который не мешал ему пробираться тайно мимо монстров и при этом получал половину опыта. Когда наконец воскресишь такого — получишь могучего бойца или мага, который уже сам себе армия, даром что не участвовал пока ни в одном сражении.
Смерть порой оказывается хорошим поводом для того, чтобы... выжить. Помните Йосимо (Yoshimo) из Baldur’s Gate 2? Если взять его с собой в Spellhold, он предаст, если не взять — погибнет от своего гейса... но что, если он к тому моменту будет уже мертв? Ведь смерть-то в игре, когда не вызвана гейсами и тому подобными обстоятельствами, не окончательна.
Доверчивость в MMORPG
— А что? Тебя поймали на использовании бага?! Ты нашел... Постойте, постойте... — Глаза Внучки округлились. Она глянула на тщательно отводящих взгляд тестеров и выпалила: — Не может быть!
Призрак, «Следствие ведут бета-тестеры»
Когда авторы виртуальных миров пишут наставление своим более молодым коллегам, они начинают, как правило, с одной и той же мысли: «Как бы вы ни защищали игровой клиент, его непременно сломают. Поэтому не подавайте на клиент информацию, которой игрок может воспользоваться во зло...»
И в самом деле, непременно сломают. И в любую дыру обязательно пролезут. Потому что в онлайне дыра — это средство получить превосходство над другими игроками. И для многих, очень многих игроков — как правило, от четверти до половины всего населения сервера — это чертовски ценный приз.
Правила дорожного движения пишутся кровью нарушителей. На грабли излишней доверчивости наступило немало игроделов.
Хотите ускорить подгрузку локаций на клиенте и для этого заранее сообщаете клиенту о том, чего игрок еще не видит? Отлично, вы снабдили игрока радаром. Кто-нибудь непременно вскроет эту возможность и сделает ее легкодоступной. Так в свое время прокололся Dark Age of Camelot и много кто еще.
Хотите оптимизировать траффик — и для этого храните карты на клиентской стороне? Чудесно, вы только что сделали для игроков возможность просматривать карты подземелий, искать секреты программным путем, а жуликам вдвое упростили работу по созданию эмулятора.
Или, напротив, желали снизить нагрузку на сервер, переключив расчет перемещений героя на компьютер игрока? Еще того чудесней: вы наградили игроков возможностью ускорения, полета и телепортации. Потому что если не проверять то, что сосчитал клиент, на допустимость, можно послать с его стороны серверу любые координаты. В ранневиртуальную эпоху и такое случалось не раз.
И, разумеется, не стоит надеяться на доброжелательное поведение игроков. Хотя главная заповедь любого ролевика гласит: «Ролевая игра — игра кооперативная, и лучший игрок — тот, который хорошо умеет сотрудничать с авторами, другими игроками и миром», многие считают за главную доблесть наплевать на тех, других и третьих.
Самая знаменательная история на эту тему — это борьба Ultima Online с человекоубийством.
Задумано было, на первый взгляд, разумно: один РС может убивать другого, но тот, кто выступил зачинщиком, получает на будущее серьезные проблемы. Вывод? Надо сделать зачинщиком своего противника.
Как именно? Множеством способов.
Самый простой — «метод Матерацци»: разозлить врага словесными издевками до того, что он сделает первый шаг. При небольшом навыке не штука делать это так, что даже игровые мастера, вызванные по факту оскорбления, не смогут ни к чему придраться. Штат мастеров очень быстро вырос в несколько раз, но метод актуальности не потерял.
Другой путь — быстрая кража добычи с убитого не вами монстра. Это не воровство, вы взяли то, что никому не принадлежит... а значит, обидевшийся победитель чудовища будет сам виноват. Пришлось закрывать возможность обирать тушку кому бы то ни было, кроме непосредственного убийцы монстра, — на минуту или около того.
Отлично, но кто мешает нанести последний удар уже почти добитому чудовищу? И стать законным обладателем добычи? В современных играх тварь, которую уже бьют, тем самым маркируется как «собственность» напавшего, но во времена «Ультимы» про такое не слыхивали.
Наконец, всякий, кто колдует заклинание с площадным эффектом — вроде стены огня, тем самым объявляет себя законной добычей кому угодно. Убийца вбегает в стену и может считать себя «атакованным».
И так далее и тому подобное. В итоге — либо вообще запрещать PvP вне специально отведенных участков, либо разрешать безо всяких оговорок. Способа не оставить ни одной дыры для злоумышленников так и не нашли.
Чудеса искусственного интеллекта
— Капитан! — послышался из переговорника раздраженный голос Внучки. — Боты опять застряли в люке и пытаются грузить торпеды через рубку!
Призрак, «Фанат «Звездного конвоя»
Но самый обильный багами кусок игры — вне всякого сомнения, искусственный интеллект. Вот где стада непуганых багов пасутся всегда. Причем, что обиднее всего, чем сложнее ИИ, тем заметнее баги.
Помните, как все кому не лень крыли последними словами ИИ Oblivion? А все потому, что авторы игры осмелились дать горожанам и прочим NPC подобие нормальной жизни. Они ходят в магазин, ухаживают за садиком, ложатся спать... а у игроков вопрос: почему эти негодяи ложатся спать в мундире и сапогах?! Хотя к более ранним играм, где население просто слонялось от дома к дому днем и ночью, никаких претензий не имелось.
Древние игры чаще всего вызывали нарекания из-за поиска пути. Два самых любимых бага:
1) вся армия сбивается в кучу перед мостом на радость вражеским артиллеристам;
2) увидев, что мост занят проезжающим по нему танком, вся остальная армия решает, что путь закрыт, и ломится вброд или в обход через Северный полюс.
Если сейчас уже более или менее научились избегать таких казусов, то в 90-е, особенно в первую волну RTS, это постоянно происходило даже с громкими проектами. Резиновую рамочку уже освоили, а ИИ к ней еще не приучили.
Когда в боевиках появились вертолеты, частенько можно было наблюдать характерное зрелище: вертолет подымается в воздух и выходит за пределы дальнобойности бота. Тот начинает... бегать кругами на месте, потому что пытается до вертолета добежать и не понимает, что ему не судьба.
Отдельная задача — научить NPC не разбиваться при падении. И при этом не переборщить. Так, например, герольд в The Lord of the Rings Online боится ушибиться, свалившись с высоты в полтора метра, — и поэтому обегает опасный участок за тридевять земель, возвращаясь со свитой в десяток агрессивных монстров. В WoW зверь следует за охотником, а демон за колдуном... но по кратчайшей траектории, и в ранних версиях игры он умел избегать пропасти, но не падения в лаву. А вообще персонажи, которые без сомнений прыгают со скалы или лезут в воду, не умея плавать, украсили собой множество игр.
Вопросы видимости — тоже непаханое поле. Так, например, в ArmA 2 трава блокирует обзор тому, кто в ней лежит, и это логично; но для противника, который достаточно далеко, удаленная трава не отображается, и спрятанный в ней враг — как на ладони.
В Crysis и того хлеще: можно держать перед глазами объект, и впереди стоящие противники вас не заметят. Точь-в-точь младенец, который «прячется», закрывая глаза... В Crysis еще много таких замечательных эффектов. Прославился ролик, в котором герой бросает горящую бочку со взрывчаткой — и враги бегут на шум посмотреть, что это там такое бумкнуло, а потом стоят у бочки и ждут, пока она взорвется.
Велик соблазн описывать действия монстров скриптом, а порой без этого просто не обойтись; но надо просчитать, как скрипт отзовется на нарушение условий из-за деятельности игрока. Вот, например, два персонажа беседуют; в одного из них выстрелили, он отключился, а второй продолжает разговор уже сам с собой. Это зрелище можно было увидеть не так давно в Crysis.
Скрипты почти всегда позволяют игрокам творить всевозможные бесчинства — не вызывая недовольства NPC. Например, сплясать на чьем-то троне в присутствии хозяина? Запросто. Хотите в Oblivion швырнуть в комнату огненный шар — хозяин будет не против, но попробуйте только украсть у него хоть мелочь... А в Neverwinter Nights или Baldur’s Gate не возбраняется и воровать прямо из-под носа у хозяина. На глазах изумленной публики берете из сундуков и шкафов все, что там лежит, и уходите.
К слову об Oblivion: там применяются «весовые» скрипты, в которых возможные варианты реплик NPC выбираются случайно, но с учетом обстоятельств. Результаты таких опытов почти всегда содержат баги, так вышло и здесь. «Мне надо поговорить с тобой о важном деле... У меня нет времени разговаривать с тобой!»
Напоследок процитирую свою же статью пятилетней давности — в ней речь шла о собственном опыте, связанном со свободным ИИ. Обычно до релиза такие штуки не доживают, так что в готовой игре самого интересного не увидишь...
Пришла как-то авторам в голову мысль. Пускай, дескать, будет у нас в полях да лесах мирная живность. Дело-то, чай, неплохое? А то, когда каждой твари на свете только и дела, что игрока загрызть, скучно это зело.
Сказано — сделано. И появились в игре звери мирные и дружелюбные: тушканчики.
Но только не сидеть же тушканчику без дела? Это уж не тушкан, а монумент какой-то получится, Юрий Долгоухий. И решили разработчики: пущай он питается, от хищников спасается, а в свободное время — истово размножается...
Черное дело сделано. Тушканы размножились.
Поелику среди игроков могут быть и детишки малые, не стали они во всей красе показывать, как тушкан размножается. Сделали они проще: вот встретил один тушкан другого, также ничем не занятого, произошла у них любовь платоническая, и в результате где-то неподалеку родился новый зверек. И славно, и благостно, и кобры всех грызунов не перекушают. Чего уж лучше? А дабы не размножались тушканы слишком уж быстро, велено им было: после свершения любви грызунской немедля бежать опрометью друг от друга. Пока не заставили алименты платить.
Стал быть, дали тушканам три цели: есть, не быть съедену и размножаться. И задумался тушкан...
Но только разработчики долго ничего дурного не замечали. Покуда не случилось одному из них забрести на крутой утес. И тут он увидел: тушканы-то с утеса прыгают как ни в чем не бывало, а внизу — обрыв сто сажен. Разбиваться тушкану никто не запретил: только велел съедену не быть. Вот он и плющится, сердешный, в кашицу.
Посмотрел тот программист, потылицу почесал: дети малые посмотрят на безобразие такое, решат — всякому можно с обрыва прыгать. Нехорошо. И издал программист указ: отныне с утеса тушканам отнюдь не прыгать, а ежли видит, что разобьется он, — не лезть на рожон ни под каким видом.
Что за притча? Число тушканов не по дням и даже не по часам, а по минутам растет. Вот уже FPS'ы умерли, и игра из реально-временной пошаговой сделалась. Хоть кнопку «Следующий кадр» приклеивай. Пришлось программисту специальный тушканометр включить. Видит: в самом деле безобразие творится. По двести тушканов в секунду прибывает.
Искал он, бедолага, в чем дело, искал — нет ответа. Тогда издал он новый указ: ежели в окрестности слишком много зверья развелось — не искать себе подобного, а прочь бежать (не ведал он, горемычный, легких путей).
Однако же тушканов все прибавлялось.
И ввек бы ему загадку ту не разгадать, кабы случай ему не помог. Увидел он как-то такую картину: спускается на дохлую тушку с небес гриф. Бегущий мимо тушкан, ничтоже сумняшеся, запрыгивает к нему на спину. Гриф взлетает...
Очень программиста заинтриговала эта картина. И увидел он, изучая код, что для тушкана что собрат-грызун, что гриф — все одно: ошибочка вкралась. Но только раньше, пока не влез программист со своими указами, запрыгивал этот тушкан, делал свое грязное дело и... спрыгивал. Всмятку. А теперь ему запретили. Вот он катается на грифе и... это самое... Деваться-то некуда! Он и рад бы!
Мало-мальски стоящий программист всегда помнит: у самого загадочного бага всегда есть простые и естественные причины. И если сейчас я в своем MUD’е вижу массовый суицид эльфов (они убивают гоблинов, забирают у них пузырьки с ядом и тут же выпивают), непонятную агрессию дельфинов по отношению к кораблям или несанкционированный телепортатор в городской помойке, я не ищу здесь происков маленьких зеленых человечков или самоорганизующегося кода и не надеюсь, что баг исправится как-нибудь сам. Такое бывает только у фантастов, причем у плохо разбирающихся в теме.
Изучать баги забавно и полезно; но, если видите в игре интересную ошибку, стоит постараться и придумать простую и логичную причину, которая ее вызывает. Так вы начнете лучше понимать компьютеры... а может быть, и людей.