|
|
KI für NPC Die NPC in Darkmountain verfügen über eine einfache KI die Ihre Umgebung erfasst und einfache Aktionen durchführen kann. Fähigkeiten der KI:
Die weiteren Aktionen der NPC wie z.B. Pfadverfolgung werden über einen Aktionsstack gesteuert der der Reihe nach abgearbeitet wird. Der Aktionsstack kann hier die Befehle Folge dem Pfad "X" oder gehe zu Punkt "X,Y" enthalten. Der Befehl kann auch an eine Uhrzeit gekoppelt werden um z.B. den Jäger um 7:00 Uhr morgens auf die Jagd zu schicken. Der aktuelle Befehl des Aktionsstacks wird durch die Wahrnehmungsroutinen der KI bei Bedarf unterbrochen. Folgt der NPC z.B. gerade einem Pfad auf dem sich ein Gegner befindet wird er die Pfadverfolgung unterbrechen und den Gegner attackieren. Nach erfolgreichem Kampf wird die vorherige Aktion wieder aufgenommen.
Die Logik der KI ist hier noch sehr einfach aber wirkungsvoll. Über ein Flag wird festgelegt ob der NPC gutartig oder bösartig reagiert. Gute NPC greifen böse NPC automatisch an und umgekehrt. Bild: NPC werden mit der KI aufeinander losgelassen Definition Gut - Böse: my.flag2 = ON/OFF; (gut/böse) In oben dargestellter Szene scannen die NPC Ihre Umwelt. Sobald Sie einen feindlichen NPC finden nähern Sie sich und bekämpfen Ihn. Ist der Gegner gefallen wird der nächste gesucht und bekämpft. Sind nur noch NPC mit der gleichen Flag2 Einstellung vorhanden wird der Kampfmodus beendet und der NPC geht wieder seiner vorherigen Tätigkeit nach oder verbleibt im Idle - Modus.
Finde den Gegner Umgebung absuchen Zuerst benötigen wir eine Routine die den Scan der Umgebung anstößt. Hierzu wird die Funktion scan_entity verwendet. Die Scanfunktion kann eine Kugel oder ein Segment einer Kugel um den NPC durchsuchen. Bei meiner KI wird der gesamte Umkreis abgesucht. Es hilft also derzeit nichts sich im Rücken des NPC anzuschleichen. temp.pan=360;
// Volle 360° werden horizontal abgesucht temp.z=800;
// Hierdurch wird der Radius in Quad angegeben der um den NPC abgesucht Damit der NPC auf die Scanergebnisse reagieren kann muss das Flag ENABLE_DETECT bei dem NPC gesetzt werden. Es können nur Entities gefunden werden bei denen das Flag ENABLE_SCAN gesetzt wurde. Da die NPC meiner KI aufeinander reagieren sollen müssen beide Flags gesetzt werden. my.ENABLE_DETECT=ON; Die Funktion scan_entity liefert als Ergebnis nur die Distanz bis zum ersten gefundenen Entity oder eine 0 wenn kein Entity gefunden wurde. Auf die gefundenen Objekte muss an anderer Stelle der KI reagiert werden. Routine npc_human_search_enemy zur Suche nach anderen NPC oder dem Spieler // temp.pan = 360; acttime=total_secs;
Ergebnisse des Scans verarbeiten Die gefundenen Entities des Scans werden in der Eventfunktion abgearbeitet. Diese muss innerhalb der Action dem Entity zugewiesen werden. ACTION NPC_HUMAN { In der Eventfunktion kann jetzt auf den Scan reagiert werden. Der Scan wird für jede gefundene Entity automatisch die Eventfunktion einmal anstoßen. Das gefundene Entity kann dabei über den you Pointer angesprochen werden. Das schwierige bei der Verarbeitung ist dass die Scanfunktion nicht sequentiell arbeitet. Das Script läuft nach dem Befehl scan_entity weiter während die Ergebnisse parallel an die Eventfunktion weitergegeben werden. Soll mit dem gefundenen Entity weitergearbeitet werden muss der Handle unbedingt gemerkt werden da das Ergebnis des Scans über den you Pointer zurückgeliefert wird. Dieser ändert sich aber beim nächsten Scan oder bei einer Trace Anweisung. Da ein Entity keinem Skillwert direkt zugewiesen werden kann muss der Handle ausgelesen und in der Skillvariable gespeichert werden. my.skill90=handle(you); Es ist nicht ratsam sich eine Variable vom Typ Entity im Script zu definieren und das Ergebnis hier zu speichern. Diese Variable ist Global und wird dann von allen NPC gemeinsam verwendet. Dies führt dann zu einem völlig undefinierbarem Verhalten. Es ist grundsätzlich wichtig alle Ergebnisse die gemerkt werden sollen nur in SKILL oder FLAG Parametern des Entity abzulegen. Falscher Code: entity* gegner; Dieses Script funktioniert für einen NPC hervorragend. Sobald das Script aber mehreren NPC zugewiesen wird gibt es völlig undefinierte Zustände.
// //
|