82 lines
5.5 KiB
Markdown
82 lines
5.5 KiB
Markdown
# Quests Engine — задания, их шаги и журнал
|
||
|
||
Quests Engine ведёт счёт задачам игрока. У задания есть название и нумерованный список шагов; сценарии берут его в работу, переводят на следующий шаг, отмечают тегами и завершают. Панель **Журнал** показывает задания, которые взял игрок, а их состояние игра сохраняет.
|
||
|
||
Его используют Cthangover (пробуждение в прологе и старый дом) и RPG Plus (лесные задания).
|
||
|
||
## Журнал
|
||
|
||
Открывается иконкой журнала на панели инструментов. Пока игрок не взял ни одного задания, журнал пуст:
|
||
|
||

|
||
|
||
В RPG Plus первое задание даёт староста деревни. Спросите его, куда идти:
|
||
|
||

|
||
|
||
После ответа задание появляется в журнале:
|
||
|
||

|
||
|
||
- **Активные** — список заданий в работе, **Завершённые** — законченных. Ещё не начатые задания не появляются никогда.
|
||
- Правая страница показывает выбранное задание: выполненные шаги зачёркнуты, текущий отмечен, а будущие скрыты — журнал не раскрывает сюжет заранее.
|
||
- Заработанные заданием теги показаны под записью маленькими золотыми метками.
|
||
|
||
## Описание задания
|
||
|
||
Задания — это JSON-файлы вида `quest` в папке `quests/` мода. Вот задание с картинок (из RPG Plus):
|
||
|
||
```json
|
||
{
|
||
"Kind": "quest",
|
||
"Items": [
|
||
{
|
||
"Id": "woodland_ward",
|
||
"Name": "rpg_plus/quest/ward/name",
|
||
"StatusToDescription": {
|
||
"0": "rpg_plus/quest/ward/0",
|
||
"1": "rpg_plus/quest/ward/1",
|
||
"2": "rpg_plus/quest/ward/2",
|
||
"3": "rpg_plus/quest/ward/3",
|
||
"4": "rpg_plus/quest/ward/4"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
`Name` и каждый шаг — ключи перевода. Числа — это **шаги** задания: на шаге 1 текст `1` показан как текущий, а `0` — зачёркнутым; на картинке это «Запись II из V».
|
||
|
||
## Как сценарий двигает задание
|
||
|
||
Ответ старосты в RPG Plus запускает задание и ставит его на шаг 1:
|
||
|
||
```scenario
|
||
action quest.set_status quest_id=woodland_ward status=Progress
|
||
action quest.set_data_status quest_id=woodland_ward level=1
|
||
```
|
||
|
||
- `quest.set_status` — состояние задания: `NotStarted`, `Progress` (активно) или `End` (завершено).
|
||
- `quest.set_data_status` — текущий шаг, `level` — его номер.
|
||
- `quest.add_tag` / `quest.remove_tag` с `tag=…` — запомнить случившееся, например, какой предмет игрок взял первым.
|
||
- `quest.send_notification` — показывает игроку уведомление о задании; само по себе изменение задания уведомления не даёт.
|
||
|
||
## Как проверить задание
|
||
|
||
Проверки задания работают везде, где игра принимает условие: в `when`, в условиях ответов, условиях сцен и событиях карты.
|
||
|
||
```scenario
|
||
when "woodland_ward.DataStatus >= 2" -> :lantern
|
||
```
|
||
|
||
- `<quest>.IsActive` — задание в работе;
|
||
- `<quest>.Status` — `0` не начато, `1` в работе, `2` завершено;
|
||
- `<quest>.DataStatus` — текущий шаг;
|
||
- `<quest>.hasTag("tag")`, `<quest>.notHasTag("tag")` — так Cthangover выбирает, какой сценарий сцены играть, например `AwakeningQuest.hasTag("book_taken")`.
|
||
|
||
## Если что-то пошло не так
|
||
|
||
1. **Задания нет в журнале.** Его состояние должно быть `Progress` (или `End` для вкладки завершённых); одной установки шага мало.
|
||
2. **Журнал показывает ключ вместо текста.** Добавьте ключ шага в файлы `locale` мода.
|
||
3. **Условие всегда ложно.** Идентификатор задания написан иначе, чем `Id` в файле задания; в логе будет предупреждение о неизвестном задании.
|