Здравствуйте. "Гуляя" по форумам о конструкторе игр FPS Creator X9 я не раз лицезрел всё изобилие жалоб на (мягко говоря) глупое поведение искусственного интеллекта. Но я все же решился делать проект именно на этом движке и... столкнулся с такой же поблемой. Однако изучение языка скриптов FPI, который используется в этом движке, навело меня на мысль о том, что ситуация с откровенно тупыми ботами поправима если не полностью, то до терпимого уровня. Возможно эта тема будет полезна новичкам даного конструктора, так как здесь я постараюсь подробно расписать процесс построения "терпимого" искусственного интеллекта.
Для начала попробуем разобрать "по болтикам" уже имеющийся скрипт, улучшающий ИИ в игре, дабы понять основные принципы его построения. Позже я планирую доработать и дополнить этот скрипт.
Добавлено (06.10.2009, 15:01)
---------------------------------------------
Итак, перед нами Stealth AI для FPSC X9!
Quote
;Triggers
:state=0:state=1
:state=1,losetarget=5:state=10
:state=1,plrcanbeseen,plrdistwithin=400:state=20
:state=1,shotdamage=1:rotate toplr,state=20
:state=1,random=20:rotateheadrandom=55
:state=1:animate=2,movefore=2.5
:state=10,random=1:state=11
:state=10:rotatey=90 ,animate=2,movefore=2.5,state=0
:state=11:rotatey=-90,animate=2,movefore=2.5,state=0
:state=20,plrcanbeseen:state=21
:state=21,plrcanbe seen:settarget
:state=21,plrcannotbeseen,losetarget=1:state=10
:state=21,healthless=31:state=40
:state=21,ifweapon=1,plrdistfurther=100:f ollowplr=1,animate=5
:state=21,plrdistwithin=101:rotatetoplr
:state=21,ifweapon=1,plrdistwithin=301,plrcanbeseen=46:animate=1,rotatetoplr, freeze,useweapon,rundecal=6
:state=21,ifweapon=0:animate=1,freeze,state=22,setframe=6
:state=21,plrdistwithin=300,random=20:state=25
:sta te=21,plrdistwithin=100:state=30
:state=22:incframe=6
:state=22,frameatend=6:state=21,reloadweapon,sound=audiobank\guns\reload.wav
:state =25,random=1:state=26,setframe=4
:state=25:state=27,setframe=3
:state=26:incframe=4,strafe=90,rotatetoplr
:state=26,frameatend=4:state=21 ,animate=1
:state=27:incframe=3,strafe=-90,rotatetoplr
:state=27,frameatend=3:state=21,animate=1
:state=30:state=31,setframe=5
:state=31 :incframe=5,strafe=180,rotatetoplr
:state=31,frameatend=5:state=21,animate=1
:state=40:state=42
:state=42,ifweapon=1,plrdistwithin=601, plrcanbeseen=46:animate=1,rotatetoplr,freeze,useweapon,rundecal=6
:state=42:rotatetotarget,rotatey=180,resethead,animate=5,state=43
:state =43:runfore=10
:state=43,random=5:rotateheadrandom=65
:state=43,losetarget=1:state=50
:state=43,plrcanbeseen:settarget,state=42
:state =50:timerstart,state=51,rotatey=180,animate=31
:state=51,timergreater=5000:state=10,animate=5
:state=51,random=5:rotateheadrandom=35
;End of Script
Добавлено (06.10.2009, 15:02)
---------------------------------------------
Начало скрипта:
Quote
;Triggers
:state=0:state=1
:state=1,losetarget=5:state=10
:state=1,plrcanbeseen,plrdistwithin=400:state=20
:state=1,shotdamage=1:rotate toplr,state=20
:state=1,random=20:rotateheadrandom=55
:state=1:animate=2,movefore=2.5
Теперь разберем этот скрипт. :state=0:state=1 - значение :state=0 означает самое первое дейсвие, которое является началом выполнения скрипта, далее за ним идет :state=1 (где "1" - порядковый номер действия)
ЭТО ВАЖНО! Воизбежании неработоспособности скрипта не дублируйте действие :state=0 .
:state=1,losetarget=5:state=10 - здесь проверяется выполнения условия losetarget= - этот параметр означает, что ИИ потерял игрока из поля зрения, т.е. если это условие выполняется, то ИИ выполняет действия из :state=10
:state=1,plrcanbeseen,plrdistwithin=400:state=20 - Если игрок видим для ИИ (параметр plrcanbeseen) при дистанции 400 (параметр plrdistwithin=400), то ИИ выполняет действие из :state=20
:state=1,shotdamage=1:rotatetoplr,state=20 - Если игрок стреляет в ИИ (параметр shotdamage=1), то ИИ поворачивается лицом к игроку (параметр rotatetoplr), затем выполняет действие state=20
:state=1,random=20:rotateheadrandom=55 - параметр random=20:rotateheadrandom=55 означает, что ИИ будет смотреть в разные стороны в поисках игрока.
:state=1:animate=2,movefore=2.5 - Анимация ИИ при поиске игрока
ЭТО ВАЖНО! Числовое значение параметра :animate= может быть изменено в зависимости от ваших предпочтений. Числовые значения анимации: 2-шаг, 5-бег. Остальные значения при передвижении ИИ не используются. 1-неподвижность, 3,4 - шаг в сторону (вправо/влево), 6-перезарядка.
Добавлено (06.10.2009, 15:03)
---------------------------------------------
ИИ теряет игрока из поля зрения:
Quote
:state=10,random=1:state=11
:state=10:rotatey=90,animate=2,movefore=2.5,state=0
:state=11:rotatey=-90,animate=2,movefore=2.5,state=0
Разберём этот скрипт. :state=10,random=1:state=11 - параметр random=1:state=11 означает, что будет выполнено действие либо :state=10, либо :state=11. Команда random=1 хорошо подойдет, если Вы хотите сделать несколько реакций бота на одно и то же событие.
:state=10:rotatey=90,animate=2,movefore=2.5,state=0 и :state=11:rotatey=-90,animate=2,movefore=2.5,state=0 - эти команды отличаются лишь одним значением - rotatey=, при котором ИИ поворачивается и начинает идти в одну из сторон. Если вейпоинты ИИ зациклены, т.е. путь ИИ является круговым, то он выберет одно из направлений движения.
Добавлено (06.10.2009, 15:03)
---------------------------------------------
ИИ Вас заметил:
Quote
:state=20,plrcanbeseen:state=21
:state=21,plrcanbeseen:settarget
:state=21,plrcannotbeseen,losetarget=1:state=10
:state=21,healthless=31: state=40
:state=21,ifweapon=1,plrdistfurther=100:followplr=1,animate=5
:state=21,plrdistwithin=101:rotatetoplr
:state=21,ifweapon=1,plrdi stwithin=301,plrcanbeseen=46:animate=1,rotatetoplr,freeze,useweapon,rundecal=6
:state=21,ifweapon=0:animate=1,freeze,state=22,setframe=6
: state=21,plrdistwithin=300,random=20:state=25
:state=21,plrdistwithin=100:state=30
:state=22:incframe=6
:state=22,frameatend=6:state=21,r eloadweapon,sound=audiobank\guns\reload.wav
:state=25,random=1:state=26,setframe=4
:state=25:state=27,setframe=3
:state=26:incframe=4,str afe=90,rotatetoplr
:state=26,frameatend=4:state=21,animate=1
:state=27:incframe=3,strafe=-90,rotatetoplr
:state=27,frameatend=3:state=21, animate=1
:state=30:state=31,setframe=5
:state=31:incframe=5,strafe=180,rotatetoplr
:state=31,frameatend=5:state=21,animate=1
Разберем скрипт.
:state=20,plrcanbeseen:state=21 - Если ИИ Вас заметил, выполняется действие :state=21
:state=21,plrcanbeseen:settarget - Если игрок замечен, ИИ начинает атаку.
[/u]ЭТО ВАЖНО! В :state=21 команда plrcanbeseen: повторяется не случайно. В данном случае это значит, что ИИ продолжает Вас видеть, т.е. Вы не пропали из его поля зрения.
:state=21,plrcannotbeseen,losetarget=1:state=10 - Если ИИ больше не видит игрока (plrcannotbeseen,losetarget=1), то выполняется действие :state=10 (см. "ИИ теряет игрока из поля зрения")
:state=21,healthless=31:state=40 - Если здоровье ИИ будет меньше чем 31, ИИ выполнит действие :state=40
:state=21,ifweapon=1,plrdistfurther=100:followplr=1,animate=5 - в случае, если у ИИ есть оружие и патроны (параметр ifweapon=1), и игрок находится от ИИ на расстоянии 100 (параметр plrdistfurther=100:), он преследует игрока (параметр followplr=1) с анимацией animate=5 (в данном случае - бег. Напомню: Числовые значения анимации: 2-шаг, 5-бег. Остальные значения при передвижении ИИ не используются.
:state=21,ifweapon=0:animate=1,freeze,state=22,setframe=6 - Если же у ИИ нет оружия или паронов (параметр ifweapon=0), то проигрывается анимация (animate=1), при этом он ни куда не двигается (параметр freeze), выполняет действие state=22. setframe=6 - этот параметр показывает, что анимация останавливается на 6й позиции (кадре).
ЭТО ВАЖНО! Значение setframe=6 является оптимальным, изменение его приведет к некачественной анимации.
:state=21,plrdistwithin=300,random=20:state=25 - Если игрок находится на расстоянии 300 от ИИ (параметр plrdistwithin=300), либо продолжается выполнение всех действий помеченных state=21, либо выполняется действие :state=25
:state=21,plrdistwithin=100:state=30 - Если игрок находится на расстоянии 100 от ИИ (параметр plrdistwithin=100), выполняется действие :state=30
:state=22:incframe=6 - включение анимации начиная с 6й позиции (параметр :incframe=6)
:state=22,frameatend=6:state=21,reloadweapon,sound=audiobank\guns\reload.wav - Когда анимация вновь приходит к началу, т.е. к позиции 6, выполняется действие :state=21, одновременно с этим происходит перезарядка оружия (параметр reloadweapon) и проигрывается звук audiobank\guns\reload.wav (параметр sound=)
ЭТО ВАЖНО! Процесс перезарядки представлен из стандартного скрипта ИИ, изменять его нет смысла. В этой статье он представлен для ознакомления.
Остальные команды применяются для анимации ИИ. Изменять их нет смысла, и работают они по принципу двух последнх описаных команд.
Добавлено (06.10.2009, 15:04)
---------------------------------------------
ИИ преследует игрока:
Quote
:state=40:state=42
:state=42,ifweapon=1,plrdistwithin=601,plrcanbeseen=46:animate=1,rotatetoplr,freeze,useweapon,rundecal=6
:state=42:rota tetotarget,rotatey=180,resethead,animate=5,state=43
:state=43:runfore=10
:state=43,random=5:rotateheadrandom=65
:state=43,losetarget=1:st ate=50
:state=43,plrcanbeseen:settarget,state=42
:state=50:timerstart,state=51,rotatey=180,animate=31
:state=51,timergreater=5000:state =10,animate=5
:state=51,random=5:rotateheadrandom=35
;End of Script
Что это значит. :state=40:state=42 - переход к действию :state=42
:state=42,ifweapon=1,plrdistwithin=601,plrcanbeseen=46:animate=1,rotatetoplr,freeze,useweapon,rundecal=6 - Если у ИИ все в порядке с оружием и патронами (параметр ifweapon=1), и игрок надодится на расстоянии 601 от ИИ (параметр plrdistwithin=601) и при этом видит игрока (параметр plrcanbeseen=46), то выполняется анимация (параметр animate=1), при этом ИИ поворачивается к игроку (парамер rotatetoplr) не делая шагов с стороны (параметр freeze), и использует оружие (параметр useweapon). Параметр rundecal=6 является деколью выстрела, изменять его не имеет смысла.
:state=42:rotatetotarget,rotatey=180,resethead,animate=5,state=43 - в этой команде отображается поворот ИИ к игроку (параметр rotatetotarget), его поворотливость (параметр rotatey=180), восстановление стандартной позици головы ИИ (параметр resethead) и анимация бега ИИ (параметр animate=5). Т.е. ИИ периодически приближается к игроку.
:state=43:runfore=10 - скорость приближения ИИ
:state=43,random=5:rotateheadrandom=65 - при беге ИИ оглядывается
:state=43,losetarget=1:state=50 - Если несмотря на предидущий пункт, ИИ все же потерял игрока из поля зрения, выполняется действие :state=50
:state=43,plrcanbeseen:settarget,state=42 - Если ИИ все же увидел игрока, он возвращается к выполнению действия state=42
:state=50:timerstart,state=51,rotatey=180,animate=31
:state=51,timergreater=5000:state=10,animate=5
:state=51,random=5:rotateheadrandom=35 - Эта часть скрипта отвечает за действия ИИ при потере игрока. Параметр timergreater=5000 задает 5000 мс времени прежде чем ИИ начнет действие :state=10