Oblivion:Quest Erklärung

Aus Skript-Wiki
Wechseln zu: Navigation, Suche

Ich möchte nun einmal eine einfache Quest auseinander nehmen und die einzelnen Punkte erklären. Auf diese Weise, so hoffe ich, kann man besser hinter das Prinzip des Quest-Erstellens gelangen, weil ich bisher noch kein Tutorial dazu gefunden habe. Das "Original"-Tutorial ist nur ein Benutzer-Tutorial und wirft leider mehr Fragen auf, als dass es hilft. Daher hoffe ich, dass dieses hier zumindest weiterhilft. Wenn jemand mal ein brauchbares Tutorial zusammenstellt oder findet, wäre ich an der Veröffentlichung sehr interessiert.


Wir starten nun das TES IV CS und laden die Oblivion.esm. Wir werden nichts verändern, deswegen brauchen wir keinerlei Plugins mit zu laden (ist aber nicht schlimm, wenn sie schon geladen sind).


Wir öffnen das Quest-Fenster mit dem Button-quest.jpg -Button und suchen in der QuestID-Liste die Quest mit der Bezeichnung "SQ01". Das ist eine "Secret Quest" (vermute ich, vielleicht aber auch "Special Quest" oder "Short Quest"). Vielleicht habt ihr sie schon im Spiel gelöst. In einem Wirtshaus südlich der Kaiserstadt trefft ihr auf eine Frau, deren Riesenkartoffeln geklaut wurden. Sie schickt euch los (ein paar Schritte bloß), um einen Oger zu erschlagen, der die Kartoffeln bei sich trägt. Alternativ kann es euch auch passieren, dass ihr zuerst auf den Oger trefft, ihn erschlagt und dann die Kartoffeln findet und somit die Quest beginnt.


Die Quest heißt "Der Kartoffelklau" und wird unter "Quest Name" angezeigt. Dieser Name wird auch im Journal angezeigt. Was sehen wir auf dieser Seite noch?


Die Priority ist auf 50 gesetzt, was diese Quest zu einer "Nebenquest" macht.


Außerdem sehen wir unter Script, dass das "SQ01Script" mit dieser Quest ausgeführt wird. Wir schalten schnell mal zu unserem Script-Editor und sehen uns das Script an. Aha. Es wird eine SHORT-Variable mit dem Namen "PotatoCount" definiert. Mit dieser Variable wird hinterher errechnet, wie viele Kartoffeln der Spieler bei sich trägt.


Wir sehen weiterhin, dass "Start Game Enabled" aktiviert ist. Das bedeutet, dass die Quest jederzeit begonnen werden kann, sofern die "Quest Conditions" erfüllt sind. Diese haben aber nur als Bedingung, dass die Rasse spielbar ist. Somit wird verhindert, dass ungültige Rassen, z.B. Goblins, die Quest annehmen können.


Außerdem hat die Quest ein Icon bekommen. Das war es auch schon an Informationen auf dieser Seite. Gehen wir weiter zum nächsten Reiter, den "Quest Stages".


Hier finden wir die einzelnen Quest-Punkte, also die Journal-Einträge dazu.


Wir sehen links den Index mit den Zahlen 10, 20, 30, 100 und 200. Das ist quasi die Reihenfolge der Quest. Man bemerkt sehr schnell das Prinzip dahinter. Man kann z.B. nicht die Kartoffeln abgeben, wenn man den Oger nicht schon getötet hat.


Daher ist es wichtig, dass bei diesen Zahlen die Reihenfolge stimmt. Beim Quest-Erstellen sollte man auch darauf achten, dass man diese Index-Zahlen mit möglichst großen Schritten aufzählt. So wie hier in 10er Schritten. 256 Schritte dürfen es insgesamt sein. Auf diese Weise ist es möglich einen weiteren Eintrag einzufügen, ohne gleich die ganzen anderen ändern zu müssen.


Klicken wir uns nun durch die einzelnen Punkte und schauen uns den Journal-Eintrag dazu an. (Unter "Log Entry").


Unter "10" bekommt der Spieler den Log-Entry, dass er einen Oger getötet hat und einige Kartoffeln gefunden hat. Wenn der Spieler also zuerst den Oger tötet und die Kartoffeln nimmt, dann wird die Quest schon gestartet. In dem Fall wird auch später die Dame etwas anderes zur Begrüßung sagen. Man sollte immer berücksichtigen, ob der Spieler schon vorzeitig Questelemente aufnehmen kann oder andere Questbedingungen erfüllen könnte.


Unter "20" wird dem Spieler ins Buch geschrieben, dass er die Dame getroffen hat und die Kartoffeln besorgen soll.


Unter "30" steht nun, dass man den Oger und die Kartoffeln gefunden hat.


Unter "100" findet man das erste Ende der Quest. Man hat die Kartoffeln zurückgebracht. Beachte außerdem, dass unter "Result Script" die Quest beendet wird und mit "Complete Quest" die Quest im Journal zu den "abgeschlossenen Quests" verschoben wird.


Unter "200" wird die Quest auch beendet, aber wohl eher unfreiwillig. Wenn man die Dame nämlich tötet oder sie im Kampf umkommt, kann man die Quest nicht abschließen und sie wird im "Result Script" ebenfalls beendet, genau wie es mit "Complete Quest" im Journal verschoben wird. Auch diese Form der Quest-Beendung sollte man in Erwägung ziehen, denn nicht jeder Spieler ist lieb und nett. Alternativ könnte man den NPC natürlich auch "unsterblich" machen.


Nun geht es weiter auf den nächsten Reiter (reimt sich, gell). Unter "Quest Targets" befinden sich die Ziele der Quests. Es gibt natürlich zwei. Einmal den Oger und dann wieder die Dame. Diese beiden findet man hier auch. "SjirraRef" ist der Marker für die Dame (Ja, ich weiß, sie heißt Sjirra) und unter "SQ01OgreRef" findet man die Markierung des Ogers.


Unten kann man das Prinzip verstehen. Dort findet man unter "Cell" die Zelle und unter "Ref" die Referenz. Meistens sind das X-Markierungen, die man im Spiel nicht sieht (vielleicht auch immer). Wenn man mal die Drop-Down-Liste bei Ref öffnet sieht man alle Objekte der gewählten Zelle, die als Marker dienen können. Viele sind es beim Oger nicht, bei Sjirra sind es da schon mehr mögliche.

Weiter unten stehen auch noch ein paar Bedingungen. Kurz gesagt wird mit GetStage nachgeprüft, welcher Punkt der Stage gerade aktiv ist. Und wenn man mal vergleicht, erkennt man auch gleich den Plan dahinter: ist die Stage die Indexnummer 20 (da wo man Sjirra getroffen hat und von ihr die Quest erhalten hat), dann geht der Marker auf den Oger. Wenn man allerdings den Oger erschlagen hat und unter der Indexnummer 30 gesagt bekommt, dass man den Oger erschlagen hat, geht der Marker wieder zurück auf Sjirra. Wenn man den Oger allerdings vorher erschlägt, muss man Sjirra erstmal suchen, weil die Quest zwar freigeschaltet wird, man aber nicht weiß, wohin man soll. Das könnte man natürlich ändern, indem man unter der SjirraRef den Eintrag hinzufügt: "GetStage == 10" und dabei OR anklickt (ggf. sollte man bei der anderen Bedingung ebenfalls OR anklicken). Nun wird der Marker angezeigt, wenn die Quest Stage 10 ODER 30 beträgt. Allerdings hat der Spieler dann nichts mehr zu suchen. Alternativ könnte man auch schreiben, dass man (,nachdem man den Oger erschlagen hat) vielleicht im nächsten Gasthaus fragen sollte, ob die Kartoffeln jemanden fehlen. Das ist meiner Meinung nach sehr viel eleganter und interessanter zu spielen.


Und weiter zum Reiter "Topics". Das sind die Themen.


Unter "Greetings" hat man drei Einträge, die Sjirra als Erstes sagen wird, bevor sie eine Konversation beginnt. Schauen wir uns jeden nach der Reihe an:


  1. "Ihr habt sie...".Unter Conditions findet man 3 Bedingungen.
    1. GetIsID "Sjirra" ist Wahr (== 1). Vermutlich wird dadurch diese Aussage NUR auf den NPC namens Sjirra gelegt.
    2. GetStage Quest:SQ01 >= 20. Das bedeutet, die Quest-Stage muss größer oder gleich 20 sein. Das bedeutet also, dass, wenn ihr den Oger zuerst erschlagen habt, Sjirra nicht so reagieren wird. Doch halt, dann würde sie ja auch schon so reagieren, wenn man gerade erst mit ihr geredet hat. Und da greift der dritte Punkt ein:
    3. GetItemCount Ingredient: 'SQ01Potato' == 6.00, Also muss der Spieler 6 Stück des Items SQ01Potato (zu finden unter Ingredient) bei sich tragen, damit Sjirra diesen Kommentar spricht.
  2. "Ich weiß dass ihr noch keinen Erfolg gehabt habt"... Hier sind die Bedingungen genau wie zuvor, allerdings fehlt der Zusatz mit den Kartoffeln. Hier zeigt sich, dass das Programm erkennt, welches der Topics zu nehmen ist. Ich persönlich hätte wohl dort eine Bedingung eingefügt, dass die Kartoffel <6 sind, also weniger als 6. Aber es scheint zu reichen, das im anderen Topic 6 Kartoffeln verlangt werden. Wenn der Spieler diese nicht bei sich trägt, benötigt man auch keine Bedingung, denn die anderen beiden Bedingungen sind erfüllt und die dritte noch nicht. Das ist wichtig, denn damit kann man sich viel Zeit ersparen.
  3. "Könnt ihr mir helfen". Hier wurde nun auch die zweite Bedingung weggelassen. Nur noch der NPC ist als Bedingung angegeben. Also auch hier gilt wieder, wenn der Spieler sie das erste Mal anspricht, denn die anderen Bedingungen wären dann sowieso nicht erfüllt.


Achtet auch darauf, dass beim ersten Topic alle Bedingungen als "AND" also "UND" markiert sind. Das bedeutet, dass alle Bedingungen erfüllt sein müssen.


Als nächstes kommt das Thema "SQ01Potatoes". Hier sind die Themen zu der Kartoffelquest aufgeführt. Das erste Thema ist dabei die "Auflösung". Man sieht hinter dem Text (Einmal "Ach du meine Güte.." und darunter "Wie versprochen..") zwei unterschiedliche "Emotionen". Darauf hat man nämlich auch zu achten, da sie für die Gesichtsanimationen zuständig sind. Die beiden Themen werden dabei von oben nach unten abgearbeitet. Zunächst ist sie überrascht, dass wir die Kartoffeln schon haben, dann gibt's die versprochene Belohnung.


Unter den Conditions sieht man die selben Bedingungen wie eben und müssen daher nicht weiter erklärt werden. Wenn der Spieler also alle Kartoffeln hat und mindestens schon mit ihr geredet hat, wird dieses Thema gestartet. Interessanter ist nun aber das Feld "Result Script", das Ergebnis-Skript eben. Hier wird als erstes eine Belohnung gegeben: player.additem SQ01LeveledRewardList 1

Also ein Item wird ins Spielerinventar gelegt, das aus der SQ01LeveledRewardList genommen wird. Und zwar einmal (vermutlich).


Als nächstes wird mit "player.removeitem SQ01Potato 6" die 6 Kartoffeln aus dem Inventar entfernt.


Es geht aber noch weiter: Mit "setstage SQ01 100" wird die Quest-Stage auf 100 gesetzt. Damit bekommt man den Journal-Eintrag bzw. das Journal-Fenster angezeigt, das besagt, dass man die Kartoffeln abgegeben hat.


Der zweite Eintrag besagt, dass sie Kartoffeln sehr vermisst. Das ist also das Thema, das angezeigt wird, wenn man schon mit ihr gesprochen hat (Stage>=20), aber die Kartoffeln noch nicht hat. Hier sind die Bedingungen auch wieder wie eben. Man kann also deutlich erkennen, auf welche Begrüßung welches Thema folgen wird.


Das dritte ist das "erste Gesprächsthema". Hier erzählt uns nun Sjirra, dass sie tolle Kartoffeln hat und dass sie gestohlen wurden und der Dieb in westlicher Richtung verschwunden ist. Hier ist die Emotion "Sad", also traurig. Als Bedingung findet man unter Conditions lediglich, dass es sich um Sjirra handelt, die das Thema sagen darf.


Das Result-Skript ist nun wieder interessant: "setstage SQ01 20" setzt die Stage auf 20, somit wird der Journal-Eintrag unter dem Index 20 angezeigt, der besagt, dass wir mit Sjirra geredet haben und ihr die Kartoffeln wiederbeschaffen müssen.


Doch wie schaltet sich die nächste Stage frei? Da muss man ein wenig suchen, denn das wird durch ein Skript erledigt. Öffnen wir den Script-Editor und suchen dort das Skript "SQ01Potato Script", das wie folgt aussieht:

<tesscript>Scriptname SQ01PotatoScript

begin OnAdd Player

  if ( SQ01.PotatoCount < 6 )
     set SQ01.PotatoCount to ( SQ01.PotatoCount + 1 )
  endif
  if ( GetStage SQ01 < 10 ) && ( SQ01.PotatoCount >= 1 )
      setstage SQ01 10
  endif
  if ( GetStage SQ01 >= 20 ) && ( GetStage SQ01 < 30 ) && ( SQ01.PotatoCount == 6 )
      setstage SQ01 30
  endif

end</tesscript>

Was bewirkt das Skript?


Es beginnt bei einem "OnAdd", also wenn der Spieler etwas aufnimmt. Doch was? Na, das ist doch logisch: wenn man mal unter "Items->Ingredients" schaut, findet man dort das Item "SQ01Potato" und wenn man dieses doppelt anklickt, sieht man, dass "unser" Skript mit diesem Objekt verbunden ist (unter "Script"). Nun bekommt das Ganze auch einen tiefen Sinn.


Wenn der Spieler also dieses Objekt aufnimmt, wird das Skript gestartet. Nun prüft das Skript: wenn SQ01.PotatoCount kleiner als 6 ist, wird SQ01.PotatoCount um eins erhöht. Das wird so lange getan, bis der Spieler sechs Kartoffeln aufgenommen hat (er kann ja beim Plündern des Inventars auswählen, ob er eine oder alle Kartoffeln aufnimmt, auch mit dieser Auswahl muss also gerechnet werden). Dabei erinnern wir uns, dass PotatoCount eine Variable ist, die mit der Quest deklariert wurde. Also ist es so, dass dieses Skript pro Kartoffel einmal ausgeführt wird. Nimmt der Spieler also 6 Kartoffeln gleichzeitig auf, wird das Skript auch 6 mal durchlaufen (vermutlich, sonst würde die Rechnung ja nicht aufgehen). Dieser Punkt ist also sehr sehr wichtig, denn sehr oft bestehen Quests ja daraus, eine bestimmte Anzahl von Sachen zu holen.


Nun die nächste If-Bedingung: Als erstes wird mit GetStage die Stage erfragt. Also wenn die Stage kleiner als 10 ist UND (&&) SG01.PotatoCount größer oder gleich 1 ist, wird die Stage auf 10 gesetzt. Dem Spieler wird dann angezeigt, dass er seltsame Kartoffeln gefunden hat.


Aber warum nur eine Kartoffel? Ganz einfach, auch wenn der Spieler nur eine Kartoffel aufnimmt, wird ihm angezeigt, dass die Kartoffeln etwas besonderes sind. Damit kann man auch erreichen, dass der Spieler die anderen Kartoffeln an sich nimmt. Von daher ist es also logisch. Und natürlich, die Quest muss sich unter 20 befinden, denn wenn der Spieler die Quest schon angenommen hat, braucht ja die Stage 10 nicht mehr angezeigt werden.


Nächste If-Bedingung: Wenn die SQ01 Stage gleich oder größer als 20 ist UND die SQ01 Stage kleiner als 30 ist UND SQ01.PotatoCount genau (==) 6 beträgt, wird die Stage 30 gesetzt. Und somit dem Spieler angezeigt, dass er die Kartoffeln gefunden hat. Das wiederum bringt dann auch den Marker zurück auf Sjirra.


Hier sieht man auch sehr schön, wie Variablen gehandelt werden. Weil die Variable PotatoCount ja mit der Quest SQ01 deklariert wird und dort genutzt wird, wird sie auch mit SQ01.PotatoCount aufgerufen. Wäre interessant zu erfahren, was wäre, wenn man die Variable nur in dem Potato-Skript deklarieren würde...


Wer es noch nicht gemacht hat, kann auch die "Quest-Kartoffel" mal im Objekt-Fenster anschauen. Prinzipiell ist es eine einfach kopierte Kartoffel. Aber sie ist auch ein "Quest Item" und hat das Skript. Sie ist allerdings auch noch essbar. Der Spieler kann also die Kartoffel auch essen? Das wäre aber doof, denn so schnell bekommt er die Kartoffeln nicht wieder und dann wäre die Quest immer offen... Ich würde das sicherlich ausschalten. Allerdings muss der Abenteurer ja auch nicht gleich alles in den Mund nehmen.


Der letzte "wichtige" Reiter ist der "Conversation"-Reiter. Hier findet man zwei Themen. Einmal das "HELLO" und das "GOODBYE". Das sind die Themen, die Sjirra sagt, wenn man sie anspricht bzw. das Gespräch beendet. Auch hier kann man die selben Bedingungen sehen wie schon zuvor.


Abschließend kann ich noch sagen, dass man, wenn man im Conditions-Bereich mit der rechten Maustaste klickt, ein Kontext-Menü öffnen kann, bei dem man unter anderem "Copy Condition" unten auswählen kann. Das ist sehr hilfreich, wenn sich Condition ständig wiederholen. Und wie man es in dieser Quest gesehen hat, wiederholen sich die Conditions/Bedingungn recht häufig.


Im Grunde genommen kann man dieses Beispiel schon ganz gut verwenden, denn prinzipiell geht es immer so zu. Es gibt eigentlich immer diese drei Arten: Spieler kennt die Quest noch nicht, Spieler hat die Quest erlangt und noch nicht ausgeführt und Spieler hat Questbedingungen erfüllt. Lediglich beim Besorgen mehrerer verschiedener Sachen bzw. dem Erledigen verschiedener Sachen, muss man um mehrere Ecken denken.


Ich weiß nicht wie es euch geht, aber mir hat diese Aufarbeitung "von hinten" ganz gut geholfen und ich denke, ich habe das Prinzip jetzt besser verstanden. Dieses ist aber kein "Profi-Bericht", es können sich also durchaus Denkfehler eingeschlichen haben, vor allen Dingen dort wo ich "vermutlich" hingeschrieben habe. Wie gesagt, die englische "Original"-Dokumentation lässt einen dort ganz schön im Stich.