Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Dialogeditor für Drakensang
#21
Perfekt. :thx:

Hast du eventuell Lust noch etwas mehr Zeit in die Entwicklung des Tools zu investieren? Wenn nicht, hast du mein vollstes Verständnis dafür. Außer mir wird es sehr wahrscheinlich ohnehin keiner verwenden.
Zitieren
#22
Welches fehlende Feature würde denn am meisten bringen?
Zitieren
#23
Ich hatte primär an eine Version für AFdZ gedacht. Die verwendeten Tabellen sind die gleichen, haben aber einen anderen Aufbau. Die ChildMapping Tabelle funktioniert hervorragend bei linearen Dialogen. Sobald aber mehrere Antworten des Helden oder unterschiedliche Antworten des NPCs aufgrund von Proben ö.ä. möglich sind, ist das bisher nicht vorgesehen. Das Letztere ist wahrscheinlich nicht so einfach zu realisieren, ist aber auch nicht notwendig. Das kriege ich auch so hin.
Zitieren
#24
Das mit AFdZ ist kein Problem. Dafür brauche ich den Aufbau der Tabellen. Bei den Entscheidungen innerhalb eines Dialogs habe ich an eine rekursive Vorgehensweise gedacht. Das ist wahrscheinlich möglich. Im Moment sind mir die Einzelheiten aber nicht klar, so dass ich das nicht fest zusagen kann.
Zitieren
#25
_Locale
Der Aufbau der Tabelle _Locale ist genauso wie in Drakensang. Einen wichtigen und hilfreichen Unterschied gibt es dennoch: das Feld LocaId darf jetzt einen frei wählbaren Inhalt haben, der dann genauso in der Tabelle _Story_DialogTakes verwendet wird. Das umständliche Umwandeln von Identifikatoren in Blobs hat sich also erledigt. Bei mir fangen alle LocaId Einträge mit txt an, dann kommt der Dialogname abschließend eine fortlaufende Nummer, z.B. txt_soeldner_taverne_orks_01, txt_soeldner_taverne_orks_02 usw.

_Story_Dialogs
Hier hat sich der Aufbau etwas verändert. DAs Feld Dialogname fällt weg, dafür ist das Feld GenericDialogId hinzugekommen, belibt aber i. d. R. leer. Der Aufbau ist jetzt folgender: DialogGUID, DialogId, DialogSpeaker, DialogGroup, DialogAsConversation,GenericDialogId.

INSERT INTO "someTable" VALUES (X'D80CA70F3DE8B99582FCF5A9C065DD4E',"c_locr02_soeldner_taverne_id","locr02_soeldner_taverne01","","0","");

_Story_DialogTakes
Wie in Drakensang weicht auch hier die erste Zeile eines Dialogs von den eigentlichen Dialogzeilen ab. Bei dieser Tabelle sind neue Felder hinzugekommen, außerdem wurde bei einigen Feldern der Felddatentyp geändert.

TakeGUID: BLOB, eindeutig
DialogGUID: BLOB, DialogGUID aus _Story_Dialogs
DialogId: Text, DialogId aus _Story_Dialogs
TakeId: Text. eindeutige Bezeichnung für jeden Take (ich verwende die DialogId mit fortlaufender Nummer), bei der ersten Zeile StartState
TakeSpeaker: Text, üblicherweise ein NPC, für erste Zeile leerer String
TakeListener: Text, Hero oder der Name eines anderen NPCs, für erste Zeile leerer String
TakeType: Take (NPC) oder Response (Held), bei der ersten Zeile StartState
TakeEmote: Text, (leerer String)
TakeSound: Text, (leerer String)
ConditionRef: BLOB, X'00000000000000000000000000000000'
ConditionBlock: BLOB, X'00000000000000000000000000000000'
StatementRef: BLOB, X'00000000000000000000000000000000'
StatementBlock: BLOB, X'00000000000000000000000000000000'
TakeLocaId: Text, LocaId aus Tabelle _Locale, bei der ersten Zeile 00000000-0000-0000-0000-000000000000
TakeTimeStamp: 0
TakeShortTextLocaId: Text, irgendein Identifikator, das Feld wird ohnehin nicht benötigt, bei der ersten Zeile 00000000-0000-0000-0000-000000000000

_Story_DialogTakeChildMapping

Der Aufbau ist im Prinzip wie in Drakensang, ein Feld ist am Anfang dazugekommen, jede Zeile hat noch eine eindeutige Guid als BLOB.

Ich hoffe, du wirst schlau daraus. :)
Zitieren
#26
Schaue ich mir an. Allerdings habe ich jetzt doch erst mal die Dialogoptionen umgesetzt. Hier mal ein Zwischenstand
Code:
<drasa_dialog>
  <daten>
    <inhalt id="einkauf_id" npc="loc01_bobo">Einladung</inhalt>
    <redner kennzeichen="a" id="loc01_bobo">Bobo</redner>
    <redner kennzeichen="b" id="">Held</redner>
  </daten>
  <texte>
    <a>Hallo.</a>
    <b>Hallo. Mein Name ist <heldenname/>.</b>
    <a>Willst du etwas kaufen, <heldenname/>?</a>
    <auswahl>
      <texte>
        <b>Ja.</b>
        <a>Schau her.</a>
      </texte>
      <texte>
        <b>Nein.</b>
        <a>Dann bis später.</a>
        <auswahl>
          <texte>
            <b>Ich möchte doch etwas kaufen.</b>
          </texte>
          <texte>
            <b>Bis später.</b>
          </texte>
        </auswahl>
      </texte>
    </auswahl>
  </texte>
</drasa_dialog>

Code:
INSERT INTO "_Story_Dialogs" VALUES (X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_id", "loc01_bobo", "", 0);
INSERT INTO "_Locale" VALUES ("cfeb235c-6cfe-4d17-8d4a-80f8e28283d7", "Hallo.");
INSERT INTO "_Locale" VALUES ("4b508252-5ad4-493c-8792-81ffb913f617", "Hallo. Mein Name ist <heroName>.");
INSERT INTO "_Locale" VALUES ("58979a07-2f39-4153-bc20-7d53e1be6d84", "Willst du etwas kaufen, <heroName>?");
INSERT INTO "_Locale" VALUES ("dc14ed62-9a0f-4412-9a97-64c8a29e2c9e", "Ja.");
INSERT INTO "_Locale" VALUES ("a0f7dfba-1d7d-4a0c-b0bb-9850bfde584b", "Schau her.");
INSERT INTO "_Locale" VALUES ("12b0795b-a184-4011-892d-b15e3ef02316", "Nein.");
INSERT INTO "_Locale" VALUES ("a01cd47d-f8f5-4688-9264-4a6abbddd4b8", "Dann bis später.");
INSERT INTO "_Locale" VALUES ("e8829653-8a41-49c0-baab-291614d0838d", "Ich möchte doch etwas kaufen.");
INSERT INTO "_Locale" VALUES ("d9abdebf-3de7-4da8-aee4-0153e2a63d26", "Bis später.");
INSERT INTO "_Story_DialogTakes" VALUES (X'c7c4dae775d1a5449299d23dc7c92bee', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "StartState", "", "StartState", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'a232738f9009b642a2d782e9e5f50664', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_1", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'5c23ebcffe6c174d8d4a80f8e28283d7', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'f64ec625e1a04a4bae94667fea77c374', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_2", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'5282504bd45a3c49879281ffb913f617', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'2a132993bc972a4fa9fb2690b322d3e6', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_3", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'079a9758392f5341bc207d53e1be6d84', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'01f5f27b3386994d9c4cf00448b5e5c9', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_4", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'62ed14dc0f9a12449a9764c8a29e2c9e', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'f484e80848b9c84e81a9376f244ad63c', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_5", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'badff7a07d1d0c4ab0bb9850bfde584b', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'ca56c35f06a7c44287a9b6957d610694', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_6", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'5b79b01284a11140892db15e3ef02316', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'9e554f3460116145839046ebe87daaf5', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_7", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'7dd41ca0f5f8884692644a6abbddd4b8', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'8cf7ac2c6a830644b2e3c7a1a6921c81', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_8", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'539682e8418ac049baab291614d0838d', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'05a86427d3aa8c43a4bd4fadfbb98159', X'898b3b1157e6dd4f927dce617acfca6a', "einkauf_id", "einkauf_9", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'bfdeabd9e73da84daee40153e2a63d26', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'c7c4dae775d1a5449299d23dc7c92bee', "X'a232738f9009b642a2d782e9e5f50664'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'a232738f9009b642a2d782e9e5f50664', "X'f64ec625e1a04a4bae94667fea77c374'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'f64ec625e1a04a4bae94667fea77c374', "X'2a132993bc972a4fa9fb2690b322d3e6'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'2a132993bc972a4fa9fb2690b322d3e6', "X'01f5f27b3386994d9c4cf00448b5e5c9'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'01f5f27b3386994d9c4cf00448b5e5c9', "X'f484e80848b9c84e81a9376f244ad63c'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'2a132993bc972a4fa9fb2690b322d3e6', "X'ca56c35f06a7c44287a9b6957d610694'", 1, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'ca56c35f06a7c44287a9b6957d610694', "X'9e554f3460116145839046ebe87daaf5'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'9e554f3460116145839046ebe87daaf5', "X'8cf7ac2c6a830644b2e3c7a1a6921c81'", 0, X'898b3b1157e6dd4f927dce617acfca6a');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'9e554f3460116145839046ebe87daaf5', "X'05a86427d3aa8c43a4bd4fadfbb98159'", 1, X'898b3b1157e6dd4f927dce617acfca6a');
Zitieren
#27
In der ChildMapping hast du an zweiter Stelle einen Blob stehen. Da gehört die TakeId aus DialogTakes hin.
Zitieren
#28
So scheint es mir jetzt zu stimmen. ;)

Code:
INSERT INTO "_Story_Dialogs" VALUES (X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_id", "loc01_bobo", "", 0);
INSERT INTO "_Locale" VALUES ("3377adf8-b2ec-4428-b430-f39d486cf68d", "Hallo.");
INSERT INTO "_Locale" VALUES ("172e71b4-1151-4298-a659-2d0a2075db60", "Hallo. Mein Name ist <heroName>.");
INSERT INTO "_Locale" VALUES ("c707d9c4-9a74-4659-b56c-a364bf398b36", "Willst du etwas kaufen, <heroName>?");
INSERT INTO "_Locale" VALUES ("5cdee0fc-b346-4faa-8d31-357adcb43035", "Ja.");
INSERT INTO "_Locale" VALUES ("b7361f03-e93a-458d-9c6d-0310e40a22d8", "Schau her.");
INSERT INTO "_Locale" VALUES ("f0d3a08a-68d7-4c7a-baf5-421f041e2c6c", "Nein.");
INSERT INTO "_Locale" VALUES ("e2a0d77b-f404-4907-988f-3de2a99c2330", "Dann bis später.");
INSERT INTO "_Locale" VALUES ("0a799b2f-d023-4bbc-8889-8e627576ac9f", "Ich möchte doch etwas kaufen.");
INSERT INTO "_Locale" VALUES ("ffc233e5-2614-40ed-a8a1-6b37279208ad", "Bis später.");
INSERT INTO "_Story_DialogTakes" VALUES (X'16b03c3eea71164e89c8f45068569518', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "StartState", "", "StartState", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'157e4711588a4b4b84c1135c32ff5adf', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_00", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'f8ad7733ecb22844b430f39d486cf68d', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'1a9d856498f8d54785256d04f997a573', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_01", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'b4712e1751119842a6592d0a2075db60', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'1899315321f0b94d983959c907f3fda2', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_02", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'c4d907c7749a5946b56ca364bf398b36', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'1d31c37b6780ba49b9c758d3f9d80d1d', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_030000", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'fce0de5c46b3aa4f8d31357adcb43035', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'1ba77341b83e1d48b641544e4f55de4c', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_030001", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'031f36b73ae98d459c6d0310e40a22d8', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'b682e87c41154c48b42f90cb935b8be6', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_030100", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'8aa0d3f0d7687a4cbaf5421f041e2c6c', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'ff1a6213e2cdef4ea26640dc4673bd34', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_030101", "loc01_bobo", "Take", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'7bd7a0e204f40749988f3de2a99c2330', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'2cea34df113c034abfa2b8e8f385a0e0', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_0301020000", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'2f9b790a23d0bc4b88898e627576ac9f', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'4a4f812866fa8742885a60d8dfb76c82', X'46ec6ee07797914ea84efb23dc1bd791', "einkauf_id", "einkauf_0301020100", "Player", "Response", "", "", 0, "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'e533c2ff1426ed40a8a16b37279208ad', 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'16b03c3eea71164e89c8f45068569518', "einkauf_00", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'157e4711588a4b4b84c1135c32ff5adf', "einkauf_01", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'1a9d856498f8d54785256d04f997a573', "einkauf_02", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'1899315321f0b94d983959c907f3fda2', "einkauf_030000", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'1d31c37b6780ba49b9c758d3f9d80d1d', "einkauf_030001", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'1899315321f0b94d983959c907f3fda2', "einkauf_030100", 1, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'b682e87c41154c48b42f90cb935b8be6', "einkauf_030101", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'ff1a6213e2cdef4ea26640dc4673bd34', "einkauf_0301020000", 0, X'46ec6ee07797914ea84efb23dc1bd791');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'ff1a6213e2cdef4ea26640dc4673bd34', "einkauf_0301020100", 1, X'46ec6ee07797914ea84efb23dc1bd791');


Angehängte Dateien
.zip   dialoge-0.1.5.zip (Größe: 52,65 KB / Downloads: 0)
Zitieren
#29
... und einmal für AFdZ

Code:
INSERT INTO "_Story_Dialogs" VALUES (X'8aa2b1e762f8da4ca4892b536fa3f208', "komm_mit_id", "loc01_bobo", "", 0, "");
INSERT INTO "_Locale" VALUES ("txt_komm_mit_0345753b-87d5-4800-8c11-e648fd415779", "Was ist");
INSERT INTO "_Locale" VALUES ("txt_komm_mit_b09a2ff6-da12-4e4b-92e5-641aface2e82", "Komm mit.");
INSERT INTO "_Story_DialogTakes" VALUES (X'af5fce5fc5eeb64ab2ffe204ada9c609', X'8aa2b1e762f8da4ca4892b536fa3f208', "komm_mit_id", "StartState", "", "null", "StartState", "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', "StartState", 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'1564f587bc59ff4f9a0c495c7655bc7b', X'8aa2b1e762f8da4ca4892b536fa3f208', "komm_mit_id", "komm_mit_00", "loc01_bobo", "Player", "Take", "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', "txt_komm_mit_0345753b-87d5-4800-8c11-e648fd415779", 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakes" VALUES (X'b5c34170574748439a74218648aada4c', X'8aa2b1e762f8da4ca4892b536fa3f208', "komm_mit_id", "komm_mit_01", "Player", "loc01_bobo", "Response", "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', "txt_komm_mit_b09a2ff6-da12-4e4b-92e5-641aface2e82", 0, X'00000000000000000000000000000000');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'b339186bde461148b585aca10cd7eed4', X'af5fce5fc5eeb64ab2ffe204ada9c609', "komm_mit_00", 0, X'8aa2b1e762f8da4ca4892b536fa3f208');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'84ca95a03c3f3448968b9e949b0e7ed6', X'1564f587bc59ff4f9a0c495c7655bc7b', "komm_mit_01", 0, X'8aa2b1e762f8da4ca4892b536fa3f208');

Code:
java -cp clojure-1.8.0.jar:dialoge-0.1.6.jar dialoge.core -afdz dialog.xml


Angehängte Dateien
.zip   dialoge-0.1.6.zip (Größe: 60,29 KB / Downloads: 4)
Zitieren
#30
(22.11.2016, 13:36)Rabenaas schrieb: So scheint es mir jetzt zu stimmen. ;)

Ja, klappt wunderbar. Leider fehlt noch ein Eintrag in der ChildMapping. Nach "Ich möchte doch etwas kaufen" müsste eigentlich nochmal "Schau her" kommen. Bei Dialogen mit NPCs, die man mehrmals anspricht, müsste man eigentlich auch noch eine weitere Dialogzeile einbauen. Die Vorstellung findet ja sonst jedes Mal statt. Du siehst, selbst einr relativ einfacher Dialog kann schoch ziemlich komplex werden.

Noch eine kleine Anmerkung: es muss <FullName heißen, nicht <heroName>.

Und eine Frage: hat sich der Aufbau der xml Datei geändert? Wo und wie wird festgelegt, welche Zeile auf welche folgt?
Zitieren
#31
Im Prinzip gilt der Aufbau aus #26. Die Reihenfolge ergibt sich aus der Abfolge von <a>, <b> und <auswahl>, wobei <auswahl> eine Verzweigung kodiert. Mit dem zweiten "Schau her." sieht das so aus:

Code:
<drasa_dialog>
  <daten>
    <inhalt id="einkauf_id" npc="loc01_bobo">Einladung</inhalt>
    <redner kennzeichen="a" id="loc01_bobo">Bobo</redner>
    <redner kennzeichen="b" id="">Held</redner>
  </daten>
  <texte>
    <a>Hallo.</a>
    <b>Hallo. Mein Name ist <heldenname/>.</b>
    <a>Willst du etwas kaufen, <heldenname/>?</a>
    <auswahl>
      <texte>
        <b>Ja.</b>
        <a>Schau her.</a>
      </texte>
      <texte>
        <b>Nein.</b>
        <a>Dann bis später.</a>
        <auswahl>
          <texte>
            <b>Ich möchte doch etwas kaufen.</b>
            <a>Schau her.</a>
          </texte>
          <texte>
            <b>Bis später.</b>
          </texte>
        </auswahl>
      </texte>
    </auswahl>
  </texte>
</drasa_dialog>

Nach dem <daten>-Teil kommt ein <texte>-Element, das eine Folge von <a>- und <b>-Elementen und zum Abschluss ggf. ein <auswahl>-Element enthält. Ein <auswahl>-Element enthält wieder ein oder mehrere <texte>-Elemente.

Wie das mit der geänderten Begrüßung aussehen könnte, ist mir gerade nicht klar. Vielleicht eine <auswahl> als erstes Kindelement vom ersten <texte>? Das ist im Moment noch nicht vorgesehen.


Angehängte Dateien
.zip   dialoge-0.1.7.zip (Größe: 60,29 KB / Downloads: 1)
Zitieren
#32
Wir müssen uns entscheiden, ob der Antworten-Baum zyklisch oder nichtzyklisch sein soll. Letzteres ist einfacher umzusetzen. Man könnte ggf. ein weiteres Element <alternativen> für Zyklen einführen.
Zitieren
#33
Mit der geänderten Begrüßung meinte ich folgendes: beim ersten Ansprechen stellen NPC und held sich gegenseitig mit Namen vor. Bei einem zweiten Besuch beim Händler ist das natürlich nicht notwendig, deshalb würde da etwas wie "Da seid Ihr ja wieder. Wollt Ihr einen Blick auf meine Waren werfen?" nehmen. Wäre dann im Dialog auch eine Auswahl zwischen "Hallo" und "Da seid Ihr ja wieder". Welche dann tatsächlich aktiviert wird, wäre dann von einer Condition abhängig, die ja im Moment in der DialogTakes noch nicht mit einem Wert geffüllt sind. Ist aber auch in diesem Moment absolut nicht notwendig.

So wie es im Moment aufgebaut ist, muss man also für Schau her zwei Datensätze anlegen, da der Text auch zweimal vorkommt. In den Dialogen im Spiel gibt es aber keine doppelten Dialogzeilen, hier wird einfach wieder zurück verwiesen.

Nur in der ChildMapping gäbe es dann zwei Einträge, die auf verschiedene DialogTakes Einträge verweisen. Würde dann so aussehen.

Code:
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'1d31c37b6780ba49b9c758d3f9d80d1d', "einkauf_030001", 0, X'46ec6ee07797914ea84efb23dc1bd791');

INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'2cea34df113c034abfa2b8e8f385a0e0', "einkauf_030001", 0, X'46ec6ee07797914ea84efb23dc1bd791');

Es wird also rekursiv vorgegangen, indem man einfach wieder zurückverweist und der daran hängende Dialogbaum erneut durchlaufen wird. Ein prima Beispiel dafür ist der Dialog mit dem Sitzenden in der Diebesgilde in Nadoret. Hier kann man den Dialog in einer Schleife immer wieder neu durchlaufen. Eine Abbruchbedingung zum Aussteigen ist natürlich auch implementiert.
Zitieren
#34
Die Begrüßung wäre mit einem <auswahl> gleich zu Anfang erledigt. Dann muss beim derzeitigen Stand allerdings der gesamte Baum dupliziert werden. Einen entscheidenden Nachteil sehe ich bei gedoppelten Locales nicht, verstehe aber die Entscheidung von RL, das nicht zu wollen.

Man könnte <a>, <b> und <auswahl> bei Bedarf Marken als Attribute geben, die sich dann mit einem goto explizit anspringen lassen. Man verabschiedet sich damit aber von der Baumstruktur, die hat den großen Vorteil Einfachheit hat. Aber Endlosschleifen gibt es halt nicht umsonst.
Zitieren
#35
Bei unserem Beispiel wäre eine doppele Zeile in der _Locale sicher zu verschmerzen. Allerdings würde es auch eine doppelte Zeile in der DialogTakes bedeuten. Bei manchen Dialogen wäre es aber eine ganze Reihe von doppelten Einträgen, da eben manchmal auch ein ganzer Dialogzweig von einer Zeile ausgeht. Und das würde den Dialog unnötig aufblähen.

Muss aber nicht sein. Ich wäre schon mit der Version (für AFdZ) zufrieden, die mir die Arbeit für lineare Dialoge abnimmt. Also so, wie es in Version 0.1.4 war. Letztendlich hält sich die Tipparbeit in Grenzen, da man viel mit Copy & Paste machen kann. Außerdem habe ich mir in Notepad+ einige Makros angelgt, mit denen der SQL Code dann erzeugt wird.
Zitieren
#36
Mit den Sprungmarken ließe sich viel Redundanz einsparen bei vertretbarem Aufwand. Lass mich mal schauen.

Ich würde immer die letzte Version nehmen, da ich nebenher auch noch Bugs fixe. Eine Ausgabe für AFdZ bekommst Du, wenn Du -afdz vor die XML-Datei schreibst.

EDIT: Also z.B.
Code:
<auswahl>
  <texte>
    <a>Seid gegrüßt.</a>
    <b>Hallo.</b>
    <a marke="kauf">Wollt ihr etwas kaufen?</a>
    <b>Na klar.</b>
  </texte>
  <texte>
    <a>Hallo mal wieder.</a>
    <b goto="kauf">Moin</b>
  </texte>
</auswahl>
Du musst natürlich die Condition von Hand eintragen. Kommt die bei StartState hin, oder bei den Takes von "Seid gegrüßt." und "Hallo mal wieder."?
Zitieren
#37
Die Conditions kommen immer in die jeweilige Dialogzeile, in dem Fal also in "Hallo". Die trage ich ohnehin meistens erst nachträglich ein. Außerdem ändern die sich auch schon mal nachträglich. Müssen also, genauso wie die Statements, bei der Dialogerstellung nicht berücksichtigt werden.
Zitieren
#38
Kurzes Feedback zu Version 0.1.7 mit AFdZ.

In der DialogTakes werden einige Felder falsch ausgefüllt. In der ersten zeile steht im Feld TakeLocaId StartState, hier muss 00000000-0000-0000-0000-000000000000 stehen. Das letzte Feld wird mit einem Blob ausgefüllt, hier muss ein beliebiger Identifikator (229e71a2-74b5-7b94-d83c-be5911f32158) stehen. Wenn der Held spricht, wird der Wert Player verwendet, bei Listener muss es allerdings Hero heißen. Ansonsten wäre es noch schön, wenn die Texteinträge in der _Locale am Ende keinen Identifikator bekommen, sonder nur eine fortlaufende Nummer. Das macht es für mich einfacher, den Text zu einem DialogTake Eintrag zu finden, wenn es später darum geht, die entsprechenden Statements und Conditions einzufügen.
Zitieren
#39
Ok. Besser so?
Code:
INSERT INTO "_Story_Dialogs" VALUES (X'368338f2d4f4ee4a8ed17c7c2e2de887', "komm_mit_id", "loc01_bobo", "", 0, "");
INSERT INTO "_Locale" VALUES ("txt_komm_mit_00", "Was ist");
INSERT INTO "_Locale" VALUES ("txt_komm_mit_01", "Komm mit.");
INSERT INTO "_Story_DialogTakes" VALUES (X'eb6d4ff361c8e143b3a4214fc504ed1c', X'368338f2d4f4ee4a8ed17c7c2e2de887', "komm_mit_id", "StartState", "", "null", "StartState", "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', "00000000-0000-0000-0000-000000000000", 0, "00000000-0000-0000-0000-000000000000");
INSERT INTO "_Story_DialogTakes" VALUES (X'ea93fc9402698844863c5f29d3087dcc', X'368338f2d4f4ee4a8ed17c7c2e2de887', "komm_mit_id", "komm_mit_00", "loc01_bobo", "Hero", "Take", "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', "txt_komm_mit_00", 0, "f62745e8-4c70-4062-b1e9-6904c0ca472d");
INSERT INTO "_Story_DialogTakes" VALUES (X'cf16c65ea67f324891d1f12cce435d9c', X'368338f2d4f4ee4a8ed17c7c2e2de887', "komm_mit_id", "komm_mit_01", "Player", "loc01_bobo", "Response", "", "", X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', X'00000000000000000000000000000000', "txt_komm_mit_01", 0, "cd8c66bf-c715-4207-83e5-b2849cbc2848");
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'3e0d64ebf45df14f89963105a847311b', X'eb6d4ff361c8e143b3a4214fc504ed1c', "komm_mit_00", 0, X'368338f2d4f4ee4a8ed17c7c2e2de887');
INSERT INTO "_Story_DialogTakeChildMapping" VALUES (X'dff9bcbc614b9b47b965362a202cb31f', X'ea93fc9402698844863c5f29d3087dcc', "komm_mit_01", 0, X'368338f2d4f4ee4a8ed17c7c2e2de887');

Ich habe mir jetzt AFdZ installiert, aber ob das meine Produktivität steigert...? :lol:


Angehängte Dateien
.zip   dialoge-0.1.8.zip (Größe: 61,41 KB / Downloads: 1)
Zitieren
#40
(24.11.2016, 08:20)Lord Demon schrieb: Das macht es für mich einfacher, den Text zu einem DialogTake Eintrag zu finden, wenn es später darum geht, die entsprechenden Statements und Conditions einzufügen.

Man könnte über ein Attribut in der XML-Datei angeben, dass eine Condition verlinkt werden soll und für diese einen Dummy erzeugen, so dass nur noch der eigentliche ConditionContent eingetragen werden muss.
Zitieren




Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste