Перейти к содержанию

Зависимости между квестами

Квест можно поставить за другими: пока его зависимости не выполнены, он игроку не выдан — его нет ни в книге, ни в HUD. Как только зависимости складываются, квест выдаётся сам, без команды. Так из отдельных квестов собирается прогрессия: следующая глава открывается по мере прохождения предыдущих.

Зависимости описываются прямо в квесте двумя полями: after — от каких квестов он зависит — и require — дополнительные условия на игрока. Типы и обязательность этих полей — в Формат файла квеста; здесь — как они работают.


Группы зависимостей — поле after

after — список групп, где каждая группа — список квестов:

{
    "after": [
        ["story:cleared_mine", "story:met_elder"],
        ["story:paid_toll"]
    ]
}

Квест открывается, когда все квесты хотя бы одной группы завершены успешно. Внутри группы — «И» (нужны все), между группами — «ИЛИ» (достаточно любой):

  • [["a", "b"]] — нужны и a, и b.
  • [["a"], ["b"]] — достаточно a или b.
  • [["a", "b"], ["c"]] — нужны (a и b) либо c.

(a, b, c здесь — идентификаторы квестов-зависимостей.)

Засчитывается только успех. Зависимость открывает группу, лишь если завершилась исходом success. Квест, завершённый провалом (failure), группу не открывает. Что это за исходы — в Статусы квестов и задач.


«Разблокировался» значит «выдан»

Открытый по зависимости квест не просто помечается доступным — система сразу выдаёт его игроку, как командой quest give. Поэтому он появляется в книге и, если так задано, закрепляется в HUD; закреплять ли его при автовыдаче, решает поле pin_mode (см. Закрепление).

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


Дополнительные условия — поле require

Кроме завершённых квестов, разблокировку можно ограничить условиями на самого игрока — через require. Это нужно, когда квест должен открыться не любому, кто прошёл предысторию, а лишь при особых обстоятельствах: у игрока стоит нужный тег или выполняется predicate.

{
    "after": [
        ["story:prologue"]
    ],
    "require": {
        "tags": ["found_secret_passage"],
        "predicate": "story:is_nighttime"
    }
}
  • tags — scoreboard-теги игрока. Должны стоять все перечисленные (это «И», как внутри группы after).
  • predicate — идентификатор predicate датапака; проверяется против игрока.

Оба поля необязательны, и все условия объединяются через «И»: квест откроется, только если есть все теги и проходит predicate.

require проверяется в тот же момент, что и after — когда завершается зависимость. Если в этот момент условия не выполнены, разблокировки не будет задним числом: квест дождётся, когда завершится следующая его зависимость, и проверит условия заново. Для квеста с единственной зависимостью это значит один-единственный шанс — успеет ли игрок получить тег к тому мигу, когда зависимость придёт к успеху.

require без after игнорируется, и мод предупреждает об этом в логе: без разблокировки по зависимости проверять условия не на чем — другого момента для проверки у require нет.

Пример — открыть главу только тем, кто в прошлой выбрал тёмный путь:

{
    "after": [["story:ch1"]],
    "require": {
        "tags": ["chose_dark_path"]
    }
}

Квест получат лишь игроки с тегом chose_dark_path — и только если тег стоит на них в момент, когда завершается story:ch1.


Ручная выдача обходит зависимости

after и require управляют только автоматической разблокировкой. Ручная выдача — командой quest give или свитком квеста — даёт квест напрямую, не сверяясь ни с зависимостями, ни с условиями. Оператор всегда может выдать квест вручную, выполнены его зависимости или нет.


См. также