Modding Grundlagen

Da es immer mal wieder vorkommt, dass danach gefragt wird, wie man Drakensang moddet, habe ich eine kleines Tutorial dazu geschrieben. Es ist nur ein kleines, einfaches Beispiel, dass nur einen kleinen Teil behandelt, sollte aber als Einstieg ins Modding ausreichen. Ich hoffe es ist einigermaßen verständlich formuliert.

Den gesamten SQL Code für die Beispielquest findet ihr am Ende des Tutorials.

Bei Fragen und Problemen nutzt bitte diesen Thread.

Modding Grundlagen

Alles, was im Spiel vorkommt und geschieht, ist in drei Datenbanken festgehalten. Modden bedeutet, die Tabellen in diesen Datenbanken um zusätzliche Einträge zu erweitern.
Sie sind im Verzeichnis: Drakensangverzeichnis\export\db abgelegt.

static.db4 Die static.db4 enthält alles, was sich während eines Spieldurchgangs nicht ändert, z.B. Dialoge, Bedingungen usw.
game.db4 Die game.db4 wird nur verwendet, wenn ein neues Spiel begonnen wird. Sie enthält alles, was sich während eines Spieldurchgangs dynamisch verändert. Die Savegames sind erweiterte Versionen der game.db4. Diese haben als Erweiterung .dsa.
locale.db4 Die locale.db4 enthält sämtliche Texte, die im Spiel vorkommen.

Bei Am Fluss der Zeit sind das Verzeichnis und die Datenbanknamen identisch. Bei dem Addon Phileassons Geheimnis werden die Datenbanken gamea1.db4 und statica1.db4 verwendet.

Die Datenbanken liegen im SQLite Format vor. Zur Bearbeitung wird ein entsprechender Datenbankbrowser benötigt.

Tools
Da es leider keine speziellen Modding Tools wie bei anderen Spielen gibt, ist man auf eine Reihe von anderen Programmen angewiesen.

SQLite Browser
http://sourceforge.net/projects/sqlitebrowser

Vorteil: Einzelne Felder einer Tabelle können bearbeitet werden
Nachteil: BLOBs werden nur ANSI-codiert angezeigt

SQLite Manager
https://addons.mozilla.org/en-US/fir...qlite-manager/

Vorteil: zeigt BLOBs richtig an
Nachteil: öffnet immer einen kompletten Datensatzzur Bearbeitung, dauert manchmal etwas länger

Warum sind BLOBs wichtig? Sie werden als Primärschlüssel verwendet, d.h. das ist der Wert, der einen Datensatz eindeutig macht. Verknüpfungen zu anderen Tabellen werden darüber hergestellt. Deshalb ist mein Favorit der SQLite Manager.

Drakensang BLOB Tool
Dient zum Umwandeln von BLOBS in Identifikatoren und umgekehrt. Wird besonders wichtig bei Conditions, Statements und Dialogen.
http://mods.jo-ge.net/dsa4/dl/blobtool.exe

BLOB Generator

Erzeugt auf Zufallsbasis neue BLOBs. Hat sich für mich als äußerst nützlich erwiesen.
http://dl.worldofplayers.de/wop/drak...s/blob-gen.zip

NPK-Unpacker
Dieser wird gebraucht um die Grafiken, die sich in den *.npk Dateien befinden, auszupacken.
http://mods.jo-ge.net/dsa4/dl/nnpktool.zip

N2Tool
Mit diesem Tool können einzelne Einträge aus den n2 Dateien extrahiert und modifiziert werden.
http://mods.jo-ge.net/dsa4/afdz/n2tool.zip

Texteditor

Unter Windows verwende ich Notepad+. Dieser universell einsetzbare Editor unterstützt auch SQL Dateien mit Syntax Highlighting. Außerdem ist es möglich Makros zu erstellen, mit denen die Erzeugung von SQL Anweisungen automatisiert werden kann, was wiederum eine Menge Zeit spart und nebenbei auch noch die Anzahl der Tippfehler verringert.
http://notepad-plus-plus.org

Tabellenkalkulation

Eine Tabellenkalkulation (Excel/Calc) verwende ich zum Anlegen der Tabellen. Diese werden dann im Editor in SQL Anweisungen umgewandelt.

Wichtig: Legt auf jeden Fall Sicherheitskopien der Datenbanken an. Falls mal etwas absolut schiefgeht, erspart euch das eine Neuinstallation.

BLOBs

Da jetzt schon mehrfach diese BLOBS erwähnt worden sind, werfen wir jetzt einen näheren Blick darauf. Beim Modden werden sie an genau zwei Stellen benötigt:
GUID
Transform
Beim Drakensang Modding werdet ihr immer wieder auf sogenannte BLOBs treffen. Diese werden vor allem als GUID in den Tabellen verwendet und müssen in jeder Tabelle eindeutig sein. Dann haben sie dieses Aussehen:

X'12EB79F8DD88A564DA15659A728DC8C3'

Es handelt sich um einen hexadezimal notierten String, der mit einem X beginnt und von einfachen Anführungszeichen umschlossen ist. Häufig wird aus anderen Datensätzen auf diese GUID verwiesen. Dieser Verweis sieht dann so aus:

f879eb12-88dd-64a5-da15-659a728dc8c3

Des weiteren werden BLOBs bei den Transforms verwendet. Dabei handelt es sich um die genaue Stelle, an der sich ein NPC oder Gegenstand befindet. Diese BLOBs sehen so aus:

X'91B5943C0000000033F57FBF00000000000000000000803F000000000000000033F57F3F000000 0091B5943C000000004A232BC3CED2A740305412430000803F'

Darin enthalten ist auch die Größe des Objekts (Größenänderung funktioniert allerdings nicht bei allen Objekten) und auch die Höhe, in der sich das Objekt befindet. Bei Triggern bestimmt der Transform auch die Größe des Triggers.

BLOBs kommen zwar auch noch an anderen Stellen in den Datenbanken vor, können wir zum Modden aber erst einmal außer acht lassen.
Wenn die Blobs im SQLite Manager nicht richtig angezeigt werden, muss in den Einstellungen im Reiter Benutzeroberfläche der Wert unter Größe von BLOB-Daten anzeigen vergrößert werden.

SQL
SQL ist eine Datenbanksprache zum Erstellen und Bearbeiten von relationalen Datenbanken. Zum Modden ist es keineswegs nötig diese Sprache zu lernen. Im Prinzip werden nur zwei Befehle benötigt, der INSERT Befehl um Datensätze in eine Tabelle einzutragen und der UPDATE Befehl um bestehende Datensätze zu verändern.

******************************************************************************** ***********************

Quest Modding

Um eine neue Quest für Drakensang zu erstellen, benötigt man zunächst eine kleine Geschichte. Daraus ergibt sich dann von allein, was noch alles benötigt wird. Für den Anfang machen wir es ganz einfach. Am ersten Zelt in Avestreu treffen wir auf Alrik Sturmfels. Dieser ist Händler und bittet uns ihm ein Proviantpaket von Wirt Thalion zu besorgen. Die Warterei hat ihn überaus durstig gemacht. Selbst möchte er auch nicht gehen, da er befürchtet, dass während seiner Abwesenheit seine Waren gestohlen werden könnten.

Den gesamten SQL Code findet ihr am Ende des Dokuments.

Die Zutaten
  • Ein NPC als Questgeber
  • Ein Dialog
  • Eine Quest mit Unterquesten
  • Ein Questgegenstand, den es zu besorgen gilt
  • Eine paar Statements und Conditions

Die Tools
  • Texteditor (z.B. Notepad+)
  • SQLiteManager (Addon für Firefox)
  • Tabellenkalkulation
  • Jog‘s BLOB Tool
  • BLOB Generator


******************************************************************************** ******************

Einen NPC erstellen
Eigene NPCs zu erstellen ist eigentlich recht einfach. Dazu wird die game.db4 im SQLite Manager geöffnet. In der Tabelle _Instance_NPC findet ihr die NPCs. Um einen neuen zu bekommen ist es am einfachsten eine bereits vorhandenen NPC zu duplizieren. Dazu gibt es zwei Möglichkeiten:

Ihr klickt mit der rechten Maustaste auf einen NPC und wählt aus dem Kontextmenü Datensatz duplizieren. Da der SQLite Manager immer den vollständigen Datensatz öffnet und die Tabelle _Instance_NPC 252 Spalten hat, dauert es eine Weile, bis der Datensatz geöffnet wird und der NPC bearbeitet werden kann.

So wie bei der ersten Möglichkeit, nur wählt ihr diesmal Zeilen als SQL kopieren aus. Diesen fügt ihr jetzt in einen Texteditor ein. Der Vorteil ist, dass die Bearbeitung und auch nachträgliche Änderungen schneller vorgenommen werden können. Nachteile sind, dass noch der Tabellenname eingefügt werden und die doppelten Anführungszeichen bei Guid und _Transform noch entfernt werden müssen. Außerdem sieht man leider nicht sofort, welcher Wert zu welcher Spalte gehört. Bei der Suche nach bestimmten Spalten/Werten muss man also immer noch in die Tabelle schauen.

Bei dem neuen NPC müssen in diesen Spalten Änderungen vorgenommen werden:

Guid eindeutiger Bezeichner als BLOB
_ID enthält Verweis auf das Objekt und einen eindeutigen Bezeichner als Text
_Level Name des Gebiets
_Transform Position innerhalb des Gebiets
Name eindeutiger Bezeichner als Text, Name wird immer verwendet, wenn ich auf den NPC zugreife, also bei Dialogen, Übergabe von Gegenständen usw. Drakensang verwendet bei den eindeutigen Bezeichnern als Text immer unterschiedliche Werte, AFdZ hat bei allen den gleichen Wert. Das mache ich bei unserer Mod genauso. Bei unterschiedlichen Bezeichnern für das gleiche Objekt kommt man schnell durcheinander.
LookAtText Text, der erscheint, wenn man auf den NPC zeigt, der Text selbst wird in der locale.db4 hinterlegt
Faction die Gesinnung des NPCs gegenüber dem Helden und anderen NPCs
CanTalk muss auf 1 gesetzt sein, damit er überhaupt angesprochen werden kann
Groups muss leer sein, beim Duplizieren kann es passieren, dass hier ein Wert steht, der dann zu einem Absturz führt
CharacterSet bestimmt das Aussehen des NPCs

Eine neue Guid bekommt ihr entweder mit dem BLOB-Generator oder indem ihr den aktuellen Wert an einigen Stellen ändert.
Den Wert für die Spalten _ID, Id und Name kann frei gewählt werden. Für unseren NPC in diesem Beispiel nehmen wir den Wert loc01_alrik_sturmfels. Achtung, SQLite unterscheidet zwischen Groß- und Kleinschreibung. Wenn von anderen Tabellen aus (z.B. Dialoge) auf diesen NPC zugegriffen wird, wird immer der Wert aus der Spalte Name verwendet. Bei dem Eintrag für den Lookattext nehmen wir lookat_alrik_sturmfels.

Die Bezeichnung für das Gebiet (= _Level), in dem der NPC stehen soll, entnimmt man am einfachsten der Tabelle _Instance_Levels aus der game.db4. Avestreu hat z.B. die Bezeichnung location01.

Den Transform für den NPC ist ebenfalls leicht zu bekommen. Dazu startet ihr das Spiel und stellt euren Helden an die Stelle, an der der NPC stehen soll. Anschließend beendet ihr Drakensang und öffnet den Spielstand continue_0 und wechselt zur Tabelle _Instance_PC. Diese Tabelle enthält den Helden und die Begleiter. Der letzte Eintrag ist euer Held. Kopiert den BLOB aus der Spalte Transform und fügt ihn in den Datensatz für den neuen NPC ein.

Beispieltransform, Avestreu, vor dem ersten Zelt hinter der Brücke

X'91B5943C0000000033F57FBF00000000000000000000803F000000000000000033F57F3F000000 0091B5943C000000004A232BC3CED2A740305412430000803F'

Position für den neuen NPC
[Bild: mod_npc_01.jpg]

Und so sieht es aus, wenn der NPC vor dem Zelt steht.
[Bild: mod_npc_02.jpg]


Außerdem sollten noch die Spalten Faction, CanTalk und Groups kontrolliert werden. Faction bestimmt, ob sich der NPC dem Helden gegenüber freundlich oder feindlich verhält. Da wir später mit unserem NPC auch noch ein Gespräch führen wollen, wird als Wert FaAllFriendly gewählt. Das Feld CanTalk muss den Wert 1 enthalten und das Feld Groups muss leer sein. Zum Schluss löschen wir noch einen eventuell vorhandenen Eintrag in der Spalte ScriptPreset.

Natürlich sind auch die anderen Spalten der NPC Tabelle wichtig, werden aber im Moment noch nicht benötigt. Wir werden später einen Blick darauf werfen.

Der neue Datensatz sieht dann ungefähr so aus:

Code:
INSERT INTO "_Instance_NPC" VALUES (X'1BBCC45707D768479BF963F3E0A7D757',"|Level|Objects|NPC|belebte_welt|loc01_alrik_sturmfels","location01","",X'91B5943C0000000033F57FBF00000000000000000000803F000000000000000033F57F3F0000000091B5943C000000004A232BC3CED2A740305412430000803F',"loc01_alrik_sturmfels","","0","0","1","loc01_alrik_sturmfels","0","characters/mensch_m","stateobjects/versteinert_mensch","1","npc_gen_doerfler_02_low","","mensch_m_spazieren","","","","","mann17","0","dummies/char","","FaAllFriendly","simple_fighter","0.699999988079071","0.9800000190734863","3.4000000953674316","4","lookat_alrik_sturmfels","1","15","","","NPC","","","","Mittellaender","rob_trash","","0","1","10","1","10","1","10","8","20","20","8","8","8","8","8","0","0","0","0","0","0","0","0","0","0","0","0","-500","-500","0","0","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","1","1","1","1","1","1","1","1","1","1","1","1","1","1","-500","1","1","1","1","1","1","20","0","0","0","0","0","0","20","0","0","5","5","0","5","1","3","1","3","20","0","0","0","0","0","0","0","0","0","All","","Medium","map/map_marker_blue","InSight","","","","","","0","20","characters\\physiks_dummy","1","1","1","0","1","","","","1","0.5","","0.44999998807907104","leather","Everything","1","0","","1","1","30","100","15","1","-1","0","",null,null);
Dieser Datensatz wird jetzt kopiert und im SQLite Manager im Reiter SQL ausführen eingefügt. Ein abschließender Klick auf die Schaltfläche SQL ausführen fügt den neuen NPC ein.

Anschließend legen wir noch den LookAtText für die Locale.db4 an.
Code:
INSERT INTO "_Locale" VALUES ('lookat_alrik_sturmfels','Alrik Sturmfels');
Danach startet ihr Drakensang und beginnt ein neues Spiel. Der neue NPC steht jetzt hinter der Brücke.

******************************************************************************** ******************
Einen Dialog erstellen I

Dialoge zu erstellen ist etwas aufwendiger, da hier eine Reihe von Tabellen aus der static.db4 benötigt werden. Fangen wir zunächst mit dem Text an.

Alrik Sturmfels Seid gegrüßt. Alrik Sturmfels mein Name. Ihr wollt sicher auch nach Ferdok?
Held Ich grüße Euch auch. Ich heiße <FullName>. Ja, ich werde dort erwartet.
Alrik Sturmfels So wie es aussieht, wird man dort noch länger auf Euch warten müssen. Ferdok ist abgeriegelt und die Gardisten lassen niemanden weiterreisen. Hoffentlich ist das bald vorbei.
Held Ja, das habe ich schon erfahren. Da ich jetzt auch hier festsitze, werde ich mich zunächst einmal umschauen.
Alrik Sturmfels
Alrik Sturmfels Da seid Ihr zu beneiden. Ich kann hier nicht weg. Muss auf meine Sachen aufpassen. Sonst wird noch etwas gestohlen. Ich bin nämlich Händler, müsst Ihr wissen.
Held Tatsächlich? Kann ich dann Eure Waren einmal sehen?
Alrik Sturmfels Nein, leider nicht. Dazu müsste ich die Sachen erst mal auspacken. Danach steht mir überhaupt nicht der Sinn. Aber vielleicht...
Held Ja?
Alrik Sturmfels Wie schon gesagt, ich kann hier leider nicht weg. Und die Warterei hat mich hungrig und durstig gemacht. Ich mache Euch folgenden Vorschlag. Hier habt Ihr fünf Silbertaler. Damit geht Ihr für mich zum Avestreuer Gasthaus, dem Scharfen Schwert, und lasst Euch von Wirt Thalion ein kleines Proviantpaket für mich schnüren. Zum Dank lasse ich Euch meine Waren sehen und Ihr bekommt noch einen ordentlichen Rabatt von mir. Einverstanden?
Held Einverstanden. Bis später.

Nach der Annahme der Quest muss der Dialog noch erweitert werden.

Alrik Sturmfels Da seid Ihr ja wieder. Habt Ihr mein Proviantpaket?
Held Nein, leider noch nicht.
Held Ja. Bitte sehr, das Proviantpaket.


Wir werden den Dialog später noch erweitern, um mit Alrik auch handeln zu können.

Für die jeden Texteintrag brauchen wir jetzt eine eindeutige GUID, z.B.

X'94C67AE932D278F35DFC140D6B26C001'


Diese werden in der Tabelle _Story_DialogTakes verwendet. Für die locale.db4 brauchen wir diese GUID in ihrer anderen Form als Identifikator, also

e97ac694-d232-f378-5dfc-140d6b26c001

Diesen Wert nummeriere ich für jeden einzelnen Wert durch. Das sieht dann so aus:

[Bild: mod_dialog_04.jpg]

Jetzt stellt sich die Frage, wie wir diese Tabelle in die Datenbank bekommen. Jeden Eintrag einzeln anzulegen würde sicherlich funktionieren, wäre aber sehr arbeits- und zeitaufwendig. Ich gehe dabei folgendermaßen vor:
Die fertige Tabelle kopiere ich in eine Textverarbeitung und wandele sie dort in Text mit Trennzeichen Komma um. Das wird dann in den Texteditor (z.B. Notepad+) kopiert. Anschließend setze ich vor jede Zeile die SQL-Anweisung INSERT INTO "_Locale" VALUES(. Danach müssen noch die beiden Werte in einfache Anführungszeichen gesetzt werden und die Anweisung mit einer ) und einem ; abgeschlossen werden.

[Bild: mod_dialog_05.jpg]

Jetzt muss der Dialog noch in der static.db4 hinterlegt werden. Dafür werden drei Tabellen benötigt.


_Story_Dialogs Enthält für jeden Dialog einen Eintrag mit eindeutiger Bezeichnung
_Story_DialogTakes Enthält für jede Zeile eines Dialogs einen Eintrag mit Verweis auf _Story_Dialogs
_Story_DialogTakeChildMapping Legt fest, wie die Dialogzeilen aufeinanderfolgen

Tabelle _Story_Dialogs

DialogGUID eindeutiger Bezeichner als BLOB
DialogId eindeutiger Bezeichner als Text
DialogName identisch mit DialogId
DialogSpeaker Der Sprecher, hier steht der Wert aus der Spalte Name in der NPC Tabelle
DialogGroup wird nicht benötigt, bleibt immer leer
DialogAsConversation legt fest, ob es ein richtiger Dialog mit dem Helden oder ein Sprechblasendialog ist, Wert ist 0 oder 1

Die Einträge für diese Tabelle lege ich immer an, indem ich einen vorhandenen Datensatz dupliziere und dann die Änderungen vornehme.

[Bild: mod_dialog_01.jpg]


Tabelle _Story_DialogTakes

TakeGUID Eindeutiger BLOB
DialogGUID DialogGUID aus _Story_Dialogs
DialogId DialogId aus _Story_Dialogs
TakeId Eindeutige Bezeichnung für den Take als Text
TakeSpeaker Der Sprecher des Takes, i.d.R. abwechselnd der Sprecher aus _Story_Dialogs und Player
TakeType Bei NPCs: Take, bei Player: Response
TakeEmote Animation des Sprechers, Einträge stammen aus _Template_Emote
TakeSound Name der Tondatei, leer wenn unvertont
TakeSoundActiv 1, wenn Tondatei vorhanden, sonst 0
TakeText Leer, wird nicht benötigt
TakeShortText Leer, wird nicht benötigt
ConditionRef Verweis auf GUID in _Story_DialogConditions
ConditionBlock Verweis auf BlockGUID in _Story_DialogConditions
TakeLocaId Verweis auf Texteintrag in Tabelle _Locale
TakeTimeStamp 0
TakeShortTextLocaId beliebiger BLOB, wird nicht benötigt

Für die Tabelle _Story_DialogTakes wird außerdem eine, immer gleich aufgebaute, Startzeile benötigt, deren Inhalt von dem der normalen Dialogzeilen abweicht.

Da hier eine ganze Reihe von Datensätzen angelegt werden müssen, lege ich die Tabelle in einer Tabellenkalkulation an.

Zuerst erzeuge ich mit dem BLOB-Generator einen neuen BLOB und kopiere ihn in die Tabelle. Die letzten beiden Zeichen ändere ich in 00. So wird aus X'698F73E1D121A25DF926CAAC9F90543C' X'698F73E1D121A25DF926CAAC9F905400'. Außerdem lösche ich das letzte Anführungszeichen, damit der BLOB einfach kopiert werden kann und gleichzeitig die letzte Stelle automatisch weitergezählt wird. Nicht vergessen, danach noch die Anführungszeichen wieder einzugeben. Anschließend werden DialogGUID und DialogId in die Tabelle kopiert. Das sieht dann ungefähr so aus.

[Bild: mod_dialog_02.jpg]

Danach wird die erste Zeile des Dialogs ausgefüllt. In die Spalten TakeId und TakeType kommt der Eintrag StartState, die Spalte TakeSpeaker bleibt hingegen leer. TakeSoundActiv erhält den Wert 0, die Spalten in denen üblicherweise BLOBs stehen, bekommen einen leeren BLOB: X'00000000000000000000000000000000'.

[Bild: mod_dialog_03.jpg]

Jetzt fehlt noch eine eindeutiger Bezeichner für den Take als Text. Ich verwende dazu immer die DialogId, lösche das id daraus und füge stattdessen eine laufende Nummer ein. So finde ich die dazugehörigen DialogGUIDs und Textzeilen schneller. Außerdem kann ich den Wert dann einfacher kopieren. Natürlich funktioniert hier auch jeder andere Text.

Die Spalten ConditionRef und ConditionBlock füllen wir zunächst ebenfalls mit dem BLOB X'00000000000000000000000000000000' aus. Wir werden hinterher einige Zeilen mit Bedingungen versehen, aber um zu testen, ob der Dialog grundätzlich funktioniert, sind diese vorerst nicht notwendig. Die Animationen in der Spalte TakeEmote lassen wir auch erst einmal leer. Diese sind ohnehin bei jedem Dialog und jedem Take unterschiedlich.
Die Spalte TakeLocaId wird mit dem Wert als BLOB ausgefüllt, den für die Texte verwendet haben. Das ist besonders wichtig. Stimmen hier BLOB und Identifikator nicht überein, werdet ihr nur Fehlermeldungen lesen können.

Jetzt fehlt noch die Tabelle _Story_DialogTakeChildMapping, damit das Spiel weiß, wie die einzelnen Dialogzeilen aufeinanderfolgen.

Tabelle _Story_DialogTakeChildMapping

TakeGUID Die GUID des Takes aus der Tabelle Tabelle _Story_DialogTakes, auf die sich bezogen wird
TakeChildId Der entsprechende Wert aus der Spalte TakeId
TakeChildPosition Wenn es beim Player mehrere Antworten gibt, wird durch diesen Wert die Reihenfolge der Antworten festgelegt, ist üblicherweise 0
DialogGUID Die GUID des Dialogs

Der Dialog ist recht einfach gehalten, da die einzelnen Zeilen alle aufeinanderfolgen.

Die erste Zeile eines Dialog bezieht sich immer auf die Zeile mit dem Eintrag StartState, also die, mit der der Dialog beginnt. Nachdem man die Quest angenommen hat, startet der Dialog natürlich mit einer anderen Zeile.

[Bild: mod_dialog_06.jpg]

Jetzt müssen alle Einträge noch in SQL-Anweisungen umgewandelt werden, damit wir sie in die Datenbank eintragen können. Das ist leider eine Menge Tipparbeit, lässt sich aber nicht verhindern.

Dieser Dialog wird jetzt noch endlos wiederholt. Mit Hilfe von Bedingungen werden wir das später regeln. Natürlich muss später auch noch der Dialog mit Thalion um entsprechende Zeilen erweitert werden.


Bedingungen und Anweisungen

Bedingungen sind in Drakensang auf mehrere Tabellen verteilt. Es gibt Bedingungen für Dialoge, Questen und allgemeine Bedingungen. Die Bedingungen für Dialoge finden wir in der Tabelle _Story_DialogConditions.

Die Tabelle _Story_DialogConditions

ConditionGUID Ein eindeutiger BLOB für die Bedingung
ConditionType Die Art der Zeile, (Condition, Atom, And, Or, Not)
ConditionContent Die eigentliche Bedingung
ConditionBlockGUID Alle Zeilen, die zu einer Bedingung gehören, haben die gleiche BlockGUID

Conditions bestehen immer aus mindestens zwei Zeilen. Die erste Zeile enthält die eigentliche Bedingung und ist immer vom Typ Atom, die zweite Zeile enthält in der Spalte ConditionContent einen Identifikator mit der ConditionGUID der ersten Zeile und ist immer vom Typ Condition. Dies ist auch die Zeile, die vom Dialog aus aufgerufen wird.
An dieser Stelle alle möglichen Bedingungen aufzuzählen, würde den Rahmen dieses Tutorials sprengen, außerdem werden zu Beginn auch noch nicht alle benötigt. Wenn wir uns den Dialog anschauen, so brauchen wir für folgende Zeilen eine Bedingung:

  • Erste Dialogzeile, Begrüßung
  • Erneutes Ansprechen nach Questannahme
  • Paket besorgt
  • Paket noch nicht besorgt


Wenn wir den Dialog später noch erweitern, kommen natürlich noch weitere Bedingungen dazu.
Eine häufig verwendete Bedingung ist die CompareCounter Bedingung. Ein Counter ist nichts anderes als eine Variable, deren Wert abgefragt wird. Der Name des Counters ist frei wählbar und hat immer einen Zahlenwert. Diese Art von Bedingung wird häufig verwendet um den Questfortschritt festzuhalten und damit gleichzeitig auch, welche Dialogzeile zum Tragen kommt.

Diese Bedingung ist folgendermaßen aufgebaut:

CompareCounter Die eigentliche Bedingung
counter Der Name des Counters
operator Der Vergleichsoperator (equal, less, greater, greaterOrEqual, lessOrEqual)
value Der Wert des Counters, der abgefragt wird

Beispiel:

CompareCounter counter="counter_loc01_alrik" operator="equal" value="1“;

Das Ganze könnte ungefähr so aufgebaut sein: wenn der Counter kleiner als 1 ist, dann soll die erste Dialogzeile mit der Begrüßung kommen. Wenn die Quest angenommen worden ist, wird der Wert des Counters auf 1 gesetzt. Sobald man das Proviantpaket von Thalion bekommen hat, wird der Counter auf 2 erhöht und wenn das Paket bei Alrik abgegeben worden ist bekommt der Counter den Wert 3.

[Bild: mod_dialog_07.jpg]

In den ersten Take setzen wir jetzt in der Tabelle _Story_DialogTakes in die Spalten ConditionRef und ConditionBlock die Guids aus der Bedingung. Danach legen wir die weiteren Bedingungen an und fügen sie in den letzten drei Dialogzeilen ein.

[Bild: mod_dialog_08.jpg]

Jetzt müssen wir nur noch dafür sorgen, dass der Counterwert geändert wird. Anweisungen, die in einem Dialog ausgeführt werden sollen, stehen in der Tabelle _Story_DialogActions. Diese Tabelle besteht nur aus zwei Spalten. Die Spalte TakeGUID bekommt die entsprechende GUID aus der Tabelle _Story_DialogTakes, in der die Anweisung ausgeführt werden soll und die Spalte ActionContent enthält die eigentliche Anweisung. In unserem Beispieldialog wäre das also die Zeile mit der GUID X'698F73E1D121A25DF926CAAC9F905410'.
Um den Wert eines Counter zu ändern wird die Anweisung AddToCounter verwendet. Diese ist folgendermaßen aufgebaut:

AddToCounter Die eigentliche Anweisung
counter Der Name des Counters
value Der Wert, um den der Counter erhöht werden soll (negative Werte verkleinern den Wert)
actionSelection Hat immer den Wert script,quest,dialog

Für unser Beispiel sieht die Anweisung dann so aus:

AddToCounter counter="counter_loc01_alrik" value="1" actionSelection="script,quest,dialog";

Noch ein wichtiger Hinweis: Alle Bedingungen und Anweisungen schließen immer mit einem Semikolon und einem anschließenden Leerzeichen ab.

Da uns Alrik auch noch fünf Silbertaler gibt, brauchen wir dafür auch noch eine Anweisung. Dafür wird die GiveGold Anweisung verwendet. Diese kennt nur den Parameter amount, der den Betrag enthält. Dieser wird immer in Hellern angegeben. Fünf Silbertaler entsprechen also 50 Hellern. Die vollständige Anweisung sieht dann so aus:

GiveGold amount="50" actionSelection="script,quest,dialog";

Diese wird einfach an die schon vorhandene Anweisung angehängt.

Jetzt wird es Zeit die bisher angelegten Tabellen abzutippen, SQL-Anweisungen daraus zu machen und in die Datenbanken einzufügen, damit wir das Ganze testen können.

Wenn alles funktioniert, können wir jetzt damit beginnen, die Quest anzulegen.

Questen

Die Questen werden in der Tabelle _Story_Tasks festgehalten.

Tabelle _Story_Tasks


TaskGUID Eindeutige GUID als BLOB
TaskId Eindeutige Id als Text
TaskTitle Der Titel der Quest
TaskParentGuid Bei Subquesten die GUID der übergeordneten Quest, sonst X'00000000000000000000000000000000'
TaskState Status der Quest, ist üblicherweise locked
TaskOpenText Text, wenn Quest geöffnet
TaskCloseText Text, wenn Quest geschlossen
TaskFailedText Text, wenn Quest fehlgeschlagen
CloseConditionBlock Verweis auf BlockGUID der Bedingung zum Schließen der Quest
CloseConditionRef Verweis auf ConditionGUID der Bedingung zum Schließen der Quest
OpenConditionBlock Verweis auf BlockGUID der Bedingung zum Öffnen der Quest
OpenConditionRef Verweis auf ConditionGUID der Bedingung zum Öffnen der Quest
TaskTargetEntity Ziel für Questmarker
TaskTitleLocaId Verweis auf den Titel in Tabelle _locale
TaskOpenTextLocaId Verweis auf den Text für Quest geöffnet in Tabelle _locale
TaskCloseTextLocaId Verweis auf den Titel für Quest geschlossen in Tabelle _locale

Wie man sieht, brauchen wir neben den Texten für jede Quest auch eine Bedingung zum Öffnen und eine Bedingung zum Schließen der Quest. Diese werden in den Tabellen _Story_TaskOpenConditions und _Story_TaskCloseConditions definiert. Die Bedingungen selbst sind im Aufbau identisch mit den Bedingungen in Dialogen. Einziger Unterschied ist, dass in der Zeile der Bedingung auf die verwiesen wird nicht Condition steht, sondern OpenCondition bzw. CloseCondition.

Machen wir uns aber zunächst Gedanken über den Questaufbau. Bei diesem Beispiel bietet es sich an, eine Quest mit zwei Subquesten zu erstellen. Erste Subquest wäre das Paket von Thalion zu holen, zweite Subquest, das Paket zu Alrik zu bringen. Ich beginne bei Questen immer damit, die Texte zu schreiben. Für jeden Eintrag in der _locale brauchen wir wieder einen Identifikator.

Quest Titel Das Proviantpaket
Quest Open Text Ich habe in Avestreu den Händler Alrik Sturmfels getroffen. Da er befürchtet, dass seine Schen gestohlen werden könnten, habe ich ihm versprochen für ihn zu Wirt Thalion zu gehen und dort ein Proviantpaket für ihn zu besorgen.
Quest Titel Gehe zu Thalion
Quest Open Text Ich sollte micht jetzt zum Scharfen Schwert aufmachen, um das Proviantpaket für Alrik Sturmfels bei Wirt Thalion zu holen.
Quest Close Text Ich habe ein Proviantpaket bei Thalion gekauft.
Quest Titel Bringe Alrik das Paket
Quest Open Text Ich habe jetzt das Proviantpaket für Alrik. Ich sollte es ihm jetzt bringen.
Quest Close Text Ich habe Alrik das Proviantpaket gegeben.

Da wir für die Questen außerdem noch Bedingungen brauchen, legen wir diese jetzt an. Dazu verwenden wir den gleichen Counter wie im Dialog.

Die Hauptquest wird geöffnet, wenn der Counter counter_loc01_alrik den Wert 1 hat. Sie soll geschlossen werden, sobald der Counter den Wert 3 hat. Die erste Subquest öffnet sich zusammen mit der Hauptquest, da können wir also die gleiche Bedingung nochmal verwenden. Dies Subquest soll geschlossen werden, wenn der Counter den Wert 2 bekommt. Mit dem gleichen Counterwert wird auch die zweite Subquest geöffnet und zusammmen mit der Hauptquest geschlossen.

Unsere Taskopen Conditions sehen dann ungefähr so aus:

[Bild: mod_dialog_09.jpg]


Und unsere TaskClose Conditions so:

[Bild: mod_dialog_10.jpg]

Jetzt können wir die Einträge für die Tabelle _Story_Tasks anlegen. Zunächst brauchen wir dafür für jede Quest eine eindeutige GUID als BLOB und als Text.

[Bild: mod_dialog_11.jpg]

Danach kopieren wir die Questtexte in die entsprechenden Spalten, füllen die TaskParentGuid mit den verwendeten GUIDs und setzen der TaskState auf locked. Wenn es nicht vorgesehen ist, dass eine Quest fehlschlägt, gibt es natürlich auch keinen passenden Text dazu. In diesen Fällen wird das Feld mit dem Wert #Quest Failed# ausgefüllt.

[Bild: mod_dialog_12.jpg]


Anschließend kommen die GUIDs der Conditions zum Öffnen und Schließen der Questen.

[Bild: mod_dialog_13.jpg]


Wie man sieht, haben die Hauptquest und die erste Subquest die gleichen OpenConditions. Ebenso sind die CloseConditions bei der Hauptquest und der zweiten Subquest identisch.

Um die Questfragezeichen auf der Minimap angezeigt zu bekommen, müssen wir noch das Feld TaskTargetEntity ausfüllen. Bei der Hauptquest bekommt die Spalte den Wert aus der Spalte unseres NPCs: loc01_alrik_sturmfels. Für die erste Subquest brauchen wir noch den Namen für Wirt Thalion. Diesen suchen wir in der Tabelle _Instance_NPC in der game.db4: Wirt_Thalion. Anschließend fügen wir noch die BLOBs für die Verweise auf die locale ein. Bei Questen, die nicht fehlschlagen können verwende ich immer den BLOB X'2B7BDCB8369DC84A90A61EC07A28963C'. Dieser verweist auf einen bereits vorhandenen Eintrag in der locale mit dem Wert: #Quest Failed#.

[Bild: mod_dialog_14.jpg]

Jetzt tippen wir die angelegten Tabellen ab, machen SQL Anweisungen daraus und fügen die Datensätze ein, damit wir das Ganze testen können.

Items

Items können entweder in der Tabelle _Template_Item in der static.db4 oder in der Tabelle _Instance_Item in der game.db4 angelegt werden. Sie müssen immer dann in die game.db4, wenn es sich um einen Gegenstand handelt, der von einem NPC an den Helden übergeben wird. Ansonsten kann es passieren, dass dazugehörige Dialoge erst nach Neuladen oder einem Gebietswechsel erneut aufgenommen werden können.

Die Tabelle _Instance_Item (wichtige Felder)

Guid Eindeutige Bezeichnung als BLOB
_Level Das Gebiet, in dem sich der Gegenstand befindet
Transform Wenn im Gepäck eines NPCs immer der Eintrag X'0000803F000000000000000000000000000000000000803F000000000000000000000000000000 000000803F000000000000000000000000000000000000803F'
Id, Name Eindeutige Bezeichnung als Text, bei Verweisen wird immer der Wert aus der Spalte Name verwendet
LookAtText Text, der beim darauf zeigen angezeigt wird
QuestId Bei Questgegenständen der Name der Quest, sonst NONE
Value Wert des Gegenstandes in Hellern
Gew Gewicht in Unzen
IconBrush Name der Grafik, wenn im Gepäck
InfoIdentified Beschreibungstext für den Gegenstand
StorageGUID GUID des NPCs, in dessen Gepack der Gegenstand ist

Auch hier legt man am einfachsten neue Einträge an, indem man einen vorhandenen dupliziert und die erforderlichen Werte ändert. Für dieses Beispiel nehme ich das Lunchpaket von den Holzfällern aus den Blutbergen und ändere die Spalten Guid, _Level, Id, Name, QuestId und StorageGUID.

Code:
INSERT INTO "_Instance_Item" VALUES (X'7004319A94D640CF95C0D9E7DB07CDEC',"","location01","",X'0000803F000000000000000000000000000000000000803F000000000000000000000000000000000000803F000000000000000000000000000000000000803F',"Loc01_Lunchpaket","items_props/item_sack","","items_props/item_sack","Loc01_Lunchpaket","lookat_Loc03_Lunchpaket","loc01_paket_alrik","1","0","1","","","","0","0","","0","icons/special_item_paket_koschammerzungen","1","1","no info","TaMagiekunde","no info","infoid_Loc03_Lunchpaket","0","0","1","0","0.30000001192092896","Nehmen","",X'74DE2F8D6D8F8842B12E60CC9F298C41',"0");

Original-Dialoge erweitern

Um von Wirt Thalion das Paket zu bekommen, müssen wir seinen Dialog um entsprechende Zeilen erweitern. Diesen und den richtigen Einstiegspunkt zu finden, gestaltet sich allerdings manchmal etwas schwierig. Um den Dialog mit Thalion zu finden nehmen wir dessen Wert aus der Spalte Name (Wirt_Thalion) und suchen ihn in der Tabelle _Story_Dialogs in der Spalte DialogSpeaker. Aus dem gefundenen Datensatz nehmen wir jetzt den Wert aus der Spalte DialogId (Wirt_Thalion) und suchen diesen in der Tabelle _Story_DialogTakes. Dann bekommen wir sämtliche Zeilen des Dialogs. Gleich die erste Zeile ist die gesuchte (sie ist die einzige mit Tondatei). Die GUID dieses Datensatzes brauchen wir nachher für die _Story_DialogTakeChildMapping Tabelle, da wir uns ja mit unseren neuen Dialogzeilen darauf beziehen müssen. Zuerst sollten wir aber ein paar passende Dialogzeilen verfassen.

Hero Seid gegrüßt. Sagt, könntet Ihr mir wohl ein kleines Proviantpaket schnüren?
Thalion Aber sicher. Seit die Reisenden nach Ferdok hier festsitzen herrscht eine rege Nachfrage danach.
Hero Das kann ich mir vorstellen. Was soll das Paket denn kosten?
Thalion Lasst mich kurz nachdenken. Hm, Brot, Fleisch, ein paar Würste, zwei Äpfel...drei Silbertaler, einverstanden?
Hero Einverstanden. Hier habt Ihr das Geld.
Thalion Und hier Euer Proviantpaket. Kann ich sonst noch etwa für Euch tun?
Hero Nein, im Moment nicht. Einen schönen Tag noch.

Danach können wir die dazugehörigen Einträge für die Tabelle _Story_DialogTakes anlegen. DialogGUID und DialogId übernehmen wir natürlich aus dem Originaldialog.

Damit die Frage nach dem Paket nur dann zur Verfügung steht, wenn die Quest gerade angenommen wurde, brauchen wir bei dieser Zeile eine Bedingung. Dazu können wir diese Condition aus dem Dialog mit Alrik noch einmal verwenden:

CompareCounter counter="counter_loc01_alrik" operator="equal" value="1“;

Außerdem brauchen wir noch drei Anweisungen: drei Silbertaler bezahlen, das Paket im Gepäck des Helden erscheinen lassen und den Counter um 1 erhöhen. Wenn etwas abgegeben werden soll, wird dazu die GiveAmount Anweisung verwendet.

GiveAmount Die eigentliche Anweisung
to Der Name des NPCs
templateId Die Id des Gegenstandes
category Der Name der Tabelle, in der der Gegenstand ist (ohne _Instance bzw. _Template)
amount Die Anzahl der Gegenstände

In unserem Fall sieht die Anweisung so aus:

GiveAmount to="Wirt_Thalion" templateId="Geld" category="Money" amount="30" actionSelection="script,quest,dialog";

Um das Paket von Thalion zu bekommen wird eine Take Anweisung verwendet.

Take Die eigentliche Anweisung
Item Der Name des Gegenstandes
FromWhere Der Name des NPCs, der den Gegenstand hat

In unserem Fall sieht die Anweisung so aus:

Take item="Loc01_Lunchpaket" fromWhere="Wirt_Thalion" actionSelection="script,quest,dialog";

Außerdem muss an dieser Stelle unser Counter noch um 1 erhöht werden, damit die aktuelle Subquest geschlossen und die nächste geöffnet wird.
Für diese beiden Anweisungen legen wir jetzt noch zwei Einträge in der Tabelle _Story_DialogActions an. Dazu verwenden wir die Guids der fünften bzw. sechsten Zeile des Dialogs.


Einen Dialog erstellen II

Um die Quest abschließen zu können, müssen wir noch den Dialog mit Alrik erweitern. Dazu brauchen wir zunächst den Text.

Alrik Sturmfels Ich danke Euch. Damit wird die Warterei um einiges erträglicher. Wollt Ihr jetzt einen Blick auf meine Waren werfen?
Held Aber ja. Zeigt her.
Held Jetzt nicht, ich komme später nochmal vorbei.
Alrik Sturmfels Seid gegrüßt. Kann ich etwas für Euch tun?
Held Ich wollte nur mal vorbeischauen.
Held Lasst mich Eure Waren sehen.

Dann fehlen noch die Einträge für die Tabellen _Story_DialogTakes und die _Story_DialogTakeChildMapping.

In Zeile 13 des Dialogs brauchen wir jetzt noch eine Anweisung, in der der Held das Paket al Alrik übergibt. Damit die Quest abgeschlossen wird, muss natürlch auch noch der Counter um 1 erhöht werden. Ein paar Abenteuerpunkte sollte der Held dann auch noch bekommen.
Quest-Gegenstände werden mit einer Give Anweisung abgegeben.

Give Die Anweisung
item Der Name des Gegenstandes
to Der Name des NPCs, an den der Gegenstand übergeben werden soll

In unserem Fall sieht die Anweisung so aus:

Give item="Loc01_Lunchpaket" to="loc01_alrik_sturmfels" actionSelection="script,quest,dialog";

Abenteuerpunkte werden mit einer GiveQuestXp Anweisung vergeben.

GiveQuestXp Die eigentliche Anweisung
questXp Die Anzahl der AP

Mit dieser Anweisung bekommt der Held 10 AP.

GiveQuestXp questXp="10" actionSelection="script,quest,dialog";

In Zeilen 15 und 19 des Dialogs muss noch das Händlerinventar aufgerufen werden. Dafür wird eine ShowTradeUI Anweisung verwendet.

ShowTradeUI Die eigentliche Anweisung
trader Der Name des NPCs
executeAfter Bei true wird die Anweisung erst ausgeführt, wenn der Dialog beendet ist

Für unser Beispiel sieht die Anweisung so aus:

ShowTradeUI trader="loc01_alrik_sturmfels" executeAfter="true" actionSelection="script,quest,dialog";

Allerdings hat Alrik jetzt noch keine Gegenstände, die er zum Verkauf anbieten kann. Diese bekommt er direkt ins Gepäck, in dem wir Datensatz aus der game.db4 bearbeiten und zwar die Spalte SetupStorage. Die hier aufgelisteten Werte haben immer den folgenden Aufbau:

Tabellenname/Idnzahl/false/false;

Beim Namen der Tabelle wird immer das vorangestellte _Instance bzw. _Template weggelassen. Die Gegenstände selbst können aus unterschiedlichen Tabellen kommen.

Ammo Pfeile, Bolzen und Kugeln
Armor Alle Rüstungen und Kleidungsstücke
Book Bücher, Schriftrollen, Zettel usw.
Item Gegenstände allgemein
Jewelry Amulette und Ringe
Shield Schilde
Weapon Waffen

Beispiele:

Armor/helm_geweih:1/false/false;

Fügt einen Geweihhelm in das Gepäck ein.

Item/zutat_s_lederbaender:20/false/false;

Fügt 20 Lederbänder ein.

Wir suchen uns also einige Sachen zusammen, die Alrik verkaufen kann und fügen diese ein.

Armor/helm_geweih:1/false/false;Armor/armschienen_nieten_01:1/false/false;Armor/helm_lederkappe:1/false/false;Item/special_einfacher_verband:20/false/false;Item/crafted_a_pastillengegenerschoepfung:10/false/false;Item/crafted_a_wundpulver:5/false/false;Item/crafted_a_heiltrank:1/false/false;Item/crafted_s_schleifstein:3/false/false;Item/zutat_s_lederbaender:20/false/false;Weapon/Nachtwind:1/false/false;Weapon/Kurzbogen:1/false/false;

Jetzt wird es Zeit, das Ganz einem abschließenden Test zu unterziehen.

SQL Code für die Beispielquest


Spoiler:(zum lesen bitte Text markieren)
Code:
---Einträge für static.db4

---Dialog Alrik
INSERT INTO "_Story_Dialogs" VALUES (X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_id','loc01_alrik_sturmfels','',0);

INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905400',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','StartState','','StartState','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'00000000000000000000000000000000',0,X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905401',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_01','loc01_alrik_sturmfels','Take','Begruessung-normal','',0,'','',X'71E8D2614AB91181AAE618CECCBA8470',X'95210AA7E962BF05805D6E994074FC16',X'94C67AE932D278F35DFC140D6B26C001',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905402',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_02','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C002',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905403',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_03','loc01_alrik_sturmfels','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C003',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905404',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_04','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C004',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905405',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_05','loc01_alrik_sturmfels','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C005',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905406',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_06','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C006',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905407',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_07','loc01_alrik_sturmfels','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C007',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905408',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_08','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C008',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905409',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_09','loc01_alrik_sturmfels','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C009',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905410',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_10','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C010',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905411',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_11','loc01_alrik_sturmfels','Take','','',0,'','',X'71E8D2614AB91181AAE618CECCBA8472',X'95210AA7E962BF05805D6E994074FC17',X'94C67AE932D278F35DFC140D6B26C011',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905412',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_12','Player','Response','','',0,'','',X'71E8D2614AB91181AAE618CECCBA8474',X'95210AA7E962BF05805D6E994074FC18',X'94C67AE932D278F35DFC140D6B26C012',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905413',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_13','Player','Response','','',0,'','',X'71E8D2614AB91181AAE618CECCBA8476',X'95210AA7E962BF05805D6E994074FC19',X'94C67AE932D278F35DFC140D6B26C013',0,X'959C4D7EEB5540DF97736063E5F79FF9');


INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905414',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_14','loc01_alrik_sturmfels','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C014',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905415',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_15','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C015',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905416',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_16','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C016',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905417',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_17','loc01_alrik_sturmfels','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C017',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905418',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_18','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C018',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905419',X'27A6F95616B4E2AF7FA486DD56A037F0','alrik_sturmfels_id','alrik_sturmfels_19','Player','Response','','',6,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C019',0,X'959C4D7EEB5540DF97736063E5F79FF9');

INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905400','alrik_sturmfels_01',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905401','alrik_sturmfels_02',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905402','alrik_sturmfels_03',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905403','alrik_sturmfels_04',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905404','alrik_sturmfels_05',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905405','alrik_sturmfels_06',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905406','alrik_sturmfels_07',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905407','alrik_sturmfels_08',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905408','alrik_sturmfels_09',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905409','alrik_sturmfels_10',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905400','alrik_sturmfels_11',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905411','alrik_sturmfels_12',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905411','alrik_sturmfels_13',1,X'27A6F95616B4E2AF7FA486DD56A037F0');

INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905413','alrik_sturmfels_14',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905414','alrik_sturmfels_15',1,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905414','alrik_sturmfels_16',2,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905400','alrik_sturmfels_17',0,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905417','alrik_sturmfels_18',1,X'27A6F95616B4E2AF7FA486DD56A037F0');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905417','alrik_sturmfels_19',2,X'27A6F95616B4E2AF7FA486DD56A037F0');

---Conditions für den Dialog mit Alrik
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8469','Atom','CompareCounter counter="counter_loc01_alrik" operator="less" value="1"; ',X'95210AA7E962BF05805D6E994074FC16');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8470','Condition','61d2e871-b94a-8111-aae6-18ceccba8469',X'95210AA7E962BF05805D6E994074FC16');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8471','Atom','CompareCounter counter="counter_loc01_alrik" operator="less" value="3"; ',X'95210AA7E962BF05805D6E994074FC17');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8472','Condition','61d2e871-b94a-8111-aae6-18ceccba8471',X'95210AA7E962BF05805D6E994074FC17');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8473','Atom','CompareCounter counter="counter_loc01_alrik" operator="equal" value="1"; ',X'95210AA7E962BF05805D6E994074FC18');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8474','Condition','61d2e871-b94a-8111-aae6-18ceccba8473',X'95210AA7E962BF05805D6E994074FC18');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8475','Atom','CompareCounter counter="counter_loc01_alrik" operator="equal" value="2"; ',X'95210AA7E962BF05805D6E994074FC19');
INSERT INTO "_Story_DialogConditions" VALUES(X'71E8D2614AB91181AAE618CECCBA8476','Condition','61d2e871-b94a-8111-aae6-18ceccba8475',X'95210AA7E962BF05805D6E994074FC19');

INSERT INTO "_Story_DialogActions" VALUES(X'698F73E1D121A25DF926CAAC9F905409','AddToCounter counter="counter_loc01_alrik" value="1" actionSelection="script,quest,dialog"; GiveGold amount="50" actionSelection="script,quest,dialog"; ');

INSERT INTO "_Story_DialogActions" VALUES(X'698F73E1D121A25DF926CAAC9F905413','Give item="Loc01_Lunchpaket" to="loc01_alrik_sturmfels" actionSelection="script,quest,dialog"; AddToCounter counter="counter_loc01_alrik" value="1" actionSelection="script,quest,dialog"; GiveQuestXp questXp="10" actionSelection="script,quest,dialog"; ');
INSERT INTO "_Story_DialogActions" VALUES(X'698F73E1D121A25DF926CAAC9F905415','ShowTradeUI trader="loc01_alrik_sturmfels" executeAfter="true" actionSelection="script,quest,dialog"; ');
INSERT INTO "_Story_DialogActions" VALUES(X'698F73E1D121A25DF926CAAC9F905419','ShowTradeUI trader="loc01_alrik_sturmfels" executeAfter="true" actionSelection="script,quest,dialog"; ');

---Questeinträge
INSERT INTO "_Story_Tasks" VALUES(X'387A1F263B058F72310370BDBAE82168','loc01_paket_alrik','Das Proviantpaket',X'00000000000000000000000000000000','locked','Ich habe in Avestreu den Händler Alrik Sturmfels getroffen. Da er befürchtet, dass seine Schen gestohlen werden könnten, habe ich ihm versprochen für ihn zu Wirt Thalion zu gehen und dort ein Proviantpaket für ihn zu besorgen.','Ich habe Alrik das Proviantpaket von Wirt Thalion gebracht. Zum Dank lässt er mich einen Blick auf seine Waren werfen.','#Quest Failed#',X'B938A1FAF9126EF3CFA788D6AFE4B1AB',X'9A891BEE26DDDA9208E5F33FE97F9B04',X'6FC75C990223919FC6672B47AA3003CD',X'E595A76363D79C1D149C5F6AECACD976','loc01_alrik_sturmfels',X'B958073C2C80BCC800F68D53BFEC6001',X'B958073C2C80BCC800F68D53BFEC6002',X'B958073C2C80BCC800F68D53BFEC6003',X'2B7BDCB8369DC84A90A61EC07A28963C');
INSERT INTO "_Story_Tasks" VALUES(X'387A1F263B058F72310370BDBAE82169','loc01_paket_alrik_hol','Gehe zu Thalion',X'387A1F263B058F72310370BDBAE82168','locked','Ich sollte micht jetzt zum Scharfen Schwert aufmachen, um das Proviantpaket für Alrik Sturmfels bei Wirt Thalion zu holen.','Ich habe ein Proviantpaket bei Thalion gekauft.','#Quest Failed#',X'B938A1FAF9126EF3CFA788D6AFE4B1AA',X'9A891BEE26DDDA9208E5F33FE97F9B02',X'6FC75C990223919FC6672B47AA3003CD',X'E595A76363D79C1D149C5F6AECACD976','Wirt_Thalion',X'B958073C2C80BCC800F68D53BFEC6004',X'B958073C2C80BCC800F68D53BFEC6005',X'B958073C2C80BCC800F68D53BFEC6006',X'2B7BDCB8369DC84A90A61EC07A28963C');
INSERT INTO "_Story_Tasks" VALUES(X'387A1F263B058F72310370BDBAE82170','loc01_paket_alrik_bring','Bringe Alrik das Paket',X'387A1F263B058F72310370BDBAE82168','locked','Ich habe jetzt das Proviantpaket für Alrik. Ich sollte es ihm jetzt bringen.','Ich habe Alrik das Proviantpaket gegeben.','#Quest Failed#',X'B938A1FAF9126EF3CFA788D6AFE4B1AB',X'9A891BEE26DDDA9208E5F33FE97F9B04',X'6FC75C990223919FC6672B47AA3003CE',X'E595A76363D79C1D149C5F6AECACD978','loc01_alrik_sturmfels',X'B958073C2C80BCC800F68D53BFEC6007',X'B958073C2C80BCC800F68D53BFEC6008',X'B958073C2C80BCC800F68D53BFEC6009',X'2B7BDCB8369DC84A90A61EC07A28963C');

---Coditions für Questen
INSERT INTO "_Story_TaskOpenConditions" VALUES(X'E595A76363D79C1D149C5F6AECACD975','Atom','CompareCounter counter="counter_loc01_alrik" operator="equal" value="1“; ',X'6FC75C990223919FC6672B47AA3003CD');
INSERT INTO "_Story_TaskOpenConditions" VALUES(X'E595A76363D79C1D149C5F6AECACD976','OpenCondtion','63a795e5-d763-1d9c-149c-5f6aecacd975',X'6FC75C990223919FC6672B47AA3003CD');
INSERT INTO "_Story_TaskOpenConditions" VALUES(X'E595A76363D79C1D149C5F6AECACD977','Atom','CompareCounter counter="counter_loc01_alrik" operator="equal" value="2“; ',X'6FC75C990223919FC6672B47AA3003CE');
INSERT INTO "_Story_TaskOpenConditions" VALUES(X'E595A76363D79C1D149C5F6AECACD978','OpenCondtion','63a795e5-d763-1d9c-149c-5f6aecacd977',X'6FC75C990223919FC6672B47AA3003CE');

INSERT INTO "_Story_TaskCloseConditions" VALUES(X'9A891BEE26DDDA9208E5F33FE97F9B01','Atom','CompareCounter counter="counter_loc01_alrik" operator="equal" value="2“; ',X'B938A1FAF9126EF3CFA788D6AFE4B1AA');
INSERT INTO "_Story_TaskCloseConditions" VALUES(X'9A891BEE26DDDA9208E5F33FE97F9B02','CloseCondition','ee1b899a-dd26-92da-08e5-f33fe97f9b01',X'B938A1FAF9126EF3CFA788D6AFE4B1AA');
INSERT INTO "_Story_TaskCloseConditions" VALUES(X'9A891BEE26DDDA9208E5F33FE97F9B03','Atom','CompareCounter counter="counter_loc01_alrik" operator="equal" value="3“; ',X'B938A1FAF9126EF3CFA788D6AFE4B1AB');
INSERT INTO "_Story_TaskCloseConditions" VALUES(X'9A891BEE26DDDA9208E5F33FE97F9B04','CloseCondition','ee1b899a-dd26-92da-08e5-f33fe97f9b03',X'B938A1FAF9126EF3CFA788D6AFE4B1AB');

---ereiterter Dialog mit Thalion
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905501',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_01','Player','Response','','',0,'','',X'71E8D2614AB91181AAE618CECCBA8474',X'95210AA7E962BF05805D6E994074FC18',X'94C67AE932D278F35DFC140D6B26C101',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905502',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_02','Wirt_Thalion','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C102',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905503',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_03','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C103',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905504',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_04','Wirt_Thalion','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C104',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905505',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_05','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C105',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905506',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_06','Wirt_Thalion','Take','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C106',0,X'959C4D7EEB5540DF97736063E5F79FF9');
INSERT INTO "_Story_DialogTakes" VALUES(X'698F73E1D121A25DF926CAAC9F905507',X'57BF3C49CA395A4A861F61A44D574E07','Wirt_Thalion','Wirt_Thalion_paket_07','Player','Response','','',0,'','',X'00000000000000000000000000000000',X'00000000000000000000000000000000',X'94C67AE932D278F35DFC140D6B26C107',0,X'959C4D7EEB5540DF97736063E5F79FF9');


INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'49680863431D124E8A82FAA32033433E','Wirt_Thalion_paket_01',0,X'57BF3C49CA395A4A861F61A44D574E07');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905501','Wirt_Thalion_paket_02',0,X'57BF3C49CA395A4A861F61A44D574E07');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905502','Wirt_Thalion_paket_03',0,X'57BF3C49CA395A4A861F61A44D574E07');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905503','Wirt_Thalion_paket_04',0,X'57BF3C49CA395A4A861F61A44D574E07');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905504','Wirt_Thalion_paket_05',0,X'57BF3C49CA395A4A861F61A44D574E07');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905505','Wirt_Thalion_paket_06',0,X'57BF3C49CA395A4A861F61A44D574E07');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES(X'698F73E1D121A25DF926CAAC9F905506','Wirt_Thalion_paket_07',0,X'57BF3C49CA395A4A861F61A44D574E07');


INSERT INTO "_Story_DialogActions" VALUES(X'698F73E1D121A25DF926CAAC9F905505','GiveAmount to="Wirt_Thalion" templateId="Geld" category="Money" amount="30" actionSelection="script,quest,dialog"; ');
INSERT INTO "_Story_DialogActions" VALUES(X'698F73E1D121A25DF926CAAC9F905506','Take item="Loc01_Lunchpaket" fromWhere="Wirt_Thalion" actionSelection="script,quest,dialog"; AddToCounter counter="counter_loc01_alrik" value="1" actionSelection="script,quest,dialog"; ');


---Einträge für locale.db4
INSERT INTO "_Locale" VALUES('lookat_alrik_sturmfels','Alrik Sturmfels');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c001','Seid gegrüßt. Alrik Sturmfels mein Name. Ihr wollt sicher auch nach Ferdok?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c002','Ich grüße Euch auch. Ich heiße <FullName>. Ja, ich werde dort erwartet.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c003','So wie es aussieht, wird man dort noch länger auf Euch warten müssen. Ferdok ist abgeriegelt und die Gardisten lassen niemanden weiterreisen. Hoffentlich ist das bald vorbei.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c004','Ja, das habe ich schon erfahren. Da ich jetzt auch hier festsitze, werde ich mich zunächst einmal umschauen.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c005','Da seid Ihr zu beneiden. Ich kann hier nicht weg. Muss auf meine Sachen aufpassen. Sonst wird noch etwas gestohlen. Ich bin nämlich Händler, müsst Ihr wissen.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c006','Tatsächlich? Kann ich dann Eure Waren einmal sehen?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c007','Nein, leider nicht. Dazu müsste ich die Sachen erstmal auspacken. Danach steht mir überhaupt nicht der Sinn. Aber vielleicht...');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c008','Ja?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c009','Wie schon gesagt, ich kann hier leider nicht weg. Und die Warterei hat mich hungrig und durstig gemacht. Ich mache Euch folgenden Vorschlag. Hier habt Ihr fünf Silbertaler. Damit geht Ihr für mich zum Avestreuer Gasthaus, dem Scharfen Schwert, und lasst Euch von Wirt Thalion ein kleines Proviantpaket für mich schnüren. Zum Dank lasse ich Euch meine Waren sehen und Ihr bekommt noch einen ordentlichen Rabatt von mir. Einverstanden?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c010','Einverstanden. Bis später.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c011','Da seid Ihr ja wieder. Habt Ihr mein Proviantpaket?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c012','Nein, leider noch nicht.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c013','Ja. Bitte sehr, das Proviantpaket.');


INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6001','Das Proviantpaket');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6002','Ich habe in Avestreu den Händler Alrik Sturmfels getroffen. Da er befürchtet, dass seine Schen gestohlen werden könnten, habe ich ihm versprochen für ihn zu Wirt Thalion zu gehen und dort ein Proviantpaket für ihn zu besorgen.');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6003','Ich habe Alrik das Proviantpaket von Wirt Thalion gebracht. Zum Dank lässt er mich einen Blick auf seine Waren werfen.');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6004','Gehe zu Thalion');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6005','Ich sollte mich jetzt zum Scharfen Schwert aufmachen, um das Proviantpaket für Alrik Sturmfels bei Wirt Thalion zu holen.');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6006','Ich habe ein Proviantpaket bei Thalion gekauft.');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6007','Bringe Alrik das Paket');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6008','Ich habe jetzt das Proviantpaket für Alrik. Ich sollte es ihm jetzt bringen.');
INSERT INTO "_Locale" VALUES('3c0758b9-802c-c8bc-00f6-8d53bfec6009','Ich habe Alrik das Proviantpaket gegeben.');


INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c014','Ich danke Euch. Damit wird die Warterei um einiges erträglicher. Wollt Ihr jetzt einen Blick auf meine Waren werfen?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c015','Aber ja. Zeigt her.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c016','Jetzt nicht, ich komme später nochmal vorbei.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c017','Seid gegrüßt. Kann ich etwas für Euch tun?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c018','Ich wollte nur mal vorbeischauen.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c019','Lasst mich Eure Waren sehen.');

INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c101','Seid gegrüßt. Sagt, könntet Ihr mir wohl ein kleines Proviantpaket schnüren?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c102','Aber sicher. Seit die Reisenden nach Ferdok hier festsitzen herrscht eine rege Nachfrage danach.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c103','Das kann ich mir vorstellen. Was soll das Paket denn kosten?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c104','Lasst mich kurz nachdenken. Hm, Brot, Fleisch, ein paar Würste, zwei Äpfel...drei Silbertaler, einverstanden?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c105','Einverstanden. Hier habt Ihr das Geld.');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c106','Und hier Euer Proviantpaket. Kann ich sonst noch etwa für Euch tun?');
INSERT INTO "_Locale" VALUES('e97ac694-d232-f378-5dfc-140d6b26c107','Nein, im Moment nicht. Einen schönen Tag noch.');


---Einträge für game.db4
INSERT INTO "_Instance_NPC" VALUES (X'1BBCC45707D768479BF963F3E0A7D757',"|Level|Objects|NPC|belebte_welt|loc01_alrik_sturmfels","location01","",X'91B5943C0000000033F57FBF00000000000000000000803F000000000000000033F57F3F0000000091B5943C000000004A232BC3CED2A740305412430000803F',"loc01_alrik_sturmfels","","0","0","1","loc01_alrik_sturmfels","0","characters/mensch_m","stateobjects/versteinert_mensch","1","npc_gen_doerfler_02_low","","mensch_m_spazieren","","","","","mann17","0","dummies/char","","FaAllFriendly","simple_fighter","0.699999988079071","0.9800000190734863","3.4000000953674316","4","lookat_alrik_sturmfels","1","15","Armor/helm_geweih:1/false/false;Armor/armschienen_nieten_01:1/false/false;Armor/helm_lederkappe:1/false/false;Item/special_einfacher_verband:20/false/false;Item/crafted_a_pastillengegenerschoepfung:10/false/false;Item/crafted_a_wundpulver:5/false/false;Item/crafted_a_heiltrank:1/false/false;Item/crafted_s_schleifstein:3/false/false;Item/zutat_s_lederbaender:20/false/false;Weapon/Nachtwind:1/false/false;Weapon/Kurzbogen:1/false/false;","","NPC","","","","Mittellaender","rob_trash","","0","1","10","1","10","1","10","8","20","20","8","8","8","8","8","0","0","0","0","0","0","0","0","0","0","0","0","-500","-500","0","0","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","-500","1","1","1","1","1","1","1","1","1","1","1","1","1","1","-500","1","1","1","1","1","1","20","0","0","0","0","0","0","20","0","0","5","5","0","5","1","3","1","3","20","0","0","0","0","0","0","0","0","0","All","","Medium","map/map_marker_blue","InSight","","","","","","0","20","characters\\physiks_dummy","1","1","1","0","1","","","","1","0.5","","0.44999998807907104","leather","Everything","1","0","","1","1","30","100","15","1","-1","0","",null,null);

INSERT INTO "_Instance_Item" VALUES (X'7004319A94D640CF95C0D9E7DB07CDEC',"","location01","",X'0000803F000000000000000000000000000000000000803F000000000000000000000000000000000000803F000000000000000000000000000000000000803F',"Loc01_Lunchpaket","items_props/item_sack","","items_props/item_sack","Loc01_Lunchpaket","lookat_Loc03_Lunchpaket","loc01_paket_alrik","1","0","1","","","","0","0","","0","icons/special_item_paket_koschammerzungen","1","1","no info","TaMagiekunde","no info","infoid_Loc03_Lunchpaket","0","0","1","0","0.30000001192092896","Nehmen","",X'74DE2F8D6D8F8842B12E60CC9F298C41',"0");