Construction Set Der Morrowind-Scriptkurs

Dieses Thema im Forum "[MW] Plugins und Mods" wurde erstellt von Killfetzer, 13. Oktober 2010.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    The Elder Scrolls III: Morrowind - Scriptkurs


    Vorwort

    In diesem Unterforum findet ein Kurs zum Scripten in Morrowind statt. Jeder, der möchte, kann daran teilnehmen und zwar ganz einfach in dem er die verlinkten Lektionen liest und die Aufgaben löst. So könnt ihr auch später noch ohne Probleme einsteigen, wenn ihr den Anfang verpasst habt. Jede Lektion bekommt ein eigenes Thema und wird in dieser Übersicht verlinkt.

    Der Ablauf des Kurses wird so sein, dass eine Lektion von einem der "Lehrer" gepostet wird. In dieser Lektion werden einige Befehle oder Funktionen der Scriptsprache erklärt und mit Beispielen veranschaulicht. Am Ende der Lektion gibt es einen Block mit Aufgaben.
    Nach jeder Lektion haben die Teilnehmer Zeit (wahrscheinlich 1-2 Wochen, das werden wir im Laufe des Kurses sehen) Fragen zur letzten Lektion oder den Aufgaben zu stellen. Ziel ist es, dass die Teilnehmer die Aufgaben alleine oder in Kooperation lösen. Vor der nächsten Lektion können die Teilnehmer dann ihre Lösungen präsentieren, wenn sie das möchten. Ansonsten wird es eine Lösung von uns geben.
    Jedem, der teilnehmen möchte, kann ich aber nur empfehlen die Aufgaben auch tatsächlich zu versuchen. Nur so merkt man, ob man ein Thema wirklich verstanden hat.

    Die "Lehrer" für den Kurs sind IvanDaVile und ich. Wir haben aber auch die Aussicht auf den ein oder anderen "Gastdozenten" ;)

    Soviel zu den einleitenden Worten. Beginnen wir mit dem Kurs:

    [hr]-[/hr]

    Literatur

    Wie in der Uni üblich gebe ich zum Beginn eines Kurses einige Hinweise zur tiefergehenden Lektüre. Das ist natürlich DAS Standardwerk zu Morrowind Script:


    Wem dieses 200seitige, engliche Werk zu viel oder zu unverständlich ist, kann ich noch die deutschen "Alternativen" empfehlen:


    [hr]-[/hr]

    Wichtig!

    Legt vor euren Scriptversuchen einen Sicherungsspielstand an. Es wäre doch ziemlich ärgerlich, wenn ihr euch euren Spielstand zerschießt, weil ihr irgendwelche seltsamen Änderungen abspeichert.

    [hr]-[/hr]

    Inhaltsverzeichnis




    [hr]-[/hr]

    Glossar

     
    Zuletzt bearbeitet: 24. Juni 2011
    EraZeR, LPfreak, Luke und 7 anderen gefällt das.
  2. Werbung (Nur für Gäste)
  3. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    The Elder Scrolls III: Morrowind - Scriptkurs


    0. Einführung

    Warum sollte ich überhaupt Scripten können?

    Das Spiel The Elder Scrolls III: Morrowind benutzt eine eigene Scriptsprache um interaktive Elemente des Spiels zu steuern. Diese ist unter dem Namen Morrowind Script oder TES Script bekannt. Da Oblivion ebenfalls eine, komplett andere, Scriptsprache verwendet, halte ich den Begriff Morrowind Script für weniger missverständlich.
    Für Modder sind Scripte ein sehr mächtiges Werkzeug. Mit ihnen lassen sich viele sonst unmögliche Dinge in Plugins realisieren. Zum Beispiel lassen sich Gegenstände bewegen, Aktionen des Spielers detektieren und andere Objekte dynamisch auf diese Aktion reagieren lassen. Allgemein kann man mit Scripten die Interaktivität des Spiel stark erhöhen.
    Morrowind Script hat den großen Vorteil, dass es nur über sehr wenige grundlegende Befehle verfügt und somit leicht erlernbar ist. Der Nachteil liegt in der teilweise sehr beschränkten Funktionalität der Scriptsprache. Es gibt viele Bereiche in der Spielmechanik können von Scripten nicht oder nur unzureichend beeinflusst werden. Sobald man also über die Standardfunktionen hinausgehen will, ist zwangsläufig Kreativität gefragt.

    Wo treffen wir beim Modden eigentlich auf Scripte oder Scriptfunktionen? Da gibt es mehrere Möglichkeiten:

    • Scripte: Natürlich trifft man Scriptfunktionen in den Scripten selbst an. Ein Großteil des Kurses wird sich um diese Art des Scriptens drehen. Scripte können mit dem im Construction Set eingebauten Scripteditor erstellt oder bearbeitet werden. Scripte kann man noch weiter in lokale und globale Scripte unterteilen, aber dazu später mehr.
    • Resultboxen von Dialogen: Auch in den Resultboxen von Dialogen lassen sich Scriptfunktionen ausführen. Es gibt sogar gewisse Funktionen, die nur hier funktionieren. Allgemein liegt die Funktionalität aber weit unter der eines Scripts.
    • Konsole: Die letzte Möglichkeit Scriptfunktionen zu verwendet, stellt die Konsole im Spiel selbst dar. Hier lassen sich vor allem Debuggingfunktionen aufrufen. Allerdings kann sie auch für weitreichende Spielmanipulationen verwendet werden, was den Konsolenfunktionen ungerechter weise den Ruf von Cheats eingebracht hat. In diesem Kurs werdet ihr hoffentlich die Funktionalität der Konsole zu schätzen lernen. Die Funktionalität der Konsole liegt noch einmal unter der der Resultboxen. Hier lässt sich immer nur ein einziger Befehl gleichzeitig ausführen.

    Bedienung des Construction Set

    Wie kann man nun also Scripte erstellen? Dazu nun eine kurze Einführung in die verschiedenen Optionen für den Scripteditor, die Dialogresultbox und die Konsole:


    [​IMG]

    Das Menü des TES III: Construction Sets

    Im obigen Bild sieht man das Menü und die Symbolleiste des TES III: Construction Sets.
    Mit dem Symbol 1 kann der Scripteditor geöffnet werden.
    Das Menü Gameplay (2) enthält viele für das Scripting wichtige Funktionen. Hier kann man ebenfalls den Scripteditor öffnen (Edit Scripts...), man kann Startscripte definieren (Edit StartScripts...), man kann die Übersicht der globalen Variablen aufrufen (Globals... ) und man erhält Zugriff auf die Sounds und Gamesettings (Settings...).


    [​IMG]

    Der Scripteditor

    Der Scripteditor ist ein Werkzeug zur Bearbeitung von Scripts. Er bietet nur sehr grundlegende Funktionen, aber reichen sie normalerweise. Es gibt auch externe Scripteditoren für Morrowind-Script, auf diese werde ich aber nicht eingehen.
    In der Titelleiste des Editors (1) steht in eckigen Klammern der Name des gerade geladenen Scripts. Wenn das geladene Script ungespeicherte Änderungen enthält, wird am Ende des Namens ein * angezeigt.
    Darunter befindet sich das Menü des Editors (2). Dieses Menü enthält die folgenden Punkte:
    • Script
      Dieses Menü wird eigentlich nur für das Erstellen eines neuen Scripts benötigt. Alle anderen Funktionen sind in der Symbolleiste enthalten.

      • New...
        Öffnet ein neues, leeres Script.

      • Open...
        Öffnet ein Fenster Script Pick mit allen Scripten in alphabetischer Reihenfolge. Doppelklick auf das gewünschte Script öffnet dieses. Die Namen von Scripten, die in der aktiven ESP geändert wurden, werden mit einem zusätzlichen * am Ende gekennzeichnet. Wenn das geladene Script nicht gespeicherte Änderungen enthält, wird gefragt, ob die Änderungen gespeichert werden sollen.

      • Previous Script
        Öffnet das Script, das alphabetisch eins vor dem gerade geladenen Script in der Liste steht.

      • Next Script
        Öffnet das Script, das alphabetisch eins nach dem gerade geladenen Script in der Liste steht.

      • Save
        Kompiliert das geladene Script und gibt Fehlermeldungen aus. Danach wird das aktuelle Script unter dem Namen, der hinter dem begin angegeben ist gespeichert. Vorhandene Scripte werden nicht überschrieben. Im Fall doppelter Namen wird das Script unter dem gleichen Namen gespeichert. Dies verursacht erst Probleme beim erneuten Laden der ESP!

        Ein Computer versteht die Sprache der Menschen nicht und wir können mit der Maschinensprache nichts anfangen. Eine Programmiersprache ist ein Zwischending zwischen diesen beiden. Sie besitzt sehr strenge Regeln, wie man bestimmte (für den Menschen verständliche) Wörter (eben die Befehle und Funktionen) aneinander reihen kann. Trotzdem kann das ein Computer nicht verstehen.
        Allerdings gibt es für jede Programmiersprache ein Programm, den Compiler, der den Quelltext für den Computer in Maschienensprache übersetzt. Dazu versucht er den vorhandenen Quelltext nach bestimmten Regeln in Maschienensprache zu übersetzen. Kann er das nicht, gibt er eine Fehlermeldung zurück. Diesen gesamten Vorgang nennt man kompilieren.

        Anmerkung: Die Ausgabe des Compilers ist für uns in Morrowind Script nicht sichtbar. Diese ist irgendwo tief in der ESP versteckt. Wir sehen auchnach dem Kompilieren nur den normalen Quelltext (zum Glück ;))

      • Recompile All
        Alle Scripte werden neu kompiliert. Fehlermeldungen aus allen Scripten werden ausgegeben.

      • Delete
        Öffnet ein Fenster Script Pick mit allen Scripten in alphabetischer Reihenfolge. Doppelklick auf das gewünschte Script markiert dieses zum Löschen. Dies ist am Eintrag DELETED zu erkennen. Tatsächlich gelöscht wird das Script erst beim Schließen (bzw. Neuladen) der ESP.

      • Exit
        Schließt den Scripteditor. Wenn das geladene Script nicht gespeicherte Änderungen enthält, wird gefragt, ob die Änderungen gespeichert werden sollen.

    • Edit
      • Undo
        Macht alle Änderungen bis zum letzten Speichern rückgängig. Die Tastenkombination Strg+Z hat die gleiche Wirkung.

      • Redo
        Hebt das Rückgängigmachen wieder auf. Die Tastenkombination Strg+Y hat die gleiche Wirkung.

    • Help
      • Contents
        Öffnet die Hilfe.

      • Commands
        Öffnet die Script Commands Seite der Hilfe. Da es nur sehr wenige Befehle gibt, sollte diese nach den ersten paar Scripten überflüssig sein, weil man dann alle auswendig kennt.

      • Functions
        Öffnet die Script Functions Seite der Hilfe. Diese führt viele der Scriptfunktionen thematisch sortiert auf. Leider nicht alle, viele leider ohne Erklörung und dazu gibt es noch einige Fehler auf der Seite. Allerdings ist dies durchaus für einen schnellen Blick geeignet, wenn man sich zum Beispiel die Reihenfolge der Parameter einer bestimmten Funktion ansehen möchte. Trotzdem ist eine externe Liste meistens besser geeignet.

    Unter dem Menü befindet sich die Symbolleiste (3). Die einzelnen Symbole entsprechen den Befehlen im Menü Script. Von links nach rechts haben die Schaltflächen folgende Funktionen:
    Open, Save, Previous Script, Next Script, Recompile All, Delete, Exit.
    Darunter befindet sich das Editorfenster (4), dass sich wie der normale Editor in Windows benimmt (Notepad.exe).
    In der Fußleiste (5) wird schließlich noch angegeben in welcher Zeile sich der Cursor gerade befindet und wie viele Zeilen das Script insgesamt besitzt.

    Der Nachteil dieses Editors ist, dass er weder eine Suchen- noch eine Ersetzen-Funktion besitzt. Dies kann bei längeren Scripten teilweise ärgerlich sein. In diesem Fall empfiehlt es sich das Script in einen externen Editor zu kopieren und dort zu bearbeiten.


    [​IMG]

    Das Dialogfenster

    In Dialogen können Scriptfunktionen in der Resultbox (1) der Antworten aufgerufen werden. Diese wird einmal ausgeführt, wenn die entsprechende Antwort im Spiel gegeben wird. Die Befehle werden dabei so gewertet, als würden sie von einem lokalen Script des antwortenden NPCs aufgerufen. In den Resultboxen muss weder ein begin noch ein end gesetzt werden, auch funktionieren nur nicht alle Funktionen in den Results, mehr dazu aber in der entsprechenden Lektion.

    Mit dem Button Error Check Results (2) werden alle Resultboxen kompiliert und auf Fehler geprüft. Da gefundene Fehler zu dauerhaften Problemen führen können, sollte vor dem Benutzen dieser Option die ESP gespeichert werden und danach neu geladen (die Fehler kann man sich ja aufschreiben).


    [​IMG]

    Die Konsole im Spiel

    In Morrowind selber kann man Scriptfunktionen in der Konsole aufrufen. Diese lässt sich mit ^ öffnen. Sobald die Konsole geöffnet wird, wird das Spiel pausiert und der Mauszeiger verwandelt sich in den Inventarpfeil (1). Fährt man mit dem über Objekte, wird die ID der Objekte angezeigt. Klickt man ein Objekt an, wird es in der Konsole ausgewählt. Dies kann man in der Titelleiste der Konsole sehen (2). Klickt man das gleiche Objekt noch einmal an, wird es wieder deselektiert.

    Man kann in der Konsole einzelne Scriptfunktionen aufrufen (3). Die Funktion wird dabei so behandelt, als würde sie von einem lokalen Script des ausgewählten Objekts aufgerufen (wenn kein Objekt ausgewählt ist, werden die Funktionen global ausgeführt). Auch in der Konsole können nur einzeilige Scriptfunktionen aufgerufen werden. Mit Enter wird die Funktion ausgeführt. Die Konsole liefert darauf meistens eine Ausgabe, mit Fehlern oder den ausgeführten Aktionen. Mit Pfeil auf und Pfeil ab, kann man die zuletzt eingegebenen Funktionen durchscrollen. Das erspart einem einiges an Tipparbeit.

    Klickt man bei geöffneter Konsole mit der rechten Maustaste, wird die Pause beendet und man kann sich wieder bewegen, die Konsole bleibt allerdings angezeigt. Dies ist manchmal nützlich, da in der Konsole Statusinformationen angezeigt werden können.

    So viel ersteinmal zu den Möglichkeiten Scriptfunktionen einzugeben. Kommen wir nun dazu wie ein Script eigentlich allgemein aufgebaut wird.


    Aufbau eines Scripts

    Im Prinzip ist jedes Script in Morrowind gleich aufgebaut. Das Script beginnt mit dem Befehl begin, danach wird der gewünschte Scriptname angegeben. Dann folgt die Deklaration der Variablen und der eigentliche Scriptcode. Zum Schluss wird das Script mit end beendet.

    Eine Variable ist eine bestimmte Buchstabenfolge, die einen Zahlenwert darstellt (Wird da die Erinnerung an Mathe wach?). In einer Programmiersprache sind Variablen sehr wichtig, da nur so eine Interaktivität erzeugt werden kann. Sonst würde jedes Programm ja immer das selbe machen.

    Damit eine Programmiersprache aber weiß, welche Buchstaben denn eine Variable sein sollen und welche Art von Variable (es ist für einen Computer schon ein ziemlicher Unterschied, ob er eine 2 oder die Zahl 1234,5678 speichern soll) diese Buchstaben denn darstellen. In der Deklaration sagt man genau das einem Programm. Normalerweise muss eine Variable auch noch initialisiert werden, das heißt ihr muss ein Startwert zugewiesen werden, aber das erledigt Morrowind Script automatisch für uns.

    Als Scriptname kann jede ASCII-Zeichenkette (also zum Beispiel keine Umlaute) gewählt werden. Sie muss nur einmalig in Gesamtmorrowind und allen geladenen ESP-Datein sein. Diese Eindeutigkeit beschränkt sich dabei nicht nur auf die Scriptnamen sondern auf alle IDs im Spiel. Außerdem darf ein Scriptname kein Leerzeichen enthalten. Am einfachsten ist dies zu erreichen, indem man vor jedes Script ein eigenes Kürzel setzt und immer mit _script beendet. Mehr dazu bei den Scriptkonventionen.

    Für die Variablendeklaration in Morrowind Script gibt man einfach den Typ der Variable an (es gibt short, long und float), danach ein Leerzeichen und dann den gewünschten Namen. Dieser Name muss mit einem Buchstaben oder einem Unterstrich beginnen. Er darf keine Leerzeichen enthalten und darf nicht gleich einem Scriptbefehl oder einer Scriptfunktion sein. Auch muss er in diesem Script einmalig sein (man kann also nicht eine short- und eine float-Variable mit dem Namen test deklarieren). Bei der Wahl der Namen sollte man sich möglichst sinnvolle Namen ausdenken, die den Inhalt der Variablen beschreiben (xpos ist zum Beispiel recht verständlich für die Position eines Objekts auf der X-Achse).
    Ein Script muss keine Variablen deklarieren.

    Nach der Variablendeklaration beginnt der eigentliche Code des Scripts. Hier werden die Scriptfunktionen aufgerufen. Dies geschieht meistens in bestimmten Blöcken. In Morrowind Script sind dazu die Befehle if...endif und while...endwhile verfügbar. Zunächst beschäftigen wir uns nur mit dem ersten. Ein Script könnte also zum Beispiel so aussehen:

    Code:
    begin kf_beispiel1_script
                       ;hier beginne ich das Script mit dem Namen kf_beispiel1_script
                       ;mit einem Semikolon leite ich Kommentare ein, diese werden vom Compiler ignoriert
    
    
    short test         ;hier deklariere ich die Variable test als eine short-Variable
                       ;sie wird automatisch den Wert 0 haben
    
    
    if ( test == 0 )   ;hier lasse ich Morrowind prüfen, ob test den Wert 0 hat
    
      ;wenn die Bedingung in Klammern erfüllt ist, wird dieser Teil ausgeführt
      ;mache irgendwas mit dem Script
    
    endif
    
      ;wenn die Bedingung nach dem if nicht erfüllt ist, läuft das Script ab hier weiter
      ;mache irgendwas mit dem Script
    
    
           ;in der nächsten Zeile beende ich das Script
    end
    
    Soviel zunächst zur Theorie. Schreiben wir doch mal ein kleines Script.


    Das erste Script

    Um die ganzen Informationen auszuprobieren, schreiben wir nun das erste Script. Natürlich kann dies nur das bekannte "Hello, World!" sein. Beginnen wir ganz vorne:

    1. Ladet die Morrowind.esm im Construction Set (wenn ihr nicht wie das geht, solltet ihr euch ersteinmal andere Tutorials anschauen).
    2. Öffnet den Scripteditor und erstellt ein neues Script. Tragt dort diesen Code ein:

      Code:
      begin kf_hello_world_script
      
      if ( OnActivate == 1 )
        MessageBox, "Hallo, Welt!"
      endif
      
      end
      
    3. Speichert das Script ab. Was die einzelnen Funktionen bewirken, werdet ihr gleich sehen. Zunächst müsst ihr das Script aber noch einem Gegenstand zuweisen.
    4. Öffnet den Activator Ex_balmora_roadmarker_01 und ändert seine ID auf kf_act_hello_world. Weist ihm als Script das eben erstellte Script kf_hello_world_script zu. Speichert das ab. Ihr werdet gefragt, ob ihr ein neues Objekt erzeugen wollt. Bestätigt das.
    5. Ladet nun die Zelle Balmora (-3,-3) (oder einen Ort eurer Wahl) und platziert den Activator auf der Mitte des Platzes.
    6. Speichert die Änderung nun unter dem Namen Scriptkurs.esp und ladet das Plugin in Morrowind.
    7. Besucht den Obelisk (wo auch immer ihr ihn hingestellt habt) und aktiviert ihn mit der Leertaste (oder was sonst eure Aktivieren-Taste ist). Herzlichen Glückwunsch ihr habt euer erstes Script erzeugt.

    Nachdem ihr nun einmal selbst ein Script benutzt habt, sollten wir uns noch auf einige Konventionen einigen.


    Scriptkonventionen

    Ein lediges, aber nötiges Thema: Wie genau sollte man in Morrowind Script seinen Code schreiben, damit der Compiler und andere Modder (und man selbst, wenn man sich das Script später noch einmal anschaut) das Script verstehen?

    Ich selbst halte mich dazu an folgende Regeln (die eigentlich in den meisten Programmiersprachen so benutzt werden):
    • Kennzeichne die Herkunft deiner Scripte!
      Wie bereits erwähnt muss der Name eines Scripts in allen geladenen Plugins eindeutig sein. Da man nicht weiß, was andere Modder machen, sollte man also selbst dafür sorgen, dass seine Scriptnamen eindeutig sind. Es hat sich eingebürgert, dass man seine Scripts mit einem eigenen Kürzel (ich verwende kf_ für Killfetzer) beginnt. Danach sollte man noch ein weiteres Kürzel für das aktuelle Projekt angeben. Ein Beispiel: In meiner Modifikation Skill Mastery beginnt jede ID (nicht nur Scripte) mit kf_skm_. Mehr als 2 oder 3 Buchstaben sollten eure Kürzel aber auch nicht besitzen.
      Achtung: my_ oder _ sind ganz schlechte Ideen als eigenes Kürzel. Diese werden von vielen Moddern benutzt. Eure Kürzel sollten wirklich personalisiert sein.

    • Kennzeichne deine Scripte als Scripte!
      Es gibt viele verschiedene Objektarten in Morrowind, alle benötigen IDs. Die meisten eurer Scripte laufen auf von euch erschaffenen Objekten. Da ist es sehr wahrscheinlich (und konsistent) wenn das Objekt und das Script gleiche oder sehr ähnliche IDs haben. Damit man aber immer auseinander halten kann was Script und was Objekt ist, beende ich den Namen jedes Scripts mit _script. Wenn euch das zu lang ist, könnt ihr euch auch ein anderes Kürzel einfallen lassen.

    • Groß- und Kleinschreibung:
      Morrowind Script unterscheidet nicht zwischen Groß- und Kleinschreibung, deswegen wäre es eigentlich egal, wie ihr schreibt. Trotzdem solltet ihr immer die gleiche Form wählen. In der Community hat sich folgende Form verbreitet:
      • Scriptbefehle (begin, end, if, ...) und Variablen werden klein geschrieben.
      • Scriptfunktionen (OnActivate, MessageBox, ...) werden groß geschrieben. Und zwar wird jeweils der erste Buchstabe jedes Wortes (im englischen Sinne) großgeschrieben.

    • Variablennamen:
      Variablennamen sollten möglichst sinnig gewählt werden. Man sollte aus dem Namen einer Variablen bereits ihren Inhalt ableiten können. Einige Variablennamen sind quasi Standard geworden: doonce (short-Variable, die immer verwendet wird, wenn etwas nur einmal gemacht werden soll), state (short-Variable, wird immer verwendet, wenn ein Script mehrere verschiedene Stadien durchläuft) und timer (float-Variable, zur Speicherung des Wertes eines Timers).

    • Leerzeilen:
      Zwischen allen Sinnblöcken sollten Leerzeilen gesetzt werden. Also zum Beispiel eine nach der begin Zeile, eine nach den Variablendeklarationen, eine nach dem Ende jedes Blockes (if oder while) oder nach jedem Sinnabschnitt.

    • Einrückungen:
      Alle Befehle der nächsttieferen Ebene werden einen Tabstop weiter eingerückt (wer keine Tabstops verwenden möchte, kann auch 2 oder 3 Leerzeichen verwenden). Ein Beispiel: Alle Zeilen zwischen einem if und einem else oder endif werden eingerückt. Das else oder endif ist die erste Zeile, die wieder ausgerückt wird.

    • Leerzeichen, Anführungszeichen und Kommata:
      Morrowind Script ist auch in dieser Hinsicht sehr vergebungsfreudig. Aber um Fehlern vorzubeugen und die Lesbarkeit zu verbessern, sollte man die formalen Regelen von Morrowind Script benutzen:
      • Vor und nach jeder Klammer und jedem Rechen- und Vergleichsoperator wird ein Leerzeichen gesetzt.
      • Jede ID wird in Anführungszeichen gesetzt. Dies ist eigentlich nur für IDs mit Leerzeichen erforderlich, sollte aber der Einheitlichkeit gemacht werden. Werden sie weggelassen kann, es manchmal absolut unvorhersagbar Probleme geben, also lieber gleich auf Nummer Sicher gehen.
      • Einzelne Parameter von Funktionen und die Funktion selbst werden mit Kommata getrennt. Dies scheint bis auf zwei mir bekannte Ausnahme rein optional für das Verständnis des Compilers zu sein, trotzdem sollte es gemacht werden.

    Dies hört sich sicher erst einmal sehr kompliziert an. Aber bei längeren Scripten werdet ihr den Sinn dieser Konventionen schnell verstehen. Wenn ihr einzelne Punkte aus den Konventionen nicht verstanden habt, werdet ihr sie in den nächsten Scriptbeispielen sicherlich verstehen.

    [hr]-[/hr]

    Dies war die Einführung zum Scriptkurs. Weiter geht es mit einem Abschnitt über die beiden im Beispielscript verwendeten Funktionen OnActivate und MessageBox und einige verwandte Funktionen. Ihr werdet lernen, wie man das Tagebuch verwendet, wie man dem Spieler Auswahlmöglichkeiten gibt und wie man eine Tür so verschließt, dass er Spieler sie erst nach dem Erfüllen einer bestimmten Quest öffnen kann.
     
    Zuletzt bearbeitet: 13. Oktober 2010
  4. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    The Elder Scrolls III: Morrowind - Scriptkurs


    A. Befehle und Operatoren von Morrowind Script

    Was sind Befehle und wie unterscheiden sie sich von Funktionen?

    In Morrowind Script (eigentlich in jeder Programmiersprache, die ich kenne) gibt es einen Unterschied zwischen Befehlen und Funktionen.

    Befehle sind meistens ein sehr kleiner Satz von Wörtern, die ganz bestimmte, grundlegende Dinge ermöglichen. Befehle verwenden normalerweise sehr kurze und verständliche Wörter als Aufruf (zB. if). Befehle machen immer das gleiche.

    Funktionen hingegen sind kompliziertere Gebilde. Sie selbst wurden von irgendjemand aus den zu Grunde liegenden Befehlen programmiert. Funktionen können im Gegensatz zu Befehlen bestimmte Zahlenwerte zurückgeben. Die Rückgabewerte hängen vom Spielverlauf ab.

    Diese Unterscheidung mag ein wenig schwammig wirken, aber ich bin leider kein Informatiker und kann den Unterschied nicht präziser erklären. Ich kann euch nur versichern, dass der Unterschied wirklich ziemlich scharf und verständlich ist, sobald man ihn verstanden hat. Dieses Verstehen ist aber nicht unbedingt erforderlich. Erforderlich ist, dass ihr die Befehle von Morrowind Script versteht ;)


    Liste der Befehle

    Morrowind Script besitzt einen extrem kleinen Satz an Befehlen. Es sind genau 15. Von diesen benötigt man (also zumindest ich) nur 12 regelmäßig. Also alles sehr überschaubar.

    Die Befehle lassen sich in mehrere Gruppen einteilen:
    • Scriptstart und -ende
      • begin
      • end
    • Variablendeklaration
      • short
      • long
      • float
    • if-Konstrukte
      • if
      • elseif
      • else
      • endif
    • while-Konstrukte
      • while
      • endwhile
    • Sonstige
      • set ... to
      • return
      • -> (Funktionsaufruf)
      • . (Variablenaufruf)


    Scriptstart und -ende

    begin

    Jedes Script muss mit dem Wort begin beginnen. Es markiert den Anfang eines Scripts. Hinter diesem Befehl wird der Name bzw. die ID des Scripts erwartet. Dazu wird die gewünschte ID einfach nach einem Leerzeichen hingeschrieben. Der Scriptname darf keine Leer- oder Sonderzeichen enthalten.

    Code:
    begin Scriptname
    end

    Jedes Script muss mit dem Wort end aufhören. Es markiert das Ende eines Scripts. Alles was hinter dem end steht, wird nicht mehr beachtet.


    Variablendeklaration

    In Morrowind Script gibt es drei Arten von Variablen. Jede kann deklariert werden, indem man den entsprechenden Variabelntyp (das ist der Befehl) und nach einem Leerzeichen den gewünschten Namen der Variablen schreibt. Der Name muss eindeutig sein. Es darf keine andere Variable im gleichen Script (lokal) oder globale Variable geben, die den gleichen Namen beseitzt, auch wenn sich der Typ unterscheidet. Der Variablenname darf keine Leer- oder Sonderzeichen enthalten.

    Variablen müssen in Morrowind Script immer direkt hinter der begin-Zeile deklariert werden. Im späteren Script kann man diese Befehle nicht mehr verwenden.

    short

    Dieser Befehl erzeugt eine kurze, ganze Zahl (auch bekannt als Integer). Dies ist das Äquivalent von shortint in anderen Programmiersprachen. Eine short-Variable kann Werte zwischen -32.768 und 32.767 speichern. Wird ein größerer oder kleinerer wert gespeichert, kommt es zu einem Overflow. Das heißt, dass die Variable wieder auf der anderen seite anfängt zu zählen. 32768 wird also als -32768 gespeichert oder 32800 als -32736.

    long

    Dieser Befehl erzeugt eine lange, ganze Zahl (auch bekannt als Integer). Dies ist das Äquivalent von longint in anderen Programmiersprachen. Eine long-Variable kann Werte zwischen -2.147.483.648 und 2.147.483.647 speichern. Wird ein größerer oder kleinerer wert gespeichert, kommt es zu einem Overflow.


    float

    Dieser Befehl erzeugt eine Gleitkommazahl. Für das Verständnis dieses Kurses reicht es aus zu wissen, dass dies eine Kommazahl ist und dass Morrowind diese standardmäßig mit 6 Nachkommastellen darstellt (zB. 1,234567). Allerdings muss auch daran gedacht werden, dass auf Grund der Speichermethode kleine Fehler auftreten können. Normalerweise sind die nur in den hintersten Nachkommastellen zu bemerken, aber in einigen Ausnahmefällen (bei aufwendigeren Rechnungen), können sie schon größere Fehler erzeugen. Die größte, speicherbare Zahl ist ±3.4*exp[±38].

    Code:
    short Variablenname1
    long Variablenname2
    float Variablenname3

    if-Konstrukte

    Mit den Befehlen dieser Kategorie kann man bestimmte Bedingungen überprüfen und abhängig vom Ausgang dieser Überprüfung (also entweder ist sie wahr oder falsch) Quellcode ausführen oder überspringen. Somit kann man die Wirkung von Scripten abhängig von Situationen machen.

    if

    Dieser Befehl ist so aufgebaut:

    Code:
    if ( a == b )
    Man kann ihn so lesen: Wenn a gleich b ist, führe alle Zeilen bis zum nächsten elseif, else oder endif aus. Wenn a ungleich b ist, springe bis zum nächsten elseif, else oder endif.

    elseif

    Dieser Befehl ist so aufgebaut:

    Code:
    elseif ( a == c )
    Man kann ihn so lesen (zusammen mit den if-Befehl von oben): Wenn a gleich b war (oben), springe bis zum nächsten elseif, else oder endif. Wenn a ungleich b war, aber a gleich c ist, führe alle Zeilen bis zum nächsten elseif, else oder endif aus. Wenn a ungleich b war und a ungleich c ist, springe bis zum nächsten elseif, else oder endif.

    else

    Man kann diesen Befehl so lesen: Wenn keine der vorherigen Abfragen (hier a == b und a == c wahr war oder anders, wenn alle bisherigen Abfragen falsch waren, führe alle Zeilen bis zum nächsten endif aus. Wenn eine der Abfragen drüber wahr war, springe bis zum endif.

    endif

    Dieser Befehl schließt einen if-Block ab.

    Jeder if-Block besitzt immer genau ein if und genau ein endif. Zusätzlich können beliebig viele elseifs und/oder genau ein else hinzukommen.

    Hinter jedem if und elseif steht eine Bedingung beziehungsweise ein Vergleich in Klammern. In diesem Beispiel war dafür ( a == b ) gewählt. Für a und b können jede Zahl, jede lokale oder globale Variable oder jede Funktion mit einem Rückgabewert stehen. Statt dem == kann auch jeder andere Vergleichsoperator (siehe weiter unten) stehen, zum Beispiel:

    Code:
    if ( a == 3)    ;wahr, wenn die Variable a gleich 3 ist
    
    if ( a < b )     ;wahr, wenn die Variable a kleiner als die Variable b ist
    
    if ( OnActivate == 1 )   ;wahr, wenn die Funktion OnActivate eine 1 zurückliefert
    
    if ( GetButtonPressed != c )   ;wahr, wenn die Funktion GetButtonPressed einen anderen Wert zurückliefert, als der, der in der Variable c gespeichert ist
    

    Verschachtelte if-Blöcke

    Es ist auch möglich einen if-Block in einem anderen if-Block zu starten. Hierbei muss man beachten, dass alle elseif und else dem zweiten (inneren) if zugeordnet werden, bis dieses wieder mit einem endif abgeschlossen wird.

    Code:
    if ( a == b )
      if ( c == d )
        ;mache irgendwas
    else (a != c )        ;auch wenn dieses else auf den ersten Blick, wegen seiner Setzung, so aussieht, als ob es zum oberen der beiden ifs gehört, gehört es zu dem unteren if, da diese noch nicht mit einem endif beendet wurde
        ;mache irgendwas
      endif
    else         ;dieses else gehört nun zum oberen if, weil das untere mit einem endif abgeschlossen wurde
      ;mache irgendwas
    endif
    Wie das obere Beispiel sehr gut zeigt, ist es wichtig, seine Scripte ordentlich zu setzen, da man sonst selber den Überblick verliert, was seine Scripte tun.


    while-Konstrukte

    Mit den while-Befehlen kann man Schleifen in Morrowind Script bauen.

    while

    Startet eine while-Schleife. while erwartet, wie if eine Bedingung in Klammern. Solange dieser Vergleich wahr ist, wird der Code innerhalb der while-Schleife ausgeführt.

    endwhile

    Beendet eine while-Schleife.

    Code:
    while ( a < 10 )
      set a to a + 1
      ;mache irgendwas
    endwhile
    
    Man kann den Code so lesen: Wiederhole alle Zeilen zwischen while und endwhile solange, bis der Vergleich hinter dem while nicht mehr wahr ist.

    Wenn man falsche Abfragen wählt, kann man somit natürlich wunderbare Endlosschleifen bauen, die das Spiel einfrieren lassen (können).


    Sonstiges

    set ... to

    Mit diesem Befehl lassen sich Variablen Werte zuweisen. zwischen set und to (anstelle der Pünktchen) muss der Name einer lokalen oder globalen Variable geschrieben werden. Hinter dem to wird ein Wert erwartet, der der Variablen zugewiesen werden soll. Es gibt vier Möglichkeiten, was hinter dem to stehen kann:
    • eine Zahl (zB. set a to 1)
    • eine andere Variable (zB. set a to b)
    • eine Funktion mit Rückgabewert (zB. set a to GetButtonPressed)
    • eine Rechnung:
      In diesem Fall wird das Ergebnis der Rechnung der Variablen zugewiesen. Diese Rechnung kann Zahlen und Variablen enthalten. Funktionen können Probleme bereiten, deswegen sollte man sie nicht in Rechnungen benutzen. Um die Zahlen und Variablen zu verbinden stehen die vier Grundrechenarten zur Verfügung. Mehrere Rechnungen können mit Klammern hintereinander ausgeführt werden. Es scheint unklar zu sein, ob Morrowind Script Punkt vor Strich befolgt, somit sollte im Zweifel immer geklammert werden.

      Code:
      set a to 1 + 3
      
      set a to b - 3 + c
      
      set a to ( b + 3 ) * c
      
      set a to ( b / 2 ) - 1
      

    Wird einer short- oder long- Variablen (also einer ganzen Zahl) ein float-Wert (also eine Kommazahl) zugewiesen, werden die Nachkommastellen einfach abgeschnitten.
    Wird einer float-Variablen eine ganze Zahl zugewiesen, werden alle Nachkommastellen mit Nullen aufgefüllt.


    return

    Dieser Befehl lässt das Script zurück zum begin springen.


    -> (Funktionsaufruf)

    Mit diesem Befehl kann man eine Funktion so aufrufen, als ob das Script auf einem anderen Objekt liegen würde. Dieses Objekt muss dazu Reference Persistent sein. Für weitere Informationen siehe Lektion 3.

    Code:
    "Object_ID"->Funktionsname
    
    "ex_gg_portcullis_01"->MoveWorld, Z, 70
    

    . (Variablenaufruf)

    Mit diesem Befehl kann man auf die lokalen Variablen eines anderen Scripts zugreifen. Auch hierzu mehr in Lektion 3.

    Code:
    set a to "Object_ID".state
    
    set a to "Global_Script_ID".state
    

    Operatoren

    Morrowind Script kennt zwei Arten von Operatoren: Vergleichsoperatoren und Rechenoperatoren. Die ersten werden für die Verglieche in if, elseif und while-Befehlen benutzt. Die Rechenoperatoren werden für Rechnungen im set ... to Befehl benutzt.

    Vergleichsoperatoren

    Morrowind Script kennt 6 Vergleichsoperatoren:

    == gleich
    != ungleich
    < kleiner
    > größer
    <= kleiner oder gleich
    >= größer oder gleich


    Rechenoperatoren

    Morrowind Script kennt nur die Grundrechenarten, die mit den Operatoren +, -, * (mal) und / (geteilt).
     
    Zuletzt bearbeitet: 23. Oktober 2010
    Zeitgeist gefällt das.
  5. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Auf besonderen Wunsch von ReneMiner weise ich hier noch mal darauf hin, dass man maximal 128 Ausgänge in einer if-Abfrage verschachteln kann. Somit darf man nicht beliebig viele elseif einbauen, sondern maximal 128 (oder 127 wenn man zum Schluss noch ein else verwendet).

    Danke für den Hinweis.
     
  6. Werbung (Nur für Gäste)
Die Seite wird geladen...
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden