Всё о Готике
Система гильдий в скриптах готики.


автор статьи - marazmus

Для игрока гильдия – это важная часть сюжета, его выбор ветви игры; также это «ярлык» для остальных персонажей, их принадлежность к определенному кругу.

Технически же (скриптово) механизм гильдий – это базовый механизм установки и контроля взаимоотношений множества персонажей между собой.

Можно сказать проще – чтобы регулировать отношения большой группы персонажей друг с другом и с другими группами, и применяется гильдия.

В классе персонажа есть атрибут guild (var int), через который и происходит присвоение гильдии каждому конкретному персонажу.

Основа механизма гильдий – массив GIL_ATTITUDES размерности 16 на 16 int-констант. Этот массив «зарезервирован» движком игры и не подлежит изменению в размерах. Этот массив содержит начальные взаимоотношения гильдий людей между собой.

Массив можно найти по пути
AI\Human\Guilds.D

Для первоначальной работы лучше взять этот файл из каталога Content, взятого из MDK готики. В нем все крайне понятно с первого взгляда. Каждая строка и каждый столбец – это конкретная гильдия, значение на пересечении строки и столбца – это отношение гильдий друг к другу. Например, возьмем пересечение строки PAL и столбца BDT. Значение этого пересечения – ATT_HOSTILE, что означает враждебность.

Упомянем сразу константы, возможные в этом массиве:

code:
CONST INT ATT_FRIENDLY = 3; // дружелюбный (не нападает никогда, даже если задеть оружием)
CONST INT ATT_NEUTRAL = 2; // нейтральный (не нападает без повода, но если задеть оружием, даже случайно, нападает)
CONST INT ATT_ANGRY = 1; // сердитость (сразу не нападает, но и не разговаривает)
CONST INT ATT_HOSTILE = 0; // враждебность (нападает сразу, без предупреждения)

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

Так как данный массив описан как константа, его нельзя изменять по ходу игры.

Примечание: есть подозрение, что массив можно переопределить как переменную, а затем проинициализировать ее в startup.d; это даст возможность менять содержимое массива «на лету»; попозже постараюсь проверить это дело.

Но что же делать, если нужно поменять отношения гильдий прямо по ходу игры?

Для этого служит функция

void Wld_SetGuildAttitude (int guild1, int attitude, int guild2); – установить отношение между гильдиями, где guild1, guild2 – гильдии, между которыми устанавливается отношение, attitude – отношение между гильдиями (определены отношения ATT_HOSTILE, ATT_FRIENDLY, ATT_NEUTRAL, ATT_ANGRY).

Пример использования:

WLD_SetGuildAttitude(GIL_PAL, ATT_FRIENDLY, GIL_VLK); – «подружили» паладинов и горожан.

Чтобы узнать взаимоотношения гильдий, применяется функция
int Wld_GetGuildAttitude (int guild1, int guild2); – получить отношение между гильдиями guild1 и guild2.

Пример использования:

vCurrentGuild_PAL_VLK = WLD_GetGuildAttitude(GIL_PAL, GIL_VLK); – в переменную vCurrentGuild_PAL_VLK будет возвращено значение, выставленное ранее функцией WLD_SetGuildAttitude, или, если оно не менялось, из массива GIL_ATTITUDES.

Нужно отметить, что все, что сказано выше про гильдии – это самый базовый, «нижний» уровень обработки отношений между персонажами. Исходя из системы отношений между гильдиями, движок «принимает решение» о том, кто кому враг или друг; это решение затем определяет, какой обработчик восприятий будет вызван – к примеру, если между гильдиями двух персонажей прописаны враждебные отношения, то в качестве обработчика восприятий (реакции персонажей друг на друга) будет вызван обработчик B_AssessEnemy; если же гильдии не враждебны, будет вызваны другие обработчики.

А сами обработчики восприятий – это более узкая, «точечная» работа, позволяющая манипулировать отношениями как множеств персонажей, так и нескольких конкретных NPC; но это уже другая тема J.

Система гильдий позволяет также оперировать отношениями к конкретному жизненном пространству. Говоря проще J – можно присвоить каждой конкретной комнате или зданию принадлежность к определенной гильдии – после чего отношения между гильдиями начнут распространяться на данную комнату и на находящихся в ней персонажей.

К примеру, казармам милиции присвоен статус GIL_MIL. Любой, кто войдет туда, будет «проверен» движком игры на взаимоотношения гильдии персонажа и комнаты. Затем ситуация будет передана в обработчик восприятий входа в комнату B_AssessPortalCollision, в которой уже будет произведен тщательный разбор создавшейся ситуации.

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

По данной статье – прошу в комментариидополнения, исправления, замечания, пожелания. По мере возможности все, указанное Вами, буду включать в основной текст статьи, чтобы поддерживать ее в актуальном состоянии.

 
 
Copyright © 2008 GotomanRambler's Top100

Refo.ru - русские сайты
 
 
Hosted by uCoz