[Modding] Konfliktfreie Änderungen von Dialogen im Original-Spiel

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Ich erhalte häufiger das Feedback von Spielern, die sich wünschen, dass NPCs des Original-Spiel auf den Erfolg nach Abschluss von „Call of the Lost Goddess“ reagieren.
Hierzu müsste ich einige Original-Dialoge der Priester in allen Tempeln Waukeens angleichen: Die alten Dialogoptionen deaktivieren und neue einführen.
Mir ist bewusst, dass ich dadurch Gefahr laufe, andere Mods, die genau dort eingreifen könnten, inkompatibel zu machen.
Konkret würde ich die Begrüßung der Tempel zu „Hallo Retter Waukeens“ ändern und die Optionen zum Verschwinden Waukeens nicht mehr verfügbar machen.
Wie mache ich das am Besten?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Blöde Frage: über was sprechen wir genau? Ich verstehe Deine Frage auch so, dass Du nicht über joinable NPCs sprichst?
Wenn es bedeutet, dass Du den einen immer-wahren Begrüßungsdialog deaktivierst, von dem alle Antwortoptionen ausgehen, dann wäre es kompatibilitätsmäßig tatsächlich ziemlich ungünstig.
Deswegen die Überlegungen:
-Könnte das Reagieren abgedeckt werden, indem man einen einmal-wahren "Reaktions"begrüßungsdialog schreibt und danach wieder der Standardsatz des Spielcharakters erhältlich ist?
-Wenn eine Formulierung wirklich gar keinen Sinn mehr macht, könnte man diese Zeile mit STRING_SET zu etwas neutralem ändern was vorher und hinterher passt, so dass die von anderen Mod eingefügten Inhalte nicht verloren gehen?
-Sprechen wir "nur" von weiteren Ausführungen des Charakters (ohne Antwortmöglichkeiten), oder einzelnen Antwortoptionen/Fragen, die man deaktivieren müsste?
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
427
Du könntest was im Sinne von

IF
OR(2)
Global(Waukeen ist gerettet) = False
Local(Priester hat gesagt was für ein coole Typ du bist) = True

als Bedingung an den Standartdialog setzen.

Wenn "Global(Waukeen ist gerettet) = True" ist, kommt einmal ein anderer Dialog an dessen Ende "Local(Priester hat gesagt was für ein coole Typ du bist)" auf True gesetzt wird.
Dadurch hast du zwar nicht immer eine entsprechende Reaktion, aber die Immersion sollte trotzdem verbessert sein.

Ansonsten wären vielleicht auch Kommentare über "DisplayStringHead" denkbar, wo du nur etwas an den Script anfügen musst.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
427
Möglicherweise kannst du auch den String der Begrüßung ersetzen und in der Ersetzung einen Token einfügen, den du selber definierst. Ich weiß nicht mehr, ob SetTokenGlobal nur für Zahlen oder auch für Strings funktiniert hat (https://www.baldurs-gate.de/index.php?threads/genaue-werte-im-dialog-abfragen.44919/#post-1083448). Wenn ja könntest du denn Token z.B. auf = "." setzen und bei Erledigung der Quest durch ", Retter Waukeens" ersetzen.

Wenn während des laufenden Spiels neue Mods installiert werden, werden diese Tokens aber überschrieben. Da ich immer auch Tests an eigenen Mods durchführe und daher ständig de- und neuinstalliere, hatte ich auf weiter Experimete damit verzichtet.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Vielen Dank für Eure Antworten!
Es geht zunächst um drei Dialoge der Waukeen-Priester (in Athkatla, Handelstreff und Saradush).
Der Dialog in Athkatla im Regierungsviertel-Tempel ist am Einfachsten. Der erste Block sieht so aus: *

BEGIN ~GOVWAU01~
IF ~True()~ THEN BEGIN 0 // from:
SAY #58435 /* ~Willkommen. Dieser Altar ist Waukeen geweiht, unserer Herrin der Münzen. Sie, die gütig auf alle herablächelt, die handeln. Gibt es etwas, dass ich für Euch tun könnte?~ */
IF ~~ THEN REPLY #58436 /* ~Ich dachte, Waukeen wäre tot. Wie könnt Ihr sie immer noch anbeten?~ */ GOTO 1
IF ~~ THEN REPLY #58451 /* ~Handel scheint mir nicht sonderlich heilig zu sein.~ */ GOTO 4
IF ~~ THEN REPLY #58452 /* ~Ich würde gern Eure Dienste in Anspruch nehmen, bitte.~ */ GOTO 7
IF ~~ THEN REPLY #58453 /* ~Nichts. Ich gehe jetzt.~ */ GOTO 8
END


Ich würde gerne den grün markierten Satz durch etwas anderes ersetzen. Hier ist Eure Idee gut, dass ich einmalig einen Block darüber einfüge. Ginge das mit etwas wie diesem hier?
Code:
APPEND ~GOVWAU01~
IF WEIGHT #-999 ~Global("AC#WaukeenFree","GLOBAL",1)
Global("AC#WaukeenReaction","AR1010",0)~ THEN BEGIN hello_hero
   SAY ~Hallo <CHARNAME>, Danke für die Rettung von Waukeen!~
   IF ~~ THEN DO ~SetGlobal("AC#WaukeenReaction","AR1010",1)~ EXIT
END

Dieser Block würde einmal feuern und dann würde wieder der normale Dialog kommen.

Schwierig wird die rote Antwort des Spielers ("Ich dachte, Waukeen wäre tot. Wie könnt Ihr sie immer noch anbeten?"), diese Antwort würde ich gerne mit einem Trigger IF ~Global("AC#WaukeenFree","GLOBAL",0)~THEN versehen. So erscheint diese Option lediglich, wenn die Quest noch nicht abgeschlossen ist.
Nur: Wie mache ich das?

Ansonsten wären vielleicht auch Kommentare über "DisplayStringHead" denkbar, wo du nur etwas an den Script anfügen musst.
Oh, das ist auch eine interessante Idee! Leider hat die creature GOVWAU01.cre kein eigenes Script, das müsste ich dann erst reinpatchen, was vielleicht wieder Inkompatibilitäten hervorrufen könnte. :c:
Möglicherweise kannst du auch den String der Begrüßung ersetzen und in der Ersetzung einen Token einfügen, den du selber definierst.
Das ist eine gute Idee - ich weiß nur nicht, ob es gegen Modding-Etikette verstößt, Strings der original-Dialoge durch eine Mod zu editieren?

____________________________________________________
* Kleine Anmerkung am Rande: Die String enthält selbst in BG2EE einen Rechtsschreibfehler. Es muss "Gibt es etwas, das ich für Euch tun könnte?" heißen und nicht "Gibt es etwas, dass ich für Euch tun könnte?"...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Du könntest was im Sinne von

IF
OR(2)
Global(Waukeen ist gerettet) = False
Local(Priester hat gesagt was für ein coole Typ du bist) = True

als Bedingung an den Standartdialog setzen.

Wenn "Global(Waukeen ist gerettet) = True" ist, kommt einmal ein anderer Dialog an dessen Ende "Local(Priester hat gesagt was für ein coole Typ du bist)" auf True gesetzt wird.
Dadurch hast du zwar nicht immer eine entsprechende Reaktion, aber die Immersion sollte trotzdem verbessert sein.
@Genwa ein einmal-wahrer Begrüßungsdialog lässt sich relativ einfach realisieren, indem man mit WEIGHT #-1 einen "einmal wahren" Dialog einfügt. Der spielt dann einmal, danach ist er deaktiviert. Die State-Trigger zu verändern hat immer das Risiko, dass andere Mods das auch machen wollen könnten.

Hier ist Eure Idee gut, dass ich einmalig einen Block darüber einfüge. Ginge das mit etwas wie diesem hier?
Ich würde es einfach mit WEIGHT #-1 machen, das wird dann als "jetzt gerade höchst gewichteter State" in die dlg eingefügt. (Mit anderen Zahlen kenne ich mich hier nicht aus, ich weiß nicht genau, was -999 ergeben würde?). Ansonsten ja, genau so - eine Triggervariable, die dann gleich gesetzt wird, und beim nächsten Ansprechen kommt dann wieder der normale Dialog.

Schwierig wird die rote Antwort des Spielers ("Ich dachte, Waukeen wäre tot. Wie könnt Ihr sie immer noch anbeten?"), diese Antwort würde ich gerne mit einem Trigger IF ~Global("AC#WaukeenFree","GLOBAL",0)~THEN versehen. So erscheint diese Option lediglich, wenn die Quest noch nicht abgeschlossen ist.
Nur: Wie mache ich das?
Das Deaktivieren der entsprechenden Antwortoption würde man mit ADD_TRANS_TRIGGER machen. In diesem Fall (GOVWAU01.dlg, State 0, erste Antwortoption, also auch "0"):
Code:
ADD_TRANS_TRIGGER GOVWAU01 0 ~Global("AC#WaukeenFree","GLOBAL",0)~ DO 0
(Hier sieht man auch gut, warum weitere Antwortmöglichkeiten immer mit EXTEND_BOTTOM, und nie mit EXTEND_TOP eingefügt werden sollten - weil sich sonst die Nummerrierung der Antwortoptionen verschiebt und dieser Code die falsche Antwortoption patchen würde.)
Leider hat die creature GOVWAU01.cre kein eigenes Script, das müsste ich dann erst reinpatchen, was vielleicht wieder Inkompatibilitäten hervorrufen könnte.
Hat die cre einen Skriptnamen/Deathvariable? Dann könntest Du sie auch über das Areaskript für den DisplayStringHead ansprechen.
ob es gegen Modding-Etikette verstößt, Strings der original-Dialoge durch eine Mod zu editieren?
*Schaut zu Imeon4Ever* Meiner Meinung nach hängt es davon ab, was genau geändert wird. Eine Begrüßung mit "Retter Waukeens" zu erweitern fände ich jetzt nicht unangemessen. Aus "Seid herzlich gegrüßt" ein "verp* Euch" zu machen (also, die Bedeutung des Originalstrings so zu verändern, dass Einmischdialoge von NPCs keinen Sinn mehr ergeben oder Informationen, die andere Mods verwenden möchten nicht mehr gegeben werden) wäre dagegen bzgl Kompatibilität nicht gut.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Das Deaktivieren der entsprechenden Antwortoption würde man mit ADD_TRANS_TRIGGER machen. In diesem Fall (GOVWAU01.dlg, State 0, erste Antwortoption, also auch "0"):
Du bist toll! Genau so habe ich es gemacht, und jetzt läuft alles. :)

Hat die cre einen Skriptnamen/Deathvariable? Dann könntest Du sie auch über das Areaskript für den DisplayStringHead ansprechen.
Ja, sie hat eine Deathvariable, aber ich könnte über das Area-Script nicht prüfen, ob der PC in Reichweite ist, oder? Ich habe es jetzt mit der oben angesprochenen Triggervariable gemacht.

*Schaut zu Imeon4Ever*
Naja, I4E ist ja eigentlich gar keine Mod, sondern ein unumgänglicher Patch, um BG2 überhaupt spielbar zu machen. Will heißen: I4E darf alles. ;)

Ich würde morgen an den nächsten Dialog in Handelstreff gehen. Der ist etwas schwieriger, weil bereits im Vanilla-Spiel dort Mazzys Quest eingreift. Auch hierzu habe ich vielleicht einige Fragen...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
aber ich könnte über das Area-Script nicht prüfen, ob der PC in Reichweite ist, oder?
Das ist wahr. Es gibt einen Trigger, vor allem in der EE, der eine Kondition für ein Objekt prüft, bilde ich mir ein. Ich weiß gerade nur nicht, wie der heißt. :wunder: Ich suche mal.
I4E ist ja eigentlich gar keine Mod, sondern ein unumgänglicher Patch, um BG2 überhaupt spielbar zu machen.
Made my day. :cool: Danke für die netten Worte!
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Es gibt einen Trigger, vor allem in der EE, der eine Kondition für ein Objekt prüft, bilde ich mir ein. Ich weiß gerade nur nicht, wie der heißt.
@Acifer Gefunden. Ich meinte TriggerOverride(). Wird wohl in SoD häufiger verwendet.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Oh, wow! Das höre ich gerade zum ersten Mal. Vielen Dank!
Ich habe mittlerweile alle Waukeen-Tempel-Dialoge gepatcht und es scheint alles zu funktionieren.
Noch einmal Danke für die kompetente Hilfe!
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
TriggerOverride() wird auch im IESDP nicht beschrieben? :hae:
EDIT: Ah - doch? Unter 0x40E0 NextTriggerObject(O:Object*). Ich bin verwirrt.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
427
Spannend. Braucht TriggerOverride() eine Deathvariable oder würde das beispielsweise auch mit Lastseenby(Myself) als Object funktionieren?

Ich stelle mir dazu jetzt etwas in der Art vor:

IF
!See(Nearestenemyof(Myself))

Allegiance(Myself,ENEMY)
See([ENEMY])

NextTriggerObject(Lastseenby(Myself))
See(Nearestenemyof(Myself))
THEN
RESPONSE #100
MoveToObject(Lastseenby(Myself))
END
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Hatte ich gehofft, aber war mir nicht sicher.
 
Oben