автор статьи - 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, в которой уже будет произведен тщательный разбор создавшейся ситуации.
Обработчики восприятий, как я уже сказал – это отдельная, большая тема, по которой, надеюсь, будут статьи от меня и/или от других участников сайта модостроителей.
По данной статье – прошу в комментарии – дополнения, исправления, замечания, пожелания. По мере возможности все, указанное Вами, буду включать в основной текст статьи, чтобы поддерживать ее в актуальном состоянии.