Oblivion:Mein zweites Script: Unterschied zwischen den Versionen

Aus Skript-Wiki
Wechseln zu: Navigation, Suche
K
K
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Erste Hinweise ==
 
== Erste Hinweise ==
  
Während das erste Script-Tutorial ein guter Anfang war, war es doch kein besonders großes Beispiel, was die Script-Sprache in Oblivion alles tun kann. Es war ein guter Einstieg für alle diejenigen, die noch niemals eine Programmier- oder Scripting-Sprache gesehen haben. Jedoch wollen wir nun etwas tiefer in die Materie eintauchen, um zu zeigen, welche unglaublichen Möglichkeiten das Scripting dem Modder bringt.
+
Während das erste Script-Tutorial ein guter Anfang war, war es doch kein besonders großes Beispiel, was die Script-Sprache in Oblivion alles tun kann. Es war ein guter Einstieg für all diejenigen, die noch niemals eine Programmier- oder Scripting-Sprache gesehen haben. Jedoch wollen wir nun etwas tiefer in die Materie eintauchen, um zu zeigen, welche unglaublichen Möglichkeiten das Scripting dem Modder bringt.
  
Dieses Tutorial wird zum größten Teil von GhanGuriGhan's Morrowind Scripting für Dummies abgeleitet, alle Anerkennung geht an GhanGuriGhan für seine gute Arbeit beim Original Tutorial.  
+
Dieses Tutorial wird zum größten Teil von GhanGuriGhan's Morrowind Scripting für Dummies abgeleitet, alle Anerkennung geht an GhanGuriGhan für seine gute Arbeit beim Original-Tutorial.  
 
   
 
   
Es ist etwas mehr als eine kleine Einführung ins Oblivion-Scripting, also sind gewisse Grundvoraussetzungen von Nöten, wie z.B. das Abarbeiten von "Mein erstes Script" und das Auskennen mit dem Editor.
+
Es ist etwas mehr als eine kleine Einführung ins Oblivion-Scripting, also sind gewisse Grundvoraussetzungen von Nöten, wie z.B. das Abarbeiten von [[Oblivion:Mein erstes Script|"Mein erstes Script"]] und das Auskennen mit dem Editor.
  
 
Falls dir irgendwelche Punkte hier unklar sind, solltest du das besagte erste Tutorial durcharbeiten und ggf. den Links folgen, die gewisse Seiten oder Arbeitsvorgänge erläutern.
 
Falls dir irgendwelche Punkte hier unklar sind, solltest du das besagte erste Tutorial durcharbeiten und ggf. den Links folgen, die gewisse Seiten oder Arbeitsvorgänge erläutern.
Zeile 15: Zeile 15:
 
=== Was ist ein Script? ===
 
=== Was ist ein Script? ===
  
Scripts sind im Grunde genommen Teile von Code, die in einer speziellen Scripting-Sprache geschrieben werden (Wir nennen es TES Script von hier an). Diese kleinen "Programme" laufen während des Spieles an bestimmten Stellen ab und können verschiedene Sachen im Spiel bewirken. Sie schalten Vorgänge, kontrollieren Zeit und Ort, sorgen dafür, dass Dinge oder Kreaturen sichtbar werden, verschwinden oder sich bewegen, Sie geben Nachrichten an den Spieler weiter, ändern den Status und auch das Wetter - Die Möglichkeiten sind nahezu grenzenlos.
+
Scripts sind im Grunde genommen Teile von Code, die in einer speziellen Scripting-Sprache geschrieben werden (Wir nennen es TES-Script von hier an). Diese kleinen "Programme" laufen während des Spiels an bestimmten Stellen ab und können verschiedene Sachen im Spiel bewirken. Sie schalten Vorgänge, kontrollieren Zeit und Ort, sorgen dafür, dass Dinge oder Kreaturen sichtbar werden, verschwinden oder sich bewegen. Sie geben Nachrichten an den Spieler weiter, ändern den Status und auch das Wetter - die Möglichkeiten sind nahezu grenzenlos.
  
Das TES Script ist eine einmalige Script-Sprache, aber kann nicht außerhalb des TES CS genutzt werden. Eine Sript-Sprache hat einige Einschränkungen entgegen einer "echten" Programmiersprache wie z.B. C++.
+
Das TES-Script ist eine einmalige Script-Sprache, aber kann nicht außerhalb des TES CS genutzt werden. Eine Sript-Sprache hat einige Einschränkungen entgegen einer "echten" Programmiersprache wie z.B. C++.
  
Der Einsatz von TES Script ist begrenzt - Glaube nicht, dass du ein Programmierer sein kannst, wenn du diese Script-Sprache beherrschst. Allerdings wäre es möglich mit der Script-Sprache neue Dinge zu erreichen, die im Spiel vorher vielleicht nicht möglich waren. Aber du kannst das TES Script-Wissen nicht dazu gebrauchen, um z.B. eine Textverarbeitung zu programmieren.
+
Der Einsatz von TES-Script ist begrenzt - Glaube nicht, dass du ein Programmierer sein kannst, wenn du diese Script-Sprache beherrschst. Allerdings wäre es möglich, mit der Script-Sprache neue Dinge zu erreichen, die im Spiel vorher vielleicht nicht möglich waren. Aber du kannst das TES-Script-Wissen nicht dazu gebrauchen, um z.B. eine Textverarbeitung zu programmieren.
 
        
 
        
TES Script ist auch keine SDK (Software Development Kit - Software Entwicklungskit), das dir Änderungen am Grundspiel von Oblivion ermöglicht. Das ist auch der Grund, warum du mit dem TES Script z.B. keine neuen Wetter-Effekte einbauen kannst. Das wird woanders geregelt und du brauchst ein ganz anderes Wissen um das zu tun.
+
TES-Script ist auch keine SDK (Software Development Kit - Software Entwicklungskit), das dir Änderungen am Grundspiel von Oblivion ermöglicht. Das ist auch der Grund, warum du mit dem TES-Script z.B. keine neuen Wetter-Effekte einbauen kannst. Das wird woanders geregelt und du brauchst ein ganz anderes Wissen, um das zu tun.
  
Es ist einer Interpreter-Sprache, keine Compilierte. Der Code braucht ein separates Programm (in diesem Fall Oblivion) um zu laufen - Anders als compilierter Code, der selbstständig arbeitet wie eine EXE-Anwendung.
+
Es ist einer Interpreter-Sprache, keine Compilierte. Der Code braucht ein separates Programm (in diesem Fall Oblivion), um zu laufen - Anders als compilierter Code, der selbstständig arbeitet wie eine EXE-Anwendung.
  
TES Script ist nicht Case Sensitive. Das bedeutet, dass der Befehl "player.getpos z" genauso arbeitet wie der Befehl "Player.GetPos.z" und auch wie "PlAyEr.GetPOs z" oder wie jede andere verrückte Groß/Klein-Schreibungsweise. Die meisten Programmierer benutzen das zweite Format, weil es am Übersichtlichsten ist. Andere bevorzugen die erste Art, weil sie am einfachsten zu schreiben ist. Der einzige Punkt wo du auf Groß/Kleinschreibung achten musst ist, wenn du eine Nachricht auf dem Bildschirm ausgeben willst (bzw. bei allem, was der Spieler lesen kann, wie z.B. Namen, Orte usw). Suche dir eine Möglichkeit aus, wie du in Zukunft schreiben willst. Nimm nur nicht die dritte... Möglichst. Ich persönlich bevorzuge ebenfalls die zweite Art.
+
TES-Script ist nicht Case Sensitive. Das bedeutet, dass der Befehl "player.getpos z" genauso arbeitet wie der Befehl "Player.GetPos.z" und auch wie "PlAyEr.GetPOs z" oder wie jede andere verrückte Groß-/Kleinschreibung. Die meisten Programmierer benutzen das zweite Format, weil es am Übersichtlichsten ist. Andere bevorzugen die erste Art, weil sie am einfachsten zu schreiben ist. Der einzige Punkt, wo du auf Groß-/Kleinschreibung achten musst, ist, wenn du eine Nachricht auf dem Bildschirm ausgeben willst (bzw. bei allem, was der Spieler lesen kann, wie z.B. Namen, Orte usw.). Suche dir eine Möglichkeit aus, wie du in Zukunft schreiben willst. Nimm nur nicht die dritte... möglichst. Ich persönlich bevorzuge ebenfalls die zweite Art.
 
   
 
   
  
Zeile 32: Zeile 32:
 
=== Was können Scripte tun? ===
 
=== Was können Scripte tun? ===
  
Scripts in Oblivion dienen dazu, um das Spiel dynamisch an dem Verhalten des Spielers zu halten. Du kannst Scripts benutzen um komplexe Quests zu steuern. Du kannst Script erstellen, um eigene Items zu erstellen, die eine Aktion machen, die sie mit regulären Verzauberungen nicht tun würde. Du kannst Scripts dazu benutzen, Fallen zu erstellen. Du kannst Scripts dazu benutzen, das Verhalten von NPCs und Kreaturen zu verändern. Erinnerst du dich an das Charakter-Erstellen in Oblivion? Im Grunde wird er von einer Anzahl Scripts gesteuert. Schon irgendwelche Quests gemacht? Auch sie werden durch Scripts gesteuert. Also lautet die kurze Antwort: Eine Menge. Ohne Scripting kann man im Editor recht wenig machen vom Quest-Erstellen ganz abgesehen.
+
Scripts in Oblivion dienen dazu, um das Spiel dynamisch an dem Verhalten des Spielers zu halten. Du kannst Scripts benutzen, um komplexe Quests zu steuern. Du kannst Script erstellen, um eigene Items zu erstellen, die eine Aktion machen, die sie mit regulären Verzauberungen nicht tun würde. Du kannst Scripts dazu benutzen, Fallen zu erstellen. Du kannst Scripts dazu benutzen, das Verhalten von [[NPC]]s und Kreaturen zu verändern. Erinnerst du dich an das Charakter-Erstellen in Oblivion? Im Grunde wird das von einer Anzahl Scripts gesteuert. Schon irgendwelche Quests gemacht? Auch sie werden durch Scripts gesteuert. Also lautet die kurze Antwort: eine Menge. Ohne Scripting kann man im Editor recht wenig machen, vom Quest-Erstellen ganz abgesehen.
  
 
   
 
   
Zeile 39: Zeile 39:
 
=== Was Scripts NICHT können ===
 
=== Was Scripts NICHT können ===
  
Die TES Script Sprache ist in ihren Fähigkeiten beschränkt - Du kannst nur das tun, wozu du auch eine Funktion hast. Und manchmal sind die möglichen Dinge nicht das, was du dir gerade erhoffst. In manchen Fällen kannst du die Beschränkungen durch Tricks umgehen, aber erwarte keine Wunder. Manche Sachen sind Hard-Code und können nicht direkt oder indirekt durch Scripts beeinflusst werden.
+
Die TES-Script Sprache ist in ihren Fähigkeiten beschränkt - Du kannst nur das tun, wozu du auch eine Funktion hast. Und manchmal sind die möglichen Dinge nicht das, was du dir gerade erhoffst. In manchen Fällen kannst du die Beschränkungen durch Tricks umgehen, aber erwarte keine Wunder. Manche Sachen sind Hard-Coded und können nicht direkt oder indirekt durch Scripts beeinflusst werden.
  
  
Zeile 46: Zeile 46:
 
== Bevor wir loslegen können ==
 
== Bevor wir loslegen können ==
  
Wenn du ein absoluter Einsteiger ins Scripting bist und gerade das "Mein erstes Script" Tutorial abgeschlossen hast, wirst du wahrscheinlich noch kein großer Script-Schreiber sein und glaubst vielleicht auch noch nicht so recht daran, dass es dir jemals gelingen wird. Das wird es auch nicht, wenn du dich nicht auf den Hosenboden setzt und immer fleißig übst.
+
Wenn du ein absoluter Einsteiger ins Scripting bist und gerade das [[Oblivion:Mein erstes Script|"Mein erstes Script"-Tutorial]] abgeschlossen hast, wirst du wahrscheinlich noch kein großer Script-Schreiber sein und glaubst vielleicht auch noch nicht so recht daran, dass es dir jemals gelingen wird. Das wird es auch nicht, wenn du dich nicht auf den Hosenboden setzt und immer fleißig übst.
  
Dieses Tutorial soll die nun weiter helfen und dich im Scripting weiterbringen, dass du selber Ideen und Arbeitsvorgänge entwickelst und irgendwann sciptest, als hättest du nie etwas anderes gemacht. Das ist natürlich übertrieben, aber versuchen wir es einfach.
+
Dieses Tutorial soll dir nun weiter helfen und dich im Scripting weiterbringen, damit du selber Ideen und Arbeitsvorgänge entwickelst und irgendwann scriptest, als hättest du nie etwas anderes gemacht. Das ist natürlich übertrieben, aber versuchen wir es einfach.
  
  
Zeile 55: Zeile 55:
 
== Lasst uns beginnen ==
 
== Lasst uns beginnen ==
  
Falls es nicht schon längst geschehen ist, öffnen wir den Script-Editor (Für alle die wieder mal geschlafen haben: Starte TES CS, öffne die Oblivion.esm Datei und wähle http://www.ei-der-zeit.com/LexikonCSIV/pic/button-script.jpg oder "Edit Script" aus dem Gameplay-Menü).
+
Falls es nicht schon längst geschehen ist, öffnen wir den [[Oblivion:Script Editor Window|Script-Editor]] (Für alle die wieder mal geschlafen haben: Starte TES CS, öffne die Oblivion.esm Datei und wähle [[bild:button-script.jpg]] oder "Edit Script" aus dem Gameplay-Menü).
  
 
== Das Script-Fenster ==
 
== Das Script-Fenster ==
  
Näheres zum Script-Fenster und wie man es öffnet findet man unter [[edzlexikon:scriptEdit|Script Edit]]
+
Näheres zum Script-Fenster und wie man es öffnet findet man unter [Oblivion:Script Editor Window|Script-Editor]]
  
Der Script-Editor ist sehr einfach gehalten und sollte recht einleuchtend sein. Alle die sich noch nicht auskennen, sollten sich die Beschreibung zu dem Script-Edit-Fenster durchlesen.
+
Der [[Oblivion:Script Editor Window|Script-Editor]] ist sehr einfach gehalten und sollte recht einleuchtend sein. Alle, die sich noch nicht auskennen, sollten sich die Beschreibung zu dem [Oblivion:Script Editor Window|Script-Editor]]-Fenster durchlesen.
  
 
Bedenke, dass beim Speichern von Scripts das Script nicht irgendwo auf die Festplatte gespeichert wird, sondern in der Plugin-Datei. Das bedeutet auch, dass wenn du deine Plugin-Datei neu laden musst, auch die ungespeicherten (nicht kompilierten) Scripts gelöscht sind. Wenn du also ein Script geschrieben und gespeichert hast, speichere auch gleich die ganze Plugin-Datei ab, damit das Script auch wirklich gesichert ist.
 
Bedenke, dass beim Speichern von Scripts das Script nicht irgendwo auf die Festplatte gespeichert wird, sondern in der Plugin-Datei. Das bedeutet auch, dass wenn du deine Plugin-Datei neu laden musst, auch die ungespeicherten (nicht kompilierten) Scripts gelöscht sind. Wenn du also ein Script geschrieben und gespeichert hast, speichere auch gleich die ganze Plugin-Datei ab, damit das Script auch wirklich gesichert ist.
  
Außerdem ist zu beachten, wenn du beim Scripten mittendrin den Speichern-Button klickst um deine Arbeit zwischenzuspeichern (wie z.B. bei einem Text-Editor), dass die nachfolgenden Änderungen nicht abgespeichert werden wenn du sie nicht manuell selber erneut speicherst! Wenn du einfach das Editor-Fenster schließt, werden die Änderungen nicht abgespeichert. Du musst sie IMMER manuell speichern. Das wurde vermutlich deswegen so gemacht, damit die Entwickler nicht ständig irgendwelche "Warnfenster" wegklicken mussten beim Schreiben der vielen Scripts.
+
Außerdem ist zu beachten, wenn du beim Scripten mittendrin den Speichern-Button klickst, um deine Arbeit zwischenzuspeichern (wie z.B. bei einem Text-Editor), dass die nachfolgenden Änderungen nicht abgespeichert werden, wenn du sie nicht manuell selber erneut speicherst! Wenn du einfach das Editor-Fenster schließt, werden die Änderungen nicht abgespeichert. Du musst sie IMMER manuell speichern. Das wurde vermutlich deswegen so gemacht, damit die Entwickler beim Schreiben der vielen Scripts nicht ständig irgendwelche "Warnfenster" wegklicken mussten.
  
Mit den Pfeiltasten kannst du dich zwischen den Scripts hin und herbewegen. Und zwar in alphabetischer Reihenfolge. Wenn du eigene Scripts entwickelst, kann es von Vorteil sein, ihnen einen gleichen Präfix  zu geben. Zum Beispiel deine Initialen (z.B. AA_MeinScript1), um deine Scripts immer alle beieinander zu haben.
+
Mit den Pfeiltasten kannst du dich zwischen den Scripts hin- und herbewegen. Und zwar in alphabetischer Reihenfolge. Wenn du eigene Scripts entwickelst, kann es von Vorteil sein, ihnen einen gleichen Präfix  zu geben. Zum Beispiel deine Initialen (z.B. AA_MeinScript1), um deine Scripts immer alle beieinander zu haben.
  
 
Über die anderen Buttons erfährt man mehr im "Script Edit"-Teil.
 
Über die anderen Buttons erfährt man mehr im "Script Edit"-Teil.
  
Du kannst übrigens deine Scripts auch in einem Standard-Editor (z.B den Windows Editor) schreiben und dort separat abspeichern, danach kopieren und in den Script-Editor einfügen (mit den Standard-Tasten Strg+C (Kopieren), Strg+V (einfügen)). Damit kannst du vielleicht wichtige Scripts abspeichern, die du vielleicht in anderen Addons wieder verwenden willst, oder eben sicher gehen, das deine Scripts zusätzlich abgespeichert sind.
+
Du kannst übrigens deine Scripts auch in einem Standard-Editor (z.B den Windows Editor) schreiben und dort separat abspeichern, danach kopieren und in den Script-Editor einfügen (mit den Standard-Tasten Strg+C (Kopieren), Strg+V (einfügen)). Damit kannst du vielleicht wichtige Scripts abspeichern, die du in anderen Addons wieder verwenden willst oder eben sicher gehen, dass deine Scripts zusätzlich abgespeichert sind.
  
  
Zeile 87: Zeile 87:
 
== Ein Script schreiben ==
 
== Ein Script schreiben ==
  
Wenn das Script-Edit-Fenster geöffnet ist, wähle Script->New um ein neues Script zu beginnen. Die graue Fläche sollte nun weiß sein (sofern du nicht vorher schon rumgefummelt hast, allerdings sollte sie dann jetzt trotzdem weiß sein). Setze den Script Type auf "Objekt": http://www.ei-der-zeit.com/LexikonCSIV/pic/button-scrptscripttype.jpg Klicke nun in die weiße Schreibfläche dort wird unser Script geboren.
+
Wenn das [Oblivion:Script Editor Window|Script-Editor]]-Fenster geöffnet ist, wähle Script->New, um ein neues Script zu beginnen. Die graue Fläche sollte nun weiß sein (sofern du nicht vorher schon rumgefummelt hast, allerdings sollte sie dann jetzt trotzdem weiß sein). Setze den Script Type auf "Objekt": [[bild:button-scrptscripttype.jpg]] Klicke nun in die weiße Schreibfläche: dort wird unser Script geboren.
  
 
== Die ersten Zeilen ==
 
== Die ersten Zeilen ==
Zeile 101: Zeile 101:
 
<span style="color:#886c44;">Fortgeschrittene Information</span>: Oblivion unterstützt etwas das sich Aliasing nennt. Das ist eine Art Abkürzung für Befehle. Z.B. Wäre "ScriptName" dann "scn" oder "ForceActorValue" würde reichen "ForceAV". Diese festgelegten Abkürzungen gelten genauso wie das ausgeschriebene Wort. In diesem Tutorial nutzen wir diese Abkürzungen aber nicht, sei bitte dennoch nicht überrascht, wenn du diese Abkürzungen mal in anderen Scripts siehst. Damit kann man sich eine Menge Schreibarbeit sparen).
 
<span style="color:#886c44;">Fortgeschrittene Information</span>: Oblivion unterstützt etwas das sich Aliasing nennt. Das ist eine Art Abkürzung für Befehle. Z.B. Wäre "ScriptName" dann "scn" oder "ForceActorValue" würde reichen "ForceAV". Diese festgelegten Abkürzungen gelten genauso wie das ausgeschriebene Wort. In diesem Tutorial nutzen wir diese Abkürzungen aber nicht, sei bitte dennoch nicht überrascht, wenn du diese Abkürzungen mal in anderen Scripts siehst. Damit kann man sich eine Menge Schreibarbeit sparen).
  
Wie du ja weißt, ist TES Script nicht Case Sensitive, es ist also egal, ob du die Befehle "scriptname", SCRIPTname" oder "ScRiPtNamE" schreibst. Gewöhne dir aber an, entweder nur klein, oder - so wie ich es auch bevorzuge - wie oben angegeben zu schreiben. Ist übersichtlicher.
+
Wie du ja weißt, ist TES-Script nicht Case Sensitive, es ist also egal, ob du die Befehle "scriptname", SCRIPTname" oder "ScRiPtNamE" schreibst. Gewöhne dir aber an, entweder nur klein, oder - so wie ich es auch bevorzuge - wie oben angegeben zu schreiben. Ist übersichtlicher.
  
Versuche mal dein Script zu speichern. Es wird nichts besonderes passieren, aber wenn du auf "Open" ([[Bild:button-data.jpg]]) klickst, kannst du dein Script schon in der Liste auswählen. Es ist nun das kleinste Script im Spiel - aber es tut auch nichts.
+
Versuche mal dein Script zu speichern. Es wird nichts besonderes passieren, aber wenn du auf "Open" [[bild:button-data.jpg]] klickst, kannst du dein Script schon in der Liste auswählen. Es ist nun das kleinste Script im Spiel - aber es tut auch nichts.
  
 
   
 
   
Zeile 110: Zeile 110:
 
== BEGIN und END ==
 
== BEGIN und END ==
  
Die Begin und End Befehle bezeichnen den Beginn und das Ende eines Blocks im Script. Blöcke sind Absätze mit Code, der unter vorgegebenen Umständen abgearbeitet wird. Als Beispiel: "Begin GameMode" definiert einen Block dessen Inhalt innerhalb jeden Frames abgearbeitet wird, in denen sich der Spieler im Spiel (und nicht in einem Menü) befindet.
+
Die Begin und End Befehle bezeichnen den Beginn und das Ende eines Blocks im Script. Blöcke sind Absätze mit Code, der unter vorgegebenen Umständen abgearbeitet wird. Als Beispiel: "Begin GameMode" definiert einen Block, dessen Inhalt innerhalb jedes Frames abgearbeitet wird, in denen sich der Spieler im Spiel (und nicht in einem Menü) befindet.
  
Für unsere Zwecke brauchen wir einen OnActivate-Block: Einer der abgearbeitet wird, wenn unser Schrank aktiviert (in diesem Fall geöffnet) wird, aber nicht zu anderen Zeiten (Es wäre ärgerlich, wenn der Spieler in jedem Frame unsere Frage bekäme oder wenn ein NPC stirbt, beide Versionen wären durch Änderungen im Begin-Befehl möglich).
+
Für unsere Zwecke brauchen wir einen OnActivate-Block: ein Block, der abgearbeitet wird, wenn unser Schrank aktiviert (in diesem Fall geöffnet) wird, aber nicht zu anderen Zeiten (Es wäre ärgerlich, wenn der Spieler in jedem Frame unsere Frage bekäme oder wenn ein [[NPC]] stirbt, beide Versionen wären durch Änderungen im Begin-Befehl möglich).
  
 
Also tippe die folgenden Zeilen in dein Script ein:
 
Also tippe die folgenden Zeilen in dein Script ein:
Zeile 124: Zeile 124:
  
  
Speichere jetzt erneut. Das Script tut nun auch noch nichts, aber wir haben die Bedingung festgelegt, unter welchen Voraussetzungen es nichts tut. Es gibt aber zunächst einiges zu beachten. Erstens; Wir haben den aktuellen Block beendet, bevor wir einen neuen begonnen haben - Nicht so wichtig, wenn es nur einen Block gibt, aber wenn dieses Script komplizierter wird, brauchen wir mehrere Blöcke in einem einzelnen Script. Das andere ist das Semikolon ( ; ) das dafür sorgt, dass der gesamte Text dahinter vom Spiel ignoriert wird. Damit kann man Kommentare ins Script einfügen (oder vorübergehend Programmzeilen außer Kraft setzen). Egal was du hinter einem Semikolon eingibst, es wird vom Programm ignoriert. Benutze Kommentare, um dein Script zu kommentieren und hinterher vielleicht schneller auf Blöcke oder Arbeitsweisen aufmerksam zu werden (Und - Auch wenn es dich nervt - anderen zu zeigen, was der Block bewirkt, damit sie auch mal so gut werden wie du). Wenn du mehr als eine Zeile für deinen Kommentar brauchst, musst du jede Zeile mit einem Semikolon beginnen (in denen dein Kommentar steht).
+
Speichere jetzt erneut. Das Script tut nun auch noch nichts, aber wir haben die Bedingung festgelegt, unter welchen Voraussetzungen es nichts tut. Es gibt aber zunächst einiges zu beachten. Erstens; Wir haben den aktuellen Block beendet, bevor wir einen neuen begonnen haben - Nicht so wichtig, wenn es nur einen Block gibt, aber wenn dieses Script komplizierter wird, brauchen wir mehrere Blöcke in einem einzelnen Script. Das andere ist das Semikolon ( ; ), das dafür sorgt, dass der gesamte Text dahinter vom Spiel ignoriert wird. Damit kann man Kommentare ins Script einfügen (oder vorübergehend Programmzeilen außer Kraft setzen). Egal was du hinter einem Semikolon eingibst, es wird vom Programm ignoriert. Benutze Kommentare, um dein Script zu kommentieren und hinterher vielleicht schneller auf Blöcke oder Arbeitsweisen aufmerksam zu werden (Und - auch wenn es dich nervt - anderen zu zeigen, was der Block bewirkt, damit sie auch mal so gut werden wie du). Wenn du mehr als eine Zeile für deinen Kommentar brauchst, musst du jede Zeile mit einem Semikolon beginnen (, in denen dein Kommentar steht).
  
 
   
 
   
Zeile 131: Zeile 131:
 
== Text anzeigen und Entscheidung des Spielers bekommen ==
 
== Text anzeigen und Entscheidung des Spielers bekommen ==
  
Nun wollen wir unseren Schrank dazu bringen, den Spieler ein Rätsel aufzugeben. Um das zu tun benutzen wir die MessageBox Funktion. Das dürfte euch schon bekannt vorkommen, denn es ist ähnlich wie in "Mein erstes Script", nur dass wir dort den Message-Befehl benutzt haben, um eine Nachricht anzuzeigen. MessageBox hingegen gibt uns die Möglichkeit, ein richtiges Fenster anzuzeigen, in dem der Spieler eine Antwort auswählen kann. Leider bietet Oblivion (genau wie Morrowind) keine Möglichkeit, um Text einzugeben um die Antwort vielleicht "per Hand" einzugeben. Also geben wir dem Spieler mehrere Antworten zur Auswahl. Die Zeilen dazu (gehört in unseren OnActivate-Block) sehen wie folgt aus:
+
Nun wollen wir unseren Schrank dazu bringen, dem Spieler ein Rätsel aufzugeben. Um das zu tun, benutzen wir die MessageBox Funktion. Das dürfte euch schon bekannt vorkommen, denn es ist ähnlich wie in [[oblivion:Mein erstes Script|"Mein erstes Script"]], nur dass wir dort den Message-Befehl benutzt haben, um eine Nachricht anzuzeigen. MessageBox hingegen gibt uns die Möglichkeit, ein richtiges Fenster anzuzeigen, in dem der Spieler eine Antwort auswählen kann. Leider bietet Oblivion (genau wie Morrowind) keine Möglichkeit, um Text einzugeben, um die Antwort vielleicht "per Hand" einzugeben. Also geben wir dem Spieler mehrere Antworten zur Auswahl. Die Zeilen dazu (gehört in unseren OnActivate-Block) sehen wie folgt aus:
 
 
  
Zeile 139: Zeile 139:
 
<span style="color:#886c44;">Wichtig</span>: Beachte, dass der oben angegebene Befehl im Script-Editor in einer Zeile eingegeben werden muss!
 
<span style="color:#886c44;">Wichtig</span>: Beachte, dass der oben angegebene Befehl im Script-Editor in einer Zeile eingegeben werden muss!
  
Der erste String (der Text zwischen den ersten Anführungsstrichen) ist der Text, der in der Box angezeigt wird. Die anderen Texte, die durch Kommas getrennt sind, sagen dem Spiel, dass es "Buttons" aus den Texten macht um eine Auswahl zu treffen.
+
Der erste String (der Text zwischen den ersten Anführungsstrichen) ist der Text, der in der Box angezeigt wird. Die anderen Texte, die durch Kommas getrennt sind, sagen dem Spiel, dass es "Buttons" aus den Texten macht, um eine Auswahl zu treffen.
  
Aber wie gewährleisten wir es, dass das Rätsel nur einmal gefragt wird und nicht jedes Mal wenn wir versuchen, den Schrank zu öffnen? Damit kommen wir an einen sehr wichtigen Punkt: Die Benutzung der "Do Once"-Kondition und Status-Variablen. Viele Script-Anfänger haben Probleme damit, zu verstehen wie Scripts ausgeführt werden und wie sie entsprechend strukturiert werden sollten. Also werfen wir ein Blick darauf:
+
Aber wie gewährleisten wir, dass das Rätsel nur einmal gefragt wird und nicht jedes Mal, wenn wir versuchen, den Schrank zu öffnen? Damit kommen wir an einen sehr wichtigen Punkt: die Verwendung der "Do Once"-Kondition und Status-[[ob:variablen|Variablen]]. Viele Script-Anfänger haben Probleme damit, zu verstehen, wie Scripts ausgeführt werden und wie sie entsprechend strukturiert werden sollten. Also werfen wir ein Blick darauf:
  
 
   
 
   
  
  
== Wie Object Scripts ausgeführt werden ==
+
== Wie Object-Scripts ausgeführt werden ==
  
Jedes Script,das an ein Objekt gehängt ist oder an einen NPC (object script), wird in jedem Frame ausgeführt, in dem das Objekt in der aktuellen Zelle aktiv ist (in Interiors/Innenräumen ist es nur die aktuelle Zelle, außerhalb ist es die Zelle in der sich der Spieler befindet, sowie die an diese Zelle angrenzenden). Also wird das komplette Script (und nicht nur eine Zeile daraus) etwa 10-60 mal in der Sekunde ausgeführt - je nachdem wie schnell der Computer das Spiel darstellt (Frames in der Sekunde - FpS). Es ist am leichtesten zu merken, wenn man sich vorstellt, dass jedes lokale Script in ein er großen "WhileLoop"-Schleife eingehüllt ist.
+
Jedes Script, das an ein [[Oblivion:Object|Objekt]] gehängt ist oder an einen [[NPC]] (object script), wird in jedem Frame ausgeführt, in dem das Objekt in der aktuellen Zelle aktiv ist (in [[Oblivion:Interior Cell|Interiors/Innenräumen]] ist es nur die aktuelle [[Oblivion:Cell|Zelle]], außerhalb ist es die [[Oblivion:Cell|Zelle]], in der sich der Spieler befindet, sowie die an diese [[Oblivion:Cell|Zelle]] angrenzenden [[Oblivion:Cell|Zellen]]). Also wird das komplette Script (und nicht nur eine Zeile daraus) etwa 10-60 mal in der Sekunde ausgeführt - je nachdem, wie schnell der Computer das Spiel darstellt (Frames in der Sekunde - FpS). Es ist am Leichtesten zu merken, wenn man sich vorstellt, dass jedes lokale Script in einer großen "WhileLoop"-Schleife eingehüllt ist.
 
   
 
   
 
 
 
<tesscript>
 
<tesscript>
while (Objekt in einer Aktiven Zelle ist)
+
while (Objekt in einer aktiven Zelle ist)
  
 
   [Dein Script code]
 
   [Dein Script code]
Zeile 160: Zeile 160:
  
  
Das ist der Grund, warum das folgende Script ununterbrochen Nachrichten auswirft (Wenn es an ein Objekt oder NPC in der selben Zelle wie der Spieler gebunden ist). Versuche es, wenn du unbedingt willst:
+
Das ist der Grund, warum das folgende Script ununterbrochen Nachrichten auswirft (Wenn es an ein [[Oblivion:Object|Objekt]] oder einen [[NPC]] in der selben Zelle wie der Spieler gebunden ist). Versuche es, wenn du unbedingt willst:
  
 
 
Zeile 174: Zeile 174:
 
   
 
   
  
Dieses Beispiel ist relativ harmlos, aber stell dir mal vor, was passieren würde, wenn diese Zeile ein Item ins Spieler-Inventar hinzufügt, oder einen Gegner direkt neben ihm platziert.. In jedem Frame.. Was für ein Gemetzel...
+
Dieses Beispiel ist relativ harmlos, aber stell dir mal vor, was passieren würde, wenn diese Zeile ein Item ins Spieler-Inventar hinzufügt oder einen Gegner direkt neben ihm platziert... In jedem Frame... Was für ein Gemetzel...
  
Aus diesem Grund sind "Do Once" ("Tu es einmal") Konstruktionen die beste Methode etwas auszuführen und kommt beim Scripten in Oblivion am meisten vor.
+
Aus diesem Grund sind "Do Once"-("Tu es einmal"-)-Konstrukte die beste Methode, etwas auszuführen und kommt beim Scripten in Oblivion am meisten vor.
  
Jetzt aber wieder zurück an unser Tutorial-Script (Du hast ja hoffentlich nicht die beiden obigen Codes hinzugefügt ?!): Wir müssen jetzt eine Variable deklarieren, damit wir sicherstellen können, das die Nachricht nur einmal angezeigt wird.
+
Jetzt aber wieder zurück an unser Tutorial-Script (Du hast ja hoffentlich nicht die beiden obigen Codes hinzugefügt?!): Wir müssen jetzt eine [[ob:variablen|Variable]] deklarieren, damit wir sicherstellen können, dass die Nachricht nur einmal angezeigt wird.
  
 
Ändere das Script wie folgt um (bzw. ergänze es):
 
Ändere das Script wie folgt um (bzw. ergänze es):
Zeile 203: Zeile 203:
  
  
Und speichere das Script erneut. Achte darauf, dass der MessageBox-Befehl (mit allen dahinterliegenden Texten und Auswahlmöglichkeiten) in einer Zeile im Script ist! Unterbreche die Zeile nicht, sonst funktioniert es nicht. Es lässt sich hier leider nicht anders darstellen. Es sollte in etwa so aussehen (der weitere Text hinter dem "MessageBox"-Befehl ist in der selben Zeile):
+
Und speichere das Script erneut. Achte darauf, dass der MessageBox-Befehl (mit allen dahinter liegenden Texten und Auswahlmöglichkeiten) in einer Zeile im Script ist! Unterbreche die Zeile nicht, sonst funktioniert es nicht. Es lässt sich hier leider nicht anders darstellen. Es sollte in etwa so aussehen (der weitere Text hinter dem "MessageBox"-Befehl ist in der selben Zeile):
  
<div style="text-align: center;">http://www.ei-der-zeit.com/LexikonCSIV/pic/tut-Script2-01.jpg</div>
+
<div style="text-align: center;">[[bild:tut-Script2-01.jpg]]</div>
 
   
 
   
  
Wieder einmal wollen wir die Veränderungen besprechen. Der "IF"-Befehl wird hier dazu benutzt, um zu überprüfen, ob eine bestimmte Bedingung zutrifft und wenn das so ist, die nachfolgenden Befehle abzuarbeiten´, bis zu dem "Endif" Befehl.
+
Wieder einmal wollen wir die Veränderungen besprechen. Der "IF"-Befehl wird hier dazu benutzt, um zu überprüfen, ob eine bestimmte Bedingung zutrifft und wenn das so ist, die nachfolgenden Befehle bis zu dem "Endif"-Befehl abzuarbeiten.
  
Das "==" vergleicht ob der Ausdruck auf der linken Seite (in unsrem Beispiel die Variable "controlvar") absolut gleich ist mit dem Ausdruck auf der rechten Seite (in unserem Fall 0). Wenn du am Ende den "Endif" Befehl vergisst, kann das Script nicht korrekt ausgeführt werden und du bekommst eine Fehlermeldung, wenn du speicherst.
+
Das "==" vergleicht, ob der Ausdruck auf der linken Seite (in unsrem Beispiel die [[ob:variablen|Variable]] "controlvar") absolut gleich ist mit dem Ausdruck auf der rechten Seite (in unserem Fall 0). Wenn du am Ende den "Endif"-Befehl vergisst, kann das Script nicht korrekt ausgeführt werden und du bekommst eine Fehlermeldung, wenn du speicherst.
  
"Short controlvar" deklariert eine neue Variable, die wir "controlvar" nennen möchten im Format "Short". Für den Moment reicht es eigentlich aus zu wissen, dass eine Short-Variable dazu da ist, um positive oder negative Ganzzahlen aufzunehmen (Wer mehr wissen will, kann sich den entsprechenden Eintrag dazu auf der Homepage durchlesen). Eine Variable ist ein "Platzhalter", der verschiedene Werte annehmen kann.
+
"Short controlvar" deklariert eine neue [[ob:variablen|Variable]], die wir "controlvar" nennen möchten im Format "Short". Für den Moment reicht es eigentlich zu wissen, dass eine Short-Variable dazu da ist, um positive oder negative Ganzzahlen aufzunehmen (Wer mehr wissen will, kann sich den entsprechenden Eintrag dazu auf der Homepage durchlesen). Eine [[ob:variablen|Variable]] ist ein "Platzhalter", der verschiedene Werte annehmen kann.
  
 
Der Set-Befehl ist ebenfalls neu, aber nicht schwer zu verstehen: Es setzt eine Variable auf einen anderen Wert, in unserem Fall wird die Variable "controlvar" auf den Wert 1 gesetzt. Alle Variablen sind auf "0" gesetzt, wenn sie deklariert werden. Auf diese Weise wird nun gewährleistet, dass die Variable beim ersten Aufruf 0 ist und mit dem If-Befehl übereinstimmt (ist WAHR) und noch während der Schleife auf 1 gesetzt wird und somit beim nächsten Durchlaufen die If-Schleife UNWAHR ist, weil der Wert dann 1 beträgt. Daher wird dieses Script nur einmal ausgeführt (do once).
 
Der Set-Befehl ist ebenfalls neu, aber nicht schwer zu verstehen: Es setzt eine Variable auf einen anderen Wert, in unserem Fall wird die Variable "controlvar" auf den Wert 1 gesetzt. Alle Variablen sind auf "0" gesetzt, wenn sie deklariert werden. Auf diese Weise wird nun gewährleistet, dass die Variable beim ersten Aufruf 0 ist und mit dem If-Befehl übereinstimmt (ist WAHR) und noch während der Schleife auf 1 gesetzt wird und somit beim nächsten Durchlaufen die If-Schleife UNWAHR ist, weil der Wert dann 1 beträgt. Daher wird dieses Script nur einmal ausgeführt (do once).
Zeile 231: Zeile 231:
 
# Speichere das Script und schließe den Script-Editor (vorher speichern, sonst wird nur das Fenster geschlossen, ohne die Änderungen zu speichern!)
 
# Speichere das Script und schließe den Script-Editor (vorher speichern, sonst wird nur das Fenster geschlossen, ohne die Änderungen zu speichern!)
  
# Schaue im Objekt-Fenster nach dem folgenden Ordner: "WorldObjects > Container > Clutter" und finde dort das Objekt "CupboardFoodLower".
+
# Schaue im Objekt-Fenster nach dem folgenden Ordner: "WorldObjects > Container > Clutter" und finde dort das [[ob:object|Objekt]] "CupboardFoodLower".
  
 
# Nun klicke es mit der rechten Maustaste an und wähle aus dem erscheinenden Kontext-Menü den Eintrag "Edit". Das öffnet das Einstellungsfenster.
 
# Nun klicke es mit der rechten Maustaste an und wähle aus dem erscheinenden Kontext-Menü den Eintrag "Edit". Das öffnet das Einstellungsfenster.
  
# Im Script-DropDown Menü wähle den Eintrag "RaetselSchrankScript" (in der Regel reicht es schon, wenn du auf die Dropdown Liste klickst das sie sich öffnet und dann die "R-Taste" drückst, das bringt dich gleich zu allen Einträgen die mit einem 'R' beginnen).
+
# Im Script-DropDown-Menü wähle den Eintrag "RaetselSchrankScript" (in der Regel reicht es schon, wenn du auf die Dropdown-Liste klickst, damit sie sich öffnet und dann die "R-Taste" drückst, das bringt dich gleich zu allen Einträgen die mit einem 'R' beginnen).
  
# Klicke "OK" und speichere das Mod und beende den TES CS (auf "guten" Rechnern kann der TES auch im Hintergrund weiterarbeiten).
+
# Klicke "OK" und speichere die Mod und beende das TES CS (auf "guten" Rechnern kann der TES auch im Hintergrund weiterarbeiten).
  
  
<span style="color:#886c44;">WICHTIG</span>: Sei dir bewusst, was wir gerade getan haben. Ein Objekt zu verändern ohne die ID zu verändern, kann bei manchen Objekten zu schrecklichen Folgen führen, weil nun ALLE Schränke dieser Art das Script ausführen! Tu dieses aber niemals in einem richtigen Mod. In dem Fall solltest du erst eine Kopie des Schrankes anlegen und nur diesem einen Schrank das Script anlegen. Für unsere Testzwecke ist das jetzt aber egal (Es sei denn, du baust das Script gerade in ein Mod von dir mit ein).
+
<span style="color:#886c44;">WICHTIG</span>: Sei dir bewusst, was wir gerade getan haben. Ein [[ob:object|Objekt]] zu verändern, ohne die ID zu verändern, kann bei manchen Objekten zu schrecklichen Folgen führen, weil nun ALLE Schränke dieser Art das Script ausführen! Tu dieses aber niemals in einer richtigen Mod. In dem Fall solltest du erst eine Kopie des Schrankes anlegen und nur diesem einen Schrank das Script anlegen. Für unsere Testzwecke ist das jetzt aber egal (es sei denn, du baust das Script gerade in eine Mod von dir mit ein).
  
 
Das Script im Spiel:
 
Das Script im Spiel:
  
# Nun starte das Spiel und wähle "Spieldateien" und aktiviere dein Mod. Starte Oblivion und lade einen Speicherstand.
+
# Nun starte das Spiel und wähle "Spieldateien" und aktiviere deine Mod. Starte Oblivion und lade einen Speicherstand.
  
 
# Wenn das Spiel geladen ist, öffne die Konsole mit der "^" Taste (bzw. Die Taste links von der 1-Taste). Schreibe nun in die Konsole:
 
# Wenn das Spiel geladen ist, öffne die Konsole mit der "^" Taste (bzw. Die Taste links von der 1-Taste). Schreibe nun in die Konsole:
Zeile 253: Zeile 253:
 
Bestätige mit der Eingabetaste, falls es nicht ohnehin eine Reflexbewegung war.
 
Bestätige mit der Eingabetaste, falls es nicht ohnehin eine Reflexbewegung war.
  
Du wirst dich anschließend im Aleswell Gasthof wieder finden und sogleich von einigen unsichtbaren Leuten begrüßt werden (sofern du die dazugehörige Quest nicht schon abgeschlossen hast). Es hat also nichts mit dem Mod zu tun, es ist eine Quest. Wir wenden uns nun also dem Schrank zu, der an einer Wand steht. Der Name dürfte einfach nur "Schrank" lauten. Schließe ggf. das Kommando-Fenster mit einem erneuten Druck auf die ^-Taste. und gehe zum Schrank an der Wand links.
+
Du wirst dich anschließend im Aleswell-Gasthof wieder finden und sogleich von einigen unsichtbaren Leuten begrüßt werden (sofern du die dazugehörige Quest nicht schon abgeschlossen hast). Es hat also nichts mit der Mod zu tun, es ist eine Quest. Wir wenden uns nun also dem Schrank zu, der an einer Wand steht. Der Name dürfte einfach nur "Schrank" lauten. Schließe ggf. das Kommando-Fenster mit einem erneuten Druck auf die ^-Taste. und gehe zum Schrank an der Wand links.
  
  
<div style="text-align: center;">http://www.ei-der-zeit.com/LexikonCSIV/pic/tut-Script2-02.jpg</div>
+
<div style="text-align: center;">[[bild:tut-Script2-02.jpg]]</div>
  
  
Wenn du den Schrank aktivierst (also öffnest), wird sich ein Fenster öffnen indem der von dir eingegebene Text erscheint, sowie die vier Auswahlmöglichkeiten.
+
Wenn du den Schrank aktivierst (also öffnest), wird sich ein Fenster öffnen, in dem der von dir eingegebene Text erscheint, sowie die vier Auswahlmöglichkeiten.
  
Wenn du auf irgendeine Antwort klickst, wird sich das Fenster einfach schließen und es wird nichts weiter passieren, wenn du den Schrank ein weiteres mal aktivierst wird gar nichts mehr passieren, das ist sehr gut, denn es zeigt uns, dass unsere Variable dafür sorgt, dass das Fenster nur einmal angezeigt wird. Dass der Schrank sich jetzt an dieser Stelle nicht öffnet liegt daran, dass wir noch keinen Aktivierungs-Befehl in dem Script haben, aber das kommt gleich noch.
+
Wenn du auf irgendeine Antwort klickst, wird sich das Fenster einfach schließen und es wird nichts weiter passieren, wenn du den Schrank ein weiteres Mal aktivierst, wird gar nichts mehr passieren. Das ist sehr gut, denn es zeigt uns, dass unsere Variable dafür sorgt, dass das Fenster nur einmal angezeigt wird. Dass der Schrank sich jetzt an dieser Stelle nicht öffnet, liegt daran, dass wir noch keinen Aktivierungs-Befehl in dem Script haben, aber das kommt gleich noch.
  
 
Beende nun Oblivion wieder und kehre zum TES CS zurück.
 
Beende nun Oblivion wieder und kehre zum TES CS zurück.
Zeile 271: Zeile 271:
 
Wir müssen jetzt herausfinden, welche Antwort der Spieler ausgewählt hat und das Script muss angemessen auf die falsche oder richtige Antwort reagieren.
 
Wir müssen jetzt herausfinden, welche Antwort der Spieler ausgewählt hat und das Script muss angemessen auf die falsche oder richtige Antwort reagieren.
  
Die Funktion um die Antwort eines Auswahlfensters herauszufinden ist "GetButtonPressed". Diese Funktion gibt eine Zahl zurück, die den Auswahlmöglichkeiten in der Message-Box entsprechen. Es gibt den Wert "0" für den ersten Button zurück (in unserem Fall ist es die Fledermaus) und 1, 2, 3 usw. für die folgenden Buttons/Auswahlmöglichkeiten. Die Reihenfolge entspricht dabei der, wie du sie in dem MessageBox-Befehl angegeben hast. Bis die Antwort angeklickt wird, wird der Wert "-1" zurückgegeben, also sieh dich vor, auch diese Zahl als Möglichkeit zu nutzen (der Spieler hätte keine Chance zu antworten).
+
Die Funktion, um die Antwort eines Auswahlfensters herauszufinden ist "GetButtonPressed". Diese Funktion gibt eine Zahl zurück, die den Auswahlmöglichkeiten in der Message-Box entsprechen. Es gibt den Wert "0" für den ersten Button zurück (in unserem Fall ist es die Fledermaus) und 1, 2, 3 usw. für die folgenden Buttons/Auswahlmöglichkeiten. Die Reihenfolge entspricht dabei der, wie du sie in dem MessageBox-Befehl angegeben hast. Bis die Antwort angeklickt wird, wird der Wert "-1" zurückgegeben, also sieh dich vor, auch diese Zahl als Möglichkeit zu nutzen (der Spieler hätte keine Chance zu antworten).
  
Die "Activate" Funktion wird unseren Schrank öffnen. Activate führt einfach gesprochen die Standard-Aktion eines Objektes aus, sobald der Befehl im Script auftaucht - Türen öffnen sich, NPCs werden einen Dialog anfangen usw.
+
Die "Activate"-Funktion wird unseren Schrank öffnen. Activate führt einfach gesprochen die Standard-Aktion eines [[ob:object|Objektes]] aus, sobald der Befehl im Script auftaucht - Türen öffnen sich, NPCs werden einen [[ob:dialog|Dialog]] anfangen usw.
  
Die nächste Erweiterung in unseren Script zeigt, wie man eine Kontroll-Variable dazu benutzen kann Oblivion dazu zu bringen eine Funktion nach der anderen auszuführen, obwohl das ganze Script während jedem Frame des Spiels ausgeführt wird. Erhöhe einfach den "Ausführungswert" der Kontroll-Variable und teste es in einer Serie von IF-ELSEIF-Befehlen. Das ist ein sicherer Weg für das Scripten in Oblivion. Es ist nicht immer erforderlich, aber es ist sicher.
+
Die nächste Erweiterung in unserem Script zeigt, wie man eine [[ob:variablen|Kontroll-Variable]] dazu benutzen kann Oblivion dazu zu bringen, eine Funktion nach der anderen auszuführen, obwohl das ganze Script während jedem Frame des Spiels ausgeführt wird. Erhöhe einfach den "Ausführungswert" der Kontroll-Variable und teste es in einer Serie von IF-ELSEIF-Befehlen. Das ist ein sicherer Weg für das Scripten in Oblivion. Es ist nicht immer erforderlich, aber es ist sicher.
  
 
(Um das etwas verständlicher zu machen: Man kann durch das Erhöhen der ControlVar erreichen, dass manche IF-Befehle nur ausgeführt werden, wenn der Wert nicht mehr 1 sondern z.B. 2 ist. Die Schleife also schon einmal durchlaufen ist. In unserem Beispiel könnte man zum Beispiel unter ControlVar=2 (der Spieler ruft den Schrank erneut auf) eintragen, dass der Schrank schweigt und sich nicht öffnen lässt).
 
(Um das etwas verständlicher zu machen: Man kann durch das Erhöhen der ControlVar erreichen, dass manche IF-Befehle nur ausgeführt werden, wenn der Wert nicht mehr 1 sondern z.B. 2 ist. Die Schleife also schon einmal durchlaufen ist. In unserem Beispiel könnte man zum Beispiel unter ControlVar=2 (der Spieler ruft den Schrank erneut auf) eintragen, dass der Schrank schweigt und sich nicht öffnen lässt).
Zeile 293: Zeile 293:
 
   If ( controlvar == 0 )
 
   If ( controlvar == 0 )
  
     MessageBox "Still weint es, Flügellos flattert es, Zahnlos beist es, Mundlos murmelt es. Was ist es ?",
+
     MessageBox "Still weint es, Flügellos flattert es, Zahnlos beisst es, Mundlos murmelt es. Was ist es ?",
  
 
   "Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
 
   "Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
Zeile 339: Zeile 339:
 
</tesscript>  
 
</tesscript>  
  
Werfen wir einen Blick auf den neuen GameMode-Block, der mit einem "IF"-Befehl startet. Wir haben die controlvar auf 1 gesetzt, sobald der Schrank aktiviert wurde. Aber OnActivate durchläuft das Script nur so lange der Schrank aktiviert ist. Wir müssen also den GameMode-Block benutzen, um die Antwort des Spielers auszuwerten. Nun testen wir, welche Auswahl getroffen wurde. Wir tun das indem wir der neuen Variable "Button" den Wert von GetButtonPressed zugewiesen haben. Während das Script weiter läuft, und während es so aussieht, als sei das Spiel pausiert und wartet auf eine Antwort, testen wir zunächst, ob noch keine Auswahlmöglichkeit gewählt wurde. RETURN sagt dem Spiel das es das Script vorerst noch nicht weiter ausführen soll.
+
Werfen wir einen Blick auf den neuen GameMode-Block, der mit einem "IF"-Befehl startet. Wir haben die controlvar auf 1 gesetzt, sobald der Schrank aktiviert wurde. Aber OnActivate durchläuft das Script nur, so lange der Schrank aktiviert ist. Wir müssen also den GameMode-Block benutzen, um die Antwort des Spielers auszuwerten. Nun testen wir, welche Auswahl getroffen wurde. Wir tun das, indem wir der neuen [[ob:variablen|Variable]] "Button" den Wert von GetButtonPressed zugewiesen haben. Während das Script weiter läuft, und während es so aussieht, als sei das Spiel pausiert und wartet auf eine Antwort, testen wir zunächst, ob noch keine Auswahlmöglichkeit gewählt wurde. RETURN sagt dem Spiel, dass es das Script vorerst noch nicht weiter ausführen soll.
  
Unsere richtige Antwort ist "Wind", das auf Button 2 gelegt ist (erinnere dich, die erste Auswahlmöglichkeit ist Button 0). Wenn der Spieler also den Button 2 klickt wird dem Spieler angezeigt, dass er die richtige Antwort geklickt hat und das Inventar des Schrankes öffnet sich, wie es ganz gewöhnlich ist (so wie der Inhalt des Schrankes). Für alle anderen Werte der Button-Variable heißt es nun, dass es die falsche Antwort war, also können wir einen ELSE-Befehl benutzen. In diesem Fall sagen wir dem Spieler, dass es die falsche Antwort war. Natürlich kann man die Texte noch "ausschmücken". Der Schrank wird in diesem Fall auch nicht geöffnet.
+
Unsere richtige Antwort ist "Wind", das auf Button 2 gelegt ist (erinnere dich, die erste Auswahlmöglichkeit ist Button 0). Wenn der Spieler also Button 2 klickt, wird dem Spieler angezeigt, dass er die richtige Antwort geklickt hat und das Inventar des Schrankes öffnet sich, wie es ganz gewöhnlich ist (so wie der Inhalt des Schrankes). Für alle anderen Werte der Button-Variable heißt es nun, dass es die falsche Antwort war, also können wir einen ELSE-Befehl benutzen. In diesem Fall sagen wir dem Spieler, dass es die falsche Antwort war. Natürlich kann man die Texte noch "ausschmücken". Der Schrank wird in diesem Fall auch nicht geöffnet.
  
 
Nun schauen wir uns eine kleine Neuerung am Anfang des Scriptes an:
 
Nun schauen wir uns eine kleine Neuerung am Anfang des Scriptes an:
Zeile 350: Zeile 350:
 
   If ( controlvar == 0 )
 
   If ( controlvar == 0 )
  
     MessageBox "Still weint es, Flügellos flattert es, Zahnlos beist es, Mundlos murmelt es. Was ist es ?",
+
     MessageBox "Still weint es, Flügellos flattert es, Zahnlos beisst es, Mundlos murmelt es. Was ist es ?",
  
 
"Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
 
"Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
Zeile 365: Zeile 365:
  
  
Das bedeutet, dass der Schrank in Zukunft nur dann aufgeht, wenn die controlvar-Variable größer als 1 ist. Erinnere dich an unseren Plan: Wenn der Spieler die richtige Antwort gesagt (geklickt) hat, soll er den Schrank immer öffnen können. Wenn der Spieler also die falsche Antwort sagt, wird controlvar auf -1 gesetzt, so wird er niemals fähig sein den Schrank zu öffnen. Aber wenn er die richtige Antwort wusste, wird controlvar auf den Wert 2 gesetzt und von nun an kann der Spieler den Schrank so oft wie er will öffnen, ohne dass er das Rätsel erneut lösen muss. Speichere erneut und auch das Plugin und starte Oblivion um das Ganze wieder zu testen.
+
Das bedeutet, dass der Schrank in Zukunft nur dann aufgeht, wenn die controlvar-Variable größer als 1 ist. Erinnere dich an unseren Plan: Wenn der Spieler die richtige Antwort gesagt (geklickt) hat, soll er den Schrank immer öffnen können. Wenn der Spieler also die falsche Antwort sagt, wird controlvar auf -1 gesetzt, so wird er niemals fähig sein den Schrank zu öffnen. Aber wenn er die richtige Antwort wusste, wird controlvar auf den Wert 2 gesetzt und von nun an kann der Spieler den Schrank so oft er will öffnen, ohne dass er das Rätsel erneut lösen muss. Speichere erneut und auch das Plugin und starte Oblivion, um das Ganze wieder zu testen.
  
 
   
 
   
Zeile 408: Zeile 408:
  
  
Schau dir an, wie wir den Actvate-Befehl in die Sektion die controlvar auf 2 testet verschoben haben. Das sorgt für einen saubereren Ablauf von Anzeige der MessageBox und dem Öffnen des Schrankes. Solche sauberen Abläufe sind sehr wichtig beim Scripten, damit die Ereignisse so laufen, wie man sie als Spieler gewohnt ist. Versuche niemals zu viele Dinge auf einmal auszuführen. Nun speichere wieder und teste es erneut.
+
Schau dir an, wie wir den Actvate-Befehl in die Sektion, die controlvar auf 2 testet, verschoben haben. Das sorgt für einen saubereren Ablauf von Anzeige der MessageBox und dem Öffnen des Schrankes. Solche sauberen Abläufe sind sehr wichtig beim Scripten, damit die Ereignisse so laufen, wie man sie als Spieler gewohnt ist. Versuche niemals zu viele Dinge auf einmal auszuführen. Nun speichere wieder und teste es erneut.
  
 
Wunderbar. Nun öffnet das Inventar genau dann, wenn wir es wollen. Aber was ist das? Wir können das Inventar nicht schließen?! Schauen wir uns das Script noch einmal genauer an. controlvar ist auf 2 gesetzt und verbleibt so, bis wir es wieder ändern. Daher bleibt das Spiel nun kontinuierlich im "Activate"-Status. Deswegen können wir das Inventar des Schrankes auch nicht schließen, es wird sofort wieder geöffnet. Blöde Technik, oder?
 
Wunderbar. Nun öffnet das Inventar genau dann, wenn wir es wollen. Aber was ist das? Wir können das Inventar nicht schließen?! Schauen wir uns das Script noch einmal genauer an. controlvar ist auf 2 gesetzt und verbleibt so, bis wir es wieder ändern. Daher bleibt das Spiel nun kontinuierlich im "Activate"-Status. Deswegen können wir das Inventar des Schrankes auch nicht schließen, es wird sofort wieder geöffnet. Blöde Technik, oder?
Zeile 425: Zeile 425:
 
   
 
   
  
Teste das Addon erneut. Nun arbeitet alles so, wie wir es eigentlich wollten. Ich hoffe der kleine "Absetzer" zum Bugfinden hat dich nicht zu sehr verwirrt, aber es ist wichtig darüber Bescheid zu wissen. Nicht alles läuft immer so ab, wie man es sich wünscht. Du musst ständig umdenken und Fehler finden und dir überlegen, was da gerade wohl falsch läuft. Und dabei ist es wichtig nicht den Mut zu verlieren. Gerade beim Bugfinden kann das Semikolon (;) ganz wichtig sein, um Befehlszeilen kurzfristig außer Kraft zu setzen, um zum Beispiel zu testen, an welcher Stelle der Activate-Befehl besser aufgehoben wäre.
+
Teste das Addon erneut. Nun arbeitet alles so, wie wir es eigentlich wollten. Ich hoffe, der kleine "Absetzer" zum Bugfinden hat dich nicht zu sehr verwirrt, aber es ist wichtig, darüber Bescheid zu wissen. Nicht alles läuft immer so, wie man es sich wünscht. Du musst ständig umdenken und Fehler finden und dir überlegen, was da gerade wohl falsch läuft. Und dabei ist es wichtig, nicht den Mut zu verlieren. Gerade beim Bugfinden kann das Semikolon (;) ganz wichtig sein, um Befehlszeilen kurzfristig außer Kraft zu setzen, um zum Beispiel zu testen, an welcher Stelle der Activate-Befehl besser aufgehoben wäre.
  
 
Wenn du ein großes Addon planst, kannst du vielleicht größere Scripts in einer eigenen Addon-Datei lagern und somit verschiedene Abläufe prüfen, bevor du sie in deine richtige Mod einbauen willst (z.B. eine "Test-Mod", indem du alle relevanten Sachen in einem einzelnen Raum hast. Z.B. den Schrank von eben, eine Tür, die irgendwie reagieren soll, eine Waffe mit einer Verzauberung usw. Platziere sie alle in einen Raum, um sie schnell testen zu können. Oblivion selbst hat auch einige Test-Räume).
 
Wenn du ein großes Addon planst, kannst du vielleicht größere Scripts in einer eigenen Addon-Datei lagern und somit verschiedene Abläufe prüfen, bevor du sie in deine richtige Mod einbauen willst (z.B. eine "Test-Mod", indem du alle relevanten Sachen in einem einzelnen Raum hast. Z.B. den Schrank von eben, eine Tür, die irgendwie reagieren soll, eine Waffe mit einer Verzauberung usw. Platziere sie alle in einen Raum, um sie schnell testen zu können. Oblivion selbst hat auch einige Test-Räume).
Zeile 436: Zeile 436:
 
== Eine Falle hinzufügen ==
 
== Eine Falle hinzufügen ==
  
Unser Schrank soll einen Zauber auf unseren Spieler aussprechen, wenn er die Antwort falsch auswählt. Als erstes wähle den Zauber, den der Spieler um die Ohren gehauen bekommt. Klicke im Objekt-Fenster auf das "+"-Zeichen bei Magic und dann noch mal bei Spell und wähle Spell an. Es gibt einige Zauber hier, wir nehmen den Zauber Mg05FingerSpell15.
+
Unser Schrank soll einen Zauber auf unseren Spieler aussprechen, wenn er die Antwort falsch auswählt. Als Erstes wähle den Zauber, den der Spieler um die Ohren gehauen bekommt. Klicke im [[Oblivion:Object Window|Objekt-Fenster]] auf das "+"-Zeichen bei Magic und dann nochmal bei Spell und wähle Spell an. Es gibt einige Zauber hier, wir nehmen den Zauber Mg05FingerSpell15.
  
Mit unser schmerzhaften Antwort im Gepäck müssen wir das Script dazu bringen, dass es diesen Zauber auf den Spieler wirkt, wenn er die falsche Antwort gibt.
+
Mit unserer schmerzhaften Antwort im Gepäck müssen wir das Script dazu bringen, dass es diesen Zauber auf den Spieler wirkt, wenn er die falsche Antwort gibt.
  
 
Ändere das Script daher wie folgt:
 
Ändere das Script daher wie folgt:
Zeile 470: Zeile 470:
 
   If ( controlvar == 0 )
 
   If ( controlvar == 0 )
  
     MessageBox "Still weint es, Flügellos flattert es, Zahnlos beist es, Mundlos murmelt es. Was ist es ?",
+
     MessageBox "Still weint es, Flügellos flattert es, Zahnlos beisst es, Mundlos murmelt es. Was ist es ?",
  
 
  "Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
 
  "Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
Zeile 521: Zeile 521:
  
  
OK. Nun haben wir unser erstes richtig "kompliziertes" Script erstellt. Wenn du willst, kannst du das Script ein wenig abwandeln um zu testen, was noch alles möglich ist. Du kannst es natürlich auch noch etwas abändern und an einen eigenen Schrank setzen und somit eine "Mini-Quest" ins Spiel bringen, indem du vielleicht sogar etwas Tolles in den Schrank legst.
+
OK. Nun haben wir unser erstes richtig "kompliziertes" Script erstellt. Wenn du willst, kannst du das Script ein wenig abwandeln, um zu testen, was noch alles möglich ist. Du kannst es natürlich auch noch etwas abändern und an einen eigenen Schrank setzen und somit eine "Mini-Quest" ins Spiel bringen, indem du vielleicht sogar etwas Tolles in den Schrank legst.
  
 
   
 
   
Zeile 528: Zeile 528:
 
== Wie du mehr lernst ==
 
== Wie du mehr lernst ==
  
Nach diesem Tutorial fragst du dich sicher, wie du du mehr über das Scripten lernen kannst. Ein guter Weg wäre es, die Beispielscripts in diesem Tutorial (die du sicherlich nur halbherzig überflogen hast, weil du schnell mit dem "Hauptscript" weiterkommen wolltest) aufmerksamer zu studieren und zu verstehen. Oder schau dir die Scripts an, die schon im Spiel sind. Am besten natürlich Scripts, von denen du weißt, was sie im Spiel tun (weil sie dir schon "begegnet" sind). Suche dir vielleicht ein Script, das ähnlich ist, wie das, was du selber machen willst, kopiere es und ändere es deinen Wünschen entsprechend um (ändere aber den ScriptName). Arbeite die allgemeinen Informationen auf den Funktion-Seiten und deren Unter-Seiten auf dieser Homepage durch. Auch im Forum kannst Du viele Informationen finden. Der Rest ist arbeiten, arbeiten, arbeiten...
+
Nach diesem Tutorial fragst du dich sicher, wie du du mehr über das Scripten lernen kannst. Ein guter Weg wäre es, die Beispielscripts in diesem Tutorial (die du sicherlich nur halbherzig überflogen hast, weil du schnell mit dem "Hauptscript" weiterkommen wolltest) aufmerksamer zu studieren und zu verstehen. Oder schau dir die Scripts an, die schon im Spiel sind. Am besten natürlich Scripts, von denen du weißt, was sie im Spiel tun (weil sie dir schon "begegnet" sind). Suche dir vielleicht ein Script, das ähnlich ist, wie das, was du selber machen willst, kopiere es und ändere es deinen Wünschen entsprechend um (ändere aber den ScriptName). Arbeite die allgemeinen Informationen auf den Funktions-Seiten und deren Unter-Seiten auf dieser Homepage durch. Auch im Forum kannst Du viele Informationen finden. Der Rest ist arbeiten, arbeiten, arbeiten...
  
 
   
 
   
Zeile 535: Zeile 535:
 
== Letzte Hinweise ==
 
== Letzte Hinweise ==
  
Wer sich ein wenig mit dem IF-Befehl beschäftigt hat, wird bemerkt haben, das die Klammern um nicht notwendig sind. Der Autor des Tutorials hat sich aber dazu entschieden diese zum Zweck der Übersichtlichkeit trotzdem anzuwenden. Wer das aber nicht möchte, braucht das auch nicht.
+
Wer sich ein wenig mit dem IF-Befehl beschäftigt hat, wird bemerkt haben, dass die Klammern nicht notwendig sind. Der Autor des Tutorials hat sich aber dazu entschieden, diese zum Zweck der Übersichtlichkeit trotzdem anzuwenden. Wer das aber nicht möchte, braucht das auch nicht.
  
Zum Schluss heißt es noch GhanBuriGhan für sein Original "Morrowind Scripting für Dummies" zu danken, das die Basis für dieses Tutorial war.
+
Zum Schluss heißt es noch, GhanBuriGhan für sein Original "Morrowind Scripting für Dummies" zu danken, das die Basis für dieses Tutorial war.
 
   
 
   
  
Zeile 551: Zeile 551:
 
[[ob:Mein erstes Script|Mein erstes Script ]]  
 
[[ob:Mein erstes Script|Mein erstes Script ]]  
  
 +
{{Übersetzung|constwiki|Scripting_Tutorial:_My_Second_Script}}
  
[[Kategorie: Tutorials|Script, mein zweites ]]
+
 
[[Kategorie: Scripts|Script, mein zweites]]
+
[[Kategorie: Scripterstellung|Script, mein zweites]]

Aktuelle Version vom 24. März 2010, 22:56 Uhr

Erste Hinweise

Während das erste Script-Tutorial ein guter Anfang war, war es doch kein besonders großes Beispiel, was die Script-Sprache in Oblivion alles tun kann. Es war ein guter Einstieg für all diejenigen, die noch niemals eine Programmier- oder Scripting-Sprache gesehen haben. Jedoch wollen wir nun etwas tiefer in die Materie eintauchen, um zu zeigen, welche unglaublichen Möglichkeiten das Scripting dem Modder bringt.

Dieses Tutorial wird zum größten Teil von GhanGuriGhan's Morrowind Scripting für Dummies abgeleitet, alle Anerkennung geht an GhanGuriGhan für seine gute Arbeit beim Original-Tutorial.

Es ist etwas mehr als eine kleine Einführung ins Oblivion-Scripting, also sind gewisse Grundvoraussetzungen von Nöten, wie z.B. das Abarbeiten von "Mein erstes Script" und das Auskennen mit dem Editor.

Falls dir irgendwelche Punkte hier unklar sind, solltest du das besagte erste Tutorial durcharbeiten und ggf. den Links folgen, die gewisse Seiten oder Arbeitsvorgänge erläutern.

Wenn du dich bereit fühlst, dann warte nicht lange. Bereite den TES CS wie gewohnt vor und mach dich an die Arbeit!


Was ist ein Script?

Scripts sind im Grunde genommen Teile von Code, die in einer speziellen Scripting-Sprache geschrieben werden (Wir nennen es TES-Script von hier an). Diese kleinen "Programme" laufen während des Spiels an bestimmten Stellen ab und können verschiedene Sachen im Spiel bewirken. Sie schalten Vorgänge, kontrollieren Zeit und Ort, sorgen dafür, dass Dinge oder Kreaturen sichtbar werden, verschwinden oder sich bewegen. Sie geben Nachrichten an den Spieler weiter, ändern den Status und auch das Wetter - die Möglichkeiten sind nahezu grenzenlos.

Das TES-Script ist eine einmalige Script-Sprache, aber kann nicht außerhalb des TES CS genutzt werden. Eine Sript-Sprache hat einige Einschränkungen entgegen einer "echten" Programmiersprache wie z.B. C++.

Der Einsatz von TES-Script ist begrenzt - Glaube nicht, dass du ein Programmierer sein kannst, wenn du diese Script-Sprache beherrschst. Allerdings wäre es möglich, mit der Script-Sprache neue Dinge zu erreichen, die im Spiel vorher vielleicht nicht möglich waren. Aber du kannst das TES-Script-Wissen nicht dazu gebrauchen, um z.B. eine Textverarbeitung zu programmieren.

TES-Script ist auch keine SDK (Software Development Kit - Software Entwicklungskit), das dir Änderungen am Grundspiel von Oblivion ermöglicht. Das ist auch der Grund, warum du mit dem TES-Script z.B. keine neuen Wetter-Effekte einbauen kannst. Das wird woanders geregelt und du brauchst ein ganz anderes Wissen, um das zu tun.

Es ist einer Interpreter-Sprache, keine Compilierte. Der Code braucht ein separates Programm (in diesem Fall Oblivion), um zu laufen - Anders als compilierter Code, der selbstständig arbeitet wie eine EXE-Anwendung.

TES-Script ist nicht Case Sensitive. Das bedeutet, dass der Befehl "player.getpos z" genauso arbeitet wie der Befehl "Player.GetPos.z" und auch wie "PlAyEr.GetPOs z" oder wie jede andere verrückte Groß-/Kleinschreibung. Die meisten Programmierer benutzen das zweite Format, weil es am Übersichtlichsten ist. Andere bevorzugen die erste Art, weil sie am einfachsten zu schreiben ist. Der einzige Punkt, wo du auf Groß-/Kleinschreibung achten musst, ist, wenn du eine Nachricht auf dem Bildschirm ausgeben willst (bzw. bei allem, was der Spieler lesen kann, wie z.B. Namen, Orte usw.). Suche dir eine Möglichkeit aus, wie du in Zukunft schreiben willst. Nimm nur nicht die dritte... möglichst. Ich persönlich bevorzuge ebenfalls die zweite Art.



Was können Scripte tun?

Scripts in Oblivion dienen dazu, um das Spiel dynamisch an dem Verhalten des Spielers zu halten. Du kannst Scripts benutzen, um komplexe Quests zu steuern. Du kannst Script erstellen, um eigene Items zu erstellen, die eine Aktion machen, die sie mit regulären Verzauberungen nicht tun würde. Du kannst Scripts dazu benutzen, Fallen zu erstellen. Du kannst Scripts dazu benutzen, das Verhalten von NPCs und Kreaturen zu verändern. Erinnerst du dich an das Charakter-Erstellen in Oblivion? Im Grunde wird das von einer Anzahl Scripts gesteuert. Schon irgendwelche Quests gemacht? Auch sie werden durch Scripts gesteuert. Also lautet die kurze Antwort: eine Menge. Ohne Scripting kann man im Editor recht wenig machen, vom Quest-Erstellen ganz abgesehen.



Was Scripts NICHT können

Die TES-Script Sprache ist in ihren Fähigkeiten beschränkt - Du kannst nur das tun, wozu du auch eine Funktion hast. Und manchmal sind die möglichen Dinge nicht das, was du dir gerade erhoffst. In manchen Fällen kannst du die Beschränkungen durch Tricks umgehen, aber erwarte keine Wunder. Manche Sachen sind Hard-Coded und können nicht direkt oder indirekt durch Scripts beeinflusst werden.



Bevor wir loslegen können

Wenn du ein absoluter Einsteiger ins Scripting bist und gerade das "Mein erstes Script"-Tutorial abgeschlossen hast, wirst du wahrscheinlich noch kein großer Script-Schreiber sein und glaubst vielleicht auch noch nicht so recht daran, dass es dir jemals gelingen wird. Das wird es auch nicht, wenn du dich nicht auf den Hosenboden setzt und immer fleißig übst.

Dieses Tutorial soll dir nun weiter helfen und dich im Scripting weiterbringen, damit du selber Ideen und Arbeitsvorgänge entwickelst und irgendwann scriptest, als hättest du nie etwas anderes gemacht. Das ist natürlich übertrieben, aber versuchen wir es einfach.



Lasst uns beginnen

Falls es nicht schon längst geschehen ist, öffnen wir den Script-Editor (Für alle die wieder mal geschlafen haben: Starte TES CS, öffne die Oblivion.esm Datei und wähle Button-script.jpg oder "Edit Script" aus dem Gameplay-Menü).

Das Script-Fenster

Näheres zum Script-Fenster und wie man es öffnet findet man unter [Oblivion:Script Editor Window|Script-Editor]]

Der Script-Editor ist sehr einfach gehalten und sollte recht einleuchtend sein. Alle, die sich noch nicht auskennen, sollten sich die Beschreibung zu dem [Oblivion:Script Editor Window|Script-Editor]]-Fenster durchlesen.

Bedenke, dass beim Speichern von Scripts das Script nicht irgendwo auf die Festplatte gespeichert wird, sondern in der Plugin-Datei. Das bedeutet auch, dass wenn du deine Plugin-Datei neu laden musst, auch die ungespeicherten (nicht kompilierten) Scripts gelöscht sind. Wenn du also ein Script geschrieben und gespeichert hast, speichere auch gleich die ganze Plugin-Datei ab, damit das Script auch wirklich gesichert ist.

Außerdem ist zu beachten, wenn du beim Scripten mittendrin den Speichern-Button klickst, um deine Arbeit zwischenzuspeichern (wie z.B. bei einem Text-Editor), dass die nachfolgenden Änderungen nicht abgespeichert werden, wenn du sie nicht manuell selber erneut speicherst! Wenn du einfach das Editor-Fenster schließt, werden die Änderungen nicht abgespeichert. Du musst sie IMMER manuell speichern. Das wurde vermutlich deswegen so gemacht, damit die Entwickler beim Schreiben der vielen Scripts nicht ständig irgendwelche "Warnfenster" wegklicken mussten.

Mit den Pfeiltasten kannst du dich zwischen den Scripts hin- und herbewegen. Und zwar in alphabetischer Reihenfolge. Wenn du eigene Scripts entwickelst, kann es von Vorteil sein, ihnen einen gleichen Präfix zu geben. Zum Beispiel deine Initialen (z.B. AA_MeinScript1), um deine Scripts immer alle beieinander zu haben.

Über die anderen Buttons erfährt man mehr im "Script Edit"-Teil.

Du kannst übrigens deine Scripts auch in einem Standard-Editor (z.B den Windows Editor) schreiben und dort separat abspeichern, danach kopieren und in den Script-Editor einfügen (mit den Standard-Tasten Strg+C (Kopieren), Strg+V (einfügen)). Damit kannst du vielleicht wichtige Scripts abspeichern, die du in anderen Addons wieder verwenden willst oder eben sicher gehen, dass deine Scripts zusätzlich abgespeichert sind.



Was wollen wir schaffen?

Bevor wir unser Tutorial-Script schreiben, wollen wir uns erstmal überlegen, was es tun soll. In diesem Tutorial wollen wir einen "Rätsel-Schrank" machen. Der Schrank stellt ein Rätsel und nur die richtige Antwort wird den Schrank öffnen. Wenn der Spieler die falsche Antwort sagt, geht eine Falle los, die den Spieler verletzt und der Schrank ist für immer verschlossen.

Das hört sich jetzt kompliziert an, aber wir werden das Schritt für Schritt durchgehen.



Ein Script schreiben

Wenn das [Oblivion:Script Editor Window|Script-Editor]]-Fenster geöffnet ist, wähle Script->New, um ein neues Script zu beginnen. Die graue Fläche sollte nun weiß sein (sofern du nicht vorher schon rumgefummelt hast, allerdings sollte sie dann jetzt trotzdem weiß sein). Setze den Script Type auf "Objekt": Button-scrptscripttype.jpg Klicke nun in die weiße Schreibfläche: dort wird unser Script geboren.

Die ersten Zeilen

Als erstes muss ein jedes Script einen im Spiel einzigartigen Namen bekommen, damit es hinterher angesprochen oder einfach wieder gefunden werden kann. Das wird durch den Befehl "ScriptName" erreicht. Der dahinter stehende Name ist dann der Scriptname. Unter dem wird es dann auch automatisch abgespeichert. Schreibe als nun in den Editor folgende Zeile:


<tesscript>ScriptName RaetselSchrankScript</tesscript>


Beachte, dass es keine Leerzeichen oder Unterstriche in dem Namen gibt. Dein Script-Name muss ein einziges Wort sein, also benutze keine Leerzeichen. Außerdem erkennt Oblivion die Unterstriche beim alphabetischem Sortieren nicht an. Du kannst zwar Unterstriche benutzen, um deinen Namen etwas übersichtlicher zu gestalten, aber hinterher beim Auflisten wird dieser Unterstrich nicht mehr zu sehen sein, sondern das Wort zusammen geschrieben sein.

Fortgeschrittene Information: Oblivion unterstützt etwas das sich Aliasing nennt. Das ist eine Art Abkürzung für Befehle. Z.B. Wäre "ScriptName" dann "scn" oder "ForceActorValue" würde reichen "ForceAV". Diese festgelegten Abkürzungen gelten genauso wie das ausgeschriebene Wort. In diesem Tutorial nutzen wir diese Abkürzungen aber nicht, sei bitte dennoch nicht überrascht, wenn du diese Abkürzungen mal in anderen Scripts siehst. Damit kann man sich eine Menge Schreibarbeit sparen).

Wie du ja weißt, ist TES-Script nicht Case Sensitive, es ist also egal, ob du die Befehle "scriptname", SCRIPTname" oder "ScRiPtNamE" schreibst. Gewöhne dir aber an, entweder nur klein, oder - so wie ich es auch bevorzuge - wie oben angegeben zu schreiben. Ist übersichtlicher.

Versuche mal dein Script zu speichern. Es wird nichts besonderes passieren, aber wenn du auf "Open" Button-data.jpg klickst, kannst du dein Script schon in der Liste auswählen. Es ist nun das kleinste Script im Spiel - aber es tut auch nichts.



BEGIN und END

Die Begin und End Befehle bezeichnen den Beginn und das Ende eines Blocks im Script. Blöcke sind Absätze mit Code, der unter vorgegebenen Umständen abgearbeitet wird. Als Beispiel: "Begin GameMode" definiert einen Block, dessen Inhalt innerhalb jedes Frames abgearbeitet wird, in denen sich der Spieler im Spiel (und nicht in einem Menü) befindet.

Für unsere Zwecke brauchen wir einen OnActivate-Block: ein Block, der abgearbeitet wird, wenn unser Schrank aktiviert (in diesem Fall geöffnet) wird, aber nicht zu anderen Zeiten (Es wäre ärgerlich, wenn der Spieler in jedem Frame unsere Frage bekäme oder wenn ein NPC stirbt, beide Versionen wären durch Änderungen im Begin-Befehl möglich).

Also tippe die folgenden Zeilen in dein Script ein:


<tesscript>Begin OnActivate

  ; hier geben wir gleich ein, was passiert, wenn der Schrank geöffnet wird

End</tesscript>


Speichere jetzt erneut. Das Script tut nun auch noch nichts, aber wir haben die Bedingung festgelegt, unter welchen Voraussetzungen es nichts tut. Es gibt aber zunächst einiges zu beachten. Erstens; Wir haben den aktuellen Block beendet, bevor wir einen neuen begonnen haben - Nicht so wichtig, wenn es nur einen Block gibt, aber wenn dieses Script komplizierter wird, brauchen wir mehrere Blöcke in einem einzelnen Script. Das andere ist das Semikolon ( ; ), das dafür sorgt, dass der gesamte Text dahinter vom Spiel ignoriert wird. Damit kann man Kommentare ins Script einfügen (oder vorübergehend Programmzeilen außer Kraft setzen). Egal was du hinter einem Semikolon eingibst, es wird vom Programm ignoriert. Benutze Kommentare, um dein Script zu kommentieren und hinterher vielleicht schneller auf Blöcke oder Arbeitsweisen aufmerksam zu werden (Und - auch wenn es dich nervt - anderen zu zeigen, was der Block bewirkt, damit sie auch mal so gut werden wie du). Wenn du mehr als eine Zeile für deinen Kommentar brauchst, musst du jede Zeile mit einem Semikolon beginnen (, in denen dein Kommentar steht).



Text anzeigen und Entscheidung des Spielers bekommen

Nun wollen wir unseren Schrank dazu bringen, dem Spieler ein Rätsel aufzugeben. Um das zu tun, benutzen wir die MessageBox Funktion. Das dürfte euch schon bekannt vorkommen, denn es ist ähnlich wie in "Mein erstes Script", nur dass wir dort den Message-Befehl benutzt haben, um eine Nachricht anzuzeigen. MessageBox hingegen gibt uns die Möglichkeit, ein richtiges Fenster anzuzeigen, in dem der Spieler eine Antwort auswählen kann. Leider bietet Oblivion (genau wie Morrowind) keine Möglichkeit, um Text einzugeben, um die Antwort vielleicht "per Hand" einzugeben. Also geben wir dem Spieler mehrere Antworten zur Auswahl. Die Zeilen dazu (gehört in unseren OnActivate-Block) sehen wie folgt aus:


<tesscript>MessageBox "Still weint es, flügellos flattert es, zahnlos beißt es, mundlos murmelt es. Was ist es?", "Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"</tesscript>


Wichtig: Beachte, dass der oben angegebene Befehl im Script-Editor in einer Zeile eingegeben werden muss!

Der erste String (der Text zwischen den ersten Anführungsstrichen) ist der Text, der in der Box angezeigt wird. Die anderen Texte, die durch Kommas getrennt sind, sagen dem Spiel, dass es "Buttons" aus den Texten macht, um eine Auswahl zu treffen.

Aber wie gewährleisten wir, dass das Rätsel nur einmal gefragt wird und nicht jedes Mal, wenn wir versuchen, den Schrank zu öffnen? Damit kommen wir an einen sehr wichtigen Punkt: die Verwendung der "Do Once"-Kondition und Status-Variablen. Viele Script-Anfänger haben Probleme damit, zu verstehen, wie Scripts ausgeführt werden und wie sie entsprechend strukturiert werden sollten. Also werfen wir ein Blick darauf:



Wie Object-Scripts ausgeführt werden

Jedes Script, das an ein Objekt gehängt ist oder an einen NPC (object script), wird in jedem Frame ausgeführt, in dem das Objekt in der aktuellen Zelle aktiv ist (in Interiors/Innenräumen ist es nur die aktuelle Zelle, außerhalb ist es die Zelle, in der sich der Spieler befindet, sowie die an diese Zelle angrenzenden Zellen). Also wird das komplette Script (und nicht nur eine Zeile daraus) etwa 10-60 mal in der Sekunde ausgeführt - je nachdem, wie schnell der Computer das Spiel darstellt (Frames in der Sekunde - FpS). Es ist am Leichtesten zu merken, wenn man sich vorstellt, dass jedes lokale Script in einer großen "WhileLoop"-Schleife eingehüllt ist.


<tesscript> while (Objekt in einer aktiven Zelle ist)

 [Dein Script code]

endwhile </tesscript>


Das ist der Grund, warum das folgende Script ununterbrochen Nachrichten auswirft (Wenn es an ein Objekt oder einen NPC in der selben Zelle wie der Spieler gebunden ist). Versuche es, wenn du unbedingt willst:


<tesscript>ScriptName HorribleMessageScript

Begin GameMode

 MessageBox "Tausende nichtssagende Nachrichten"

End</tesscript>


Dieses Beispiel ist relativ harmlos, aber stell dir mal vor, was passieren würde, wenn diese Zeile ein Item ins Spieler-Inventar hinzufügt oder einen Gegner direkt neben ihm platziert... In jedem Frame... Was für ein Gemetzel...

Aus diesem Grund sind "Do Once"-("Tu es einmal"-)-Konstrukte die beste Methode, etwas auszuführen und kommt beim Scripten in Oblivion am meisten vor.

Jetzt aber wieder zurück an unser Tutorial-Script (Du hast ja hoffentlich nicht die beiden obigen Codes hinzugefügt?!): Wir müssen jetzt eine Variable deklarieren, damit wir sicherstellen können, dass die Nachricht nur einmal angezeigt wird.

Ändere das Script wie folgt um (bzw. ergänze es):


<tesscript> ScriptName RaetselSchrankScript

Short controlvar

Begin OnActivate

 If ( controlvar == 0 )
   MessageBox "Still weint es, Flügellos flattert es, Zahnlos beist es, Mundlos murmelt es. Was ist es ?", 

"Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"

   Set controlvar to 1
 EndIf

End</tesscript>


Und speichere das Script erneut. Achte darauf, dass der MessageBox-Befehl (mit allen dahinter liegenden Texten und Auswahlmöglichkeiten) in einer Zeile im Script ist! Unterbreche die Zeile nicht, sonst funktioniert es nicht. Es lässt sich hier leider nicht anders darstellen. Es sollte in etwa so aussehen (der weitere Text hinter dem "MessageBox"-Befehl ist in der selben Zeile):

Tut-Script2-01.jpg


Wieder einmal wollen wir die Veränderungen besprechen. Der "IF"-Befehl wird hier dazu benutzt, um zu überprüfen, ob eine bestimmte Bedingung zutrifft und wenn das so ist, die nachfolgenden Befehle bis zu dem "Endif"-Befehl abzuarbeiten.

Das "==" vergleicht, ob der Ausdruck auf der linken Seite (in unsrem Beispiel die Variable "controlvar") absolut gleich ist mit dem Ausdruck auf der rechten Seite (in unserem Fall 0). Wenn du am Ende den "Endif"-Befehl vergisst, kann das Script nicht korrekt ausgeführt werden und du bekommst eine Fehlermeldung, wenn du speicherst.

"Short controlvar" deklariert eine neue Variable, die wir "controlvar" nennen möchten im Format "Short". Für den Moment reicht es eigentlich zu wissen, dass eine Short-Variable dazu da ist, um positive oder negative Ganzzahlen aufzunehmen (Wer mehr wissen will, kann sich den entsprechenden Eintrag dazu auf der Homepage durchlesen). Eine Variable ist ein "Platzhalter", der verschiedene Werte annehmen kann.

Der Set-Befehl ist ebenfalls neu, aber nicht schwer zu verstehen: Es setzt eine Variable auf einen anderen Wert, in unserem Fall wird die Variable "controlvar" auf den Wert 1 gesetzt. Alle Variablen sind auf "0" gesetzt, wenn sie deklariert werden. Auf diese Weise wird nun gewährleistet, dass die Variable beim ersten Aufruf 0 ist und mit dem If-Befehl übereinstimmt (ist WAHR) und noch während der Schleife auf 1 gesetzt wird und somit beim nächsten Durchlaufen die If-Schleife UNWAHR ist, weil der Wert dann 1 beträgt. Daher wird dieses Script nur einmal ausgeführt (do once).

Um das alles noch etwas zu durchleuchten, hier also mal eine "Übersetzung" des Script-Teiles "OnActivate".

Bei der Aktivierung des Objektes: Sofern die Variable "controlvar" exakt dem Wert Null entspricht, Öffne das Message-Box Fenster mit dem Text "(...)" und den Antwortmöglichkeiten "(...)", "(...)", ... Setze die Variable "controlvar" auf den Wert 1. Ende der Bedingung.

Der erste Test

Speichern und die Mod vorbereiten: Nun ist unser Script soweit, dass es etwas ausführen kann, also testen wir es.


  1. Speichere das Script und schließe den Script-Editor (vorher speichern, sonst wird nur das Fenster geschlossen, ohne die Änderungen zu speichern!)
  1. Schaue im Objekt-Fenster nach dem folgenden Ordner: "WorldObjects > Container > Clutter" und finde dort das Objekt "CupboardFoodLower".
  1. Nun klicke es mit der rechten Maustaste an und wähle aus dem erscheinenden Kontext-Menü den Eintrag "Edit". Das öffnet das Einstellungsfenster.
  1. Im Script-DropDown-Menü wähle den Eintrag "RaetselSchrankScript" (in der Regel reicht es schon, wenn du auf die Dropdown-Liste klickst, damit sie sich öffnet und dann die "R-Taste" drückst, das bringt dich gleich zu allen Einträgen die mit einem 'R' beginnen).
  1. Klicke "OK" und speichere die Mod und beende das TES CS (auf "guten" Rechnern kann der TES auch im Hintergrund weiterarbeiten).


WICHTIG: Sei dir bewusst, was wir gerade getan haben. Ein Objekt zu verändern, ohne die ID zu verändern, kann bei manchen Objekten zu schrecklichen Folgen führen, weil nun ALLE Schränke dieser Art das Script ausführen! Tu dieses aber niemals in einer richtigen Mod. In dem Fall solltest du erst eine Kopie des Schrankes anlegen und nur diesem einen Schrank das Script anlegen. Für unsere Testzwecke ist das jetzt aber egal (es sei denn, du baust das Script gerade in eine Mod von dir mit ein).

Das Script im Spiel:

  1. Nun starte das Spiel und wähle "Spieldateien" und aktiviere deine Mod. Starte Oblivion und lade einen Speicherstand.
  1. Wenn das Spiel geladen ist, öffne die Konsole mit der "^" Taste (bzw. Die Taste links von der 1-Taste). Schreibe nun in die Konsole:

player.coc "AleswellInn"


Bestätige mit der Eingabetaste, falls es nicht ohnehin eine Reflexbewegung war.

Du wirst dich anschließend im Aleswell-Gasthof wieder finden und sogleich von einigen unsichtbaren Leuten begrüßt werden (sofern du die dazugehörige Quest nicht schon abgeschlossen hast). Es hat also nichts mit der Mod zu tun, es ist eine Quest. Wir wenden uns nun also dem Schrank zu, der an einer Wand steht. Der Name dürfte einfach nur "Schrank" lauten. Schließe ggf. das Kommando-Fenster mit einem erneuten Druck auf die ^-Taste. und gehe zum Schrank an der Wand links.



Wenn du den Schrank aktivierst (also öffnest), wird sich ein Fenster öffnen, in dem der von dir eingegebene Text erscheint, sowie die vier Auswahlmöglichkeiten.

Wenn du auf irgendeine Antwort klickst, wird sich das Fenster einfach schließen und es wird nichts weiter passieren, wenn du den Schrank ein weiteres Mal aktivierst, wird gar nichts mehr passieren. Das ist sehr gut, denn es zeigt uns, dass unsere Variable dafür sorgt, dass das Fenster nur einmal angezeigt wird. Dass der Schrank sich jetzt an dieser Stelle nicht öffnet, liegt daran, dass wir noch keinen Aktivierungs-Befehl in dem Script haben, aber das kommt gleich noch.

Beende nun Oblivion wieder und kehre zum TES CS zurück.

Spielerauswahl, Bugs&Fixes

Den Spieler eine Auswahl treffen lassen:

Wir müssen jetzt herausfinden, welche Antwort der Spieler ausgewählt hat und das Script muss angemessen auf die falsche oder richtige Antwort reagieren.

Die Funktion, um die Antwort eines Auswahlfensters herauszufinden ist "GetButtonPressed". Diese Funktion gibt eine Zahl zurück, die den Auswahlmöglichkeiten in der Message-Box entsprechen. Es gibt den Wert "0" für den ersten Button zurück (in unserem Fall ist es die Fledermaus) und 1, 2, 3 usw. für die folgenden Buttons/Auswahlmöglichkeiten. Die Reihenfolge entspricht dabei der, wie du sie in dem MessageBox-Befehl angegeben hast. Bis die Antwort angeklickt wird, wird der Wert "-1" zurückgegeben, also sieh dich vor, auch diese Zahl als Möglichkeit zu nutzen (der Spieler hätte keine Chance zu antworten).

Die "Activate"-Funktion wird unseren Schrank öffnen. Activate führt einfach gesprochen die Standard-Aktion eines Objektes aus, sobald der Befehl im Script auftaucht - Türen öffnen sich, NPCs werden einen Dialog anfangen usw.

Die nächste Erweiterung in unserem Script zeigt, wie man eine Kontroll-Variable dazu benutzen kann Oblivion dazu zu bringen, eine Funktion nach der anderen auszuführen, obwohl das ganze Script während jedem Frame des Spiels ausgeführt wird. Erhöhe einfach den "Ausführungswert" der Kontroll-Variable und teste es in einer Serie von IF-ELSEIF-Befehlen. Das ist ein sicherer Weg für das Scripten in Oblivion. Es ist nicht immer erforderlich, aber es ist sicher.

(Um das etwas verständlicher zu machen: Man kann durch das Erhöhen der ControlVar erreichen, dass manche IF-Befehle nur ausgeführt werden, wenn der Wert nicht mehr 1 sondern z.B. 2 ist. Die Schleife also schon einmal durchlaufen ist. In unserem Beispiel könnte man zum Beispiel unter ControlVar=2 (der Spieler ruft den Schrank erneut auf) eintragen, dass der Schrank schweigt und sich nicht öffnen lässt).

Bitte ändere das Script wie folgt um:


<tesscript> ScriptName RaetselSchrankScript

Short controlvar

Short button

Begin OnActivate

 If ( controlvar == 0 )
   MessageBox "Still weint es, Flügellos flattert es, Zahnlos beisst es, Mundlos murmelt es. Was ist es ?",
 "Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
   Set controlvar to 1
 ElseIf ( controlvar > 1 )
   Activate
 EndIf

End

Begin GameMode

 If ( controlvar == 1 )
   Set button to GetButtonPressed
   If ( button == -1 )
     Return
   ElseIf ( button == 2)
     MessageBox "Deine Antwort ist richtig."
     Activate
     Set controlvar to 2
   Else
     MessageBox "Deine Antwort ist falsch!"
     Set controlvar to -1
   EndIf
 EndIf

End

</tesscript>

Werfen wir einen Blick auf den neuen GameMode-Block, der mit einem "IF"-Befehl startet. Wir haben die controlvar auf 1 gesetzt, sobald der Schrank aktiviert wurde. Aber OnActivate durchläuft das Script nur, so lange der Schrank aktiviert ist. Wir müssen also den GameMode-Block benutzen, um die Antwort des Spielers auszuwerten. Nun testen wir, welche Auswahl getroffen wurde. Wir tun das, indem wir der neuen Variable "Button" den Wert von GetButtonPressed zugewiesen haben. Während das Script weiter läuft, und während es so aussieht, als sei das Spiel pausiert und wartet auf eine Antwort, testen wir zunächst, ob noch keine Auswahlmöglichkeit gewählt wurde. RETURN sagt dem Spiel, dass es das Script vorerst noch nicht weiter ausführen soll.

Unsere richtige Antwort ist "Wind", das auf Button 2 gelegt ist (erinnere dich, die erste Auswahlmöglichkeit ist Button 0). Wenn der Spieler also Button 2 klickt, wird dem Spieler angezeigt, dass er die richtige Antwort geklickt hat und das Inventar des Schrankes öffnet sich, wie es ganz gewöhnlich ist (so wie der Inhalt des Schrankes). Für alle anderen Werte der Button-Variable heißt es nun, dass es die falsche Antwort war, also können wir einen ELSE-Befehl benutzen. In diesem Fall sagen wir dem Spieler, dass es die falsche Antwort war. Natürlich kann man die Texte noch "ausschmücken". Der Schrank wird in diesem Fall auch nicht geöffnet.

Nun schauen wir uns eine kleine Neuerung am Anfang des Scriptes an:


<tesscript>Begin OnActivate

 If ( controlvar == 0 )
   MessageBox "Still weint es, Flügellos flattert es, Zahnlos beisst es, Mundlos murmelt es. Was ist es ?",

"Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"

   Set controlvar to 1
     ElseIf ( controlvar > 1 )
   Activate
 EndIf

End</tesscript>


Das bedeutet, dass der Schrank in Zukunft nur dann aufgeht, wenn die controlvar-Variable größer als 1 ist. Erinnere dich an unseren Plan: Wenn der Spieler die richtige Antwort gesagt (geklickt) hat, soll er den Schrank immer öffnen können. Wenn der Spieler also die falsche Antwort sagt, wird controlvar auf -1 gesetzt, so wird er niemals fähig sein den Schrank zu öffnen. Aber wenn er die richtige Antwort wusste, wird controlvar auf den Wert 2 gesetzt und von nun an kann der Spieler den Schrank so oft er will öffnen, ohne dass er das Rätsel erneut lösen muss. Speichere erneut und auch das Plugin und starte Oblivion, um das Ganze wieder zu testen.



Deine ersten Bugs und die Fixes

Wenn du das Plugin testest, wird dir auffallen, dass einige Dinge nicht so ablaufen, wie du es geplant hast. Wenn du die falsche Antwort gibst, wird der Schrank für immer verschlossen, aber wenn der Spieler die richtige Antwort wählt, erscheint das Inventar des Schrankes und die MessageBox zur selben Zeit auf dem Bildschirm. Die MessageBox muss geschlossen werden, bevor irgendwas geschehen kann, aber es wird durch das Inventar verdeckt.

Herzlichen Glückwunsch, du hast deinen ersten Bug im Spiel (Fehler).

Versuchen wir doch mal die folgenden Veränderungen: <tesscript>

 If ( controlvar == 1 )
   Set button to GetButtonPressed
   If ( button == -1 )
     Return
   ElseIf ( button == 2)
     MessageBox "Deine Antwort ist richtig."
     Set controlvar to 2
   Else
     MessageBox "Deine Antwort ist falsch!"
     Set controlvar to -1
   EndIf
 ElseIf ( controlvar == 2 )
   Activate
 EndIf</tesscript>


Schau dir an, wie wir den Actvate-Befehl in die Sektion, die controlvar auf 2 testet, verschoben haben. Das sorgt für einen saubereren Ablauf von Anzeige der MessageBox und dem Öffnen des Schrankes. Solche sauberen Abläufe sind sehr wichtig beim Scripten, damit die Ereignisse so laufen, wie man sie als Spieler gewohnt ist. Versuche niemals zu viele Dinge auf einmal auszuführen. Nun speichere wieder und teste es erneut.

Wunderbar. Nun öffnet das Inventar genau dann, wenn wir es wollen. Aber was ist das? Wir können das Inventar nicht schließen?! Schauen wir uns das Script noch einmal genauer an. controlvar ist auf 2 gesetzt und verbleibt so, bis wir es wieder ändern. Daher bleibt das Spiel nun kontinuierlich im "Activate"-Status. Deswegen können wir das Inventar des Schrankes auch nicht schließen, es wird sofort wieder geöffnet. Blöde Technik, oder?

Also ändern wir den letzten Teil des Scriptes erneut:


<tesscript>ElseIf ( controlvar == 2 )

   Activate
   Set controlvar to 3
 EndIf</tesscript>


Teste das Addon erneut. Nun arbeitet alles so, wie wir es eigentlich wollten. Ich hoffe, der kleine "Absetzer" zum Bugfinden hat dich nicht zu sehr verwirrt, aber es ist wichtig, darüber Bescheid zu wissen. Nicht alles läuft immer so, wie man es sich wünscht. Du musst ständig umdenken und Fehler finden und dir überlegen, was da gerade wohl falsch läuft. Und dabei ist es wichtig, nicht den Mut zu verlieren. Gerade beim Bugfinden kann das Semikolon (;) ganz wichtig sein, um Befehlszeilen kurzfristig außer Kraft zu setzen, um zum Beispiel zu testen, an welcher Stelle der Activate-Befehl besser aufgehoben wäre.

Wenn du ein großes Addon planst, kannst du vielleicht größere Scripts in einer eigenen Addon-Datei lagern und somit verschiedene Abläufe prüfen, bevor du sie in deine richtige Mod einbauen willst (z.B. eine "Test-Mod", indem du alle relevanten Sachen in einem einzelnen Raum hast. Z.B. den Schrank von eben, eine Tür, die irgendwie reagieren soll, eine Waffe mit einer Verzauberung usw. Platziere sie alle in einen Raum, um sie schnell testen zu können. Oblivion selbst hat auch einige Test-Räume).

Aber unser Script ist ja noch nicht fertig. Wir wollten ja noch eine Falle einbauen. Auf geht's:



Eine Falle hinzufügen

Unser Schrank soll einen Zauber auf unseren Spieler aussprechen, wenn er die Antwort falsch auswählt. Als Erstes wähle den Zauber, den der Spieler um die Ohren gehauen bekommt. Klicke im Objekt-Fenster auf das "+"-Zeichen bei Magic und dann nochmal bei Spell und wähle Spell an. Es gibt einige Zauber hier, wir nehmen den Zauber Mg05FingerSpell15.

Mit unserer schmerzhaften Antwort im Gepäck müssen wir das Script dazu bringen, dass es diesen Zauber auf den Spieler wirkt, wenn er die falsche Antwort gibt.

Ändere das Script daher wie folgt:


<tesscript>Else

     MessageBox "Deine Antwort ist falsch!"
     Cast Mg05FingerSpell15 Player
     Set controlvar to -1
   EndIf</tesscript>


Beachte die Cast-Funktion. (Fortgeschrittene Scripting-Information: CAST braucht ein aufrufendes Objekt, damit es funktioniert. Wir haben keines angegeben, weil unser Script ein Objekt-Script ist und an ein Objekt im Spiel gehängt wird. Das Script wird deswegen die aufrufende Referenz (in diesem Fall den Schrank) zum aufrufenden Objekt machen).

Nun sollte dein Script so aussehen:

<tesscript> ScriptName RaetselSchrankScript

Short controlvar

Short button

Begin OnActivate

 If ( controlvar == 0 )
   MessageBox "Still weint es, Flügellos flattert es, Zahnlos beisst es, Mundlos murmelt es. Was ist es ?",
"Fledermaus", "Alte Frau", "Wind", "Geistererscheinung"
   Set controlvar to 1
 ElseIf ( controlvar > 1 )
   Activate
 EndIf

End

Begin GameMode

 If ( controlvar == 1 )
   Set button to GetButtonPressed
   If ( button == -1 )
     Return
   ElseIf ( button == 2)
     MessageBox "Deine Antwort ist richtig."
     Set controlvar to 2
   Else
     MessageBox "Deine Antwort ist falsch!"
     Cast Mg05FingerSpell15 Player

     Set controlvar to -1
   EndIf
 ElseIf ( controlvar == 2 )
   Activate
   Set controlvar to 3
 EndIf

End </tesscript>


OK. Nun haben wir unser erstes richtig "kompliziertes" Script erstellt. Wenn du willst, kannst du das Script ein wenig abwandeln, um zu testen, was noch alles möglich ist. Du kannst es natürlich auch noch etwas abändern und an einen eigenen Schrank setzen und somit eine "Mini-Quest" ins Spiel bringen, indem du vielleicht sogar etwas Tolles in den Schrank legst.



Wie du mehr lernst

Nach diesem Tutorial fragst du dich sicher, wie du du mehr über das Scripten lernen kannst. Ein guter Weg wäre es, die Beispielscripts in diesem Tutorial (die du sicherlich nur halbherzig überflogen hast, weil du schnell mit dem "Hauptscript" weiterkommen wolltest) aufmerksamer zu studieren und zu verstehen. Oder schau dir die Scripts an, die schon im Spiel sind. Am besten natürlich Scripts, von denen du weißt, was sie im Spiel tun (weil sie dir schon "begegnet" sind). Suche dir vielleicht ein Script, das ähnlich ist, wie das, was du selber machen willst, kopiere es und ändere es deinen Wünschen entsprechend um (ändere aber den ScriptName). Arbeite die allgemeinen Informationen auf den Funktions-Seiten und deren Unter-Seiten auf dieser Homepage durch. Auch im Forum kannst Du viele Informationen finden. Der Rest ist arbeiten, arbeiten, arbeiten...



Letzte Hinweise

Wer sich ein wenig mit dem IF-Befehl beschäftigt hat, wird bemerkt haben, dass die Klammern nicht notwendig sind. Der Autor des Tutorials hat sich aber dazu entschieden, diese zum Zweck der Übersichtlichkeit trotzdem anzuwenden. Wer das aber nicht möchte, braucht das auch nicht.

Zum Schluss heißt es noch, GhanBuriGhan für sein Original "Morrowind Scripting für Dummies" zu danken, das die Basis für dieses Tutorial war.





Links

Mein erstes Script