ФЭНДОМ


Вступление

Здравствуй, товарищ. Если ты зашел сюда не случайно, то нам наверняка по пути. Сегодня я постараюсь максимально подробно описать то, что заставляет персонажей из Oblivion быть не просто разговаривающими декорациями, а похожими на живых (хоть иногда и не очень удачно) персонажей. Речь пойдет про такую замечательную вещь, как AI-пакеты. Я никогда не занимался моддингом других частей TES, поэтому мои знания полезны только для модификации The Elder Scrolls IV: Oblivion.

Для дальнейших действий вам потребуется TES Construction Set (в дальнейшем просто CS), сам Oblivion, время и желание. Где скачать CS я писать не буду, так как источников масса. Я работаю с версией 1.2.404.

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

Где пакеты?

  • Для начала откройте CS. Вы увидите несколько окон, но сейчас нам потребуется именно Object Window, в котором все игровые сущности разбиты на категории и подкатегории. Сейчас там практически пусто, потому что программа не понимает с каким файлом вы хотите проводить манипуляции.
  • В верхней текстовой навигации выберите «File -> Data…». Появится новое окно с идентичным названием «Data». Здесь перечислен список *.esm и *.esp-файлов, которые находятся в «\Oblivion\Data». Приблизительно такой же список вы увидите при запуске предзагрузочного окна Oblivion, зайдя в «Файлы данных».
  • Выберите «Oblivion.esm», как это сделал я, и нажмите «Ок»:

Cs data window

Начнётся довольно-таки длительная загрузка ресурсов игры, поэтому просто подождите в течение пары минут.

  • Теперь, когда файл загрузился, в окне Object Window перейдите к категории «Actors -> NPC». Перед вами появится таблица всех персонажей, которых создает/изменяет этот файл. Вы можете сортировать информацию в таблице путем нажатия по названию нужного столбца. "Жертвой" наших опытов будет Абуки, которая является первым персонажем в таблице, если сортировать по английским именам. Два раза нажмите на строку, которая отвечает за данные этого персонажа и откроется окно с названием «NPC». Описывать его сейчас я не буду (возможно, я это сделаю в какой-нибудь другой статье). Сейчас просто нажмите кнопку «AI», которая находится в левом нижнем углу. Откроется искомое окно «AI — Object Name».

Разбор окна

Несмотря на то, что тема статьи — «AI-пакеты», я рассмотрю и все остальные параметры в этом окне, так как, возможно, у вас могут возникнуть вопросы, связанные с их предназначением.

AI Attributes

Перечисленные ниже атрибуты — скрытые от игрока параметры персонажа. Значения этих параметров, в основном, фиксированные, но есть и исключения. AI Attributes

  • Agression — влияет, как вы уже могли понять, на агрессию персонажа. Нюансы (первого персонажа я обозначу П1, а второго П2):
  • Если агрессия П1 = 0, то он не будет самообороняться в случае нападения П2.
  • Если агрессия П1 = от 1 до 5, то П1 будет атаковать П2, только если тот на него напал.
  • Если агрессия П1 = от 5 и выше, то он будет нападать на П2, если отношение к тому упадёт ниже «Агрессия - 5». Допустим, уровень агрессии П1 = 10. П2 его очень разозлил и отношение упало до 4 (4 < 10-5). Это заставит П1 атаковать П2.
  • Если агрессия П1 = 106 и выше, то П1 будет атаковать всех в области своей видимости.
  • Практически у всех мирных персонажей значение агрессии равно 5.
  • Confidence — "храбрость" персонажа. Чем выше это значение, тем меньше шанс того, что персонаж будет убегать в бою. Если 0 — будет убегать всегда, если 100, то наоборот, никогда.
  • Energy level — чем выше значение этого параметра, тем более подвижен будет персонаж при разгуливании по локации. 50 — стандартное значение. У оленей, к примеру, 80, из-за чего они так активно прыгают на полянках.
  • Responsibility — косвенно определяет "порядочность" персонажа. Чем ниже значение, тем хуже он себя ведет. Подробнее:
  • Чем хуже значение, тем лучше он относится к персонажу с дурной славой. И наоборот.
  • Если значение слишком низкое, персонаж может воровать некоторые вещи, которые он хочет использовать, но у него их нет в наличии.
  • Если значение ниже 30 и персонаж является торговцем, то он будет покупать краденые вещи.
  • Если значение равно 100, то персонаж всегда пожалуется на преступника.

Buys / Sells

BuysSells

Здесь отмечается, какими категориями товаров персонаж может торговать. У Абуки отмечены «Ingredients» и «Potions» — это значит, что она будет покупать и продавать всё, что входит в категорию ингредиентов и зелий.

«Barter Gold» отвечает за максимальную сумму сделки с этим персонажем, если она равняется 50 (как в этом случае), то нельзя будет продать какую-нибудь вещь, стоимость которой превышает это значение (например: 51).

Auto-Calc Other

Auto-Calc Other
Эта секция отвечает за такие вещи, как: ремонт (Repair), перезарядка зачарованных вещей (Recharge) и тренировку навыков персонажа (Training). Поле, которое находится справа от обучаемого навыка, отвечает за максимум, выше которого персонаж обучить не сможет. То есть в нашем случае: Абуки не сможет обучать навыку «Изменение», если тот у персонажа уже равен или больше 70. Если вы установите все три галочки, то персонаж действительно будет предоставлять все три услуги: и тренировать, и перезаряжать, и ремонтировать, но учтите, что это отрицательно повлияет на баланс.

AI Package List

AI Package List

Мы практически у цели. Это — таблица, в которой перечислены сами AI-пакеты. Что касается названия столбцов:

  • EditorID — идентификатор AI-пакета этого персонажа. Его имя не обязательно должно быть уникальным. Чтобы убедиться в этом, нажмите правой кнопкой мыши на пакет «TavernServices», а затем на «Use Info». Перед вам появится одно из самых полезных окон в программе, «Use Report», которое отвечает за использование и зависимости одного игрового объекта в других игровых элементах. Например, сейчас мы увидели, что пакет «TavernServices» используется большинством других владельцев таверны.
  • Type — тип пакета. Об этом подробнее ниже.
  • Day of Week — отвечает за то, в какой день недели будет выполняться пакет. Есть несколько вариаций.
  • Any — каждый день.
  • Какой-то конкретный день недели (только понедельник, или только вторник, или только, например, суббота, и так далее).
  • Weekdays (MTWTF) — по будням.
  • Weekends (SS) — на выходных.
  • Monday, Wednesday, Friday — пакет будет выполняться и в понедельник, и в среду, и в пятницу.
  • Tuesday, Thursday — пакет будет выполняться во вторник и четверг.
  • Month — используется крайне редко, поэтому просто знайте, что это позволяет запускать пакет только в определенный месяц или пору года (весна, лето, зима, осень).
  • Day — отвечает за работу AI-пакета только в какое-то число. Можете сделать какой-нибудь редкий пакет, где персонаж будет отмечать свой маленький праздник или проводить особый ритуал раз в месяц, но вряд ли игрок это заметит. По этой причине это тоже практически не используется.
  • Time — час, когда пакет заработает. Например, у пакета «AbhukiSleep» он равен 2. Это значит, что он запустится в 2 часа ночи.
  • Duration — длительность выполнения пакета. Если Абуки идёт спать в 2 часа ночи, а его (пакета) «Duration» равен 4, то она будет спать в течение 4 часов.
  • Target Data — информация о цели в этом пакете. Например, когда персонажа нужно заставить кого-то или что-то искать.
  • Location Data — отвечает за месторасположение, локацию и ссылку на объект, с которым персонаж будет взаимодействовать в этом пакете.
  • Condition Data — дополнительное условие, при котором будет выполнен пакет.

Кроме этого, чуть выше (возле названия секции) есть две кнопки влево-вправо, которые перемещают пакеты в списке. Warning-icon Важно: Чем выше пакет, тем он важнее. Если персонажу нужно будет выбирать из нескольких пакетов, то он выберет тот, что выше.

Типы пакетов

Obl pack types

Я условно поделил пакеты на две категории: часто и редко используемые.

Часто используемые

  • Eat — заставит персонажа покушать. Можно указать конкретное место (стул, лавку и прочее), только ячейку локации (например, всю таверну) или только радиус. Некоторые нюансы:
  • Если указано и место (стул), и радиус, то персонаж не растеряется, если его стул займёт кто-то другой, а будет искать, где бы присесть в указанном радиусе.
  • Если указано, какой предмет должен кушать персонаж, то он будет есть его. Если он закончился, то он либо купит его, либо украдёт, в зависимости от его "порядочности".
  • Именно из-за того, что в большинстве пакетов не указаны конкретные предметы для поедания, персонажи будут брать отравленные яблоки со стола, есть и умирать.
  • Find — персонаж в определенном радиусе или комнате будет искать нужный объект в необходимом количестве. К примеру, такой пакет заставляет Алавен найти и убить 15 оленей в радиусе 10000. В зависимости от того, чем является искомый объект, персонаж будет по-разному с ним взаимодействовать:
  • С персонажем — начнёт разговаривать с целью или воевать с ней (зависит от отношения и агрессии).
  • С животным — начнет атаковать.
  • С контейнером и дверью — откроет.
  • С предметом — возьмет.
  • Со стулом, скамьей, лавкой и т.д. — присядет.
  • С кроватью — приляжет.
  • Follow — персонаж будет следовать за указанной целью. Самый простой и наглядный пример — когда вы становились чемпионом Арены, за вами, именно из-за этого пакета, бегает фанат.
  • Sleep — в определенное время персонаж пойдет спать в течение некоторого количества часов (указанного в «Duration»). Можно указать конкретную кровать, дом, в котором персонаж будет искать кровать, либо просто радиус поиска кровати. Если у персонажа низкий показатель "порядочности", он сможет позволить себе поспать на кровати, которая принадлежит другому персонажу. Это один из самых часто используемых и легких AI-пакетов.
  • Travel — заставит персонажа отправиться в определенную локацию. Если он уже находится там, то пакет не окажет никакого влияния на поведение персонажа. На этот пакет огромное влияние оказывают флаги.
  • Use Item At — персонаж будет использовать указанный предмет, если он есть у него в инвентаре или находится поблизости (в указанном радиусе). Работает, только если у персонажа есть соответствующие анимации. С помощью этого пакета можно заставить магов колдовать, заниматься алхимией и прочими вещами, а бойцов — лупить по манекену. Простой пример: Агронак гро-Малог (Серый Принц, на Арене который), тренируется любым оружием из-за влияния этого пакета.
  • Wander — заставит персонажа прийти в конкретное место и разгуливать в определенном радиусе. Крайне желательно, чтоб радиус был больше 150 и обязательно, чтоб он был больше 0, иначе включение такого пакета приведет к некорректному поведению персонажа (вплоть до вылета игры). Если на пути персонажа повстречается кто-то другой, он попытается с ним побеседовать (если не отключен флаг «Skip Fallout Behavior»). Позволяет присаживаться на стулья и скамьи, если они находятся в радиусе блуждания персонажа. Частота перемещений зависит от параметра Energy level (ищите выше его описание).

Редко используемые

Редко используемые пакеты вам не понадобятся на первых порах, поэтому вы просто можете пропустить их описание.

  • Accompany — сопровождение конкретной цели. Можно заставить одного персонажа сопроводить другого в определенном радиусе.
  • Ambush — персонаж пойдет в указанное место и будет ждать появление цели в указанном радиусе. Используется редко, так как есть масса других, более простых и проверенных способов.
  • Cast Magic — заставляет персонажа использовать определенное заклинание в конкретном (или на конкретное) месте. Используется крайне редко из-за того, что есть более хороший пакет «Use Item At».
  • Escort — персонаж будет сопровождать свою цель в определенную локацию. Если интересно, как пример, такой пакет используется для Бауруса в квесте «Путь Рассвета», чтобы тот эскортировал протагониста к затопленной канализации под Эльфийскими садами.
  • Flee not Combat — этот пакет не работает (если я не прав, пишите в обсуждении).

Сама суть

Flags

Obl pack flags
  • Continue if PC near — пакет не будет завершен, пока игрок находится рядом с этим персонажем. Например, можно сделать так, что как только вы уйдете, все перестанут заниматься своими делами, а пойдут спать. И наоборот: пока вы не уйдете, будут вести себя хорошо.
  • Must Reach Location — выполнение пакета прекратится только после того, как персонаж достигнет нужной локации.
  • Offers Services — во время выполнения этого пакета персонаж сможет оказывать услуги (торговля, ремонт, перезарядка и тренировка).
  • Must Complete — пакет не завершится, пока персонаж не сделает всё, что указано в требованиях пакета (месторасположение и цель). То есть, если ему нужно прийти в Бравил и убить кого-то, то пакет не будет завершен, пока он не сделает это.
  • Once per day — флаг, разрешающий пакету запускаться лишь раз в 24 часа.
  • Skip Fallout Behavior — персонаж не будет общаться с другими персонажами, которых он встретит во время выполнения этого пакета.
  • Use Horse — персонаж сможет кататься на лошади (можете вспомнить конные патрули).
  • No Idle Anims — запрещает использование анимации типа «Idle» (безделье) во время выполнения этого пакета.
  • Always Run — во время выполнения пакета персонаж всегда будет перемещаться бегом.
  • Always Sneak — тоже самое, что и «Always Run», только заставит персонажа передвигаться в режиме скрытности.
  • Allow Swimming — включает возможность плавания во время работы пакета.
  • Allow Falls — разрешает прыгать персонажу, если сейчас запущен этот пакет.
  • Armor Unequipped — снять доспехи и надеть обычную одежду. Незаменимый флаг для пакета с типом «Sleep».
  • Weapons Unequipped — спрятать оружие во время выполнения этого пакета.
  • Defensive Combat — запрещает атаковать персонажей, которые очень разозлили его.

Door Flags

Флаги дверей отвечают за открытие/закрытие дверей в зависимости от стадии выполнения AI-пакета:

  • At Package Start — открывает/закрывает двери, когда начинается выполнение пакета.
  • When At Location — открывает/закрывает двери, если другой персонаж их закрыл/открыл.
  • At Package End — открывает/закрывает двери, когда завершилось выполнение пакета.

Shedule

Obl pack shedule

Данные в этом табе отвечают за график выполнения AI-пакета. Если данные в поле указаны «any», то поле игнорируется (исключение: «Duration»). Если всё указано «any», а значение «Duration» равно 0, то пакет будет выполняться всегда. В этом случае, крайне желательно, чтоб он находится в самом низу списка, что сделает его приоритет самым низким.

  • Day of week — в какие дни недели пакет может быть выполнен.
  • Month — в какой месяц или пору года (зима, весна, лето, осень).
  • Date — какое число должно быть на календаре для запуска пакета.
  • Time — сколько часов должно быть.
  • Duration — длительность выполнения пакета. Если «Time» = 2, А «Duration» = 6, то персонаж закончит выполнение пакета в 8 часов (2+6).

Conditions

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

Obl pack conditions

Основную часть секции занимает таблица условий выполнения пакета. Рассмотрим значение колонок:

  • Target — если значение равно «yes», то условие выполняется не для персонажа, а для его цели.
  • Function Name — используемая функция для определения условия. Их список очень большой, здесь я его писать не буду. Пользуйтесь поисковой системой для нахождения необходимой функции.
  • Function Info — информация о параметрах функции.
  • Comp — используемый знак, среди которых: != (не равно), < > (меньше или больше), <= (меньше или равно), >= (больше или равно), == (равно).
  • Value — само значение.
  • OR / AND — последняя колонка не имеет своего названия, но в ней показывается, обязательное ли это условие (AND), либо одно из (OR).

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

Location

Это таб, в котором описана информация, касающаяся места выполнения пакета.

Obl pack locations

Всего существует 5 типов указания места действия AI-пакета:

  1. Near Reference — самый точный тип, позволяющий указать не только локацию (cell), но и конкретное место на ней (ссылка на маркер).
  2. In Cell — указывает только локацию.
  3. Any Object — не знаю, что это, если понимаете, как это использовать, сообщите мне.
  4. Near Current Location — около текущей локации в определенном радиусе.
  5. Near Editor Location — около локации, в которой был создан персонаж, в определенном радиусе.

Target

Obl pack target

Таб цели не представляет из себя что-то сложное. Здесь есть всего два способа определить цель: либо указать ссылку на объект в конкретной локации, либо сделать целью конкретный предмет или группу предметов. Значение в поле «Value» определяет количество целей, с которыми нужно взаимодействовать.

Практика

Если вы дошли до этого места, то вам наверняка наскучило читать и ничего не предпринимать. Именно поэтому, когда вы уже ознакомились со всей теоретической частью AI-пакетов, настало время использовать свои знания на практике. Если вы забыли, то напомню, что мы будем работать с Абуки, которая держит таверну «Фарегил». Я специально выбрал этого персонажа и локацию, так как они практически не используют скриптов и не влияют на основную сюжетную линию, либо на квесты фракций.

Понимание

Изучим текущие пакеты Абуки, благо, что их всего пара:

  • AbhukiSleep — пакет типа «Sleep», который отвечает за сон Абуки. Этот пакет будет выполнен в 2 часа ночи каждый день, вне зависимости от того, какой сейчас день недели или пора года. Выполняться он будет в течение 4 часов, так как именно такое значение указано в поле «Duration». Никаких дополнительных условий для выполнения пакета у Абуки нет. Перейдя на вкладку «Location», можно увидеть, что она предпочитает спать именно в своей кровати собственной таверны. Все флаги для пакета отключены.
  • TavernServices — стандартный пакет владельца таверны типа «Travel». В этом вы можете убедиться, нажав правой кнопкой мыши по его названию, а затем выбрав «Use Info» в появившемся контекстном меню. У пакета включены флаги «Offers Services», «Armor Unequipped» и «Weapons Unequipped», значит, во время действия этого пакета персонаж будет предоставлять свои услуги (торговля и обучение в данном случае), не будет одет в доспехи и держать какое-либо оружие. Когда пакет начинает свое действие, открывается дверь в таверну, так как включен флаг «At Package Start». Никаких дополнительных условий не требуется, само место выполнения будет в той локации, где изначально создаётся персонаж Абуки, то есть в таверне.

Постановка задачи

Как вы уже могли заметить, распорядок дня у Абуки очень скучный. Она не кушает, не гуляет, только работает и спит, работает и спит… Перед тем, как производить какие-либо действия, я всегда советую определиться, что конкретно вы будете менять, так как хаотические изменения влекут за собой соответствующий результат. Вы можете повторить то, что сделал я, а можете накидать свой список изменений для распорядка дня владелицы таверны.

Было:

  • 02:00-06:00 — сон;
  • 06:00-02:00 — работа.

Решил изменить на:

  • 01:00-07:00 — сон;
  • 07:00-08:00 — завтрак;
  • 08:00-12:00 — работа;
  • 12:00-13:00 — обеденный перерыв;
  • 13:00-23:00 — работа;
  • 23:00-01:00 — дышим свежим воздухом;

Все-таки разнообразней как-то, согласны?

Создание и редактирование пакетов

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

Первое, что мы создадим, будет пакет сна. Вы можете давать различные имена, но помните, что они должны быть понятными, внятными и адекватными. Я очень советую придерживаться принципов, которых придерживались разработчики Oblivion: «<loc><charname><packtype><time>», то есть, например: «LeyawiinMGAgataSleep», где «LeyawiinMG» — локация, «Agata» — имя персонажа, «Sleep» — тип пакета. Если у персонажа несколько одинаковых пакетов с одним типом, в конце имени добавляют время, например: «18x2», значит, что в 6 часов вечера персонаж будет что-то делать в течение двух часов.

Но это всего лишь рекомендации, вы можете разработать собственный, наиболее удобный для вас (или вашей команды) стиль именования идентификаторов AI-пакетов — это ваше личное дело. Я лишь поясню, что нужно делать:

  • Чтобы удалить пакет, нажмите на него правой кнопкой мыши и в контекстном меню выберите «Delete», а чтоб создать пакет, выберите «New».
  • Укажите необходимый идентификатор и заполните необходимую информацию. Если у вас сложности, читайте ниже подробное описание манипуляций для достижения нужного результата.

Пакеты по порядку (начиная с самого верхнего!):

Пакет сна

  • Type: Sleep;
  • Flags: нет;
  • Time: 1;
  • Duration: 6;
  • Conditions: нет;
  • Location: Near Reference. Cell = FaregylInterior, Ref = 'BedrollCrawlEntry' 'AbhukiBed';
  • Target: пусто.

Пакет завтрака

  • Type: Eat;
  • Flags: нет;
  • Time: 7;
  • Duration: 1;
  • Conditions: нет;
  • Location: Near Editor Location;
  • Target: пусто.

Пакет обеда

  • Type: Eat;
  • Flags: нет;
  • Time: 12;
  • Duration: 1;
  • Conditions: нет;
  • Location: Near Editor Location;
  • Target: пусто.

Пакет прогулки

  • Type: Wander;
  • Flags: At Package Start — Lock Doors;
  • Time: 23;
  • Duration: 2;
  • Conditions: нет;
  • Location: Near Reference. Cell = FaregylExterior (05, 00), Ref = 'MapMarker' 'FaregylMapMarker'. Radius: 750;
  • Target: пусто.

Пакет работы

  • Type: Wander;
  • Flags: Offers Services, Armor Unequipped, Weapons Unequipped, At Package Start — Unlock Doors;
  • Time: any;
  • Duration: 0;
  • Conditions: нет;
  • Location: Near Editor Location;
  • Target: пусто.

Проверка результатов

Теперь, когда вы сделали всё необходимое, можете сохраниться. Для этого в верхней навигации выберите «File -> Save» и укажите имя сохраняемого файла. В предзагрузочном окне зайдите в «Файлы данных». Отметьте галочкой ваш *.esp-файл и запускайте игру.

Если вы не знаете, где находится таверна «Фарегил», то можете воспользоваться командой:

coc FaregylInterior

и посмотреть результаты своего труда. Например: Абуки теперь будет завтракать, обедать и прогуливаться после работы:

  • Абуки теперь тоже может подышать свежим воздухом.
  • Работа работой, а обед по расписанию.

Послесловие

Благодарю Ника за поддержку. Если вам было интересно и/или полезно, сообщайте об этом. Если у вас возникли какие-то вопросы или пожелания, тоже пишите.

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.