Техномант: Радонежье | Книга первая
Введение
Техномант. Книга первая. Радонежье
Попаданец-программист Никита переносится в магический мир, который работает как база данных с багами. Чтобы выжить и спасти деревню от роя стрыг, ему придётся взламывать реальность через консоль, использовать здоровье вместо маны и привыкать к тому, что даже рассвет иногда зависает.
---
Глава 1. Исключение из реальности
Никита ненавидел свою работу. Три года сидеть в подвальном помещении без окон, где вместо вентиляции — вечный запах озона и чужого пота. Сетевая помойка, легаси-код, начальник, который считал, что «дебажить — это для слабаков». Никите было тридцать пять. Ни жены, ни кота, ни нормальной зарплаты. Только стопка энергетиков да старая футболка с надписью «It’s not a bug, it’s a feature».
В тот вечер он менял блок питания на сервере. Простая процедура, сотый раз. Но китайский БП решил сдохнуть красиво — с искрами, с дымом, с мерзким запахом жженой пластмассы.
— Твою ж... — выдохнул Никита.
Мир моргнул.
Без загрузки, без переходов — просто щёлк — и тишина.
---
Он открыл глаза.
Над ним — небо. Настоящее, живое, с крупными звёздами, которые явно не видели смога. Под спиной — колючая трава, пахнущая мятой и тимьяном. Где-то слева чавкало болото.
Никита сел. Резко, слишком резко. Голова закружилась.
Рядом не было ни серверной стойки, ни проводов, ни кружки с остывшим кофе. Только рюкзак из грубой кожи и потрепанная мантия, какие показывают в исторических сериалах.
— Я сплю, — сказал он вслух. — Это стресс. Или угарный газ.
Но по лицу щипал ветер. Холодный, настоящий. Никита опустил взгляд и увидел на левом запястье тяжелый серебряный браслет. В тускло мерцающем камне прыгала надпись:
[ОШИБКА: МИШЕНЬ НЕ ИНИЦИАЛИЗИРОВАН]
Он уставился на текст. Секунду. Другую. А потом внутри, где-то глубоко, вместо паники щёлкнуло что-то знакомое. Привычка системного администратора: видеть ошибку — искать причину.
— Мишень... не инициализирована, — повторил Никита медленно. — Значит, где-то есть инициализация.
Он коснулся камня.
Перед глазами развернулась полупрозрачная таблица:
Системное сообщение
Класс «Инженер (техномант)» не зарегистрирован.
Автоматически присвоен класс: «Бродяга (ур.1)»
Здоровье: 80/80
Мана: 0/0
Особые способности: «Взгляд в код» — не активно.
— Ну привет, Матрица, — тихо сказал Никита и невесело усмехнулся. — В жизни мечтал о нормальном софте, а попал в RPG с открытым исходным кодом.
Он встал. Трава хрустела под ногами. Болотная ряска мерно покачивалась. А вдалеке, шагах в тридцати, из тумана выступила фигура. Человек? Нет. Кости. Человеческий скелет, с ржавым мечом в руке и красными огоньками в пустых глазницах.
Никита замер.
На периферии зрения, поверх картинки, проявились зеленые строки:
<CREATURE TYPE="undead">SKELETON_WARRIOR lvl.5</CREATURE>
Состояние: активен. Цель: ближайший живой объект — ВЫ.
Скелет развернулся. Меч поднялся.
— Чёрт, — выдохнул Никита. — Чёрт-чёрт-чёрт.
Он судорожно нажал на браслете что-то — наугад, как на кнопку «пуск» в панике. Ноль маны. Ноль заклинаний. Но пальцы сами сделали знакомое движение: удерживать, отпустить, два коротких тапа. Рефлекс сисадмина — вызывать консоль.
Браслет пискнул.
[ОШИБКА: НЕТ МАНЫ]
[ПОПЫТКА ВЗЛОМА: использование HP вместо MP]
Здоровье: -15 → 65/80
В груди кольнуло, как от удара током. Но перед Никитой, в воздухе, повисла командная строка. Мигающий зелёный курсор.
Скелет занёс меч. До него оставалось пять метров. Три. Два.
Никита не умел колдовать. Но он умел печатать.
Он выбил в консоли:
creature.setTarget(null)
Мысленно нажал «Enter».
Мир замер на миг.
Скелет остановился. Красные огоньки в глазах мигнули, потухли, зажглись снова — тускло-серыми. Меч опустился. Мертвец развернулся и побрёл обратно в туман, медленно, как старая игрушка с севшим аккумулятором.
Никита выдохнул так, что заложило уши. Пошатнулся. Опустился на колени прямо в траву.
— Я только что... переназначил цель у NPC... — проговорил он сипло. — Это просто база данных. Живая, дышащая, но — база.
Он посмотрел на небо. Там, среди звёзд, пронеслась длинная зелёная строка:
[СИСТЕМНОЕ УВЕДОМЛЕНИЕ: ОБНАРУЖЕНО НЕСАНКЦИОНИРОВАННОЕ ИЗМЕНЕНИЕ ОБЪЕКТОВ. ЗАПРОС АДМИНИСТРАТОРУ.]
— И сейчас меня забанит главный админ, — тихо сказал Никита. — Отлично. Просто отлично.
Он встал, отряхнул мантию и посмотрел на горизонт. Болото чавкало. Ветер шевелил редкие кусты. А где-то там, впереди, наверное, был город. Или локация. Или просто строка кода, ожидающая своего взломщика.
— Ладно, — Никита поправил рюкзак. — Посмотрим, как ты тут устроена, мультивселенная. Уж что-что, а баги я искать умею.
---
Глава 2. Первый патч
Никита шёл уже около часа.
Болото осталось позади, сменившись редколесьем с кривыми берёзами и землёй, которая почему-то хрустела под ногами как свежий снег. Тишина. Ни птиц, ни ветра — только собственное дыхание и редкие капли влаги с листьев.
— Нормальный такой open world, — пробормотал Никита, перешагивая через гнилой пень. — А где звуковой дизайн? Где саундтрек?
Он уже привык к браслету, который всё так же тускло мерцал на запястье. Каждые несколько минут Никита машинально касался камня, вызывая интерфейс. Здоровье медленно восстанавливалось: 72, 74, 76... Мана — по-прежнему ноль.
«Взгляд в код» так и не активировался.
— Видимо, нужен уровень или особые условия, — рассуждал он вслух. — Как скилл в любой ММО. Прокачайся, открой ветку...
Из кустов справа донёсся треск.
Никита мгновенно замер, рука сама потянулась к браслету. Треск повторился. А потом из зарослей вывалился... мальчишка. Лет тринадцати, лохматый, в грязной рубахе и с огромной корзиной грибов за спиной. Увидел Никиту — и заорал таким голосом, будто увидел дракона.
— НЕ УБИВАЙТЕ! Я НИЧЕГО НЕ БРАЛ!
— Тихо-тихо-тихо! — Никита выставил ладони вперёд. — Я не убиваю. Я вообще... по ошибке здесь.
Пацан замер, часто моргая. Глаза — огромные, испуганные, но уже с любопытством.
— По... ошибке? — переспросил он. — А вы не из местных?
— Я из Москвы. Ну, если это тебе о чём-то говорит.
Мальчишка сделал шаг назад, наклонил голову. Помолчал. Потом выдохнул:
— А, пришлый. Ну и напугали же вы, господин хороший. А я думал — упырь болотный.
— Приятно познакомиться, — Никита криво усмехнулся. — Я Никита. А упырем меня ещё никто не называл.
— Я Димка, — пацан уже совсем осмелел. — Да вы не похожи на упыря. У них кожа гнилая и глаза светятся. А у вас... вы просто бледный.
— Спасибо, тёплый комплимент.
Димка огляделся по сторонам, прищурился:
— А вы откуда именно пришли? Через болото? Там же скелеты водятся.
— Водятся. Я одного встретил. — Никита машинально потрогал запястье — здоровье 80, всё ок. — Но он передумал меня убивать.
Пацан уставился на него с новым, почти благоговейным уважением.
— Вы, наверное, маг? Я слыхал, маги могут злых духов отвадить.
Никита замялся. Сказать правду? «Я программист из другого мира и взломал скелет через консоль»? Звучит безумно даже для фэнтези. Он решил придерживаться полуправды:
— Что-то вроде того. Слушай, Димка, а где тут ближайшее жильё? Деревня, город, трактир — что угодно.
— Так Радонежье же рядом, — мальчишка махнул рукой куда-то влево. — Вёрст пять, не больше. Я сам оттуда за грибами ходил. Только... — он замялся, потупился. — Там сейчас неспокойно. Староста велел пришлых не пущать. А вы пришлый.
— А я хороший пришлый, — убедительно сказал Никита. — Я даже заплачу.
Он полез в рюкзак. Внутри оказалось странное ассорти — кусок хлеба, фляга с водой, несколько медных монет с непонятными символами и свёрток с солью. Откуда всё это взялось? Вопросы к системе. Но монеты — это уже деньги.
— Вот, — Никита протянул Димке одну. — Отведи меня к старосте, скажешь, что я мирный путник. А это твоё.
Мальчишка взял монету, повертел, укусил. Кивнул:
— Медяк. Можно. Пошли, господин Никита. Только смотрите — если староста за топор схватится, я не виноватый.
Они двинулись через редколесье. Димка болтал без умолку — про урожай грибов, про соседскую девку Глашу, про то, что в лесу по ночам кто-то воет, уже третью седмицу. Никита слушал вполуха, но одну фразу уловил:
— ...и ещё в Ростове ярмарка открылась, а туда теперь не проехать. Мост через Вёдру сломали.
— Кто сломал?
— Да кто ж его знает. Люди говорят — медведь, а я не верю. Медведь мост не перерубит. Там балки толщиной в руку.
Никита нахмурился. Детали, которые сразу цепляли: сломанный мост, вой по ночам, деревня, боящаяся пришлых. Звучало как начало побочного квеста. Но у него была другая цель — разобраться, как здесь всё устроено, и найти того самого «администратора», который получил его запрос на взлом.
— Дим, а кроме этой вашей Радонежья, есть здесь город побольше?
— Княжий стан, — мальчишка аж оживился. — Там и стражники, и церковь, и торг, и маги даже бывают. Но далеко — полдня пешком, если без обоза.
— Вот туда мне и нужно.
Димка удивлённо взглянул:
— А вы же сказали — к старосте.
— К старосте — чтобы переночевать и понять местные порядки. А дальше — в княжий стан.
Они вышли на опушку. Внизу, в ложбине, дымились крыши. Избы, амбары, длинный частокол с воротами. Радонежье выглядело как типичная средневековая деревня — только вместо телег у ворот стояла... повозка с огромным колёсным кругом, на котором были вырезаны руны. И круг медленно вращался сам по себе.
Никита замер.
— Это что?
— Ветрозащита, — буднично сказал Димка. — От стрыгей и ночниц. А вы разве в своём мире такого не видели?
— У нас, — медленно сказал Никита, глядя на вращающийся рунический круг, — такое показывают только в кино.
Он коснулся браслета. Через мгновение перед глазами появилась зелёная строка:
<OBJECT TYPE="ward">WINDWARD_PROTECTION lvl.3</OBJECT>
Скрипт: runes.rotate(360) [IDLE]
Никита прочитал. Перечитал. И широко, почти безумно улыбнулся.
— Там, в княжьем стане, — сказал он, — есть библиотека?
— А как же, — кивнул Димка. — Князь велел при монастыре собрать книги. Для грамотных.
— Отлично. — Никита сделал шаг в сторону деревни, чувствуя, как внутри разгорается настоящее, почти забытое любопытство. — Потому что мне нужно найти учебник по местному API.
— По чему?
— Неважно. Пошли, Димка. Познакомишь меня со своим старостой. И будем надеяться, что хвататься за топор он будет не сразу.
Они спустились с холма. Солнце клонилось к закату, и тени от изб вытягивались длинными, чёрными полосами. В воздухе запахло дымом и пареной репой. А где-то совсем рядом, в темноте за частоколом, снова раздался протяжный вой.
Никита ускорил шаг.
---
Глава 3. Баг в системе безопасности
— Стоять! — донеслось сверху.
Никита поднял голову. С частокола на него смотрели двое мужиков с рогатинами. Один — рыжий и бородатый, второй — лысый, с огромным шрамом через всю щеку. Оба хмурые, как грозовые тучи.
— Я мирный путник! — крикнул Никита, подняв руки. — Со мной Димка!
— Димка, брысь домой! — рявкнул лысый.
Мальчишка сорвался с места и нырнул в калитку, даже не попрощавшись. Предатель.
— А ты, путник, — рыжий ткнул рогатиной в сторону Никиты, — назови пароль.
— Пароль? — Никита опешил. — Какой пароль?
— А ты откуда пришёл?
— Из Москвы.
Мужики переглянулись.
— Не знаю такой деревни, — сказал лысый. — Это за болотом?
— Дальше. Очень дальше.
— Пароль, говорю, называй. Староста велел: кто не знает пароля — того не пущать.
Никита задумался. Сказать правду «я из другого мира, я тут случайно» — посадят на рогатину. Придумать что-то? Он выпалил первое, что пришло в голову:
— «Форт Боярд».
Мужики снова переглянулись.
— Не подходит, — покачал головой рыжий.
— «Админ пароль 1234»?
— Что-то ты, путник, странные слова говоришь. — Лысый сплюнул вниз. — Колдун, что ль?
— Да какой колдун, — вздохнул Никита, — я программист. Ну, техномант. В общем, пустите, а? Я переночевать, заплачу.
Он выудил из рюкзака медную монету и помахал ей. Рыжий заколебался. Но тут из-за ворот вышел сутулый старик с длинной седой бородой — в тулупе нараспашку и с клюкой в руке. Староста, без сомнения.
— Чего шумите, орлы? — спросил он сипло.
— Пришлый, батя, — доложил лысый. — Пароля не знает, но монету сулит.
Староста окинул Никиту цепким взглядом. Тот выпрямился и постарался выглядеть максимально безобидно.
— С каких краёв, молодец? — спросил старик.
— Из Москвы, — повторил Никита. — Из очень далёкой Москвы. Через болото шёл, скелета встретил, еле ноги унёс.
— Скелета, говоришь? И живой остался?
— Я его... ну... отключил.
Староста прищурился:
— Отключил?
— Переназначил целевую функцию. Ну, в общем, теперь он там без цели бродит, сам не свой.
Пауза. Староста вздохнул и махнул рукой.
— Ладно, проходи. Но без фокусов. У нас тут люди простые, колдовства не любят.
— У меня и нет колдовства, — честно сказал Никита. — У меня администрирование.
Староста крякнул и побрёл внутрь, не оборачиваясь. Никита поспешил за ним.
---
Деревня оказалась даже уютнее, чем казалась сверху. Дома — рубленые, с резными наличниками. Бабы в платках таскают вёдра с водой. Куры роются в пыли. Пахнет хлебом, навозом и мятой.
— Вот тут и переночуешь, — староста ткнул клюкой в покосившуюся баньку на отшибе. — Там чисто, сеновал есть. А утром — проваливай.
— Можно один вопрос? — Никита остановился. — Чего вы так пришлых боитесь? И почему мост сломали?
Староста помрачнел, потеребил бороду.
— Слышал уже, значит. Мост не мы ломали. Его кто-то ночью... того. Перерубил. Как ножом. И воют по ночам. Сначала за околицей, потом всё ближе. А третьего дня у Гришки корову утащили. Прямо со двора.
— Кто утащил?
— Кто ж его знает. Следы — будто человек, но огромный. И пахнет падалью.
Никита поёжился. Вспомнил вой за частоколом.
— А защита ваша руническая? — он кивнул на вращающийся круг у ворот.
— Оборотни не любят её, — кивнул староста. — А это... может, и не оборотень вовсе. Стрыги, говорят, по ночам шалят. Но стрыга мост не перерубит, у неё когти слабые.
— Я понял. — Никита вздохнул. — Ладно, спасибо за ночлег.
Староста ушёл, бормоча под нос что-то про «нахлебников» и «времена нынче не те». Никита залез на сеновал, расстелил мантию, достал хлеб и флягу. Жевать хотелось зверски.
— Типичный RPG, — пробормотал он с набитым ртом. — Первая деревня, первый квест со сломанным мостом и ночными воями. Осталось найти закопанный сундук и убить трёх крыс в подвале.
Он уже почти задремал, когда снаружи раздался протяжный, леденящий душу вой. Совсем близко. Никита подскочил, ударился головой о балку, выругался. Выглянул в щель.
Луна только поднималась, но в лунном свете он успел заметить тень. Огромную, горбатую, бегущую на четырёх лапах — но с человеческими очертаниями. Она остановилась у частокола, принюхалась, и вдруг рванула прямо на ворота.
— Ну здравствуй, — прошептал Никита, хватаясь за браслет. — А говорили, война не начнётся.
Тварь прыгнула. Над воротами вспыхнули руны — защита сработала, отбросив её назад с искрами. Зверь взвыл, но не ушёл. Начал огибать частокол, царапая бревна.
Внизу послышались крики, застучали топоры, кто-то заорал: «СТРЫГА! СТРЫГА У ВОРОТ!»
Никита выскочил из баньки. Перед ним раскинулась деревенская улица, по которой бежали мужики с вилами. У ворот уже собралась толпа. Но тварь была быстрее — она нашла слабое место, старый плетень, перемахнула через него и оказалась внутри.
— ЧТО ЗА... — заорал рыжий стражник, и тут же с криком отлетел в сторону — огромная лапища снесла его с ног.
Никита увидел её вблизи. Существо размером с медведя, но с длинной, почти человеческой мордой, покрытой серой шерстью. Глаза — красные, бешеные. Из пасти свисают слюни.
— Консоль, — выдохнул он, ударив по браслету свою последовательность.
Замигала зелёная строка. Здоровье: 80/80. Мана: 0/0. Способность «Взгляд в код» — всё ещё не активна.
Тварь развернулась к нему. Рыкнула так, что у Никиты заложило уши. Сзади кто-то из крестьян заверещал: «Сожрут господина!»
— Ах ты ж баг неотлаженный, — процедил Никита, лихорадочно соображая. — Цели нет, маны нет... значит, только здоровьем.
Он набрал в консоли:
creature.type = "passive"
Enter.
Браслет пискнул. Система выдала:
[ОШИБКА: НЕДОСТАТОЧНО ПРАВ ДЛЯ ИЗМЕНЕНИЯ ТИПА КЛАССА "BOSS"]
Здоровье: -20 → 60/80
Никита охнул, пошатнулся. Тварь прыгнула. Он едва успел откатиться в сторону, почувствовав, как когти прошли в сантиметре от спины, разорвав мантию. В глазах потемнело.
— Дурацкое неподдающееся legacy-дерьмо, — прохрипел он, поднимаясь на колени. В голову ударила дикая идея.
Он быстро набрал:
creature.setHealth(1)
Нажал Enter. Грудную клетку обожгло — здоровье упало до 40/80. Но перед глазами выскочило:
[ЗАПРОС ПРИНЯТ]
BOSS_STRYGA_HEALTH = 1
Тварь замерла на мгновение. Её бока перестали вздыматься. Шерсть посерела, глаза потускнели. Она сделала шаг, пошатнулась и рухнула наземь, едва дыша.
— ...Чё? — выдохнул кто-то из крестьян.
Никита встал, шатаясь, и подошёл к монстру. Местные мужики смотрели на него с открытыми ртами. Староста перекрестился.
— Не убивай её, — тихо сказал Никита, обращаясь к старосте. — Она больше не опасна. Я ей здоровье на единицу снёс. Это как... ну, временное оглушение.
— Ты, никак, маг? — благоговейно спросил рыжий стражник, потирая ушибленный бок.
— Техномант, — поправил Никита устало. — Разница есть, но вам не понять.
Он повернулся к старосте и улыбнулся самой обаятельной улыбкой, на которую был способен (с капающей из носа кровью и порванной мантией):
— Так о чём я? Ах да. Насчёт переночевать... вы не против, если я задержусь на пару дней? Кажется, у вас тут проблема с неотлаженной системой безопасности. А я, знаете ли, неплохо правлю баги.
Староста молчал долгую секунду. Потом кивнул и сказал лишь одно слово:
— Меду принести?
Никита хрюкнул от неожиданного смеха.
— Принесите. И ещё, если есть... — он замялся, — у вас тут случайно нет чего-то вроде... записной книжки и пера? Мне нужно задокументировать эксплойт.
— Чего?
— Записную книжку, говорю, дай. И свечку. Я тут один интересный глитч нашёл.
Староста крякнул, махнул рукой и ушёл в избу. А Никита опустился прямо на траву, глядя на неподвижное тело стрыги. Браслет на руке тускло мерцал — здоровье медленно восстанавливалось: 42, 44, 45...
— День первый, — сказал он сам себе. — Скелет отключил, мини-босса посадил на единицу хп. Неплохо для бродяги нулевого уровня.
Вдалеке снова завыли — но теперь уже далеко. И Никита вдруг понял, что это воет не одна тварь. Их было много. И они шли к деревне.
— Отлично, — вздохнул он. — Патч вышел с багами. Как всегда.
---
Глава 4. Разведка боем
Никита не спал всю ночь.
После того как он уронил стрыгу единицами здоровья, деревенские перестали смотреть на него как на сумасшедшего. Теперь они косились с уважением и суеверным ужасом. Особенно когда он попросил старосту принести не мёду, а чистую тряпку и сказал, что «надо взять образец шерсти для дебага».
— Вы это… не колдуйте больше, — попросил рыжий стражник, по имени Митяй. — А то нам потом от батюшки достанется.
— Я не колдую, — вздохнул Никита, перевязывая царапину на руке. — Я анализирую.
Вдалеке снова завыли. Теперь уже ближе, с двух сторон.
Староста Макар — кряжистый мужик с мудрыми глазами — собрал сход прямо посреди ночи. Пришли все, кто мог держать топор или вилы. Никита сидел на бревне, чувствуя себя странно: его мнение вдруг стало важным.
— Сказывай, пришлый, — начал Макар. — Что за тварь? Как с ей быть?
— Это не одна тварь, — Никита поднял палец. — Это, судя по звукам, стая. Штук пять-шесть. И они не просто воют — они координируются. Один голос слева, другой справа. Классический фланговый обход.
— По-нашему — окружают, — перевёл Митяй.
— Именно.
Мужики загудели, закрестились. Бабы заголосили. Макар стукнул клюкой о землю:
— Цыц! Ещё не вечер. Пришлый, говори, что делать.
Никита хотел сказать «бежать», но понял, что это не вариант. Деревня была в глуши, к тому же сломанный мост отрезал путь к княжьему стану. Оставалось либо умереть, либо...
— Укрепить ворота, — сказал он. — Собрать всех в одном месте — например, в избе старосты. И факелы. Много факелов.
— А ты? — спросила какая-то баба.
— А я попробую взломать их спавн.
— Чего?
— Понять, откуда они берутся, и вырубить систему, — устало пояснил Никита. — Или хотя бы замедлить.
Староста кивнул, будто речь шла о капусте. Мужики разошлись по местам: кто к воротам, кто к амбару. Никита остался у баньки, глядя на браслет. Здоровье восстановилось до 60. Мана по-прежнему 0. Способность «Взгляд в код» — молчала.
— Всё как в старом проекте, — проворчал он. — Документация отсутствует, API не работает, тимлид не отвечает.
Он решил рискнуть. Открыл консоль и ввел:
map.scan()
Браслет мигнул. Перед глазами развернулась полупрозрачная карта окрестностей — деревня, лес, болото. И пять красных точек, двигающихся к частоколу.
— О, есть что-то вроде радара, — обрадовался Никита. Потом заметил мелкий шрифт внизу: [DEMO VERSION. ОСТАЛОСЬ 2 ИСПОЛЬЗОВАНИЯ].
— Серьёзно? Демо-версия мира? — он едва не заорал. — Где купить полную, скажите на милость?
Но ответа не было.
Первая точка пересекла границу карты — и тут же у частокола раздался треск. Огромная тень перемахнула через забор. В этот раз в деревню ворвались сразу две стрыги.
— Суки! — заорал Митяй, замахиваясь рогатиной.
Началось.
Никита рванул к воротам, набирая на ходу в консоли:
creatureList.find("type", "STRYGA").forEach(c => c.setHealth(1))
Нажал Enter — и мир взорвался болью. Здоровье упало до 20/80. Голова закружилась, в ушах зашумело. Но на долю секунды перед глазами пронеслось: [4 OBJECTS MODIFIED].
Две стрыги, уже вцепившиеся в Митяя и какого-то парня в фартуке, вдруг обмякли и рухнули. Третья, только перелезавшая через забор, зависла в неестественной позе и с глухим стуком свалилась в канаву.
— Есть! — выдохнул Никита, но тут же покачнулся и упал на колени.
— Господин! — Димка, оказывается, никуда не убегал, а стоял рядом с вилами наперевес. — Господин, у вас кровь из носа!
— Побочный эффект, — прохрипел Никита, вытирая лицо рукавом. — Использование HP вместо маны... не рекомендую.
Но четвёртая стрыга — та, что была в лесу и не попала под массовое изменение, — не ушла. Она выскочила с другой стороны, где защита была слабее, и набросилась на старосту. Макар успел отбиться клюкой, но тварь отшвырнула его, как котёнка.
Никита рванул было к нему, но ноги подкосились. Здоровье 20 — он сам был на грани.
— Димка, тащи сюда... того мужика с рогатиной! — крикнул он, пытаясь открыть консоль.
Димка метнулся, а Никита кое-как набрал:
if (distanceTo(creature, "Макар") < 5) creature.attackTarget = "null"
Enter. Удар в грудь — здоровье 15/80. Но стрыга, уже занёсшая лапу над старостой, замерла, помотала башкой и, словно передумав, бросилась прочь, прямо в лес.
— Ушла, — прошептал кто-то.
Тишина. Только стоны раненых и треск факелов.
Никита потерял сознание.
---
Он очнулся на сеновале. Под головой — что-то мягкое, пахнущее травами. Рядом сидел Димка и отгонял мух березовой веткой.
— Живой, — констатировал мальчишка.
— Какой гениальный вывод, — просипел Никита. — Сколько я был в отключке?
— Час, не больше. Староста велел беречь вас как зеницу ока. Вы, господин, спасли деревню.
Никита приподнялся. Всё болело, но браслет показывал 40/80 — восстановление шло. Он посмотрел на свои руки: пальцы дрожали, но консоль всё ещё была доступна.
— Димка, у вас тут есть местный лекарь?
— А как же, бабка Марфа. Она уже приходила, сказала, что вы неживой, потому что у живых так с носа не течёт. Я ей сказал, что вы техномант. Она перекрестилась и ушла.
— Отлично. — Никита вздохнул. — Ладно, мне нужно встать и подумать, как отбить следующую волну.
— А они ещё придут?
— Судя по карте... — он глянул на браслет, использовал последнее сканирование ([DEMO: ОСТАЛОСЬ 1 ИСПОЛЬЗОВАНИЕ]). На карте горело шесть новых красных точек. — Придут. Через полчаса.
Димка побледнел:
— И как вы их остановите?
Никита помолчал. Потом повернулся к парню и сказал совершенно серьёзно:
— Скажи старосте, пусть соберут все мёд, дёготь и пустые бутылки. И ещё — найди мне кусок бересты и уголь. Я попробую написать скрипт.
— Чего?
— Берёсту и уголь, говорю. И не отвлекай.
Димка выбежал. Никита оперся спиной о стену и уставился в потолок.
— Так, — сказал он вслух. — Если это всё — база данных, у каждой твари есть уникальный ID. Я могу перехватить событие спавна... но на это нужна мана, которой нет. Значит, надо копать в сторону багов. Использовать что-то вроде бесконечного цикла, чтобы они зависали.
Он начал быстро писать пальцем в воздухе, вызывая консоль снова и снова. Каждый вызов отжирал по 1 HP, но сейчас было не до диеты.
Через десять минут Никита сгенерировал черновик скрипта на псевдокоде, записал его углём на бересте и вручил Димке:
— Держи. Если я сдохну — передай следующему техноманту, который свалится из Москвы.
— А такие часто падают? — с надеждой спросил Димка.
— Не знаю. Но судя по тому, как этот мир забагован — возможно, чаще, чем хотелось бы.
За околицей завыли. Никита встал, взял рогатину (про запас) и вышел на улицу.
— Последний патч перед релизом, — пробормотал он. — Как обычно, в пятницу вечером.
---
Глава 5. Скрипт на берёсте
Шесть красных точек на карте приближались. Никита стоял у ворот, сжимая в одной руке рогатину, а в другой — бересту с каракулями. Мужики за его спиной шептались, бабы крестились. Дым от факелов смешивался с туманом.
— Слушайте сюда, — сказал Никита громко. — Сейчас они придут. Возможно, все шесть. Мой скрипт рассчитан на массовое отключение, но он сырой. Как любая программа перед дедлайном.
— Чего? — переспросил Митяй.
— Он может сработать не до конца, — перевёл Димка. Все удивлённо посмотрели на пацана. — Я уже привык, — пожал плечами тот.
— Именно, — кивнул Никита. — Поэтому ваша задача — держать строй и не дать им разорвать меня в клочья, пока я буду стучать по клавиатуре. А моя задача — сделать так, чтобы они потеряли цель или упали в спячку. Вопросы?
— А если ты помрёшь? — спросил лысый стражник.
— Тогда бегите в лес и молитесь, чтобы следующая волна пришла не раньше, чем вы доберётесь до княжьего стана.
Бабы завыли, но Макар рявкнул: «Цыц!». И вовремя — из темноты донеслось первое рычание.
Твари вышли одновременно. Шесть серых теней, огромных, горбатых, с горящими глазами. Они не спешили — шли медленно, окружая деревню с трёх сторон. Никита насчитал: три спереди, две слева, одна справа. Умные твари.
— Начинаю, — сказал он и открыл консоль.
run script_from_bark();
Браслет мигнул, и из камня вырвалась тонкая зелёная нить, потянувшаяся к бересте. Листок засветился, по нему побежали буквы.
[ПОПЫТКА ВЫПОЛНЕНИЯ НЕКОМПИЛИРОВАННОГО СКРИПТА]
[ОШИБКА: НЕИЗВЕСТНАЯ ФУНКЦИЯ "SLEEP_ALL_MOBS"]
[ОТКАТ...]
— Вот чёрт, — выдохнул Никита. — Синтаксическая ошибка. Димка, ты уверен, что переписал всё без опечаток?
— Я слово в слово! — обиделся пацан.
Первая стрыга перешла на рысь. Митяй замахнулся рогатиной, но Никита выставил руку:
— Стойте!
Он лихорадочно правил скрипт прямо в консоли, заменяя вызовы:
foreach(creature in radius(50)) { if(creature.type=="STRYGA") { creature.health=1; creature.target=null; } }
Enter. Боль прострелила виски — здоровье упало до 32/80. Но система ответила:
[5 OBJECTS MODIFIED. 1 OBJECT RESISTED.]
Пять тварей рухнули одновременно, как подкошенные. Шестая — та, что справа, — даже не пошатнулась. Она зарычала громче, прыгнула через плетень и кинулась прямо на Никиту. У неё был не такой ID, как у остальных. Может быть, босс? Или просто баг?
— Береги господина! — заорал Димка, и мужики с вилами ринулись наперерез.
Началась свалка. Никита откатился в сторону, изо всех сил пытаясь открыть консоль повторно, но система выдала: [DEMO: ЛИМИТ КОМАНД НА СЕАНС ИСЧЕРПАН. ОЖИДАНИЕ 15 МИНУТ.]
— ЧТО? — заорал Никита. — КАКОЙ ЛИМИТ?
Но ответа не было. Только звуки битвы: рык, звон металла, крики. Митяй с размаху всадил рогатину в бок твари, но та лишь разозлилась и сбросила его, как комара. Лысый стражник получил лапой по голове и отлетел в сторону.
Никита остался один против взбешённого монстра. У него не было маны. Команды кончились. Здоровье — 32. В руках — только рогатина, которую он едва держал.
— Ну, — сказал он, сжимая древко. — Раньше я чинил принтеры с закрытыми глазами. Тоже было весело.
Стрыга прыгнула. Никита инстинктивно выставил рогатину вперёд, и тварь сама насадилась на неё, зарычав от боли. Но не умерла — начала извиваться, пытаясь достать его когтями.
— Помогите! — заорал Никита не своим голосом.
И тут из темноты вылетел Димка с горящей головнёй. Пацан сунул огонь прямо в морду стрыги — та взвизгнула, отпустила рогатину и отшатнулась. В тот же миг подоспел староста Макар с огромным топором и одним ударом отрубил твари лапу.
— Бей её! — крикнул Макар, и мужики навалились всем скопом.
Стрыга, ослабленная, истекающая чёрной жижей, попыталась уползти, но Никита, чувствуя, что силы на исходе, набрал последнюю команду — не через консоль, а через прямой доступ к камню, просто сжав его изо всех сил и прошептав:
— /kill @e[type=stryga,limit=1]
Мир потемнел. Последнее, что он услышал, — всплеск и довольное «Готово» из браслета.
---
Он очнулся в той же баньке, но уже не на сеновале, а на лавке. Рядом сидела бабка Марфа — костлявая, с острым носом и выцветшими глазами — вливала ему в рот какую-то горькую жижу.
— Открой рот, техномант, — командовала она. — Пей. Это от кровотечения.
— Что произошло? — просипел Никита.
— Всё. Тварь сдохла. Мужики закопали за околицей. Ты молодец, но дурак. Нельзя столько сил из себя тянуть, — бабка поджала губы. — У тебя сейчас здоровья, как у новорождённого цыплёнка. Полежи.
Но Никита сел, превозмогая боль. Посмотрел на браслет: 5/80. Он едва жив. Демо-режим? Лимит команд? Это требовало срочного расследования.
— Димка, — позвал он. Пацан тут же вынырнул из-за двери. — Спасибо. Ты меня спас.
— Это вы старосту спасли, — Димка засмущался. — А я просто... огонь сунул.
— Достаточно. Слушай, мне нужно найти способ снять ограничения. Где здесь ближайшая точка с сильной магией? Или место, где можно пополнить... ну, магический резерв?
Димка задумался:
— В княжьем стане есть капище. Там жрецы заряжают амулеты и лечат. Но до него через лес идти, а в лесу волки.
— Волки — не проблема, — усмехнулся Никита. — Проблема — стрыги. Но их, надеюсь, пока нет.
Бабка Марфа крякнула:
— Будут. Ещё как будут. Эта стая — только разведка. Настоящий рой объявится через три дня, когда луна нальётся. Так в старых свитках писано.
— Три дня? — переспросил Никита. — Успею.
Он встал, пошатнулся, опёрся о стену. Здоровье — всего 5, но восстановление шло медленно: плюс 1 каждые десять минут. За три дня он, конечно, восстановится полностью — если доживёт.
— Макар, — обратился он к старосте, который вошёл с кружкой мёда. — Мне нужна лошадь. Или хотя бы осёл.
— Лошади нет, осёл есть, — степенно ответил старик. — Управишься?
— А он кусается?
— Как все.
— Сойдёт, — кивнул Никита. — Завтра на рассвете выезжаю в княжий стан.
— А как же деревня? — спросил Митяй, с перевязанной головой. — Если вы уедете, а они вернутся?
Никита помолчал. Потом достал бересту, на которой ошибался, и начал писать заново, уже с учётом синтаксиса.
— Я оставлю вам «одноразовый скрипт», — сказал он, не поднимая глаз. — Если твари полезут — просто приложите эту бумагу к камню у ворот. Должно сработать. Если нет... ну, тогда бегите.
— Куда бежать-то?
— В княжий стан. За мной. Я там обустрою облачное хранилище и вызову подкрепление.
Мужики переглянулись, но спорить не стали. От Никиты всё равно пахло магией и безумием, а в деревне, как известно, таких не перечат.
---
На рассвете он сидел верхом на осле. Животное упрямо не хотело двигаться, пока Димка не сунул ему под нос морковку.
— Счастливо, господин техномант! — крикнул пацан.
— Не помри там! — добавил Митяй.
Никита поднял руку, прощаясь, и тронул поводья. Лес начинался сразу за околицей. Здоровье уже поднялось до 12. Впереди — княжий стан, жрецы, библиотека и, возможно, нормальный доступ к API.
А где-то в глубине леса снова завыли. Но теперь — далеко. И Никита почему-то подумал, что этот вой — не только угроза, но и предупреждение.
— Первый патч вышел с багами, — сказал он ослу. — Но я научусь их чинить. Когда-нибудь.
Осёл ответил неприличным звуком.
---
Глава 6. Платная подписка
Осёл оказался существом вредным, но выносливым. К полудню Никита одолел половину пути до княжьего стана. Лес вокруг поредел, уступив место полям и редким хуторам. Здоровье поднялось до 30 — медленно, но верно.
— Главное, не встречать больше стрыг, — бормотал Никита, почесывая осла за ухом. — Или встретить, но на своих условиях.
Осёл фыркнул, выражая солидарность.
Впереди показались стены. Не деревянный частокол, а настоящие каменные стены, с башнями и воротами. Над ними реял вымпел с изображением меча и книги. Княжий стан — не город даже, а небольшая крепость с прилегающим посадом.
— Ничего так, — оценил Никита. — Графика высокого разрешения.
У ворот толпился народ. Крестьяне с телегами, торговцы, монахи в чёрных рясах. Стражники в кольчугах проверяли документы. Никита понял, что у него нет никаких «вид на жительство» и даже имени местного. Придётся импровизировать.
— Стоять! — окликнул его стражник с алебардой. — Кто таков? Откуда? Зачем?
— Никита. Из Москвы. По делам магическим.
Стражник сощурился:
— Москва? Это что за княжество?
— Очень далёкое. За болотом. — Никита решил не углубляться. — Мне нужно к жрецам в капище. У меня... проблемы с резервом.
Стражник оглядел его рваную мантию, синяки, осунувшееся лицо и кивнул:
— Проходи. Капище — за торговой площадью, у старой липы. Только без глупостей.
— Я сама глупость, — вздохнул Никита и въехал на осле в город.
---
Княжий стан бурлил жизнью. Лавки, кузницы, корчмы. Пахло жареным мясом, кожей и навозом, но Никита почти не замечал — глаза разбегались от вывесок. «Магическая лавка Герасима», «Настойки от всех хворей», «Кузница Хрум — мечи и плуги». Всё как в дешёвой RPG, только без квестовых значков над головами.
Он наткнулся на капище случайно. Здание из грубого камня, крытое черепицей. У входа дымилась кадильница, а на крыльце сидел молодой парень в белой рясе и читал книгу.
— Здравствуйте, — начал Никита. — Я ищу жреца, который разбирается в... ну, в магических ограничениях.
Парень поднял глаза. У него было бледное лицо, умный взгляд и обгрызенное перо в руке.
— Вы пришли по адресу. Я — Алёша, послушник. Чем могу помочь?
— У меня странный артефакт, — Никита показал браслет. — Он работает в демо-режиме. Ограниченное число команд. Мне нужно снять лимит.
Алёша замер, потом осторожно взял его за руку и повертел браслет.
— Так это же... это же знак Хранителя! — выдохнул он. — Где вы его взяли? Такие только у высших магов.
— Проснулся — на руке висел. Неважно. Ты можешь помочь?
— Я всего лишь послушник, — Алёша замялся. — Но наш настоятель, отец Никон, много знает о чарах. Он сегодня принимает с полудня до заката. Подождите внутри, я доложу.
Никита кивнул, привязал осла к колонне и вошёл в капище. Внутри пахло ладаном и старым деревом. Стены покрыты фресками с изображениями святых и — что его удивило — схемами магических рун. Некоторые руны он уже видел на вращающемся круге в Радонежье.
— Интересно, — пробормотал он. — Это не фэнтези, а какой-то гибрид с инженерией.
Через десять минут вышел настоятель. Сухой старик с пронзительными глазами, в расшитой мантии. Он посмотрел на браслет Никиты — и вдруг побледнел.
— Это... Вы знаете, что это такое? — спросил он голосом, полным трепета.
— Артефакт с демо-версией? — предположил Никита.
— Нет. Это ключ доступа первого уровня. Их выдают только тем, кто пришёл из-за грани. Вы, должно быть, техномант?
— Техномант, но слабый, — кивнул Никита. — У меня нет маны, только здоровье. А любая команда отжирает HP. И лимит — 3-4 за сеанс.
Настоятель Никон задумался.
— Дело в том, что в этом мире магия — не бесплатна. Каждый заклинатель платит энергией — своей или накопленной. Вы, видимо, не прошли инициализацию, поэтому система выдала вам «гостевой доступ». Чтобы получить полные права, нужно пройти обряд подключения.
— Обряд подключения? — переспросил Никита. — Как регистрация на сайте?
— Не кощунствуйте, но да, — усмехнулся настоятель. — Нужно найти камень-накопитель, ввести своё имя в Книгу Судьбы и принять магический код. После этого вы получите нормальный расход маны, а не HP. И лимит снимут.
— Где найти этот камень?
Никон указал на алтарь. Там, в серебряной чаше, лежал небольшой гладкий камень голубоватого оттенка. Он мерцал как старый добрый Wi-Fi роутер.
— Протяните руку с браслетом к камню и произнесите: «Принять условия пользования».
— Серьёзно? — Никита подошёл к алтарю. — И никакого «я согласен» мелкими буквами?
— Условия просты: вы обязуетесь не использовать магию во вред невинным и не пытаться взломать систему выше вашего уровня. Иначе — бан.
— Вечный?
— Навсегда. Вы станете обычным человеком.
Никита задумался на секунду, но выхода не было. С одной стороны — стать нормальным техномантом с маной, с другой — риск. Он вздохнул, приложил браслет к камню и сказал:
— Принимаю условия пользования.
Камень вспыхнул. Браслет завибрировал, а перед глазами развернулось:
[РЕГИСТРАЦИЯ ПОЛЬЗОВАТЕЛЯ]
Имя: Никита
Родной мир: Москва. Текущий мир: Радонежье
Класс: Техномант (ур.1)
Мана: 50/50
Особые способности: «Взгляд в код» (активируется на 2 уровне)
— Уровень первый, — разочарованно сказал Никита. — И для «Взгляда в код» нужен второй.
— Никто не даёт новичку сразу админку, — спокойно ответил настоятель. — Развивайтесь. Выполняйте задания, защищайте людей, изучайте мир. Тогда и уровни поднимутся.
— У меня нет времени. Через три дня к Радонежью подойдёт рой стрыг. Если я не подниму уровень до второго, деревню сожрут.
Никон нахмурился.
— Стрыги — это проблема. Но в нашем городе есть тренировочный полигон, где вы можете потренироваться в бою и набрать опыт. А ещё — библиотека, где хранятся свитки с дополнительными командами.
— Библиотека! — оживился Никита. — Это мне и нужно.
— Тогда поспешите. Библиотека закрывается на закате, — настоятель указал на дверь. — И возьмите с собой Алёшу. Он проведёт и, если что, подлечит.
Никита кивнул, поблагодарил и вышел. На улице Алёша уже седлал своего коня.
— Вы согласились? — спросил он радостно. — Я так и знал! Вы настоящий техномант из сказаний!
— Из сказаний? — удивился Никита. — Вы что, про нас слышали?
— Легенды гласят, что раз в сто лет приходит техномант из другого мира, чтобы исправить глюки реальности, — глаза Алёши горели. — Предыдущий, говорят, починил гравитацию у Водопада Слёз и перестал зависать рассвет.
— Зависать рассвет? — Никита представил себе утро, которое тормозит как старый компьютер. — Да у вас тут багов — на три патча.
Они направились к библиотеке.
---
Здание библиотеки оказалось двухэтажным, с витражами и дубовой дверью. Внутри пахло пергаментом и пылью. Старый монах-библиотекарь сидел за кафедрой и вязал узлы.
— Нам нужны свитки доступа к API, — сказал Никита, как само собой разумеющееся.
Монах поднял бровь:
— Какого API, сын мой?
— Прикладного программного интерфейса. Ну, как управлять магией через команды.
— А, вот вы о чём, — монах понимающе кивнул. — Есть у нас пара свитков. Но доступ к ним платный.
— Сколько?
— Десять серебряных за свиток.
Никита похлопал себя по карманам. В рюкзаке нашлось всего три медяка. Он вздохнул и повернулся к Алёше:
— У тебя есть деньги?
— Я послушник, — развёл руками тот. — У меня только постная каша и благословение.
— Подписка, — прошептал Никита. — Тут даже свитки — по подписке. Демо-режим сняли, теперь плати.
Он зло посмотрел на браслет. Тот показывал ману 50/50, но без дополнительных команд он был как игрушечный пистолет. Нужно было срочно заработать серебро.
— Есть какие-нибудь простые задания для техноманта? — спросил он у монаха. — Заплатят?
Монах почесал нос:
— У нас тут в подвале завелся баг-скрипт. Заклинание «Свет» перестало гаснуть. Уже три луны горит, мешает спать.
— То есть — баг с бесконечным циклом? — глаза Никиты загорелись. — Это я люблю. Давайте ваш подвал.
Он спустился вниз, и в полумраке действительно заметил тусклый магический шарик, который висел в воздухе и не тух. Никита открыл консоль (теперь она работала на мане, не отжирая HP) и ввел:
spell_light.isPermanent = false
spell_light.duration = 0
Мирно мигнуло [ОК]. Шарик погас.
— Готово, — крикнул Никита, поднимаясь. — Баг пофикшен.
Монах восхищённо всплеснул руками и протянул мешочек с монетами.
— Ваша плата. Десять серебряных. Берите свиток.
Никита схватил свиток «Основы магического API. Версия 2.0». Развернул. Там были перечислены команды: set_mana, get_target, spawn_object, find_by_id... И одна странная команда: override_admin_check.
— А это что? — спросил он.
— Это легаси-функция для древних магов, — сказал монах. — Но лучше не используйте, если не хотите получить бан от Хранителей.
Никита сунул свиток за пазуху, поблагодарил и вышел. У крыльца его уже ждали двое стражников с подозрительными лицами.
— Господин техномант, — сказал один. — Вас желает видеть князь.
— Князь? — удивился Никита. — Зачем?
— Говорят, вы чините магию. А у князя сломался родовой амулет. Заплатит хорошо.
Никита переглянулся с Алёшей. Деньги, опыт, возможно, новый уровень — всё это приближало его к защите Радонежья.
— Ведите, — сказал он. — Но учтите: я дорогой специалист.
Стражники с сомнением посмотрели на его драную мантию, но промолчали. Никита взобрался на осла и поехал к княжескому терему, чувствуя, что приключение только начинается.
---
Глава 7. Легаси-код и княжеский баг
Княжеский терем оказался меньше, чем ожидал Никита. Двухэтажный сруб из тёмного дуба, крыльцо на резных столбах, у входа — два волкодава, которые лениво проводили осла равнодушными взглядами.
— Слазь, — скомандовал стражник. — Князь внутри.
Никита передал поводья Алёше и вошёл. Внутри пахло воском и нагретым металлом. В большой горнице за столом сидел мужчина лет сорока, коренастый, с короткой бородой и усталыми глазами. На шее — кожаный шнурок, а на нём — тусклый медальон без свечения. Князь Вячеслав.
Знакомиться церемонно не стали. Князь махнул рукой на стул напротив и сразу перешёл к делу:
— Говорят, ты техномант. Почини амулет. Третий день не работает, а без него защита княжества падает. Заплачу серебром. Или золотом, если результат будет.
Никита взял медальон. Обычный кусок серебра с руной в центре. Руна не горела, но при прикосновении пальцы ощутили слабую вибрацию. Как будто программа висела в бесконечном цикле.
Он открыл консоль и направил её на амулет:
scan(amulet)
Перед глазами вывалилось:
OBJECT: Родовой амулет князей Радонежских
Состояние: Ошибка при выполнении скрипта "blood_protection"
Причина: Переполнение стека вызовов
Рекомендация: Очистить кеш или перезагрузить объект
— Переполнение стека, — вслух прочитал Никита. — Знакомая боль. Княже, а вы случайно не пробовали его... ну, выключить и включить?
— Чего? — не понял Вячеслав.
— Снять на ночь, положить на стол, утром надеть?
— Пробовал. Толку ноль.
— Понятно. Тогда будем чистить кеш вручную.
Никита сосредоточился. Консоль позволяла редактировать свойства объектов, но для этого нужна была мана. Он рискнул и ввел:
amulet.blood_protection.stack.clear()
На это ушло 15 маны. Браслет пискнул, и амулет на мгновение вспыхнул, но снова потух. Система выдала: [ОШИБКА: НЕДОСТАТОЧНО ПРАВ ДЛЯ ОЧИСТКИ СТЕКА. ТРЕБУЕТСЯ УРОВЕНЬ 2].
— Вот чёрт, — выдохнул Никита. — У меня только первый уровень. Мне нужен второй, но в Радонежье стрыги через три дня, а тут... — Он задумался, потом достал свиток «Основы магического API», который купил у монаха. — Но у меня есть кое-что.
Он развернул свиток и нашёл команду override_admin_check. Описание гласило: «Используется для временного обхода проверки прав в нештатных ситуациях. Может вызвать санкции Хранителей. Применять с осторожностью».
— Санкции Хранителей — это, наверное, бан, — пробормотал Никита. — Но если я не починю амулет, не получу опыт и не подниму уровень. А стрыги сожрут деревню. Выбора нет.
Он глубоко вздохнул и набрал в консоли:
override_admin_check(true)
Браслет нагрелся, полыхнул красным:
[ПРЕДУПРЕЖДЕНИЕ: НЕСАНКЦИОНИРОВАННОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ]
[ВРЕМЕННЫЙ ДОСТУП К УРОВНЮ 2 ПРЕДОСТАВЛЕН ДЛЯ ОДНОЙ КОМАНДЫ]
[СЧЁТЧИК НАРУШЕНИЙ: +1]
Никита быстро ввел очистку стека снова:
amulet.blood_protection.stack.clear()
На этот раз система ответила [ОК], и амулет вспыхнул ровным золотистым светом. Руна на нём загорелась, замерцала, а потом начала нормально пульсировать.
— Готово, — выдохнул Никита.
Он тут же отозвал повышение: override_admin_check(false). Браслет погас. Нарушение осталось в логах — счётчик так и показывал 1, но доступ был отозван.
Князь Вячеслав надел медальон и облегчённо выдохнул. В этот миг перед Никитой выскочило системное сообщение:
[ВЫ ПОЛУЧИЛИ ОПЫТ: 500 XP]
[УРОВЕНЬ ПОВЫШЕН: ТЕХНОМАНТ УР. 1 → УР. 2]
[МАНА: 50/50 → 80/80]
[ОТКРЫТА СПОСОБНОСТЬ: "ВЗГЛЯД В КОД"]
Никита чуть не подпрыгнул от радости. Уровень 2! «Взгляд в код» активирован! Жаль, что счётчик нарушений так и остался 1 — висит в логах, напоминание о взломе. Но сейчас главное — не бан, а победа над стрыгами.
— Спасибо, техномант, — сказал князь. — Проси любую награду.
— Мне нужен доступ к библиотечным свиткам второго уровня и место для тренировок. И желательно... не могли бы вы организовать мне встречу с местным специалистом по магической безопасности? У меня тут временный доступ к админке, Хранители могут быть недовольны.
Князь нахмурился:
— С Хранителями шутки плохи. У нас в городе есть дозорный маг, Ферапонт. Он бывший смотритель системы. Живёт отшельником у старой мельницы. Можешь наведаться к нему.
— Спасибо, князь. А сейчас разрешите удалиться — нужно испытать новую способность.
Никита вышел на крыльцо, где его ждал Алёша с ослом.
— Ну что, — спросил послушник. — Получилось?
— Не только! — Никита поднял руку с браслетом. — Я теперь второго уровня. И у меня есть «Взгляд в код».
Он активировал способность. Мир вокруг изменился: над каждым объектом появились полупрозрачные надписи. Над ослом — CREATURE: donkey | HP: 45 | MANA: 0 | TEMPER: hostile (99%). Над Алёшей — NPC: Alesha (cleric lvl.1) | QUESTS: none. Над стражниками — GUARD: generic lvl.3 | AGGRESSION: 10%.
— Это как отладчик, только в реальной жизни, — прошептал Никита, поворачивая голову. — Круто.
— Вы чего застыли? — спросил Алёша.
— Смотрю на ваши теги, — Никита улыбнулся. — Не обращай внимания. Поехали к старой мельнице, нужно найти Ферапонта.
---
Мельница находилась на окраине города, у реки. Колесо не вращалось, а на пороге сидел тощий мужик в драном плаще и ковырял палкой землю. Увидев повозку, он поднял голову. Глаза — острые, внимательные.
— Ты тот техномант, который повысил себе уровень через override_admin_check? — спросил он без приветствия. — Система зафиксировала нарушение. Я пришёл посмотреть, кто такой умный.
— Ферапонт? — догадался Никита.
— Он самый. Дозорный маг, в отставке. И если ты не хочешь, чтобы Хранители забанили тебя навсегда, ты сейчас же сбросишь этот флаг и будешь пользоваться только легальными командами.
— Уже сбросил, — сказал Никита. — Счётчик нарушений остался на единице, но доступ отозван.
— Молодец, — буркнул Ферапонт. — Теперь слушай. Чтобы защитить Радонежье от роя стрыг, тебе нужно не только видеть код, но и уметь его править в реальном времени. Я покажу тебе пару трюков. У тебя есть два дня. На третий — ты должен вернуться в деревню и встретить врага.
— Два дня? — переспросил Никита. — А успею?
— Если ты такой же умный, как кажешься, успеешь. Пошли на полигон.
Они двинулись к тренировочной площадке за городом. Никита чувствовал, что время сжимается, но впервые за последние дни он был готов. «Взгляд в код», второй уровень, немного нормальной маны — теперь он мог не просто выживать, а сражаться.
— Ферапонт, — сказал он по дороге. — А стрыги... это баг или фича?
— И то, и другое, — ответил старый маг. — Баг, потому что их спавн не должен быть таким частым. И фича, потому что они — часть проверки системы на прочность. Если Радонежье выстоит, то получит бонус к защите.
— А если нет?
— Тогда система перезагрузит этот кусок карты. Вместе с деревней.
Никита сжал кулаки.
— Значит, не дадим системе перезагрузиться.
---
Глава 8. Рой и последний патч
Два дня тренировок пролетели как один миг. Ферапонт гонял Никиту по полигону, заставляя использовать «Взгляд в код» в бою. К вечеру второго дня Никита научился:
· видеть слабые места монстров (точки с минимальной защитой);
· изменять атрибуты объектов в реальном времени, тратя ману, а не здоровье;
· создавать временные «ловушки» — участки кода, где враги зависали на несколько секунд.
— Неплохо для новичка, — буркнул Ферапонт на прощание. — Но помни: легальные команды не отключат весь рой. Тебе придётся драться. Используй голову. И не геройствуй.
— Я программист, а не герой, — усмехнулся Никита. — Моё оружие — клавиатура.
Он оседлал осла (который за два дня немного привык к нему и теперь кусался только по утрам) и отправился в Радонежье. Алёша вызвался сопровождать — для подстраховки и лечения.
---
Деревня встретила их тишиной. Обычно шумная, с кудахтаньем кур и перебранками баб, теперь она замерла. На стенах дежурили мужики с рогатинами и вилами. Увидев Никиту, Митяй облегчённо вздохнул:
— Живой! А мы думали, ты сбежал.
— Сбежал? Я патч вам нёс. — Никита спешился. — Где староста?
Макар вышел из избы, хмурый, но спокойный.
— К ночи будут, — сказал он. — Воют уже с утра, всё ближе.
— Знаю. Я их вижу.
Никита активировал «Взгляд в код». Над лесом, на расстоянии километра, горели десятки красных точек. Не пять и не шесть — по крайней мере пятнадцать стрыг. А в центре роя — одна огромная метка, пульсирующая багровым. Матка.
— Их много, — сказал он. — Но я знаю, как их замедлить.
Он достал свитки, купленные у монаха, и начал наносить руны прямо на частокол. Алёша помогал — подавал мел, чернила, травы по указанию Ферапонта. К вечеру вокруг деревни образовался контур из магических символов.
— Это ловушка, — объяснил Никита мужикам. — Как только стрыги коснутся частокола, сработает скрипт задержки. Они зависнут на несколько секунд. Ваше дело — бить их вилами, пока они не двигаются.
— А если не зависнут? — спросил Митяй.
— Тогда будет весело.
---
Ночь опустилась быстро. Луна вышла из-за туч, огромная, жёлтая — «налилась», как говорила бабка Марфа. И сразу из леса донёсся вой. Не один, а многоголосый, как хор неудачников на прослушивании.
— Готовьтесь, — сказал Никита.
Первая стрыга вылетела из кустов, за ней вторая, пятая, десятая… Они не шли — они неслись, перепрыгивая друг через друга. Рычание смешалось в сплошной гул. Никита насчитал восемнадцать тварей плюс матку, которая оставалась в лесу, координируя атаку.
— Твою ж... — выдохнул он. — Скрипт, запуск!
Он ударил по браслету, активируя руны на частоколе. Вспыхнули, засветились все символы разом, и по земле побежали зелёные линии, связывая их в сеть.
[СКРИПТ "STASIS_FIELD" АКТИВИРОВАН]
[ОХВАТ: 20 МЕТРОВ]
[ВРЕМЯ ДЕЙСТВИЯ: 10 СЕКУНД]
Первая волна стрыг влетела в поле — и замерла. Как остановленное видео. Мужики не растерялись: вилы, топоры, рогатины — за десять секунд они уложили пять тварей. Но за ними лезли новые.
— Не хватит, — крикнул Митяй. — Их слишком много!
Никита лихорадочно вбивал команды:
foreach(creature in radius(20)) { if(creature.type=="STRYGA") creature.speed = 0.3 }
Мана упала с 80 до 40. Скорость стрыг снизилась — они стали медленнее, но не остановились. Мужики рубились уже в ближнем бою. Алёша раздавал благословения и лечил раненых. Двое упали, их утащили в избу.
Вдруг матка вышла из леса. Огромная, в два раза больше обычной стрыги, с длинной шеей и светящимися красными глазами. Она взревела, и по полю прошла ударная волна — часть рун на частоколе погасла.
[ПРЕДУПРЕЖДЕНИЕ: ЩИТ ПОВРЕЖДЁН]
[СКРИПТ "STASIS_FIELD" НЕСТАБИЛЕН]
— Матка ломает защиту! — заорал Никита. — Я должен её отключить!
Он сконцентрировался, навёл «Взгляд в код» на матку. Перед глазами развернулись строки:
CREATURE: STRYGA_MATRIARCH (BOSS lvl.8)
HP: 500 | MANA: 200
WEAK POINT: neck (armor 40%)
RESISTANCES: physical 60%, magic 20%
SCRIPTS: spawn_stryga (cooldown 10s), terror_aura (active)
— Шея — слабое место, но броня 40%, — проговорил Никита. — И она каждые десять секунд спавнит новых.
Он посмотрел на свой уровень — всего 2. Маны осталось 30. В руках — только консоль и пара одноразовых скриптов на бересте.
— Ладно, — сказал он. — Один баг всё решит.
Он набрал:
override_admin_check(true)
Браслет засиял красным, высветив: [СЧЁТЧИК НАРУШЕНИЙ: 2]. Но сейчас было не до санкций. Никита получил временные права до 3 уровня и ввёл:
creature_stryga_matriarch.scripts.spawn_stryga.cooldown = 999999
creature_stryga_matriarch.terror_aura.active = false
Мана упала до 5. Матка взревела, но новых тварей не появилось. Её аура страха исчезла — мужики перестали пятиться. Но сама она всё ещё была жива и зла.
— Теперь бейте её по шее! — крикнул Никита, отключая повышение (override_admin_check(false)). Счётчик нарушений остался 2.
Митяй и Макар бросились на матку. Та отбивалась лапами, но без поддержки стаи и без парализующей ауры она стала уязвимее. Митяй всадил рогатину в шею. Макар рубанул топором. Матка взвыла, пошатнулась.
Никита, шатаясь от усталости, набрал последнюю команду на остатках маны:
creature_stryga_matriarch.health = 1
Enter. Мана упала до 0. Матка замерла, сделала один шаг и рухнула.
В тот же миг все оставшиеся стрыги, потеряв связь с матриархом, разбежались в лес.
Тишина.
Никита опустился на колени. Алёша подбежал, положил руку на плечо.
— Живы… — прошептал послушник.
— Живы, — ответил Никита. — И баг пофикшен.
Он посмотрел на браслет. Системное сообщение гласило:
[ПОБЕДА НАД МАТКОЙ СТРЫГ. ПОЛУЧЕНО 2000 XP]
[УРОВЕНЬ ПОВЫШЕН: ТЕХНОМАНТ УР. 2 → УР. 3]
[МАНА: 0/100 → 100/100]
[СЧЁТЧИК НАРУШЕНИЙ: 2 (ПРЕДУПРЕЖДЕНИЕ: ПРИ 3 НАРУШЕНИЯХ БАН)]
[НОВЫЙ СКИЛЛ: "РЕДАКТОР КОДА" — ПОЗВОЛЯЕТ ПРАВИТЬ КОД ОБЪЕКТОВ БЕЗ КОНСОЛИ]
— Третий уровень, — выдохнул Никита. — И счётчик нарушений — два. Ещё одна ошибка — и бан.
Он устало улыбнулся. Деревенские уже обнимались, бабы плакали от радости. Макар хлопнул его по плечу:
— Спасибо, техномант. Век не забудем.
— Обращайтесь, — Никита поднялся, держась за частокол. — Но в следующий раз вызывайте специалиста по лицензионной магии. У меня счётчик на пределе.
---
На рассвете Никита сидел на крыльце старосты и пил мёд. Алёша рядом перевязывал ему царапины. Осёл тёрся мордой о плечо — видимо, признал.
— Что дальше? — спросил послушник.
— В княжий стан. Нужно найти способ сбросить счётчик нарушений, — сказал Никита. — И разобраться, кто такая «система» и почему она работает на демо-режиме.
— А потом?
— А потом, — Никита посмотрел на горизонт, где вставало солнце, — может, найду дорогу домой. В Москву. Но сначала — патч номер два.
Осёл фыркнул, соглашаясь.
Спасибо за чтение
Вернуться к книге
