[Modding] Wie verändere ich am Besten die Kickout-Dialoge der Bioware-NPCs?

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.171
Ich stehe vor dem Problem, dass ich möchte, dass in bestimmten Phasen in meiner Mod die Bioware-NPCs daran gehindert werden sollten, nach Verlassen der Gruppe zu bestimmten Orten in Athkatla gehen zu können (weil sie sich nämlich im Unterreich befinden).
Nur: Wie mache ich das?

Ich habe als Beispiel den relevanten Teil des Jaheira-Dialoges eingefügt:

IF WEIGHT #11 /* Triggers after states #: 49 73 72 66 even though they appear after this state */
~OR(2)
Global("JaheiraRomanceActive","GLOBAL",1)
Global("JaheiraRomanceActive","GLOBAL",2)
Global("JaheiraHarperPlot","GLOBAL",0)
Global("KickedOut","LOCALS",0)
~ THEN BEGIN 27 // from:
SAY #18772 /* ~Das ... Das kommt jetzt aber unerwartet. Ich dachte, wir stünden uns näher als einfache Reisegefährten. Es ist ja nicht so, dass ich an der Weisheit Eurer Entscheidung zweifle, aber ich bezweifle, dass es zwischen uns jemals wieder so wird wie bisher, wenn ich die Gruppe jetzt verlassen muss.~ [JAHEIRF1] */
IF ~~ THEN GOTO 28
END

IF ~~ THEN BEGIN 28 // from: 27.0
SAY #18776 /* ~Ich möchte Eure ... Gruppe nicht verlassen. Ihr wollt mich doch bestimmt auch weiterhin um Euch haben? Ihr habt das doch selbst gesagt, wenn auch nicht wörtlich.~ */
IF ~~ THEN REPLY #18779 /* ~Natürlich, Jaheira, bleibt doch bitte. Ich möchte nicht, dass Ihr uns verlasst. Ich habe mich wohl nur falsch ausgedrückt.~ */ GOTO 29
IF ~~ THEN REPLY #18780 /* ~Ich weiß, dass dies nicht leicht ist, aber ich glaube, es ist dennoch notwendig. Vielleicht werde ich später zurückkommen und Euch wieder mitnehmen.~ */ GOTO 30
IF ~~ THEN REPLY #18781 /* ~Ihr irrt Euch! Das ist das Beste für die Gruppe als Ganzes, und Ihr werdet mich nicht vom Gegenteil überzeugen.~ */ GOTO 31
END

IF ~~ THEN BEGIN 29 // from: 28.0
SAY #18783 /* ~Ich freue mich darüber. Ich bin ... Ich bin überzeugt davon, dass wir in Zukunft eine Menge erreichen werden.~ */
IF ~~ THEN DO ~JoinParty()
~ EXIT
END

IF ~~ THEN BEGIN 30 // from: 28.1 67.1 69.1
SAY #18785 /* ~Ja, aber es wird nicht mehr so sein wie früher. Ihr werdet mich vermutlich in Atkatla finden und zwar in der Nähe der Harfnerfeste. Wenn Ihr mich braucht, sucht mich dort.~ */
IF ~~ THEN DO ~SetGlobal("JaheiraRomanceActive","GLOBAL",3)
SetGlobal("KickedOut","LOCALS",1)
EscapeAreaMove("AR0300",1257,3007,14)
~ EXIT
END

IF ~~ THEN BEGIN 31 // from: 28.2
SAY #18788 /* ~Ich verstehe. Nun gut, wenn es das Schicksal so bestimmt hat ... Ich bin vermutlich in Atkatla, in der Nähe der Harfnerfeste. Sucht mich dort, wenn Ihr mich benötigt, auch wenn das jetzt kaum mehr eine Rolle spielt.~ */
IF ~~ THEN DO ~SetGlobal("JaheiraRomanceActive","GLOBAL",3)
SetGlobal("KickedOut","LOCALS",1)
EscapeAreaMove("AR0300",1257,3007,14)
~ EXIT
END

Ich würde gerne den State #28 folgendermaßen verändern:

IF ~~ THEN BEGIN 28 // from: 27.0
SAY #18776 /* ~Ich möchte Eure ... Gruppe nicht verlassen. Ihr wollt mich doch bestimmt auch weiterhin um Euch haben? Ihr habt das doch selbst gesagt, wenn auch nicht wörtlich.~ */
IF ~~ THEN REPLY #18779 /* ~Natürlich, Jaheira, bleibt doch bitte. Ich möchte nicht, dass Ihr uns verlasst. Ich habe mich wohl nur falsch ausgedrückt.~ */ GOTO 29
IF ~!AreaType(UNDERDARK)~ THEN REPLY #18780 /* ~Ich weiß, dass dies nicht leicht ist, aber ich glaube, es ist dennoch notwendig. Vielleicht werde ich später zurückkommen und Euch wieder mitnehmen.~ */ GOTO 30
IF ~!AreaType(UNDERDARK)~ THEN REPLY #18781 /* ~Ihr irrt Euch! Das ist das Beste für die Gruppe als Ganzes, und Ihr werdet mich nicht vom Gegenteil überzeugen.~ */ GOTO 31
IF ~AreaType(UNDERDARK)~ THEN REPLY ~Ich glaube, es ist notwendig. Vielleicht werde ich später zurückkommen und Euch wieder mitnehmen.~ GOTO leave_underdark
END

...danach würde ich den State leave_underdark hinzufügen:

IF ~~ THEN BEGIN leave_underdark
~Ich verstehe. Nun gut, wenn es das Schicksal so bestimmt hat ... Ich kehre zurück nach Iltkazar. Sucht mich dort, wenn Ihr mich benötigt, auch wenn das jetzt kaum mehr eine Rolle spielt.~
IF ~~ THEN DO ~SetGlobal("JaheiraRomanceActive","GLOBAL",3)
SetGlobal("KickedOut","LOCALS",1)
EscapeAreaMove("ACIL50",1257,3007,14)
~ EXIT
END

Ist das überhaupt eine gute Idee, das so zu machen? Wenn ja, wie mache ich das in meinem WeiDU-Code? Ich habe leider von derlei Dingen wenig Ahnung... :hae:
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Das geht. Ich kann mal heute abend nachschauen, wie ich das gemacht habe. Auswendig weiß ich das nicht ;)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
@Acifer Willst Du nicht lieber einen höher gewichteten neuen Dialog einfügen, der im Untereich triggert? Gibt es noch andere Mods, die neue Kickoutdialoge einfügen (also nicht nur neue Antwortoptionen)?

Zum Einfügen neuer Trigger in die Antwortoptionen gibt es von Weidu das ADD_TRANS_TRIGGER. Anwendungsbeispiel:
Code:
ADD_TRANS_TRIGGER c#brfl#s 2 ~LevelGT("C#Brandock",17)~ DO 8
Bei den beispiel wird der dlg "c#brfl#s.dlg" im State "2" in der 8. Transaktion/Reply Option* der zusätzliche Trigger "LevelGT("C#Brandock",17)" eingefügt.
*Hierbei werden die Transaktionen /Reply Options von oben nach unten gezählt und bei "0" begonnen. Die "8." ist also normal gezählt die "9." Antwortoption.
Genauso geht auch REPLACE_TRANS_TRIGGER, das überschreibt aber alles, was schon da ist.
Das Problem hierbei: wie stellt man sicher, dass man die richitge Antwortoption patcht? Wenn nämlich eine andere Mod eine Antwortoption oben eingeschoben hat, dann haben sich die Nummern der Originalen entsprechend verändert. Hierzu hat argent77 mehrere Funktionen geschrieben, wie man die Antwortoption, die mit einer bekannten Stringreferenz ausgestattet ist, erkennen kann. Ich hatte hier eine davon gepostet mit der man pro State eine Antwortoption patchen kann bzw. je eine für mehrere States sofrn sich die Strings unterscheiden, die folgenden Posts beinhalten noch Abwandlungen. Mir fehlt leider das Wissen, um sie für den Fall, dass man mehrere unterschiedliche Strings in einem State patchen möchte abändern müsste.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.171
Willst Du nicht lieber einen höher gewichteten neuen Dialog einfügen, der im Untereich triggert?
Also, das ist ja wirklich das Naheliegendste... daran hatte ich noch gar nicht gedacht *stirnklatsch* :p
Ich denke, so werde ich es machen und mich auf das Feedback beim Beta-Testen verlassen, ob es Probleme gibt.
Gibt es noch andere Mods, die neue Kickoutdialoge einfügen (also nicht nur neue Antwortoptionen)?
Mir sind keine bekannt. Wobei- wenn die ihre Konditionen richtig gesetzt haben, dürfte es eigentlich keine Probleme geben, oder?

Zum Einfügen neuer Trigger in die Antwortoptionen gibt es von Weidu das ADD_TRANS_TRIGGER. Anwendungsbeispiel:
Diesen Befehl und Argent77's Funktionen kannte ich bisher noch nicht - Danke!
Dennoch ist Dein erster Vorschlag glaube ich der Beste, weil ich dadurch nicht in bestehenden Dialogen herumpfuschen müsste und die verschiedenen Kickout-Option Jaheiras (je nach Romanze, Harfner-Quest etcpp.) nicht berücksichtigen muss. Einfach meine Area-Checks rein und gut ist. Toll! :up::up::up:
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
wenn die ihre Konditionen richtig gesetzt haben, dürfte es eigentlich keine Probleme geben, oder?
Außer irgendeine Mod fügt einen Dialog mit "WEIGHT #-1" dazu und wird nach Deiner installiert. Aber dann könnte man das immer noch über eine später zu installierende Kompatibilitätskomponente wieder korrigieren.
EDIT: ah, jetzt verstehe ich, was Du meinst. Wenn die eingefügten Dialoge z.B. nur in bestimmten Areas gelten etc. dann triggern sie in Deinem Unterreich nicht. Das stimmt.
weil ich dadurch nicht in bestehenden Dialogen herumpfuschen müsste und die verschiedenen Kickout-Option Jaheiras (je nach Romanze, Harfner-Quest etcpp.) nicht berücksichtigen muss.
Genau das. Und keine weiteren Antwortoptionen, die andere Mod einfügen etc.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Und noch die fehlenden Komponenten für den ursprünglichen Plan:

Zusätzliche Antwortoption einfügen:
Code:
EXTEND_BOTTOM ~GANDOL~ 13
+ ~Global("M8MENashkellAttack","GLOBAL",1) Global("M8MEGandolNCH","LOCALS",0)~ + @1 + morenco_nash /*I'll think about it. I am concerned about a strange encounter we had near the town of Nashkell.*/
+ ~Global("M8MEGullykinAttack","GLOBAL",1) Global("M8MEGandolNCH","LOCALS",0)~ + @2 + morenco_gully  /*Interesting, but there is a more urgent issue I wand to discuss with you.*/
END
Wichtig: das END nicht vergessen! Die 13 ist dann wieder der State (ähnlich wie bei dem ADD_TRANS_TRIGGER). Auch hier kann dann eine andere Mod was versauen, deswegen immer die Sachen unten anfügen (weil es gäbe natürlich auch EXTEND_TOP, aber dann verschieben sich die Antwortoptionen und hinzugefügte ADD_TRANS_TRIGGER werden falsch eingebaut.

Und dann die neuen Dialoge der dlg-Datei hinzufügen:
Code:
APPEND ~GANDOL~

IF ~~ THEN morenco_nash
SAY @8 /*Well, Nashkell is not my concern. Why do you adress me?*/
++ @9 + 11 /*You are right, this is not your problem, I have deal with this by myself. I'll put focus on your kobold problem.*/
++ @7 DO ~SetGlobal("M8MEGandolNCH","LOCALS",1)~ EXIT /*You are so selfish. I'm sick of all that. Good-bye.*/
++ @10 + morenco_rage /*Cause there was a bunch of halflings that waylaid and made a sneak attach on us!*/
++ @11 + morenco_calm /*Because there was a group of halflings who attachek us shouting something like NCH rulez...*/
END

END //of APPEND
Und auch das APPEND benötigt ein END. Kommentare helfen dabei, nicht die Übersicht über die ganzen END zu verlieren ;)

Und noch zur Illustration ein ADD_TRANS_TRIGGER Block (alles Wesentliche hat ja Jastey erklärt...):
Code:
ADD_TRANS_TRIGGER GORION 0 ~Global("M8IGImoenLeaveDelay","LOCALS",0)~ DO 0
ADD_TRANS_TRIGGER GORION 0 ~Global("M8IGImoenLeaveDelay","LOCALS",0)~ DO 1
ADD_TRANS_TRIGGER GORION 0 ~Global("M8IGImoenLeaveDelay","LOCALS",0)~ DO 2
ADD_TRANS_TRIGGER GORION 0 ~Global("M8IGImoenLeaveDelay","LOCALS",0)~ DO 3
ADD_TRANS_TRIGGER GORION 0 ~Global("M8IGImoenLeaveDelay","LOCALS",0)~ DO 4
Wichtig ist hier, dass da keine END irgendwo verwendet werden. Das steht einfach so in der zu prozessierenden *.d-Datei
 
Zuletzt bearbeitet:

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.171
Und noch die fehlenden Komponenten für den ursprünglichen Plan:
Cool! Danke! :up:

EDIT: ah, jetzt verstehe ich, was Du meinst. Wenn die eingefügten Dialoge z.B. nur in bestimmten Areas gelten etc. dann triggern sie in Deinem Unterreich nicht. Das stimmt.
Ja, so hoffe ich, dass es dann ein sicherer Weg ist.

Vielen Dank Euch beiden für die schnelle Hilfe und die anschaulichen Beispiele!
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Und noch zur Illustration ein ADD_TRANS_TRIGGER Block
Das Beispiel lässt sich vereinfachen, wenn der Trigger an alle vorhandenen Transaktionen /Reply Options angeheftet werden soll. Dann kann man das "DO x" einfach weglassen:
Code:
ADD_TRANS_TRIGGER GORION 0 ~Global("M8IGImoenLeaveDelay","LOCALS",0)~
patcht alle vorhandenen 5 Antwortoptionen. (Und natürlich noch weitere, wenn Mods welche eingefügt haben.)
Es gibt noch weitre Möglichkeiten, dass man eine dActionWhen (also eine Konditioin für das Patchen) dazunimmt etc. Ich verwende z.B. das hier in SoD in THrix' Dialog:
Code:
ADD_TRANS_TRIGGER BDTHRIX 13 ~OR(3) Global("C#BrandockJoined","GLOBAL",0) !InMyArea("C#Brandock") StateCheck("C#Brandock",CD_STATE_NOTVALID)~ DO 2 IF ~!Is?f?ValidForPartyDialogue("Rasaad")~
Das IF am Ende stellt sicher, dass die Antwortoption nur gepatcht ist, wenn der spezifizierte String darin vorkommt, was zumindest verhindert, dass die falsche gepatcht wird falls eine Mod die Nummerierung verschoben hat (das Raussuchen der richtigen wäre dann argent77s Funktion als nächster Failsafe-Schritt).
@Acifer die WeiDu-Readme gibt da Listen mit den ganzen Möglichkeiten. ich finde die nur so halb anschaulich und brauche zusätzlich immer Beispiele, aber es gibt eine Idee, was alles möglich ist.
 
Oben