ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ (AI)

ОК, вот мы и добрались до Искусственного Интеллекта (AI), самой сложной теме на пути к званию мастера DromEd. Для правильной работы AI необходимо выполнить две операции. Это:

  • Build Pathfinding Database (Построение базы данных поиска пути)
      Сообщает AI – куда можно идти и как туда добраться
  • Build AI Room Database (Построение базы данных комнаты AI)
      Расчет ‘слуха’ AI, позволяет им ‘слышать’

    Запустите их по очереди (находятся в меню Tools).

    Считайте, что AI – самые обычные объекты, имеющие специфические возможности: они двигаются и думают!

    Сейчас хорошая возможность познакомиться с безумно полезной командой: “aiawareofplayer” (AI Aware Of Player – AI знает об игроке). Введите ее в командное окно и нажмите Enter. AI перестанет вас видеть и слышать! Однако они заметят, если вы ударите что-то своим мечом или дубиной (например, факел), и будут на стороже, если вы попытаетесь атаковать их!

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


    Создайте любой AI (Они находятся в physics->Creature). Например, слугу - physics->Creature->Animal->Human->bystander->servant->MaleServ1. Только не пугайтесь тому, что увидите. Они находятся в такой позе, потому что она является для них позой по умолчанию. В игре они примут нормальное положение.

    Если вы создали слугу, то зайдите в игру и проверьте следующее: испугайте его. Самое интересное, что он не будет убегать – он станет, и будет искать вас (и никогда не найдет). Это не делает нам чести!

    Создайте маркера (fnord->marker) в подходящих точках бега (flee points) в вашем уровне и назовите их типа “FleePointX”, где X – номер точки бега. К каждому маркеру нужно добавить свойство AI->Utility->Flee Point и установить уровень предпочтения. 0 означает минимальное предпочтение, и 100 – максимальное предпочтение. Если вы разместите несколько точек бега с одним и тем же значением, то AI будет бежать к ближайшей точке, или бежать дальше. (Вы можете наблюдать подобный эффект, если напугаете разговаривающих слуг Лорда Баффорда в подвале в спальне, они убегут, а потом будут бегать по кругу в залах).

    Не забывайте строить базу данных поиска пути после создания точек бега.


    ОК, у вас есть бегающий AI, который стоит себе и ждет, пока вы придете. А что, если вы хотите иметь патрулирующего AI? Читайте!

    ОК, вы хотите патрули? Ну, создайте AI, затем откройте иерархию и создайте точки патрулирования (patrol point): Fnord->Marker->TrolPt.

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

    А теперь последовательно свяжите (AIPatrol) между собой все точки патрулирования – TrolPt. Делайте следующим образом: первую точку связывайте со второй, вторую с третьей и т.д. до тех пор, пока не свяжете последнюю с первой. Ошибки на этом этапе очень распространены!

    Пришло время сказать мистеру AI, что ему нужно патрулировать. Итак, заходим в его свойства и добавляем AI->AI Ability Settings->Patrol: Does Patrol. Ставим галочку и нажимаем ОК.

    Сейчас рассчитываем базу данных поиска пути и в игру! Вот ваш патруль!


    ОК, теперь давайте займемся AI, который спит. Вы должны знать, что в Thief встроено метасвойство (MetaProperty), названное “M-Sleeping Servant”, которое используется для создания спящего слуги. Но не охраны. (Jerk: ага… не надо хвататься за название. Кого хочешь уложит спать!) Но с появлением фан миссий в 1999 мы видели, что спали самые разнообразные твари!

    Ладно, наплюем на то, что это только для слуг. Есть в этом метасвойстве дефект – то, что спящий никогда не встает. В фан миссиях обычно используют связи AIWatchObj для того, чтобы заставить AI встать… (Jerk: в оригинальных миссиях тоже). Ого, это еще более уродливый способ, чем у меня на уме! И так, мы собираемся изменить ваш Gamesys. (Jerk: О нет…). Страшно звучит? Не беспокойтесь, все будет ОК.

    Jerk: ни в коем случае не делайте то, что говорит Spike14 :). Он вообще дальше порекомендует сохранить изменения в dark.gam без создания резервной копии (!!!). Поэтому смело пропускайте все, где нет моих комментариев :)

    Ну что, давайте погрузимся в это. Чем же является ваш Dark Gamesys? Это файл (dark.gam), содержащий информацию о том, как идет игра. Если вы сделаете изменения в вашей объектной иерархии, то должны сохранить изменения в gamesys, иначе изменения будут потеряны.

    Итак, сначала мы изменим свойство “M-Sleeping Servant”, а затем сохраним изменения.

    Откройте Объектную Иерархию, посмотрите на самый верх, на пункт ‘Show Tree’ (Показать Дерево). В данный момент там выбрано “Archetypes” (Образцы). Измените на “MetaProperties” (МетаСвойства). А теперь найдите “M-Sleeping Servant”. Оно должно быть в AI_Behaviors->AI_B_m2->M-Sleeping Servant. Выберите это свойство и нажмите ‘Edit’.

    Сейчас я должен сказать вам, что такое МетаСвойство. Это совокупность свойств, призванных для создания нужного эффекта. Например, метасвойство M-FrobInert делает объект неспособным к фроббингу (его нельзя использовать), или неспособным к созданию эффектов.

    Удобство метасвойств в том, что они могу быть добавлены или удалены Реакциями (Response) или Разговорами (Conversation), что будет обсуждено далее.

    Jerk: А теперь просто добавьте следующее свойство в нужный вам AI, а не в МетаСвойство M-Sleeping Servant!

    Теперь добавьте AI->Responses->Alert Response. Установите уровень тревоги (Alert level) на 3, и приоритет (priority) на “Very High”.

    Далее измените первое действие (Response: Step 1) на “Add/Remove MetaProperty” (Добавить/Удалить МетаСвойство). Аргументы укажите следующим образом:

    Argument 1 Remove (Удалить)
    Argument 2 M-Sleeping Servant
    Argument 3

    OK, это означает, что когда AI встревожится, он/она удалит в себе МетаСвойство. Если я хочу удалить МетаСвойство в другом объекте, я должен буду ввести уникальное имя того объекта (не должно быть числом) в строке “Argument 3”. Но поскольку мы хотим разбудить сам AI, то в этом нет необходимости!

    Jerk: Да, но мы не создали это метасвойство в самом AI! Выберите его, и добавьте MetaProperty-> AI_Behaviors->AI_B_m2->M-Sleeping Servant. И это еще не все. Если вы запустите игру, но ничего не произойдет – стражник будет лежать как мертвый. Что же делать? Если поискать по свойствам в метасвойстве M-Sleeping Servant, то можно заметить, что там отключена ‘тревога’ AI. Добавьте AI следующее свойство: AI->AI Core->Alertness Cap и установите максимальный уровень (Max level): (3) High. Теперь AI действительно встанет, если вы начнете прыгать вокруг него :).

    Теперь испытайте это в деле. Если все же изменяли gamesys, то сохраните его через File->Save Gamesys…


    ОК, следующий вопрос. Как я могу поместить кошелек или ключ на пояс AI? Это просто! Для начала создайте кошелек (Physical->Treasure->Swag->Lucre->Purse) или ключ (Physical->Key) и по необходимости отредактируйте их свойства. Далее свяжите охранника с объектом через связь Contains (Содержит).

    Но еще не закрывайте окно связей! Посмотрите на связь Contains. Обратите внимание на колонку “Data”(Данные). В ней на линии связи Contains написано “Generic Contents” (Универсальное содержание). Если вы оставите все как есть, то AI сможет проходить через запертые этим ключом двери, но, к сожалению, игрок не сможет украсть его. Итак, в колонке ID (Идентификационный Номер) выберите строку со связью Contains и нажмите на кнопку ‘Data’.

    В появившемся меню вы можете выбрать один из трех пунктов: Hand (Рука), Belt (Пояс), и Generic Contents. “Hand”, кажется, не работает, но нас в данный момент интересует пояс, поэтому выбираем “Belt” и жмем ОК. Все! В игру воровать!


    ОК, а теперь сливки – САМЫЙ ЛУЧШЫЙ AI (нет, не мертвый) – ПЬЯНЫЙ!

    Создаем охранника, которого превратим в пьяницу. Отредактируем его свойства (вы можете создать МетаСвойство, если вы собираетесь сие часто использовать). Для начала добавляем MetaProperties->AI_Behaviors->AI_B_m10->M-AlertCapZero.

    Jerk: Если вы покопаетесь в свойствах добавленного метасвойства, то узнаете, что AI к вам дружественен до тех пор, пока вы не начнете с кем то драться (AI->Responses->Sense combat response), не обнажите оружие (AI->Responses->Threat response, выбранное Raised weapon), пока не начнется тревога (AI->Responses->Signal response, выбранное alarm). Как только что-то из этого произойдет, то удалится все эти свойства, включая AI->AI Core->Alertness Cap, в котором указано, что у AI уровень тревоги нулевой – ему все пофигу.

    Теперь сделаем ему пьяный голос. Добавьте свойство Speech->Voice и измените значение по умолчанию на “drunk1” и нажмите Enter.

    Сейчась немного подправим ему действия. Добавьте AI->Responses->Threat response, измените свойства следующим образом:

    Threat (Угроза) Raised weapon (Обнаженное оружие)
    Response: Step 1 Add/Remove Meta-Properties (Добавить/Удалить Мета-свойство)
    Argument 1 Remove (Удалить)
    Argument 2 M-AlertCapZero
    Argument 3
    Response: Step 2 Play Sound/Motion (Проиграть Звук/Движение)
    Argument 1 tolevelthree (Поднять уровень тревоги до трех)
    Argument 2
    Argument 3

    А теперь о том, что здесь происходит. Когда охранник видит обнаженное оружие, включая лук, он удаляет у себя метасвойство M-AlertCapZero и проигрывает звук, который свидетельствует, что он в “тревоге”. (Jerk: по-моему, тут немножко не так. В следствие экспериментов выяснилось, что это подымает уровень “тревога” (alert) у всех в округе. Так “tolevelone” ни на кого не подействовало, “toleveltwo” подействовал на стоящего неподалеку слугу, “tolevelthree” дополнительно поднял на ноги спящего охранника)

    ОКей, теперь добавьте AI->AI Core->Awareness Capacitor (Ядро AI->Конденсатор Понимания) и измените значения всех полей на 10. Я думаю, что затормаживает их желание перейти в режим тревоги… но я не уверен в этом. Я только скопировал эти настройки с охранника колодца в миссии про Баффорда.

    Теперь добавляем Motions->ActorTagList, (Движения->Список Тегов Актера) и вводим: “WithSword 0, Drunk 0”(С мечом, Пьяный). Теперь охранник будет делать соответствующие пьяные движения (за это отвечает “Drunk 0”). Если вы уберете “WithSword 0”, то заметите, что охранник не сможет вас атаковать… Мечом он уже не умеет пользоваться :).

    Теперь добавляем AI->AI Core-AI и устанавливаем значение “Default” (По умолчанию). Это указывает AI, что он должен вести себя ‘по умолчанию’. (Jerk: абсолютно не вижу пользы в этом свойстве в данном случае).

    Да, все работает, но как-то дохло. У нас есть пьяный охранник, который непонятно почему пьяный. Почему бы нам вокруг него не по разбрасывать пару бутылок (physical->Household->Dish->Bottle->) и кубков, хм? А как на счет кубка в его руке… нет, серьезно!

    Для начала создайте кубок (physical->Household->Dish->Goblet->) и запомните его номер. Откройте окно связей пьяного охранника и добавьте новую связь CreatureAttachement (Привязка к созданию) от него к кубку.

    Теперь измените данные связи (Data) на “Left Fingers” (Пальцы левой руки). Теперь кубок будет привязан к пальцам руки охранника! Все отлично работает. (Jerk: кубок можно выхватить из рук охранника и выбросить. При этом кубок вернется в руки охране. Чтобы игрок не мог взять кубок, добавьте кубку свойство Engine Fetaures->FromInfo и уберите ‘Move’ из WorldAction).


    ОК, теперь вы можете делать пьяную охрану, патрульных, помещать вещи в инвентарь охраны. Но что если вы хотите сделать лучника, стреляющего огненными стрелами? Или хотите чтобы AI был в команде Гаррета? А супер-болтливого охранника? Не беспокойтесь, я не собираюсь бросать вас на самостоятельно разбивание этой темы!

    ОК, начнем с супер-болтливого охранника. Это легко! Добавьте охране свойство AI->Attributes->Verbosity (AI->Атрибуты->Многословие). Выберите любое желаемое значение и нажмите ОК (Null – охранник молчит, Well Above Average – охранник мычит :)

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

    Jerk: можете использовать следующие атрибуты (находятся в AI->Attributes)

    • Aggression – агрессия
    • Aptitude – способность (эффективность)
    • Defensive – оборона
    • Dodginess – изворотливость
    • Hearing – слух
    • Sloth – лень
    • Verbosity – многословие
    • Vision - зрение


    А теперь легко сделаем AI в команде Гаррета. Добавляем AI->AI Core->Team и изменяем на любое значение, подходящее вам:

    Good Хорошие В команде Гаррета, против всех BadX
    Neutral Нейтральные Невраждебны ко всем
    Bad1 – Bad 6 Плохие 1 - 6 Враждебны к Хорошим и ко всем остальным BadX

    Отлично! Вы также можете сделать невраждебных AI, если добавите им свойство AI->Ability Settings->Combat: Non-Hostile (Бой: Невраждебность). Там много различных значений и они соответствуют названиям.

    Jerk: хорошо им, англичанам… Надо сказать, что это свойство работает несколько коряво. Если охраннику дать это свойство и значение Always, то он засечет, что игрок появился и начнет его искать, но атаковать не будет – будет по прежнему искать.

    • Never – AI всегда враждебен
    • Always to player – AI всегда невраждебен к игроку
    • To player until damaged - AI невраждебен к игроку до тех пор, пока он его не ударит
    • To player until threatened - AI невраждебен к игроку до тех пор, пока он не обнажит оружие
    • Until damaged – AI не враждебен до тех пор, пока его не атакуют
    • Until threatened – AI не враждебен до тех пор, пока перед ним не обнажат оружие
    • Always – AI всегда невраждебен


    А теперь займемся лучниками. Хочу заметить, что описанное действительно ДЛЯ ВСЕХ AI, например вы можете заставить священника стрелять не молотами, а стрелами, если желаете.

    Создайте любого лучника отсюда: Physical->Creature->Animal->Humans->Guards->Bowman.

    Откройте его связи. По умолчанию там уж будет несколько связей. Первая (Contains) сообщает о том, что лучник имеет стрелу. Вторая (Culpable For) говорит о том, что он может носить стрелы (Jerk: поскольку все прекрасно работает и без этой связи, то я не уверен в том, что правильно понял: “…that he CAN carry broadheads”. Впрочем, без первой связи тоже все работает. Самая важная – третья:). Третья (AIProjectile) указывает на то, что если лучник стреляет, то он стреляет острыми стрелами (broadheads).

    Итак, создайте огненную стрелу (firearrow), но НЕ кристалл огня (firecrystal)! Она здесь: physical->Projectile->firearr. Удалите все связи стрелка и воссоздайте из заново, связывая лучника с огненной стрелой. (Jerk: можете только сделать связь AIProjectile.)

    Заметка: Все связи CulpableFor автоматически создает DromEd.

    Jerk: можно (нужно) настроить данные связи AIProjectile. Дважды кликните по связи в разделе 'ID' (либо выберите ее и нажмите кнопку 'Data')

    Наиболее интересными (и понятными) являются следующие:
    -> Targeting Metod - способ прицеливания: Straight-Line - линейный, Arcing - дуговой. Остальные не хотят работать. Может для лучников не доступны, а для других, например для магов - да. Не проверял.
    -> Firing Delay - с какой задержкой лучник будет стрелять (в секундах)
    -> Ammo - количество стрел (яблок :). Если 0 - то бесконечно.
    -> Burst Count - примерно: мощность выпущенной стрелы. Если 0 - то по умолчанию. Если больше - то ховайся. Если Burst Count = 2 и стрела - огненная, то Гаррета выносит с первого раза :). Лучше использовать этот параметр с обычными стрелами.
    -> Accuracy - точность. Ставьте Very High и не раздумывайте - хороший противник - находка для Гаррета :)
    -> Leads Target - этот параметр делает противника не просто серьезным, а очень серьезным. Если вы уходите в сторону, то он рассчитает под каким углом стрельнуть так, что бы все равно попасть в вас. Единственное спасение - поменять направление движения.
    -> Launch Joint - откуда вылетает стрела:


      * N/A - по умолчанию
      * Head - голова
      * Nech - шея
      * Abdomen - живот
      * Butt - пах
      * Left Shoulder - левое плечо
      * Right Shoulder - правое плечо
      * Left Elbow - левый локоть
      * Right Elbow - правый локоть
      * Left Wrist - левое запястье
      * Right Wrist - правое запястье
      * Left Fingers - левые пальцы
      * Right Fingers - правые пальцы
      * Left Hip - левое бедро
      * Right Hip - правое бедро
      * Left Knee - левое колено
      * Right Knee - правое колено
      * Left Ankle - левая лодыжка
      * Right Ankle - правая лодыжка
      * Left Toe - левые пальцы ноги
      * Right Toe - правые пальцы ноги
      * Tail - хвост (обычные лучники при этом не работают :)


    Как сделать так, чтобы AI был уже мертвым!

    Добавьте метасвойство MetaProperties->AI_Behaviors->AI_B_Gen->M-PosedCorpse.

    Если хотите создать зомби, который лежит до тех пор, пока вы не пройдете по нем, то добавьте метасвойство MetaProperties->AI_Behaviors->AI_B_Gen->M-ZombieBehaviors->M-ZombiePossum.


    Вы когда либо удивлялись тому, что в Thief нет молота-лучника ?

    Вы ошибаетесь! В Thief ЕСТЬ молот-лучник! Сейчас покажу вам, как его активировать!

    Создайте лучника. Теперь откройте его свойства и добавьте Shape->Model Name. В качестве модели введите “HamBow” и нажмите Enter.

    И так, у нас уже есть лучник молот! Подкорректируем его голос. Добавьте Speech->Voice и введите “hammrs”.

    Все ОК!


    А теперь пришло время сделать пукающего буррика ! О да! (Jerk: вуху! Правда, это было уже реализовано в miss18.mis, ‘баговой’ миссии).

    Во первых, создадим его. Physical->Creature->Animal->Burrick.

    Ну, вы уже знаете, что связь AIProjectile отвечает за стрельбу, включая и газовую атаку буррика. Заходим в связи и изменяем данные AIProjectile. Изменяет точку запуска (Launch Joint) на пах (Butt). А теперь заходим в миссию и любуемся!


  • Tutorial by Spike14.
    Translated by Jerk.
    Хостинг от uCoz