Skip to content

Атрибуты фраз

Рассмотрим вариант фразы:

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

Если запустить этот диалог, то после выбора, скажем, красной таблетки, у нас останется ещё один выбор синей таблетки. Но наш замысел, явно не в этом! Существует несколько способов сделать диалог правильным.

Во первых, вы можете воспользоваться pop() -- возвратом на предыдущий уровень диалога:

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		{'Красную', function() p 'Держите!'; pop() end; },
		{'Синюю', function() p 'Вот!'; pop() end; },
	}
}

Или, в другой записи:

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

Но это не слишком удобно, кроме того, что если эти фразы содержат в себе новые фразы? В случаях, когда вариант предлагает выбор, и этот выбор должен быть единственным, вы можете задать у фразы атрибут only:

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

В таком случае, после выбора фразы, все фразы текущего контекста будут закрыты.

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

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!' },
		{'Синюю', 'Вот!' },
		{ true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза
		-- которая никогда не будет скрыта
	}
}

Альтернативная запись, с явным заданием атрибута always:

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!' },
		{'Синюю', 'Вот!' },
		{ always = true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза
		-- которая никогда не будет скрыта
	}
}

Ещё один пример. Что-если мы хотим, чтобы фраза была показана (или спрятана) по какому-либо условию? Для этого есть функция-обработчик cond.

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!' },
		{'Синюю', 'Вот!' },
		{ true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза
		-- которая никогда не будет скрыта
	},
	{ cond = function() return have 'яблоко' end,
		'А хотите яблоко?', 'Спасибо, нет.' };
}

В данном примере, только при наличии у игрока яблока, покажется ветка диалога 'А хотите яблоко?'.

Иногда бывает удобно выполнить действие в тот момент, когда варианты текущего уровня(контекста) диалога исчерпаны. Для этого служит функция-обработчик onempty.

lua
phr = {
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!' },
		{'Синюю', 'Вот!' },
		onempty = function()
			p [[Ты сделал свой выбор.]]
			pop()
		end;
	},
	{ cond = function() return have 'яблоко' end,
		'А хотите яблоко?', 'Спасибо, нет.' };
}

Обратите внимание, что когда есть метод onempty, автоматический возврат в предыдущую ветку не производится, предполагается, что метод onempty сделает всё, что нужно.

Все описанные атрибуты могут быть установлены у любой фразы. В том числе и на 1-м уровне:

lua
phr = {
	onempty = function()
		p [[Вот и поговорили.]]
		walkout()
	end;
	{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
		only = true,
		{'Красную', 'Держите!' },
		{'Синюю', 'Вот!' },
		onempty = function()
			p [[Ты сделал свой выбор.]]
			pop()
		end;
	},
	{ cond = function() return have 'яблоко' end,
		'А хотите яблоко?', 'Спасибо, нет.' };
}