Стадии и диалоги
Диалоговая система построена на двух списках внутри стадии: 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).