— Скільки тобі потрібно часу? — спитала Лаура.
— Не знаю, думаю, небагато. Максимум — кілька годин.
— Ти впораєшся так швидко?
— Це проста процедура. Крім того, я встиг добре розібратися в командах мозкового компілятора.
— Тоді до роботи!
Тимур перелопатив достатньо уривків програмного коду, щоби зрозуміти принципи програмування ботів. Більшість функцій детально описані і проілюстровані прикладами в мануалі, складеному Кейтаро, Вадимом Хортом та іншими програмістами, що працювали на «NGF Lab». Українець без особливих зусиль вималював у голові алгоритм і за дві години до світанку приступив до реалізації.
Насамперед створювався екземпляр класу nfBrainAction. Тимур назвав його Operation. Наступним оголошувався примірник класу nfImpact. Він ініціювався функцією NewImpact(), що викликалася з Operation. На цьому етапі Тимур отримував доступ до мозку, виходив за межі мозкового процесора. Далі задавався тип операції (om_Stimulation — стимуляція, а не зчитування імпульсів) і частина головного мозку, в якій проходитиме стимуляція (LIMBUS — лімбічна система). У змінну Coordinates типу nfImpactCoordinates записувались координати майбутньої стимуляції — HYPOTHALAMUS — гіпоталамус. Куди посилати імпульси, визначила Лаура; саме в гіпоталамусі знаходиться центр задоволення. Параметри імпульсів налаштовувались у структурі Imparam (типу nfImpactParam). Туди передавалися значення інтенсивності (ii_Normal — середня) та інтервалу, через який запускатимуться імпульси (100 мілісекунд). Робоча частина програми складалася з конечного циклу. Шістсот разів викликалася функція Delight.Activate(). Враховуючи заданий інтервал, стимуляція мала тривати рівно 60 секунд.
У самому кінці психіатр порадила додати функцію Imparam.HormoneCheckupOn(). Власне, функцію вибирав Тимур. Лаура лиш пояснила фізичний принцип, який мав бути закладений у програму і без якого стимулятор найбільш імовірно не працюватиме. Річ у тім, що за чуттєве задоволення у людини відповідає допамін — гормон, який виробляється мозковою речовиною надниркових залоз, а також багатьма іншими органами. Цей гормон діє безпосередньо на центр задоволення. Більшість наркотиків збільшують потік допаміну в 5–10 разів, даючи можливість людям, що їх споживають, отримувати задоволення. Так, амфетамін напряму збільшує викид допаміну, впливаючи на механізм його транспортування. Кокаїн блокує механізми зворотного захоплення допаміну, збільшуючи його концентрацію в синаптичному просторі. Алкоголь нейтралізує дію антагоністів допаміну. Якщо наркоман продовжує стимулювати центр задоволення, мозок адаптується до штучного підвищення рівня допаміну, гальмуючи виробництво гормону і зменшуючи кількість рецепторів, що на нього реагують. Подальший розвиток хімічної толерантності призводить до незворотних змін у нейронах. Задоволення притупляється, а згодом зникає зовсім. Знайдена Тимуром функція HormoneCheckupOn() дозволяла «виключати» перевірку будь-якого гормону, примушуючи мозок ігнорувати згубний вплив на організм. Таким чином Тимур та Лаура перестраховувалися від того, що мозок ботів може адаптуватися до великої концентрації допаміну (hc_Dopamine).
Остаточно функція стимуляції набула такого вигляду:
...nfBrainAction
Operation(System.GetOperation(NEW_DIRECT_ACTION));
if (!Operation.m_lpDispatch) return;
nfImpact
Delight(Operation.NewImpact(BRAIN_GLOBAL_PENETRATION));
if (Delight.m_lpDispatch)
{
Delight.SetOperationMode(om_Stimulation, TRUE);
Delight.SubGlobalTarget(LIMBUS);
nfImpactCoordinates Coordinates(Delight.GetPosition (HYPOTHALAMUS));
if (Coordinates.m_lpDispatch)
{
Delight.SetTargetCoordinates(Coordinates);
Delight.SetOperationType(ot_Pulse, ot_Point);
nfImpactParam Imparam(Delight.GetImpactParamDefinition());
if (Imparam.m_lpDispatch)
{
Imparam.SetImpulseIntensity(ii_Normal);
Imparam.HormoneCheckupOn(hc_Dopamine, FALSE);
Imparam.SetInterval(100);
Imparam.Update();
}
}
else return;
for (int i=0; i=600; i++) Delight.Activate();
Clear();
}
О 7:45 суботнього ранку бота, який до цього часу безперервно бавився з кнопкою «DLGHT», відірвали від пульта. «Малюк» довго оговтувався. Його лихоманило.
Очунявши, бот повернувся до депресивного, напівкататонічного стану.
Тимур наклав на його голову спеціальні електроди і скомпілював написаний код на мозкові плати. Запис процедури пройшов успішно, про що свідчило повідомлення по центру інформаційної панелі: PROCEDURE IS CHECKED AND COMPILED SUCCESSFULLY.
Тимур телющився на екран, на якому зависло повідомлення. Секунди спливали, але з ботом нічого не відбувалося. Подеколи він відключався, поринаючи у важку дрімоту. Потім прокидався і починав тихенько квилити, тягнучись пальцями до пульта, на якому блискала кнопка «DLGHT».
— Ну давай… давай же… — шепотів Тимур. Від напруження на скронях хлопця виступили краплини поту. — Запускай, ну… Здогадайся!
Після припинення стимуляції у бота впав кров’яний тиск, почалася брадикардія. Ніхто не знав достеменно, чи він куняє, чи втрачає свідомість.
Минуло кілька хвилин. Тимур повторив компіляцію. Процедура наново записалась на мозкові плати. І знову успішно — процесор «сприйняв» код. Утім, бот не запускав модуль. Він або не розумів, або не хотів його активувати.
Алан та Ріно скоса зиркали на програміста.
— Я думаю, йому потрібен час, — розгублено пробубнів Тимур. Хоч він і підозрював, що проблема не в часі. Можливо, бот не може вибудувати логічний ланцюжок «стимуляція — кнопка DLGHT — заборона користуватися кнопкою — запис процедури». Він просто не вловлює суть процедури.
— Спробуй додати команду на самозапуск після компіляції, — запропонував Алан.
Тимур вставив перед тілом основної процедури системну функцію — SetAutoRun(). Вона автоматично запускала модуль на виконання відразу після компіляції. І спробував скомпілювати змінений код.