Система сюжетной информации (инфопорции)

Материал из xrWiki
(перенаправлено с «Инфопорции»)
Перейти к: навигация, поиск

Система сюжетной информации (ССИ) нужна для обеспечения происхождения и запоминания сюжетных событий в игре.

При помощи ССИ можно создавать абстрактные порции сюжетной информации (инфопорции). Они не могут передаваться от одного объекта к другому. Они могут либо присутствовать, либо отсутствовать; либо устанавливаться, либо сниматься. Фактически наличие инфопорции означает то, что мы дошли до какого-то этапа в сюжете, сценке, последовательности. Условно они разделяются на три группы:

  • сюжетные. Могут только устанавливаться. Снимать их как минимум некорректно. Обычно обозначают завершение какого либо события, квеста и так далее;
  • квестовые. Могут и устанавливаться, и сниматься. Описывают продвижение персонажа внутри одного квеста.
  • вспомогательные. Могут и устанавливаться, и сниматься. Используются обычно для синхронизации скриптов или событий.

Вне зависимости от типа инфопорций, все они описываются идентично и обладают равными возможностями. Разница только в смысловом наполнении. Следует также понимать, что инфопорция всегда находится у одного объекта. Следовательно, если вы установили у игрока инфопорцию, то она не появится у торговца. Если вы установили её у торговца – то она не появится у игрока. Об этом следует помнить, и следить за тем, кому выдаёте инфопорции и у кого проверяете их наличие. Это очень большой источник ошибок и чаще всего ошибаются именно здесь.


Функции скриптового 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г.