Die KI-Begleiter von Warman sind Bots, die an der Seite der Spieler kämpfen. Sie müssen Räume navigieren, Gegner bekämpfen, Portale benutzen und dem Spieler folgen, alles innerhalb einer Lockstep-Simulation, in der jede Aktion deterministisch sein muss. Das Gehirn, das sie antreibt, ist eine Zustandsmaschine, gesteuert durch WarScript, die eingebaute Skriptsprache von Warman.
Die Gehirn-Architektur
Jeder Begleiter bekommt eine eigene AICompanionBrain-Instanz. Das Gehirn führt ein WarScript-Skript aus, das einmal pro Simulations-Tick mit einer on_tick(delta_time)-Funktion aufgerufen wird. Das Skript gibt hochrangige Befehle wie „folge dem Besitzer", „greife den nächsten Gegner an" oder „benutze ein Portal".
Das ist wichtig für Lockstep. Weil Bots Standard-Eingabebefehle erzeugen, die durch die normale Simulations-Tick-Pipeline fließen, gibt es keinen speziellen Bot-Codepfad. Die Determinismus-Garantien stellen sicher, dass jeder Client dasselbe Bot-Verhalten aus denselben Eingaben berechnet.
Alle Bewegung geht über A*
Bots schummeln nicht. Sie können sich nicht teleportieren, durch Wände laufen oder über Klippen schweben. Jede Bewegungsentscheidung geht durch dieselbe A*-Pfadfindung, die auch die Spielwelt nutzt. Wenn das Gehirn entscheidet, sich irgendwohin zu bewegen, berechnet es einen A*-Pfad von der aktuellen Position des Bots zum Ziel und folgt dann Tick für Tick den Wegpunkten.
Der Bewegungsoutput ist ein Geschwindigkeitsvektor, keine Position. Das Gehirn konvertiert die Weltrichtung in den kamerarelativ Eingaberaum (passend zur isometrischen Kamerarotation), damit die Bewegung des Bots dem entspricht, was die WASD-Eingabe eines echten Spielers erzeugen würde. Das stellt sicher, dass Bewegungsgeschwindigkeit, Wandkollision und Rampennavigation sich identisch zu einem menschlichen Spieler verhalten.
Kampf-Kiting
Das Kampfsystem nutzt eine einfache Zustandsmaschine: Annähern, Angriffsstoß, Umpositionieren, Wiederholen. Wenn der Befehl lautet, den nächsten Gegner anzugreifen, findet das Gehirn den nächsten lebenden Gegner im Raum, pfadfindet in Angriffsreichweite, feuert dann einen Stoß von Angriffen (etwa 8 Ticks) während es durch Skill-Slots 1 bis 4 zykliert. Nach dem Stoß pfadfindet der Bot zu einer zufälligen Position innerhalb eines Kite-Radius um den Gegner und wiederholt.
Fernkampf-Bots verhalten sich anders. Sie versuchen Distanz zu halten. Wenn sich ein Fernkampf-Bot näher als Nahkampfreichweite befindet, pfadfindet er weg, bevor er angreift. Der Bot prüft seinen ausgerüsteten Waffentyp, um das Verhalten zu bestimmen: Ist es eine RangedWeapon, kitet er auf Distanz; andernfalls schließt er in den Nahkampf.
Portalnavigation und Gedächtnis
Das Portalsystem war der schwierigste Teil. Wenn das Skript des Spielers dem Bot sagt zu erkunden (ein neues Portal zu benutzen), durchsucht das Gehirn den Raum nach IBotApproachable-Interaktionsobjekten, Portale, die eine begehbare Annäherungsposition innerhalb ihrer Auslösezone freigeben.
Der Bot führt ein Gedächtnis besuchter Portale. Bei „benutze neues Portal" filtert er bereits besuchte heraus und wählt das nächste unbesuchte. Wenn alle Portale besucht wurden, wählt er ein zufälliges als Notausgang (aber nie das Ankunftsportal, um sofortiges Zurücklaufen zu verhindern). Das Ankunftsportal, das, durch das der Bot beim Betreten des Raums kam, wird separat verfolgt und immer vom ersten Durchlauf ausgeschlossen.
Die Annäherung selbst funktioniert wie bei einem echten Spieler: Der Bot pfadfindet zur Annäherungsposition des Portals (die innerhalb der Auslösezone auf begehbarem Boden liegt), dann löst sein Bewegungsvektor das Interaktionserkennungssystem aus. Der Bot setzt jeden Tick während der Annäherung executeInteract = true, sodass das Portal in dem Moment feuert, in dem er die Auslösezone betritt.
Steckenbleib-Erkennung
Bots können stecken bleiben. Rampenkanten, enge Durchgänge zwischen Klippen und Terrain-Geometrie-Kanten verursachen Situationen, in denen der Bot einen gültigen Pfad hat, aber tatsächlich keinen Fortschritt machen kann. Das Gehirn verfolgt die Position des Bots jeden Tick und zählt, wie viele Ticks er innerhalb einer kleinen Schwelle derselben Stelle verbracht hat.
Nach 15 Steckenbleib-Ticks (etwa 0,75 Sekunden bei 20 TPS) versucht das Gehirn Wiederherstellungsschritte in Reihenfolge: Zuerst zum nächsten Wegpunkt im aktuellen Pfad springen (vielleicht ist der Annäherungswinkel schlecht). Wenn das nicht hilft, den gesamten Pfad von der aktuellen Position neu berechnen. Wenn das auch fehlschlägt, den Pfad komplett löschen und das Skript entscheiden lassen, was als Nächstes zu tun ist. Dieser mehrstufige Ansatz bewältigt die meisten Terrain-Grenzfälle, ohne dass der Bot die Geometrie verstehen muss.