Skip to content

Теги

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

Всё это возможно для фраз, у которых есть тег. Создать фразу с тегом очень просто:

lua
phr = {
	{ '#что?', 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		{'#красная', 'Красную', 'Держите!' },
		{'#синяя', 'Синюю', 'Вот!' },
	},
}

Как видим, наличие в начале фразы строки, которая начинается на символ '#' - означает наличие тега.

Для таких фраз работают стандартные методы, такие как seen или enable/disable. Например, мы могли бы обойтись без атрибута only следующим образом:

lua
phr = {
	{ '#что?', 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		{'#красная', 'Красную', 'Держите!'
			cond = function(s)
				return not closed('#синяя')
			end
		},
		{'#синяя', 'Синюю', 'Вот!',
			cond = function(s)
				return not closed('#красная')
			end
		},
	},
}

Теги, кроме того, что позволяют узнавать и менять состояние конкретных фраз, делают возможным переходы между фразами. Для этого используются функции push и pop.

push(куда) -- делает переход на фразу с запоминанием позиции в стеке.

pop([куда]) -- вызванная без параметра, поднимается на 1 позицию в стеке истории. Можно указать конкретный тег фразы, которая должна быть в истории, в таком случае возврат будет осуществлён на неё.

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

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!', next = '#отаблетке' },
		{ 'Синюю', 'Вот!', next = '#отаблетке' },
	},
	{ false, '#отаблетке',
		{'Я сделал верный выбор?', 'Время покажет.'}
	},
}

Тут мы видим сразу несколько приёмов:

  • атрибут next, вместо явного описания реакции в виде функции с push. next -- это простой способ записать push.

  • false в начале фразы, делает фразу выключенной. Она находится в состоянии выключена, пока не сделать явный enable. Однако внутрь фразы мы можем перейти, и показать содержимое выборов. Альтернативная запись возможна с использованием атрибута hidden:

lua
	{ hidden = true, '#отаблетке',
		{'Я сделал верный выбор?', 'Время покажет.'}
	},

Таким образом можно записывать диалоги не древовидно, а линейно. Ещё одна особенность переходов состоит в том, что если у фразы не описана реакция, то при переходе будет вызван заголовок фразы:

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!', next = '#отаблетке' },
		{ 'Синюю', 'Вот!', next = '#отаблетке' },
	},
	{ false, '#отаблетке', [[Я взял таблетку и мастер хитро улыбнулся.]],
		{'Я сделал верный выбор?', 'Время покажет.'},
		{'Что делать дальше?', 'Ты свободен.'},
	},
}

При выборе таблетки, будет вызван заголовочный метод фразы '#отаблетке', а уже потом будет представлен выбор.

Если вам нравится линейная запись, вы можете предпочесть следующий вариант:

lua
dlg {
	nam = 'диалог';
	phr = {
		{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
			only = true,
			{'Красную', 'Держите!', next = '#отаблетке' },
			{ 'Синюю', 'Вот!', next = '#отаблетке' },
		}
	}
}:with {
	{ '#отаблетке', [[Я взял таблетку и мастер хитро улыбнулся.]],
		{'Я сделал верный выбор?', 'Время покажет.'},
		{'Что делать дальше?', 'Ты свободен.'},
	},
}

Дело в том, что атрибут phr диалога задаёт первый объект комнаты. Но вы можете заполнить объекты комнаты обычным образом: задав obj или with. Так как при входе в диалог раскрывается 1-я фраза, то остальные фразы вы не увидите (обратите внимания, у фразы '#отаблетке' не стоит false), но вы сможете делать переходы на эти фразы.