Skip to content

Сюжетные События

В HollowEngine Вы можете довольно удобно и быстро создавать различные события с npc, катсцены, диалоги и т.п.

Важное

Данный вид скрипта имеет множетсво своих нюансов и очень отличается от стандартного программирования. Не рекомендуется для новичков не знакомых с программированием и тех, кто не разбирается, как работают лямбда-выражения, переменные-делегаты и машины состояний.

Как оно работает?

Прежде всего нужно понимать, что такое Сюжетное событие, из чего оно состоит и для кого оно выполняется.

Основное

Итак, для начала стоит запомнить, что все сюжетные события выполняются не для одного игрока, а для целой команды. И не важно, делаете вы сюжет для одного игрока или нет. Это не повод писать менее качественный код. Команду можно получить через переменную team.

Само событие представляет собой список разных команд, например:

1) Cоздать нпс по имени Виталик по координатам x, y, z с моделью model.gltf. 2) Дать нпс задачи ийти к координатам x1, y1, z1. Ждать пока нпс не дойдёт до нужной точки 3) Написать всем игрокам команды сообщение "[Незнакомец] помогите, я заблудился..." в чат.

Каждая из этих команд называется узлов, а всё событие представляет собой связный граф из этих самых узлов. Некоторые узлы могут иметь внутри себя другие узлы, например циклы, где узел один, но он содержит другие узлы, которые могут повторяться. Или же ветвления, где тоже узел один, но имеет в себе 1 условие и 2 ветки.

Событие имеет в себе множество стандартных узлов, в которых уже прописана вся логика, а также реализовано сохранение данных каждого из таких узлов. Но если вы собираетесь идти дальше, чем просто потыкать стандартные механики, то вам придётся разбираться, как создавать свои узлы, а также как сохранять их данные.

Стадии скрипта

Сюжетный Скрипт имеет 2 стадии:
1) Загрузка скрипта

В этой стадии вызываются все методы создания узлов, т.е. всё что вы пишите в скрипте будет сначала загружено в машину состояний, которая и будет обслуживать ваше события и отвечать за его сохранение и обработку ошибок.
2) Исполнение скрипта
В этой стадии ваш скрипт уже выполнен, и происходит обслуживание самих узлов игрой. Т.е. прохождение самого сюжета.

Методы

Практически каждый метод, что вы будете писать в скрипте скорее всего будет не выполнять своё действие, а лишь загружать соответствующий узел в машину состояний или создавать новые списки узлов, как циклы, ветвления или диалоги. Например представим метод createCoolNpc() будет не создавать нпс, как не странно, а загружать узел CoolNpcCreationNode в машину состояний.

Переменные

Практически все переменные вам придётся получать через делегаты, потому что делегаты получают значение только при обращении к переменной, а не при её создании, также делегируемые переменные возможно сохранять при остановке игры или передавать между разными скриптами. А как вы знаете, скрипт состоит из узлов, т.е. по сути переменная предстваляет собой 2 вида узлов: 1) Создать значение определённого типа 2) Записать значение 3) Получить значение

Например:

var reputation by saveable { 0 } //Создать значение определённого типа

npc say { "Твоя репутация: $reputation" } //Получить значение

//используется метод next с лямбдой, чтобы выполнить это действие уже во время выполнения сюжета, а не при его загрузке в машину состояний. В случае с методом выше, это действие уже запускается во время выполнения сюжета, так что next - не требуется.
next { reputation++ } //Записать значение

Как запускать события?

Для запуска событий есть команда /hollowengine start-script <цель> <файл>. Учтите, цель скрипта - не игрок, которого вы укажете, а его команда.

Если же вам нужно, чтобы скрипт запускался вместе с первым входом игрока, то добавьте в его начала аннотацию: @file:EntryPoint, чтобы указать движку, что этот скрипт нужно запускать для каждого нового игрока.