[Modding] Scripting Fragen

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Ok, schaue ich mir dann heute abend mal im Detail an. Ich würde einfach auch mal die dlg-Datei in der cre im SaveGame dann anschauen, welche das ist. Und ich würde prüfen, ob ich im Spiel über SetDialog() was machen kann, aber ich vermute, dass diese Befehle nicht über die Konsole gehen... Und dann noch nach dem Flag schauen ;) In der Erinnerung war es da, aber ich habe nicht gezielt danach geschaut (und dann ist die Erinnerung immer keine gute Quelle :D ).
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Also Export Allowed war nicht gesetzt. Die Flag im SaveGame zu setzen hat aber nichts gebracht. Auch nicht, dass ich die dlg geändert habe. Weil wenn ich das geänderte Spiel lade, kommt wieder der Dialog aus der MultiJ und wenn ich dann speichere, ist wieder die alte Multi.dlg bei der cre eingetragen. Das Editieren des SaveGames bringt da also nichts. Ich probiere mal, ein älteres Save zu editieren, bei dem der Dialog noch nicht getriggert wurde.

edit: das hat auch nichts geändert. Ich vermute mal, ich müsste ein neues Spiel starten und Aura vorher ingame modifzieren. Allerdings keine Ahnung mit was. Und ich habe Zweifel, dass es funktionieren wird... Weil das Flag für Export Allowed hat kein Begleiter gesetzt (auch nicht Brandock) und alle haben die korrekte J-dlg eingetragen im SaveGame.

edit2: So, dann habe ich mal die Modder-Superpower ausgepackt und folgenden Block in die C0AURA.BCS eingefügt:
Code:
IF
    Global("C0SetDialogFix","LOCALS",0)
THEN
    RESPONSE #100
        SetGlobal("C0SetDialogFix","LOCALS",1)
        SetDialog("C0AURAJ")
END

Das hat dann im SaveGame funktioniert. Dürfte damit ja nur einmal ausgeführt werden und für die Zukunft keine Probleme machen, wenn doch mal daran geändert werden sollte. Wobei ich schon Auras Skripte gecheckt hatte, ob da irgendwo ein SetDialog() drin ist (ist es nicht).

Ha!
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Dann erinnere ich mihc falsch. Leider erinnere ich mich nicht mehr, was das problem war. aber eine nicht richtig geetzte pdialog.2da könnte da schon was beitragen. Die sieht aber normal aus?
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Ja, die pdialog.2da sieht ganz normal aus. Aber ich hatte beim ersten EET_end Versuch sie nicht korrigiert gehabt. Da hat die Installation abgebrochen. Ich hab mich dann wieder dran erinnert, sie korrigiert und dann ist die Installation durchgelaufen. Aber das hatte ich schon mal, dass die Installation dann einen Schaden hat (und zwar, dass die Beschreibungen der Kits nicht im Charakterbogen stehen, sondern nur die Beschreibung der Grundklasse; nicht schlimm, aber nervig). Könnte halt sein, dass das mit Aura damit zu tun hat. Weil halt die pdialog.2da betroffen war.

edit: und so beim Nachdenken: Brandock ist vor den fehlerhaften Einträgen eingetragen, Aura danach. Das könnte passen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Ha, dann ändere ich den Trigger in OnCreation(), das müsste dann passen mit dem Neuladen. Aber ich probiere es gleich mal aus.

Ok, also beim Neuladen stand dann tatsächlich wieder die Multi.dlg im gam-file. Aber mit OnCreation() anstatt der Variablen-Abfrage hat es funktioniert.

Code:
IF
    OnCreation()
    InParty(Myself)
THEN
    RESPONSE #100
        SetDialog("C0AURAJ")
END

Die pdialog.2da sieht so aus, wie sie sein sollte. Ich vermute, dass da irgendwo anders nochmal eine Kopie oder was auch immer davon erstellt wurde, was jetzt die Probleme macht...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Ich hab es in der neuen Installation noch nachgespielt und nachgeschaut. Da hat Aura den korrekten Dialog im SaveGame. Also Kategorie Installationsproblem bei der EET_end, wenn sie bei den pdialog.2da einen Hänger hat.
 
Zuletzt bearbeitet:

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Ich habe ein Problem mit folgendem Original-Skript:

Code:
IF
    OR(2)
        Opened([ANYONE])
        OpenState("Secret",TRUE)
THEN
    RESPONSE #100
        AmbientActivate("Glowing_crack",FALSE)
END

Das läuft die ganze Zeit über und blockiert Ressourcen. Und wenn man es sich anschaut, dann ist auch klar warum. Wie unterbinde ich das? Weil es muss ja nur das Ambient ausgeschaltet werden... Ich würde ja einfach eine Variablen-Abfrage einbauen für die IF-Bedingung und dann im THEN-Block hochzählen. Aber wie schreibe ich das rein? Ich könnte natürlich das Skript überschreiben, weil da wahrscheinlich keine andere Mod drauf zugreift. Aber die feine Art ist es nicht.

Und es ist echt interessant, das Stutterdebug-Tool permanent laufen zu lassen. Da findet man solche Sachen. Und einige andere und versteht dann, warum das Spiel manchmal lagt. Vor allem in SoD laufen jede Menge Skript...
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Da das ein Türskript und der einzige Skriptblock darin ist, blockiert der Loop zumindest nichts anderes. Um Deine Frage zu beantworten: mit REPLACE_TEXTUALLY, und zwar möglichst kompatibel und robust. Ich verwende eine Codevorlage von Argent, die sähe für diesen Fall ungefähr so aus:
Code:
COPY_EXISTING ~bddoorgc.BCS~ ~override~
    DECOMPILE_AND_PATCH BEGIN
        SPRINT textToReplace ~\(OpenState("Secret",TRUE)\)~
        COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
        PATCH_IF (num_matches > 0) BEGIN
            REPLACE_TEXTUALLY ~%textToReplace%~ ~\1
    SetGlobal("####","MYAREA",0)~
            PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
        END ELSE BEGIN
            PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
        END
        SPRINT textToReplace ~\(AmbientActivate("Glowing_crack",FALSE)\)~
        COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
        PATCH_IF (num_matches > 0) BEGIN
            REPLACE_TEXTUALLY ~%textToReplace%~ ~\1
        SetGlobal("####","MYAREA",1)~
            PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
        END ELSE BEGIN
            PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
        END
    END
BUT_ONLY
 
Zuletzt bearbeitet:

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Alternativ REPLACE_BCS_BLOCK oder APPLY_BCS_PATCH verwenden. (Letzteres kann man mit --bcmp-from / --bcmp-to erzeugen.)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Ja, die sind aber meiner Erfahrung nach störanfälliger insofern, als dass der Patch dann eventuell nicht stattfindet. REPLACE_TEXTUALLY kann - ohne eingepackt zu werden wie oben - dagegen zu einem Installationsfehler führen.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
die "\1" ist drin, damit nicht überschrieben wird (wie der Syntax eigentlich nahelegt), sondern der String erhalten bleibt und dann der zusätzliche Text eingefügt wird? Und beim Trigger funktioniert es, weil die "OR(2)" dafür sorgt, dass die dritte Bedingung (neu eingefügt) dann nicht in das OR mit einbezogen wird?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
@Maus genau. Die \1 wiederholt, was oben in den Klammrn ist, also ~\(inhalt\)~
Wenn Du mehrere Zeilen ersetzen willst braucht es noch etwas mehr Syntax, und wenn Punkte oder eckige Klammern im zitierten zu ersetzenden text ist muss jeweils ein \ davor. War beides in Deinem beispiel jetzt nicht.
Ach, ich hatte das sogar schonmal zusammengefasst: https://baldurs-gate.de/index.php?t...ren-triggers-in-ein-bestehendes-script.44959/
Wobei da ein Beispiel mit Punkten und Klammern im Text fehlt.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.170
Wenn ich daran angeknüpft noch eine Frage stellen dürfte, die mich ebenfalls seit Langem interessiert:
Kann ich aus einem bestehenden Script einzelne Scriptblöcke herauslöschen?
Es geht um das NEWGAME.BCS. Nach über 20 Jahren kann ich den Satz "Ahh, das Kind von Bhaal ist erwacht." nicht mehr hören. Ich habe jetzt ganz schmutzig per Hand alle Befehle herausgelöscht, bis Imoen erscheint. Das funktioniert super, nur ist es eben sehr destruktiv.
Da ich auf dem iPad spiele, entfällt leider die Möglichkeit, per Esc die Cutscene zu überspringen.
Das ist das gesamte Script:
Code:
IF
    True()
THEN
    RESPONSE #100
        CutSceneId("CSJon")  // Magier
        CreateCreature("M05PCSPY",[3374.3068],0)  // No such index
        MoveViewPoint([3566.2928],INSTANT)
        Wait(3)
        MultiPlayerSync()
        MoveToPoint([3651.2893])
        MoveToPoint([3666.2878])
        MultiPlayerSync()
        SmallWait(1)
        Wait(1)
        SmallWait(7)
        ActionOverride(Player1,FaceObject("CSJon"))  // Magier
        DisplayStringHead(Myself,5388)  // Ahh, das Kind von Bhaal ist erwacht.
        Wait(3)
        SmallWait(7)
        DisplayStringHead(Myself,5416)  // Es ist Zeit für weitere Experimente.
        Wait(3)
        SmallWait(3)
        CreateVisualEffectObject("ICRMPARI",Myself)
        ForceSpell(Player1,CUTSCENE_DAMAGE_1)  // SPIN726.SPL (No such index)
        PlaySound("EFF_M20")
        Wait(2)
        DisplayStringHead(Myself,2815)  // Der Schmerz ist nur vorübergehend. Ihr solltet die Prozedur eigentlich überleben.
        Wait(3)
        SmallWait(7)
        CreateVisualEffectObject("ICRMPARI",Myself)
        CreateVisualEffect("SPENTANG",[3732.2805])
        ActionOverride(Player1,SmallWait(9))
        ActionOverride(Player1,CreateVisualEffect("SPENTANG",[3757.2806]))
        ForceSpell(Player1,CUTSCENE_DAMAGE_1B)  // SPIN721.SPL (No such index)
        PlaySound("EFF_P19")
        CreateVisualEffect("SPENTANG",[3728.2795])
        ActionOverride(Player1,PlayDead(60))
        Wait(1)
        FadeToColor([30.0],0)
        Wait(2)
        FadeFromColor([30.0],0)
        Wait(1)
        DisplayStringHead(Myself,2816)  // Interessant. In Euch ruht viel unberührte Macht.
        Wait(3)
        CreateVisualEffectObject("ICRMPARI",Myself)
        ForceSpell(Player1,CUTSCENE_DAMAGE_1C)  // SPIN720.SPL (No such index)
        PlaySound("EFF_M21")
        ActionOverride(Player1,PlayDead(620))
        Wait(1)
        FadeToColor([30.0],0)
        Wait(2)
        FadeFromColor([30.0],0)
        Wait(1)
        DisplayStringHead(Myself,2819)  // Erkennt Ihr überhaupt Eure Fähigkeiten?
        CreateCreature("CSGOLEM",[3240.3304],10)  // Golem
        ActionOverride("csgolem",MoveToPoint([3732.2958]))
        ActionOverride("csgolem",MultiPlayerSync())
        ActionOverride("csgolem",Face(6))
        ActionOverride("csgolem",SmallWait(1))
        ActionOverride("csgolem",DisplayStringHead(Myself,2820))  // Weitere Eindringlinge im Komplex, Meister!
        Wait(6)
        Face(11)
        Face(12)
        Face(13)
        Face(14)
        Wait(2)
        DisplayStringWait(Myself,2833)  // Sie handeln früher, als wir erwarteten.
        SmallWait(10)
        DisplayStringWait(Myself,2834)  // Egal, sie bewirken nur eine kleine Verzögerung.
        Wait(1)
        ActionOverride("csgolem",MoveToPoint([3349.3220]))
        ActionOverride("csgolem",DestroySelf())
        Wait(3)
        ForceSpellPoint([3036.3443],WIZARD_DIMENSION_DOOR)  // SPWI402.SPL (Dimensionstor)
        Wait(2)
        FadeToColor([30.0],0)
        Wait(3)
        FadeFromColor([30.0],0)
        CreateCreature("ISHADDUD",[3269.3264],2)  // Meuchelmörder
        CreateVisualEffect("ICSPAIN",[3510.3100])
        PlaySound("EFF_M38")
        SmallWait(7)
        ActionOverride("ishaddud",MoveToPoint([3758.2946]))
        ActionOverride("ishaddud",SmallWait(8))
        ActionOverride("ishaddud",Face(2))
        ActionOverride("ishaddud",SmallWait(8))
        ActionOverride("ishaddud",DisplayStringHead(Myself,54407))  // Aaaaaahh!
        ActionOverride("ishaddud",PlaySound("TUTHH04"))
        ForceSpellPoint([3510.3100],FLASHY_4)  // SPIN794.SPL (No such index)
        PlaySound("EFF_M36B")
        SmallWait(7)
        CreateVisualEffect("SPFEARE2",[3413.3178])
        SmallWait(7)
        PlaySound("EFF_M18E")
        ForceSpell("ishaddud",WIZARD_DISINTEGRATE2_IGNORE_RESISTANCE)  // Meuchelmörder
        MultiPlayerSync()
        CreateVisualEffectObject("ICFIRSDI","ishaddud")  // Meuchelmörder
        PlaySound("EFF_M20")
        Wait(2)
        CreateVisualEffectObject("SPFIREPI","ishaddud")  // Meuchelmörder
        PlaySound("EFF_M13")
        ScreenShake([30.30],20)
        Wait(1)
        PlaySound("EFF_P18")
        Wait(3)
        ActionOverride("Imoen",OpenDoor("DOOR11"))
        ActionOverride("Imoen",MoveToPoint([3405.2924]))
        ActionOverride("Imoen",Face(0))
        ActionOverride("Imoen",SmallWait(5))
        ActionOverride("Imoen",MultiPlayerSync())
        ActionOverride("Imoen",MoveToObject(Player1))
        ActionOverride("Imoen",Unlock("Cell03"))
        ActionOverride("Imoen",OpenDoor("Cell03"))
        ActionOverride("Imoen",MultiPlayerSync())
        ActionOverride("Imoen",UnhideGUI())
        ActionOverride("Imoen",Dialog(Player1))
        DestroySelf()
END

Ich möchte den Code derart herauslöschen, dass nur das übrigbleibt:
Code:
F
    True()
THEN
    RESPONSE #100
        CutSceneId("CSJon")  // Magier
        CreateCreature("M05PCSPY",[3374.3068],0)  // No such index
        MoveViewPoint([3566.2928],INSTANT)
        MultiPlayerSync()
        SmallWait(1)
        Wait(1)
        SmallWait(7)
        ActionOverride(Player1,FaceObject("CSJon"))  // Magier
        ActionOverride("Imoen",OpenDoor("DOOR11"))
        ActionOverride("Imoen",MoveToPoint([3405.2924]))
        ActionOverride("Imoen",Face(0))
        ActionOverride("Imoen",SmallWait(5))
        ActionOverride("Imoen",MultiPlayerSync())
        ActionOverride("Imoen",MoveToObject(Player1))
        ActionOverride("Imoen",Unlock("Cell03"))
        ActionOverride("Imoen",OpenDoor("Cell03"))
        ActionOverride("Imoen",MultiPlayerSync())
        ActionOverride("Imoen",UnhideGUI())
        ActionOverride("Imoen",Dialog(Player1))
        DestroySelf()
END
Dann erscheint gleich Imoen und öffnet meine Zellentür. Das müsste doch mit WeiDU zu machen sein, oder?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
@Acifer ja, sowas habe ich bei Imoen4Ever mit den Cutscenes recht hemmungslos gemacht. Ich gehe so vor: suche Dir einen Term mit dem drin, das Du weg haben möchtest, der eindeutig ist (manchmal haben Skripte / Cutscenes ja mehrere Stellen, die "passen" könnten), wende das Template von oben für jede Stelle einzeln an bis alles passt. Ich habe mir das grad mal angesehen - eventuell würde man bei der Menge an Zeilen auch einfach die Cutswcene ersetzen. Ist zwar nicht die feine englische Art - aber bei so vielen Zeilenist entweder der Aufwand immens, die alle aufzulisten, oder das Patchen schlägt dann wegen einer Stelle fehl. :hae:

Hast Du Dir mal die durch Tweaks Anthology(?) verkürzten Szenen angesehen?
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.170
ja, sowas habe ich bei Imoen4Ever mit den Cutscenes recht hemmungslos gemacht. Ich gehe so vor: suche Dir einen Term mit dem drin, das Du weg haben möchtest, der eindeutig ist (manchmal haben Skripte / Cutscenes ja mehrere Stellen, die "passen" könnten), wende das Template von oben für jede Stelle einzeln an bis alles passt.
Wow, Wahnsinn. Das klingt nach einer Menge Arbeit. :wunder:
Danke, dass Du für I4E diese Arbeit gemacht hast! :up:
Hast Du Dir mal die durch Tweaks Anthology(?) verkürzten Szenen angesehen?
Ja, das ist der Part hier, oder?
https://github.com/Gibberlings3/Tweaks-Anthology/blob/master/cdtweaks/lib/faster_start.tpa

Leider steige ich da nicht ganz durch, und ich habe den Eindruck, dass da nicht die gesamte Cutscene herausgelöscht wird.

Ich habe mir das grad mal angesehen - eventuell würde man bei der Menge an Zeilen auch einfach die Cutswcene ersetzen. Ist zwar nicht die feine englische Art - aber bei so vielen Zeilenist entweder der Aufwand immens, die alle aufzulisten, oder das Patchen schlägt dann wegen einer Stelle fehl.
Danke für Deine Einschätzung. Dann mache ich das so. Da es ja ohnehin nur für den Hausgebrauch ist, könnte ich mir die immense Programmierarbeit sparen. ;)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Wow, Wahnsinn. Das klingt nach einer Menge Arbeit.
Danke! :cool: War da eigentlich gar nicht so viel. Ich habe grad nochmal reingeschaut - für I4E habe ich scheints das ganze Template gar nicht verwendet (also das, wo einem die Änderungen auch nochmal im Installationsfenster angezeigt werden).
Da es ja ohnehin nur für den Hausgebrauch ist, könnte ich mir die immense Programmierarbeit sparen.
Ja, ich denke da bist Du Dein kritischster Kritiker. :)
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.380
Habe da gerade einen Stutterbug in der DPLAYER2.BCS:
Code:
IF
    GlobalLT("ENDOFBG1","GLOBAL",2)
    !InParty(Myself)
    OR(5)
        Name("neera",Myself)  // Neera
        Name("dorn",Myself)  // Dorn
        Name("rasaad",Myself)  // Rasaad
        Name("baeloth",Myself)  // Baeloth
        HappinessGT(Myself,-299)
THEN
    RESPONSE #100
        Dialogue(Player1)
        DisplayStringHead(Myself,534382)  // Running block 12 of DPLAYER2.BCS
        ChangeAIScript("",DEFAULT)
END
Mein Problem ist Neera. Sie spricht mich an. Und dann schicke ich sie weg, nur damit sie mich gleich wieder anspricht. Ihr P-Dialog macht da gar nichts, er schickt sie höchstens auf ihre Position im FAI. Wie stelle ich den Stutter ab?? Ich natürlich Neera aus der BCS rausnehmen, aber ich hätte halt gerne eine elegantere Lösung... falls es die gibt ^^

edit: Neera oben rauskommentieren funktioniert aus irgendeinem Grund nicht... sie macht einfach weiter... Vielleicht liegt die Datei noch in einem Cache...

Noch ein edit: ich muss noch das HappinessGT rauskommentieren... Wenn das jetzt bei jedem Char passiert, den ich rauswerfe, dann wird das noch lustig...
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.922
Kann es sein, dass das DisplayStringHead von dem Stutter Tool dazu führt, dass der Skriptblock nicht zuEnde ausgeführt wird oder sowas? So eon Stutter wär doch schon längst aufgefallen sonst.
 
Oben