FPS Creator – mesterséges intelligencia (AI) script írása FPI-ban

Ebben az oktató anyagban azt mutatom be hogy hogyan lehet egy AI scriptet irni, lépsről-lépésre.
Az FPS Creator számára AI scripteket FPI script nyelven tudunk írni amiknek a segítségével különböző parancsokat
adhatunk a karakter modelleknek. Például sétáljon lassan,sétáljon fegyverrel,
de lényegében bármilyen tárgynak bármilyen utasítást adhatunk

Nos, először gondolkodjunk el azon hogy egy mesterséges intelligánciának AI-nak mi is a szerepe.

Véleményem szerint egy jól kidolgozott mesterséges intelligencia alapvető feladata hogy:

 

  • utasitsa az ellenséget hogy kijelölt útvonalat kövessen, esetleg véletlen szerűen változtasson is út vonalat ne csak egy irányba menjen.
  • kezdje lőni a játékost ha meglátja
  • ha a játékos túl közel kerül véletlen szerűen kezdjen tüzelni, hogy ne mindég egy adott távolság legyen az induló pont
  • kövesse a játékost ha netalán az el akar szökni
  • és próbáljon kitérni a játékos elől

Oxidative stress mutates DNA, order cialis online why not check here promotes atherosclerosis (blocking of arteries), and leads to chronic lung injury. Few problems affecting female libido: You may appalachianmagazine.com viagra generika be trying all kinds of treatments / medication to no avail! Doctors offer various cures for the condition change essentially starting with one individual then onto the next. Some of the companies are producing now that sildenafil discount with same effect. During Aortic Stenosis People suffering from chest pain http://appalachianmagazine.com/2017/02/28/tornado-watch-issued-for-central-and-southern-missouri-illinois-and-indiana/ buy levitra no prescription when all other tests are normal.
Nos, lássuk hogyan is lehet egy ilyen mesterséges intelligencia scriptet irni.

Első lépésként talán határozzuk meg hogy az ellenség kijelölt útvonalat kövessen, illetve változtassa is.

Ám először lássuk hogy milyen FPI script parancsokat alkalmazhatunk:

 

feltétel(condition):

WAYPOINTSTATE=X 

Ezzel tesztelhetjük a karakter és  útvonal viszonyát, például követi vagy sem, végére ért vagy sem..stb illetve utasíthatjuk is mit tegyen. Lássuk mi kerülhet az X helyére:

0:a karakter nem követ útvonalat

1:a karakter keresse meg a legközelebbi útvonalat ahonnan indulhat

2:a karakter kezdjen útvonalat követni

3:a karakter elérte az útvonalat és várjon hogy mit tegyen

4:a karakter elérte az útvonalat és az el ágazik több irányba várjon hogy mit tegyen

5:a karakter elérte az útvonal végét és ha nincs tovább utasításra vár hogy mit tegyen

999:a karakter ne kövesse tovább az útvonalat

 

Most lássuk milyen cselekményeket(action) alkalmazhatunk

WAYPOINTSTART
-arra utasitja a karaktert hogy találja meg a legközelebbi útvonalat(waypoint)

WAYPOINTSTOP
-arra utasitja a karaktert hogy ne kövesse tovább az útvonalat

WAYPOINTREVERSE
-arra utasitjuk a karaktert hogy forduljon vissza

WAYPOINTNEXT
-arra utasítjuk a karaktert hogy találja meg a következő útvonalat

WAYPOINTPREV
-arra utasitjuk a karaktert hogy térjen vissza az előző útvonalra

WAYPOINTRANDOM
-arra utasitjuk a karaktert hogy válasszon egy véletlen szerü útvonalat
Nos,fogjunk is hozzá elkészíteni az AI scriptünket

Első lépésként írjunk egy scriptet ami azt a parancsot tartalmazza hogy a karakter találja meg a legközelebbi útvonalat.

 

:WAYPOINTSTATE=0:WAYPOINTSTART

 

Ahogy láthatjuk az első feltételünk a :waypointstate=0 vagyis a karakter nem követ út vonalat, ez igaz és azt a parancsot adtuk hogy találja meg a legközelebbi útvonalat(:waypointstart).Ez eddig szép,viszont még be kell töltenünk a mozgás animációt is hogy a karater sétáljon, fusson-e..stb

Először is lássuk az FPS Creator mozgás animáció kulcsokat

feltétel(condidton)

ANIMATE=X
-az X helyére kell írni az animáció kulcsot.Lássuk a lehetőségeket

 

1 = nem csinál semmit

2 = lassan mozog(sétál)

3 = balra oldalazik

4 = jobbra oldalazik

5 = gyorsan mozog(fut)

6 = újra tölti a fegyvert

10 = mászik(felfele)

11 = előre esik

12 = előre ugrik

13 = fel kel elölről(ha előre esett,utána így kell felkelni)

14 = hátra esik

15 = hátra ugrik

16 = fel kel hátulról(ha hátra esett utána így kell felkelnie)

17 = balra esik

18 = balra ugrik

20 = jobbra esik

21 = jobbra ugrik

 

31 = guggolva,tétlenkedik

32 = guggolva lassan mozog(sétál)

33 = guggolva balra oldalazik

34 = guggolva jobbra oldalazik

35 = guggolva gyorsan mozog

36 = guggolva újra tölti a fegyvert

40 = szabadon tétlenkedik

41 = szabadon mozog

 

Ez eddigi kulcsokkal fegyver nélkül cselekszik a karakter, kivéve ha újra tölt.

A további kulcsok lényegében ugyan ezek az animációk, csak a fegyver a karakter kezében van miközben cselekszik
51 = fegyverrel nem csinál semmit

52 = fegyverrel lassan mozog

53 = fegyverrel balra oldalazik

54 = fegyverrel jobbra oldalazik

55 = fegyverrel gyorsan mozog

56 = fegyverrel újra tölt

57 = fegyverrel mászik

61 = fegyverrel előre esik

62 = fegyverrel előre ugrik

63 = fegyverrel fel kel előre

64 = fegyverrel hátra esik

65 = fegyverrel hátra ugrik

66 = fegyverrel fel kel hátra

67 = fegyverrel balra esik

68 = fegyverrel balra ugrik

70 = fegyverrel jobbra esik

71 = fegyverrel jobbra ugrik

81 = fegyverrel le guggol és nem csinál semmit

82 = fegyverrel le guggol és lassan mozog

83 = fegyverrel le guggol és balra fordul

84 = fegyverrel le guggol és jobbra fordul

85 = fegyverrel le guggol és gyorsan mozog

86 = fegyverrel le guggol és újra táraz

Hát akkor az eddig tanultak alapján bővítsük a scriptet a mozgás animációval:

 

:waypointstate=0:waypointstart,animate=52

 

Nos,mostmár a karakterünk szépen oda sétál az első útvonalhoz (waypointstart) sétálva(animate=52). De ha oda ért akkor mit csináljon?

Bővítsük a scriptet úgy hogy kezdje követni az útvonalat ha oda ért:

:waypointstate=0:waypointstart,animate=52

:waypointstate=3:waypointnext,animate=52

Ahogy láthatjuk a scriptünket kiegészítettük a második sorral amiben azt a parancsot adjuk a karakternek

hogy ha oda ért(:waypointstate=3), akkor kezdje követni az útvonalat (:waypointnext) és sétáljon(animate=52)
Mostmár a karakterünk oda megy a legközelebbi útvonalhoz és végig megy rajta. De ha a végére ért mit csináljon?

Bővítsük a scriptet úgy hogy ha az út végére ért forduljon vissza:

:waypointstate=0:waypointstart,animate=52

:waypointstate=3:waypointnext,animate=52

:waypointstate=5:waypointreverse,animate=52

 

Ahogy láthatjuk a harmadik sorral meg adtuk ha a karakterünk az út végére ér(:waypointstate=5) akkor forduljon vissza(:waypointreverse)

és sétáljon(animate=52)

Nos, ezzel lényegében készen is vagyunk, ám ez a script csak egy útvonalon mozgatja a karaktert oda-vissza.

De hogyan csináljuk meg hogy véletlen szerűen válasszon utat?

:waypointstate=0:waypointstart,animate=52

:waypointstate=3:waypointnext,animate=52

:waypointstate=4:waypointrandom,animate=52

:waypointstate=5:waypointreverse,animate=52

 

Ahogy láthatjuk a 2. és 3. sor közé be ékeltünk még egy sort.

A plusz sorral azt a parancsot adjuk a karakternek hogy ha el érte az út végét ami elágazik(waypointstate=4) akkor válasszon út irányt

véletlen szerüen(:waypointrandom) és sétáljon(animation=52).

Tehát akkor mit is csinál ez a script?

A karakter oda fog menni a leg közelebbi útvonalhoz és végig megy rajta. Ha a végére ért és el ágazik akkor véletlen szerüen választja ki hogy merre megy tovább.

Ha az út végén már nem lehet merre tovább menni, akkor vissza fog fordulni.

Viszont a játékost így nem támadja meg csak sétálgat.

Lássuk hogyan írjuk meg a scriptet hogy ha meg látja a játékost akkor támadja meg.

Először lássuk a scripthez szükséges parancsokat:

feltétel(condition)

PLRCANBESEEN
-ha látja a játékost

PLRCANNOTBESEEN
-ha nem látja a játékost

cselekmény(action)

ROTATETOPLR
-forduljon a játékos felé arccal

SHOOTPLR
-lőjön a játékosra

Most irjunk egy scriptet ami azt a parancsot adja a karakternek hogy ha meglátja a játékost akkor kezdje lőni

:state=0,plrcanbeseen:state=1

:state=1:rotatetoplr,waypointstop,animate=51,shootplr

Ahogy láthatjuk az első sor csak a feltételt tartalmazza,hogy ha a karakter látja a játékost(plrcanbeseen) akkor a program futtassa le a :state=1-el kezdőd sort

A második sor(:state=1) tartalmazza a cselekményt mi szerint a karakter forduljon arccal a játékos felé(rotatetoplr), ne kövesse tovább az útvonalat (waypointstop), sétáljon(animate=51) és lője a játékost(shootplr).

Tehát akkor mit is csinál ez a script? Ha a karakter meglátja a játékost, akkor nem követi tovább az útvonalat hanem a játékos felé fordul és lőni kezd.

Viszont még koránt sem vagyunk kész, ugyanis az ellenségnek nem csak lőni hanem követni is kell a játékost de azért a tisztes távolságot
tartsa meg.Lássuk ezt hogyan csináljuk.

Első lépésben ismerkedjünk meg a scripthez szükséges parancsokkal:

feltétel(condition)

PLRDISTWITHIN=X
-ha a játékos x-nél távolabb van

PLRDISTFURTHER=X
-ha a játékos X-nél közelebb van
cselekmény(action)

MOVEFORCE=X
-mozogjon X értéket előre

MOVEBACK=X
-mozogjon X értéket hátra

FOLLOWPLR
-kövesse a játékost

Nos,akkor írjunk egy scriptet ami azt a parancsot tartalmazza hogy a karakter tartsa a tisztes távolságot,ne kerüljön túl közel se túl távol

:state=0:state=1

:state=1:rotatetoplr

:state=1,plrdistfurther=500:moveforce=4,animate=55

:state=1,plrdistwithin=400:moveback=4,animate=55
Ahogy láthatjuk a script azt a parancsot adja a karakternek hogy forduljon a játékos felé(rotatetoplr) és ha 500 unit-nál távolabb van a játékos

(plrdistfurther=500) akkor mozogjon előre 4 unitot(moveforce=4) és mozogjon gyorsan(animate=55)

Ha viszont 400 unitnál közelebb kerül(plrdiswithin=400) akkor lépján vissza 4 unitot(moveback=4) és mozogjon gyorsan(animate=55)

Most már az ellenség mozog előre és hátra ha szükséges, de ha nem szükséges akkor hogyan álljon meg?

:state=0:state=1

:state=1:rotatetoplr

:state=1,plrdistfurther=500:movefore=4,animate=55

:state=1,plrdistwithin=400:moveback=4,animate=55

:state=1,plrdistwithin=500,plrdistfurther=400:animate=51

 

Ahogy láthatjuk alurra hozzá adtunk még egy sort ami azt az utasitást tartalmazza hogy ha a játékos 500 unitnál közelebb van(plrdistwithin=500) és 400 unitnál távolabb(plrdistfurther=400) akkor ne csináljon semmit(animate=51)

Az ellenség mostmár rohangál oda-vissza ha szükséges ha pedig nem szükséges akkor nyugton van.

Most bővítsük a scriptünket úgy hogy az ellenség kövesse is a játékost ha szükséges.

:state=0:state=1
:state=1:rotatetoplr

:state=1,plrdistfurther=500:movefore=4,animate=55

:state=1,plrdistwithin=400:moveback=4,animate=55

:state=1,plrdistwithin=500,plrdistfurther=400:animate=51

:state=1,plrcannotbeseen:state=2

 

:state=2:followplr

:state=2,plrcanbeseen:state=1

 

Ahogy láthatjuk a programhoz hozzá adtunk plusz 3 sort, ami a követekzőt tartalmazza.

Ha a karakter nem látja a játékost (plrcannotbeseen) akkor a program menjen a :state=2 sorra

és kövesse a játékost (followplr), ha viszont a karakter látja a játékost (plrcanbeseen) akkor lépjen vissza a :state=1 sorra.

Nos akkor mit is csinál pontosan ez a script?

Ha a karakter látja a játékost akkor tartsa a tisztes távolságot, ha viszont nem látja a játékost akkor kezdje követni és ha már megint látja akkor hadija abba a követést és tartsa a távolságot.

Nos mostmár a scriptünk lehetővé teszi hogy az ellenség tartsa a tisztes távolságot és kövesse a játékost.

Következő lépésben bővítsük a scriptet úgy hogy az ellenség csak akkor lőjön ha a játékos a fegyver ható sugarába kerül.

Első lépésként lássuk a szükséges parancsokat:

feltétel(condition)

PLRINGUNSIGHT=X
-ha a játékos a fegyver ható sugarában van

cselekmény(action)

USEWEAPON
-a karakter tüzeljen bármilyen fegyverrel ami nála van
Lássuk a scriptet

:state=0:state=1

 

:state=1:rotatetoplr

:state=1,plrdistfurther=500:movefore=4,animate=55

:state=1,plrdistwithin=400:moveback=4,animate=55

:state=1,plrdistwithin=500,plrdistfurther=400:animate=51

:state=1,plrcannotbeseen:state=2

:state=1,plringunsight=1:useweapon

 

:state=2:followplr

:state=2,plrcanbeseen:state=1

 

Ahogy láthatjuk egy új sorral bővítettük a scriptünket.

Ha a játékos a fegyver ható sugarába kerül(plringunsight=1) akkor a karakter tüzeljsn bármilyen fegyverrel ami nála van(:useweapon)

 

Mostmár a scriptünk gyakorlatilag működő képes. Az ellenség tartja a tisztes távolságot, követ és csak akkor lő ha ideális.

Viszont csak addig lő még van ólom a tárban.

Most lássuk hogyan is bővítsük a scriptet úgy hogy az ellenség tárazzon újra a megfelelő időben.

Első lépésben ismerkedjünk meg a szükséges parancsokkal.

feltétel(condition)

IFWEAPON=X
-ha a fegyver készen áll(1) vagy nem áll készen(0)

esemény(action)

RELOADWEAPON
-tárazzon újra
Nos, az újra töltéshez animációra is szükségünk van. Használhatjuk az 56-os animációt (animate=56).

De ha jobb,s zebb eredményt szeretnénk kapni akkor az animációt hívjuk be manuálisan.

Először is lássuk a manuális animáció híváshoz szükséges parancsokat

feltétel(condition)

FRAMEATEND=X

-animáció vége X

FRAMEATSTART=X

-animáció kezdete X

 

cselekmény(action)

SETFRAME=X
-az animáció sor első keretét játsza le

INCFRAME=X
-növekedjen az animáció sor X keretig
Lássuk hogyan is néz ki a script:

:state=0:state=1

 

:state=1:rotatetoplr

:state=1,plrdistfurther=500:movefore=4,animate=55

:state=1,plrdistwithin=400:moveback=4,animate=55

:state=1,plrdistwithin=500,plrdistfurther=400:animate=51

:state=1,plrcannotbeseen:state=2

 

:state=1,ifweapon=0:state=10,setframe=56

:state=1,plringunsight=1:useweapon

 

:state=2:followplr

:state=2,plrcanbeseen:state=1

 

:state=10:incframe=56

:state=10,frameatend=56:animate=51,reloadweapon,state=1

 

Ahogy láthatjuk 3 új sor került a scriptünkbe amik a követekző utasitást tartalmazzák:

 

Ha a fegyver nem áll készen,vagy is üres(ifweapon=1) akkor a program ugorjon a :state=10-el kezdődő sorra és töltse be az animáció első keretét(setframe=56)

Majd növekedjen az animáció sor 56-os keretig(incframe=56) és töltse be az animáció utolsó keretét(frameatend=56) majd ne csináljon semmit(animate=51) és töltse újra a fegyvert(reloadweapon) és a program térjen vissza a :state=1-el kezdődő sorra.
Nos, itt meg zavarhat minket hogy mindenhova 56-ot úrtunk.Első keret, utolsó keret…Ez azért van mert lényegében az 56-os animációt töltöttük be manuálisan.

Ezzel befolyásolva hogy mikor melyik részét játssza le az animációnak.

A karakterünk mostmár újratölti a fegyvert ha szükságes és közben újra töltő animációt játszik majd ha végzett vissza áll az alap helyzetre

 

Viszont azt is szeretnénk hogy az ellenség mozogjon folyamatosan hogy nehezebben lehessen el találni.

Először lássuk a szükséges parancsokat:

cselekmény(action)

STRAFE=X
-a karakter abba az irányba kezd oldalazni amit X értéknek be irunk.Ha negativ értéket irunk akkor balra fog mozdulni,ha pozitiv értéket irunk

akkor jobbra fogja kezdeni a ki térő manővert.

 

Ha például STRAFE értéknek 90-et írunk,akkor a karakter jobbra oldalazva fog kitérni.

CHOOSESTRAFE
-autómatikusan ki választja a mozgás irányát(balra, jobbra vagy egyenesen…)

RANDOM=X
-ha az x értéke 1 véletlen szerűen választja ki a mozgás irányát.

Nos, mindössze erre a 3 parancsra lesz szükségünk, ám a script írása közben arra is ügyelnünk kell hogy a karakter a kitérő manőver során játssza a megfelelő mozgás animációt. Mivel ezt autómatikusan nem fogja lejátszani, ezért erről is nekünk kell gondoskodnunk.Valamint az is fontos hogy a kitérés közben sem vegye le a szemét a játékosról és továbbra is löje a játékost kitérés közben is. Ha pedig ki fogyott a lőszerből akkor tárazzon újra kitérés közben is.

 

Lássuk hogyan is néz ki ez a gyakorlatban:

 

:state=0:state=1

 

:state=1:rotatetoplr

:state=1,plrdistfurther=500:movefore=4,animate=55

:state=1,plrdistwithin=400:moveback=4,animate=55

:state=1,plrdistwithin=500,plrdistfurther=400:animate=51,state=5

:state=1,plrcannotbeseen:state=2

 

:state=1,ifweapon=0:state=10,setframe=56

:state=1,plringunsight=1:useweapon

 

:state=2:followplr

:state=2,plrcanbeseen:state=1

 

:state=5,random=1:state=6,setframe=54

:state=5:state=7,setframe=53

 

:state=6:incframe=54,strafe=90,rotatetoplr

:state=6,ifweapon=0:state=10,setframe=56

:state=6,plringunsight=1:useweapon

:state=6,frameatend=54:state=1,animate=51

 

:state=7:incframe=53,strafe=-90,rotatetoplr

:state=7,ifweapon=0:state=10,setframe=56

:state=7,plringunsight=1:useweapon

:state=7,frameatend=53:state=1,animate=51

 

:state=10:incframe=56

:state=10,frameatend=56:animate=51,reloadweapon,state=1

 

 

Nos, ahogy láthatjuk első lépésben azt az utasítást adtuk a scriptünkben, hogyha az ellenség megfelelő távolságra van a játékostól és nem csinál semmit mozgás tekintetében akkor futtassa le a state=5-el kezdődő sorokat.Vagyis semmitevés helyett válasszon véletlenszerűen irányt hogy merre tér ki (:random=1) abban az esetben ha úgy döntött hogy jobbra tér ki, futassa le a state=6-al kezdődő sorokat és játssza a fegyverrel jobbra oldalazik animáció első keretét (setframe=54) majd játssza le a jobbra oldalazik animációt az utolsó keretig (incframe=54). Mind eközben mozogjon jobbra (strafe=90) és nézze a játékost (:rotatetoplr). Ha fegyver kifogyott (ifweapon=0) akkor futtassa le a state=10-el kezdőd sorokat és játssza le az újra tölt animáció első keretét (setframe=56) majd játssza le az újratöltés animációt az utolsó keretig (incframe=56). Ha az animáció végig ment (frameatend=56) akkor ne csináljon semmit (animate=51), majd töltse újra a fegyvert (reloadeweapon) és futtassa újra a state=1-el kezdődő sorokat. Továbbá ha látja a játékost (plringunsight=1) akkor lője a játékost (useweapon) és játssza az oldalazik jobbra animációt (frameatend=54) és futtassa le a state=1-el kezdődő sorokat és ne csináljon semmit (animate=51)

 

Ha viszont úgy döntött hogy balra tér ki akkor futassa le a state=7-el kezdődő sorokat. És innen kezdve lényegében ugyan az mint amikor balra tért ki, csak ez esetben jobbra állítjuk a dolgokat.

 

Tehát ebben a scritben azt az utasítást adtuk hogyha nem csinál semmit az ellenség, akkor kezdjen el kitérni és miközben kitér akkor is figyelje a játékost,lője és ha kifogyott a lőszer tárazzon újra.

És ezzek végeztünk is, lássuk a scriptünket egyben.

A scriptet lényegében 2 részre kell osztani

Main AI:
:waypointstate=0:waypointstart,animate=52

:waypointstate=3:waypointnext,animate=52
:waypointstate=4:waypointrandom,animate=52
:waypointstate=5:waypointreverse,animate=52

:state=0,plrcanbeseen:state=1
:state=1:rotatetoplr,waypointstop,animate=51,shootplr,state=2
Shoot AI

:state=0:state=1

:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51,state=5
:state=1,plrcannotbeseen:state=2

:state=1,ifweapon=0:state=10,setframe=56
:state=1,plringunsight=1:useweapon

:state=2:followplr
:state=2,plrcanbeseen:state=1

:state=5,random=1:state=6,setframe=54
:state=5:state=7,setframe=53

:state=6:incframe=54,strafe=90,rotatetoplr
:state=6,ifweapon=0:state=10,setframe=56
:state=6,plringunsight=1:useweapon
:state=6,frameatend=54:state=1,animate=51

:state=7:incframe=53,strafe=-90,rotatetoplr
:state=7,ifweapon=0:state=10,setframe=56
:state=7,plringunsight=1:useweapon
:state=7,frameatend=53:state=1,animate=51

:state=10:incframe=56
:state=10,frameatend=56:animate=51,reloadweapon,state=1

 

 

A Main AI gondoskodik arról hogy a karakter menjen a legközelebbi waypointhoz és sétáljon rajta. Azt a scriptet a karakter beállításaiban a Main ponthoz kell adnunk mert az fut le először

A Shoot AI tartalmazza azt az utasítást hogyha meglátja az ellenséget akkor támadja meg, kövesse, próbáljon kitérni..stb. Ezt a scriptet a karakter beállításokban a Start ponthoz kell adni.

 

Ajánlott cikkek: