Часть 4. Первый квест
Для начала создадим нашу «Рабочую область», где будем работать и хранить файлики квестов. Пусть это будет Папка на Рабочем Столе. Вы же можете работать там, где вам захочется.
Подготовка
Создаём Папку
Допустим, с именем «MyQuests»

Важно
Сразу приучайте себя называть файлы и папки без пробелов. В идеале ещё и на английском. Есть несколько общепринятых стилей «кейсов», я буду (и вам рекомендую) использовать PascalCase, то бишь все слова слитно и каждое новое слово с заглавной буквы:
ФотоАнапа2004
MyBlockStoryQuest
Включим отображение расширений имен файлов в Проводнике
Windows 11

Windows 10

Создадим заготовку для квеста
1. В нашей папке (MyQuests) создаем текстовый документ:ПКМ —> Создать —> Текстовый документ
2. Переименовываем «Новый текстовый документ.txt» в «TestQuest.xml»

3. Ждём «ДА»:

4. Итог:

Настройка VS Code
Для Visual Studio Code крайне рекомендуется установить расширение «XML» от RedHat. Оно очень поможет с поиском глупых ошибок и опечаток. Например, когда пропустил «/» или кавычку. Также он может автоматически добавлять закрывающую часть тега за вас.
Важно
Если вы из России, то у вас из-за региональных ограничений не получится установить какие-либо расширения. Что с этим делать вы и без меня знаете.
1. Справа есть боковая панель. Находим этот значек:

2. У нас открывается меню с установленными расширениями. Ищем строку поиска

3. Нажимаем на неё и пишем «XML»
4. Нам нужно расширение с названием «XML» от RedHat. Устанавливаем его

Готово! Теперь все опечатки будут подсвечиваться:



Создаем Квест
Откроем XML-файл
Если спросит через что открыть файл, то выберите ваш Редактор кода (в моём случае VS Code) и нажмите «Всегда»
Открыт пустой файл
Проверьте, что файл в кодировке UTF-8 без BOM (как это сделать писалось про это в начале гайда)

VS Code по умолчанию создает XML-файл в кодировке UTF-8 без BOM. Если используете его, то беспокоиться не о чем
Добавим декларацию
<?xml version="1.0" encoding="utf-8"?>
Тело квеста (<quest> </quest>)
Это сам квест. Корень. Всё, что находится внутри квеста.
Это как конверт, в который Вы что-то вкладываете.
Важно
Один (1) квест (<quest> </quest>) = один (1) отдельный XML файл
<quest> состоит из открывающей (<quest>) и закрывающей (</quest>) части.

Закрывающая часть пустая, она просто показывает, что тег закрыт и дальше ничего из его внутренностей нет. Состоит из «/» и имени тега: </quest>
В открывающей части (<quest>) есть 2 обязательных атрибута:
| Атрибут | Значение |
|---|---|
| npc | Имя NPC (См. Имена Квестовых NPC) Важно: «Служебные» и отображаемые в игре имена NPC могут сильно отличаться! Пример: FemaleWarrior — Паула |
| title | Имя квеста и то, как он отображается в игре Важно: Названия задавать в формате: НазваниеКвеста: Квест Пример: The Collector: Wave 5 Спаситель Города: Разговор с Паулой В таком формате рекомендуется писать для лучшей совместимости между разными квестами и для лучшей читаемости |
Добавим <quest>
А) В «npc» пишем служебное имя NPC-квестодателя. Оно может отличается от того, что отображается в игре.
У меня это будет Волшебник — «Wizard»
Б) В «title» пишем имя квеста, которое будет отображаться в игре.
Пишем в формате: НазваниеКвеста: Квест
У меня будет — Тестовый Квест: Вступление

Шаги (<step> </step>)
Буквально, step переводится, как «ШАГ». Тоже состоит из открывающей и закрывающей части. Это каждый отдельный шажок в вашем квесте.
Чтобы было понятней: <quest> — книга, а <step> — отдельная страница в этой книге.
| Атрибут | Значение |
|---|---|
| id | Название Шага Стиль: snake_case (все слова с маленькой буквы, каждое слово через «_») Пример: my_custom_step |
В каждом квесте должны присутствовать 2 обязательных базовых шага:
| Шаг | Что делает |
|---|---|
| #start | Стартовая точка. С неё начинается ваш квест |
| #end | Конечная точка. Когда доходит до неё, квест завершается |
Добавим базовые шаги #start и #end
Пишем между открывающей и закрывающей частями <quest>, чтобы сделать отступ нажмите клавишу «Tab»

Зарезервированные (встроенные) базовые идентификаторы\шаги в игру:
| Шаг | Назначение | Пример |
|---|---|---|
| #start | Стартовая точка. С неё начинается ваш квест | <step id="#start"> |
| #end | Конечная точка. Когда доходит до неё, квест завершается | <step id="#end"> |
| #end_dark_side | [НЕ ИСПОЛЬЗОВАТЬ] Альтернативная конечная точка. Используется в финальном квесте с Волшебником, где мы переходим на его сторону. Нет смысла использовать, есть #end | <step id="#end_dark_side"> |
| #close | Закрыть диалог | <option to="#close" text="ОК"> |
| #undef | Переход в никуда. Для тех опций, которые не должны вести ни на какие шаги. | <option to="#undef" text="ОК"> |
Текстовые Блоки (База)
В <step> можно добавить текст в диалоги с помощью тегов. Существует базовых 3 типа текстовых блоков:
| Тег | Что делает |
|---|---|
<intro> </intro> | Вступительный текст при переходе на шаг. При использовании в #start появится при первом обращении к NPC. Показывается только 1 раз Важно: Никогда не используйте <intro> без <desc>, если на этом шаге есть повторное обращение к NPC. Иначе при повторном разговоре будет пустой экран с зависшим управлением |
<desc> </desc> | Появляется при повторном обращении к NPC на текущем шаге. Может полностью заменять <intro>, но тогда текст будет одинаковым при первом и последующих обращениях. |
<finish> </finish> | Рекомендуется использовать в последнем шаге (#end или его заменителе). Показывается 1 раз после завершения квеста. Эдакая «прощальная фраза». Для повторяемых квестов обязательно дублируйте в <desc> |
Добавим текстовые блоки в квест:
В «#start»: добавим <intro> и <desc>
В «#end»: добавим <finish> и <desc>

Опции (<option>)
По сути, это кнопка в диалоговом окне, его логика. Определяет, что игрок может или должен делать и куда квест пойдет дальше. Также её можно использовать, как невидимый обработчик. Без <option> ваш Шаг заглохнет.
Виды
Бывает 2 вида <option>:
1. Без вложенных условий (безусловный):
Пишется в одну строчку, состоит из одного <option />
Пример: Кнопка, перекидывающая на заданный шаг
<option to="dialog_step_part_2" text="Привет!"/>
2. Со вложенными условиями (условный):
Состоит из <option> и </option> с определенными условиями выполнения
Пример: Обработчик смерти. Перекидывает на шаг death_step, если игрок умер
<option auto="death_step">
<death />
</option>
Их рассмотрим позже
Кнопки
Можно использовать <option>, как кнопку.
Для этого будем использовать атрибуты «to» и «text»:
| Атрибут | Значение |
|---|---|
| text | Текст на кнопке (не больше 6 символов) |
| to | Название шага Пояснение: Кнопка. Проверяет условия только в момент нажатия кнопки Важно: Несовместимо с автоматическим «auto» (рассмотрим позже) |
Важно
Везде, где есть текстовые блоки: <desc>, <intro>, <finish>, обязательно добавляйте кнопку выхода из диалога: <option to="#close" text="Выйти"/>, либо кнопку перехода на нужный шаг.
Иначе получите это:

Добавим кнопки в шаги
Вернемся к квесту.
Так как <option> не имеет условий (просто кнопка), то:
В «#start»: добавим <option to="#end" text="Привет!"/>
В «#end»: добавим <option to="#close" text="Прощай!"/>
То бишь в одинарном <option> просто добавляем в конце «/»: <option />, вместо <option></option>

Не забывайте добавлять хотя бы одну опцию к <desc>, <finish> и <intro>!
1. Небольшое пояснение: «#close» в <option> у шага «#end» нужен, чтобы закрывать диалоговое окно. Запомним: #close = закрыть диалоговое окно.
2. Квест написан! Теперь сохраняем с помощью сочетания CTRL и S.
Подготовка к Запуску
1. Нажимаем Win + R
2. В левом нижнем углу у нас появляется окно:

3. Пишем: %APPDATA% и нажимаем «ОК» или «Enter»

4. Открывается папка «Roaming». Сверху нажимаем на «AppData»

5. Открываем Папку «LocalLow»

6. Там ищем папку «Mindblocks». Откроем её

7. Открываем папку «Block Story»

8. Перед нами игровые папки игры (Персонаж, Квесты, Миры)

Сделаем из нашего Персонажа отдельного персонажа для теста квестов
1. Откроем папку «chracters»
2. Находим файл Персонажа, из которого сделаем тестового. Название: [ИмяПерса].chr
!!! .bak файлы нам не нужны

3. Сделайте копию этого Перса: ПКМ –> Копировать | ПКМ –> Вставить

4. Переименуйте созданную копию в любое имя (например, TestCharacter.chr)

5. Готово! Теперь это ваш отдельный персонаж для теста и экспериментов с квестами. Его не жалко будет запороть. Тестируйте квесты только через него
6. По желанию, можете провернуть тоже самое со своим миром. Действия аналогичны, но уже для папки «worlds»:
Вам нужно будет продублировать папку мира и переименовать её на любое другое название
Запуск
1. Если у вас нет папки «quest», то создайте её
2. Скопируйте .xml файлы, созданного вами квеста в папку «quest». Не Рабочую Папку, а именно сами .xml файлы. Игра не читает файлы из вложенных папок и архивов (т.е. если в папку «quest» вы закините папку MyQuests, то игра проигнорирует ее и все квесты в ней)
3. Запускаем игру
Важно: После установки или изменения XML-файлов в папке «quest» нужно выйти в главное меню и зайти обратно в мир, чтобы квесты перечитались.
4. Подходим к нужному NPC и проверяем, что наш квест появился:

Если у NPC не было квестов, то ваш квест откроется автоматически
#start

#end

После перехода на шаг #end, квест завершится, а после нажатия на кнопку «Прощай!» диалоговое окно закроется.
То бишь по схеме (по порядку выполнения):
1. Переход на шаг #end = засчитывает завершение квеста
2. Нажатие кнопки (<option> с #close) = закрывает диалоговое окно
Важно
Как видите, текст в квесте вылезает за пределы кнопок. Происходит из-за того, что в рамку кнопки можно засунуть максимум 6 символов (в идеале не больше 5). В последующих частях гайда разберём как это обойти.
Следуя правилу выше, уберем «!» из «Привет!», а «Прощай!» заменим на «Пока»
Добавляем Больше Кнопок
Так как в прошлом квесте мы дошли до шага #end, то значит игра засчитала этот квест пройденным, поэтому мы его больше не сможем на него попасть. Для того, чтобы вернуть квест мы должны или откатиться на более старую версию персонажа, который этот квест еще не проходил, или переименовать уже имеющийся. Я переименую его: из «Тестовый Квест: Вступление» в «Тестовый Квест: Вступление 2»
Допустим, теперь мы хотим, чтобы игрок мог выйти из диалогового окна на шаге #start.
Для этого мы в #start добавим еще один <option> без вложенных условий:
<option to="#close" text="Выйти" />

Также добавим кнопку, возвращающую с #end на #start:
<option to="#start" text="Назад" />

Важно
Не используйте скачки с #end на предыдущие шаги (#start или ваши собственные), если в вашем квесте используются счетчики убийств монстров (задания на убийство монстров).
Сохраняемся (CTRL + S) и Проверяем:
– Кнопка «Выйти» работает

– Кнопка «Назад» перебрасывает на шаг #start

Кнопки в коде идут так: «Пока», потом «Назад»
В игре: кнопка «Назад», потом «Пока», т.е. в обратном порядке — снизу в верх относительно кода.
При разработке квеста имейте это ввиду.
Важно
В одном шаге может быть не больше 2-х кнопок! Если Вы поставите 3 и больше, то получите пустой экран:

Диалогового окна нет, управление не работает.
Решение: Нажмите 2 раза «ESC» или перезайдите в игру.