[Modding] Getriggerter Dialog startet zweimal

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
BGT:
Das ist jetzt nicht wirklich eine Anfrage für Hilfe, eher eine erstaunt bis frustrierte Feststellung (und ganz vielleicht habe ich ja doch was übersehen).
Ich triggere einen Dialog mit einer Checkvariable. Diese Variable wird im Dialog dann hochgesetzt. Soweit so gewöhnlich.
Aber: der Dialog wird zweimal in Folge gestartet, wenn ich den Dialog in einer normalen Geschwindigkeit schließe. Offensichtlich(?) wird die Variable nicht schnell genug gesetzt?

Das Triggerscript:
Code:
IF
    Dead("bsrsd04")
    GlobalLT("bs_LadyDluskersPlea","GLOBAL",3)
    See([PC])
THEN
    RESPONSE #100
        StartDialogNoSet(Player1)
END
Der Dialog, der zweimal gestartet wird:
Code:
IF ~Dead("bsrsd04")
GlobalLT("bs_LadyDluskersPlea","GLOBAL",4)~ THEN lady_08
SAY ~Good <SIRMAAM>, we heard terrifying noises from within the mausoleum. Did you happen to have encountered my husband, Lord Dlusker, and can tell us about his wereabouts?~
(++ ~blahblah)
++ ~I'll talk to you later.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",3)~ + lady_06
END

IF ~~ THEN lady_06
SAY ~You'd do us a great favor, <SIRMAAM>.~
IF ~~ THEN EXIT
END
Der Dialog soll für GlobalLT("bs_LadyDluskersPlea","GLOBAL",3) kleiner 3 starten. Die Antwortoption setzt die Variable auf 3. Danach folgt noch eine Zeile des Questcharakters. Ich schließe den Dialog, daraufhin startet er noch einmal.
Das ist, wirklich, der absolute Standard, wie Dialoge getriggert werden, und hat bisher immer funktioniert.
*Kopfkratz*

Ausführlicher Code:
Ich habe das oben etwas vereinfacht, damit es nicht so verwirrend ist. Hier der ganze relevante d-Snippet:
APPEND bsrsd02
IF ~Global("bs_LadyDluskersPlea","GLOBAL",2)
!Dead("bsrsd04")~ THEN lady_06
SAY ~You'd do us a great favor, <SIRMAAM>.~
IF ~GlobalGT("bs_LadyDluskersPlea","GLOBAL",1)~ THEN EXIT
IF ~GlobalLT("bs_LadyDluskersPlea","GLOBAL",2)~ THEN DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",2)~ UNSOLVED_JOURNAL @931 EXIT
END

(...)

IF ~Dead("bsrsd04")
GlobalLT("bs_LadyDluskersPlea","GLOBAL",4)~ THEN lady_08
SAY ~Good <SIRMAAM>, we heard terrifying noises from within the mausoleum. Did you happen to have encountered my husband, Lord Dlusker, and can tell us about his wereabouts?~
++ ~I indeed found him. I am afraid he is dead.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",4)~ + lady_09
++ ~I'll talk to you later.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",3)~ + lady_06
END

EDIT: Es gibt keinen anderen Dialogstart für die Questcre.
 
Zuletzt bearbeitet:

Dachrisma

Senior Member
Registriert
20.03.2011
Beiträge
363
Wie lange dauert es denn, bis eine Kreatur als tot getriggert wird, beziehungsweise wird das möglicherweise doppelt bestätigt? Wenn es nicht das Skript ist, dann möglicherweise die Spielmechanik.
 

Argent

Senior Member
Registriert
13.07.2010
Beiträge
371
BGT:
Das ist jetzt nicht wirklich eine Anfrage für Hilfe, eher eine erstaunt bis frustrierte Feststellung (und ganz vielleicht habe ich ja doch was übersehen).
Ich triggere einen Dialog mit einer Checkvariable. Diese Variable wird im Dialog dann hochgesetzt. Soweit so gewöhnlich.
Aber: der Dialog wird zweimal in Folge gestartet, wenn ich den Dialog in einer normalen Geschwindigkeit schließe. Offensichtlich(?) wird die Variable nicht schnell genug gesetzt?

...

Der Dialog soll für GlobalLT("bs_LadyDluskersPlea","GLOBAL",3) kleiner 3 starten. Die Antwortoption setzt die Variable auf 3. Danach folgt noch eine Zeile des Questcharakters. Ich schließe den Dialog, daraufhin startet er noch einmal.
Das ist, wirklich, der absolute Standard, wie Dialoge getriggert werden, und hat bisher immer funktioniert.
*Kopfkratz*

Ausführlicher Code:
Ich habe das oben etwas vereinfacht, damit es nicht so verwirrend ist. Hier der ganze relevante d-Snippet:
APPEND bsrsd02
IF ~Global("bs_LadyDluskersPlea","GLOBAL",2)
!Dead("bsrsd04")~ THEN lady_06
SAY ~You'd do us a great favor, <SIRMAAM>.~
IF ~GlobalGT("bs_LadyDluskersPlea","GLOBAL",1)~ THEN EXIT
IF ~GlobalLT("bs_LadyDluskersPlea","GLOBAL",2)~ THEN DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",2)~ UNSOLVED_JOURNAL @931 EXIT
END

(...)

IF ~Dead("bsrsd04")
GlobalLT("bs_LadyDluskersPlea","GLOBAL",4)~ THEN lady_08
SAY ~Good <SIRMAAM>, we heard terrifying noises from within the mausoleum. Did you happen to have encountered my husband, Lord Dlusker, and can tell us about his wereabouts?~
++ ~I indeed found him. I am afraid he is dead.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",4)~ + lady_09
++ ~I'll talk to you later.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",3)~ + lady_06
END

EDIT: Es gibt keinen anderen Dialogstart für die Questcre.
Ich vermute mal, dass es an der verzögerten Ausführung von Scriptbefehlen innerhalb des Dialogs liegt. Im unteren Dialogblock (ausführlicher Code) wird SetGlobal("bs_LadyDluskersPlea","GLOBAL",3) gesetzt und dann direkt zum Block "lady_06" gesprungen. Da das Setzen von Variablen mind. 2 Dialogübergänge benötigt, wird in diesem Fall die untere IF-Option ausgeführt, in der SetGlobal("bs_LadyDluskersPlea","GLOBAL",2) gesetzt wird. Damit ist die Variable < 3, wenn der Dialog beendet wird.
 
Zuletzt bearbeitet:

Dachrisma

Senior Member
Registriert
20.03.2011
Beiträge
363
Da das Setzen von Variablen mind. 2 Dialogübergänge benötigt
Ich versuche das schon die Ganze Zeit überhaupt in eine logische Reihenfolge zu bringen. Das gelingt schon wegen der ganzen fehlenden Ziffern (@XXX) überhaupt nicht.

IF ~Dead("bsrsd04")
// Wenn LordDluskersPlea tot ist
GlobalLT("bs_LadyDluskersPlea","GLOBAL",4)~ THEN lady_08
//wird die Quest in den Status versetzt, daß die Lady die Geräusche gehört hat und danach fragt
++ ~I indeed found him. I am afraid he is dead.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",4)~ + lady_09
++ ~I'll talk to you later.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",3)~ + lady_06
Und das sind dann die Antwortmöglichkeiten
//Bei der ersten wird die Quest gelöst
//Bei der zweiten das Gespräch beendet, theoretisch

Was passiert denn bei der ersten Antwort?

bedeutet also, daß der Dialog dann einfach weiter geführt wird, mit den zwei Antwortmöglichkeiten.
Diese + lady_06 müsste die Verabschiedung sein, die oben schon verwendet wird, ist das korrekt? Ich habe zuerst gedacht der eigentlich Trigger wäre die Leiche. Die ist die Globale, klar, aber was mich so stört... kann ich nur schwer nachvollziehen, es endet mit dem + lady_06. Was ist das Äquvalent zum @, das +? Ich meine, man kann ja lesen und verstehen was hinter dem ++ steht, aber woher weiß das Spiel das, muss ja dann der Kram sein (+ lady_09,...). Und reicht ein END für beide Dialogoptionen?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
wird in diesem Fall die untere IF-Option ausgeführt, in der SetGlobal("bs_LadyDluskersPlea","GLOBAL",2) gesetzt wird. Damit ist die Variable < 3, wenn der Dialog beendet wird.
:eek: Ich bin so ein Depp! Genau das war es natürlich. Die Variable war sogar 0, als der Dialog startete, natürlich wird dann die <2 Transaktion ausgeführt. - Dass das Setzen im Dialog mindestens 2 States braucht weiß ich ja; die Abfragen und vor allem das Setzen auf 2(!) hatte ich echt völlig ausgeblendet.
Vielen Dank!

So funkzioniert es jetzt:
Code:
IF ~Global("bs_LadyDluskersPlea","GLOBAL",2)
!Dead("bsrsd04")~ THEN lady_06
SAY ~You'd do us a great favor, <SIRMAAM>.~
IF ~Or(2)
    GlobalGT("bs_LadyDluskersPlea","GLOBAL",1)
    Dead("bsrsd04")~ THEN EXIT
IF ~GlobalLT("bs_LadyDluskersPlea","GLOBAL",2)
!Dead("bsrsd04")~ THEN DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",2)~ UNSOLVED_JOURNAL @931 EXIT
END
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Diese + lady_06 müsste die Verabschiedung sein, die oben schon verwendet wird, ist das korrekt?
Genau, wenn man antwortet "I'll talk to you later.", dann soll sie nur noch sagen "You'd do us a great favor, <SIRMAAM>.", und dann sollte im Gesprächsverlauf oben der Dialog aufhören.
Was ist das Äquvalent zum @, das +?
@ wird ausschließlich zum Refernziern von tra-Zeilen verwendet. Im beispiel oben ist @931 ein Tagebucheintrag.
Die "+" sind Kurzschreibweise.
Code:
++ ~Wie bitte?~ + statename
ist äquivalent zu
Code:
IF ~~ THEN REPLY ~Wie bitte?~ GOTO statename
Ich meine, man kann ja lesen und verstehen was hinter dem ++ steht, aber woher weiß das Spiel das, muss ja dann der Kram sein (+ lady_09,...).
Eine Zeile ist immer eine Antwortoption (bzw. eine Transaction) mit Trigger und auszuführenden Aktionen. Au dem Beispiel oben:
Code:
++ ~I indeed found him. I am afraid he is dead.~ DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",4)~ + lady_09
Da steht:
-Die Antwortoption hat keine Beschränkung (Trigger), daher "++" (== IF ~~ THEN REPLY)
-Wenn der Spieler diese Antwortoption wählt, dann setze die Variable "bs_LadyDluskersPlea" auf 4 (DO ~SetGlobal("bs_LadyDluskersPlea","GLOBAL",4)~)
-das Gespräch geht dann weiter mit den Dialog state "lady_09". <- so heißt dieser State nur in meinem d-File. Beim Installieren macht weidu da Nummern draus.

Und der State hat Trigger, weil ich ihn (auch) als "Ansprechdialog" verwende. Deswegen hat auch der "lady_06" Statetrigger, obwohl diese beim Gesprächsverlauf ignoriert werden.
//wird die Quest in den Status versetzt, daß die Lady die Geräusche gehört hat und danach fragt
Achtung: oben sind die Statetrigger. Diese sind bereits erfüllt, wenn man die Lady anspricht und sie diesen Dialog startet. Die Quest wird also nicht in diesen Status erst versetzt sondern ist es schon:
Dead("bsrsd04") - der Lord ist tot
GlobalLT("bs_LadyDluskersPlea","GLOBAL",4) - die Questvariable ist noch kleiner als "4".

Alles in allem sind meine d-Dateien kein gutes Beispiel für Anfänger, fürchte ich. Ich verknüpfe von hinten nach vorne und zurück, unterscheide dreihunderdrölf verschiedene Questzustände, möchte keine Zeilen verdoppeln und arbeite deswegen mit zusätzlichen Checkvariablen etc...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Und reicht ein END für beide Dialogoptionen?
Vergessen darauf zu antworten.
Ein END pro Dialogstate, ja.
Prinzipieller State:
IF ~(Triggerkonditionen falls Begrüßungsdialog)~ THEN statename
SAY ~Textzeile~
+ ~Triggerkondition für Antwort1~ + ~Antwort1~ DO ~something~ + statename1
+ ~Triggerkondition für Antwort2~ + ~Antwort1~ DO ~something~ + statename1
END

oder auch Weiterleitung ohne Antwortoption:
IF ~(Triggerkonditionen falls Begrüßungsdialog)~ THEN statename
SAY ~Textzeile~
IF ~Triggerkondition für Transaction1~ THEN DO ~something~ + statename1
IF ~Triggerkondition für Transaction2~ THEN DO ~something~ + statename2
END
 
Oben