Endless GM v2
AI-керована текстова RPG з елементами візуальної новели, де велика мовна модель (LLM) виступає в ролі динамічного Game Master'а, генеруючи світ, сюжет та механічні наслідки в реальному часі.
Role
Lead Software Engineer & Systems Architect
Date
August 2025
Демо / Презентація








Архітектурна схема
Деталі реалізації
Виклик (The Challenge)
Інтеграція недетермінованих великих мовних моделей у суворе середовище ігрового рушія створює серйозні архітектурні виклики. Головними завданнями було збереження абсолютної цілісності ігрової логіки (унеможливлення впливу "галюцинацій" ШІ на HP чи інвентар), мінімізація споживання токенів при збереженні глибокої пам'яті NPC, а також безшовне завантаження згенерованих ШІ візуальних та аудіо асетів.
Архітектура та реалізація
- Подієво-орієнтоване ядро: Весь ігровий цикл побудований на слабко зв'язаній архітектурі
EventBus:IntentRouterнічого не знає проPromptBuilder, аGameStateManager— проAIService. Будь-який модуль можна замінити чи протестувати ізольовано, що критично за постійної еволюції ШІ-конвеєра. - Маршрутизація намірів та Пре-калькуляція: Введення гравця класифікується через
IntentRouter. Для збереження цілісності механік (Combat 2.0),CombatManagerрушія заздалегідь вираховує кидки кубиків та шкоду до виклику ШІ. LLM отримує суворі системні дані і виступає виключно як наративний форматувальник, що повністю ліквідує математичні помилки. - Reality Anchor — протокол чесності: Кожне повідомлення гравця потрапляє в промпт як неперевірене твердження, а не як скоєний факт. Єдині джерела істини — ігровий стан, дані локації та факти бази знань — це свідомо протидіє природній для LLM схильності погоджуватися з гравцем.
- Модульний конвеєр промптів: Централізований
PromptBuilderдинамічно збирає системні інструкції блоками, залежно від поточного ігрового стану, ієрархії локацій (система Breadcrumbs) та наміру гравця. Спеціальні режими повністю замінюють промпт:DirectCommandModeдля дебагу,SessionZeroдля створення персонажа таDyingStateдля рятівних кидків смерті. - Light RAG та Керування контекстом: Реалізовано локальний інвертований індекс (
TriggerIndexService). Замість надсилання всього лору до LLM, система динамічно ін'єктує лише релевантні дані на основі активних тегів, значно оптимізуючи використання токенів. - Мережа безпеки (Safety Net): Конвеєр оснащено
StreamingJsonParserі суворимResponseValidator, який діє як своєрідний "фаєрвол". Він блокує переміщення до несуміжних нод карти, відкидає шкоду по неіснуючих ворогах, відновлює пропущені візуальні/аудіо теги з ізольованого кешу сцени та публікує кожне перехоплення у вікно телеметрії редактора.
Результати та особливості
- Агностична ШІ-архітектура: Створено гнучкий сервіс з можливістю безшовного перемикання між хмарними (Gemini) та локальними (Ollama) провайдерами.
- Вкладена наративна архітектура: Розроблено систему, що дозволяє ШІ динамічно генерувати абстрактні "Наративні сцени" на льоту всередині жорстко заданих графових підземель.
- Хмарний стримінг асетів: Написано
AssetDownloadService, що підтягує запитані штучним інтелектом WebP-фони, портрети та музику з Cloudflare R2, уникаючи роздуття розміру клієнта. - Асинхронні фонові агенти: Спроєктовано мережу агентів (Archivist для агрегації пам'яті, MacroGM для симуляції світу, TravelCoordinator), які імітують живе середовище незалежно від дій гравця.
- Session Zero та жанрові модулі: Діалогове інтерв'ю створення персонажа (
SessionZero) формує героя, характеристики та стартове спорядження, а система жанрових модулів — економічні профілі, бойові правила, перейменування характеристик — тримає рушій готовим до сетингів за межами фентезі. - Професійні DevTools: Інтегровано системи телеметрії (
GameMasterDebugWindow, внутрішньоігровийDebugTerminal) для профілювання промптів у реальному часі та аудиту кешу RAG безпосередньо в Unity.
Основна філософія: Наративна інтеграція
Фундаментальний принцип Endless GM — максимальна свобода Гейм-Майстра. ШІ має абсолютне право адаптувати історію для забезпечення найвищого рівня занурення. Щоб це не руйнувало логіку гри, усе математичне навантаження (кидки кубиків, стат-чеки) перекладено на модулі попереднього розрахунку. Ці модулі працюють як "дорадчий шар": вони надають ГМ-у готову референсну математику (результати, шкоду, зони), але ГМ завжди має право змінити результат, накласти унікальні ефекти чи дозволити гравцеві серію атак, якщо це обґрунтовано наративно.
Розбір ключових механік (Deep Dive)
1. Вхідний пайплайн та Маршрутизація намірів (Intent Router)
Ввід гравця перехоплюється та аналізується системою маршрутизації (через Regex) для визначення наміру до формування промпту. Від використання самої LLM для попереднього аналізу відмовилися заради уникнення затримок та економії токенів. Окремий режим MetaQuestion відповідає на питання про правила, не змінюючи ігрового стану.
- Яку проблему вирішує: Попередній аналіз не лише економить токени, але й зберігає фокус основної моделі, не розмиваючи її увагу непотрібними інструкціями. У разі перетину намірів (наприклад, спроба торгувати під час ініціації бою), модульна архітектура вирішує конфлікт на основі пріоритетів (бойові правила перекривають інші). Це гарантує, що ШІ концентрується на найважливішій події.
2. Сліпий Пре-ролл та Combat 2.0 (Движок до ШІ) Рушій заздалегідь розраховує бойові зони, базову шкоду, витратні матеріали, статус-ефекти та DOT-ефекти (отрута, горіння) до запиту до ШІ. Отримавши ці дані, ШІ перетворює їх на текст і має право додавати AoE-шкоду, бафи або скасовувати ефекти. Кубики теж кидаються до запиту: "сліпий пре-ролл" передає сирі результати d20 і модифікатори системним текстом — числа первинні, наратив вторинний.
- Яку проблему вирішує: Нездатність LLM тримати суворий числовий стан компенсується прекалькуляцією рушія. Крім того, усі ходи ворогів та союзників об'єднуються в один спільний батч-запит. Це не лише колосально економить токени, але й кардинально покращує UX: замість нудного натискання "далі" для спостереження за ходом кожного NPC, гравець отримує динамічний, кінематографічний опис бою. ШІ може описувати скоординовані атаки юрби або одночасні дії, перетворюючи механічну покроковість на живий наратив.
- Тактика без сітки: Легка модель Zone (Melee / Ranged / Out Of Sight) × Formation (Front / Flank / Rear / Isolated) задає правила позиціонування — reach-зброя, захищений тил, вразливість флангів — за мізерну частку ціни повної тактичної сітки в контексті.
- Двофазний протокол SmartAmmo: Рушій перевіряє боєзапас у режимі лише читання під час збірки промпту і списує його тільки після відповіді — після перевірки, що ШІ вже не списав його через inventory updates. Це усуває конфлікти подвійного запису між ШІ та рушієм.
- Ready Actions як вільні рядки: "Коли звір стрибне — я б'ю" зберігається дослівно. Рушій свідомо не інтерпретує умову спрацювання — це вирішує ШІ, тож механіка залишається нескінченно гнучкою.
- TraumaCap: Важкі поранення знижують стелю зцілення, тож одне зілля не відміняє наслідків бою на межі смерті — бої лишають довгострокові наслідки.
3. Reality Anchor — Протокол чесності (Анти-чит) Головне правило кожного промпту: текст гравця — це завжди неперевірене твердження. ШІ суворо спирається лише на наданий контекст (інвентар, стани, навколишні об'єкти). Якщо гравець намагається вигадати предмет з повітря (наприклад, дістати неіснуючий меч), ШІ вплітає невдачу в наратив.
- Яку проблему вирішує: LLM від природи схильні погоджуватися і їх легко обдурити. Завдяки жорсткій прив'язці до стану рушія шахрайство стає наративно неможливим. Для наполегливих "джейлбрейкерів" передбачено режим метарозмови, де ШІ ламає "четверту стіну" і, як справжній ГМ, зупиняє симуляцію з проханням припинити порушувати правила відіграшу.
4. Light RAG — Детермінований пошук знань
Лор подається на трьох рівнях: базові факти завжди в контексті; короткі зведення про NPC та локації ін'єктуються при тригерах; повні профілі — лише при прямій взаємодії. TriggerIndexService використовує інвертований індекс тегів.
- Яку проблему вирішує: Від класичного RAG (Vector DB + Embeddings) відмовилися, оскільки він занадто важкий для локального виконання (з прицілом на майбутні мобільні пристрої). До того ж класичний RAG часто підтягує семантично схожу, але нерелевантну інформацію, розмиваючи контекст. Пошук за тегами гарантує строгу детермінованість: якщо об'єкт не присутній у сцені, його дані не потраплять до промпту.
6. Мирова симуляція (MacroGM) Окремий фоновий агент, що працює паралельно з грою. Кожного ігрового дня він поширює чутки, генерує події та переміщує NPC світом.
- Яку проблему вирішує: Створює ефект "живого світу", що розвивається незалежно від дій гравця. Використання окремої легкої моделі (flash-lite) для цих завдань дозволяє досягти глибокої симуляції без суттєвих витрат на API.
7. Навігація та Ін'єкція стану сцени (Travel Pipeline) Інтер'єри діляться на два типи: Данжі — це жорсткі графи кімнат, а Наративні сцени (райони міста, таверни) генеруються ШІ на льоту як вкладені простори. На відміну від глобального лору, локальний стан сцени (всі об'єкти, NPC та предмети взаємодії у поточній кімнаті) завантажується повністю (hard-fetched) у промпт без використання RAG.
- Яку проблему вирішує: Гравці часто вводять короткі односкладові запити, через які RAG не зміг би підтягнути об'єкти кімнати. Повна ін'єкція сцени гарантує, що ШІ точно знає оточення, усуваючи просторову амнезію. З лімітом у 1 млн токенів одна сцена ніколи не переповнює контекст. Щоб уникнути перевантаження з часом, дані об'єктів періодично переглядаються, об'єднуються в історичні зведення або стискаються, економлячи токени непомітно для користувача.
8. Цілісність даних — закриті словники та шаблонні характеристики
ItemData не зберігає сирих чисел: усі характеристики обчислюються з централізованого конфіга за iconCategory предмета. ШІ емітує лише категорію іконки та тег рідкості (AuraTag) — і цей єдиний тег керує й механічними бонусами, і візуальною аурою в UI: одне джерело істини. Категорії іконок — строго закритий список; виснажений перк деактивується зі статусною нотаткою замість видалення (зберігається історія для відновлення); екіпіровка посеред бою відкладається до endCombat, щоб ШІ міг наративно обіграти ціну цієї дії.
- Яку проблему вирішує: Кожне обмеження звужує ступені свободи ШІ до безпечної множини. Закриті словники не дають моделі вигадувати категорії предметів, шаблонні характеристики виключають псування сейвів і дозволяють централізовано налаштовувати баланс, а відкладена екіпіровка тримає бойовий стан детермінованим.
9. Адаптивна економіка Ціни ніколи не хардкодяться: рушій передає якірні ціни, помножені на базовий множник локації та активні ринкові сигнали — облога потроює ціни на їжу, карантин здорожує витратники, багатий урожай здешевлює провізію. Фінальну ціну ШІ називає вже в наративі.
- Яку проблему вирішує: Відсутність статичних цін дозволяє світовим подіям перекроювати торгівлю без міграцій даних — а жанрові модулі можуть перейменувати саму валюту.
10. Однопрохідне виконання та Впорядкований JSON CoT Спочатку архітектура передбачала використання двох окремих викликів LLM: перший обробляв ігрові правила та технічні наслідки, а другий писав наратив на основі цих висновків. Щоб усунути високу затримку та подвійну вартість API, систему було перероблено на однопрохідну генерацію JSON.
- Яку проблему вирішує: ШІ змушений віддавати відповідь у суворій JSON-структурі, де технічні блоки (зміни стану, логіка, результати) заповнюються першими, а блок з художнім наративом — останнім. Таким чином, технічні поля працюють як "ланцюжок роздумів" (Chain of Thought). Це гарантує, що наратив завжди ідеально узгоджений з технічними рішеннями, зберігаючи повний контекст та якість двомодельної системи, але працюючи вдвічі швидше та дешевше.
Що далі
Regex-евристики намірів планується замінити ML-класифікацією на пристрої (Unity Sentis), у готовий GenreModuleRegistry під'єднаються нові жанрові модулі (кіберпанк, постапокаліпсис, космічний горор), а стосунки компаньйонів отримають граф етапів — Знайомі → Друзі → Союзники.