Benutzer-Werkzeuge

Webseiten-Werkzeuge


Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
tutorials:skript-tutorial [2015/08/18 22:16]
127.0.0.1 Externe Bearbeitung
tutorials:skript-tutorial [2016/12/30 20:28]
milky-way update formatierung
Zeile 1: Zeile 1:
-== Einleitung ​==+====== Skripttutorial ======
 Das Tutorial ist so aufgebaut, dass am Ende eine kleine Mission steht, die den Spieler ein Schwert für einen Nsc holen lässt, im Verlauf wird, an den entsprechenden Stellen erklärt, wie eine Teilaufgabe umzusetzen ist. Z.B. wird für eine hol mir ein Schwert Mission natürlich ein tolles Schwert benötigt, also wird zu diesem Zeitpunkt die Item-Klasse erklärt und dann mit Inhalt gefüllt, bis ein entsprechendes Schwert vorliegt, das dann ins Spiel eingefügt und dort benutzt werden kann. Sollte sich ein Script in G1 und G2 unterscheiden,​ liegt es jeweils in zwei Fassungen vor. Scripte zu denen kein G2 gegenstück existiert können so übernommen werden. Das Tutorial ist so aufgebaut, dass am Ende eine kleine Mission steht, die den Spieler ein Schwert für einen Nsc holen lässt, im Verlauf wird, an den entsprechenden Stellen erklärt, wie eine Teilaufgabe umzusetzen ist. Z.B. wird für eine hol mir ein Schwert Mission natürlich ein tolles Schwert benötigt, also wird zu diesem Zeitpunkt die Item-Klasse erklärt und dann mit Inhalt gefüllt, bis ein entsprechendes Schwert vorliegt, das dann ins Spiel eingefügt und dort benutzt werden kann. Sollte sich ein Script in G1 und G2 unterscheiden,​ liegt es jeweils in zwei Fassungen vor. Scripte zu denen kein G2 gegenstück existiert können so übernommen werden.
-== Der Auftraggeber ==+===== Der Auftraggeber ​=====
 Um einen neuen Nsc im Spiel zur Verfügung zu haben muß eine Instanz der Klasse C_Npc erstellt werden. Im folgenden wird erst kurz ein allgemeiner Abriss der Klasse gegeben und diese dann mit Inhalt gefüllt. Um einen neuen Nsc im Spiel zur Verfügung zu haben muß eine Instanz der Klasse C_Npc erstellt werden. Im folgenden wird erst kurz ein allgemeiner Abriss der Klasse gegeben und diese dann mit Inhalt gefüllt.
  
 Die Klasse Die Klasse
-<​code>​+<​code ​C>
 CLASS C_NPC CLASS C_NPC
 { {
Zeile 11: Zeile 11:
 </​code>​ </​code>​
 Die Id ist ein eindeutiger Indentifier,​ mit dem der Nsc im Programm referenziert werden kann und wird zum Beispiel benutzt um Tagesabläufe mit dem Nsc zu verknüpfen. Die Id ist ein eindeutiger Indentifier,​ mit dem der Nsc im Programm referenziert werden kann und wird zum Beispiel benutzt um Tagesabläufe mit dem Nsc zu verknüpfen.
-<​code>​+<​code ​C>
  VAR STRING name [5];  // Namen des NPC  VAR STRING name [5];  // Namen des NPC
 </​code>​ </​code>​
 Der Name ist ein String und taucht z.B. auf wenn man im Spiel einen Nsc im Focus hat. Der Name ist ein String und taucht z.B. auf wenn man im Spiel einen Nsc im Focus hat.
-<​code>​+<​code ​C>
  VAR STRING ​ slot;  VAR STRING ​ slot;
 </​code>​ </​code>​
 Unbenutzt, aber vorhanden, lässt sich also für spezielle Zwecke als Membervariable,​ die einen String neben dem Namen speichern kann benutzen. Unbenutzt, aber vorhanden, lässt sich also für spezielle Zwecke als Membervariable,​ die einen String neben dem Namen speichern kann benutzen.
-<​code>​+<​code ​C>
  VAR INT  npcType;  VAR INT  npcType;
 </​code>​ </​code>​
 Integer, mit dem in Gothic der Charakter bestimmten Gruppen zugeordnet wird. __Npc_TypeMain__ ist z.B. einer der Hauptcharaktere (z.B. Diego). Integer, mit dem in Gothic der Charakter bestimmten Gruppen zugeordnet wird. __Npc_TypeMain__ ist z.B. einer der Hauptcharaktere (z.B. Diego).
-<​code>​+<​code ​C>
  VAR INT     ​flags;​  VAR INT     ​flags;​
 </​code>​ </​code>​
 Hier lässt sich der Nsc auf Immortal setzen __flags = NPC_FLAG_IMMORTAL;​__ Hier lässt sich der Nsc auf Immortal setzen __flags = NPC_FLAG_IMMORTAL;​__
-<​code>​+<​code ​C>
  VAR INT     ​attribute ​ [ATR_INDEX_MAX] ;  VAR INT     ​attribute ​ [ATR_INDEX_MAX] ;
 </​code>​ </​code>​
 Die Attributwerte des Nsc werden in ein Array gespeichert,​ die Benutzung wird an Hand des Beispielcharakters,​ der weiter unten erstellt wird klarer. Die Attributwerte des Nsc werden in ein Array gespeichert,​ die Benutzung wird an Hand des Beispielcharakters,​ der weiter unten erstellt wird klarer.
-<​code>​+<​code ​C>
  VAR INT protection ​ [PROT_INDEX_MAX];​  VAR INT protection ​ [PROT_INDEX_MAX];​
 </​code>​ </​code>​
 Die Protection wird genauso gehandelt wie die Attribute, hier kann man dem Nsc einen natürlichen Rüstschutz gegen bestimmte Schadenstypen verpassen, Z.B. gegen Feuer Die Protection wird genauso gehandelt wie die Attribute, hier kann man dem Nsc einen natürlichen Rüstschutz gegen bestimmte Schadenstypen verpassen, Z.B. gegen Feuer
-<​code>​+<​code ​C>
  VAR INT damage ​  ​[DAM_INDEX_MAX] ;  VAR INT damage ​  ​[DAM_INDEX_MAX] ;
 </​code>​ </​code>​
 Gibt die Möglichkeit mehrere Arten von Nahkampfschäden an, den einen Nsc zuzuweisen, die er mit den bloßen Fäusten verursacht, ist aber nicht unbedingt sinnvoll, weil Nsc die meiste Zeit eine Waffe in der Hand haben sollten, zum rumexperimentieren Damagetypes,​ die das Array akzeptiert sind : Gibt die Möglichkeit mehrere Arten von Nahkampfschäden an, den einen Nsc zuzuweisen, die er mit den bloßen Fäusten verursacht, ist aber nicht unbedingt sinnvoll, weil Nsc die meiste Zeit eine Waffe in der Hand haben sollten, zum rumexperimentieren Damagetypes,​ die das Array akzeptiert sind :
-*__DAM_INDEX_BLUNT__ +  ​* __DAM_INDEX_BLUNT__ 
-*__DAM_INDEX_EDGE__ +  * __DAM_INDEX_EDGE__ 
-*__DAM_INDEX_POINT__ +  * __DAM_INDEX_POINT__ 
-*__DAM_INDEX_FIRE__ +  * __DAM_INDEX_FIRE__ 
-*__DAM_INDEX_FLY__ +  * __DAM_INDEX_FLY__ 
-*__DAM_INDEX_MAGIC__ +  * __DAM_INDEX_MAGIC__ 
-<​code>​+<​code ​C>
  VAR INT damagetype;  VAR INT damagetype;
 </​code>​ </​code>​
 Gibt den Nahkampfschaden an, den ein Nsc mit den bloßen Fäusten macht, ist aber nicht unbedingt sinnvoll, weil Nsc die meiste Zeit eine Waffe in der Hand haben sollten. Gibt den Nahkampfschaden an, den ein Nsc mit den bloßen Fäusten macht, ist aber nicht unbedingt sinnvoll, weil Nsc die meiste Zeit eine Waffe in der Hand haben sollten.
-<​code>​+<​code ​C>
  VAR INT guild,​level;​  VAR INT guild,​level;​
 </​code>​ </​code>​
 Mit Gilde gibt man dem Nsc eine entsprechende Gilde, wie z.B. __GIL_NONE__ für gildenlos. Mit Level wird dem Nsc ein entsprechender Level verpasst. Mit Gilde gibt man dem Nsc eine entsprechende Gilde, wie z.B. __GIL_NONE__ für gildenlos. Mit Level wird dem Nsc ein entsprechender Level verpasst.
-<​code>​+<​code ​C>
  VAR FUNC mission [MAX_MISSIONS];​  VAR FUNC mission [MAX_MISSIONS];​
 </​code>​ </​code>​
 Obsolet Obsolet
-<​code>​+<​code ​C>
  var INT fight_tactic;​  var INT fight_tactic;​
 </​code>​ </​code>​
 Hier wird dem Nsc seine Taktik, die er in Kämpfen anwendet zugeordnet. Wird aber später noch genauer erklärt, wie die FAI´s funktionieren Hier wird dem Nsc seine Taktik, die er in Kämpfen anwendet zugeordnet. Wird aber später noch genauer erklärt, wie die FAI´s funktionieren
-<​code>​+<​code ​C>
 VAR INT weapon; VAR INT weapon;
 </​code>​ </​code>​
 Obsolet Obsolet
-<​code>​+<​code ​C>
 VAR INT voice; VAR INT voice;
 </​code>​ </​code>​
 Stimmnr. des Charakters à wichtig für Standardausgaben in Zuständen Stimmnr. des Charakters à wichtig für Standardausgaben in Zuständen
-<​code>​+<​code ​C>
  VAR INT voicePitch;  VAR INT voicePitch;
 </​code>​ </​code>​
 Gibt die Möglichkeit die Stimme des Nsc zu pitchen. Gibt die Möglichkeit die Stimme des Nsc zu pitchen.
-<​code>​+<​code ​C>
  VAR INT bodymass;  VAR INT bodymass;
 </​code>​ </​code>​
 Obsolet Obsolet
-<​code>​+<​code ​C>
  VAR FUNC daily_routine; ​ // Tagesablauf  VAR FUNC daily_routine; ​ // Tagesablauf
 </​code>​ </​code>​
 Hier wird der Tagesablauf den ein Nsc hat angemeldet, exklusiv zu start_aistate. Hier wird der Tagesablauf den ein Nsc hat angemeldet, exklusiv zu start_aistate.
-<​code>​+<​code ​C>
  VAR FUNC start_aistate; ​ // Zustandsgesteuert  VAR FUNC start_aistate; ​ // Zustandsgesteuert
 </​code>​ </​code>​
 Hier kann ein Zustand angegeben werden, in dem sich ein Nsc beim einsetzen befindet. Darf nur exklusiv zu daily_routine benutzt werden. Hier kann ein Zustand angegeben werden, in dem sich ein Nsc beim einsetzen befindet. Darf nur exklusiv zu daily_routine benutzt werden.
-<​code>​+<​code ​C>
 // ********************** // **********************
 // Spawn // Spawn
Zeile 92: Zeile 92:
 </​code>​ </​code>​
 Erfordert einen gültigen Waypoint (muss komplett groß geschrieben werden!) aus dem zen, wenn leer ist ein toter Nsc für immer tot. Erfordert einen gültigen Waypoint (muss komplett groß geschrieben werden!) aus dem zen, wenn leer ist ein toter Nsc für immer tot.
-<​code>​+<​code ​C>
 VAR INT spawnDelay; ​ // Mit Delay in (Echtzeit)-Sekunden VAR INT spawnDelay; ​ // Mit Delay in (Echtzeit)-Sekunden
 </​code>​ </​code>​
 Verzögerung,​ mit der der Spawnvorgang begonnen wird Spawnzeitpunkt = Todeszeitpunkt +spawnDelay. Verzögerung,​ mit der der Spawnvorgang begonnen wird Spawnzeitpunkt = Todeszeitpunkt +spawnDelay.
-<​code>​+<​code ​C>
  // **********************  // **********************
  // SENSES  // SENSES
Zeile 103: Zeile 103:
 </​code>​ </​code>​
 Den Nscs stehen drei Sinne zur Verfügung : Den Nscs stehen drei Sinne zur Verfügung :
-*__SENSE_SEE__:​ Sichtkegel gibt Wahrnehmungsbegrenzung an, ist echte Sicht, d.h. Hindernisse "​stören"​ beim sehen.  +  ​* __SENSE_SEE__:​ Sichtkegel gibt Wahrnehmungsbegrenzung an, ist echte Sicht, d.h. Hindernisse "​stören"​ beim sehen.  
-*__SENSE_HEAR__:​ Wände etc blockieren, Sichthindernisse wie z.B. ein Baum nicht oder hinter einem Nsc kann damit auch etwas wahrgenommen werden, obwohl es außerhalb des Sichtkegels liegt.  +  * __SENSE_HEAR__:​ Wände etc blockieren, Sichthindernisse wie z.B. ein Baum nicht oder hinter einem Nsc kann damit auch etwas wahrgenommen werden, obwohl es außerhalb des Sichtkegels liegt.  
-*__SENSE_SMELL__:​ ist die mächtigste Wahrnehmung und einzige Begrenzung ist die Range, d.h. alles was innerhalb der senses_Range liegt wird wahrgenommen.  +  * __SENSE_SMELL__:​ ist die mächtigste Wahrnehmung und einzige Begrenzung ist die Range, d.h. alles was innerhalb der senses_Range liegt wird wahrgenommen.  
-<​code>​+<​code ​C>
  VAR INT senses_range;​  VAR INT senses_range;​
 </​code>​ </​code>​
 Reichweite der Sinne in cm. Reichweite der Sinne in cm.
-<​code>​+<​code ​C>
 // ********************** // **********************
 // Feel free to use // Feel free to use
Zeile 118: Zeile 118:
 </​code>​ </​code>​
 Array von 50 variablen, die ein Nsc speichern kann à Achtung werden von der AI-Logik verwendet (siehe AI_constants). Array von 50 variablen, die ein Nsc speichern kann à Achtung werden von der AI-Logik verwendet (siehe AI_constants).
-<​code>​+<​code ​C>
  VAR STRING wp;  VAR STRING wp;
 </​code>​ </​code>​
 C++-Code (Gothic-exe) speichert hier den aktuellen W(ay)P(oint) des Nsc, damit er für Abfragen zur Verfügung steht, d.h. ein T(ages)A(blauf) übergibt einen WP und dieser ist dann der aktuelle self.wp. C++-Code (Gothic-exe) speichert hier den aktuellen W(ay)P(oint) des Nsc, damit er für Abfragen zur Verfügung steht, d.h. ein T(ages)A(blauf) übergibt einen WP und dieser ist dann der aktuelle self.wp.
-<​code>​+<​code ​C>
  // **********************  // **********************
  // Experience dependant  // Experience dependant
Zeile 136: Zeile 136:
  
 Der Nsc soll Gunther heißen, keiner Gilde angehören und ein Ambient Nsc sein. Er wird einen Level von 17 haben, Stärke ist 100, Ausdauer auch, er hat kein Mana und 200 H(it)P(oints). Zu Übungzwecken ist der Nsc leider taub und hat eine WN Reichweite von 20m, dafür ist er ein guter Kämpfer, mit dem Talent 1_Hand der Stufe zwei.Dafür benötigt er natürlich eine Waffe, die seinem Talent entspricht und sich in seinem Inventory befindet. Der Nsc soll Gunther heißen, keiner Gilde angehören und ein Ambient Nsc sein. Er wird einen Level von 17 haben, Stärke ist 100, Ausdauer auch, er hat kein Mana und 200 H(it)P(oints). Zu Übungzwecken ist der Nsc leider taub und hat eine WN Reichweite von 20m, dafür ist er ein guter Kämpfer, mit dem Talent 1_Hand der Stufe zwei.Dafür benötigt er natürlich eine Waffe, die seinem Talent entspricht und sich in seinem Inventory befindet.
-[[Kasten G1]] + 
-<​code>​+**Gothic 1:** 
 +<​code ​C>
 instance None_999_Gunther (Npc_Default) ​ // Klasse von der der Nsc abgeleitet ist kann auch instance None_999_Gunther (Npc_Default) ​ // Klasse von der der Nsc abgeleitet ist kann auch
                                          // direkt von C_Npc abgeleitet werden                                          // direkt von C_Npc abgeleitet werden
Zeile 195: Zeile 196:
 }; };
 </​code>​ </​code>​
-[[Kasten Ende]] + 
-[[Kasten G2]]+**Gothic 2:**
 Folgende Dinge sind am Script für Gothic2 geändert, damit es funktioniert. Folgende Dinge sind am Script für Gothic2 geändert, damit es funktioniert.
 1. Die Funktion "​B_Scale"​ existiert nicht mehr. Stattdessen benutzen wir "​B_SetNpcVisual",​ durch sie wird das Aussehen des Npcs bestimmt sie enthält "​Mdl_SetVisual",​ "​Mdl_SetVisualBody"​ und wie die früherer B_Scale "​Mdl_SetModelScale"​ 1. Die Funktion "​B_Scale"​ existiert nicht mehr. Stattdessen benutzen wir "​B_SetNpcVisual",​ durch sie wird das Aussehen des Npcs bestimmt sie enthält "​Mdl_SetVisual",​ "​Mdl_SetVisualBody"​ und wie die früherer B_Scale "​Mdl_SetModelScale"​
Zeile 202: Zeile 203:
 3. Das Kampfskillsystem hat sich ein Gothic2 geändert, daher wird entweder die Funktion "​B_SetFightSkills",​ oder eine Manuele Prozentangabe benutzt. 3. Das Kampfskillsystem hat sich ein Gothic2 geändert, daher wird entweder die Funktion "​B_SetFightSkills",​ oder eine Manuele Prozentangabe benutzt.
 4. Das Schwert und die Tränke wurden ausgetauscht,​ da beide si nicht mehr existieren. 4. Das Schwert und die Tränke wurden ausgetauscht,​ da beide si nicht mehr existieren.
-<​code>​+<​code ​C>
 instance None_999_Gunther (Npc_Default) ​ // Klasse von der der Nsc abgeleitet ist kann auch instance None_999_Gunther (Npc_Default) ​ // Klasse von der der Nsc abgeleitet ist kann auch
                                          // direkt von C_Npc abgeleitet werden                                          // direkt von C_Npc abgeleitet werden
Zeile 259: Zeile 260:
 }; };
 </​code>​ </​code>​
-[[Kasten Ende]] 
 Auch wenn es erst später erkärt wird muß hier diese Funktion schon angelegt sein, damit der Nsc auch "​klappt"​. Auch wenn es erst später erkärt wird muß hier diese Funktion schon angelegt sein, damit der Nsc auch "​klappt"​.
-<​code>​+<​code ​C>
 func void Rtn_Start_999 () func void Rtn_Start_999 ()
 { {
Zeile 268: Zeile 268:
 Kopiert man diesen Nsc jetzt per Texteditor in ein vorhandenes File und hat das Parameter __-zreparse__ in den [[GothicStarter]] eingetragen,​ kann man im Spiel über die Konsole per __insert //​[instance]//​__,​ hier __None_999_Gunther__ den Nsc schon mal einfügen und betrachten, auch wenn er jetzt noch nicht so viel tut. Im [[GothicStarter]] MUSS der Parameter __-devmode__ angegeben sein, um die Konsole öffnen zu können. Kopiert man diesen Nsc jetzt per Texteditor in ein vorhandenes File und hat das Parameter __-zreparse__ in den [[GothicStarter]] eingetragen,​ kann man im Spiel über die Konsole per __insert //​[instance]//​__,​ hier __None_999_Gunther__ den Nsc schon mal einfügen und betrachten, auch wenn er jetzt noch nicht so viel tut. Im [[GothicStarter]] MUSS der Parameter __-devmode__ angegeben sein, um die Konsole öffnen zu können.
 Um aber die Übersicht bei vielen Nscs nicht zu verlieren ist es ganz nützlich die schon in Gothic verwendeten Strukturen zu benutzen. Nscs sind im Ordner __/​_work/​data/​skripts/​content/​story/​Npc__ abgelegt. Wenn ein File mit der Dateierweiterung __.d__ erstellt wird und in diesem Ordner abgelegt wird, wird es automatisch mit geparst und steht dann im Spiel zur Verfügung. Um aber die Übersicht bei vielen Nscs nicht zu verlieren ist es ganz nützlich die schon in Gothic verwendeten Strukturen zu benutzen. Nscs sind im Ordner __/​_work/​data/​skripts/​content/​story/​Npc__ abgelegt. Wenn ein File mit der Dateierweiterung __.d__ erstellt wird und in diesem Ordner abgelegt wird, wird es automatisch mit geparst und steht dann im Spiel zur Verfügung.
-== Der Bursche kriegt eine Aufgabe ==+===== Der Bursche kriegt eine Aufgabe ​=====
 Damit er was zu tun hat, während er auf Euch wartet, muß der Charakter entweder einen TA oder einen StartState haben, hier wird jetzt der etwas komplexere Teil eine TA zu erstellen erklärt, weil darin auch das erstellen eines Z(u)S(tands) enthalten ist, der für StartState nötig ist. In diesem Zustand wird nicht viel passieren, außer das der Nsc sich auf den zugewiesenen Wegpunkt begibt um hier auf den Spieler zu warten und sich von Zeit zu Zeit mal von diesem WP wegzubegeben um zu pinkeln. Damit er was zu tun hat, während er auf Euch wartet, muß der Charakter entweder einen TA oder einen StartState haben, hier wird jetzt der etwas komplexere Teil eine TA zu erstellen erklärt, weil darin auch das erstellen eines Z(u)S(tands) enthalten ist, der für StartState nötig ist. In diesem Zustand wird nicht viel passieren, außer das der Nsc sich auf den zugewiesenen Wegpunkt begibt um hier auf den Spieler zu warten und sich von Zeit zu Zeit mal von diesem WP wegzubegeben um zu pinkeln.
  
 Damit das W(ahr)N(ehmungs)-System etwas deutlicher wird, bekommt der Nsc erst mal nur zwei WN, d.h. aber auch, dass er erst mal nur auf die Annäherung und Ansprechen des Spielers reagiert und ihm alles andere egal ist, wie Schaden nehmen angesprochen werden etc. Damit das W(ahr)N(ehmungs)-System etwas deutlicher wird, bekommt der Nsc erst mal nur zwei WN, d.h. aber auch, dass er erst mal nur auf die Annäherung und Ansprechen des Spielers reagiert und ihm alles andere egal ist, wie Schaden nehmen angesprochen werden etc.
-[[Kasten G1]] + 
-<​code>​+**Gothic 1:** 
 +<​code ​C>
 func void ZS_GuntherWait () func void ZS_GuntherWait ()
 { {
Zeile 311: Zeile 312:
 }; };
 </​code>​ </​code>​
-[[Kasten Ende]] + 
-[[Kasten G2]]+**Gothic 2:**
 Hier wurde nur "​B_AssessSC"​ gegen "​B_AssessPlayer"​ augetauscht,​ da "​B_AssessSC"​ in G2 nicht mehr existiert. Hier wurde nur "​B_AssessSC"​ gegen "​B_AssessPlayer"​ augetauscht,​ da "​B_AssessSC"​ in G2 nicht mehr existiert.
-<​code>​+<​code ​C>
 func void ZS_GuntherWait () func void ZS_GuntherWait ()
 { {
Zeile 352: Zeile 353:
 }; };
 </​code>​ </​code>​
-[[Kasten Ende]] 
 So jetzt ist es schon fast fertig, damit aber dieser ZS auch als TA verwendet werden kann muss er angemeldet werden. Dafür muss in der Datei __TA.d__ (in G1 sie in __/​_work/​data/​skripts/​content/​story/​ZS/​__,​ in G2 in __/​_work/​Data/​Scripts/​Content/​AI/​Human/​__) folgende Zeilen auftauchen: So jetzt ist es schon fast fertig, damit aber dieser ZS auch als TA verwendet werden kann muss er angemeldet werden. Dafür muss in der Datei __TA.d__ (in G1 sie in __/​_work/​data/​skripts/​content/​story/​ZS/​__,​ in G2 in __/​_work/​Data/​Scripts/​Content/​AI/​Human/​__) folgende Zeilen auftauchen:
-<​code>​+<​code ​C>
 func void TA_GuntherWait (  var int start_h, func void TA_GuntherWait (  var int start_h,
                             var int start_m,                             var int start_m,
Zeile 367: Zeile 367:
  
 und die  und die 
-<​code>​+<​code ​C>
 func void Rtn_Start_999 () func void Rtn_Start_999 ()
 { {
Zeile 381: Zeile 381:
 HINWEIS: TAs müssen mindesten zweimal in den Routinen auftauchen, auch wenn die Nscs 24h lang das gleiche tun, das hat was damit zu tun, dass der C++-Code die TAs von ZS nur so unterscheiden kann . HINWEIS: TAs müssen mindesten zweimal in den Routinen auftauchen, auch wenn die Nscs 24h lang das gleiche tun, das hat was damit zu tun, dass der C++-Code die TAs von ZS nur so unterscheiden kann .
  
-Zustände sind bei G1 in __/​_work/​data/​skripts/​content/​story/​ZS__ zu finden und bei G2 in __\\_work\\data\\Scripts\\Content\\AI\\Human\\TA_Human__. Es empfiehlt sich auch hier wieder, wie schon beim Npc, ein eigenes File mit einem Texteditor zu erstellen und mit der Dateierweiterung __.d__ ( dieses ist zwingend) zu speichern. Auch hier wird wieder mit einer Wildcard geparst, so dass es reicht das File im entsprechenden Pfad abzulegen.+Zustände sind bei G1 in __/​_work/​data/​skripts/​content/​story/​ZS__ zu finden und bei G2 in __\_work\data\Scripts\Content\AI\Human\TA_Human__. Es empfiehlt sich auch hier wieder, wie schon beim Npc, ein eigenes File mit einem Texteditor zu erstellen und mit der Dateierweiterung __.d__ ( dieses ist zwingend) zu speichern. Auch hier wird wieder mit einer Wildcard geparst, so dass es reicht das File im entsprechenden Pfad abzulegen.
  
 Ein letzter Schritt und Gunther ist dauerhaft im Spiel : Ein letzter Schritt und Gunther ist dauerhaft im Spiel :
  
 Anmeldung in der __/​_work/​data/​skripts/​content/​story/​Startup.d__ Anmeldung in der __/​_work/​data/​skripts/​content/​story/​Startup.d__
-<​code>​+<​code ​C>
 Wld_InsertNpc(None_999_Gunther,"​OC1"​);​ Wld_InsertNpc(None_999_Gunther,"​OC1"​);​
 </​code>​ </​code>​
 in den Oldcamp-Block,​ schließlich steht Gunther ja da rum. in den Oldcamp-Block,​ schließlich steht Gunther ja da rum.
-== Der Auftrag ==+===== Der Auftrag ​=====
 Aufträge werden in Gothic über ein Dialogsystem implementiert,​ deshalb kommt jetzt erst mal ein leerer Dialog an Hand dessen die Grundfunktionalität erklärt wird und der später mit Inhalt gefüllt wird, bis es zu einem Auftrag mit hol mir das Schwert und werde dafür belohnt führt. Aufträge werden in Gothic über ein Dialogsystem implementiert,​ deshalb kommt jetzt erst mal ein leerer Dialog an Hand dessen die Grundfunktionalität erklärt wird und der später mit Inhalt gefüllt wird, bis es zu einem Auftrag mit hol mir das Schwert und werde dafür belohnt führt.
-<​code>​+<​code ​C>
 instance Instanz_Name (C_INFO) instance Instanz_Name (C_INFO)
 { {
Zeile 410: Zeile 410:
 </​code>​ </​code>​
 Ist ein Dialog Important spricht der Nsc den Sc von sich aus an, sobald er ihn entdeckt (deshalb WN AssessPlayer in ZS_GuntherWait aktiviert s.o.) Ist ein Dialog Important spricht der Nsc den Sc von sich aus an, sobald er ihn entdeckt (deshalb WN AssessPlayer in ZS_GuntherWait aktiviert s.o.)
-<​code>​+<​code ​C
     permanent ​      = 0;     permanent ​      = 0;
 }; };
 </​code>​ </​code>​
 Ist ein Dialog Permanent wird er, so lange seine Condition True ist immer angeboten Ist ein Dialog Permanent wird er, so lange seine Condition True ist immer angeboten
-<​code>​+<​code ​C>
  FUNC int  Instanz_Name_Condition()  FUNC int  Instanz_Name_Condition()
  {  {
Zeile 422: Zeile 422:
 </​code>​ </​code>​
 Hier sollten per Abfrage Bedingungen erfragt werden, damit der Dialog gestartet werden kann. Gibt die Funktion einfach TRUE zurück wird der Dialog immer angeboten. Hier sollten per Abfrage Bedingungen erfragt werden, damit der Dialog gestartet werden kann. Gibt die Funktion einfach TRUE zurück wird der Dialog immer angeboten.
-<​code>​+<​code ​C>
  func void  Instanz_Name_Info()  func void  Instanz_Name_Info()
  {  {
Zeile 429: Zeile 429:
 </​code>​ </​code>​
 Da es sich beim Exit auch um einen Dialog handelt wird hier nicht mehr Schritt für Schritt erklärt wofür dieser ist, nur soviel, die Exit-Funktion sorgt dafür, das es immer eine Auswahl im Dialogscreen gibt, mit der der Spieler den Dialog verlassen kann. Da es sich beim Exit auch um einen Dialog handelt wird hier nicht mehr Schritt für Schritt erklärt wofür dieser ist, nur soviel, die Exit-Funktion sorgt dafür, das es immer eine Auswahl im Dialogscreen gibt, mit der der Spieler den Dialog verlassen kann.
-<​code>​+<​code ​C>
 // ************************ EXIT ************************** // ************************ EXIT **************************
  
Zeile 455: Zeile 455:
  
 Lets Go: Notwendige globale Variablen, ist so nicht sauber und sollte in einem eigenen File gepflegt werden, aber für die Tutorial Zwecke reicht es so erst mal. In Gothic sind sie aber in ___work/​data/​skripts/​content/​story/​Storyglobals.d__ abgelegt, es ist also ganz sinnvoll hier einen neuen Teil einzufügen,​ der neu erstellte globale Variablen aufnimmt. Lets Go: Notwendige globale Variablen, ist so nicht sauber und sollte in einem eigenen File gepflegt werden, aber für die Tutorial Zwecke reicht es so erst mal. In Gothic sind sie aber in ___work/​data/​skripts/​content/​story/​Storyglobals.d__ abgelegt, es ist also ganz sinnvoll hier einen neuen Teil einzufügen,​ der neu erstellte globale Variablen aufnimmt.
-<​code>​+<​code ​C>
 const string GunthersSword ​ = " Bringe Gunthers Schwert zurück";​ const string GunthersSword ​ = " Bringe Gunthers Schwert zurück";​
 var int int_GotSword;​ var int int_GotSword;​
Zeile 530: Zeile 530:
 Anmerkung: Bitte daran denken in der __Mod.ini__ den Parameter __force_subtitles=1__ zu setzen, sonst gibt es keine Textausgaben,​ weil keine Soundfiles zu den Ausgaben existieren. Anmerkung: Bitte daran denken in der __Mod.ini__ den Parameter __force_subtitles=1__ zu setzen, sonst gibt es keine Textausgaben,​ weil keine Soundfiles zu den Ausgaben existieren.
  
-Anmerkung 2: Zum Erstellen von Dialogen existiert ein Tool, den [http://​www.fizzban.net/​creator.html Miranda Dialog Creator].+Anmerkung 2: Zum Erstellen von Dialogen existiert ein Tool, den [[http://​www.fizzban.net/​creator.html|Miranda Dialog Creator]].
  
-== Den Gegenstand der Begierde erstellen ==+===== Den Gegenstand der Begierde erstellen ​=====
 Gunther will ein Schwert haben, das es so in Gothic nicht gibt, also muss es erstellt werden. ​ Gunther will ein Schwert haben, das es so in Gothic nicht gibt, also muss es erstellt werden. ​
  
 Die Klasse Die Klasse
-<​code>​+<​code ​C>
 CLASS C_Item CLASS C_Item
 { {
Zeile 543: Zeile 543:
 </​code>​ </​code>​
 Id wie bei der C_Npc Klasse (s.o.) ​ Id wie bei der C_Npc Klasse (s.o.) ​
-<​code>​+<​code ​C>
  VAR STRING ​ name,​nameID;​  VAR STRING ​ name,​nameID;​
 </​code>​ </​code>​
 Synonym zu C_Npc Synonym zu C_Npc
-<​code>​+<​code ​C>
  VAR INT  hp,hp_max;  VAR INT  hp,hp_max;
 </​code>​ </​code>​
 Synonym zu C_Npc Synonym zu C_Npc
-<​code>​+<​code ​C>
  VAR INT  mainflag,​flags; ​ // Hauptflag und weitere Flags  VAR INT  mainflag,​flags; ​ // Hauptflag und weitere Flags
  VAR INT  weight,​value;​  VAR INT  weight,​value;​
 </​code>​ </​code>​
 Gewicht und Wert lassen sich als integer angeben. Gewicht und Wert lassen sich als integer angeben.
-<​code>​+<​code ​C>
   // Für Waffen   // Für Waffen
   VAR INT  damageType; ​ // Welche Schadensarten   VAR INT  damageType; ​ // Welche Schadensarten
 </​code>​ </​code>​
 Synonym zu C_Npc. Synonym zu C_Npc.
-<​code>​+<​code ​C>
   VAR INT  damageTotal;​   VAR INT  damageTotal;​
 </​code>​ </​code>​
 Synonym zu C_Npc Synonym zu C_Npc
-<​code>​+<​code ​C>
   VAR INT damage [DAM_INDEX_MAX];​   VAR INT damage [DAM_INDEX_MAX];​
 </​code>​ </​code>​
 Synonym zu C_Npc Synonym zu C_Npc
-<​code>​+<​code ​C>
   // Für Rüstungen   // Für Rüstungen
   VAR INT  wear;   VAR INT  wear;
 </​code>​ </​code>​
 Hier ist eigentlich nur __WEAR_TORSO__ interessant,​ weil keine Helme im Spiel sind. Hier ist eigentlich nur __WEAR_TORSO__ interessant,​ weil keine Helme im Spiel sind.
-<​code>​+<​code ​C>
   VAR INT  protection ​ [PROT_INDEX_MAX];​   VAR INT  protection ​ [PROT_INDEX_MAX];​
 </​code>​ </​code>​
 Dies ist ein Array in dem für jede Schadensklasse ein eigener Rüstschutz angegeben werden kann. Dies ist ein Array in dem für jede Schadensklasse ein eigener Rüstschutz angegeben werden kann.
-<​code>​+<​code ​C>
   // Für Nahrung   // Für Nahrung
   VAR INT  nutrition ​     ;  // HP-Steigerung bei Nahrung   VAR INT  nutrition ​     ;  // HP-Steigerung bei Nahrung
 </​code>​ </​code>​
 Obsolet Obsolet
-<​code>​+<​code ​C>
   // Benötigte Attribute zum Benutzen des Items   // Benötigte Attribute zum Benutzen des Items
   VAR INT  cond_atr ​ [3]    ;   VAR INT  cond_atr ​ [3]    ;
Zeile 589: Zeile 589:
 </​code>​ </​code>​
 Ein Array von zweimal drei Integer, in dem angegeben werde kann welche Stärke (z.B. 10) etc. nötig ist um diese Item anzulegen oder zu Benutzen. Ein Array von zweimal drei Integer, in dem angegeben werde kann welche Stärke (z.B. 10) etc. nötig ist um diese Item anzulegen oder zu Benutzen.
-<​code>​+<​code ​C>
   // Attribute, die bei anlegen des Items verändert werden   // Attribute, die bei anlegen des Items verändert werden
   VAR INT  change_atr ​ [3]    ;   VAR INT  change_atr ​ [3]    ;
Zeile 595: Zeile 595:
 </​code>​ </​code>​
 Obsolet Obsolet
-<​code>​+<​code ​C>
   // Parserfunktionen   // Parserfunktionen
   VAR FUNC magic; ​      // Parserfunktion zum "Magie Header"​   VAR FUNC magic; ​      // Parserfunktion zum "Magie Header"​
Zeile 616: Zeile 616:
 </​code>​ </​code>​
 Obsolet **?** Obsolet **?**
-<​code>​+<​code ​C>
   // Die 3DS-Datei   // Die 3DS-Datei
  
   VAR STRING visual;   VAR STRING visual;
 </​code>​ </​code>​
-Gibt'​s ​an welche Datei als Darstellung für das Item geladen wird. +Gibt an welche Datei als Darstellung für das Item geladen wird. 
-<​code>​+<​code ​C>
      // Veränderung des NSC-Meshes beim Anlegen dieses Gegenstandes      // Veränderung des NSC-Meshes beim Anlegen dieses Gegenstandes
  
Zeile 628: Zeile 628:
 </​code>​ </​code>​
 Wird zum Anlegen einer Rüstung benutzt, weil dann ein anderes ASC.File als visual geladen wird. Wird zum Anlegen einer Rüstung benutzt, weil dann ein anderes ASC.File als visual geladen wird.
-<​code>​+<​code ​C>
   VAR INT  visual_skin;​   VAR INT  visual_skin;​
 </​code>​ </​code>​
 Texturvariation für das betreffende Rüstungsmesh. Texturvariation für das betreffende Rüstungsmesh.
-<​code>​+<​code ​C>
   VAR STRING ​ scemeName;   VAR STRING ​ scemeName;
 </​code>​ </​code>​
 Interner Name für das Benutzen von Items. Interner Name für das Benutzen von Items.
-<​code>​+<​code ​C>
   VAR INT  material;   VAR INT  material;
 </​code>​ </​code>​
 Mit dem Material sind z.B. die "​Klangeigenschaften"​ eines Items festgelegt. Mit dem Material sind z.B. die "​Klangeigenschaften"​ eines Items festgelegt.
-<​code>​+<​code ​C>
   // VAR STRING pfx;  // Magic Weapon PFX   // VAR STRING pfx;  // Magic Weapon PFX
 </​code>​ </​code>​
 Obsolet Obsolet
-<​code>​+<​code ​C>
   VAR INT  munition; ​ // Instance of Munition   VAR INT  munition; ​ // Instance of Munition
 </​code>​ </​code>​
 Bei Bögen wird hier angegeben mit welcher Munition sie schießen (Arrow V Bolt). Bei Bögen wird hier angegeben mit welcher Munition sie schießen (Arrow V Bolt).
-<​code>​+<​code ​C>
   VAR INT  spell;   VAR INT  spell;
 </​code>​ </​code>​
 Gibt an welchen Spell magische Items ausführen. Gibt an welchen Spell magische Items ausführen.
-<​code>​+<​code ​C>
   VAR INT  range;   VAR INT  range;
 </​code>​ </​code>​
 Gibt den Radius an, in dem eine Nahkampfwaffe trifft. Gibt den Radius an, in dem eine Nahkampfwaffe trifft.
-<​code>​+<​code ​C>
   VAR INT  mag_circle;   VAR INT  mag_circle;
 </​code>​ </​code>​
 Welchem Magischen Zirkel ist dieses Item zugeordnet. Welchem Magischen Zirkel ist dieses Item zugeordnet.
-<​code>​+<​code ​C>
   VAR STRING description;​   VAR STRING description;​
 </​code>​ </​code>​
 Die Beschreibung,​ die beim Betrachten eines Items auftaucht. Die Beschreibung,​ die beim Betrachten eines Items auftaucht.
-<​code>​+<​code ​C>
   VAR STRING text[ITM_TEXT_MAX];​   VAR STRING text[ITM_TEXT_MAX];​
   VAR INT  count[ITM_TEXT_MAX];​   VAR INT  count[ITM_TEXT_MAX];​
Zeile 672: Zeile 672:
  
 So dann soll jetzt mal ein schönes Schwert entstehen, nach dem Gunther suchen lassen kann. Damit den Spieler das Schwert auch interessiert sollte es natürlich ein paar nette Werte haben, also soll es 1000 Erz wert sein und einen Schaden von 300 machen, das Visual wird aus den Gothicdaten geklaut, weil Visuals erstellen an einer andern Stelle erklärt wird. Ansonsten muss das Schwert natürlich eine Nahkampfwaffe und ein Schwert sein, sollte aus Metall bestehen und vielleicht noch ein bisschen von sich preisgeben(Beschreibung). So dann soll jetzt mal ein schönes Schwert entstehen, nach dem Gunther suchen lassen kann. Damit den Spieler das Schwert auch interessiert sollte es natürlich ein paar nette Werte haben, also soll es 1000 Erz wert sein und einen Schaden von 300 machen, das Visual wird aus den Gothicdaten geklaut, weil Visuals erstellen an einer andern Stelle erklärt wird. Ansonsten muss das Schwert natürlich eine Nahkampfwaffe und ein Schwert sein, sollte aus Metall bestehen und vielleicht noch ein bisschen von sich preisgeben(Beschreibung).
-[[Kasten G1]]+ 
 +**Gothic 1:**
 <​code>​ <​code>​
 INSTANCE ItMw_1H_GuntherWantedSword (C_Item) INSTANCE ItMw_1H_GuntherWantedSword (C_Item)
Zeile 699: Zeile 700:
 }; };
 </​code>​ </​code>​
-[[Kasten Ende]] + 
-[[Kasten G2]]+**Gothic 2:**
 Hier wurde das Visual ausgetauscht,​ da dieses in G2 nicht existierte. Hier wurde das Visual ausgetauscht,​ da dieses in G2 nicht existierte.
-<​code>​+<​code ​C>
 INSTANCE ItMw_1H_GuntherWantedSword (C_Item) INSTANCE ItMw_1H_GuntherWantedSword (C_Item)
 { {
Zeile 728: Zeile 729:
 }; };
 </​code>​ </​code>​
-[[Kasten Ende]] 
 Das Item lässt sich jetzt genauso wie Gunther per Konsole im Spiel einfügen. Das Item lässt sich jetzt genauso wie Gunther per Konsole im Spiel einfügen.
  
Zeile 735: Zeile 735:
 Dafür öffnet man die Datei __/​_work/​data/​skripts/​content/​gothic.src__,​ in dieser Datei sind alle Pfade angegeben, aus denen Contentskripte geladen werden. Diese Pfade sind relativ zum Pfad __/​_work/​data/​skripts/​__ Dafür öffnet man die Datei __/​_work/​data/​skripts/​content/​gothic.src__,​ in dieser Datei sind alle Pfade angegeben, aus denen Contentskripte geladen werden. Diese Pfade sind relativ zum Pfad __/​_work/​data/​skripts/​__
  
-Hier fügt man für das neue File den Pfad __ITEMS\\//​FILENAME//​.D__ ein und schon werden die Daten aus dem File gelesen. ​+Hier fügt man für das neue File den Pfad __ITEMS\//​FILENAME//​.D__ ein und schon werden die Daten aus dem File gelesen. ​
  
 Achtung! Diese Datei erfordert zwingend Großbuchstaben. Falls es mal beim Gamestart Probleme geben sollte kann es sein, das eine Datei Daten aus einer anderen Datei referenziert und deshalb diese vor einer anderen geparst werden muß. Lösungshinweise:​ keine Wildcards verwenden, sondern die Files einzeln per Namen parsen und zum anderen ein wenig mit der Reihenfolge rumspielen, aber nur der Daten, die neu erstellt wurden, weil sonst das ganze File kaputt gehen kann. Achtung! Diese Datei erfordert zwingend Großbuchstaben. Falls es mal beim Gamestart Probleme geben sollte kann es sein, das eine Datei Daten aus einer anderen Datei referenziert und deshalb diese vor einer anderen geparst werden muß. Lösungshinweise:​ keine Wildcards verwenden, sondern die Files einzeln per Namen parsen und zum anderen ein wenig mit der Reihenfolge rumspielen, aber nur der Daten, die neu erstellt wurden, weil sonst das ganze File kaputt gehen kann.
  
 Natürlich lassen sich so auch neue Ordner referenzieren,​ aber das ist dann doch eine Sache zum Ausprobieren und rumspielen. Natürlich lassen sich so auch neue Ordner referenzieren,​ aber das ist dann doch eine Sache zum Ausprobieren und rumspielen.
-== Den "​Auftrag erfüllt"​-Dialog erstellen ==+===== Den "​Auftrag erfüllt"​-Dialog erstellen ​=====
 Hier wird wieder ein Dialog angelegt, in dem bestimmte Bedingungen erfüllt sein müssen und an Hand dieser werde noch Belohnungen verteilt, in diesem Fall //​Experience Points// und //Learn Points// erhöhen. Da Dialoge oben schon genauer erklärt wurden hier nur noch der Dialog, der zum Auftrag erfüllen vorhanden sein muß. Hier wird wieder ein Dialog angelegt, in dem bestimmte Bedingungen erfüllt sein müssen und an Hand dieser werde noch Belohnungen verteilt, in diesem Fall //​Experience Points// und //Learn Points// erhöhen. Da Dialoge oben schon genauer erklärt wurden hier nur noch der Dialog, der zum Auftrag erfüllen vorhanden sein muß.
  
-<​code>​+<​code ​C>
 // ************************ EXIT ************************** // ************************ EXIT **************************
 instance ​ None_999_Gunther_AskForSword_Exit (C_INFO) instance ​ None_999_Gunther_AskForSword_Exit (C_INFO)
Zeile 785: Zeile 785:
    // 3.Schwert instanz abfragen, nur dann macht Auftraglösen Sinn    // 3.Schwert instanz abfragen, nur dann macht Auftraglösen Sinn
    if (Npc_KnowsInfo ( hero, None_999_Gunther_AskForSword)) ​  // (siehe 1)    if (Npc_KnowsInfo ( hero, None_999_Gunther_AskForSword)) ​  // (siehe 1)
-   &​! int_GotSword ​                                           // (siehe 2)+   &&! int_GotSword ​                                           // (siehe 2)
    &&​ (Npc_HasItems (other, ItMw_1H_GuntherWantedSword) >= 1) // (siehe 3)    &&​ (Npc_HasItems (other, ItMw_1H_GuntherWantedSword) >= 1) // (siehe 3)
    {    {
Zeile 836: Zeile 836:
 **Anmerkung zum obigen Codeabschnitt:​** **Anmerkung zum obigen Codeabschnitt:​**
  
-<​code>​+<​code ​C>
 other.exp ​  = other.exp + 100;  //man kann auch die dafür geschaffene Funktion B_GiveXP(100) verwenden other.exp ​  = other.exp + 100;  //man kann auch die dafür geschaffene Funktion B_GiveXP(100) verwenden
                                 //die Zahl in Klammern gibt die erhaltenen Exp an                                 //die Zahl in Klammern gibt die erhaltenen Exp an
Zeile 846: Zeile 846:
  
 Außerdem könnt ihr auch hero angeben wenn ihr den Spieler meint, also: Außerdem könnt ihr auch hero angeben wenn ihr den Spieler meint, also:
-<​code>​+<​code ​C>
 AI_Output( self, hero, "​None_999_Gunther_bringSword_Info_8_07"​);​ // Du hast sie ja wohl nicht alle AI_Output( self, hero, "​None_999_Gunther_bringSword_Info_8_07"​);​ // Du hast sie ja wohl nicht alle
 </​code>​ </​code>​
tutorials/skript-tutorial.txt · Zuletzt geändert: 2016/12/30 20:28 von milky-way