
Как устроен Nexus
Плоская сложность
Классический подход к играм строится вокруг жёстких систем: каждая механика - отдельный код, каждая связь между механиками - ещё один код. Даже песочницы остаются набором отдельных систем. Разнообразие растёт, но архитектура не меняется - и сложность разработки растёт вместе с ней.
Nexus устроен иначе. Базовые элементы игры - атомы, из которых строится всё остальное. Добавление новых механик не увеличивает архитектурную сложность.
Миллионы элементов, но архитектура от этого не усложняется. Система масштабируется - к механикам, правилам и мирам любой сложности.
Семантическая сеть
Nexus хранит данные как триплеты (факты) - простые утверждения формата "субъект → предикат → объект". В одном формате описываются и факты о мире, и правила механик:
- Яблоко → является → съедобным (факт о мире)
- Олень → является → травоядным (факт о мире)
- Удар → наносит урон → 6 (правило механики)
- Яд → игнорирует броню → да (модификация правила)
- Трава → растёт → при влажности выше определённого уровня (факт о мире)
- Синдикат → контролирует → район города (факт о мире)
Данные и правила записываются в одном формате, в одном графе. Через триплеты описывается всё: объекты, свойства, состояния, отношения, действия, технологии, магия. Это главное отличие от классических подходов, где данные и логика живут отдельно.
Мир стоит на большом количестве фактов: животные, технологии, предметы, постройки, исторические события - от общих принципов до конкретных деталей.
Интерпретатор
Интерпретатор обрабатывает триплеты и выводит следствия из фактов:
- Яблоко → является → фруктом
- Человек → может есть → фрукты
- Вывод: человек может есть яблоки
Вывод строится сопоставлением фактов. Цепочки могут быть длинными. Вот пример посложнее:
- Гоблин → является → существом
- Существо → имеет → здоровье
- Вывод: у гоблина есть здоровье
- Удар → наносит → урон
- Урон → снижает → здоровье
- Вывод: удар может нанести вред гоблину
Добавили яд с предикатом урона - он автоматически работает против всех, у кого есть здоровье.
Интерпретатор работает с формализованными запросами, не с естественным языком.
Граф знаний
Объекты и свойства мира нужно описывать гибко, без хардкода.
В основе - сущности: персонажи, предметы, животные, организации, корабли, растения. К каждой сущности привязываются факты через предикаты.
Каждый предикат выражает одну связь или одно свойство:
- "Является" (классификация: гоблин → существо)
- "Имеет" (владение: у существа есть здоровье)
- "Урон" (воздействие: удар наносит 6)
- "Стоимость" (расход: удар стоит 3 маны)
- "Поглощение" (защита: щит блокирует 5)
- "Отношение" (связь: гоблин ненавидит людей)
Удар имеет предикат Урон = 6. Щит имеет предикат Поглощение = 5. Движок выводит: 6 - 5 = 1 проходит в здоровье. Одна механика для любого источника урона и любой защиты - меч, яд, огонь, заклинание.
Свойства образуют сеть, где каждое звено - один факт. Правила и взаимодействия живут как данные, а не зашиты в код.
Для производительности используются кэширование, индексы и адаптивная детализация (LOD).
Правила как паттерны
Данные и логика - ещё не игра. Для геймплея нужен слой правил. В классической разработке правила - это код: каждая механика написана программистом. В Nexus правила описываются теми же триплетами, что и данные.
В основе - универсальные паттерны, общие для всех жанров. Воздействие: меч наносит урон здоровью, ржавчина - прочности, инфляция - покупательной способности. Расход: удар стоит маны, постройка - дерева, путешествие - топлива. Поглощение: щит блокирует урон, контраргумент - обвинение, страховка - убыток.
Дизайнер описывает что происходит, а не как. "Удар наносит 6 урона" - один триплет. Движок сам определяет: урон проходит через поглощение, остаток идёт в здоровье. Формула не пишется для каждого действия - она следует из паттерна.
Паттерны свободно сочетаются. Карточная игра использует воздействие и поглощение. Стратегия - расход и накопление. RPG - сочетает всё вместе.
Новая игра - это новые сущности и новые комбинации паттернов.
Агенты
Сущность может быть описана как агент - с собственным состоянием и правилами поведения. Это опциональное свойство. Враг в карточной игре сам выбирает действие. Дикари в стратегии атакуют, когда условия позволяют. Торговец в RPG перемещается между городами. Агент:
- Воспринимает мир в пределах своих знаний
- Оценивает доступные действия
- Принимает решения, опираясь на цели и правила мира
Агент описывается теми же триплетами, что и всё остальное. Кузнец знает ковать (факт), нужна руда (факт), руда в шахте (факт). Из этих фактов интерпретатор выводит действие: идти в шахту, добыть руду. Шахту затопило - кузнец не может добыть руду - ищет торговца - покупает. Поведение возникло из цепочки фактов.
Масштаб без потери логики
В глубокой симуляции мир может содержать огромное количество процессов: от миграции животных и роста городов до динамики звёздных систем. Пересчитывать всё невозможно и не нужно - игрок всегда воспринимает мир субъективно и в ограниченном объёме.
Мир организован как карта из хексов. Каждый хекс хранит свойства своего масштаба: на планетарном уровне - климат и ресурсы, на региональном - города и дороги. Клик по хексу раскрывает следующий уровень - внутри него новая карта с более детальными свойствами. Алгоритм един на всех уровнях - от звёздной системы до отдельного здания.
Время и пространство
Для длительных периодов система может использовать статистические модели вместо пошагового расчёта. Можно перемещаться во времени, не симулируя каждый момент. Например, за тысячу лет лес может вырасти или исчезнуть, река - сменить русло, поселение - разрастись или быть заброшенным. Тенденции и связи сохраняются.
Масштабирование пространства определяет уровень сущностей и процессов. При крупном масштабе - климат, миграции, политика. При локальном - отдельные сущности и их свойства. Логика причинно-следственных связей едина на всех уровнях.
Абстракции вмещают мир любого масштаба: деревню, планету, галактику. Детали появляются, когда становятся значимыми. Остальное описывается в упрощённом виде, но с сохранением связей.
Игрок может углубляться в устройство мира, изучая сущности и переходя по их свойствам - подобно навигации по справочной системе.
Материализация мира
Мир строится по мере исследования. Пока игрок не посетил локацию, она существует как данные и правила. Объекты появляются в момент взаимодействия, а не хранятся заранее.
За пределами наблюдения события определяет вероятность, а не полная симуляция. Мир выглядит целостным, хотя детали создаются по запросу.
После взаимодействия с локацией её состояние сохраняется и больше не пересчитывается.
На длинных отрезках времени работают статистические тенденции. Через тысячу лет после начала система решает по вероятности: какие виды выживут, как изменится климат, где появятся поселения.
Игра по сети
Сетевая игра работает на том же принципе. Сервер хранит данные, правила и то, что игроки уже обнаружили.
Если несколько игроков в одной области - сервер собирает общее состояние и синхронизирует его между ними.
Вне области игры мир остаётся потенциальным - правила и тенденции, без деталей.
Базовая сетевая архитектура уже работает: каждый игрок получает изолированную сессию, к которой другие могут присоединиться по коду. Действия синхронизируются в реальном времени.
Архитектура как язык
Данные, правила, интерфейс и поведение агентов - один формат. Сущности не знают друг о друге, связи возникают автоматически через общие предикаты.
Как это работает на практике? Лес - это сущность с фактами: имеет древесину, является укрытием, горюч. Топор имеет предикат Рубка. Рубка действует на древесину. Огонь действует на горючее. Засуха повышает горючесть. Каждый факт - одна строка. Лес не знает про топоры, топор не знает про лес. Связь возникает автоматически через общие предикаты. Добавили лазерный резак с предикатом Рубка - он работает против леса. Добавили планетарную бомбардировку с предикатом Огонь - лес горит.
Если игровую ситуацию можно описать словами - она работает в Nexus.
