[Tutorial] Sammelthread - Wie erstelle ich eine Modifikation?

Dachrisma

Senior Member
Registriert
20.03.2011
Beiträge
171
Euch entgeht nicht mal eine Randbemerkng, was? Vielen Dank, ihr Guten. Ich habe gar nicht damit gerechnet, daß ihr deshalb versucht die Tutorials wiederherzustellen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Danke für den Hinweis mit den Links! Ist ja keine Absicht, dass die noch nicht alle wieder funktionieren.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Habe den ersten Posts um einige meiner neusten Ergüsse erweitert.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Erster Post ist mit Links geupdatet.
EDIT: der Post sollte natürlich hierhin...
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Ich habe einen Link zu meinen Jasteys SoD NPC Tutorials (Englisch) eingefügt. Damit sollte das Erstellen eines NPCs für SoD (Grundgerüst mit Reaktionen in Cutscenes etc.) keinen großen Aufwand machen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Ersten Post um den Eintrag
Mehr raffiniertes Dialoge schreiben: COPY_TRANS für eigene Dialogstates nutzen, um die Antwortoptionen nicht doppelt hinschreiben zu müssen, nach einem Beispiel von CamDawg
ergänzt.
Falls jemand eine Idee hat, wie man das gesammelte Wissen übersichtlicher präsentieren kann, gerne vortreten.
Hmm, als ich das jetzt anwenden wollte konnte er den "custom" Statenamen in derselben d-Datei nicht auflösen. EDIT: COPY_TRANS_LATE zu nutzen ist dann der Trick.
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Dialoge die mit ActionOverride(O:Object*,StartDialogOverride(S: DialogFile*,O:Target*)) gestartet werden dürfen keine Einmischdialoge anderer NPCs haben

Dialoge können mit ActionOverride(O:Object*,StartDialogOverride(S: DialogFile*,O:Target*)) gestartet werden, auch wenn "dlgname" nicht der dem Charakter ("O:Object*") zugewiesene dlg ist. Das ist praktisch, wenn man Spielcharaktere sprechen lassen möchte, ohne dass man sich um eventuelle gerade aktive/triggernde Dialogstates kümmern möchte - oder wenn der Charakter gar keinen Dialog zugewiesen hat. Ich verwende es z.B., um einen "Selbstdialog" des HC in SoD zu starten (in der Mod "Road to Discovery", wenn man das "Belssing Ritual" mit einem Priester oder Paladin beobachtet.)

Aber: der Dialog muss bei dem Charakter bleiben, und kann nicht durch Einmischdialoge anderer Charaktere/NPCs gestört werden. Die Rückführung funktioniert dann nicht mehr, da der Dialog ja nicht mit dem Spielcharakter verknüpft ist und die Engine daher nicht weiß, wer die Zeile dann sagen soll.
Beispiel:
Dies funktioniert nicht, der Dialog bricht nach Glints (oder, wenn Glint nicht anwesend ist Vikonias) Einwurf ab - die Rückführung zum HC funktioniert nicht, weil die dlg "C#RtDpct" ihm nicht zugewiesen wurde:
BEGIN C#RtDpct

CHAIN
IF ~Global("C#RtD_CrusaderBlessingQuest","GLOBAL",3)~ THEN C#RtDpct detect_blessing
@1014 /* [PC Selftalk](You witnessed a "blessing ritual" of one of Caelar's priests.) */
== BDGLINTJ IF ~IsValidForPartyDialogue("GLINT") Class("GLINT",CLERIC_ALL)~ THEN @1015 /* [Glint]Nah, how can he say it was granted by "the gods"... blasphemy is what that was, nothing more. */
== BDVICONJ IF ~IsValidForPartyDialogue("VICONIA") Class("VICONIA",CLERIC_ALL)~ THEN @1016 /* [Viconia]This blessing from "the gods" might have been good for the morale of Caelar's followers, but that was all there is to it. */
== C#RtDpct IF ~OR(2)
Class(Player1,CLERIC_ALL)
Class(Player1,PALADIN_ALL)~ THEN @1017 /* [PC Selftalk](You didn't need anyone else's observation to determine that this "blessing" is nothing special at all, and definitely not a protection by "the gods" as proclaimed by the priest performing the ritual.) */
END
IF ~~ THEN DO ~SetGlobal("C#RtD_CrusaderBlessingQuest","GLOBAL",4)
SetGlobal("C#RtD_CaelarProtection_SET","GLOBAL",4)
SetGlobal("C#RtD_VariableEvaluation","GLOBAL",1)EraseJournalEntry(@32) EraseJournalEntry(@33) AddJournalEntry(@35,QUEST_DONE)~ EXIT
IF ~IsValidForPartyDialogue(Player2)
OR(2)
Class(Player2,CLERIC_ALL)
Class(Player2,PALADIN_ALL)
!Name("GLINT",Player2)
!Name("VICONIA",Player2)
!Class(Player1,CLERIC_ALL)
!Class(Player1,PALADIN_ALL)~ THEN + player2

APPEND C#RtDpct

IF ~~ THEN player2
SAY @1018 /* [PC Selftalk](You noticed <PLAYER2>'s reaction to the performance and do not need any more information to know that this "blessing" is nothing special at all, and definitely not a protection by "the gods" as proclaimed by the priest carrying out the ritual.) */
IF ~~ THEN DO ~SetGlobal("C#RtD_CrusaderBlessingQuest","GLOBAL",4)
SetGlobal("C#RtD_CaelarProtection_SET","GLOBAL",4)
SetGlobal("C#RtD_VariableEvaluation","GLOBAL",1)EraseJournalEntry(@32) EraseJournalEntry(@33) AddJournalEntry(@35,QUEST_DONE)~ EXIT
END
END

Dies funktioniert, da alle Zeilen der "C#RtDpct" hintereinander kommen:
BEGIN C#RtDpct

CHAIN
IF ~Global("C#RtD_CrusaderBlessingQuest","GLOBAL",3)~ THEN C#RtDpct detect_blessing
@1014 /* [PC Selftalk](You witnessed a "blessing ritual" of one of Caelar's priests.) */
== C#RtDpct IF ~OR(2)
Class(Player1,CLERIC_ALL)
Class(Player1,PALADIN_ALL)
OR(2) !IsValidForPartyDialogue("GLINT") !Class("GLINT",CLERIC_ALL)
OR(2) !IsValidForPartyDialogue("VICONIA") !Class("VICONIA",CLERIC_ALL)~ THEN @1017 /* [PC Selftalk](You didn't need anyone else's observation to determine that this "blessing" is nothing special at all, and definitely not a protection by "the gods" as proclaimed by the priest performing the ritual.) */
END
IF ~~ THEN DO ~SetGlobal("C#RtD_CrusaderBlessingQuest","GLOBAL",4)
SetGlobal("C#RtD_CaelarProtection_SET","GLOBAL",4)
SetGlobal("C#RtD_VariableEvaluation","GLOBAL",1)EraseJournalEntry(@32) EraseJournalEntry(@33) AddJournalEntry(@35,QUEST_DONE)~ EXIT
IF ~IsValidForPartyDialogue(Player2)
OR(2)
Class(Player2,CLERIC_ALL)
Class(Player2,PALADIN_ALL)
!Name("GLINT",Player2)
!Name("VICONIA",Player2)
!Class(Player1,CLERIC_ALL)
!Class(Player1,PALADIN_ALL)~ THEN + player2
IF ~IsValidForPartyDialogue("GLINT") Class("GLINT",CLERIC_ALL)~ THEN EXTERN BDGLINTJ glint_noticed
IF ~IsValidForPartyDialogue("VICONIA") Class("VICONIA",CLERIC_ALL)~ THEN EXTERN BDVICONJ viconia_noticed

APPEND BDGLINTJ
IF ~~ THEN glint_noticed
SAY @1015 /* [Glint]Nah, how can he say it was granted by "the gods"... blasphemy is what that was, nothing more. */
IF ~~ THEN DO ~SetGlobal("C#RtD_CrusaderBlessingQuest","GLOBAL",4)
SetGlobal("C#RtD_CaelarProtection_SET","GLOBAL",4)
SetGlobal("C#RtD_VariableEvaluation","GLOBAL",1)EraseJournalEntry(@32) EraseJournalEntry(@33) AddJournalEntry(@35,QUEST_DONE)~ EXIT
END
END

APPEND BDVICONJ
IF ~~ THEN viconia_noticed
SAY @1016 /* [Viconia]This blessing from "the gods" might have been good for the morale of Caelar's followers, but that was all there is to it. */
IF ~~ THEN DO ~SetGlobal("C#RtD_CrusaderBlessingQuest","GLOBAL",4)
SetGlobal("C#RtD_CaelarProtection_SET","GLOBAL",4)
SetGlobal("C#RtD_VariableEvaluation","GLOBAL",1)EraseJournalEntry(@32) EraseJournalEntry(@33) AddJournalEntry(@35,QUEST_DONE)~ EXIT
END
END

APPEND C#RtDpct
IF ~~ THEN player2
SAY @1018 /* [PC Selftalk](You noticed <PLAYER2>'s reaction to the performance and do not need any more information to know that this "blessing" is nothing special at all, and definitely not a protection by "the gods" as proclaimed by the priest carrying out the ritual.) */
IF ~~ THEN DO ~SetGlobal("C#RtD_CrusaderBlessingQuest","GLOBAL",4)
SetGlobal("C#RtD_CaelarProtection_SET","GLOBAL",4)
SetGlobal("C#RtD_VariableEvaluation","GLOBAL",1)EraseJournalEntry(@32) EraseJournalEntry(@33) AddJournalEntry(@35,QUEST_DONE)~ EXIT
END
END

Die Gefahr, dass andere Mods Crossmod-Einmischdialog schreiben und dadurch der Dialog wieder abbricht bleibt natürlich bestehen. Ich gehe hier für Road to Discovery die Gefahr ein, da 1. Mod-NPC sozusagen ja mit abgedeckt sind und die Mod durch die späte Installation eher keinen NPC-Crossmod sehen wird. Ich werde das aber im Hinterkopf behalten (müssen), damit ich mich erinnere, falls die Situation doch eintritt.

Ich hatte auch erst Imoens Bemerkungen in Korlasz'Dungeon in BG1 (Über EndlessBG1) so geskriptet, bis ich gemerkt habe, dass hier dasselbe Problem besteht. EndlessBG1 weist daher Imoen in Korlasz' Dungeon ihren SoD-Dialog zu, wie ich es auch allgemein aus anderen Gründen für die originalen NPCs empfohlen habe (s. hier.)

So wurde der Dialog oben per Skript gestartet:
IF
Global("C#RtD_CrusaderBlessingQuest","GLOBAL",3)
THEN
RESPONSE #100
ActionOverride(Player1,StartDialogOverride("C#RtDpct",Player1))
END
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
Wenn man originale Tagebucheinträge löschen möchte aber in BGT nicht weiß, welche String.Ref.-Nummer sie haben, habe ich hier erklärt, wie Argents Funktion dafür verwendet werden kann.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.921
(Nur) In der EE kann man FLAGS 9 setzen, dann werden Transaktionen sofort ausgeführt und nicht erst am Ende des Dialogs / nach sounsovielen Klicks in einem Dialog. Das ist z.B. praktisch, wenn man direkt im nächsten Dialogstate eine Checkvariable abfragen können möchte ohne dass man "Verlegenheits-States" dazwischenkleben muss bis sie gesetzt ist.
Hierzu einfach FLAGS 9 hinter die DO Aktion schreiben. EDIT: CamDawg sagt eventuell muss man FLAGS BIT9 oder FLAGS 512 verwenden.
Ich habe es aktuell nicht ausprobiert und schreibe es hier hin damit ich es wieder nachsehen kann. Falls es noch genauere Spezifikationen für die Nutzung gibt trage ich sie entsprechend nach, wenn ich sie weiß.

von igi:
It's bit 9 in the transition block, per the IESDP: "bit 9: 1=Immediate execution of script actions, 0=Delayed execution of script actions (BGEE)" In WeiDU you'd use it as part of the flags section
 
Zuletzt bearbeitet:
Oben