Архітектура рушія Nexus

Як влаштований Nexus

Плоска складність

Класичний підхід до ігор будується навколо жорстких систем: кожна механіка - окремий код, кожен зв'язок між механіками - ще один код. Навіть пісочниці лишаються набором окремих систем. Різноманітність зростає, але архітектура не змінюється - і складність розробки зростає разом з нею.

Nexus влаштований інакше. Базові елементи гри - атоми, з яких будується все інше. Додавання нових механік не збільшує архітектурну складність.

Мільйони елементів, але архітектура від цього не ускладнюється. Система масштабується - до механік, правил і світів будь-якої складності.

Семантична мережа

Nexus зберігає дані як триплети (факти) - прості твердження формату "суб'єкт → предикат → об'єкт". В одному форматі описуються і факти про світ, і правила механік:

  • Яблуко → є → їстівним (факт про світ)
  • Олень → є → травоїдним (факт про світ)
  • Удар → завдає шкоди → 6 (правило механіки)
  • Отрута → ігнорує броню → так (модифікація правила)
  • Трава → росте → при вологості вище певного рівня (факт про світ)
  • Синдикат → контролює → район міста (факт про світ)

Дані і правила записуються в одному форматі, в одному графі. Через триплети описується все: об'єкти, властивості, стани, відносини, дії, технології, магія. Це головна відмінність від класичних підходів, де дані і логіка живуть окремо.

Світ стоїть на великій кількості фактів: тварини, технології, предмети, споруди, історичні події - від загальних принципів до конкретних деталей.

Інтерпретатор

Інтерпретатор обробляє триплети і виводить наслідки з фактів:

  • Яблуко → є → фруктом
  • Людина → може їсти → фрукти
  • Висновок: людина може їсти яблука

Висновок будується зіставленням фактів. Ланцюжки можуть бути довгими. Ось приклад складніший:

  • Гоблін → є → істотою
  • Істота → має → здоров'я
  • Висновок: у гобліна є здоров'я
  • Удар → завдає → шкоди
  • Шкода → знижує → здоров'я
  • Висновок: удар може зашкодити гоблінові

Додали отруту з предикатом шкоди - вона автоматично діє на всіх, у кого є здоров'я.

Інтерпретатор працює з формалізованими запитами, не з природною мовою.

Граф знань

Об'єкти і властивості світу потрібно описувати гнучко, без хардкоду.

В основі - сутності: персонажі, предмети, тварини, організації, кораблі, рослини. До кожної сутності прив'язуються факти через предикати.

Кожен предикат виражає один зв'язок або одну властивість:

  • "Є" (класифікація: гоблін → істота)
  • "Має" (володіння: у істоти є здоров'я)
  • "Шкода" (вплив: удар завдає 6)
  • "Вартість" (витрата: удар коштує 3 мани)
  • "Поглинання" (захист: щит блокує 5)
  • "Ставлення" (зв'язок: гоблін ненавидить людей)

Удар має предикат Шкода = 6. Щит має предикат Поглинання = 5. Рушій виводить: 6 - 5 = 1 проходить у здоров'я. Одна механіка для будь-якого джерела шкоди і будь-якого захисту - меч, отрута, вогонь, заклинання.

Властивості утворюють мережу, де кожна ланка - один факт. Правила і взаємодії живуть як дані, а не зашиті в код.

Для продуктивності використовуються кешування, індекси та адаптивна деталізація (LOD).

Правила як патерни

Дані і логіка - ще не гра. Для геймплею потрібен шар правил. У класичній розробці правила - це код: кожна механіка написана програмістом. У Nexus правила описуються тими ж триплетами, що й дані.

В основі - універсальні патерни, спільні для всіх жанрів. Вплив: меч завдає шкоди здоров'ю, іржа - міцності, інфляція - купівельній спроможності. Витрата: удар коштує мани, споруда - деревини, подорож - палива. Поглинання: щит блокує шкоду, контраргумент - звинувачення, страховка - збиток.

Дизайнер описує що відбувається, а не як. "Удар завдає 6 шкоди" - один триплет. Рушій сам визначає: шкода проходить через поглинання, залишок іде у здоров'я. Формула не пишеться для кожної дії - вона випливає з патерну.

Патерни вільно поєднуються. Карткова гра використовує вплив і поглинання. Стратегія - витрату і накопичення. RPG - поєднує все разом.

Нова гра - це нові сутності і нові комбінації патернів.

Агенти

Сутність може бути описана як агент - з власним станом і правилами поведінки. Це опціональна властивість. Ворог у картковій грі сам обирає дію. Дикуни у стратегії атакують, коли умови дозволяють. Торговець у RPG переміщується між містами. Агент:

  • Сприймає світ у межах своїх знань
  • Оцінює доступні дії
  • Приймає рішення, спираючись на цілі та правила світу

Агент описується тими ж триплетами, що й усе інше. Коваль знає кувати (факт), потрібна руда (факт), руда у шахті (факт). З цих фактів інтерпретатор виводить дію: іти до шахти, здобути руду. Шахту затопило - коваль не може здобути руду - шукає торговця - купує. Поведінка виникла з ланцюжка фактів.

Масштаб без втрати логіки

У глибокій симуляції світ може містити величезну кількість процесів: від міграції тварин і зростання міст до динаміки зоряних систем. Перераховувати все неможливо і непотрібно - гравець завжди сприймає світ суб'єктивно і в обмеженому обсязі.

Світ організований як карта з гексів. Кожен гекс зберігає властивості свого масштабу: на планетарному рівні - клімат і ресурси, на регіональному - міста і дороги. Клік по гексу розкриває наступний рівень - всередині нього нова карта з детальнішими властивостями. Алгоритм єдиний на всіх рівнях - від зоряної системи до окремої будівлі.

Час і простір

Для тривалих періодів система може використовувати статистичні моделі замість покрокового розрахунку. Можна переміщуватися у часі, не симулюючи кожен момент. Наприклад, за тисячу років ліс може вирости або зникнути, ріка - змінити русло, поселення - розростися або бути покинутим. Тенденції та зв'язки зберігаються.

Масштабування простору визначає рівень сутностей і процесів. При великому масштабі - клімат, міграції, політика. При локальному - окремі сутності та їхні властивості. Логіка причинно-наслідкових зв'язків єдина на всіх рівнях.

Абстракції вміщують світ будь-якого масштабу: село, планету, галактику. Деталі з'являються, коли стають значущими. Решта описується у спрощеному вигляді, але зі збереженням зв'язків.

Гравець може заглиблюватися в устрій світу, вивчаючи сутності і переходячи за їхніми властивостями - подібно до навігації по довідковій системі.

Матеріалізація світу

Світ будується в міру дослідження. Поки гравець не відвідав локацію, вона існує як дані і правила. Об'єкти з'являються у момент взаємодії, а не зберігаються заздалегідь.

Поза межами спостереження події визначає ймовірність, а не повна симуляція. Світ виглядає цілісним, хоча деталі створюються на запит.

Після взаємодії з локацією її стан зберігається і більше не перераховується.

На довгих відрізках часу працюють статистичні тенденції. Через тисячу років після початку система вирішує за ймовірністю: які види виживуть, як зміниться клімат, де з'являться поселення.

Гра по мережі

Мережева гра працює на тому ж принципі. Сервер зберігає дані, правила і те, що гравці вже виявили.

Якщо кілька гравців в одній області - сервер збирає спільний стан і синхронізує його між ними.

Поза областю гри світ залишається потенційним - правила і тенденції, без деталей.

Базова мережева архітектура вже працює: кожен гравець отримує ізольовану сесію, до якої інші можуть приєднатися за кодом. Дії синхронізуються у реальному часі.

Архітектура як мова

Дані, правила, інтерфейс і поведінка агентів - один формат. Сутності не знають одна про одну, зв'язки виникають автоматично через спільні предикати.

Як це працює на практиці? Ліс - це сутність з фактами: має деревину, є укриттям, горючий. Сокира має предикат Рубка. Рубка діє на деревину. Вогонь діє на горюче. Засуха підвищує горючість. Кожен факт - один рядок. Ліс не знає про сокири, сокира не знає про ліс. Зв'язок виникає автоматично через спільні предикати. Додали лазерний різак з предикатом Рубка - він працює проти лісу. Додали планетарне бомбардування з предикатом Вогонь - ліс горить.

Якщо ігрову ситуацію можна описати словами - вона працює у Nexus.