[Modding] Replace bcs text

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
324
Hi,
ich suche einen Befehl, der einen bestimmten Textblock aus einer .bcs durch einem anderen Text ersetzt bzw. eine Kopie mit der Änderung erstellt.
Alternativ kann der alte Text auch gelöscht werden und der neue Text wird durch "EXTEND_" eingefügt.

Für Dialoge habe ich etwas entsprechendes gefunden:

Code:
8.10  REPLACE_ACTION_TEXT

This tutorial was thoughtfully provided by Japheth.

REPLACE_ACTION_TEXT can be used with regular expressions (regexp). So, some actions such as CreateCreature("blah",[0.0],1) won’t be matched by WeiDU because when you say [0.0] it is looking for a character set.

Here’s one dialogue that I’m fixing and how to do it correctly.

Arghai.dlg has this action trigger before REPLACE_ACTION_TEXTing it.

CreateCreature("OGREHA",[1351.1078])

There’s no point given, which makes WeiDU and NI angry. To fix it using REPLACE_ACTION_TEXT this is what you have to do:

REPLACE_ACTION_TEXT arghai
~CreateCreature("OGREHA",\[1351.1078\])~
~CreateCreature("OGREHA",[1351.1078],0)~

So, all you have to remember to do is escape the square brackets with a backslash so WeiDU doesn’t confuse them with a regular expression.

Da die Datei "arghai" hier ohne Endung steht, gehe ich davon aus, dass dieser Befehl nicht mit .bcs klappt.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
324
Mich stört, dass die feindlichen NPC sich in IWD sehr häufig zu Spieler 1 bewegen, wenn sie keine Gegner sehen, auch wenn die eigentlich keine Ahnung haben sollten wo dieser ist und dabei auch Unsichtbarkeit etc, ignorieren.

Code:
IF
  ActionListEmpty()
  !Global("MAP_GROUP_HOSTILE2","MYAREA",0)
  Allegiance(Myself,ENEMY)
  !See([PC])
THEN
  RESPONSE #100
    MoveToObject(Player1)
  RESPONSE #100
    NoAction()
END

Ähnliche Zeilen kommen allerdings in ca. 99 bcs. vor, die ich wegen Kompatibilität zu anderen Mod nicht einfach komplett überschreiben möchte.

Code:
Searched for: .*\QMoveToObject(Player1)\E.*
Number of hits: 99
File: 4001LK.BCS, Line: 56, Text: MoveToObject(Player1)
File: 4001LMTR.BCS, Line: 25, Text: MoveToObject(Player1)
File: BATEAM1M.BCS, Line: 35, Text: MoveToObject(Player1)
File: BATEAM2M.BCS, Line: 35, Text: MoveToObject(Player1)
File: BATEAM3M.BCS, Line: 35, Text: MoveToObject(Player1)
File: BATEAM4M.BCS, Line: 35, Text: MoveToObject(Player1)
File: BAVEX3.BCS, Line: 87, Text: MoveToObject(Player1)
File: BCESCORT.BCS, Line: 47, Text: MoveToObject(Player1)
File: BCHSTCMP.BCS, Line: 33, Text: MoveToObject(Player1)
File: BCTEAM1.BCS, Line: 39, Text: MoveToObject(Player1)
File: CASTNNUS.BCS, Line: 23, Text: MoveToObject(Player1)
File: CHALDIE.BCS, Line: 25, Text: MoveToObject(Player1)
File: D3PREAPP.BCS, Line: 35, Text: MoveToObject(Player1)
File: D4ELDG.BCS, Line: 115, Text: MoveToObject(Player1)
File: D4INFMOV.BCS, Line: 39, Text: MoveToObject(Player1)
File: D4YUMAGE.BCS, Line: 35, Text: MoveToObject(Player1)
File: D5YXNATK.BCS, Line: 15, Text: MoveToObject(Player1)
File: D5YXUN.BCS, Line: 53, Text: MoveToObject(Player1)
File: DUCELM01.BCS, Line: 16, Text: MoveToObject(Player1)
File: DUCELM02.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM03.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM04.BCS, Line: 16, Text: MoveToObject(Player1)
File: DUCELM05.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM06.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM07.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM08.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM09.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM10.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM11.BCS, Line: 7, Text: MoveToObject(Player1)
File: DUCELM12.BCS, Line: 16, Text: MoveToObject(Player1)
File: EEBELHI1.BCS, Line: 77, Text: MoveToObject(Player1)
File: EECYCL3.BCS, Line: 41, Text: MoveToObject(Player1)
File: EFFOLENM.BCS, Line: 6, Text: MoveToObject(Player1)
File: EFFOLPTY.BCS, Line: 6, Text: MoveToObject(Player1)
File: EFHLPFOL.BCS, Line: 17, Text: MoveToObject(Player1)
File: EFREET01.BCS, Line: 81, Text: MoveToObject(Player1)
File: EHDAMIEN.BCS, Line: 259, Text: MoveToObject(Player1)
File: EHHERO1.BCS, Line: 58, Text: MoveToObject(Player1)
File: GNT1MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT2MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT3MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT4MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT5MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT6MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT7MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT8MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNT9MOVE.BCS, Line: 8, Text: MoveToObject(Player1)
File: GNTEAM1M.BCS, Line: 28, Text: MoveToObject(Player1)
File: GNTEAM2M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM3M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM4M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM5M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM6M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM7M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM8M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTEAM9M.BCS, Line: 27, Text: MoveToObject(Player1)
File: GNTRPB1.BCS, Line: 53, Text: MoveToObject(Player1)
File: GNTRPB2.BCS, Line: 53, Text: MoveToObject(Player1)
File: GNTRPM1.BCS, Line: 67, Text: MoveToObject(Player1)
File: GNTRPM1V.BCS, Line: 53, Text: MoveToObject(Player1)
File: GNTRPM2.BCS, Line: 42, Text: MoveToObject(Player1)
File: ILENTGOL.BCS, Line: 47, Text: MoveToObject(Player1)
File: KEBEHFOL.BCS, Line: 7, Text: MoveToObject(Player1)
File: KUARUND1.BCS, Line: 239, Text: MoveToObject(Player1)
File: KUBEAR.BCS, Line: 19, Text: MoveToObject(Player1)
File: LDDROWCM.BCS, Line: 27, Text: MoveToObject(Player1)
File: LDDROWCM.BCS, Line: 600, Text: MoveToObject(Player1)
File: LDFGNT1.BCS, Line: 66, Text: MoveToObject(Player1)
File: LDFGNTG.BCS, Line: 74, Text: MoveToObject(Player1)
File: LDFLEEZ2.BCS, Line: 43, Text: MoveToObject(Player1)
File: LDFLOZ1.BCS, Line: 85, Text: MoveToObject(Player1)
File: LDFLOZ2.BCS, Line: 50, Text: MoveToObject(Player1)
File: LDILAIR2.BCS, Line: 498, Text: MoveToObject(Player1)
File: LDILAIR.BCS, Line: 534, Text: MoveToObject(Player1)
File: LDILMAD.BCS, Line: 92, Text: MoveToObject(Player1)
File: LDIRNGOL.BCS, Line: 101, Text: MoveToObject(Player1)
File: LDKRAMGE.BCS, Line: 518, Text: MoveToObject(Player1)
File: LDMALHLK.BCS, Line: 40, Text: MoveToObject(Player1)
File: LDMALSUM.BCS, Line: 19, Text: MoveToObject(Player1)
File: LDSETH2.BCS, Line: 84, Text: MoveToObject(Player1)
File: LDSHKSUM.BCS, Line: 43, Text: MoveToObject(Player1)
File: LDSPAWN1.BCS, Line: 19, Text: MoveToObject(Player1)
File: LDTHIEF3.BCS, Line: 46, Text: MoveToObject(Player1)
File: LDTHIEF.BCS, Line: 49, Text: MoveToObject(Player1)
File: LWEMMRH.BCS, Line: 40, Text: MoveToObject(Player1)
File: LWWAREW.BCS, Line: 139, Text: MoveToObject(Player1)
File: NEHRPMOV.BCS, Line: 6, Text: MoveToObject(Player1)
File: NEHRPMOV.BCS, Line: 14, Text: MoveToObject(Player1)
File: NEHRPMOV.BCS, Line: 22, Text: MoveToObject(Player1)
File: NEHRPMOV.BCS, Line: 30, Text: MoveToObject(Player1)
File: NEHRPMOV.BCS, Line: 38, Text: MoveToObject(Player1)
File: NISHRU01.BCS, Line: 17, Text: MoveToObject(Player1)
File: SHSHDWZ2.BCS, Line: 386, Text: MoveToObject(Player1)
File: SHSHDWZ3.BCS, Line: 386, Text: MoveToObject(Player1)
File: TROLIC03.BCS, Line: 30, Text: MoveToObject(Player1)
File: UDLICH1.BCS, Line: 738, Text: MoveToObject(Player1)
File: UDSPNEFF.BCS, Line: 24, Text: MoveToObject(Player1)
File: VSLYSAN.BCS, Line: 151, Text: MoveToObject(Player1)
File: VSYETI.BCS, Line: 21, Text: MoveToObject(Player1)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.925
Meiner Erfahrung nach ist das Ersetzen ganzer Skriptblöcke unglaublich fehleranfälig, d.h. es wird dann bei den Spielern nicht richtig erkannt und nicht ersetzt. Ich würde mit REPLACE_TEXTUALLY arbeiten, wo Du den Skriptblock mit Leerzeichenerkennung entsprechend genau angeben kannst, s. z.B. hier.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
324
Damit füge ich den Text vor der angegeben Stelle ein. Gibt es auch eine Möglichkeit diesen zu ersetzen?

Code:
IF
  ActionListEmpty()
  !Global("MAP_GROUP_HOSTILE1","MYAREA",0)
  Allegiance(Myself,ENEMY)
  !See([PC])
THEN
  RESPONSE #100
    MoveToObject(Lastheardby(Myself)) // Eingefügter Text
    MoveToObject(Player1) // Sollte nicht mehr da sein.
  RESPONSE #100
    NoAction()
END

Es sieht in der .tp2 jetzt so aus:

Code:
INCLUDE ~%MOD_FOLDER%/lib/extra_regexp_vars.tph~
OUTER_SPRINT newline ~%WNL%%LNL%%MNL%%TAB% ~

COPY_EXISTING ~BATEAM1M.BCS~ ~override~
    DECOMPILE_AND_PATCH BEGIN
        SPRINT textToReplace ~\(MoveToObject(Player1)\)~
        COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
        PATCH_IF (num_matches > 0) BEGIN
            REPLACE_TEXTUALLY ~%textToReplace%~ ~MoveToObject(LastHeardBy(Myself)) \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

Und können mehrere bcs. angegeben werden, auf die das alle angewendet werden soll? Sonst steht da 99x mal das Gleiche.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.925
@Genwa Du musst das "\1" rausmachen. Das ist der Befehl, dass der erste in "\(\)" gepacke Inhalt wieder hingeschrieben werden soll, was Du abwr gar nicht willst.

Versuche mal, ob ein
Code:
COPY_EXISTING ~BATEAM1M.BCS~ ~override~
~xxx.BCS~ ~override~
~yyy.BCS~ ~override~
~zzz.BCS~ ~override~
    DECOMPILE_AND_PATCH BEGIN
    etc.
funktionieren würde?
Ansonsten ist das regexp Syntax, damit kenne ich mich nicht aus, da gibt es aber eventuell auch hier aber ansonsten bei G3 genug Leute, die da mit effizienterer Syntax helfen können.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
324
Geht das auch mit .2DA?

Ich hatte da mal so was gefunden, konnte aber keinen Effekt feststellen, außer das eine Kopie ohne sichtbare Änderung angelegt wurde:

Code:
COPY_EXISTING ~clabrn05.2da~ ~override~
  SET_2DA_ENTRY 0 1 2 ~NQ#FRS01~
  BUT_ONLY_IF_IT_CHANGES
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Code:
SET_2DA_ENTRY 0 1 2 ~NQ#FRS01~
Damit solltest du den Header der Datei geändert haben. (In der zweiten Spalte sollte nun "NQ#FRS01" stehen.)

Wahrscheinlich ist dir nicht ganz klar, was die Zahlen bedeuten. (Reihe 0, Spalte 1, für alle Reihen die mindestens 2 Spalten haben)
In der WeiDU-Readme gibt es ein Tutorial zu dem Befehl.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
324
1 2 ... 40
ABILITY1 AP_SPCL351 **** **** ****
ABILITY2 AP_SPCL234 **** **** ****
ABILITY3 AP_SPCL235 **** **** ****
ABILITY4 AP_SPCL234D **** **** ****
ABILITY5 **** **** **** ****
ABILITY6 **** **** **** ****
ABILITY7 **** **** **** ****
... **** **** **** ****
ABILITYA **** **** ****
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
324
Danke, genau mit dem Tutorial hatte ich es probiert. Ich wollte das rot Markierte treffen. "Clabrn05.2da" hat 41 Spalten (wenn man 0 mitzählt). Bei der letzten Zahl habe ich eine Variant wie oben (insgesamt werden 2 Spalten genutzt) und eine mit 41 ausprobiert. Falsch?

table.png
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Wenn du dir die Datei mit einem Texteditor (oder NI) anschaust, wird dir auffallen, dass sie mit folgendem Header beginnt:
Code:
2DA V1.0
****
            1           2           3           4           5           6           7           8           9           10          11          12          13          14          15          16          17          18          19          20          21          22          23          24          25          26          27          28          29          30          31          32          33          34          35          36          37          38          39          40
ABILITY1    AP_SPCL351  ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****        ****
Dein SET_2DA_ENTRY 0 1 2 ~NQ#FRS01~ hat das "V1.0" in der ersten Zeile ersetzt.

Mit der 41 sollte es aber funktionieren.
 
Oben