Фразы
Центральным понятием в диалогах является фраза. Фразы это не просто вопрос-ответ, как можно подумать. Фраза является деревом, и в этом смысле, весь диалог может быть реализован единственной фразой. Например:
dlg {
nam = 'разговор';
title = [[Разговор с продавцом]];
enter = [[Я обратился к продавцу.]];
phr = {
{ 'У вас есть бобы?', '-- Нет.'},
{ 'У вас есть шоколад?', '-- Нет.'},
{ 'У вас есть квас?', '-- Да',
{ 'А сколько он стоит?', '-- 50 рублей.' },
{ 'А он холодный?', '-- Холодильник сломался.',
{ 'Беру два!', 'Остался один.',
{ 'Дайте один!', function() p [[Ок!]]; take 'квас'; end };
}
}
}
}
}Как видно из примера, фраза задаётся атрибутом phr и может содержать разветвлённый диалог. Фраза содержит в себе выборы, каждый из которых тоже может содержать в себе выборы и так далее...
Фраза имеет формат пары: описатель -- реакция. В простейшем случае, это строки. Но они могут быть и функциями. Обычно, функцией бывает реакция, которая может содержать код по изменению игрового мира.
Пара может быть простой:
{'Вопрос', 'Ответ }
А может содержать в себе массив пар:
{'Вопрос', 'Ответ',
{'Под-вопрос1', 'Под-ответ1' },
{'Под-вопрос2', 'Под-ответ2' },
}
На самом деле, если вы посмотрите внимательно на атрибут phr, то вы заметите, что массив выборов тоже является вложенным в главную фразу phr, но только первоначальная пара отсутствует:
dlg {
nam = 'разговор';
title = [[Разговор с продавцом]];
enter = [[Я обратился к продавцу.]];
phr = {
-- тут мог бы быть вопрос ответ 1-го уровня!
-- 'Главный вопрос', 'Главный ответ',
{ 'У вас есть бобы?', '-- Нет.'},
{ 'У вас есть шоколад?', '-- Нет.'},
{ 'У вас есть квас?', '-- Да',
{ 'А сколько он стоит?', '-- 50 рублей.' },
{ 'А он холодный?', '-- Холодильник сломался.',
{ 'Беру два!', 'Остался один.',
{ 'Дайте один!', function() p [[Ок!]]; take 'квас'; end };
}
}
}
}
}На самом деле, так и есть. И вы можете добавить 'Главный вопрос' и 'Главный ответ', но только вы не увидите этот главный вопрос. Дело в том, что при входе в диалог фраза phr автоматически раскрывается, так как обычно нет никакого смысла в диалогах из одной единственной фразы. И гораздо проще понять диалог как набор выборов, чем как единственную древовидную фразу. Так что у phr никогда нет первоначальной пары вопрос-ответ, но мы сразу попадаем в массив вариантов, что более понятно.
Когда мы говорим о том, что диалог на самом деле реализован одной фразой, мы не совсем правы. Дело в том, что мы имеем дело с фразой, внутри которой находятся другие фразы... Это напоминает нам ситуацию с объектами. Действительно, фразы -- это объекты, которые могут находиться внутри друг друга. Итак, посмотрим на диалог свежим взглядом:
dlg {
nam = 'разговор';
title = [[Разговор с продавцом]];
enter = [[Я обратился к продавцу.]];
phr = { -- это объект типа фраза, без dsc и act
-- это 1-я фраза, внутри фразы с dsc и act
{ 'У вас есть бобы?', '-- Нет.'},
-- это 2-я фраза, внутри фразы с dsc и act
{ 'У вас есть шоколад?', '-- Нет.'},
-- это 3-я фраза, внутри фразы с dsc и act
{ 'У вас есть квас?', '-- Да',
-- это 1-я фраза внутри 3й фразы с dsc и act
{ 'А сколько он стоит?', '-- 50 рублей.' },
{ 'А он холодный?', '-- Холодильник сломался.',
{ 'Беру два!', 'Остался один.',
-- здесь act в виде функции
{ 'Дайте один!', function() p [[Ок!]]; take 'квас'; end };
}
}
}
}
}Как видим, диалог -- это комната, а фразы -- специальные объекты! Теперь вам станет понятным дальнейшее изложение.
Внимание! По умолчанию, когда игрок нажимает на один из вопросов в списке, движок повторяет его в выводе и только потом выводит ответ. Это сделано для того, чтобы диалог выглядел связанным. Если вы хотите отключить такое поведение, используйте настройку std.phrase_show:
std.phrase_show = false -- не выводить фразу-вопрос при выбореЭта настройка действует на все диалоги, устанавливайте её в init() или start() функции.