Теги
Только что мы рассмотрели механизмы диалогов, которые уже позволяют создавать довольно сложные диалоги. Однако, и этих средств может не хватить. Иногда нам нужно уметь обращаться к фразам из других мест диалога. Например, выборочно включать их, или анализировать их состояние. А также делать переходы из одних ветвей диалога в другие.
Всё это возможно для фраз, у которых есть тег. Создать фразу с тегом очень просто:
phr = {
{ '#что?', 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
{'#красная', 'Красную', 'Держите!' },
{'#синяя', 'Синюю', 'Вот!' },
},
}Как видим, наличие в начале фразы строки, которая начинается на символ '#' - означает наличие тега.
Для таких фраз работают стандартные методы, такие как seen или enable/disable. Например, мы могли бы обойтись без атрибута only следующим образом:
phr = {
{ '#что?', 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
{'#красная', 'Красную', 'Держите!'
cond = function(s)
return not closed('#синяя')
end
},
{'#синяя', 'Синюю', 'Вот!',
cond = function(s)
return not closed('#красная')
end
},
},
}Теги, кроме того, что позволяют узнавать и менять состояние конкретных фраз, делают возможным переходы между фразами. Для этого используются функции push и pop.
push(куда) -- делает переход на фразу с запоминанием позиции в стеке.
pop([куда]) -- вызванная без параметра, поднимается на 1 позицию в стеке истории. Можно указать конкретный тег фразы, которая должна быть в истории, в таком случае возврат будет осуществлён на неё.
Нужно отметить, что при переходе по push, мы переходим не на одну фразу, а на список фраз этой фразы. То-есть раскрываем ее, также как это сделано для главной фразы phr. Например:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!', next = '#отаблетке' },
{ 'Синюю', 'Вот!', next = '#отаблетке' },
},
{ false, '#отаблетке',
{'Я сделал верный выбор?', 'Время покажет.'}
},
}Тут мы видим сразу несколько приёмов:
атрибут next, вместо явного описания реакции в виде функции с push. next -- это простой способ записать push.
false в начале фразы, делает фразу выключенной. Она находится в состоянии выключена, пока не сделать явный enable. Однако внутрь фразы мы можем перейти, и показать содержимое выборов. Альтернативная запись возможна с использованием атрибута hidden:
{ hidden = true, '#отаблетке',
{'Я сделал верный выбор?', 'Время покажет.'}
},Таким образом можно записывать диалоги не древовидно, а линейно. Ещё одна особенность переходов состоит в том, что если у фразы не описана реакция, то при переходе будет вызван заголовок фразы:
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!', next = '#отаблетке' },
{ 'Синюю', 'Вот!', next = '#отаблетке' },
},
{ false, '#отаблетке', [[Я взял таблетку и мастер хитро улыбнулся.]],
{'Я сделал верный выбор?', 'Время покажет.'},
{'Что делать дальше?', 'Ты свободен.'},
},
}При выборе таблетки, будет вызван заголовочный метод фразы '#отаблетке', а уже потом будет представлен выбор.
Если вам нравится линейная запись, вы можете предпочесть следующий вариант:
dlg {
nam = 'диалог';
phr = {
{ 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?',
only = true,
{'Красную', 'Держите!', next = '#отаблетке' },
{ 'Синюю', 'Вот!', next = '#отаблетке' },
}
}
}:with {
{ '#отаблетке', [[Я взял таблетку и мастер хитро улыбнулся.]],
{'Я сделал верный выбор?', 'Время покажет.'},
{'Что делать дальше?', 'Ты свободен.'},
},
}Дело в том, что атрибут phr диалога задаёт первый объект комнаты. Но вы можете заполнить объекты комнаты обычным образом: задав obj или with. Так как при входе в диалог раскрывается 1-я фраза, то остальные фразы вы не увидите (обратите внимания, у фразы '#отаблетке' не стоит false), но вы сможете делать переходы на эти фразы.