Page 1 sur 1
Recopier en patchant un baf AVANT compilation, prolème.
Posté : dim. 07 févr. 2021, 10:54
par deratiseur
Je voudrais recopier 22 fois un fichier baf avant de tous les compiler (parce que 98% du fichier est fixe et destiné à évoluer avec d'autres mises à jour, il n'y a qu'une ligne qui change dans chaque script, donc je préfère partir d'un seul fichier unique)
le baf se présente comme ceci :
Code : Tout sélectionner
IF
Global("PxQuaramon","LOCALS",0)
HasItem("HELM24",LastSummonerOf(Myself))
THEN
RESPONSE #100
TakePartyItem("HELM24")
SetGlobal("PxQuaramon","LOCALS",1)
END
IF
Global("PxQuaramon","LOCALS",0)
HasItem("HELM25",LastSummonerOf(Myself))
THEN
RESPONSE #100
TakePartyItem("HELM25")
SetGlobal("PxQuaramon","LOCALS",1)
END
IF
Global("PxQuaramon","LOCALS",0)
HasItem("HELM34",LastSummonerOf(Myself))
THEN
RESPONSE #100
TakePartyItem("HELM37")
SetGlobal("PxQuaramon","LOCALS",1)
END
IF
Global("PxQuaramon","LOCALS",1)
THEN
RESPONSE #100
SetGlobal("PxQuaramon","LOCALS",0)
TakeItemReplace("pxl2qu5","pxl2qu6",LastSummonerOf(Myself))
CreateVisualEffectObject("ICCSWOUI",Myself)
DisplayString(Myself, @80382)
DestroySelf()
END
Pour chaque fichier je n'ai besoin que de changer pxl2qu5 en pxl2qu"i" et pxl2qu6 en pxl2qu"i+1"
Pour l'instant j'essaie de tous les copier dans un sous répertoire "delete" dans "Backup" avant de tous les compiler. Ca se copie et compile mais ça coince sur i+1 (j'ai essayé pleins de trucs)
J'utilise :
OUTER_FOR ( i=6 ; i<28 ; i +=1) BEGIN //Pour chaque script à copier nommé de 6 à 27
COPY ~Derats_Magasin_2/Scripts/pxl2qu5.baf~ ~Derats_Magasin_2/Backup/Delete/pxl2qu%i%.baf~ REPLACE_TEXTUALLY ~pxl2qu6~ ~pxl2qu%1+i%~ REPLACE_TEXTUALLY ~pxl2qu5~ ~pxl2qu%i%~
END
COMPILE ~Derats_Magasin_2/Backup/Delete~
Ca me fait bien 22 fichier et 22 scripts compilés, mais ça donne ça : (exemple pris dans le script pxl2qu9)
TakeItemReplace("pxl2qu9","pxl2qu%1+i%",LastSummonerOf(Myself)
Comment obtenir ce i+1 ? (pxl2qu%1+i% devrait être pxl2qu10)
De plus, existe t'il une solution moins lourde pour compiler en patchant sans construire un répertoire complet ?
Posté : dim. 07 févr. 2021, 15:24
par rivvers
Hello,
weidu, avec ses % % s'attend à une variable non à un calcul, comme la variable '1+i' n'existe pas il la considère comme une chaîne de caractère.
Il y a peut-être moins lourdingue mais tu peux effectuer le calcul en amont avec par exemple :
Code : Tout sélectionner
OUTER_FOR ( i=6 ; i<28 ; i +=1) BEGIN //Pour chaque script à copier nommé de 6 à 27
OUTER_SET j = i+1
COPY ~Derats_Magasin_2/Scripts/pxl2qu5.baf~ ~Derats_Magasin_2/Backup/Delete/pxl2qu%i%.baf~ REPLACE_TEXTUALLY ~pxl2qu6~ ~pxl2qu%j%~ REPLACE_TEXTUALLY ~pxl2qu5~ ~pxl2qu%i%~
END
COMPILE ~Derats_Magasin_2/Backup/Delete~
Tu peux également patcher et compiler en même temps mais le problème étant que tu as besoin de copier tes fichiers afin de les renommer. Donc ça ne t'apportera rien.
Mais, au lieu de faire 22 bam avec une partie changeante, peut-être est-il possible de faire un seul fichier bam avec 22 parties changeantes ? Dans ce cas, ça sera plus aisé.
As-tu remarqué le HasItem("HELM3
4") suivi de TakePartyItem("HELM3
7") ?
Posté : dim. 07 févr. 2021, 18:42
par deratiseur
Merci, ça marche.
Finalement c’était aussi simple que OUTER_SET que je ne connaissais pas. Quand je dis que mon niveau est infiniment basique.....
En fait le script est déjà pas mal long, au début il y a un bloc pour chaque pierre ionique trouvable (21 au total) avant le bloc final qui supprime la chandelle invoquant le montre lvl X pour la remplacer par la chandelle invoquant le monstre x+1.
Je pourrais faire faire ça sur un seul script et gerer toutes les chandelles (22 au total) sur un seul script. Mais alors ça ferait 43 blocs, qui ne devraient plus être Local mais Global. Et puis je en vois pas comment. J'ai fait en sorte de n'avoir la valeur que 0 ou 1 pour assurer qu'une seule pierre soit supprimée à chaque fois.
Et merci pour la denier remarque, effectivement il y avait un 34 devenu 37
Posté : lun. 08 févr. 2021, 17:26
par Freddy_Gwendo
J'arrive à la bourre, mais il existe une autre solution : utiliser les fichiers temporaires inlined.
Code : Tout sélectionner
OUTER_FOR (i = 5 ; i <28 ; ++i) BEGIN
OUTER_SET j = i+1
OUTER_SPRINT var1 EVAL "pxl2qu%i%"
OUTER_SPRINT var2 EVAL "pxl2qu%j%"
<<<<<<<< .../%MOD_FOLDER%/inlined/pxl2qu%i%.baf
... // toutes les lignes de codes précédant le passage à modifier
IF
Global("PxQuaramon","LOCALS",1)
THEN
RESPONSE #100
SetGlobal("PxQuaramon","LOCALS",0)
TakeItemReplace("%var1%","%var2%",LastSummonerOf(Myself))
CreateVisualEffectObject("ICCSWOUI",Myself)
DisplayString(Myself, @80382)
DestroySelf()
END
> >> >> >> >
COMPILE EVALUATE_BUFFER ~.../%MOD_FOLDER%/inlined/pxl2qu%i%.baf~ USING ~%MOD_FOLDER%/lang/%s/fichier_tra_if_needed_pour_@80382.tra~
END
Je n'ai pas testé ce code précis, mais j'en ai utilisé des similaires avec succès.
Posté : mar. 09 févr. 2021, 11:18
par deratiseur
Niquel. C'est exactement ce dont j'avais besoin. Merci Freddy, encore au top sur les codes weidu.
Bon, la chandelle du monstre est finie, il reste à faire la cassette de Faïs. Ça c'est une autre histoire....
Edit : enfin, presque. Pour une raison qui m'échappe totalement, il veut bien afficher un DisplayString, mais il refuse d'afficher un DisplayStrinHead, quoi que je fasse.
Posté : mar. 09 févr. 2021, 16:26
par Freddy_Gwendo
D'après ton code, ce script affiche un message sur une créature convoquée. J'ai souvenir de très vieux échanges sur les forums anglo-saxons mentionnant un comportement très étrange du moteur IE avec la combinaison DisplayStringHead + DestroySelf. En gros, les intervenants ne comprenaient pas pourquoi le DisplayStringHead ne s'affichait pas dans certains cas, et ceci de manière aléatoire. Du coup, j'ai pris l'habitude de scinder mon code en deux blocs: le premier affiche le message, le second détruit la créature.
D'un autre côté, selon le message affiché, tu pourrais modifier le contenu du message pour qu'il apparaisse sur le convocateur, le possesseur de l'objet qui est modifié, en utilisant DisplayString(LastSummonerOf(Myself), @80382).
Ceci dit, je ne sais pas si le problème a été résolu ou pas dans les versions EE.
Posté : mar. 09 févr. 2021, 18:12
par deratiseur
Ok, ça marche en mettant le code (21 fois) dans les 21 blocs checkant les objets.
Le texte est : "Wahahahaha - Miam !", c'est bien la créature qui doit le dire
Posté : mar. 09 févr. 2021, 18:49
par Freddy_Gwendo
Parfait.
Quant à WeiDU, on en apprend tous les jours dès qu'on se pose la question suivante : "N'y aurait-il pas un moyen plus simple de faire ?"
Je suis en train de l'apprendre à mes dépens après avoir trouvé stupide d'avoir pondu deux procédures d'installation différentes pour ToB et les jeux EE. En utilisant des fonctions maisons et des ARRAYS, on résoud le problème facilement, même si c'est pénible à coder...
Les fichiers temporaires sont très rarement utilisés et pourtant, ils permettent d'alléger de nombreux mods de lignes redondantes inutiles qui alourdissent le code.
Posté : ven. 12 févr. 2021, 22:44
par Cocrane
Sujet très intéressant qui me sera utile. :-p
Je me permets d'ajouter une question sur un sujet aussi de "recopier" ou "usiner" un modèle de base:
Sur une carte est ce possible "recopier" un trigger trap x fois et de modifier son nom et le fichier .baf qui lui est lié dans un TP2? En gros, on aurait x trigger trap au même endroit et même dimension.
Le code de la carte décidera lequel est actif. ;-p
Cocrane
Posté : sam. 13 févr. 2021, 16:08
par Freddy_Gwendo
J'ai donné le code dans mon tuto sur les cartes secrètes pour ta maison à Baldur's Gate.
Posté : dim. 14 févr. 2021, 16:01
par Cocrane
[quote][/QUOTE]Exact, c'est du 2016! Bonne mémoire. :-)
J'avais utilisé la carte mais pas la mécanique du TP2, je voulais déjà voir ce que ça donnait. Ensuite j'ai traité un autre sujet et je n'ai pas utilisé la mécanique d'insertion du Trigger. Pas bien, j'ai laissé un écrasement de carte.
Merci pour le rappel. Je suis sur un trigger Trap à cloner mais à priori de ce que je vois, ce n'est pas génant si il n'y a pas de zone Travel, le nom du script .baf fait partie de la copie. Je vais voir pour mettre à jour le nom du script (%i% d'une boucle) pour mettre le bon nom en fonction du trigger trap en cours.
Merci Freddy.
Cocrane
Je viens de faire un essai sur BGEE et WEIDU plante et disparait. Dans le fichier debug, je vois cette erreur:
Code : Tout sélectionner
[LABY.TP2] PARSE ERROR at line 14 column 1-3
Near Text: LPF
GLR parse error
Code lancé:
Code : Tout sélectionner
BACKUP ~Laby/backup~
AUTHOR ~"https://www.baldursgateworld.fr/lacouronne/le-champion-de-bhaal/"~
VERSION ~BGT v1.1 - 2019~
LANGUAGE ~Francais~
~french~
~Laby/LANG/FRENCH/Setup.tra~
BEGIN ~Laby~
INCLUDE ~Laby/lib/GW_Cartes.tph~ // Chargement des fonctions
LPF ~GW_CLONE_TRAVEL_TRIGGER~ STR_VAR GW_Dest_old = BG3200 GW_Dest_new = BG3201 GW_Name_new = COTSP2 RET GW_add_trigger END
PATCH_IF ("%GW_add_trigger%" STRING_COMPARE_CASE "") THEN BEGIN
LPF ~GW_REINCLUDE~ STR_VAR GW_input = EVAL "%GW_add_trigger%" END
END
L'objectif est le suivant:
- cloner un trigger trap x fois sur la carte d'origine et changer le nom du trigger et le fichier .baf lié.
exemple:
Trigger Trap COTSP2 / COTSP2(.baf)
Trigger Trap COTSP3 / COTSP3(.baf) clone
Trigger Trap COTSP%i% / COTSP%i%(.baf) clone
etc...
Pour faire simple, éviter de faire x triggers quasi identiques à la main
J'ai pris la carte BG3200 comme source pour faire un test et j'ai créé le trigger COTSP2. J'ai tenté de prendre la carte cible BG3200 ou BG3201.
J'ai essayé ce code-ci à partir de ton code:
Code : Tout sélectionner
INCLUDE ~Laby/lib/GW_Cartes.tph~ // Chargement des fonctions
COPY_EXISTING ~BG3200.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) THEN BEGIN // Taille minimum d'un fichier .ARE = Vérification de la validité du fichier .ARE
LPF ~GW_CLONE_TRAVEL_TRIGGER~ STR_VAR GW_Dest_old = BG3200 GW_Dest_new = BG3201 GW_Name_new = COTSP2 RET GW_add_trigger END
PATCH_IF ("%GW_add_trigger%" STRING_COMPARE_CASE "") THEN BEGIN
LPF ~GW_REINCLUDE~ STR_VAR GW_input = EVAL "%GW_add_trigger%" END
END
END // of PATCH_IF (SOURCE_SIZE > 0x11b)
BUT_ONLY
Weidu ne plante pas mais il reste bloqué avec un message "copie et patch"
Cocrane
Posté : dim. 28 févr. 2021, 15:01
par Cocrane
[/QUOTE][/code] Freddy,
un niveau planning, pas de soucis. J'ai x sujets à traiter. :-)
J'ai testé la copie du Travel région sans succès. J'ai repris le code de l'époque.
Code : Tout sélectionner
INCLUDE ~
Laby/lib/GW_Cartes.tph~ // Chargement des fonctions
COPY_EXISTING ~BG3300.are~ ~override~
PATCH_IF (SOURCE_SIZE > 0x11b) THEN BEGIN // Taille minimum d'un fichier .ARE = Vérification de la validité du fichier .ARE
LPF ~GW_CLONE_TRAVEL_TRIGGER~ STR_VAR GW_Dest_old = BG3300 GW_Dest_new = BG9999 GW_Name_new = TRPN RET GW_add_trigger END
PATCH_IF ("%GW_add_trigger%" STRING_COMPARE_CASE "") THEN BEGIN
LPF ~GW_REINCLUDE~ STR_VAR GW_input = EVAL "%GW_add_trigger%" END
END
END
BUT_ONLY
GW_Dest_old = BG3300 Carte contenant le travel région
GW_Dest_new = BG9999 Carte à créer avec le travel région copié
GW_Name_new = TRPN Nom du travel région à copier.
Résultat:
Code : Tout sélectionner
Installing [Laby] [BGT v1.1 - 2019]
Copying and patching 1 file ...
[./override/BG3300.are] loaded, 49740 bytes
Et il ne se passe plus rien.
J'ai testé avec une carte existante et BG3300. J'ai le même résultat.
A partir de cette fonction, je ne vois comment c'est possible d'avoir un nouveau de Travel région et un changement de nom de carte de destination.
Cocrane