Перейти к основному содержимому

Стадии и диалоги

Диалоговая система построена на двух списках внутри стадии: texts (что говорится) и transfers (куда можно перейти). Оба списка используют один и тот же приём — условную видимость: каждый вариант несёт своё условие, и движок выбирает первый подходящий по порядку. Пустое условие {} всегда подходит — это удобный способ задать вариант «по умолчанию» в конце списка.

texts — варианты текста сцены

"texts": [
{ "text": "Заходи, если по делу — я как раз занят.", "condition": { "has": ["дело_сидоровича"] } },
{ "text": "О, стрелок! Заходи, есть разговор.", "condition": {} }
]

Это позволяет одной и той же стадии говорить разное в зависимости от прогресса игрока — не создавая для каждого варианта отдельную стадию. Типичный приём: последний элемент списка — вариант с пустым условием ({}) как фоллбэк на случай, если ни один из более специфичных вариантов не подошёл.

transfers — переходы к другим стадиям

"transfers": [
{ "text": "Возьму задание", "stage": "stage_accept", "condition": { "!has": ["дело_сидоровича"] } },
{ "text": "Что по заданию?", "stage": "stage_progress", "condition": { "has": ["дело_сидоровича"] } },
{ "text": "Пока, дела ждут", "stage": "stage_exit", "condition": {} }
]

Каждый transfer — это кнопка выбора, которую видит игрок, но только если её condition выполняется. Так делаются ветвящиеся диалоги: варианты ответа появляются или исчезают в зависимости от инвентаря, флагов или прогресса.

Практика

Стройте диалог так: последняя реплика стадии всегда должна иметь хотя бы один transfer с условием {}, иначе игрок может застрять на стадии без доступных вариантов (если все прочие условия не выполнились).

Плейсхолдеры в тексте

В texts и message можно подставлять данные текущего игрока:

ПлейсхолдерПодставляется
@nameИмя персонажа
@nicknameПозывной
@moneyКоличество денег
@xpКоличество опыта
@loginЛогин аккаунта
@locationТекущая локация
@gangФракция игрока
@pdaIdИдентификатор ПДА
{ "text": "Здоров, @nickname! У тебя на счету @money руб. — хватит на новый ствол." }

Стадии-переходы (служебные типы)

Не все стадии показывают текст. Три типа стадий выполняют техническую роль и не требуют texts:

  • type_stage: 4 (переход на карту) — использует data: { map, pos }, чтобы открыть игровую карту в нужной точке. Обычно так завершается диалог: «иди туда-то» → игрок видит карту.
  • type_stage: 5 (загрузка другой главы) — передаёт выполнение другой главе истории через действие openStage, удобно для разбиения длинной истории на главы без дублирования логики.
  • type_stage: 6 (переход к продавцу) — открывает торговое окно конкретного продавца через действие openSeller.

Позиция узла на холсте (editor.x / editor.y)

Поле editor: { x, y } хранит только координаты узла на холсте в редакторе сюжетов — на геймплей оно не влияет. Не нужно трогать его руками при работе с «сырым» JSON — редактор сам раскладывает новые узлы через авторазметку графа (dagre).

Далее

  • Условия — как устроен язык condition подробно.
  • Действия — полный список команд, которые может выполнить стадия.