Gegnerskripte
6. Juli 2013 von Yhoko
Eben sprach ich noch von Skriptverbesserungen und KI, da möchte ich den ersten Beitrag ansetzen. Wer schonmal ein Spiel programmiert hat, kennt die Komplexität dieses Themas – man beginnt mit herumstehenden NPCs (je nachdem kann man die sogar schon ansprechen), dann folgen solche, die bloss zufällig herumlaufen (z.B. Haustiere oder alte Leute, die dumme Sprüche von sich geben), zwischendurch vielleicht noch patroullierende NPCs (wie etwa Soldaten) und dann wirds komplizierter. Vielleicht will man Verfolger, die dem Spieler nachlaufen, oder Gegner, die bei Sichtkontakt aufmerksam werden, den Spieler verfolgen oder gar Deckung nehmen, wenn sie unter Beschuss geraten.
Soweit eigentlich kein Thema für Endyr, aber nun kommt der Haken: Selbst ein komplexer Gegner soll patroullieren oder zufällig herumlaufen, wenn keine Spieler in der Nähe sind. Bislang war es so, dass dazu das ganze Bewegungs-Skript der Dorfbewohner als Kopie nochmal im Gegner-Skript vorhanden war. Dasselbe gilt natürlich auch für alle anderen Funktionen, etwa Looting (erzeugt Items, nachdem ein Gegner besiegt wurde) oder Gespräche. Wollte man also eine neue Gegnerart erschaffen (z.B. einen Geist, der zwischen der normalen und Geisterebene wechseln kann) musste man dies entweder mit immer mehr Parametern regeln (bei jedem Gegner zusätzlich eintragen ob er ein Geist ist, wie oft er die Ebene wechseln kann, usw. – auf Dauer ziemlich lästig) oder das ganze Skript nochmal kopieren (auch lästig, denn sämtliche Änderungen und Bugfixes müssen dann an allen kopierten Skripte ebenfalls vorgenommen werden).
Um hier nun mehr Modularität zu schaffen habe ich das Skripting so erweitert, dass man weitere Skripte per Befehl einbinden und zuweisen kann. Das erleichtert nicht nur die Handhabung sondern führt zu einer sehr praktischen Aufgabentrennung. Konkret: Statt einem "Gegner"-Skript, welches den NPC bewegt, angreift und letztendlich Loot erzeugt, gibt es nun primär einen "Controller", also sozusagen das Drehbuch für den Gegner.
Ein Beispiel: Der Controller wird geladen und weist erstmal das "random" Skript zu, damit der NPC zufällig herumläuft. Weiterhin erzeugt er "senses", also Sinne, welche seine Umgebung abtasten. Sobald etwas gesichtet wird, melden die Sinne dies dem Controller und er entscheidet, was zu tun ist – handelt es sich um einen Spieler, klinkt er "random" aus und bindet stattdessen "chase", also Verfolgung, für die Fortbewegung ein. Weiterhin kann er "attack" hinzufügen oder sonstige Skripte einbinden. Melden die Sinne, dass der Spieler nicht mehr da ist (ausser Reichweite, Ebene gewechselt, Unsichtbarkeitstrank, etc.) wird der Controller das alles wieder entfernen und auf "random" zurückschalten.
Während nun die einfachen Gegner auch ziemlich einfache "Sinne" haben (vlt. einfach ein "visueller Annäherungssensor", also vereinfachte Augen) können komplexere Bossgegner natürlich auch andere Skripte verwenden. Denkbar sind z.B. Augen mit eingeschränktem Blickfeld, ein Geruchssensor (Nase) welcher richtungsunabhängig, dafür aber mit Verzögerung reagiert, Schallsensoren (Ohren) die auf Schritte und Kampfgeräusche reagieren, usw. – dem Spielprinzip sind hier lediglich Kapazitätsgrenzen gesetzt.
Und wozu das Ganze?
Stellen wir uns Gegner vor, die nur Ohren als Sinne haben. Spieler mit Lederrüstungen könnten diese unbemerkt passieren, während eine Metallrüstung sie aufweckt und anlockt – was entweder versehentlich oder natürlich auch absichtlich geschehen kann.
Nun denken wir an eine verwandte Spezies, die Ohren und Nasen hat. Auch hier könnte man gut vorbeischleichen, sofern man dabei nicht trödelt – wer zu lange in Gegnernähe verweilt, wird gerochen und damit entdeckt. Ähnliches gilt für eine andere Spezies, die Wärme oder Lebensenergie spürt.
Eine andere Variante wären Gegner nur mit Augen als Sinne. Solange man hinter ihnen vorbeigeht, kann man unbemerkt bleiben, doch wehe einer dreht sich um! Oder die Gegner sehen lediglich infrarot und mit einem speziellen Kühltrank kann man sich vor ihnen verbergen. Die Möglichkeiten sind ziemlich weitreichend und jeder Sinn ermöglicht andere Items, die das Spielprinzip erweitern. Nebst einem Parfüm, dass den eigenen Duft verschleiert, sind z.B. Köder denkbar, welche die Gegner in eine Falle locken – oder andere Gegner ihre Kollegen, die man zuvor mit einer Duftbombe eingenebelt hat, angreifen lassen.
Taktik lautet das Stichwort und die Tiefe der Möglichkeiten hängt momentan noch sehr stark davon ab, was die Spieler – also ihr – wünschen.
Soweit eigentlich kein Thema für Endyr, aber nun kommt der Haken: Selbst ein komplexer Gegner soll patroullieren oder zufällig herumlaufen, wenn keine Spieler in der Nähe sind. Bislang war es so, dass dazu das ganze Bewegungs-Skript der Dorfbewohner als Kopie nochmal im Gegner-Skript vorhanden war. Dasselbe gilt natürlich auch für alle anderen Funktionen, etwa Looting (erzeugt Items, nachdem ein Gegner besiegt wurde) oder Gespräche. Wollte man also eine neue Gegnerart erschaffen (z.B. einen Geist, der zwischen der normalen und Geisterebene wechseln kann) musste man dies entweder mit immer mehr Parametern regeln (bei jedem Gegner zusätzlich eintragen ob er ein Geist ist, wie oft er die Ebene wechseln kann, usw. – auf Dauer ziemlich lästig) oder das ganze Skript nochmal kopieren (auch lästig, denn sämtliche Änderungen und Bugfixes müssen dann an allen kopierten Skripte ebenfalls vorgenommen werden).
Um hier nun mehr Modularität zu schaffen habe ich das Skripting so erweitert, dass man weitere Skripte per Befehl einbinden und zuweisen kann. Das erleichtert nicht nur die Handhabung sondern führt zu einer sehr praktischen Aufgabentrennung. Konkret: Statt einem "Gegner"-Skript, welches den NPC bewegt, angreift und letztendlich Loot erzeugt, gibt es nun primär einen "Controller", also sozusagen das Drehbuch für den Gegner.
Ein Beispiel: Der Controller wird geladen und weist erstmal das "random" Skript zu, damit der NPC zufällig herumläuft. Weiterhin erzeugt er "senses", also Sinne, welche seine Umgebung abtasten. Sobald etwas gesichtet wird, melden die Sinne dies dem Controller und er entscheidet, was zu tun ist – handelt es sich um einen Spieler, klinkt er "random" aus und bindet stattdessen "chase", also Verfolgung, für die Fortbewegung ein. Weiterhin kann er "attack" hinzufügen oder sonstige Skripte einbinden. Melden die Sinne, dass der Spieler nicht mehr da ist (ausser Reichweite, Ebene gewechselt, Unsichtbarkeitstrank, etc.) wird der Controller das alles wieder entfernen und auf "random" zurückschalten.
Während nun die einfachen Gegner auch ziemlich einfache "Sinne" haben (vlt. einfach ein "visueller Annäherungssensor", also vereinfachte Augen) können komplexere Bossgegner natürlich auch andere Skripte verwenden. Denkbar sind z.B. Augen mit eingeschränktem Blickfeld, ein Geruchssensor (Nase) welcher richtungsunabhängig, dafür aber mit Verzögerung reagiert, Schallsensoren (Ohren) die auf Schritte und Kampfgeräusche reagieren, usw. – dem Spielprinzip sind hier lediglich Kapazitätsgrenzen gesetzt.
Und wozu das Ganze?
Stellen wir uns Gegner vor, die nur Ohren als Sinne haben. Spieler mit Lederrüstungen könnten diese unbemerkt passieren, während eine Metallrüstung sie aufweckt und anlockt – was entweder versehentlich oder natürlich auch absichtlich geschehen kann.
Nun denken wir an eine verwandte Spezies, die Ohren und Nasen hat. Auch hier könnte man gut vorbeischleichen, sofern man dabei nicht trödelt – wer zu lange in Gegnernähe verweilt, wird gerochen und damit entdeckt. Ähnliches gilt für eine andere Spezies, die Wärme oder Lebensenergie spürt.
Eine andere Variante wären Gegner nur mit Augen als Sinne. Solange man hinter ihnen vorbeigeht, kann man unbemerkt bleiben, doch wehe einer dreht sich um! Oder die Gegner sehen lediglich infrarot und mit einem speziellen Kühltrank kann man sich vor ihnen verbergen. Die Möglichkeiten sind ziemlich weitreichend und jeder Sinn ermöglicht andere Items, die das Spielprinzip erweitern. Nebst einem Parfüm, dass den eigenen Duft verschleiert, sind z.B. Köder denkbar, welche die Gegner in eine Falle locken – oder andere Gegner ihre Kollegen, die man zuvor mit einer Duftbombe eingenebelt hat, angreifen lassen.
Taktik lautet das Stichwort und die Tiefe der Möglichkeiten hängt momentan noch sehr stark davon ab, was die Spieler – also ihr – wünschen.
Kommentar schreiben