• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

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

Статус
В этой теме нельзя размещать новые ответы.

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.776
Баллы
1.625
Для игрока гильдия – это важная часть сюжета, его выбор ветви игры; также это «ярлык» для остальных персонажей, их принадлежность к определенному кругу. Технически же (скриптово) механизм гильдий – это базовый механизм установки и контроля взаимоотношений множества персонажей между собой.
Можно сказать проще – чтобы регулировать отношения большой группы персонажей друг с другом и с другими группами, и применяется гильдия.
В классе персонажа есть атрибут guild (var int), через который и происходит присвоение гильдии каждому конкретному персонажу.
Основа механизма гильдий – массив GIL_ATTITUDES размерности 16 на 16 int-констант. Этот массив «зарезервирован» движком игры и не подлежит изменению в размерах. Этот массив содержит начальные взаимоотношения гильдий людей между собой.
Массив можно найти по пути AI\Human\Guilds.D
Для первоначальной работы лучше взять этот файл из каталога Content, взятого из MDK готики. В нем все крайне понятно с первого взгляда. Каждая строка и каждый столбец – это конкретная гильдия, значение на пересечении строки и столбца – это отношение гильдий друг к другу. Например, возьмем пересечение строки PAL и столбца BDT. Значение этого пересечения – ATT_HOSTILE, что означает враждебность.
Упомянем сразу константы, возможные в этом массиве:
Код:
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 - можно присвоить каждой конкретной комнате или зданию принадлежность к определенной гильдии – после чего отношения между гильдиями начнут распространяться на данную комнату и на находящихся в ней персонажей.
К примеру, казармам милиции присвоен статус GIL_MIL. Любой, кто войдет туда, будет «проверен» движком игры на взаимоотношения гильдии персонажа и комнаты. Затем ситуация будет передана в обработчик восприятий входа в комнату B_AssessPortalCollision, в которой уже будет произведен тщательный разбор создавшейся ситуации.
Обработчики восприятий, как я уже сказал – это отдельная, большая тема, по которой, надеюсь, будут статьи от меня и/или от других участников сайта модостроителей.

Автор - Маразмус
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу