Диалоги
Диалоги -- это сцены специального типа 'dlg', содержащие объекты -- фразы. При входе в диалог игрок видит перечень фраз, которые может выбирать, получая какую-то реакцию игры. По умолчанию, уже выбранные фразы скрываются. При исчерпании всех вариантов, диалог завершается выходом в предыдущую комнату (конечно, если в диалоге нет постоянно видимых фраз, среди которых обычно встречается что-то типа 'Завершить разговор' или 'Спросить ещё раз'). При повторном входе в диалог, все скрытые фразы снова становятся видимыми и диалог сбрасывается в начальное состояние (если, конечно, автор игры специально не прикладывал усилия по изменению вида диалога).
Переход в диалог в игре осуществляется как переход на сцену:
obj {
nam = 'повар';
dsc = 'Я вижу {повара}.';
act = function()
walk 'povardlg'
end,
};Хотя я рекомендую использовать 'walkin', так как в случае 'walkin' не вызываются 'onexit/exit' текущей комнаты, а персонаж, с которым мы можем поговорить, обычно находиться в этой же комнате, где и главный герой. То есть:
obj {
nam = 'повар';
dsc = 'Я вижу {повара}.';
act = function()
walkin 'povardlg'
end,
};Если вам не нравится префикс у фраз в виде дефиса, вы можете определить строковую переменную:
std.phrase_prefix = '+';И получить префикс в виде '+' перед каждой фразой. Вы также можете сделать префикс функцией. На вход функции в таком случае будет поступать в виде параметра номер фразы. Задача функции -- вернуть строковый префикс.
Обратите внимание, что 'std.phrase_prefix' не сохраняется, если вам нужно переопределять её на лету, вам придётся восстанавливать её состояние в 'start()' функции вручную!
Важно!
Я рекомендую использовать модуль 'noinv' и задавать свойство 'noinv' в диалогах. Диалоги будут выглядеть красивей, и вы обезопасите свою игру от ошибок и непредсказуемых реакций, при использовании инвентаря внутри диалога (так как обычно автор не подразумевает такие вещи). Например:
require "noinv"
...
dlg {
nam = 'Охранник';
-- в диалогах обычно не нужен инвентарь
noinv = true;
...
}