Квесты

Материал из DeusExMachina
Перейти к: навигация, поиск

1.0 Введение

Это не полноценный туториал, а всего лишь памятка к видеоуроку по созданию квестов для Ex Machina.

Сам урок можно и нужно посмотреть здесь:


1.1 Создание квеста

1. В Conversation Editor во вкладке «Квесты» открыть quests.xml и questinfoglobal.xml, для удобства создать необходимые папки. В случае с М113 можно использовать их локальные аналоги в папке каждой карты.

2. Выделить созданную вами папку, нажать «ПКМ» и в контекстном меню выбрать «Добавить квест» (или нажать кнопку «Insert»). Для создания подквеста необходимо выделить главный квест и проделать аналогичную операцию столько раз, сколько требуется подквестов.

3. В панели «Параметры квеста» указать следующие данные:

  • Name — Имя квеста. Должно быть уникальным для каждого квеста.
  • Automatic — Берётся ли квест автоматически, или нужно вручную прописывать его взятие.
  • ConditionToGive — Определяет состояние, в котором должны находиться квесты из списка PrecidingQuests, чтобы этот квест мог быть взят. all — все квесты; any — хотя бы один из списка; complete — выполнен; taken — взят; failed — провален.
  • PrecidingQuests — Список квестов, которые предшествуют взятию этого квеста.
  • SubQuestCondition — Порядок подписки на квесты: and — если провален хотя бы один подквест, то основной квест в конечном итоге будет провален; or — если выполнен хотя бы один подквест, то основной квест в конечном итоге будет считаться выполненым; xor — при выполнении одного любого из подквестов, другие подквесты (при их наличии) проваливаются, основной квест в конечном итоге имеет статус «выполнен».
  • CheckAlltrue — если для выяснения статуса основного квеста нужно знать статусы всех его подквестов; false — для выяснения статуса основного квеста достаточно знать статус хотя бы одного из его подквестов.
  • OnTake — Скрипты, которые будут активированы при взятии квеста.
  • OnComplete — Скрипты, которые будут активированы при выполнении этого квеста.
  • OnFail — Скрипты, которые будут активированы при провале этого квеста.
  • TimeForComplete — Время для выполнения квеста. Нигде в игре не используется.
  • Levels — Список локаций, на которые игрок может переходить с этим квестом. Если локации в списке нет, а игрок переходит на неё с активным квестом — квест проваливается. Рекомендуется не использовать этот параметр в сюжетных квестах.
  • BriefDiz — Краткое описание квеста.
  • FullDiz — Полное описание квеста. Не отображается для подквестов.
  • LiteraryDiz — Описание в журнале. Нигде в игре не используется.
  • Maps — Список локаций, на которых будут отображаться маркеры на карте для этого квеста.
  • TargetObjName — Имя объекта или координаты, на которые будет указывать маркер. В качестве имени объекта может выступать название города, локации и даже название конкретной машины.
  • IsMainQuest — Определяет цвет маркера: true — желтый; false — фиолетовый.
  • SmallImage, LargeImage и HirerName нигде в игре не используются.


4. Нажать на кнопку «Применить» и затем «Сохранить»


1.2 Диалоги

1. В Conversation Editor во вкладке «Диалоги» открыть файл dialogsglobal.xml, создать необходимые для удобства папки. В случае с М113 можно использовать его локальный аналог в папке каждой карты.

2. Выделить созданную вами папку, и через «ПКМ» или кнопку «Insert» создать необходимое количество фраз для диалога. Последней фразой всегда должна быть фраза игрока. Написать диалог.

3. Написать скрипты-условия для самой первой фразы в диалоге.

4. Написать скрипты-результаты для последней фразы в диалоге.

5. (Опционально) Дать имя каждой фразе диалога.


1.3 Скрипты

1) Основные скрипты-условия

IsQuestTaken("name") — Проверяет, взят ли квест с именем name.


IsQuestComplete("name") — Проверяет, выполнен ли квест с именем name.


IsQuestFailed("name") — Проверяет, провален ли квест с именем name.


CanQuestBeGiven("name") — Проверяет, может ли быть выдан квест с именем name.


IsQuestTakenAndNotComplete("name") — Проверяет, является ли квест с именем name взятым и одновременно не завершённым. Лучше не использовать!


QuestStatus("name")==Q_TAKEN — Проверяет, имеет ли квест с именем name статус Q_TAKEN (квест взят). Также используются Q_COMPLETED (квест выполнен); Q_FAILED (квест провален); Q_CANBEGIVEN (квест может быть выдан); Q_UNKNOWN (квест не взят и не может быть выдан).


GetCurNpc():GetSpokenCount()==0 — Проверяет, равно ли число разговоров с NPC заданному числу (в данном случае нулю).


GetVar("name").AsInt==0 — Проверяет, равно ли значение переменной с именем name заданному числу (в данном случае нулю).


GetVar("name").AsString=="value" — Проверяет, равно ли значение переменной с именем name значению value.


IsQuestItemPresent("name") — Проверяет, присутствует ли у игрока квестовый предмет с именем name.


GetPlayerMoney() — Проверяет, сколько денег у игрока. Используется как условие с помощью < > == .


GetTolerance(1100,1002) — Проверяет отношения между двумя белонгами, указанными в скобках. Используется как условие с помощью < > == .


HasPlayerFreePlaceForItems("name", amount) — Проверяет, есть ли в кузове машины игрока место для предмета с именем name в количестве, равном amount.


HasPlayerAmountOfItems("name", amount) — Проверяет, есть ли в кузове игрока предметы с именем name в количестве равном amount.


BookExists("name") — Проверяет, есть ли у игрока книга с именем name. Имена книг находятся в файле data/if/strings/uibooks.xml.


IsLevelKnown("r1m1") — Проверяет, известна ли игроку локация с именем r1m1.


IsLevelVisited("r1m1") — Проверяет, посещал ли игрок локацию с именем r1m1.


2) Основные скрипты-результаты

EndConversation() — Завершает диалог.


LeaveTown() — Завершает диалог и выводит игрока из города. Если в скобках значение true — ролик выезда из города не проигрывается; если false или отсутствует вообще — ролик проигрывается (при его наличии).


AddPlayerMoney(amount) — Добавляет игроку сумму денег, равную amount. Если перед amount стоит минус, то деньги вычитаются.


AddQuestItem("name") — Добавляет квестовый предмет с именем name.


RemoveQuestItem("name") — Убирает квестовый предмет с именем name.


AddBook("name") — Добавляет книгу с именем name.


GetCurNpc():SetSpokenCount(1) — Назначает конкретному NPC число разговоров, равное заданному значению (в данном случае единице).


TakeQuest("name") — Берётся квест с именем name, если все условия для этого (см. «Создание квеста») выполнены.


CompleteQuest("name") и CompleteQuestIfTaken("name") — Выполняется квест с именем name. Вторую команду рекомендуется использовать, если вы не уверены, что в момент выполнения команды этот квест у игрока взят.


FailQuest("name") и FailQuestIfTaken("name") — Проваливается квест с именем name. Вторую команду рекомендуется использовать, если вы не уверены, что в момент выполнения команды этот квест у игрока взят.


TActivate("name") — Активирует триггер с именем name.


SetVar("name", 1) и SetVar("name", "value") — Назначается переменная с именем name и заданным значением (значение переменной — единица в первом случае; во втором — объект с именем value).


ShowCircleOnMinimapByName("value") — Выделяет на карте область в виде круга вокруг объекта с именем value.


AddItemsToPlayerRepository("name", amount) — Добавляет в кузов игрока предмет с именем name в количестве amount.


RemoveItemsFromPlayerRepository("name", amount) — Удаляет из кузова игрока предметы с именем name в количестве amount.


1.4 NPC

1. Открыть файл dynamicscene.xml интересующей нас локации.

2. Найти строки, отвечающие за бар нужного нам города.

3. Продублировать уже существующего NPC и изменить у него следующие параметры:

Name — Имя NPC. Должно быть уникальным.


Belong — Должен быть равен белонгу города.


Prototype — Не трогаем.


ModelName — Название модели из animmodels.xml.


skin — Скин NPC. Настраивается в Targem Models Editor.


cfg — Конфигурация NPC. Настраивается в Targem Models Editor.


helloReplyNames — Имена первых реплик из всех диалогов, которые будут с этим NPC.


SpokenCount — Изначальное число разговоров с этим NPC.


Также прописать NPC можно на отдельную область на карте (genericLocation). Делается это по тому же алгоритму, главное — преобразовать тег с областью в открывающий и закрывающий (см. видеоурок).

4. Дать внутриигровое имя NPC в файле object_names.xml интересующей нас локации. В Name скопировать имя из dynamicscene.xml, в FullName — написать внутриигровое имя.


1.5 Предметы

1) Квестовые предметы

1. Создать новый прототип в data/gamedata/gameobjects/questitems.xml (скопировать существующий прототип, изменить у него name (название предмета) и modelfile (название модели) на нужные нам). Если хотите сделать свой resourcetype, то необходимо также добавить его в файле data/gamedata/resorcetypes.xml.

2. Добавить игровое название этого предмета в файл data/if/diz/model_names.xml.

3. Добавить описание этого предмета в data/if/strings/uidescription.xml.


2) Книги и история

Добавить в файл data/if/strings/uibooks.xml два тега следующего содержания:

<string
        id="bookname"
        value="Название книги" />

<string
        id="bookname_diz"
        value="Текст книги" />

Внимание! В М113 раздел «Книги» отсутствует и они выполнены в виде квестовых предметов.


Аналогичным образом добавить в файл data/if/strings/uihistory.xml тег следующего содержания:

<string
        id="historypart"
        value="Текст истории" />

Внимание! В М113 раздел «История» отсутствует.