Что делать, если вы нашли в виртуальной церкви неожиданный баг, а вместе с ним портал для вполне реальной старосветской нечисти? Особенно если по инструкции вы обязаны провести там всю ночь...
Технический отчёт инцидента
Фамилия моя – Брушков, должность – тестировщик виртуальной реальности в студии «Цифровой Вепрь». И вот сижу я перед начальством и пишу объяснительную. Чисто технически. Как учили.
– Ну, Брушков, – вздыхает руководитель проекта Антон, он же Тошный Тони, – излагай. С самого начала. И без своих художеств.
Принял к исполнению. Нижеизложенное подтверждаю.
Дата и время начала тестирования: 23 октября, 22:00.
Объект тестирования: VR-симулятор «Забытые Святыни. Церковь Св. Пантелеймона». Версия 0.9.8.
Задача: Провести в симуляции полный ночной цикл (с 22:00 до 06:00) на предмет выявления багов рендеринга, физики и AI NPC в условиях низкой освещённости.
Оборудование: Шлем «Взор-VR Pro», тактильный костюм «Ощущалка-3», платформа свободного перемещения.
Запустился. Локация загрузилась корректно. Церковь, как и задумывалось, – полуразрушенная, деревянная, позапрошлый век. Лунный свет через дыры в куполе, скрип половиц, пыльные лучики от фонаря в руке. Атмосфера на пятерку. Ничего не предвещало.
В 23:47 заметил первый артефакт. В северном приделе, у росписи с изображением Страшного Суда, участок стены площадью примерно 0.5 на 0.5 метра не реагировал на свет. Текстура была не просто тёмной – она была отсутствующей. Чёрный квадрат, поглощающий луч фонаря. Типичный баг загрузки текстур.
Протокол предписывает попытаться взаимодействовать. Поднёс руку (виртуальную). Физика сработала нестандартно. Руку не оттолкнуло, а… затянуло. Как в воронку. Сопротивление, вибрация в костюме. Попытка отдернуть руку вызвала ошибку симуляции пространства – меня развернуло на 180 градусов, хотя ноги на платформе оставались на месте.
Визуально чёрный квадрат начал пульсировать и увеличиваться. До метра в диаметре. Из него потянуло сквозняком – вентиляторы в шлеме заработали на максимум. Температура в костюме упала на три градуса (зафиксировано датчиками). Излучаемый звук изменился с общего гула ветра на низкочастотное гудение, похожее на басовитую ноту церковного колокола.
Принял решение наблюдать. Это же был не баг, а целый генератор непредвиденного геймплея. Ценный для отчёта материал.
К 00:15 «портал» стабилизировался. Диаметр – около двух метров. Гудение сменилось тишиной, но сквозняк усилился. И тогда из темноты выплыла первая сущность.
Описать сложно. Моделька низкополигональная, как из ранних 3D-игр. Общие очертания – гуманоид, но с явными ошибками скелетной анимации. Движения дерганные. Текстуры кожи напоминали растянутую кожуру старого картофеля. Сущность молча обошла церковь по периметру и скрылась в том же портале. AI-поведение отсутствовало, путь был заскриптован.
Дальше – больше. Сущности стали появляться чаще. Разные. Одна напоминала летучую мышь с лицом, составленным из церковных свечей. Другая – оживший веник с горящими угольками вместо глаз. Графика откровенно «сырая», но дизайн… Он был не случайным. Он был знакомым. Из книжек. Из того, что читали в детстве при свете настольной лампы, а потом боялись спать.
Осознание пришло вместе с появлением главной модели. Её загружали дольше всего – секунд десять она была облаком пикселей. Потом материализовалась. Высокая, тощая фигура в рваной ризе. Лицо закрыто длинными, движущимися как независимые сущности, волосами. Но когда она повернулась, под этой падающей графикой на миг мелькнула текстура – огромные веки, сомкнутые поверх глазниц.
И я понял, где я это видел. Не в техзадании. В книге, на уроках литературы. Это был он. Тот самый. Просто… цифровой. Незаконченный.
Он медленно пошел ко мне.
А я вспомнил пункт 4.7 инструкции по безопасности: «При возникновении нештатных ситуаций, вызывающих психологический дискомфорт, тестировщик должен немедленно прекратить сеанс голосовой командой «Стоп-тест»».
Я сказал: «Стоп-тест».
Ничего не произошло. Меню не вызвалось.
Сущность приблизилась. Из динамиков раздался звук, который система определила бы как «скрежет металла по стеклу», но я-то узнал в нём другой скрежет – скрежет железных пальцев по полу склепа.
Я прокричал: «Экстренное отключение! Система, выйди!»
Тишина. Только тот скрежет. И холод от вентиляторов, теперь уже ледяной.
Тогда я предпринял нерегламентированные действия. Побежал. Вернее, пошёл быстрым шаркающим шагом, потому что кабель от шлема и ограничения платформы не давали развить настоящую скорость. Моей тактикой стал бег по кругу вокруг груды виртуальных брёвен. Сущность следовала за мной. Не быстро, но неотвратимо. Как программа с единственной командой «следовать_за_целью».
Это длилось, по моим субъективным ощущениям, часа два. На самом деле, как показали потом логи, всего сорок минут.
Устал. Решил сменить тактику. Развернулся и ткнул пальцем в воздух перед самым «лицом» сущности. Если нельзя взаимодействовать с миром, можно попробовать взаимодействовать с интерфейсом.
Мой палец прошёл сквозь низкополигональную рясу и упёрся во что-то твёрдое. В реальный объект. В стену моей комнаты, которую я, конечно, не видел.
И тут меня осенило. Я же в костюме! «Ощущалка-3»! Она создаёт тактильную обратную связь, надуваясь и сдуваясь в нужных местах. Виртуальная сущность встала так близко, что её колени совпали в пространстве с реальной стеной. Костюм, получая сигнал «столкновение», просто надул подушечки на моих коленях, имитируя удар.
Это был глюк. Колоссальный глюк смешения реального и виртуального пространства. Страх начал медленно уступать место профессиональному интересу. Я начал пялиться на сущность уже не как жертва, а как тестировщик.
– Эй, – сказал я ей вслух. – У тебя там цикл анимации завис. Рука дёргается.
Сущность замерла.
– И текстуры на левом плече не загрузились. Белый куб висит.
Она слегка наклонила голову. Пиксели волн зашевелились иначе.
– И вообще, – добавил я, обретая уверенность, – по Гоголю у тебя лицо железное, а не… это. Картофельное. Ребят из арт-отдела надо журить.
В этот момент в левом ухе раздался треск, а потом голос Тони:
– Брушков! Ты живой? У нас тут всё зависло, сервер плавится! Держись, пытаемся выдернуть тебя принудительно!
Судя по всему, «принудительно» означало отключение всего на свете. Мир перед глазами запрыгал кадрами, потом рассыпался на разноцветные кубики, и наступила чёрная тишина вкупе с очень реальной болью в пояснице от того, что я четыре часа простоял на платформе.
Объяснения за пирожки
– И что, он тебе ответил? – спросила жена Катя, пока я на кухне заливал пережитый ужас горячим чаем и доедал пирожок с капустой, отложенный с ужина.
– Нет, не ответил, – откусил я. – Он завис. Буквально. Как программа. Потом всё мигало, пищало, и меня выкинуло в главное меню.
– А пирожок зачем туда понёс? – она кивнула на экран ноутбука, где был открыт мой черновик отчёта.
Я покраснел. Об этом я в отчёте, конечно, не написал.
– Это уже после. Когда меня выдернули, Тони орал, что я чуть не спалил дорогущее оборудование. Что я, цитирую, «устроил цирк с потрохами в релизной версии». А я… я не мог отвязаться от мысли.
– От какой?
– Что я его бросил. Там. В той церкви. Не Гоголевского, конечно, а этого… цифрового, низкополигонального. Он же выполнял свою скриптовую задачу. Идти на цель. А цель – я – взяла и испарилась. Багованный он, незаконченный, но… задачу-то не выполнил.
Катя смотрела на меня так, как смотрят на человека, который переработал.
– И что? Ты решил его… пожалеть?
– Решил извиниться, – пробормотал я. – И показать, что в реальном мире есть что-то хорошее. Например, пирожки твои.
После того как все ушли и в офисе осталась только уборщица, я снова надел шлем. Запустил симуляцию той же церкви, но уже в безопасном демо-режиме, без костюма. Всё было чисто. Никаких чёрных квадратов. Тишина, лунный свет, скрип половиц. Как будто ничего и не было.
Я загрузил в память шлема сканирование пирожка (у нас есть такой софт для тестирования объектов еды – выглядит ужасно, но физику падения булки передаёт точно). И оставил этот цифровой, серый, низкополигональный пирожок прямо в центре церкви, на том месте, где исчез.
– На, – сказал я в пустоту. – Прости, что сломал твой сценарий. И про текстуры картофельные тоже извини. У арт-отдела дедлайн был.
Закончил чай. Катя забрала тарелку.
– И что в итоге? Наказали?
– Нет, – честно ответил я. – Премию, наоборот, дали. Нашёл критический баг смешения реального и виртуального пространства. Тони теперь ходит и хвалится, что у него тестировщик с «нестандартным стрессовым мышлением». Баг, конечно, исправили. Портал закрыли.
– А пирожок? – спросила она.
– А пирожок, – я вздохнул, – остался там. В памяти симуляции. Как неучтённый объект. Я проверял. Лежит себе на полу в церкви версии 0.9.8. Которую, как мне сказали, никогда не выпустят. Так и будет лежать вечно. Ну, или пока сервер не выключат.
Катя покачала головой, но в уголках губ заплясали смешинки.
– Представляю. Придёт какой-нибудь новый тестировщик, найдёт твой пирожок. Испугается. Решит, что это такой древний артефакт, ритуальная подношение.
– Ага, – хмыкнул я. – И положит рядом виртуальную сельдёшку. Или стакан цифровой водки. И пойдёт традиция.
Мы помолчали.
– Знаешь, – сказала Катя. – Иногда твоя работа напоминает не будущее, а самое что ни на есть тёмное прошлое. Только привидения у вас из пикселей.
– Зато какие! – оживился я. – С ошибками текстурирования!
Она засмеялась. А я подумал, что, наверное, в каждой работе есть своя мистика. Даже в самой цифровой. И свой долг – даже перед низкополигональным призраком. Главное – не бояться, а попробовать понять механику. И всегда иметь под рукой что-нибудь съестное. На всякий духовный случай.
В конце концов, аппетит приходит не только во время еды, но и во время крайне нестандартных рабочих ситуаций.
📱 В Telegram у меня отдельная коллекция коротких историй - те самые байки, которые читают перед сном или в обеденный перерыв.
Публикую 3 раза в неделю (пн/ср/сб в 10:00) + сразу после подписки вы получите FB2 и PDF-сборник из 100 лучших рассказов.
Перейти в Telegram.