«Сьогодні його тіло — NPC у зомбі-апокаліпсисі гри Project Zomboid. Завтра це контролер ESP32, Arduino або Raspberry Pi з ногами чи колесами. Мозок уже готовий — і діло своє він знає»
«Стріляй!» — і за спиною гримить дробовик
— Стріляй! — кричу я в мікрофон, відбиваючись від двох зомбі перед собою.
За спиною гримить двоствольний дробовик. У навушниках — спокійний голос: «Тримаю оборону!».
Це не скриптований NPC і не напарник з мультиплеєра. Це модель gpt-realtime-2.1, яка чує мій голос через мікрофон, відповідає своїм голосом — і керує персонажем у моїй грі через набір із 34 інструментів. Вона ходить за мною, лутає будинки на прохання, сідає в машину на пасажирське і пише мені на ігровий пейджер, коли я відходжу задалеко й перестаю її чути.
Як у будь-якого нормального інженера, у мене час від часу виникає потреба відпочити мізками — і в цьому допомагають ігри. Але цього разу відпочинок мутував у повноцінне R&D: я зробив мод для Project Zomboid, який перетворює гру на полігон для голосового AI-агента з тілом.
Розповідаю, як це влаштовано, які граблі зібрав — і до чого тут робототехніка.
Що вміє напарник
Project Zomboid — пісочниця про виживання в зомбі-апокаліпсисі: відкритий світ, лут, база, орди. Мультиплеєр з другом — це весело. Але мій друг тепер не потребує другого гравця:
- Чує і говорить у реальному часі. Я кажу в мікрофон — він відповідає голосом і діє. Без кнопок, без чату, без пауз на «обробку запиту».
- Ходить за мною з реальним pathfinding: біжить, коли відстає, крадеться, коли я крадуся.
- Прикриває. Зомбі підходять — сам вихоплює дробовик. Гризуть спину — стріляє впритул навіть без лінії зору.
- Лутає за проханням. «Сходи в той будинок, принеси аптечку» — маршрут, пошук, повернення, передача з рук у руки. Розуміє українські назви предметів: «візьми полуницю» працює.
- Їздить зі мною. Сам сідає на вільне пасажирське, виходить слідом, а на 80+ км/год просить пригальмувати. Прям все, як з друзями в реальному житті, ахаха!
- Пише на пейджер. Коли я задалеко (понад 15 клітин) — його голос тане до тиші, як у мультиплеєрному войс-чаті, і повідомлення приходять текстом на ігровий пейджер із біпом.
- Розуміє живу мову, а не команди. «Фас», «бери ружбайку», «дай простір» — у промпті зашита персона українського напарника-виживальника з мапою побутових фраз на інструменти. А скажеш «тебе тепер звати Макс» — імʼя над головою зміниться і збережеться в сейві.
Цей цікавий та експериментальний мод для гри Project Zomboid ми зібрали в парі з Fable 5 — новою моделлю Anthropic — лише за два вечори.
Навіщо: репетиція робототехніки
Чесна мотивація — не гра. Мені хотілося помацати можливості realtime-рушія OpenAI в ролі, для якої він, здається, і народжений: мозок сутності, що має тіло. Вухо, голос, набір мʼязів-інструментів, сенсори стану — і жодного прямого доступу до світу поза ними.
Гра для цього — ідеальний полігон. «Робот» у Project Zomboid коштує нуль гривень заліза, його не шкода віддати на розправу десятку зомбаків, а фізика, вороги й інвентар уже написані розробниками гри. Всі механіки взаємодії — ті самі, що будуть у реального робота в реальній симуляції, тобто реальному житті 🤭: сенсорика на вході, тули на виході, латентність посередині.
Про це — наприкінці. Спершу про саме цікаве: як це все працює!
Як влаштовано: три процеси і поштова скринька
Найцікавіше в архітектурі те, що Lua-двигун Project Zomboid (Kahlua) — це камера-одиночка: у Build 42 з нього вирізали HTTP, доступу до мікрофона немає, грати живий аудіопотік він не вміє. Єдине, що йому дозволено, — читати й писати файли.
Тому система живе у трьох процесах:
- Мод у грі (Lua) — тіло: рух, бій, лут, пейджер, і головне — реєстр 34 інструментів.
- Companion-застосунок (Node.js) — міст: читає з гри файлову «поштову скриньку» (
outbox.jsonl— статуси й події щосекунди), пише команди назад (inbox.lua), тримає HTTP-сервер для голосової сторінки. - Голосова сторінка в браузері — вухо й горло: WebRTC-канал напряму до OpenAI, мікрофон і динаміки. Companion лише мінтить їй ефемерний ключ.

Просторовий звук сторінка рахує сама: гра щосекунди шле дистанцію та координати, а браузер перетворює їх на гучність і стерео-панораму. Напарник ліворуч — голос ліворуч. Відійшов на пʼятнадцять клітин — тиша, і в хід іде пейджер. Дрібниця, а занурення робить більше, ніж будь-яка графіка.
Окремий детектив — кирилиця. Лексер Kahlua при завантаженні коду обрізає кожен символ до одного байта: «привіт» перетворювалось на ?@82VB. Довелось будувати три обхідні канали: видимі тексти — через ігрові файли перекладів, репліки голосу — окремим UTF-8-файлом, а українські назви предметів у командах — списком кодпоінтів із крихітним декодером у пісочниці. Тепер «візьми рюкзак» доїжджає до гри неушкодженим.
34 інструменти — і жодного рядка довільного коду
Ключове архітектурне рішення: модель не має доступу до коду гри взагалі. Все, що вона може, — викликати інструменти з реєстру: follow, guard_on, pickup, give, scout_ahead, enter_vehicle, retreat_to_me, rename — всього 34. Кожен тул — це описана для моделі функція з чіткими параметрами і чесним результатом виконання. Пісочниця в чистому вигляді.
При цьому рефлекси й рішення розділені за рівнями — як у живої істоти:
- Рефлекси — в Lua, безкоштовні й миттєві. Зомбі впритул або перший укус — зброя вихоплюється сама, без жодного звертання до моделі. Слідування, кайтинг від близьких зомбі, «прицільна хода» повз далеких — усе це ігрова логіка.
- Рішення — за моделлю. Куди йти, що лутати, коли відступити, що сказати і як відреагувати на «фас» — це вже function calling у реальному часі.
Це не просто красива аналогія — це та сама архітектура, за якою будують реальних роботів: низькорівневі контури стабілізації працюють на борту, а високорівневі рішення ухвалює «мозок» через обмежений набір актуаторів.
І тут була найповчальніша грабля експерименту. Стара модель gpt-realtime з 34 інструментами просто не справлялась — плуталась і губила виклики. Апгрейд на gpt-realtime-2.1 зі 128K контексту вирішив усе без зрізання функціональності. А ще Realtime-API має підступ: інструменти треба вшивати при створенні сесії — «досипати» їх пізніше не вийде, запит тихо ігнорується, і модель починає голосом відігравати виконання команд, нічого насправді не роблячи. Театр одного актора.
Граблі, які запамʼятались під час створення моду
Шлях від ідеї до робочого напарника — це пʼять переписувань архітектури за два вечори. Найяскравіше:
- Приручений зомбі. Перша версія робила напарника зі справжнього зомбі: придушуємо агресію, лагодимо вигляд на людський. Працювало — поки я не зберігся. Після завантаження двигун повертав його у світ ворожим зомбі: усі runtime-прапори «приручення» жили лише в памʼяті. Братанчик, який після перезапуску хоче тебе зʼїсти, — так собі братанчик.
- Людина-невидимка. Друга спроба — чесний ігровий персонаж — уперлась у рендер Build 42: двигун малює гравця, тільки якщо це локальний гравець. Імʼя над головою бігає, тіла нема. Обійти з Lua неможливо — врятував міст на Java-рівні від сусіднього мода-хелпера.
- Емерджентний пацифізм. Якось модель сама вирішила сховати зброю — «щоб не шуміти». Цей стан записався в сейв. На наступному завантаженні беззбройного напарника тихо зʼїли за кадром. Після цього в промпті зʼявились залізні правила, у коді — інстинкт самозбереження, а смерть перестала бути мовчазною: «мене завалили… але я оклигав» — після чого AI-друг просто респавнився поруч.
- Футбольний коментатор. Перша версія «відчуттів» коментувала кожного застреленого зомбі окремою реплікою. Три шари фільтрів — бойові епізоди з гістерезисом, кулдауни на тип події, стильове правило «буденне — одне слово» — перетворили коментатора на небагатослівного напарника.
Цифри експерименту
- 34 інструменти — весь інтерфейс моделі до світу;
- 2 вечори — близько 6 годин — від ідеї до голосового напарника, пʼять архітектур поспіль;
- 3 процеси — гра, Node-міст, браузер із WebRTC;
- ~$0.3–0.7 за годину активної гри з розмовами (тарифікація: ~$0.02/хв мого голосу, ~$0.08/хв його відповідей);
- ~$10 — увесь білінг: близько шести годин гри з напарником плюс усі тести під час розробки;
- 0 рядків довільного коду, доступного моделі.
Від зомбі до ESP32
А тепер головна думка, заради якої все й затівалось.
Подивіться на цього напарника як на специфікацію робота. Вухо — мікрофон. Голос — динамік. Сенсори — статус щосекунди: координати, дистанція, здоровʼя, кількість ворогів. Актуатори — 34 інструменти: іди, стій, візьми, віддай, сядь у машину. Мозок — realtime-модель, яка все це звʼязує живою розмовою.
Тепер замініть Lua-мод на прошивку: замість follow — «крути колеса на ціль», замість pickup — «стисни клешні», замість статусу з гри — телеметрія з датчиків, а замість “стріляй” — ну, скажімо, “полий помідори”. Мозок, протокол, персона, вся логіка «рефлекси на борту — рішення в моделі» — лишаються без змін. ESP32 та Arduino вже лежать у мене на столі. Бракує 3D-принтера для корпусів — він у планах, і тоді ці експерименти переїдуть із зомбі-апокаліпсиса на реальні колеса або робо-ноги.
Чесно позначу межу: робот на столі в мене поки не їздить — це візія. Але тепер вона підкріплена робочим прототипом мозку, а не фантазією. Про те, як агенти вже змінили саму розробку, я писав у статті про вайбкодінг — це та сама лінія: модель + чіткий набір інструментів + людина, яка ставить задачу.
Чесно про обмеження
- Безсмертя як механіка. Напарник не вмирає назавжди — «оклигує». Це свідомий вибір: це друг, а не ресурс.
- Лут «магічний»: бере речі в радіусі шести клітин без анімації підходу до конкретної полиці. Компроміс заради надійності.
- Тільки сінглплеєр. Мультиплеєр — зовсім інша архітектура.
- Мод я не публікуватиму. Він тримається на двох сторонніх альфа-модах з Java-патчами, вимагає ключа OpenAI у плейнтексті й був задуманий як приватний експеримент, а не продукт. Ця стаття — і є його реліз.
Підсумок
Найдешевший спосіб навчитися керувати роботом — дати моделі тіло у грі. Шість годин розробки, шість годин гри, нуль заліза і ~$10 білінгу OpenAI — і в тебе на руках перевірена архітектура: сенсори на вході, пісочниця інструментів на виході, рефлекси окремо від рішень, голос як інтерфейс. Гра закінчиться — архітектура залишиться.
А якщо вашому бізнесу потрібен такий «напарник» без дробовика, але з бухгалтерією та логістикою — агент, який чує задачу людською мовою і виконує її через чіткий набір інструментів у ваших системах, — подивіться на послугу AI-агенти та чат-боти або просто напишіть мені. Полігон та навчання ми з моїм AI-напарником вже пройшли =)