Skip to content

Фразы

Центральным понятием в диалогах является фраза. Фразы это не просто вопрос-ответ, как можно подумать. Фраза является деревом, и в этом смысле, весь диалог может быть реализован единственной фразой. Например:

lua
dlg {
	nam = 'разговор';
	title = [[Разговор с продавцом]];
	enter = [[Я обратился к продавцу.]];
	phr = {
		{ 'У вас есть бобы?', '-- Нет.'},
		{ 'У вас есть шоколад?', '-- Нет.'},
		{ 'У вас есть квас?', '-- Да',
			{ 'А сколько он стоит?', '-- 50 рублей.' },
			{ 'А он холодный?', '-- Холодильник сломался.',
				{ 'Беру два!', 'Остался один.',
					{ 'Дайте один!', function() p [[Ок!]]; take 'квас'; end };
				}
			}
		}
	}
}

Как видно из примера, фраза задаётся атрибутом phr и может содержать разветвлённый диалог. Фраза содержит в себе выборы, каждый из которых тоже может содержать в себе выборы и так далее...

Фраза имеет формат пары: описатель -- реакция. В простейшем случае, это строки. Но они могут быть и функциями. Обычно, функцией бывает реакция, которая может содержать код по изменению игрового мира.

Пара может быть простой:

{'Вопрос', 'Ответ }

А может содержать в себе массив пар:

{'Вопрос', 'Ответ',
	{'Под-вопрос1', 'Под-ответ1' },
	{'Под-вопрос2', 'Под-ответ2' },
}

На самом деле, если вы посмотрите внимательно на атрибут phr, то вы заметите, что массив выборов тоже является вложенным в главную фразу phr, но только первоначальная пара отсутствует:

lua
dlg {
	nam = 'разговор';
	title = [[Разговор с продавцом]];
	enter = [[Я обратился к продавцу.]];
	phr = {
	-- тут мог бы быть вопрос ответ 1-го уровня!
	-- 'Главный вопрос', 'Главный ответ',
		{ 'У вас есть бобы?', '-- Нет.'},
		{ 'У вас есть шоколад?', '-- Нет.'},
		{ 'У вас есть квас?', '-- Да',
			{ 'А сколько он стоит?', '-- 50 рублей.' },
			{ 'А он холодный?', '-- Холодильник сломался.',
				{ 'Беру два!', 'Остался один.',
					{ 'Дайте один!', function() p [[Ок!]]; take 'квас'; end };
				}
			}
		}
	}
}

На самом деле, так и есть. И вы можете добавить 'Главный вопрос' и 'Главный ответ', но только вы не увидите этот главный вопрос. Дело в том, что при входе в диалог фраза phr автоматически раскрывается, так как обычно нет никакого смысла в диалогах из одной единственной фразы. И гораздо проще понять диалог как набор выборов, чем как единственную древовидную фразу. Так что у phr никогда нет первоначальной пары вопрос-ответ, но мы сразу попадаем в массив вариантов, что более понятно.

Когда мы говорим о том, что диалог на самом деле реализован одной фразой, мы не совсем правы. Дело в том, что мы имеем дело с фразой, внутри которой находятся другие фразы... Это напоминает нам ситуацию с объектами. Действительно, фразы -- это объекты, которые могут находиться внутри друг друга. Итак, посмотрим на диалог свежим взглядом:

lua
dlg {
	nam = 'разговор';
	title = [[Разговор с продавцом]];
	enter = [[Я обратился к продавцу.]];
	phr = { -- это объект типа фраза, без dsc и act
		-- это 1-я фраза, внутри фразы с dsc и act
		{ 'У вас есть бобы?', '-- Нет.'},
		-- это 2-я фраза, внутри фразы с dsc и act
		{ 'У вас есть шоколад?', '-- Нет.'},
		-- это 3-я фраза, внутри фразы с dsc и act
		{ 'У вас есть квас?', '-- Да',
		-- это 1-я фраза внутри 3й фразы с dsc и act
		{ 'А сколько он стоит?', '-- 50 рублей.' },
			{ 'А он холодный?', '-- Холодильник сломался.',
				{ 'Беру два!', 'Остался один.',
				    -- здесь act в виде функции
					{ 'Дайте один!', function() p [[Ок!]]; take 'квас'; end };
				}
			}
		}
	}
}

Как видим, диалог -- это комната, а фразы -- специальные объекты! Теперь вам станет понятным дальнейшее изложение.

Внимание! По умолчанию, когда игрок нажимает на один из вопросов в списке, движок повторяет его в выводе и только потом выводит ответ. Это сделано для того, чтобы диалог выглядел связанным. Если вы хотите отключить такое поведение, используйте настройку std.phrase_show:

lua
std.phrase_show = false -- не выводить фразу-вопрос при выборе

Эта настройка действует на все диалоги, устанавливайте её в init() или start() функции.