Методы
Как вы уже знаете, объекты в INSTEAD могут находиться в состоянии открыт/закрыт и выключен/включён. Как это соответствует фразам диалога?
Для обычных фраз, после активации выбора фраза закрывается. При повторном входе в диалог все фразы открываются.
Для фраз с always = true (или true в начале определения) -- такого закрытия не происходит.
Для фраз с hidden = true (или false в начале определения) -- фраза будет создана как выключенная. Она не будет видима до тех пор, пока не будет явно включена.
Для фраз с cond(), каждый раз при просмотре фраз вызывается этот метод, и в зависимости от возвращаемого значения (true/не true) фраза включается или выключается.
Зная это поведение, вы можете прятать/показывать и анализировать фразы обычными функциями вида: disable / enable / empty / open / close / closed / disabled и так далее...
Однако, делать вы это можете только в самом диалоге, так как все фразы идентифицируются по тегам. Если вы хотите модифицировать состояние/анализировать фразы из других комнат вы можете:
- дать фразе имя { nam = 'имя' }...
- искать фразу по тегу в другой комнате: local ph = lookup('#тег', 'диалог') и потом работать с ней;
Что касается функций push/pop, то вы можете вызывать их явно как методы диалога, например:
_'диалог':push '#новая'Но лучше это делать в самом диалоге, например, в enter.
Кроме того, есть метод :reset, который сбрасывает стек переходов и устанавливает стартовую фразу, например:
enter = function(s)
s:reset '#начало'
endСледует отметить, что когда вы делаете enable/disable/open/close фразы, то вы выполняете действие именно над этой фразой, а не над фразами включёнными внутрь. Но так как при показе фраз движок остановится на выключенном/закрытом объекте-фразе и не войдёт внутрь, этого достаточно.