Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic
English Deutsch
World of Gothic



Inhalt:

Wie wird das NSC-Verhalten in den Skripten festgelegt?

Die meisten NSCs in Gothic sind skriptgesteuert. Jeder NSC befindet sich in einem Skriptzustand, der sein Verhalten festlegt. Diese Skriptzustände unterliegen gewissen Konventionen, die unbedingt eingehalten werden müssen.

Ein Skiptzustand besteht in der Regel aus drei Skriptfunktionen, die den Zustand in drei Phasen untereilten. Die erste Phase ist die "Begin"-Phase. Hier werden alle vorbereitenden Befehle für die NSC-Aktionen gegeben, zB. den NSC erst mal zum Zielpunkt gehen lassen, an der er seine Aktionen verrichten soll.

Die zweite Phase ist die "Loop"-Phase. Solange sich der NSC in diesem Zustand befindet wird diese Skriptfunktion immer wieder ausgeführt und der NSC wiederholt die darin programmierten Aktionen, bis der Zustand beendet oder unterbrochen wird. Diese Phase kann optional auch einen Rückgabewert liefern, der besagt, ob dieser Zustand beendet werden soll oder nicht. Ist der Rückgabewert dann größer Null, wird der Zustand beendet und die "End"-Phase aufgerufen. Die letzte Phase ist die "End".Phase. Hier werden noch nötige Skriptbefehle abgesetzt, um den NSC sauber die Aktion beenden zu lassen, zB. aufstehen, nachdem er auf einer Bank gesessen hat.

Die Namen der drei Skriptfunktionen, die zusammen den Skriptzustand ergeben, müssen immer mit "ZS_" beginnen. Für die jeweiligen Zustandsphasen müssen auch noch bestimmte Endungen an den Funktionsnamen angefügt werden. Die drei Skriptfunktionen sehen im Skript generell so aus:


FUNC VOID ZS_[Zustandsname] ()

{

	// Dies ist die Beginphase.

	// Sie wird nur einmal bei Start des Zustandes durchlaufen

};



FUNC VOID ZS_[Zustandsname]_LOOP ()

{

	// Dies ist die Loop-Phase.

	// sie wird solange wiederholt,

	// bis der Zustand unterbrochen

	// oder beendet wird.

};





FUNC VOID ZS_[Zustandsname]_END () 

{

	// Die End-Phase.

	// Den NSC seine Aktion beenden lassen.

};

Einen einfachen Skriptzustand findet Ihr z.B. Im Skriptfile "content\story\zs\zs_guard.d".

Wie gelangt der NSC in seine Skriptzustände?

Viele der NSCs haben einen Tagesablauf, in dem festgelegt wird, zu welcher Spielzeit sie welchen Skriptzustand ausführen sollen. Ein gutes Beispiel ist dafür im File "content\story\npc\bau_904_bauer.d" zu finden.


FUNC VOID Rtn_start_904 ()

{

	TA_Sleep		(20,00,07,00,"NC_PATH_PEASANT3");

	TA_WashSelf		(07,00,07,20,"NC_PATH_PEASANT5");

	TA_PickRice		(07,20,20,00,"NC_DAM_BOTTOM");

};

In der Skriptmethode "Rtn_start_904" wird der Tagesabluf des NSCs definiert. Hier werden durch die "TA_"-Befehle weitere Skriptmethoden aufgerufen, die dann per Build-In-Funktion den Zustand den der NSC um diese Tageszeit ausführen soll, an Gothic übergeben. Solche NSCs sind dann Tagesablaufgesteuert. Ein häufiger Anfängerfehler ist es übrigens, die Wegpunkte nicht komplett gross zu schreiben. Dies führt dazu, dass der NSC nicht im Spiel erscheint.

Viele Monster sind zustandsgesteuert und haben nur einen Zustand (Tagesabäufe sind teurer, weil diese von Gothic vorausberechnet werden müssen), zu sehen in den Monster-Skripten. Bei Spielstart startet Gothic die Skriptzustände der NSCs entsprechend ihrem Tagesablauf, bzw. den Tagesablaufzustand bei den Monstern.

Der NSC kann durch Wahrnehmungen aus seinem aktuellen Zustand "herausgerissen" werden. Er entdeckt z.B. den Spieler beim Klauen, sieht ein Monster oder einen Kampf. Dies sind Wahrnehmungen, die einen Zustandswechsel zur Folge haben können. Auf welche Wahrnehmungen der NSC reagieren soll, wird ihm in der Begin-Phase des Zustandes mitgeteilt. Hier wird mit dem Build-In Befehl "Npc_PercEnable" der Skriptzustand, der bei Auftreten dieser Wahrnehmung aktiviert werden soll, mitgeteilt. Tritt diese Wahrnehmung im Laufe des Zustandes auf, wechselt der NSC in den entsprechenden neuen Zustand. Natürlich ist es auch möglich den Zustand "von Hand" zu ändern. Dies kann mit der Build-In-Funktion "AI_StartState" erreicht werden.

Wie gebe ich dem NSC in einem Skriptzustand Befehle?

Zu diesem Zweck gibt es die Build-In-Funktionen, die mit dem Kürzel "AI_" beginnen. Hier sind komplexere NSC-Aktionen möglich (siehe dazu die "externals.d"-Datei), die sich über einen längeren Zeitraum erstrecken, sprich : die länger als einen Frame dauern, z.B. zu einen Zielpunkt gehen, hinsetzen auf einer Bank, etc... Da eine Skriptmethode immer in einem Frame komplett abgearbeitet wird, werden diese AI-Befehle in eine Liste gespeichert und dort nacheinander abgearbeitet (sofern der NSC nicht durch eine Wahrnehmung unterbrochen wird). Erst danach wird die nächste Skriptzustandsmethode aufgerufen.

Es gibt einige globale Variablen über die der NSC und weitere wichtige Objekte im Skript angesprochen werden können. In den Zuständen ist dies immer die "self"-Variable, die den aktuellen NSC enthält, der gerade diesen Zustand ausführt. Diese Variablen werden automatisch von Gothic initialisiert.

Wird ein Zustand durch eine Wahrnehmung aktiviert, kommen je nach Wahrnehmung noch weitere Variablen hinzu, die Ihr für Abfragen benutzen könnt:

  • C_NPC hero : Diese Variable enthält immer den aktuellen Spieler
  • C_NPC self : Der aktuelle NSC, der diesen Zustand durchläuft
  • C_NPC other : Der wahrgenommene NSC (z.B. der Spieler bei Dialogen, Täter)
  • C_NPC victim : Das Opfer der wahrgenommenen Aktion (z.B. der von einem dritten angegriffene NSC)
  • C_ITEM item : Der wahrgenommene Gegenstand.

Ob eine von dieseen Variablen von Gothic initialisiert wurde und in der Skriptfunktion gültig ist, kann man mit der Build-In-Methode "Hlp_IsValidNpc" oder "Hlp_IsValidItem" erfragen. Diese globalen Variablen befinden sich in der Date "content\_intern\classes.d" und dürfen nicht verändert werden.

Wie werden NSCs und Monster in die Welt eingefügt?

NSCs und Monster werden mit Hilfe der Skripte in die Welt eingefügt. Hierzu werden beim Start eines Spieles oder beim Betreten eines neuen Levels automatisch Skriptmethoden aufgerufen, in denen dann die NSCs eingefügt werden sollten.

Die erste dieser Skriptfunktion ist die Startup-Funktion. Sie wird einmal beim Spielstart, bzw. beim erstmaligen Betreten eines Levels ausgeführt. Hier werden dann die in diesem Level vorkommenden NSCs an einem Waypoint eingefügt. Sollte der NSC einen Tagesablauf haben, so kann er aber von Gothic (bzw. von der Tagesablaufvorausberechnung) an eine andere Stelle, entsprechend dem Tagesablauf, eingefügt werden.

Der Name dieser Skriptfunktion setzt sich aus dem vorangestellen "STARTUP_" und dem Namen des entspechenden Level-Zen-Files zusammen. Eine weitere Funktion ist die Init-Funktion (Name : Init_[Zen-File-Name]). Sie wird bei jedem (auch wiederholten) Betreten eines Levels aufgerufen und sollte nicht für das Einfügen von NSCs benutzt werden, da diese sonst bei jedem Betreten erneut in den Level eingefügt werden... Das eigentliche Einfügen der NSCs passiert mit der Build-In-Methode "Wld_InsertNpc". Dort gibt man den Instanznamen und den Waypoint als Parameter an, zu sehen ist das in dem "content\story\startup.d"-File.


Beispiel (wird beim erstmaligen Betreten von surface.zen aufgerufen)



func VOID STARTUP_SURFACE ()

{

	Wld_InsertNpc(PC_Thief,"OC1");		  //Diego einfügen

	Wld_InsertNpc(SLD_700_Lee,"NC_DAM");		 //Lee einfügen

	Wld_InsertNpc(PC_Mage,"OC1");		// Milton einfügen



	// Schwarzen Goblin einfügen

	Wld_InsertNpc(BlackGobboMace,"SPAWN_GOBBO_LOCATION_29_03");

};

Bei NSCs kann man im Prinzip einen beliebigen Wegpunkt angeben, der Tagesablauf legt fest, wo sich der NSC zu einem bestimmten Zeitpunkt aufhält. Bei Monstern, die nur einen Zustand haben, muss man dagegen die konkrete Position angeben. Wichtig ist erneut: Wegpunkte komplett gross schreiben!

 

Basiert auf der G1MDK-Dokumentation. Copyright © Piranha Bytes




Username:
Passwort:
angemeldet bleiben:

Fanart