Jump to content

Статья: Соединяем точки... Система Создания Миссий


Kerbal101

Recommended Posts

Очевидно, что одним из центральных компонентов «Making History» являются сами миссии!
Здесь вы можете прочитать некоторую информацию как строить миссии, и как работает система, под называнием MissionSystem, - изнутри.

Что же такое "Миссия" ?

В общих чертах, миссия это серия Узлов и Соединений (Коннекторов), в которых игрок начинает со стартового места и  может следовать по пути от узла к узлу до тех пор, пока они не подойдут к концу. С точки зрения программирования - это конечный автомат (Finite-state Machine или FSM).

Но в системе миссий мы делаем и кое-что отличающееся от традиционного FSM: мы не храним состояние каждого перехода в постоянстве. На Узлах имеется логика, которая позволяет Узлу иметь свойство "Захват Всего" (Сatch All), что означает, что миссия может перейти на Узел с таким свойством - с любого другого Узла. В свою очередь, это означает, что мы можем хранить больше информации в файле миссии, не требуя сохранения каждого перехода по отдельности, и - также, имеем возможность распаковывать его для использования как FSM в игре.

Таким образом, на языке FSM "Узлы" это - "состояние", а "Коннекторы" - это "переходы". В игре есть механизм разбора, который отслеживает каждую миссию и обрабатывает циклы обновления, которые используются для прогресса каждой миссии. И Активный Узел - это текущее активное состояние.

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

0YXj9nu.png

Что такое MissionSystem?

MissionSystem - это движок синтаксического разбора, это основной класс, который управляет миссиями, и технически это то, что называется модулем сценария (Scenario Module) в КСП. Он загружает компоненты миссии из файла сохранения, обрабатывает их и начинает следить за состоянием миссии: когда должны меняться Узлы и когда запускать действия. Другие модули сценариев (Scenario Module) в КСП включают ContractSystem, FundingSystem, CommNetScenario, надеюсь, что вы видите схожий момент и здесь - всё это элементы, которые запускаются как компонент игры и используются для загрузки и сохранения постоянных данных, - и потом обрабатывают эти данные в игре.

Путешествие между узлами
Давайте придерживаться терминологии Конечных Автоматов (FSM) по мере разбора. В любой момент в нашей миссии всегда есть только один Активный Узел (ActiveNode) (это как "состояние" в FSM), - что немного похоже на главного персонажа Горца (Highlander) из одноименного фильма, тем что всегда «может быть только один».

Так вот, MissionSystem затем должна проверить, не пора ли перейти к новому узлу. Для этого система миссии последовательно проверяет Узлы, к которым подключен Активный Узел, - это включает в себя Узлы, которые напрямую связаны, и любые Узлы со свойством "Захват всего" ("Catch All").

Как же система миссии определяет, когда пришло время менять Узлы? Каждый Узел может иметь несколько подключенных к нему модулей, и они помогают понять, когда должен произойти переход, а также что делать  после изменения Активного Узла:

Проверки смены Узла обрабатываются TestModule следующим образом:

  • TestModule - это класс, который определяет логику, которая проходит проверку и возвращает Истину (True) в случае успеха.
    • Каждый Узел может иметь одну или несколько тестовых групп (TestGroups), и каждая тестовая группа (TestGroup) содержит TestModules.
    • После того, как все TestModules в любой тестовой группе (TestGroup) вернут Истину, этот Узел активируется и Активный Узел (Active Node) миссии меняется.
    • Если у узла нет тестовых групп / модулей (TestGroups/Modules), это сразу вернет Истину
  • Действия, которые происходят при активации Узла, обрабатываются ActionModule:
    • Каждый Узел может иметь один или несколько присоединенных ActionModule.
    • Они активируются в момент активации Узла - но это не исключает применения Вами программных блоков, чтобы немедленно их активировать и выполнять длительные действия.
  • Теперь, когда мы разобрали взаимодействие Узлов и Коннекторов, рассмотрим какую роль играет Активный Узел (Active Node). MissionSystem просматривает Активный Узел при каждом цикле обновления и проверяет все Узлы, на которые он может перейти. Это подразумевает любой Узел, у которого есть Соединение с Активным Узлом и все Узлы со свойством "Схватить всё" (Catch All).

Прочее
Но как насчет других вещей, которые видны в Строителе ? Что такое Прикрепленный Узел? Как можно увидеть Узел со свойством "Захват всего"? Как говорится, картина стоит тысячи слов - вот некоторые моменты, которые я нашел полезными и интересными:

Начальный Узел
Имя уже всё говорит, но тем не менее - это Активный Узел с которого начинается миссия. MissionSystem всегда начинает здесь, а затем проверяет Прикрепленные Узлы.

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

oHScbtb.png

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

Разрешите привести пример:

uEDzqlw.png

  • Допустим Узел "Go to", показанный как 1, подключен к Активному Узлу,- тогда, когда "My Other Vessel" достигнет этого места:
  • Узел "Go to" станет Активным Узлом.
  • Затем система проверяет, является ли MET (время с момента запуска миссии) менее 2 часов, если этот  Узел становится Активным,- и никакие другие Прикрепленные Узлы не тестируются.
  • Если нет, то идет проверка MET < 3h30m, если это Истина, тогда этот Узел становится единственно Активным.
  • Если условие на любом Прикрепленном Узле становится Истинным, тогда подключенные к ним Узлы немедленно начнут корректировать счет.
  • После чего игроку необходимо поднятся выше 5000м над уровнем моря, чтобы продолжить далее.

Узлы "Захват всего"
Эти Узлы не имеют прямого подключения на входе. Они будут протестированы независимо от того, какой узел является Активным Узлом.

Из нашего примера на изображении видно, что таким Узлом является "Vessel Destroyed" (Корабль Уничтожен) - что означает, что если в любой момент в миссии корабль, за которым ведется учет, будет уничтожен, то этот Узел активируется.

0YXj9nu.png

Порядок Проверки Соединений
Как узнать, в каком порядке MissionSystem проверяет какой Узел следующий? Для Прикрепленных Узлов это должно быть понятно - это порядок в котором они состыкованы, но когда есть несколько Соединений, порядок может быть найден (и скорректирован) в Узле "Параметры" на панели действий "Настройки» (SAP - вверху справа в Конструкторе).

Мы объединим этот принцип со следующими...

Некоторые дополнительные свойства Узлов
Активировать только один раз - этот параметр включен по-умолчанию, чтобы предотвратить бесконечные циклы, но при тщательных расчетах вы можете отключить его, чтобы использовать некоторые рудиментарные циклы в миссиях.
Всегда Истинные Узлы (B) - эти Узлы могут использоваться для логических структур, чтобы заставить вещи двигаться вместе.
Всегда Ложные Узлы - вы можете использовать их, чтобы ввести своих игроков в заблуждение - да, так и есть - удивить их.

CFrb8oi.png

Чтобы помочь понять рисунок выше, я нанес цветовой код на Коннекторы. Предположим, вы хотите направить игрока на EVA с одного судна, а затем войти в Mk1Pod в ближайшем судне. Но вы хотите добавить немного  давления, взрывая солнечные батареи судна, пока они не добираются туда (не спрашивайте меня почему, может быть, вы такой Kerbal :) ).
Вот как это решение работает:

  • Ваш игрок попадает в Узел A, как только кербал выйдет в EVA
  • Миссия немедленно перемещается в Узел B (потому что он всегда Истинен), и мы также выстроили всё так, что он может активироваться несколько раз и повторять события.
  • В точке B - Узлы проверяются в соответствии с там настроенным порядком, через "Порядок Соединения Узлов" (Node Connections Order) как показано ниже:

CvbcJC5.png

  • Вот так проверяются присутствие экипажа в указанной детали, потом тестируется прошло ли 120 секунд и так далее..
  • Предположим, что прошло 31 секунда - миссия переходит к Узлу C (через синюю линию), а затем взрывает одну из солнечных панелей судна
  • Затем снова активируется Узел B и снова начинаются проверки

Поэтому каждые тридцать секунд мы взрываем панель судна до тех пор, пока а) кербалы не достигнут и  доберутся до модуля Mk1, или б) они долго провозятся и мы найдем что-то еще "противнее". :)


Итог
Я знаю, что эта статья немного длинная, но, надеюсь, что я дал вам некоторое представление и информацию о некоторых разработках и возможностях в "Making History" !
Увидимся в следующий раз!

-- -- -- --

[ источник ]


Автор статьи @TriggerAu
Все права зарезервированы

Статья переведена @Kerbal101 и размещена с разрешения и с использованием материалов @TriggerAu

По прошествии месяца, эта статья будет перемещена в раздел [ Обучение и обмен опытом ].

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...