Oyez, oyez !

Les résultats du vote sur les meilleurs RPG de tous les temps sont désormais dévoilés dans ce message !

Merci à toutes et à tous pour votre participation !

N'hésitez pas à aller commenter, ajouter des jeux auxquels vous n'auriez pas pensé...

Recopier en patchant un baf AVANT compilation, prolème.

Regroupe tous les sujets sur les commandes, les fonctions, les routines, les modifications des fichiers systèmes (ids, 2da...)...
Répondre
Avatar du membre
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne

Recopier en patchant un baf AVANT compilation, prolème.

.

Message 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 ?
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
rivvers
Ours brun
Messages : 300
Enregistré le : sam. 21 janv. 2012, 14:36
Statut : Hors ligne
.

Message 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("HELM34") suivi de TakePartyItem("HELM37") ?
Avatar du membre
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message 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 :)
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message 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.
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
deratiseur
Golem de fer
Messages : 3697
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message 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 ^^
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message 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. :)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

J'ai donné le code dans mon tuto sur les cartes secrètes pour ta maison à Baldur's Gate. ;)
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message 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
Cocrane
Adepte de Grondemarteau
Ogre mage
Messages : 1328
Enregistré le : dim. 21 mars 2010, 12:03
Localisation : Paris
Contact :
Statut : Hors ligne
.

Message par Cocrane »

Code : Tout sélectionner

[quote][CODE]
[/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
Répondre

Retourner vers « Programmation WeiDU »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité