[Modding] Einfügen eines weiteren Triggers in ein bestehendes Script

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.166
Ich habe mich bisher wenig mit dem Eingriff in NPC-Scripts und -Dialoge beschäftigt.
Nun habe ich das Problem, dass in mehreren meiner selbst erstellten Areas die Jaheira-Romanze weiterläuft, weil dort die Area-Types "OUTDOOR" bzw !AreaType(DUNGEON) gecheckt werden.
Dies betrifft zum Einen die Träume über Khalid als auch das Erscheinen bestimmter mit der Romanze verbundener Kreaturen.

Ich würde gerne in einzelne Scriptblöcke einen !AreaCheck("MYAREA") einfügen, z.B. in den Trigger, der Jaheiras Traum über Khalid triggert:
Code:
IF
    PartyRested()
    !Global("JaheiraRomanceActive","GLOBAL",0)
    !Global("JaheiraRomanceActive","GLOBAL",3)
    Global("JaheiraMatch","GLOBAL",1)
    !AreaType(DUNGEON)
        !AreaCheck("MYAREA")
    See(Player1)
    CombatCounter(0)
    OR(4)
        Global("LoveTalk","LOCALS",7)
        Global("LoveTalk","LOCALS",11)
        Global("LoveTalk","LOCALS",55)
        Global("LoveTalk","LOCALS",69)
THEN
    RESPONSE #100
        IncrementGlobal("LoveTalk","LOCALS",1)
        RealSetGlobalTimer("JaheiraRomance","GLOBAL",1)
        PlaySong(36)
        Interact(Player1)
END

Nur: Wie mache ich das?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Ich würde hier "REPLACE_TEXTUALLY" vorschlagen. Das Problem dabei: man muss einen wirklich eindeutigen Textschnipsel heraussuchen, da alle erkannten Instanzen im Skript damit gepatcht werden.
Problem Nummer zwei: REPLACE_TEXTUALLY ist unglaublich zickig. Wenn es den Textschnipsel nicht genau so erkennt wie angegeben, dann patcht es nicht. Das kann man aber entsprechend vorbereiten.

Beispiel einer Anwendung, bitte entsprechend anpassen. (Das Ausgeben der gepatchten Zeile und der Fehlermeldung, wenn nichts gefunden wurde ist natürlich optional und habe ich von k4thos.)

Ich habe die Stelle
Code:
    OR(4)
        Global("LoveTalk","LOCALS",7)
        Global("LoveTalk","LOCALS",11)
rausgesucht, um diesen Skriptblock explizit zu treffen. Um sicherzugehen, dass REPLACE_TEXTUALLY nicht aussteigt, weil es die Zeilenumbrüche und daher den Text nicht erkennt, werden der Zeilenumbruch entsprechend mit [%newline%]* für alle Betriebssysteme etc. fit gemacht.

Bei dem Text, der stattdessen hingeschrieben werden soll, steht die \1 für das, was man vorher hat erkennen lassen (eingebettet in "\( \)"), hier könnte man theoretisch auch ein \2 etc. definieren.)
Wenn im Text eine eckige Klammer oder ein Punkt steht, dann muss vor diese Zeichen eine zusätzliche Backslash \ geschrieben werden, z.B.
Code:
ActionOverride("imoen2?",JumpToPoint(\[1770\.1520\]))
(Das "?" steht da, damit "imoen" und "imoen2" ekannt wird.)

Dies kommt alles in die tp2, extra_regexp_vars.tph ist angehängt:
Code:
INCLUDE ~%MOD_FOLDER%/lib/extra_regexp_vars.tph~
OUTER_SPRINT newline ~%WNL%%LNL%%MNL%%TAB% ~



COPY_EXISTING ~JAHEIRA.BCS~ ~override~
    DECOMPILE_AND_PATCH BEGIN
        SPRINT textToReplace ~\(OR(4)[%newline%]*Global("LoveTalk","LOCALS",7)[%newline%]*Global("LoveTalk","LOCALS",11)\)~
        COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
        PATCH_IF (num_matches > 0) BEGIN
            REPLACE_TEXTUALLY ~%textToReplace%~ ~!AreaCheck("XXXXXX") \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
Nach dem Patchen müsste der Skriptblock dann so aussehen:

IF
PartyRested()
!Global("JaheiraRomanceActive","GLOBAL",0)
!Global("JaheiraRomanceActive","GLOBAL",3)
Global("JaheiraMatch","GLOBAL",1)
!AreaType(DUNGEON)
!AreaCheck("MYAREA")
See(Player1)
CombatCounter(0)
!AreaCheck("XXXXXX")
OR(4)
Global("LoveTalk","LOCALS",7)
Global("LoveTalk","LOCALS",11)
Global("LoveTalk","LOCALS",55)
Global("LoveTalk","LOCALS",69)
THEN
RESPONSE #100
IncrementGlobal("LoveTalk","LOCALS",1)
RealSetGlobalTimer("JaheiraRomance","GLOBAL",1)
PlaySong(36)
Interact(Player1)
END
 

Anhänge

  • extra_regexp_vars.zip
    320 Bytes · Aufrufe: 2

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Ohne das Drumrum sieht es so aus, ist vielleicht zum Verstehen etwas übersichtlicher:
Code:
COPY_EXISTING ~JAHEIRA.BCS~ ~override~
    DECOMPILE_AND_PATCH BEGIN
            REPLACE_TEXTUALLY ~\(OR(4)[%newline%]*Global("LoveTalk","LOCALS",7)[%newline%]*Global("LoveTalk","LOCALS",11)\)~ ~!AreaCheck("XXXXXX") \1~
    END
BUT_ONLY
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.166
:wuerg::wunder:;) Wow, toll! Vielen lieben Dank für Deine schnelle Hilfe und die verständlichen und ausführlichen Erklärungen! Es ist jedes Mal aufs Neue beeindruckend, wie professionell Du Dich auf diesem riesigen WeiDU-Terrain bewegst. :up::up:
Habe schon alles in die Installationsdatei gepackt, installiert, die Jaheira BCS ist jetzt perfekt geupdatet, habe noch probeweise in besagter Area im Freien geschlafen und Jaheira hält den Mund. ;)
1000x Danke! :)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Gerne! :) Das muss (s)ich ja auch mal auszahlen, was ich an Zeit und Nachfragen da reingesteckt habe, um das selbst zum Laufen zu bringen. :up:
 
Zuletzt bearbeitet:
Oben