Dual Universe: Сценарии LUA и Распределённые Вычислительные Устройства
Этот девблог был написан ещё осенью 2015 года и рассказывает об одной из ключевых особенностей Dual Universe — возможности определять поведение объектов максимально гибким образом. Текст рассчитан на то, что у вас уже есть некоторые базовые познания в программировании. В противном случае некоторые части могут показаться запутанными или сложными для понимания. Тем не менее тема очень важная и интересная.

Важные новости! Мы только что закончили проектирование и реализацию одной из ключевых особенностей Dual Universe: возможности описывать сценарии поведения любой созданной вами конструкции. “Конструкция” — любой объект, который игрок строит в игре. Это может быть корабль, здание, космическая станция, всё что угодно. Это физический объект, он может двигаться, сталкиваться с предметами и включать в себя сотни “Элементов” — операционных блоков, которые можно произвести или купить, а затем свободно разместить в вашей конструкции, чтобы добавить ей больше функциональности. Примеры Элементов: силовые установки, блоки управления (компьютеры), двери, вооружение, аккумуляторы, контейнеры, акселерометры, радары, системы наведения, отсеки для дронов, лифты и многое другое. Конструкция будет дирижировать всеми этими Элементами с помощью сценариев, исполняемых “Распределёнными Вычислительными Устройствами” (РВУ; Distributed Processing Units, DPUs). Давайте разберёмся, что они из себя представляют и как работают.

Эта заметка получилась длиннее и сложнее чем обычно, но я надеюсь, что люди, интересующиеся предметом, найдут её интересной. В любом случае, важно понимать, что для того, чтобы купить корабль и летать на нём, вам совершенно не нужны познания в написании сценариев или конструировании кораблей. На самом деле, если не хочется, вам совершенно необязательно вообще иметь корабль. В игре хватает занятий помимо этого. В какой-то степени это похоже на то, как обстоят дела в реальной жизни: чтобы управлять собственным автомобилем, не нужно быть механиком, ну а некоторые люди вообще никогда не садились за руль, они предпочитают такси. В итоге всё зависит от вашего стиля игры и ваших же ожиданий.
Но если вам интересно возведение конструкций и описание сценариев их поведения, то, надеюсь, вы не разочаруетесь глубиной игрового опыта, которую мы предлагаем.

Для начала давайте ещё раз повторим, что такое “конструкция” в терминах Dual Universe. В игре вы можете соединять куски материалов (камень, дерево, железо, кевлар и т.д.) как вам нравится, это чем-то похоже на Майнкрафт. Только вместо простых кубов вы сможете создать практически любую форму. Мы называем эту технологию “Dual Contouring”, она позволяет построить как корпус космического корабля, так и стены замка или гигантскую статую. Всё, что захотите. Далее к этому структурному скелету можно подсоединить дополнительные компоненты, называемые нами “Элементами”, которые по сути обеспечивают взаимодействие с конструкцией, делают её рабочей. В космическом корабле необходимо установить двигатели, баки, средства навигации, одну или несколько кабин и так далее. Всё это Элементы. Множество всех форм и Элементов образует конструкцию. Её можно двигать, на неё действуют законы физики (например, она будет падать, попав в гравитационное поле). Конструкцией можно владеть, торговать, она может быть скопирована. Но это уже другая история, которую мы обсудим в один из следующих раз. А сейчас сконцентрируемся на одном конкретном аспекте: как заставить все Элементы конструкции взаимодействовать между собой. Рассмотрим мы его на примере космического корабля, потому что это позволяет хорошо разобраться в том, как устроен данный концепт. Но всё, что мы дальше обсудим, может быть применено к любой конструкции, включая, например, гигантского робота — макаронного монстра.

В контексте геймдизайна мы могли бы ограничиться простым подходом: проверить, что на корабле достаточно двигателей, направленных в нужную сторону (и неважно, где они расположены), что есть остальное необходимое оборудование, и вот уже магическим образом ваш корабль летает. С таким подходом все корабли будут летать одинаково. Попытка изменить расположение или количество двигателей практически ничего не даст. Реализация навигационного компьютера будет исключительной возможностью инженеров из Novaquark. Придумать новый способ полёта на корабле? Невозможно. А что же с дронами? Что с системой вооружения? При таком подходе всё это будет заранее определено и по большей части одинаково от игрока к игроку. И это не то, как мы видим Dual Universe. И хоть мы и снабдим игроков базовыми шаблонами, с которых можно начать, у них будет возможность создать конструкцию, отвечающую их потребностям. Двигатели в игре настоящие (они физически толкают корабль в том месте, где находятся, и с той силой, которая у них есть), гравитация настоящая, пушкам нужно поворачиваться и целиться (что в свою очередь требует системы прицеливания). Если вы умнее остальных, у вас получится всё организовать лучше, выжать из корабля максимум в битве… или в торговле, выпустив на рынок новый Falcon X-42 Superfighter и изменив тем самым баланс на поле боя новыми тактиками и возможностями. Так что речь идет не только о том, как использовать предопределённые возможности кораблей в рамках классического подхода, но и о возможности изменять сами эти возможности. Мы называем это непредсказуемым геймплеем.

Любой Элемент — это активный объект. Он может делать две вещи: генерировать “события” и выполнять “функции”. Например, радар генерирует событие “новый враг в координатах (x, y, z)”, реактивный двигатель может выполнить функцию “установить уровень мощности на уровень 45%”, вооружение может выполнять функцию “стрелять” и так далее. Технически и события, и функции описываются похожим образом: имя, после которого в скобках идут параметры. Приведённые выше примеры будут выглядеть примерно так:

enemyAt(x,y,z)
setPower(45)
fire()

События генерируются Элементом сами по себе, когда происходит событие, на которое он должен реагировать, а функции — это то, что Элемент может сделать в случае, когда какой-то внешний Элемент “попросит” об этом. Когда мы говорим об Элементе с точки зрения геймплея, нам достаточно знать список вызываемых им событий и выполняемых им функций. Именно этот список мы называем “типом” Элемента.

Как же организовать взаимодействие между несколькими Элементами, каждый из которых генерирует события и реагирует на них, выполняя какие-то функции? Тут на сцену выходит главный герой нашего повествования, Распределённое Вычислительное Устройство (Distributed Processing Units, DPUs), коротко РВУ. РВУ — это что-то вроде компьютерной программы, дирижирующей всеми подключенными к ней Элементами. У РВУ есть несколько разъёмов, к которым можно подключать Элементы, и список обработчиков событий, которые умеют реагировать на события, сгенерированные подключенными к РВУ Элементами. Всё это представлено на схеме ниже.

Dual Universe: Сценарии LUA и Распределённые Вычислительные Устройства
Концепция обработчиков событий очень проста: они работают по принципу “условие => действие”. На входе у них есть фильтр, представляющий из себя сигнатуру события — своего рода обобщённое событие, у которого часть параметров задана, а остальные могут принимать любые значения. Когда Элемент генерирует какое-то событие, оно проверяется на соответствие всем обработчикам событий. Если событие соответствует сигнатуре обработчика, оно будет исполнено.

Пример. Предположим, что для разъёма, к которому подключен радар, у нас есть фильтр ‘enemyAt(x, 42, y)’. И вот радар генерирует событие ‘enemyAt(11, 42, 66)’. Это событие подходит под сигнатуру, поэтому соответствующий обработчик будет выполнен. Если же радар генерирует событие ‘enemyAt(11, 13, 66)’, то обработчик не будет исполнен, так как это событие не соответствует сигнатуре (потому что 13 не равно 42). В графическом виде этот пример представлен на схеме.

Dual Universe: Сценарии LUA и Распределённые Вычислительные Устройства
Кроме фильтра в обработчик входит и действие, которое будет выполнено в случае, если событие соответствует сигнатуре этого фильтра. Именно в этот момент на сцену выходит LUA, потому что это действие являет собой ни что иное, как кусок кода LUA, очень простого и эффективного языка сценариев, по которому в интернете существует гигантское количество руководств. Начать вы можете вот с этого.

И какой же код можно будет написать в качестве такого действия? В целом любой. Ну и как вы могли догадаться, он непременно будет содержать вызовы функций, предоставляемых подключенными к РВУ Элементами. Синтаксис будет примерно таким: “self.engine2.setPower(42)”. Синтаксис языка в данном случае требует начинать с “self”, далее идёт название разъёма, а за ним название функции, предоставляемой Элементом, и в скобках параметры этой функции.

Вот и всё. Теперь вы знаете основы того, что такое РВУ, и как устроено написание сценариев. Давайте подведём итоги: РВУ — это управляющий Элемент, у него есть несколько разъёмов для подключения Элементов. Кроме того, РВУ позволяет задать список обработчиков событий, предназначенных для того, чтобы перехватывать события, генерируемые подключёнными Элементами, и реагировать на них, выполняя LUA код, в котором помимо прочего есть вызовы функций, предоставляемых подключёнными Элементами.

Здесь нужно кое-что прояснить. Я говорю о настройке РВУ, но что такое, собственно, это самое РВУ? Где оно располагается? На самом деле РВУ, который можно настраивать, находится внутри специального Элемента, который мы называем Управляющим Устройством (УУ; Control Unit). Включение РВУ происходит в тот момент, когда вы активируете УУ (физически подходите к нему и нажимаете клавишу активации). Обратите внимание, что ничего не мешает в одной конструкции одновременно находиться и даже работать сразу нескольким УУ (а значит, и РВУ).

Отличие РВУ, установленного в УУ, от остальных в том, что у вас будет специальный интерфейс, который позволит его настраивать (подключать разнообразные Элементы в слоты, создавать обработчики событий и так далее). На самом деле вы можете даже больше: есть возможность объявлять события, которые будет генерировать само РВУ (для этого есть специальная LUA-команда). Аналогично можно определять и функции, которые может выполнять данное РВУ, задавая выполняемый ими код. И тут мы вспоминаем об изначальном определении Элемента как набора генерируемых событий и выполняемых функций. Действительно — внутри каждого Элемента есть своё РВУ (правда, не имеющее возможности настройки), а события и функции этого Элемента на самом деле являются событиями и функциями его РВУ. Это означает, что в разъёмы на самом деле вы подключаете не Элементы, а другие РВУ. И это могут быть не только РВУ Элементов, но и более общие или абстрактные РВУ. Поговорим об этом немного подробнее.

Один из действительно важных примеров абстрактного РВУ является системное РВУ. Оно отвечает за генерацию событий от нажатия клавиш на клавиатуре. Возможность управлять поведением конструкции (например, корабля) нужна почти всегда, а значит, почти всегда системное РВУ будет подключено в один из разъёмов. В свою очередь это означает, что в вашем настроенном РВУ скорее всего будет несколько обработчиков событий от системного РВУ, которое помимо уже перечисленного, отвечает ещё и за работу таймеров и другую полезную функциональность.

Полученных в этой заметке знаний уже достаточно для того, чтобы сделать простую систему управления кораблём. На корабле вам понадобится по крайней мере одно Управляющее Устройство, РВУ которого вы будете настраивать. К нему необходимо будет подключить системное РВУ, минимум три двигателя, направленных вниз для того, чтобы держать корабль в воздухе, и ещё два сзади для движения вперёд. Ещё вам понадобится измеритель угла наклона — Элемент, предоставляющий две функции: getPinch (тангаж) и getRoll (крен), позволяющие определить положение корабля в пространстве. С помощью системного РВУ вы задаёте таймер (вызываете функцию system.setTimer(0.1), устанавливающую таймер на срабатывание каждую десятую секунды) и устанавливаете обработчик соответствующего этому таймеру события. В обработчике вы описываете сценарий, который запрашивает данные о положении корабля и корректирует величину тяги двигателей в зависимости от этого. Ну и конечно же, вам понадобится добавить обработчики событий нажатия на клавиши для того, чтобы изменять направление движения корабля в соответствии с этими нажатиями. Конкретная реализация этого примера выходит за рамки данной заметки, но требует понимания простейшей ньютоновской физики в контексте вращающих моментов и физических воздействий.

Получившийся РВУ можно рассматривать как “черный ящик”, “стабилизатор”, имеющий 7 разъёмов (5 двигателей, гироскоп и системное РВУ). Этот черный ящик может быть перенесён в так называемое компонентное РВУ, которое можно продать или обменять. После этого игроки, у которых есть ваш стабилизатор, смогут подключить его к своему РВУ Управляющего Устройства (наравне с другими Элементами), а потом подключить к этому стабилизатору необходимые Элементы, используя или удобный графический интерфейс, или систему автоматической конфигурации. Тем самым для тех, кто не собирается писать свой код, процесс создания сценариев поведения корабля становится предельно простым:

Dual Universe: Сценарии LUA и Распределённые Вычислительные Устройства
Вся эта система РВУ не ограничивается простейшим примером стабилизации корабля. Управление вооружением (причем, как в режиме от первого лица в истребителе, так и в тактическом режиме управления линкором) происходит с помощью РВУ. Программирование дронов происходит с использованием РВУ. Автоматические системы защиты в замке тоже реализуются с помощью РВУ. Как и любая другая активность, предполагающая организацию взаимодействия между различными Элементами и компонентными РВУ через сценарии LUA, реализующие реакцию на события. При этом через сценарии можно взаимодействовать и с пользовательским интерфейсом, определяя, что происходит при активации Управляющего Устройства и как Элементы будут отображать и позволять изменять своё собственное состояние и параметры (мы, возможно, обсудим это в одной из последующих статей в блоге для разработчиков).

Novaquark, безусловно, снабдит игроков набором полезных “стартовых” компонентных РВУ и системой автоконфигурирования, которая поможет в большинстве простых случаев. Так что заставить корабль летать получится и без понимания, что такое РВУ. Однако, в случае если вам действительно интересен этот аспект игры, вы сможете использовать всю мощь РВУ для создания потрясающих систем управления и гениальных устройств, которые “взорвут” рынки, для победы в войнах и для того, чтобы войти в историю Dual Universe как величайший изобретатель или инженер!

JC Baillie,
руководитель проекта.

16 комментариев

avatar
Шикарно. Уж и не знаю почему, но мне это оказалось намного интереснее чем всякие «безграничные пространства».
  • 0
avatar
Мне очень понравилась система, и я понимаю, что она распространяется намного дальше кораблей. Нафантазировать здесь можно очень многое. Причем, когда я говорю «нафантазировать», я имею в виду «реализовать в игре». Даже то, о чем, думаю, разработчики и не предполагали. Это большой вызов, но и большой шаг вперед.

Меня смущает только одно. Если в определенном направлении (в данном случае — скриптование) происходит такой шаг вперед (и вглубь), это автоматически за собой тянет необходимость такой же глубокой проработки других видов игровой деятельности и проявления других специальных навыков человека. На самом деле, неважно — речь идет о программировании или, скажем, о навыках в создании композиции. Упор на одну деятельность подсвечивает роль людей с определенными навыками.

Это отчасти то, в чем упрекали в контексте ММО обладателей развитых социальных навыков. Мол, они получают преимущество. Но это как раз то исключение, которое я готов всячески поддерживать в плане лидирующей роли в игровой концепции. И вот почему. Социальные навыки — универсальный инструмент, которым в той или иной степени обладает любой человек. Просто по факту того, что он живет и общается с другими. И MMO в этом смысле — такое же пространство социализации, как реальная жизнь. Умение общаться, уживаться, вести за собой, поддерживать кого-то — универсальные умения.

Повторюсь — мне безумно нравится концепция РВУ и всей этой модульности. После нее многие механики «современных MMO» выглядят, прямо скажем, детскими. И мне обязательно захочется ее использовать. Но если одна из игровых активностей будет настолько проработанной и глубокой, не будут ли другие казаться на ее фоне в рамках игры «детскими»? А если их приводить к такому же виду, хватит ли ресурсов на реализацию? Это единственно опасение. Не хочется, чтобы на DU навис ярлык «MMO для программистов». :) Хочется, чтобы это действительно был разнообразный и сбалансированный мир.
Комментарий отредактирован 2016-08-06 11:16:02 пользователем Atron
  • 0
avatar
Ты это рассматриваешь, как полноценную игровую механику. Мне же по имеющейся информации приходит на ум редактор уровней в Neverwinter. То есть, да — конструктор для увлеченных людей, но это совершенно не та механика, которая должна чем-то теснить механики «детские».
  • 0
avatar
Я вижу это как основу крафта. Потому что «товаром» будут собранные конструкции или хотя бы заскриптованные модули.
  • 0
avatar
Не знаю. Больше похоже, что разработчики просто перекладывают свои функции по созданию кораблей на игроков. И на игру это все не похоже. На конструктор вот похоже. А игроки уже будут ставить на поток решения этих энтузиастов. И вот на этой линии поступления чертежа на рынок и началом производства по нему готового продукта и лежит пропасть между игрой и набором инструментов для энтузиастов.
  • 0
avatar
Я лично не вижу в этом не чего плохого) Тут же опять таки просто так создавать то не получится, нужны будут наверняка ресурсы. Производственные мощи. А там сферы влияния за эти ресурсы. В полне возможно логистика доставки и так далее. С чем согласен с Атроном что бы главное это РВУ не стало единственной фишкой игры. А то кроме что скрипты писать будет мало отличатся от обычных выживалок.
  • 0
avatar
Если в определенном направлении (в данном случае — скриптование) происходит такой шаг вперед (и вглубь), это автоматически за собой тянет необходимость такой же глубокой проработки других видов игровой деятельности и проявления других специальных навыков человека.
Может быть, это и есть «глубокая проработка других видов игровой деятельности»? До сих пор в играх был частый упор на боевые рефлексы. И в тот же список можно отнести и «исключение» в виде развитости социальных навыков. И тогда обсуждаемое — уже, как минимум, третье.

Хотя в целом с опасениями согласен.
  • 0
avatar
Возможно в статье специально сделано упрощённое описание, но читая её ловлю себя на мысли, что им нужен разработчик апи в команду.
По моему всё просто, много хороших примеров реализации апи, сделать это как положено в программировании и стать творцами нового игрового опыта.
  • 0
avatar
В статье специально сделано описание на пальцах, да.
  • 0
avatar
А что ты имеешь вижу под API для DU? Что бы можно было с телефона посмотреть что творится с твоей станцией?)Или что то глубже?) Просто я считаю что даже как оно и есть сейчас будет не плохо) Все же то же программист))
  • 0
avatar
Дело не в функционале, а в структуре и глубине проникновения апи.
Телефон далеко не единственный способ использования.
Я например мечтаю легально написать скрипт для фабрики по добычи и переработки чего нибуть. Сейчас пишу не легально в еве, но возня с банами уже утомила.
Другой вариант система свой-чужой и безопасность объектов в игре.
Не нужно забывать, что это новый рынок для программистов, был бы рад возможности продажи скриптов через официальный магазин другим игрокам.
  • 0
avatar
Не нужно забывать, что это новый рынок для программистов, был бы рад возможности продажи скриптов через официальный магазин другим игрокам.
А про какой магазин идёт речь? В игре торговать можно.
  • 0
avatar
Возможно издатель захочет проверять скрипты на их функционал и безопасность и подтверждать выполняемый ими функционал и безопасность. Конечно всегда можно продать скрипт без сертификата на чёрном рынке.
Возможно было бы здорово если разработчик оставит пасхалки, не документированные и не лицензированные функции, скрипты с которыми можно продать только через чёрный рынок.
  • 0
avatar
Скрипты, зашитые в РВУ являются игровым объектом. Мне почему-то кажется, что вы говорите о торговле за реальные деньги.
  • 0
avatar
Когда я хочу что-то продать за реальные деньги, я так и говорю/пишу. Скрипты могут стать ещё одним игровым объектом и в некоторой мере ещё одной координатой свободы в игре.
  • 0
avatar
Тогда я вас не понимаю. Я уже несколько раз сказал (и это, более того, есть в заметке), что скриптами торговать в игре можно. К этому нет никаких препятствий, более того — есть механизмы для этого.
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.