Атрибуты фраз
Рассмотрим вариант фразы:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
}
}Если запустить этот диалог, то после выбора, скажем, красной таблетки, у нас останется ещё один выбор синей таблетки. Но наш замысел, явно не в этом! Существует несколько способов сделать диалог правильным.
Во первых, вы можете воспользоваться pop() -- возвратом на предыдущий уровень диалога:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
{'Красную', function() p 'Держите!'; pop() end; },
{'Синюю', function() p 'Вот!'; pop() end; },
}
}Или, в другой записи:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
{'Красную', pfn(pop) 'Держите!' },
{'Синюю', pfn(pop) 'Вот!' },
}
}Но это не слишком удобно, кроме того, что если эти фразы содержат в себе новые фразы? В случаях, когда вариант предлагает выбор, и этот выбор должен быть единственным, вы можете задать у фразы атрибут only:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
}
}В таком случае, после выбора фразы, все фразы текущего контекста будут закрыты.
Ещё одна частая ситуация, вы хотите, чтобы фраза не пряталась после её активации. Это делается заданием флага true:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
{ true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза
-- которая никогда не будет скрыта
}
}Альтернативная запись, с явным заданием атрибута always:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
{ always = true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза
-- которая никогда не будет скрыта
}
}Ещё один пример. Что-если мы хотим, чтобы фраза была показана (или спрятана) по какому-либо условию? Для этого есть функция-обработчик cond.
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
{ true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза
-- которая никогда не будет скрыта
},
{ cond = function() return have 'яблоко' end,
'А хотите яблоко?', 'Спасибо, нет.' };
}В данном примере, только при наличии у игрока яблока, покажется ветка диалога 'А хотите яблоко?'.
Иногда бывает удобно выполнить действие в тот момент, когда варианты текущего уровня(контекста) диалога исчерпаны. Для этого служит функция-обработчик onempty.
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
onempty = function()
p [[Ты сделал свой выбор.]]
pop()
end;
},
{ cond = function() return have 'яблоко' end,
'А хотите яблоко?', 'Спасибо, нет.' };
}Обратите внимание, что когда есть метод onempty, автоматический возврат в предыдущую ветку не производится, предполагается, что метод onempty сделает всё, что нужно.
Все описанные атрибуты могут быть установлены у любой фразы. В том числе и на 1-м уровне:
phr = {
onempty = function()
p [[Вот и поговорили.]]
walkout()
end;
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!' },
{'Синюю', 'Вот!' },
onempty = function()
p [[Ты сделал свой выбор.]]
pop()
end;
},
{ cond = function() return have 'яблоко' end,
'А хотите яблоко?', 'Спасибо, нет.' };
}