Read the book: «Баг в титрах»
Глава 1. Кликбейт ради бездны
— Опять халтура, — Глыба ткнул пальцем в монитор. — Гляньте на текстуры. Мыло. А анимация? НПС дёргается, будто ему в задницу код запихали.
Чат взорвался смайликами и требованием «го сносить ящики». ДД уже успела куда-то исчезнуть с экрана.
— Глыба, ты зануда, — раздался её голос из динамиков. — Тут ящики ломаются — вжух! И щепки летят! Физика!
— Физика у них — говно, — буркнул он и покосился на второй монитор, где Опора разворачивал свою таблицу с крафтом. — Опять бухгалтерию развёл.
— Это не бухгалтерия, а оптимальный билд на первые десять уровней с учётом штрафов за экипировку, — донеслось из наушников. — Если вы не будете следовать...
— Слышь, Опор, — перебила его ДД. — У тебя там в таблице ячейка E14 мигает красным. Похоже на ошибку.
— Где?!
Звук падающего стула. Глыба хмыкнул.
Стрим шёл уже два часа. Хайп был так себе — полторы тысячи зрителей, обычный вечер пятницы. Чат развлекал себя сам: спорили, чей билд тупее, кидали друг в друга гифками с котами и требовали «найти пасхалку». Глыба вёл своего орка по Пыльному перекрёстку, изредка комментируя происходящее для тех, кто только подключился.
— Скрыт, ты где?
— В пещере, — тихо ответила она.
— В какой пещере? Тут нет пещер.
— Есть.
Глыба развернул камеру. Действительно: за кучей бочек, которые ДД ещё не успела разнести, темнел провал. Текстура входа слегка мерцала — явно не должны были игроки сюда попасть.
— О, — сказал он в микрофон. — Кажется, нашли секретный контент. Ну-ка...
Орк протиснулся внутрь. Тесный коридор, освещённый багнутыми факелами — их пламя застыло в воздухе отдельными жёлтыми квадратами. Скрыт уже стояла у алтаря в центре зала.
На алтаре лежал предмет.
Он светился. Не просто светился — переливался всеми цветами, которые не должны существовать в этой цветовой гамме. Название всплыло над ним оранжевым шрифтом: «Артефакт Тавтологий».
— Ребята, — Глыба приблизил орка. — Вы это видите?
— Уровень редкости? — тут же спросила Опора.
— Не отображается. Просто... висит в воздухе.
Чат взбесился. Счётчик зрителей пополз вверх. Глыба навёл курсор — описание артефакта всплыло кривым окном, перекрыв пол-экрана. Буквы плыли, складываясь в бессмыслицу: «Багу быть багом. Патч — это просто патч. Игрок есть игрок, когда он игрок».
— Это что за набор слов? — фыркнул он. — Какой-то прикол разрабов.
— Читай вслух! — заорала ДД. — Чат хочет!
— Да ладно, — он усмехнулся. — Хайпанём.
И прочитал.
Экран дёрнулся.
Звук пропал первым. Не просто выключился — исчез. Как будто его никогда не было. Потом изображение свернулось в точку.
Чёрный экран.
Запах пыли ударил в нос — не тот, что от давно не мытого пола в квартире. Другой. Сухой и горячий. И чем-то воняет. Горелым?..
Что-то давило на грудь.
Глыба открыл глаза.
Над ним нависало бежевое небо с парой выцветших облаков. Что-то твёрдое упиралось в спину. Он повернул голову — камень. Здоровенный булыжник, присыпанный песком.
— Какого...
Он попытался подняться. Тело не слушалось. Слишком тяжёлое. Руки...
Рука была зелёной. Огромной и зелёной, с обломанными когтями на трёх пальцах. Он смотрел на неё секунд десять, потом выдохнул.
— Не ори, — сказал он себе. — Не ори.
Рядом заворочалось что-то в тёмном плаще.
— Скрыт?
— Да, — тихо. — Это... я.
— Ты видишь?..
— Угу.
Она подняла руку — тонкую, полупрозрачную, с длинными пальцами без единой фаланги суставов. Просто гнущаяся тень с ногтями.
Глыба сел. Броня лязгнула. Настоящая. Тяжёлая. Пахнет кожей и маслом. Он — орк. Здоровенный тупой орк в латах. А Скрыт — чёртова эльфийка-тень.
— ГДЕ Я?! — раздался вопль из-за камня.
ДД вылетела из-за валуна, размахивая короткими зелёными руками. Розовые патлы метались по лицу. Она уставилась на Глыбу, потом на свои руки, потом опять на Глыбу.
— Я гоблин! — в голосе смесь восторга и ужаса. — Я — гоблин! У меня уши! — она схватилась за голову. — УШИ! Длинные! И четыре пальца! Четыре!
— Ага, — сказал Глыба. — А у меня бицепс размером с твою голову. И я зелёный. Что за...
— Так, — раздался знакомый голос. — Всем спокойно.
Опора вышел из-за скалы — высокий, в мантии, с логарифмической линейкой за поясом. Выглядел он до отвращения спокойно, но линейка у него подрагивала.
— Это не наш мир, — сказал он. — Это...
— «Aethelred», — закончил Глыба. — Я в курсе.
Он попытался вызвать меню. Перед глазами всплыл интерфейс: инвентарь, статы, карта, логи. Вкладка «Выход» отсутствовала. Просто не было. Он провёл рукой в воздухе там, где она должна быть — пальцы прошли сквозь пустоту.
— Выхода нет, — констатировал он.
— Вечный ран, — прошептала Скрыт.
— Что?
Она указала вверх. Перед всеми одновременно всплыло системное окно:
«Принять Вечный ран?»
И две кнопки.
Обе — «Да».
— Очень смешно, — Глыба нажал на одну, потом на другую. Результата — ноль.
Окно сменилось новым сообщением:
«Вы — избранные баги. Пока не пофиксите главный квест, будете висеть тут вечно. Приятной игры!»
— Приятной... — Глыба сжал кулаки. — Ах вы ж...
— Смотрите! — Опора тыкал линейкой в свои логи. — «Вечный ран — это не баг, а фича». Они это специально!
— Кто «они»? — спросила ДД. — Разрабы? Это какой-то ивент?
— Нет, — Скрыт обвела взглядом пустынный тракт. — Это не ивент.
Из-за камня высунулась голова. Седой старик с выпученными глазами. Над ним горел маркер квеста — восклицательный знак в жёлтом круге.
— Путники! — завопил он. — Спасите мою кошку! Она застряла на дереве!
ДД, не думая, рванула вперёд. Только её розовые патлы и видели.
— Стоять! — Глыба попытался схватить её за шкирку, но промахнулся.
Гоблинша уже карабкалась по стволу, цепляясь за кору четырьмя пальцами. Кошка сидела на ветке, поджав хвост — обычная игровая кошка с пиксельной шерстью и дёргающейся анимацией моргания.
— Иди сюда, кис-кис...
ДД схватила её.
Раздался громкий «БАХ!».
Фонтан пикселей. Ветка сломалась, кошка лопнула, как переполненный полигон, осыпав всех искрами. ДД шлёпнулась на песок.
Квест обновился.
«Спасите 2 кошек».
— Две, — сказала Скрыт.
— Я... я не... — ДД сидела на песке, сжимая в кулаке пустоту. — Это был баг!
— Это был баг, — согласился Опора. — Но логика...
— Какая, нахрен, логика?! — взорвался Глыба. — Мы в грёбаной игре, без кнопки выхода, с тавтологичным квестом, который умножает сам себя, и ты мне про логику?!
Он посмотрел на свои руки. Большие. Сильные. И в правой — скипетр. Тяжёлый, с навершием в виде черепа. Описание: «Скипетр Саркастического Исцеления. Лечит союзников вашим язвительным комментарием».
— Вы серьёзно? — он уставился на скипетр. — Вы дали танку хилку? Которая лечит сарказмом?!
Опора открыл рот, чтобы возразить, но тут его собственная мантия замигала красным. В логах побежали строки:
«Артефакт Тавтологий — ключ к главному квесту. Артефакт Тавтологий — ключ... Артефакт... Тавто... логий...»
Текст задрожал.
И начал меняться.
— Он редактируется! — заорал Опора. — Прямо под моим курсором!
Скрыт подошла ближе. Наклонилась. Пальцы её тени коснулись воздуха — и там, где они прошли, на секунду проступили строки кода.
— Это... — она замолчала. — Это структура.
— Что?
— Смотрите.
Она развела руками край текстуры — как раздвигают штору. За ней был не серый «войд». Там мерцали теги. Полигоны. Строки скриптов на незнакомом языке, ползущие вверх, как титры.
— Это всё, — она обернулась. — Весь мир. Он состоит из этого.
Глыба уставился на строки кода. Потом на свой скипетр. Потом на уши ДД, которые нервно подрагивали.
— Так, — сказал он. — Значит, ключ к главному квесту — Артефакт Тавтологий. Который мы активировали.
— И который теперь меняется прямо под курсором, — добавил Опора.
— И выхода нет, — закончила Скрыт.
Интерфейс мигнул красным. Всплыло окно:
«Внимание! Обнаружен новый баг. Загрузка исправления...»
Мир дёрнулся. Небо на секунду стало текстовым редактором, земля — сеткой полигонов. И всё вернулось назад.
Но стражник за спиной Отшельника теперь ходил сквозь стену.
— Надо идти, — сказала Скрыт. — В город.
— Зачем?
— Чтобы понять, кто это сделал. И зачем.
Глыба сжал скипетр. Повертел в руках.
— Ладно, — буркнул он. — Но если там ещё одна кошка — я её сам взорву.
ДД хихикнула.
Опора уже строчил в воображаемый блокнот — его пальцы печатали по воздуху, оставляя за собой строки текста.
— Я запишу последовательность, — бормотал он. — Логи. Паттерны. Это не хаос. Это чей-то...
— Алгоритм, — закончила Скрыт.
И пошла вперёд.
Остальные двинулись за ней. Пустынный тракт уходил вдаль, к далёким пиксельным горам. Где-то там, за мерцающим маревом, лежал город. И ответы.
Или новые вопросы.
Глыба посмотрел на свою зелёную руку. На скипетр. На небо, которое только что было кодом.
— Ну и патч, — сказал он.
И зашагал дальше.
— Зачем в город?
Глыба потопал прямо по тракту, поднимая клубы пиксельной пыли. Его сапоги оставляли в земле следы, которые через секунду исчезали — текстура не успевала подгружаться.
— Ты видела эти строки кода? — Опора семенил рядом, его мантия шелестела, как испорченный PDF. — Там была архитектура! Наследие! Кто-то это написал. А значит, кто-то может это починить.
— Или добить, — буркнул Глыба.
ДД обогнала их по дуге — просто потому что могла. Её розовые волосы мелькали то слева, то справа, то на валуне у дороги. Валун, кстати, был зелёным. И квадратным.
— Тут текстуры недогружены! — крикнула она. — Идеально!
— Идеально, — передразнил Глыба. — У нас квест взрывается котами, интерфейс врёт, а ты радуешься зелёному булыжнику.
— Он изумрудный!
— Он багнутый.
— Одно другому не мешает!
Скрыт шла последней. Её шаги не оставляли следов даже на тех двух секундах, что текстура держалась. Плащ колыхался в такт дыханию — или не колыхался. Глыба уже пару раз оборачивался проверить: тут она или опять ушла в свой невидимый режим.
Тракт петлял между холмами. На одном из них стояло дерево. Ветки росли вниз. Корни — вверх. Дерево было перевёрнуто.
— М-да, — сказал Глыба.
— Это же классика! — Опора аж подпрыгнул. — Баг отражения по оси Y. Я читал про такое на форумах по бета-версии. Разработчики обещали пофиксить в патче...
— В каком патче? — перебил Глыба. — В том, где нас заперли в Вечном ране?
Опора осёкся. Его пальцы дёрнулись к логарифмической линейке на поясе — старый рефлекс, из реального мира. Там, дома, он держал её на столе для антуража. Здесь она была частью инвентаря.
— Ты прав, — сказал он тихо. — Нас заперли. Но это значит, что кто-то спроектировал ловушку. А у каждой ловушки есть проектировщик.
— И триггер, — добавила Скрыт из-за спины.
Глыба не стал оборачиваться. Он уже понял: когда она говорит — она права.
— Артефакт Тавтологий, — сказал он. — Мы его активировали на стриме. Кто-то подсунул. Кто-то написал этот дурацкий текст.
— «Багу быть багом», — процитировала ДД и хихикнула. — Ну кто вообще такое пишет?
— Маркетолог, — сказал Опора.
Все замолчали.
— Что?
— Маркетолог, — повторил Опора. — Это тавтология. Маркетинговая. «Кликбейт ради бездны». «Багу быть багом». Это слоган. Кто-то продавал нам игру.
Глыба остановился. Его зелёная рука сжалась в кулак.
— Продавал, — медленно произнёс он. — А мы купились.
Где-то вдалеке раздался взрыв.
Все повернули головы. На горизонте, там, где по карте должен был быть город, поднималось облако пиксельного дыма.
— Это не мы, — сказала ДД.
— Пока, — уточнил Глыба.
И побежал.
Бежать в броне орка — то ещё удовольствие. Каждый шаг отдавался в позвоночнике, а шлем съезжал на глаза. Глыба матерился сквозь зубы — но не останавливался. Позади пыхтел Опора, впереди мелькала ДД, а где-то сбоку, наверное, скользила Скрыт.
Город показался из-за холма.
Точнее — половина города.
Вторая половина висела в воздухе метрах в двадцати над землёй. Дома, улицы, фонари — всё это плавало в небе, как оторванный кусок карты. Снизу свисали полигоны. Сверху сыпались искры.
— Вау, — выдохнула ДД.
— Не «вау», а «катастрофа», — Опора уже выхватил линейку и что-то считал в воздухе. — Если гравитация в верхнем сегменте откажет, то вся эта конструкция рухнет прямо на...
— На нас, — закончил Глыба.
Сверху что-то заскрежетало. Огромный кусок брусчатки оторвался от висячего города и полетел вниз — прямо на тракт.
— Рассредоточились! — рявкнул Глыба.
Брусчатка врезалась в землю в десяти метрах перед ними. Взметнулось облако пикселей. Когда оно осело, на дороге зияла дыра.
Но не просто дыра.
В дыре был виден код.
— Оно... — начала Скрыт.
— Да, — сказал Глыба. — Вижу.
Он присел на корточки. Заглянул в пролом. Там, в глубине, шли строки. Не такие, как в разрыве текстуры — другие. Быстрее. Злее. Они пульсировали красным.
«if player.status == eternal_run: spawn_bug() quest.cats += 1 quest.difficulty = impossible»
— Это же... — Опора запнулся. — Это не баг-репорт. Это чей-то код.
— Наш код, — сказала Скрыт.
Глыба смотрел на строки. На «quest.cats += 1». На «difficulty = impossible».
— Значит, так, — сказал он. — Мы не просто баги. Мы — переменные.
Опора открыл рот. Закрыл. Снова открыл.
— Переменные в чужом коде, — продолжил Глыба. — Которые кто-то дёргает.
— Разработчик, — сказала Скрыт. — Тот, кто написал игру. Или тот, кто её сломал.
ДД схватилась за пояс с зельями.
— Тогда пошли искать этого разработчика!
— И что ты ему сделаешь? — Глыба поднялся. Колени хрустнули. — Взорвёшь кошку?
— Я ему самого его взорву!
— Он в коде, — напомнил Опора. — Возможно, он сам — часть кода.
Повисла пауза.
Сверху снова что-то заскрежетало. Оторвался кусок забора. Полетел вниз. Приземлился в дыру, пробив ещё глубже. Строки кода замигали, перестраиваясь.
— Смотрите, — Скрыт указала пальцем. — Он... адаптируется.
«if player.status == eternal_run: spawn_bug() spawn_bug() quest.cats += 2 quest.difficulty = impossible patrol.spawn(npc_moderator)»
— Модераторы, — прочитал Опора. — Он вызывает модераторов.
— Потому что мы увидели код, — сказала Скрыт.
— Значит, — Глыба медленно выпрямился, — мы на верном пути.
Из-за холма донёсся звук. Тяжёлые шаги. Металлический лязг.
— Патруль, — сказала ДД.
— Бежим?
— Нет, — ответил Глыба. — Мы идём в город. Быстро.
Они перепрыгнули дыру и побежали к воротам. Те болтались на одной петле. Над ними висела вывеска:
«Добро пожаловать в ...»
Три точки в конце. Буквально — три пиксельные точки, которые мигали.
Глыба влетел в ворота первым. За ним — остальные.
Стражник у входа стоял спиной к ним и смотрел в стену.
— Добро пожаловать, — сказал он.
— Спасибо, — машинально ответил Опора.
Стражник повернулся. Его лицо было идеально ровным — ни глаз, ни рта. Просто текстура.
— Добро пожаловать, — повторил он.
— Он зациклен, — сказала Скрыт.
— Понял, — Глыба обошёл стражника. — Идём дальше.
Улица встречала их фонарями, которые горели вниз головой. Лавки с товарами левитировали. Кошка — живая! — сидела на перевёрнутом ящике и смотрела на них.
— Даже не думай, — сказал Глыба ДД.
— Я и не думаю! — возмутилась та. — Я просто смотрю!
— Ты смотрела на прошлую кошку.
— Та была багнутая!
— Эта тоже. Они все багнутые.
Кошка мяукнула. Изо рта у неё вылетели цифры.
— Видишь? — сказал Глыба.
— Но она же мяукнула!
— Цифрами.
— Может, это такой диалект?
Опора уже ушёл вперёд, к зданию с вывеской «Библ...» — дальше текст обрывался. Двери не было. Вместо неё висела занавеска из вопросительных знаков.
Он отодвинул «?» и вошёл.
Внутри пахло старыми книгами и перегретым процессором. Полки уходили в бесконечность вверх — буквально, текстура не заканчивалась. За столом сидел НПС в мантии. На груди — бейджик: «Библиотекарь 3-го разряда».
— Мне нужна информация, — сказал Опора. — По Артефакту Тавтологий.
Библиотекарь поднял голову. Его глаза были двумя курсорами.
— Патч 2.4.1, — произнёс он. — Исправлена ошибка, при которой игроки могли проходить сквозь стены. Баланс правки: огненный шар — снижен урон на 2%. Добавлен новый...
— Это не отсюда, — перебил Опора. — Это из «World of...»
— Патч 2.4.2, — продолжал библиотекарь. — Удалён класс «Плут». Причина: не вписывается в...
— Да он цитирует патчи другой игры! — Опора обернулся к команде. — Это вообще не его база данных!
— Значит, — Глыба скрестил руки на груди, — кто-то перепутал библиотеки.
— Или намеренно подменил, — добавила Скрыт.
Она подошла к одной из полок. Провела пальцем по корешку. Тот рассыпался на пиксели. Под ним — ещё один, с названием:
«Как я провёл этим летом. Сочинение. 9 „Б“ класс».
— Тут всё перемешано, — сказала она. — Это не библиотека. Это свалка файлов.
ДД тем временем улизнула в соседнюю дверь. Там обнаружился алхимик. Он стоял над котлом, в котором ничего не варилось. Просто анимация — рука с ложкой дёргалась вверх-вниз, вверх-вниз.
— О, халява! — ДД схватила с прилавка три пузырька.
Никто не отреагировал. Алхимик продолжал мешать воздух.
— Он афк, — констатировала ДД и сунула зелья в инвентарь.
С улицы донёсся лязг.
Глыба выглянул в окно. По мостовой шагал патруль — три фигуры в тяжёлой броне, с гербами в виде скрещённых гаечных ключей. Модераторы.
— Нас ищут, — сказал он.
— Надо уходить, — Опора метнулся к выходу.
— Стой, — Скрыт подняла руку. — Смотрите.
Она указала на стену в углу библиотеки. Та мерцала. Не как багнутая текстура — иначе. Ровно. Ритмично.
— Это проход.
— Куда?
— Внутрь игры.
Скрыт подошла к стене. Приложила ладонь. Стена поплыла, открывая тёмный коридор. Изнутри пахнуло холодом и электричеством.
— Там, — сказала она, — ответы.
Глыба посмотрел на дверь. На библиотекаря, который теперь цитировал патч мобильной фермы. На ДД, которая пыталась открыть четвёртый пузырёк зубами.
— Ладно, — сказал он. — Веди.
И они вошли в темноту.
Коридор оборвался в пустоту.
Глыба шагнул первым — и тут же пожалел. Под ногами хрустнуло. Не камень. Не кость. Что-то вроде битого стекла, только тёплое.
— Свет, — бросил он.
Опора щёлкнул пальцами. Над ладонью зажёгся холодный шарик. Осветил помещение.
Это был не подвал. И не пещера.
Стены из серого тумана. Пол — зеркальная гладь. В отражении Глыба увидел себя — орк, броня, шрам на скуле. А за спиной...
— Там кто-то есть, — сказала Скрыт.
Все замерли. ДД выхватила зелье. Опора приготовил заклинание.
Из тумана вышел человек в сером костюме. Лицо — размытое, как текстура на минималках. Галстук идеально завязан. Ботинки начищены.
— Добрый вечер, — произнёс он. — Вы успешно достигли контрольной точки «Теневая бухта». Поздравляю.
— Ты кто? — спросил Глыба.
— Я — Поверенный. Уполномочен Системой для проведения процедуры подтверждения.
— Какой процедуры?
— Вечный ран.
Поверенный вытянул руку. В воздухе загорелся свиток. Буквы плыли, но читались чётко: «Соглашение о неразглашении и безвыходном пребывании».
— Ознакомьтесь и подпишите, — сказал он. — Точнее, нажмите «Да». Кнопка одна.
ДД фыркнула.
— Ага, щас. Я такие контракты даже на сайте не читаю.
— Ваше право, — Поверенный не шелохнулся. — Однако без подтверждения вы не сможете покинуть данную локацию.
Опора прищурился. Подошёл ближе. Пробежал глазами по строкам.
— Пункт 14.2, — прочитал он вслух. — «В случае аннулирования статуса Вечного рана все накопленные логи удаляются без возможности восстановления». Что это значит?
— Это значит, — Глыба скрестил руки, — что нас не просто заперли. Нас стирают, если дёргаемся.
Скрыт обошла Поверенного по кругу. Тот не поворачивал головы — просто не было такой анимации.
— Он — скрипт, — сказала она. — Не видит, не слышит, реагирует только на ключевые слова.
— И что?
— И то, — она остановилась, — что я уже нашла выход.
Она указала вниз. Зеркальный пол под ногами Поверенного дал трещину. Маленькую. Почти незаметную.
— Это не текстура, — сказала Скрыт. — Это код. Я видела такое за стеной библиотеки.
— Можно сломать?
— Можно попробовать.
Поверенный дёрнулся. Впервые за весь разговор.
— Внимание, — произнёс он. — Зафиксирована попытка несанкционированного доступа к исполняемому коду.
— Зафиксируй ещё вот это, — ДД швырнула зелье под ноги.
Бах. Зеркало пошло трещинами.
— Бегом!
Они прыгнули вниз одновременно. Глыба — первым, пробивая плечом осколки. Опора — за ним, успев выкрикнуть:
— Это нарушает по меньшей мере четыре правила пользования!
— Пиши жалобу! — рявкнула ДД, утягивая его за шиворот.
Скрыт нырнула последней. Уже в падении она оглянулась. Поверенный стоял над проломом. Его лицо пошло рябью. На секунду проступили черты — усталые, почти человеческие.
А потом темнота.
И удар о землю.
Глыба поднялся первым. Отряхнулся. Вокруг — каменные стены. Факелы. Где-то капает вода. И тишина. Настоящая. Не как в игре — с фоновым шумом ветра и цокотом копыт. А мёртвая. Как в отключенном сервере.
— Народ, — позвал он.
— Тут.
— Тут.
— Здесь.
Все целы. Но в логах — красная строка.
«Внимание! Вы покинули допустимую зону. Загрузка исправления...»
И ниже:
«Ошибка. Исправление не загружено. Причина: файл не найден».
Глыба выдохнул.
— Значит, так, — сказал он. — Больше никаких квестов. Никаких кошек. Никаких библиотекарей. Ищем консоль.
— Консоль заблокирована, — напомнил Опора.
— Значит, ищем того, кто её заблокировал.
Скрыт молча указала вперёд. Там, в конце коридора, горела табличка:
«Серверная. Посторонним вход воспрещён».
А под ней — мелко, почти в шутку:
«Особенно посторонним с Вечным раном».
Глыба усмехнулся.
— Ну вот и свиделись.
Он шагнул к двери, уже предвкушая финальную битву. Но та не поддалась. Вместо этого панель доступа засветилась, требуя пароль. — Требуется системный ввод, — констатировал Опора. — Значит, ищем разработчика, — сказала Скрыт. — Того, кто спрятал консоль. Глыба кивнул и шагнул к двери, уже предвкушая финальную битву.
Глава 2. Пользовательское соглашение с петлёй
Они выбрались из Серверной и вернулись к хижине Отшельника. Над его головой уже висел новый знак.
— Квест обновился.
ДД уже подпрыгивала на месте. Розовые волосы хлестали по плечам, зелья на поясе позвякивали в такт.
— Да ладно вам! Одна взорвалась — подумаешь! Это же квест! Тут經驗а дают!
— Опыта, — поправил Опора. — В логах написано «опыта». Через «о».
— Да хоть через «ё»! Я хочу посмотреть, что будет, если спасти сразу двух!
Скрыт молча указала на угол интерфейса. Там, переливаясь алым, висела строчка:
«Текущий статус: Вечный ран. Попыток выхода: 0. Доступных попыток выхода: 0».
— Это значит, — сказала она, — что любой провал…
— …генерирует новый баг, — закончил Глыба. — Уже проходили.
Отшельник всё ещё стоял у своей покосившейся хижины. Моделька дёргалась — левая рука проваливалась в текстуру стены по локоть, правая нога ушла под землю по колено. Над головой висел восклицательный знак, и под ним — цифра «2».
— Две кошки, — сказал Отшельник. Голос звучал как запись на заезженной кассете. — Две мои кисоньки. В лесу. За холмом. Спасите.
— А в прошлый раз была одна, — заметил Опора.
— Квест обновился, — пожал плечами Отшельник. — Я что, программирую?
Глыба посмотрел на скипетр в своей руке. Здоровенная дубина с сияющим набалдашником и гравировкой: «Лучшее лекарство — это смех». Ниже мелко: «Скипетр Исцеляющего Сарказма. +15 к регенерации от фейспалма».
— Ладно, — сказал он. — Идём спасать кошек. Но если хоть одна…
— Бах! — радостно выкрикнула ДД и рванула к холму.
Глыба задержался на секунду. В голове мелькнуло: «Снова. Он просто копирует скрипт». Отшельник, квест, кошки — всё это уже было. Система гнала их по кругу, меняя цифры, но не суть. Он мотнул головой и двинулся следом за ДД.
Лес начинался сразу за хижиной. Деревья росли под углом сорок пять градусов — видимо, генератор ландшафта решил, что так эпичнее. Трава переливалась всеми оттенками фиолетового. Где-то в кронах заливалась цикада, но звук был записан с перегрузкой: каждая трель заканчивалась хрипом, будто цикада курила тридцать лет.
— Кис-кис-кис! — ДД раздвигала кусты. — Отзовитесь, взрывоопасные!
— Ты их пугаешь, — сказал Опора. — Согласно бестиарию, местные кошки реагируют на спокойный голос.
— Согласно чему? Ты уже и бестиарий прочитал?
— Пока вы падали в зеркало, я листал инвентарь. У меня там книг на три слота.
Глыба обернулся:
— И много полезного?
— «Справочник грибника», «Этикет дворфов» и «Сто способов приготовить василиска». Пока нет.
Скрыт двигалась вдоль кромки леса. Плащ делал её почти невидимой среди фиолетовых стволов. Она остановилась и подняла руку.
— Там.
Все замерли.
На поляне сидела кошка. Обычная. Серая. С жёлтыми глазами. Над головой — маркер: «Кошка Отшельника. 1 из 2. Спасите».
— Одна есть, — выдохнула ДД. — Где вторая?
Вторая нашлась сама. Прямо над первой, в воздухе, висела точно такая же кошка. Вверх ногами. И медленно вращалась вокруг своей оси.
— Это баг? — спросил Глыба.
— Это анимация, — Опора уже открыл логи. — Смотри: «Object_Cat_02: состояние — левитация. Причина: не назначена гравитация».
— Кошка без гравитации, — медленно повторил Глыба. — Они даже кошку нормально не сделали.
ДД уже кралась к поляне. Руки вытянуты вперёд, шаг осторожный — как сапёр над растяжкой.
— Кисонька, хорошая… Не взрывайся, ладно? Мы тебя спасём…
Кошка на земле моргнула. Кошка в воздухе сделала полный оборот.
— Я беру эту, — ДД кивнула на нормальную. — А ты, Скрыт, лови летучую.
Скрыт беззвучно отделилась от дерева и двинулась к парящей кошке. Плащ стелился по фиолетовой траве.
— На счёт три? — предложила ДД.
— Давай.
— Раз…
Глыба сжал скипетр. Опора открыл меню заклинаний. Там было пусто, если не считать одного: «Баррикада из Бюрократии. Эффект: замедляет противника на время чтения договора».
— Два…
Скрыт протянула руку к левитирующей кошке. Та сделала ещё один оборот и уставилась на неё жёлтыми глазами. В перевёрнутом виде кошачья морда выглядела особенно жутко.
— Тр…
Интерфейс мигнул красным. Над поляной развернулось системное сообщение:
«Внимание! Обнаружен новый баг. Загрузка исправления…»
— Стойте! — крикнул Опора. — Не трогайте!
Но ДД уже схватила кошку.
На секунду ничего не произошло. Кошка мявкнула. ДД расплылась в улыбке.
— Видите? Нормаль…
Интерфейс дёрнулся. Строка «Кошка Отшельника. 1 из 2» мигнула и сменилась на «Кошка Отшельника. 2 из 2». Одновременно с этим кошка в руках ДД исчезла — просто дематериализовалась, оставив после себя облачко пиксельной пыли.
— Что?
А потом земля под ногами ушла вверх.
Нет, не земля. Они. Поляна накренилась. Деревья поехали вбок. Небо и трава поменялись местами. Глыба вцепился в ствол ближайшего фиолетового дуба и увидел, как Опора катится по склону, который секунду назад был ровным.
— Гравитация! — заорал Опора, пересчитывая рёбрами корни. — Она переключилась на всю локацию!
Скрыт парила в воздухе — её плащ развернулся крыльями, но и её тянуло в сторону. Кошка всё так же вращалась вокруг оси, только теперь не одна: вокруг неё кружились камни, ветки и ДД, которая успела поймать воздушный поток и теперь неслась вверх тормашками.
— Класс! — донеслось откуда-то сверху. — Как на американских горках!
Глыба посмотрел вниз. Туда, где теперь был верх. А там, на «потолке», сидела вторая кошка и спокойно вылизывала лапу.
Первая исчезла. Вторая сидела на недосягаемой поверхности. А мир продолжал вращаться.
— Она же сказала «не трогайте»! — прохрипел Глыба, пытаясь не разжать пальцы.
— Я не сказала! — крикнула Скрыт. — Я только рот открыла!
— Это система! — Опора наконец зацепился за пенёк и открыл интерфейс. — Смотрите! «Исправление загружено. Версия патча 0.0.0.1-альфа». Они поставили патч прямо во время нашего квеста!
— То есть кошка взорвалась бы в любом случае? — ДД пролетала мимо с выражением глубокого облегчения на лице. — Я не виновата!
— Виновата! — рявкнул Глыба. — Ты схватила её до загрузки патча! Теперь у нас минус одна спасённая кошка и плюс одна гравитационная аномалия!
Квест обновился. Над головой Отшельника — он всё так же стоял у хижины, только теперь вверх ногами относительно них — сменилась цифра.
«Спасите трёх кошек».
Глыба выматерился. Скипетр в его руке засветился — видимо, сарказма накопилось достаточно для активации.
— Три кошки, — прочитал он. — Сначала одна. Потом две. Теперь три. Что дальше? Десять? Сто? Армия кошек, которую мы должны спасти, пока патчи ломают мир вокруг?
— Это же очевидно, — Опора вытер грязь с мантии. — Квест генерирует баги. Баги требуют исправлений. Исправления ломают квест. Квест генерирует новые требования. Это замкнутый круг. Петля.
— Петля, — повторила Скрыт.
Она всё ещё парила, но уже не боролась с гравитацией — просто висела в воздухе, поджав ноги, и смотрела куда-то в сторону. Туда, где за лесом поднимались стены города. Того самого, из которого они выпали.
— Мы уже это проходили, — сказала она. — В Серверной. Табличка. «Посторонним вход воспрещён».
Глыба проследил её взгляд. Город висел в воздухе. В прямом смысле — половина карты парила над землёй, соединённая с ней только лестницами из кода. Текстуры домов перемигивались. Вместо неба — чёрный прямоугольник с единственной строчкой:
«Рендеринг не завершён. Пожалуйста, подождите».
— Мы никуда не ушли, — сказал он. — Мы просто упали в другую часть того же самого.
— Значит, — Опора поднялся на ноги и отряхнул мантию, — консоль всё ещё…
— Заблокирована, — закончил Глыба. — Да. И тот, кто её заблокировал…
— …продолжает писать патчи, — тихо сказала Скрыт.
ДД наконец приземлилась. Точнее — вписалась розовой шевелюрой в куст. Куст хрустнул, но выдержал. Она выкарабкалась, отплёвываясь фиолетовыми листьями.
— Так, народ. Я всё поняла. Мы не можем спасти кошек. Мы не можем выполнить квест. Мы не можем выйти. Что мы можем?
Глыба посмотрел на скипетр.
— Мы можем перестать играть по их правилам.
— Это как?
Он развернулся к Отшельнику. Тот всё так же стоял у хижины — вверх ногами, с восклицательным знаком и цифрой «3».
— Эй! — крикнул Глыба. — Отшельник!
— Да? — отозвался тот. — Спасите моих кисонек.
— А если мы не будем их спасать?
Отшельник моргнул. Впервые за всё время его моделька перестала дёргаться.
— Что значит «не будете»?
— То и значит. Отказываемся от квеста.
— Нельзя, — сказал Отшельник. — Квест активен.
— А если мы просто уйдём?
— Куда?
Глыба не ответил. Он повернулся к команде.
— Слушайте сюда. Мы не знаем, кто пишет патчи. Мы не знаем, кто заблокировал консоль. Но мы знаем, что этот кто-то ожидает, что мы будем бегать за кошками.
— Логично, — кивнул Опора.
— Значит, мы не будем.
— А что будем?
Глыба указал скипетром туда, где над лесом висела половина города.
— Вернёмся. Найдём того, кто всё это затеял. И заставим его прочитать пользовательское соглашение. Вслух. От начала до конца.
Опора поморщился.
— Это жестоко.
— Я знаю.
Интерфейс мигнул. Строчка о патче сменилась новой:
«Внимание! Квест „Спасите кошек“ отменён. Причина: отказ исполнителей».
И следом:
«Инициирован новый квест: „Найти Администратора“. Сложность: максимальная».
ДД подпрыгнула.
— О! Теперь это интересно!
Скрыт молча указала на появившуюся карту. На ней был отмечен город. Прямо в центре — точка с подписью: «Предполагаемое местоположение Администратора».
— Предполагаемое, — прочитал Опора. — То есть даже система не знает точно?
— Или не хочет знать, — сказала Скрыт.
Глыба посмотрел на скипетр. Тот всё ещё светился. Гравировка «Лучшее лекарство — это смех» перемигивалась, будто подмигивала ему.
— Ладно, — сказал он. — Идём искать Администратора. Но учтите: если он предложит спасти кошку…
— Я первая кину зелье, — пообещала ДД.
— Я составлю протокол о нарушении, — добавил Опора.
— А я, — сказала Скрыт, — найду в его коде дыру.
Глыба кивнул. Гравитация всё ещё работала в обратную сторону, но это уже было неважно. Они развернулись и пошли туда, где над лесом висела половина города. Отшельник проводил их взглядом. Восклицательный знак над его головой погас. Или переключился на ожидание. Кто их разберёт, этих NPC.
Интерфейс дёрнулся и выдал последнее сообщение:
«Пользовательское соглашение обновлено. Пункт 7.3: отказ от выполнения квеста влечёт загрузку альтернативного. Альтернативный квест не имеет гарантии завершения. Удачи».
— Удачи, — повторила ДД и хмыкнула. — Слышь, Глыба, а это угроза или они правда желают?
— В этой игре, — сказал Глыба, не оборачиваясь, — это одно и то же.
Они уходили от хижины. За спиной оставался лес с фиолетовой травой и перевёрнутыми деревьями. Впереди — город, висящий в пустоте на лестницах из кода. И где-то там, в центре, прятался тот, кто знал ответы.
Или делал вид, что знал.
Потому что в мире, где патчи приходят раньше действий, даже администратор может оказаться просто ещё одним скриптом.
Где-то далеко, за лесом, мяукнула кошка.
Или три.
Квест не отслеживал.
Дорога стала шире. Плиты под ногами сменились булыжником, который при каждом шаге издавал звук «мяу». Не скрипел, не хрустел — а именно мяукал.
— Серьёзно? — Глыба посмотрел вниз.
Булыжник мяукнул в ответ.
— Это баг, — сказал Опора. — Или фича. Но скорее баг.
— А по-моему, мило, — ДД наступила на следующий камень. Тот взвизгнул. — Ой. Извини.
Скрыт молча шла по краю дороги, где булыжники молчали. Или не умели мяукать — кто их разберёт, эти текстуры.
Город приближался рывками. Не плавно — мир подгружался кусками, и каждый раз, когда ландшафт дёргался, Глыба чуть пригибался. Привычка. В реальности он не пригибался. В реальности он сидел в кресле и не ждал, что текстура дома рухнет на голову.
— Слушайте, — ДД обернулась на ходу, — а мы вообще дышим? Ну, типа, по-настоящему?
Опора остановился. Приложил два пальца к запястью. Замер.
— Пульс есть. Дыхание есть. Но я не уверен, что это мои.
— В смысле — не твои?
— В смысле — они есть в интерфейсе. — Он ткнул пальцем в воздух, разворачивая полупрозрачное окно. — Вот. Показатель «Сытость», показатель «Усталость», показатель «Сарказм».
— У тебя есть показатель сарказма? — удивилась ДД.
— У Глыбы. Я смотрю его статы.
Глыба заглянул через плечо Опоры. Шкала «Сарказм» была заполнена на три четверти и пульсировала зелёным.
— И что это значит?
— Это значит, что ты здоров, — сказал Опора. — Или скоро будешь.
— Я не болен.
— В этой игре — болен. И твоё лекарство — сарказм. Ты буквально должен язвить, чтобы выжить. Поздравляю.
Глыба посмотрел на скипетр. Тот подмигивал.
— Прекрасно, — сказал он без выражения. — Просто прекрасно.
Дорога дёрнулась и подбросила их на метр вперёд. Все четверо по инерции сделали шаг, хотя никто не шёл.
— Лаг, — констатировала Скрыт.
— Нет, — Опора уже открыл логи. — Это не лаг. Система пишет: «Коррекция маршрута в связи с обновлением квеста».
— Мы же отказались от кошек! — ДД всплеснула руками, и одно зелье на поясе опасно звякнуло. — Какой ещё квест?
Интерфейс мигнул перед каждым. Буквы выстроились в столбик, как будто кто-то печатал в реальном времени:
Квест: «Найти Администратора». Статус: активен. Примечание: маршрут скорректирован. Примечание к примечанию: маршрут проложен через точки интереса. Примечание к примечанию к примечанию: интерес субъективен.
— Оно издевается, — сказал Глыба.
— Оно уточняет, — поправил Опора. — Это разные вещи.
— Нет. Оно издевается. Я за четыре года стримов научился отличать баг от троллинга. Это стопроцентный троллинг.
Скрыт подняла руку. Все замолчали.
Из-за ближайшего дерева — оно росло кроной вниз и корнями шевелило в воздухе — высунулась кошачья морда. Серая. С жёлтыми глазами. И с восклицательным знаком над левым ухом.
— Нет, — сказал Глыба.
— Да! — заорала ДД и рванула с места.
— Стой! — заорал Опора. — Это может быть ловушкой!
ДД не слушала. Она бежала к кошке, и земля под ногами снова мяукала, и зелья звенели, и розовые волосы развевались.
Кошка сидела и смотрела. Восклицательный знак мигал жёлтым.
ДД протянула руки.
Кошка мяукнула.
И исчезла.
Не убежала — исчезла. Просто перестала быть. На том месте, где она сидела, остался только восклицательный знак, повисший в воздухе.
— Что?.. — ДД затормозила.
Интерфейс дёрнулся и выдал всем четверым:
Квест: «Спасите кошек». Статус: активен.
— Да вы издеваетесь! — Глыба сжал скипетр.
Прогресс: 0 из 2. Примечание: кошка №1 обнаружена. Кошка №1 деспавнена по причине: «ранний контакт». Рекомендация: не приближаться к объекту спасения до подтверждения его материальности.
— Подтверждения материальности, — повторил Опора. — То есть теперь мы должны не просто найти кошек, а сначала проверить, не глюк ли они.
— А как мы это проверим? — спросила ДД.
— Очевидно, — сказал Опора, — надо...
Он не договорил. Потому что из-за другого дерева — того, что висело — высунулась ещё одна кошачья морда. Тоже серая. Тоже с жёлтыми глазами. И тоже со знаком.
Только надпись над знаком была другая. Она гласила: «Кошка №2. Не материальна».
— Ну, — сказала Скрыт, — по крайней мере, честно.
— Это ловушка, — сказал Глыба. — Они хотят, чтобы мы потратили время.
— Или ресурсы, — добавил Опора. — Кошки могут требовать хила.
— Или просто взрываться, — добавила ДД. — Уже было.
Глыба повернулся к ней.
— Ты всё ещё хочешь спасать кошек?
— Нет. Теперь я хочу понять, почему они взрываются. Это разное.
— Это одно и то же, — сказал Глыба.
— Нет. Спасать — это когда тебе их жалко. А когда интересно, почему механика работает так криво, — это исследование.
Опора хмыкнул.
— В этом что-то есть. Если мы поймём, как генерируются баги, мы сможем предсказывать их.
— Или использовать, — добавила Скрыт.
Все посмотрели на неё.
— Если система генерирует новый баг при каждом провале, — сказала она тихо, — то каждый наш провал меняет мир. Делает его более... дырявым. Мы можем не чинить квесты. Мы можем ломать их так, чтобы дыры вели куда надо.
— К Администратору, — закончил Глыба.
— Именно.
Интерфейс дёрнулся. Буквы снова сложились в сообщение:
Квест: «Спасите кошек». Статус: приостановлен. Причина: изменение стратегии пользователей. Рекомендация: продолжайте движение к точке интереса.
— Оно нас слышит, — сказала ДД.
— Оно нас читает, — поправил Опора. — Логи фиксируют каждое слово. Я проверял.
— То есть всё, что мы говорим...
— Да. Сохраняется. И, вероятно, влияет на генерацию контента.
Глыба медленно поднял скипетр, посмотрел прямо в интерфейс — туда, где мигала строка статуса, — и сказал:
— Тогда слушай сюда, железяка. Мы идём к Администратору. И если по дороге взорвётся хоть одна кошка...
Он не договорил. Интерфейс мигнул и выдал:
Принято к сведению. Количество активных кошек на маршруте: 3. Примечание: кошки могут не взрываться. Примечание к примечанию: но это не точно.
ДД засмеялась. Опора вздохнул. Скрыт едва заметно улыбнулась.
Глыба опустил скипетр.
— Пошли.
Они двинулись дальше. Город всё так же висел над лесом, и лестницы из кода перемигивались в закатном свете. Закат здесь был фиолетовым и шёл полосами, как на сломанном мониторе.
Дорога перестала мяукать. Теперь она просто молчала, и это было даже хуже — потому что в тишине стали слышны звуки леса. Шелест текстур. Писк интерфейса. И далёкое, едва различимое мяуканье.
Три кошки где-то ждали.
И, кажется, не только они.
Дорога вывела их на пыльный перекрёсток.
Четыре указателя торчали из земли под углами, которых в нормальной геометрии не бывает. На одном значилось «Лес Вздохов», на втором — «Озеро Несохранённых Текстур», на третьем — «Городская Свалка (бета)». Четвёртый указатель просто мерцал красным, без надписи.
— Голосуем? — спросила ДД.
— За четвёртый, — сказала Скрыт.
— Почему?
— Потому что его нет на карте.
Опора вызвал интерфейс карты. Действительно, перекрёсток отображался тремя путями. Четвёртого не существовало.
— Это даже не баг, — пробормотал он. — Это кто-то специально спрятал.
Глыба уже шагал к красному указателю. Земля здесь была плотнее, почти настоящая — не проминалась под весом орка в латной броне. Деревья по бокам от дороги стояли ровно, без глюков. Слишком ровно.
За поворотом открылась поляна.
Хижина. Настоящая — брёвна, мох, кривая труба, из которой не шёл дым. Рядом — колодец. На пороге сидел человек в мешковине и смотрел прямо на них, не мигая.
— Путники, — произнёс он скрипуче, но без эмоции. — Помогите старому отшельнику. Кошка пропала. Спасите.
Интерфейс немедленно отозвался:
Новый квест: «Спасите кошку». Награда: 50 опыта, благословение Отшельника.
— Пятьдесят экспы? — фыркнула ДД. — Да я за один взрыв столько нафармить могу.
— Ты не поняла, — сказал Опора. — Здесь нет экспы. Это просто цифры.
— Тогда зачем?
Отшельник снова открыл рот, но вместо слов оттуда вырвался тот же скрип, наложенный сам на себя трижды. Глыба прищурился.
— У него звуковая дорожка заела.
— Или так задумано, — сказала Скрыт.
ДД уже обегала хижину в поисках кошки.
— Тут! — крикнула она. — Серая, с жёлтыми глазами! На крыше!
Кошка сидела на коньке крыши, обернув хвост вокруг лап. Смотрела на ДД без страха. Без интереса. Как на текстуру.
— Кис-кис.
Кошка не шевельнулась.
— Я её сниму, — сказала ДД и полезла на хижину.
— Стой, — начал Опора, но поздно.
ДД оттолкнулась от колодца, подпрыгнула и ухватилась за край крыши. Кошка моргнула. ДД подтянулась, перевалилась на крышу — и в этот момент кошка исчезла.
Не убежала. Не спрыгнула. Исчезла. Только лёгкое облачко пикселей на том месте, где она сидела.
— Чего?
Интерфейс дёрнулся:
Статус квеста: провален. Причина: объект «Кошка» не прошёл коллизию с персонажем «ДД».
— Какая ещё коллизия? — возмутилась ДД. — Я до неё даже не дотронулась!
Но интерфейс уже переписывал сам себя. Буквы складывались заново, быстрее, чем в прошлый раз:
Внимание! Обнаружен новый баг. Загрузка исправления... Квест перегенерирован: «Спасите 2 кошек». Награда: 100 опыта.
— Что?!
Из хижины донёсся скрежет — тот самый, тройной.
— Отшельник, — сказала Скрыт. — Он теперь говорит.
— Что говорит?
Она прислушалась. Пауза. Потом тихо:
— «Спасите двух кошек».
Глыба выдохнул так, что интерфейс качнулся.
— Идиотский квест.
— Это не квест, — вдруг сказал Опора. Он стоял с открытым логом, и его пальцы быстро скроллили строки. — Это демонстрация механики. Система показывает нам, как работает «Вечный ран».
— Что ты увидел?
— Смотрите. Первый провал — кошка взорвалась. Второй — объект не выдержал коллизии. Оба раза квест перегенерировался. Удвоились требования. Удвоилась награда.
— И что?
— А то, что каждый наш провал что-то добавляет. Не просто новый баг — новый слой. Новую сложность. Мы не приближаемся к финалу. Мы удаляемся.
ДД спрыгнула с крыши.
— То есть чем больше мы стараемся — тем хуже?
— Именно.
Поляна вдруг показалась меньше. Деревья стояли слишком близко друг к другу. Отшельник всё так же сидел на пороге и смотрел, не мигая.
— Тогда что делать? — спросила ДД.
Глыба поднял скипетр. Посмотрел на Отшельника. На интерфейс. На ребят.
— Идём.
— Куда?
— Искать Администратора. Того, кто пишет правила.
— А как же кошки? — спросила ДД почти с обидой.
— А кошки, — сказал Глыба, — пусть спасают сами себя.
Интерфейс мигнул красным.
И загрузил новый баг.
The free sample has ended.