Page 1 sur 1

[WeiDU] Comment utiliser la commande REPLACE_TEXTUALLY pour modifier un script ?

Posté : sam. 21 mai 2011, 16:58
par Huxaltec
:skull: Salut la CdC, j'ai un nouveau souci avec mon mod...

C'est la 1ere fois que j'utilise la commande REPLACE_TEXTUALLY, pour patcher un script ; mais celle-ci ne fonctionne pas.
Alors que je devrais avoir un remplacement du code entre les premiers "~~" par le code entre les deuxièmes "~~", je n'obtiens rien du tout, le script OBSDEM01.BCS reste inchangé (vérifié avec Near Infinity), et bien sûr ça ne fonctionne pas in-game.
Je précise que le résultat est le même avec ou sans le "EXACT_MATCH" après "REPLACE_TEXTUALLY".

Si vous avez des idées, ça m'aiderait énormément...

Merci beaucoup ;)
:skull:

Code : Tout sélectionner

COPY_EXISTING ~OBSDEM01.BCS~ ~override~
  DECOMPILE_BCS_TO_BAF
  REPLACE_TEXTUALLY EXACT_MATCH ~IF
Detect([PC])
Global("summon","LOCALS",0)
THEN
RESPONSE #100
CreateVisualEffect("SPFLAST2",[1972.1287])
CreateVisualEffect("SPFLSRIN",[1972.1287])
CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
CreateVisualEffect("SPFLAST2",[1889.1461])
CreateVisualEffect("SPFLSRIN",[1889.1461])
CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
CreateVisualEffect("SPFLAST2",[2244.1403])
CreateVisualEffect("SPFLSRIN",[2244.1403])
CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
SetGlobal("summon","LOCALS",1)
END~
~IF
Detect([PC])
Global("summon","LOCALS",0)
THEN
RESPONSE #100
CreateVisualEffect("SPFLAST2",[1995.1320])
CreateVisualEffect("SPFLSRIN",[1995.1320])
CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
CreateVisualEffect("SPFLAST2",[1972.1287])
CreateVisualEffect("SPFLSRIN",[1972.1287])
CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
CreateVisualEffect("SPFLAST2",[1889.1461])
CreateVisualEffect("SPFLSRIN",[1889.1461])
CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
CreateVisualEffect("SPFLAST2",[2244.1403])
CreateVisualEffect("SPFLSRIN",[2244.1403])
CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
SetGlobal("summon","LOCALS",1)
END~
  COMPILE_BAF_TO_BCS

Posté : sam. 21 mai 2011, 22:29
par Isaya
A mon avis, le problème vient du fait que WeiDU décompile les scripts en faisant une mise en forme du script avec une indentation utilisant tabulation ou espaces, comme il le fait quand tu décompiles un script. Du coup, le texte que tu lui dis de chercher ne se trouve pas tel quel dans le script puisqu'il y a ces indentations.
Je ne sais pas si la perte des indentations est dû au forum, c'est bien possible aussi.

En tout cas, faute de savoir exactement l'indentation utilisée par WeiDU, il faut utiliser des variables et des expressions régulières. C'est ce que fait le BG2 Fixpack, par exemple ici :

Code : Tout sélectionner

// many dispel magic actions have two missing CheckStatGT triggers in an OR() block
COPY_EXISTING ~abazdrag.bcs~ ~override~
              ~amlich02.bcs~ ~override~
              ~dragbrow.bcs~ ~override~
              ~finsol04.bcs~ ~override~
              ~gorgua02.bcs~ ~override~
              ~meliss01.bcs~ ~override~
              ~meliss02.bcs~ ~override~
              ~meliss03.bcs~ ~override~
              ~planet.bcs~   ~override~
              ~senbattl.bcs~ ~override~
 DECOMPILE_BCS_TO_BAF
   REPLACE_TEXTUALLY ~CheckStatGT(LastSeenBy(Myself),0,0)[%tab% %lnl%%mnl%%wnl%]+CheckStatGT(LastSeenBy(Myself),0,0)~
                     ~CheckStatGT(LastSeenBy(Myself),0,IMPROVEDHASTE) CheckStatGT(LastSeenBy(Myself),0,STONESKINS)~
                     // triggers for a dispel magic
 COMPILE_BAF_TO_BCS
 BUT_ONLY_IF_IT_CHANGES
Les variables %tab%, %lnl%, %mnl% et %wnl% sont définies dans la documentation de WeiDU et désigne les caractères tabulation et les sauts de ligne Linux, Mac et Windows. Ainsi WeiDU reconnaîtra n'importe lequel de ces caractères comme faisant partie de la chaine à chercher. Le fait d'avoir des crochets crée un groupe de caractères possibles, qui comprend donc ces quatre plus l'espace qui se trouve entre %tab% et %lnl%.
Le + signifie qu'il faut chercher un ou plusieurs caractères faisant partie du groupe. C'est documenté dans la documentation WeiDU, partie RegExp.
En gros, il te faut mettre ça partout où tu avais un saut de ligne dans le texte que tu cherchais.
Comme ça utilise une expression régulière, il ne faut surtout pas que tu mettes EXACT_MATCH.

L'absence dans ton cas du BUT_ONLY_IF_IT_CHANGES n'est pas responsable du problème. Mais il vaut mieux le mettre afin d'éviter de réécrire le fichier même si WeiDU n'a pas apporté de modification.

Posté : dim. 22 mai 2011, 10:20
par Huxaltec
:skull: Merci de ta réponse Isaya !!

Si j'ai bien compris tes explications, au niveau de mon code ça donne :

Code : Tout sélectionner

COPY_EXISTING ~OBSDEM01.BCS~ ~override~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY EXACT_MATCH ~IF
 Detect([PC])
 Global("summon","LOCALS",0)
THEN
 RESPONSE #100
  CreateVisualEffect("SPFLAST2",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+
  CreateVisualEffect("SPFLSRIN",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+
  CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+
  CreateVisualEffect("SPFLAST2",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+
  CreateVisualEffect("SPFLSRIN",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+
  CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+
  CreateVisualEffect("SPFLAST2",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+
  CreateVisualEffect("SPFLSRIN",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+
  CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+
  SetGlobal("summon","LOCALS",1)[%tab% %lnl%%mnl%%wnl%]+
END~
~IF
 Detect([PC])
 Global("summon","LOCALS",0)
THEN
 RESPONSE #100
         CreateVisualEffect("SPFLAST2",[1995.1320])
  CreateVisualEffect("SPFLSRIN",[1995.1320])
  CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
  CreateVisualEffect("SPFLAST2",[1972.1287])
  CreateVisualEffect("SPFLSRIN",[1972.1287])
  CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
  CreateVisualEffect("SPFLAST2",[1889.1461])
  CreateVisualEffect("SPFLSRIN",[1889.1461])
  CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
  CreateVisualEffect("SPFLAST2",[2244.1403])
  CreateVisualEffect("SPFLSRIN",[2244.1403])
  CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
  SetGlobal("summon","LOCALS",1)
END~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
J'ai testé et malheureusement de nouveau aucune modification du .bcs post-installation. :skull:

Posté : dim. 22 mai 2011, 11:14
par Isaya
A partir du moment où tu ajoutes une expression règulière à la fin de chaque ligne pour englober le saut de ligne et les espaces de début de ligne, il faut que tu élimines tous ces caractères de ce que tu donnes comme chaine à rechercher.
Tel que tu l'as fait, tu as laissé les sauts de ligne et des espaces en début de ligne, alors que l'expression régulière était supposée les passer tous. Comme il n'y a pas deux sauts de lignes entre chaque ligne, la chaine demandée n'est pas trouvée. La séquence présente dans le fichier que tu veux patcher est : saut de ligne (unique), espace(s), commandes. Hors l'expression régulière couvre 1 ou plusieurs [saut de ligne et/ou espace et/ou tabulation] et le fait de laisser un saut de ligne après l'expression régulière fait que tu veux en trouver encore un autre après. Cette séquence n'existe pas dans le fichier à patcher, donc forcément ça ne fait rien.

Il faut sans doute écrire l'expression comme ceci, avec tout sur la même ligne et aucun espace :

Code : Tout sélectionner

COPY_EXISTING ~OBSDEM01.BCS~ ~override~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY EXACT_MATCH ~IF[%tab% %lnl%%mnl%%wnl%]+Detect([PC])[%tab% %lnl%%mnl%%wnl%]+Global("summon","LOCALS",0)[%tab% %lnl%%mnl%%wnl%]+THEN[%tab% %lnl%%mnl%%wnl%]+RESPONSE #100[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+SetGlobal("summon","LOCALS",1)[%tab% %lnl%%mnl%%wnl%]+END~
~IF
 Detect([PC])
 Global("summon","LOCALS",0)
THEN
 RESPONSE #100
         CreateVisualEffect("SPFLAST2",[1995.1320])
  CreateVisualEffect("SPFLSRIN",[1995.1320])
  CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
  CreateVisualEffect("SPFLAST2",[1972.1287])
  CreateVisualEffect("SPFLSRIN",[1972.1287])
  CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
  CreateVisualEffect("SPFLAST2",[1889.1461])
  CreateVisualEffect("SPFLSRIN",[1889.1461])
  CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
  CreateVisualEffect("SPFLAST2",[2244.1403])
  CreateVisualEffect("SPFLSRIN",[2244.1403])
  CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
  SetGlobal("summon","LOCALS",1)
END~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
BG2 Fixpack regorge de patchs de ce genre, plus ciblés en général (il s'agit plutôt de modifier des conditions, pas de changer tout un bloc) et ils sont tous bien écrits sur une seule ligne.
BG2 Fixpack fait un usage encore plus poussé des expressions régulières, qui permettent aussi de récupérer un bloc de la chaine recherchée pour le reprendre dans la chaine de remplacement. Mais c'est une autre histoire, même si tu pourrais aussi en profiter ici puisque tu recopies une grosse partie.

En fait tu pourrais même fortement alléger le tout puisqu'il semble que tu veuilles ajouter trois lignes au début du bloc RESPONSE (même si elles pourraient tout aussi bien être à la fin).

A priori, tu pourrais l'écrire :

Code : Tout sélectionner

COPY_EXISTING ~OBSDEM01.BCS~ ~override~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY EXACT_MATCH ~\(IF[%tab% %lnl%%mnl%%wnl%]+Detect([PC])[%tab% %lnl%%mnl%%wnl%]+Global("summon","LOCALS",0)[%tab% %lnl%%mnl%%wnl%]+THEN[%tab% %lnl%%mnl%%wnl%]+RESPONSE #100[%tab% %lnl%%mnl%%wnl%]+\)\(CreateVisualEffect("SPFLAST2",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+SetGlobal("summon","LOCALS",1)[%tab% %lnl%%mnl%%wnl%]+END\)~
~\1
  CreateVisualEffect("SPFLAST2",[1995.1320])
  CreateVisualEffect("SPFLSRIN",[1995.1320])
  CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
\2~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
Le fait de mettre toute une partie entre \( et \) fait qu'on peut la récupérer dans la chaine de substitution en utilisant la forme \nnn, où nnn est le numéro d'ordre de la partie entre \( et \) dans la chaine de recherche.

En principe, tu pourrais même fortement alléger la deuxième partie car, à moins d'une énorme subtilité qui m'échappe, il n'y a qu'un seul bloc de script qui peut correspondre vu que ce bloc change la seule variable qu'il teste, ce qui fait qu'aucun autre bloc ne devrait avoir le même déclencheur.

Posté : dim. 22 mai 2011, 13:30
par Huxaltec
:skull: Aaaaahhh Ok !!!! cette fois-ci j'ai tout compris ^^ . J'étais vraiment à côté de la plaque.
Je teste et je te dis mais il n'y a pas de raison pour que ça ne fonctionne pas cette fois-ci. En fait j'ai au moins une bonne dizaine d'autre codes à remplacer en utilisant replace_textually.
Encore une fois (et il y en aura d'autres), ton aide m'a été précieuse... Grâce à toi je vais enfin pouvoir achever une nouvelle zone sur laquelle se pose la sphère planaire dans mon mod.

Merci beaucoup Isaya !!

Posté : lun. 23 mai 2011, 00:17
par Huxaltec
J'ai essayé la version courte et la version longue du code que tu m'as donné et j'obtiens toujours le même résultat.
J'ai essayé à tout hasard de supprimer les commentaires "//", mais sans succès.

Si j'essaie de remplacer 1 seule ligne de code (donc sans utiliser le "[%tab% %lnl%%mnl%%wnl%]+"), ça fonctionne :
Dans le tp2 j'ai :

Code : Tout sélectionner

COPY_EXISTING ~OBSDEM01.BCS~ ~override~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY EXACT_MATCH ~RESPONSE #100~
~ RESPONSE #100
  CreateVisualEffect("SPFLAST2",[1995.1320])
  CreateVisualEffect("SPFLSRIN",[1995.1320])
  CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES

et dans le bcs ça donne :

Code : Tout sélectionner

IF
 Detect([PC])
 Global("summon","LOCALS",0)
THEN
 RESPONSE #100
  CreateVisualEffect("SPFLAST2",[1995.1320])
  CreateVisualEffect("SPFLSRIN",[1995.1320])
  CreateCreature("QQILABY",[1995.1320],0) // Illithid
  CreateVisualEffect("SPFLAST2",[1972.1287])
  CreateVisualEffect("SPFLSRIN",[1972.1287])
  CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
  CreateVisualEffect("SPFLAST2",[1889.1461])
  CreateVisualEffect("SPFLSRIN",[1889.1461])
  CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
  CreateVisualEffect("SPFLAST2",[2244.1403])
  CreateVisualEffect("SPFLSRIN",[2244.1403])
  CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
  SetGlobal("summon","LOCALS",1)
END

Même si j'obtiens le résultat attendu, j'aurais quand même aimé comprendre pourquoi ça ne fonctionne pas avec plusieurs lignes à remplacer.
J'ai donc essayé avec simplement 2 lignes :

Code : Tout sélectionner

COPY_EXISTING ~OBSDEM01.BCS~ ~override~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY EXACT_MATCH ~THEN[%tab% %lnl%%mnl%%wnl%]+RESPONSE #100~
~ THEN
  RESPONSE #100
  CreateVisualEffect("SPFLAST2",[1995.1320])
  CreateVisualEffect("SPFLSRIN",[1995.1320])
  CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
et là ça ne fonctionne plus. :?: :crazy: :?: Que faut-il en conclure ?


Rohhh je ne suis qu'un gros boulet... :'(


EDIT : étant donné que j'avais plusieurs blocs de codes (des scripts de la sphère planaire) à modifier, j'ai du trouver une solution alternative. J'ai trouvé la fonction
REPLACE_BCS_BLOCK oldFile newFile
ça me permet d'échanger un bloc d'un script existant (que je copie dans un "oldfile.bcs") par un nouveau bloc que je place dans un "newfile.bcs". ça marche !

Posté : lun. 23 mai 2011, 20:35
par Isaya
Pour faire court, je vais me contenter de me citer :
Isaya a écrit :Comme ça utilise une expression régulière, il ne faut surtout pas que tu mettes EXACT_MATCH.
:whistle3:

Je suis à peu-près certain que si tu supprimes EXACT_MATCH, ça devrait fonctionner. ;)

J'espère juste que le passage de la théorie à la pratique va fonctionner comme je le pense.

Posté : mar. 24 mai 2011, 12:40
par Huxaltec
Hélas non, j'ai essayé avec et sans EXACT_MATCH, vraiment étrange si on regarde le code utilisé pour BG2fixpack entre autres...

En tout cas la fonction REPLACE_BCS_BLOCK marche à merveille.