Диалоги

Материал из xrWiki
Перейти к: навигация, поиск

Общение осуществляется путём связи двух персонажей специальной структурой – "диалогом". Диалог представляет собой однонаправленный граф фраз. Фраза представляет собой структуру специального вида:

<?xml version="1.0" encoding="windows-1251" ?>
<game_dialogs>
    <dialog id="уникальная строка – идентификатор диалога">
        <phrase_list>
        
		<!-- id – уникальный (в пределах диалога) номер фразы -->
			<phrase id="6">
            
				<!-- текстовое представление фразы -->
				<text>Sorry, but I have to go.</text>
                
				<!-- или скриптовая функция, которая возвращает строку текста -->
				<script_text>info_test1.test_text</script_text>
                
				<!-- минимальный уровень благосклонности персонажа, чтоб он смог сказать фразу -->
				<goodwill>60</goodwill>
                
				<!-- cкриптовые предикаты (если они ВСЕ вернут true, то фраза станет доступной) -->
				<precondition>info_test1.test_action</action>
				<precondition>info_test1.test_action1</action>
                
				<!-- особые предикаты (проверяют наличие/отсутствие порций информации у того, кто говорит фразу) -->
				<has_info>info_name1</has_info>
				<dont_has_info>info_name1</dont_has_info>
                
				<!-- cписок id тех фраз, которые станут доступны собеседнику после того, как будет сказана эта фраза -->
				<next>7</next>
				<next>5</next>
                
				<!-- cкриптовые функции, которые могут быть вызваны -->
				<action>info_test1.test_action</action>
				<action>info_test1.test_action1</action>
                
				<!-- особые функции, которые дают/убирают инфопорции тому, кто говорит фразу -->
				<give_info>info_name1</give_info>
				<disable_info>info_name1</disable_info> 
		</phrase>
	</dialog>
</game_dialogs>

У диалога всегда есть одна стартовая фраза (с id="0") и одна или несколько финальных (отсутствуют теги <next>). Персонаж, который начинает диалог, всегда говорит стартовую фразу.

После того как сказана фраза, право говорить переходит к собеседнику. Он выбирает фразу из списка доступных фраз, который представляет собой список тех фраз, на которые ссылаются <next> сказанной фразы и для которой все скриптовые функции <precondition> возвращают true. После того как фраза сказана, последовательно выполняются все скриптовые действия, имена которых заданы тегами <action>.

Все вызываемые скриптовые функции (как action, так и precondition) задаются своим ПОЛНЫМ именем: NAMESPACE.FUNC_NAME, где NAMESPACE – обычно просто имя файла скрипта с функцией.

Все скриптовые функции получают на вход два параметра: собеседник1 и собеседник2. Эти параметры представляют собой объекты персонажей, ведущих диалог (актер, сталкеры, торговцы). Причём первым параметром идёт тот, кто говорит фразу.

Особой фразой является "пустышка" – фраза, в которой отсутствует тег <text>. Фразы-пустышки полезны, если мы хотим пропустить очередь говорить одного из собеседников. Также с помощью пустышек можно делать стартовые "развилки", то есть если нужно сделать возможность начинать диалог не с одной, а со списка различных фраз (в таком случае делается две пустышки с id 0 и 1).

Диалог заканчивается, когда сказана фраза, у которой нет тегов <next>. Если теги <next> есть, но не все они доступны в силу невыполненных precondition, то это считается ошибкой.

В диалоге допустимы циклы, это не считается ошибкой – главное, чтобы присутствовала фраза БЕЗ тега <next> (выходная фраза), иначе из диалога попросту нельзя будет выйти.

Общая структура диалога имеет вид:

<!-- priority="-1" – целое число (может быть отрицательным); чем меньше число, тем ниже диалог появится при выборе из меню актора -->
<!-- id - уникальная строка, однозначно определяющая каждый диалог -->

<dialog id="test_dialog" priority="-1">
    
    <!-- cкриптовый предикат активизации диалога -->
    <precondition>info_test1.test_predicate</precondition>
        
    <!-- их может быть несколько -->
    <precondition>info_test1.test_predicate2</precondition>
        
    <!-- предикаты, аналогичные таким же во phrase -->
    <has_info>info_name1</has_info>
    <dont_has_info>info_name1</dont_has_info>
        
    <phrase_list>
        <!-- список фраз -->
    <phrase_list> 
        
</dialogs>

Текст диалога пишется в одну строку, и переносится в окне интерфейса автоматически по словам. Если нужны специальные переносы, то их можно сделать через символ перевода строки /n


Локализация текстов (система string_table)[править]

Следует избегать указания текста в игре напрямую. Для этого создана хитроумная система string_table.

Логика работы предельно проста. Каждый текст, перед выводом на экран прогоняется через особую таблицу. В таблице указаны соответствия входящий_текст – исходящие_тексты. То есть для каждого входящего текста может быть несколько исходящих. По идее по одному исходящему тексту для каждого языка локализации. Если для текущего входящего текста соответствия не найдено, то на экран выводится он сам. Таким образом, если вы в диалоге напишете фразу русским языком, то она так и будет выводиться русским языком даже в английской версии игры.

Поэтому везде, где нужно указать текст, который выводится на экран, вместо текста указывается уникальный идентификатор, по которому из стрингтейбла в зависимости от версии игры (английская, русская) выберется необходимый текст. Если же текст не будет найден, то на экран выведется уникальный идентификатор, и по нему можно будет увидеть что не так, и всё пофиксить.

Все стрингтейблы задаются в папке gamedata\config\text\. По этому пути созданы несколько папочек, по одной на каждый язык. Внутри каждой папочки абсолютно идентичный набор файлов (в идеале).

В каждом файле стрингтейбла описываются фразы. Например:

<string id="escape_factory_assault_hello_2">
    <text>Ты, наверное, тот малый, о котором Волк говорил? Вообщем смотри, бандитов в принципе немного. Вот только мы своей толпой тудя вряд ли тихо проберёмся. На втором этаже снайпер сидит, все подходы пасёт. Если бы не он - мы бы их как следует наказали.</text>
</string>

Таким образом, уникальному идентификатору escape_factory_assault_hello_2 ставится в соответствие текст фразы. А там, где нам нужно ставить данную фразы — мы указываем её идентификатор.

Аналогичная запись в англоязычном файле:

<string id="escape_factory_assault_hello_2">
    <text>You are supposed to be that guy Wolf has been talking about? Well it’s up to you now, basically there are not so many bandits there. Although we can hardly penetrate it together. Sniper has settled on the first floor staring at all passing nearby. If it were not for him – we would punish them swiftly.</text>
</string>

В диалоге же соответствующая запись задается так:

<phrase id="2">
    <text>escape_factory_assault_hello_2</text>
</phrase>

Файлы со стрингтейблами диалогов называются следующим образом: gamedata\config\text\stable_dialogs_название_уровня.xml (или \eng\ для английской версии).

Файлы со стрингтейблами заданий и подзаданий квестов именуются следующим образом:
gamedata\config\text\rus\string_table_tasks_название_уровня.xml

Файлы со стрингтейблами иноформации в энциклопедии именуются следующим образом:
gamedata\config\text\rus\string_table_enc_название_уровня.xml


Озвучка диалогов[править]

Озвучка диалогов происходит в момент, когда персонаж говорит фразу в окне диалогов. В каждый момент времени может отыгрываться только одна фраза, т.е. если в данный момент проигрывается озвучка сказанной фразы, и в этот момент собеседник говорит другую фразу, то первая фраза останавливается и начинает проигрываться вторая.

Для того, чтобы фраза озвучивалась, необходимо создать звуковой файл с именем, идентичным идентификатору фразы в диалоге и разместить его в папке X:\gamedata\sounds\characters_voice\dialogs

Если для какой-либо фразы не будет найден соответствующий звуковой файл, то она озвучиваться не будет.


Подключение диалогов и локализации[править]

В главном конфиг-файле движка system.ltx файлы диалогов перечислены в особых секциях:

[dialogs]
files = dialogs, dialogs_marsh, dialogs_escape, dialogs_garbage

Файлы локализации читаются из папки, указанной в файле localization.ltx, подключённому к system.ltx через директиву #include. Например, для русского языка:

[string_table]
language = rus

будет выбрана папка gamedata\configs\text\rus, из которой будут прочитаны все XML-файлы.



Скопировано из доков GSC за 2005г, исправлено и дополнено