Зависимости между квестами¶
Квест можно поставить за другими: пока его зависимости не выполнены, он игроку не выдан — его нет ни в книге, ни в HUD. Как только зависимости складываются, квест выдаётся сам, без команды. Так из отдельных квестов собирается прогрессия: следующая глава открывается по мере прохождения предыдущих.
Зависимости описываются прямо в квесте двумя полями: after — от каких квестов он зависит — и require — дополнительные условия на игрока. Типы и обязательность этих полей — в Формат файла квеста; здесь — как они работают.
Группы зависимостей — поле after¶
after — список групп, где каждая группа — список квестов:
Квест открывается, когда все квесты хотя бы одной группы завершены успешно. Внутри группы — «И» (нужны все), между группами — «ИЛИ» (достаточно любой):
[["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 нет.
Пример — открыть главу только тем, кто в прошлой выбрал тёмный путь:
Квест получат лишь игроки с тегом chose_dark_path — и только если тег стоит на них в момент, когда завершается story:ch1.
Ручная выдача обходит зависимости¶
after и require управляют только автоматической разблокировкой. Ручная выдача — командой quest give или свитком квеста — даёт квест напрямую, не сверяясь ни с зависимостями, ни с условиями. Оператор всегда может выдать квест вручную, выполнены его зависимости или нет.
См. также¶
- Формат файла квеста — типы и обязательность полей
afterиrequire. - Статусы квестов и задач — что значит «завершён успешно» и почему провал или пропуск не считаются.
- Закрепление — поле
pin_modeи автозакрепление при выдаче по зависимости. - Справочник команд — ручная выдача квеста в обход зависимостей.