Система сюжетной информации (инфопорции)
Система сюжетной информации (ССИ) нужна для обеспечения происхождения и запоминания сюжетных событий в игре.
При помощи ССИ можно создавать абстрактные порции сюжетной информации (инфопорции). Они не могут передаваться от одного объекта к другому. Они могут либо присутствовать, либо отсутствовать; либо устанавливаться, либо сниматься. Фактически наличие инфопорции означает то, что мы дошли до какого-то этапа в сюжете, сценке, последовательности. Условно они разделяются на три группы:
- сюжетные. Могут только устанавливаться. Снимать их как минимум некорректно. Обычно обозначают завершение какого либо события, квеста и так далее;
- квестовые. Могут и устанавливаться, и сниматься. Описывают продвижение персонажа внутри одного квеста.
- вспомогательные. Могут и устанавливаться, и сниматься. Используются обычно для синхронизации скриптов или событий.
Вне зависимости от типа инфопорций, все они описываются идентично и обладают равными возможностями. Разница только в смысловом наполнении. Следует также понимать, что инфопорция всегда находится у одного объекта. Следовательно, если вы установили у игрока инфопорцию, то она не появится у торговца. Если вы установили её у торговца – то она не появится у игрока. Об этом следует помнить, и следить за тем, кому выдаёте инфопорции и у кого проверяете их наличие. Это очень большой источник ошибок и чаще всего ошибаются именно здесь.
Функции скриптового game_object[править]
При помощи скриптовых функций можно давать или забирать информацию у объектов Inventory Owner в игре.
- give_info_portion(info_id) - получить информацию по идентификатору(строковому).
- give_info_portion_via_pda(info_id, who) - получить информацию по идентификатору от указанного объекта.
- disable_info_portion(info_id) - убрать информацию.
- has_info(info_id) - есть ли информация.
- dont_has_info(info_id) - отсутствует ли информация.
Каждая из таких порций имеет уникальный текстовый id и является просто флажком в реестре, который автоматически загружается и сохраняется.
К возможностям info portion относится:
- запуск функции по отношению к персонажу при получении info_portion (action);
- добавления локаций на карту (location);
- возможность инициирования диалогов актером (dialog);
- возможность инициирования диалогов у актера (при разговоре с персонажем, который имеет info_portion) (actor_dialog);
- добавления статей в энциклопедию (article);
- добавление заданий и в меню заданий (task);
- удаление из реестра уже известных info_portions (disable).
Структура инфопорций в XML-файле[править]
Практически все подразделы необязательны.
<!-- id = "название инфопорции"-->
<info_portion id="actor_start">
<!-- скриптовые функции, которые будут вызваны при получении info_portion персонажем, аргументом скриптовый объект персонажа -->
<action>info_test1.test_task1</action> <!-- например, здесь запускается функция для квеста -->
<action>...</action>
<!-- локации, которые будут показаны на карте -->
<location>
<level>0</level>
<x>-250</x>
<y>-127</y>
<icon name="Dealer" x="2" y="2" width="1" height="1"></icon>
<text>Bring artefacts to the Dealer</text>
</location>
<location >.....</location>
<!-- список диалогов, который может инициировать Info Portion непосредственно у актера-->
<dialog>trader_job</dialog>
<dialog>trader_talk_about</dialog>
<dialog>stalker_talk_about</dialog>
<!-- список диалогов, который может инициировать персонаж с Info Portion у актера-->
<actor_dialog>trader_job</actor_dialog>
<actor_dialog>trader_job</actor_dialog>
<!-- список id, деактивируемых info_portions у персонажа при получении данной инфопорции-->
<disable>actor_start01</disable>
<disable>actor_start02</disable>
<!-- список id статей в энциклопедии, которые будут добавлены -->
<article>boar</article>
<article>flesh</article>
<!-- задание -->
<task>
<!-- первое задание в списке является основным и выделяется большим шрифтом -->
<objective>
<text>test task primary</text>
<!--
Скриптовая функция, возвращает текущее состояние задания,используя константы
task.completed - задание (цель выполнена) task.in_progress - в стадии выполнения task.fail - провалено
-->
<script_condition>info_test1.test_task1</script_condition>
</objective>
<!-- остальные задания - второстепенные -->
<objective>
<text>test task secondary 01</text>
<script_condition>info_test1.test_task2</script_condition>
</objective>
<objective>
<text>test task secondary 01</text>
<script_condition>info_test1.test_task3</script_condition>
</objective>
</task>
</info_portion>
Теперь о методике создания инфопорций. Злоупотреблять их количеством не следует. В source_safe GSC хранились графы всех сюжетных и квестовых инфопоршнов, и его поддерживали в живом состоянии, чтобы каждый видел взаимосвязь между ними и представлял общую картину.
Инфопоршны привязаны к уровням, на которых они выдаются. Находятся они в папке gamedata\config\gameplay в файлах с названием info_(название уровня).xml, например: info_l01_escape.xml, info_l03_agropprom.xml и т.д.
Источник[править]
Доки GSC за 2005г., X-Wiki за 2004г.