Замок лаборантской щёлкнул глухо.
Я привалилась спиной к двери, отсекая гул коридора, и выдохнула. Здесь пахло техническим спиртом, старой резиной и пылью на бежевом кафеле. Ряды пустых столов с черными кранами тянулись до самого окна. Снаружи шел дождь.
Кайто влетел следом за секунду до того, как я повернула защелку. Его трясло. Он опёрся ладонями о край ближайшей раковины, опустив голову, и часто, поверхностно дышал. Челка прилипла ко мокрому лбу.
— Там... внизу, - он сглотнул, голос срывался на хрип. - Я видел из окна лестницы. Скорая. И две машины без мигалок, с тонировкой. Они увезли Рёту.
Я промолчала. Подошла к дальнему столу, достала смартфон и положила его на холодную плитку.
— Они не ищут взломщика, Рика, - Кайто резко обернулся. Зрачки расширены, дыхание сбито - типичная острая реакция на стресс, еще минута, и он начнет совершать ошибки. - Они просто зачищают следы! Если это правительственный тест, почему нас не изолировали? Почему учителя ведут уроки дальше, будто ничего не происходит?!
— Потому что учителей в выборке нет, - отрезала я.
Экран моего телефона мигнул.
Никаких звуков. Просто серая плашка поверх черного фона. Кайто дернулся и выхватил свой телефон из кармана пиджака, едва не выронив его на пол.
\[Синхронизация завершена. Доступ к реестру открыт\]
\[Ваш профиль: Узел № 88 (Ж, 17 лет)\]
\[Сектор: Токио\]
\[Активные узлы: 77 / 100\]
В лаборантской стало тихо. Слышно было только, как из плохо закрученного крана капает вода в металлическую раковину.
Раз. Два. Три.
— Семьдесят семь... - одними губами повторил Кайто. Он сполз по краю стола и сел прямо на грязный пол, вытянув ноги. - Из ста. Подожди. В нашей параллели сто двадцать человек. В школе восемьсот.
— Там написано "Сектор: Токио", - я ткнула пальцем в нижнюю вкладку, открывая лог списаний. - Сотня - это не школа, Кайто. Это весь город.
Он уставился на меня снизу вверх. Информация наконец обработалась.
По экрану поползли строчки системного отчета. Без имен. Только номера, возрастные метки и причина закрытия счета.
№ 14 (М, 16 лет) - попытка удаления корневого файла. Баланс: 0. Статус: Аннулирован.
№ 42 (М, 54 года) - передача данных третьим лицам. Баланс: 0. Статус: Аннулирован.
№ 09 (Ж, 29 лет) - выход за пределы зоны без оплаты пошлины. Баланс: 0. Статус: Аннулирован.
№ 91 (М, 68 лет) - баланс: 14 200. Статус: Активен.
Минус двадцать три участника за сорок минут.
Пока мы сидели на математике, пока Рёта корчился на полу от спазма за сто очков, двадцать три человека уже протестировали границы правил. Мужчина пятидесяти четырех лет наверняка обратился в полицию или к связям в министерстве. Девушка двадцати девяти лет просто ехала в транспорте и пересекла границу сектора.
Выборка случайная или квотированная по возрасту и статусу. Школьники, пенсионеры, госслужащие, возможно, сами полицейские - условия базово равны для всех.
Взгляд зацепился за строчку под номером 91. Шестьдесят восемь лет. Баланс вырос на четыре тысячи двести очков от стартового капитала. Кто-то уже разобрался в механике транзакций и начал собирать ресурс.
— Двадцать три трупа, - голос Кайто прозвучал совсем глухо. Он обхватил голову руками, сжав пальцы в волосах. - Господи, я же чуть не убил Рёту. Я нажал почти не глядя... Если бы там стояла цена в десять тысяч... Рика, что нам делать? Ты знаешь, да? Ты ведешь себя так, будто уже видела такое!
Он подполз ближе и ухватился за край моей форменной юбки. Пальцы холодные, мелкий тремор. Утреннее высокомерие отключилось, остался базовый инстинкт выживания и рефлекс утопающего - цепляться за того, кто сохраняет функциональность.
Я посмотрела на его побелевшие костяшки, затем перевела взгляд обратно на дисплей. Цифра "77" мигнула и сменилась на "76".
— Во-первых, отпусти ткань, - ровно сказала я. - Во-вторых, поднимись с пола. Нам нужно отследить транзакцию твоих ста очков. Система не сжигает баллы просто так, у них должен быть получатель.
Кайто разжал пальцы не сразу. Потребовалось еще три секунды, чтобы до его моторной коры дошел мой приказ. Он тяжело опёрся о ножку лабораторного стола, поднялся и вытер ладони о брюки. Дыхание все еще сбитое, частота пульса на сонной артерии визуально выше ста десяти ударов в минуту, но взгляд уже начал фокусироваться.
— Разблокируй экран и положи на стол, - сказала я, отодвигая в сторону штатив с пустыми пробирками.
Он послушно положил свой смартфон рядом с моим. Два идентичных черных прямоугольника на сером кафеле. У меня, Узла № 88, на счету - 10 000. У него - 9 900.
Я открыла историю операций на его устройстве. Вкладка разворачивалась без анимации, сухим каскадом текстовых строк.
[Исходящая транзакция: 100 ед.]
[Тип операции: Физическое воздействие / Уровень 1 (Мышечный спазм)]
[Цель: Узел № 64 (М, 16 лет)]
[Распределение средств: 50 ед. -> Ликвидационный пул Сектора. 50 ед. -> Дивиденды верхней децили]
Я перечитала последнюю строчку дважды. Все встало на свои места.
— Что это значит? - Кайто навис над столом, вчитываясь в мелкий шрифт. - Какая еще верхняя дециль?
— Десять процентов игроков с самым высоким балансом, - я переключила вкладку обратно на общий реестр и отфильтровала список по убыванию капитала. - Смотри сюда. Когда ты тратишь очки на атаку или штраф, система забирает половину себе в резерв. А вторую половину делит между лидерами рейтинга.
На экране высветилась первая десятка. На первом месте - тот самый Узел № 91, мужчина шестидесяти восьми лет. Его баланс уже составлял 14 205 очков. Пять баллов капнули ему буквально минуту назад, когда общий счетчик живых участников сократился с семидесяти семи до семидесяти шести.
— То есть... - Кайто медленно провел ладонью по лицу. - Чем больше у тебя очков, тем больше ты получаешь просто за то, что остальные паникуют, нарушают правила или жмут на кнопки?
— Обычная капиталистическая модель с прогрессивным перераспределением вверх, - я постучала ногтем по стеклу его экрана. - Богатые богатеют за счет ошибок бедных. Этот старик под номером девяносто один не бегает по улицам и никого не убивает вручную. Он просто понял правило: нужно как можно быстрее вырваться в топ-десять по балансу, а дальше система сама начнет кормить тебя процентами со всех штрафов и атак по всему Токио.
— Но откуда он взял первые четыре тысячи за сорок минут?! - в голосе Кайто снова прорезалась истерическая нота. - Со старта всем дали по десять тысяч! Как он поднял сорок процентов капитала, если за атаку списывают сотку?!
Я открыла вкладку "Доступные операции" на своем телефоне и пролистала вниз, мимо мелких пакостей вроде спазмов, временной слепоты и блокировки слуха. В самом низу списка, под серой плашкой, находился раздел, на который Кайто в панике даже не обратил внимания.
[Принудительное поглощение актива]
[Условие: Прямой визуальный контакт / Дистанция менее 5 метров / Определение точного ID цели]
[Стоимость запроса: 1 000 ед. В случае ошибки идентификации - штраф 5 000 ед.]
Я развернула телефон к нему.
— Вот как, - коротко объяснила я. - Если ты знаешь номер конкретного игрока и находишься рядом с ним, ты можешь подать запрос на выкуп его счёта. Если у жертвы на балансе меньше очков, чем у тебя, система списывает ее остаток в твою пользу. Полностью.
Кайто отшатнулся от стола, будто от экрана пахнуло кислотой. Его спина ударилась о дверцу вытяжного шкафа, зазвенело стекло внутри.
— Полностью?! - переспросил он. - Но если баланс падает в ноль... человек аннулируется. Это же... это прямое убийство за очки!
— Это поглощение неликвидного актива, если говорить языком тех, кто написал этот код, - поправила я. - Девяносто первый нашел кого-то рядом с собой. Кого-то, кто уже успел потратить часть стартовых баллов на ерунду или штрафы. Например, такого, как ты сейчас.
Кайто замер. Его взгляд метнулся к моему смартфону, где горела цифра 10 000, потом к своему - с числом 9 900.
В его голове наконец сложилось простое арифметическое уравнение. Мой баланс выше его на сто очков. Мы находимся в закрытой комнате, дистанция между нами - полтора метра. И я точно знаю, что он игрок, мне осталось только посмотреть в верхний угол его экрана, чтобы увидеть его ID.
Он сделал шаг назад, к раковинам. Рука рефлексивно дернулась к карману, но телефон все еще лежал на столе передо мной.
— Рика... - он попытался изобразить улыбку, но вышло криво: мышцы лица не слушались. - Ты же не... Мы же в одной лодке, да? Я просто случайно нажал в классе, ты сама видела!
— Успокойся, - я даже не стала двигаться в его сторону, чтобы не провоцировать выброс адреналина. - Поглощать твой счет сейчас нерентабельно. Запрос стоит тысячу очков, а чистая прибыль с учетом комиссии системы не перекроет рисков. К тому же, мертвый ты мне бесполезен, а живой можешь пригодиться как прокси-узел для проверки механик.
Это была чистая правда. Использовать собственный баланс для тестирования правил глупо, когда рядом есть управляемый ресурс с дефицитом воли.
Кайто шумно выдохнул, но к столу не вернулся. Остался стоять у раковины, держа дистанцию в три метра. Хорошо. Страх делает людей предсказуемыми и дисциплинированными, главное - дозировать его так, чтобы объект не впал в ступор.
— Значит, Рёта... узел шестьдесят четыре, - Кайто сглотнул, глядя на свой телефон издали. - Почему его увезли на скорой, если списали только мои сто очков за спазм? У него же оставалось еще десять тысяч на балансе, он не должен был обнулиться.
Правильный вопрос. Я как раз сопоставляла данные в реестре.
Строчка Узла № 64 (М, 16 лет) горела в списке серым цветом. Не красным, как у двадцати четырех аннулированных, а тускло-серым.
№ 64 (М, 16 лет) - нарушение протокола конфиденциальности (публичная демонстрация симптомов). Штраф: 10 000 ед. Баланс: 0. Статус: Аннулирован в процессе транспортировки.
Я молча ткнула пальцем в экран. Кайто подошел на полшага, вытянул шею и прочитал.
Лицо его стало цвета школьного мела.
— Публичная демонстрация... - прошептал он. - То есть, когда он упал с парты и начал кричать в классе... система посчитала это разглашением тайны? И списала с него весь стартовый баланс подчистую?!
— Ты вызвал у него спазм посреди урока, - сухо констатировала я. - Он привлек внимание тридцати человек, не включенных в систему. Алгоритм расценил это как угрозу компрометации сети и обнулил его счет в качестве штрафа за шум. А машины без номеров у школы - это просто клининг. Убирают вышедший из строя биоматериал, чтобы не поднимать панику в новостях.
Кайто зажал рот ладонью и резко отвернулся к раковине. Его вывернуло прямо в сухую стальную чашу - пустыми спазмами, потому что с утра он ничего не ел. Он висел над краном, вздрагивая всем корпусом, и глухо кашлял.
Технически, Рёту убил именно он. Не напрямую, а через каскадную реакцию правил, которых не знал. Сто очков за спазм запустили цепочку, стоившую тому жизни.
Я открыла кран над его головой. Холодная вода ударила по металлу, смывая следы налета.
— Умойся, - сказала я, глядя на часы на стене лаборантской. - До конца перемены четыре минуты. Если мы пропустим следующий урок или начнем вести себя неадекватно при свидетелях, система может счесть это отклонением от базового поведения и выписать штраф нам обоим.
Кайто судорожно плеснул водой в лицо, не поднимая головы.
И в этот момент оба телефона на столе одновременно издали короткий, сухой щелчок.
Я опустила взгляд на дисплей. Поверх реестра всплыло новое системное окно с обратным отсчетом.
[Зафиксировано сближение активных узлов: 2 ед. в радиусе 10 метров]
[Время совместного нахождения: 10 минут 00 секунд]
[Внимание: Активирован тариф "Анти-коалиция". Через 60 секунд начнется прогрессивное списание средств с обоих счетов: 100 ед. / минута]
Цифры таймера побежали вниз: 59... 58... 57...
Красивое решение со стороны разработчиков. Если бы игроки могли просто собраться в одной комнате, сложить телефоны в сейф и переждать игру в безопасности, биржа бы встала. Система принудительно разгоняла участников по разным углам, заставляя их двигаться, сталкиваться вслепую и конкурировать в одиночку. Любой союз здесь имел прямую почасовую стоимость.
— Кайто, - позвала я, забирая свой смартфон со стола. - Забирай телефон и на выход. Нам нельзя находиться рядом больше десяти минут, иначе начнут жечь баланс. Встретимся после уроков на...
Я не договорила.
Нижняя строчка системного уведомления внезапно обновилась. Таймер продолжал тикать, но цифра активных устройств в зоне действия изменилась сама собой.
[Зафиксировано сближение активных узлов: 3 ед. в радиусе 10 метров]
[Тариф списания увеличен втрое: 300 ед. / минута]
Я медленно подняла голову и посмотрела на матовое стекло двери лаборантской.
Десять метров. В радиус попадал только наш кабинет и кусок пустого тупикового коридора за дверью, ведущий к запасному выходу на пожарную лестницу. Учителя и обычные школьники там не ходят. Рёту увезли десять минут назад.
Значит, прямо сейчас по ту сторону двери стоял третий.
И судя по тому, что металлическая ручка замка начала плавно, без единого скрипа опускаться вниз - он стоял там достаточно долго, чтобы услышать каждое наше слово.