Ablauf einer Quest
Auch wenn eine Quest von der Erstellung her ziemlich einfach aussieht, verbergen sich doch ziemlich viele Möglichkeiten, aber auch Fallstricke dahinter, gerade wenn mehrere Trigger oder Goals benutzt werden.
Die Drei Zustände einer Quest
- Nicht ausgelöst - NotTriggered (Skript: QuestState.NotTriggered)
- Aktiv - Active (Skript: QuestState.Active)
- Beendet - Over (Skript: QuestState.Over)
Die möglichen Ergebnisse
- Erfolgreich - Success (Skript: QuestResult.Success)
- Niederlage - Failure (Skript: QuestResult.Failure)
- Abbruch - Interrupted (Skript: QuestResult.Interrupted)
Ablauf
Durch die Erstellung der Quests im Editor werden alle angelegten Quests gleich zum Start der Karte erzeugt, dass heisst alle Quests befinden sich von da an im Status „Nicht ausgelöst“.
Betrachten wir nun den Status einer einfachen Quest, die das Kennenlernen eines Dorfes ermöglichen soll.
Vorraussetzung: Dieses Dorf muss im Kartenassistenten auf „Unbekannt“ gestellt sein und die ID 3 haben.
Name der Quest: HalloDorf3
Quest Geber: 3
Quest Empfänger: 1
Zeitlimit: 0
Versteckte Quest: Nein, kein Haken
Start Nachricht: „Hallo, wir würden uns über Deinen Besuch freuen.“
Erfolgsnachricht: „Schön Dich zu sehen.“
Niederlagenachricht: Kann leer bleiben, da man diese Quest nicht verlieren kann.
Verhalten:
Trigger_Time: 30
Goal_DiscoverPlayer: 3
Reward_SlightlyDiplomacyIncrease: 3
Diese Quest wird also beim Kartenstart erstellt und befindet sich dann im Zustand „Nicht ausgelöst“. Das Spiel fragt nun einmal in der Sekunde (Spielzeit, bei schnellem Vorlauf entsprechend schneller), ob die Auslösebedingung erfüllt ist. Da hier nur ein Trigger gesetzt wurde, wechselt die Quest damit nach 30 Sekunden (Spielzeit) in den Status „Aktiv“. Zum selben Zeitpunkt wird die Startnachricht abgespielt.
Wichtig Man kann im Spiel nicht zuverlässig den Zeitpunkt erkennen, etwa indem man sich auf das Starten der Startnachricht bezieht. Etwaige laufende Nachrichten anderer Quests verzögern zwar das Abspielen der Nachricht, nicht aber den Beginn des Status „Aktiv“. Auch eventuelle Zähler laufen dann schon vor Erscheinen der Startnachricht. Nur der Questbutton oben links unter dem Stadtmenü erscheint zuverlässig zum Zeitpunkt des Aktivwerdens.
Nun ist die Quest also aktiv und für den Spieler sichtbar, er hat den Starttext vielleicht gelesen UND bekommt in diesem Fall auch durch ein eindeutiges Symbol seine Aufgabe angezeigt. Ab jetzt fragt das Spiel die Goals der Quest, in unserem Fall nur eines, einmal in der Sekunde (Spielzeit) nach ihrem Ergebnis. Unser Goal_DiscoverPlayer meldet nun aller Wahrscheinlichkeit nach immer wieder „nil“. (Der Player 3(Dorf) wurde noch nicht entdeckt.) Reitet der Spieler nun zu diesem Dorf, meldet das Goal in der ersten abgeschlossenen Sekunde danach „true“, also Erfolg.
Daraufhin beendet sich die Quest, wechselt in den Status „Beendet“ und setzt ihr Ergebnis auf „Erfolgreich“ und spielt die Erfolgsnachricht ab.
Wichtig Auch hier gilt: Den Zeitpunkt kann man im Spiel nur durch das Verschwinden des Questbuttons sehen, die Nachricht kann durch andere Nachrichten verzögert werden.
Wenn, wie in unserem Beispiel, Rewards oder Reprisals angegeben wurden, wird nun geprüft zu welchem Ergebnis die Quest gekommen ist. (Erfolgreich/Niederlage) Dann wird das dementsprechende Verhalten aufgerufen.
Unsere Quest war erfolgreich, also wird die Belohnung, der Reward_SlightlyDiplomaceIncrease, aufgerufen. Dieser Reward erhöht die Diplomatie zwischen dem Player 1 und (von uns angegeben) dem Player 3 um eine Stufe. Nun ist uns der Player 3 also nicht mehr „Unbekannt“, sondern „Bekannt“.
Fallstricke
Nun haben wir das Dorf kennen gelernt, auch mal ein paar Meldungen gesehen, Auswirkungen registriert. Soweit so einfach. Was aber, wenn wir den Start oder das Ende der Quest von mehreren kombinierten Bedingungen abhängig machen wollen?
Wir können ja noch nicht mit dem Dorf handeln. Das soll sich ändern.
Vorraussetzung: Das Lagerhaus von Player 3 muss einen Skriptnamen haben, hier Lagerhaus3
Name der Quest: Dorf3WillHandeln
Quest Geber: 3
Quest Empfänger: 1
Zeitlimit: 0
Versteckte Quest: Nein, kein Haken
Start Nachricht: „Bitte liefere uns etwas Seife, unsere Metzgerei ist zur Zeit so dreckig, dass wir nicht schlachten können. Wenn Du dann zu unserem Lagerhaus kommst, werden wir unseren Handelsvertrag besiegeln.
Erfolgsnachricht: „Danke sehr. Nun lasst uns handeln“
Niederlagenachricht: Kann leer bleiben, da man diese Quest nicht verlieren kann.
Verhalten:
Trigger_Time: 30
Trigger_OnQuestSuccess: HalloDorf3
Goal_Deliver: G_Soap, 10
Goal_KnightDistance: Lagerhaus3
Reward_SlightlyDiplomacyIncrease: 3
Nun kommen wir zu den Eigenheiten. Ich habe zusätzlich zum Trigger_OnQuestSuccess den Trigger_Time mit 30 Sekunden gesetzt, weil ich gerne einen kleinen Abstand zwischen Ende der ersten und Beginn der zweiten Quest hätte. Pustekuchen. Hier habe ich vergessen, dass alle Trigger von allen Quests schon von Beginn der Karte an abgefragt werden, dieser Trigger_Time also schon lange „Ausgelöst“ gemeldet hat.
Nun gut, aber der zweite Trigger hat trotzdem wie gewollt den Start der Quest zumindest soweit hinaus gezögert, bis die erste Quest erfolgreich beendet ist. (Trigger_OnQuestSuccess, das Success bedeutet er würde nicht auslösen, wenn man die erste Quest verlieren würde.)
Man kann in dieser Kombination sehr gut beobachten, dass der erste Questbutton durch den zweiten ersetzt wird, während noch die Erfolgsnachricht der ersten Quest auf dem Bildschirm ist. Erst danach wird die Start Nachricht der zweiten Quest abgespielt, obwohl diese schon seit ein paar Sekunden „Aktiv“ ist.
Mit den beiden Goals wollten wir nun erreichen dass der Spieler zum einen Seife liefern soll UND den Helden zum Lagerhaus von Dorf3 hinreiten soll. Häufig wird das auch so klappen, entweder wartet der Spieler auf das Eintreffen der Lieferung am Lagerhaus, oder er reitet erst später hin.
Aber sicher sein kann man sich hier nicht. Was passiert genau?
Mit dem Wechsel von „Nicht ausgelöst“ zu „Aktiv“ beginnt die Quest, beide Goals jede Sekunde(Spielzeit) einmal zu fragen, ob die dadurch gesetzte Bedingung erfüllt wurde. Das Goal_Deliver meldet solange „nil“, wie der Karren noch nicht am Lagerhaus angekommen ist. Danach meldet es genau einmal „true“, und wird nicht mehr nach seiner Meinung gefragt. Das Goal_KnightDistance wiederum meldet solange „nil“, bis der Held in der Nähe des Lagerhauses ist, danach meldet auch dieses Goal genau einmal „true“ und wird nicht mehr gefragt“. Die Quest merkt sich stattdessen die „true“-Meldung und fragt nur noch unbestätigte Goals ab, wenn vorhanden.
Erst wenn alle Goals „true“ gemeldet haben, ist eine Quest gewonnen
Wir können hier also innerhalb einer Quest weder eine Reihenfolge der Bedingungen festlegen, noch eine Gleichzeitigkeit erzwingen. In unserem Fall könnte also der Player zum Lagerhaus hinreiten, wieder nach Hause und dann erst die Seife losschicken, damit hätte er diese Quest auch gewonnen.
Der erneute Reward_SlightlyDiplomacyIncrease bewirkt wieder eine Erhöhung des Diplomatiestatus um eins, diesmal von „Bekannt“ auf „Handelspartner“, also können wir nun mit Dorf 3 handeln. Ohne Veränderungen im Kartenscript können wir allerdings nur dem Partner etwas verkaufen, Angebote müssten wir dort festlegen.
Es fehlt zu Beginn bei den Ergebnissen die Unterbrechung (QuestResult.Interrupted). Ist zwar ein relativ seltener Fall, tritt aber manchmal auf. Old McDonaldDanke — zweispeer 15/02/2008 08:02♦




