Skip to content

Диалоги

Диалоги -- это сцены специального типа 'dlg', содержащие объекты -- фразы. При входе в диалог игрок видит перечень фраз, которые может выбирать, получая какую-то реакцию игры. По умолчанию, уже выбранные фразы скрываются. При исчерпании всех вариантов, диалог завершается выходом в предыдущую комнату (конечно, если в диалоге нет постоянно видимых фраз, среди которых обычно встречается что-то типа 'Завершить разговор' или 'Спросить ещё раз'). При повторном входе в диалог, все скрытые фразы снова становятся видимыми и диалог сбрасывается в начальное состояние (если, конечно, автор игры специально не прикладывал усилия по изменению вида диалога).

Переход в диалог в игре осуществляется как переход на сцену:

lua
obj {
	nam = 'повар';
	dsc = 'Я вижу {повара}.';
	act = function()
		walk 'povardlg'
	end,
};

Хотя я рекомендую использовать 'walkin', так как в случае 'walkin' не вызываются 'onexit/exit' текущей комнаты, а персонаж, с которым мы можем поговорить, обычно находиться в этой же комнате, где и главный герой. То есть:

lua
obj {
	nam = 'повар';
	dsc = 'Я вижу {повара}.';
	act = function()
		walkin 'povardlg'
	end,
};

Если вам не нравится префикс у фраз в виде дефиса, вы можете определить строковую переменную:

lua
std.phrase_prefix = '+';

И получить префикс в виде '+' перед каждой фразой. Вы также можете сделать префикс функцией. На вход функции в таком случае будет поступать в виде параметра номер фразы. Задача функции -- вернуть строковый префикс.

Обратите внимание, что 'std.phrase_prefix' не сохраняется, если вам нужно переопределять её на лету, вам придётся восстанавливать её состояние в 'start()' функции вручную!

Важно!

Я рекомендую использовать модуль 'noinv' и задавать свойство 'noinv' в диалогах. Диалоги будут выглядеть красивей, и вы обезопасите свою игру от ошибок и непредсказуемых реакций, при использовании инвентаря внутри диалога (так как обычно автор не подразумевает такие вещи). Например:

lua
require "noinv"
...
dlg {
        nam = 'Охранник';
        -- в диалогах обычно не нужен инвентарь
        noinv = true;
        ...
}