Page 1 sur 1
[INI] Comment modifier facilement un fichier ini ?
Posté : sam. 12 nov. 2016, 16:15
par Freddy_Gwendo
Contrairement aux versions classiques, les versions Enhanced n'utilisent pas le fichier ANISND.ids et les fichiers 2da d'attribution de sons aux animations de créatures, mais regroupent ces données dans un fichier ini dédié à chaque animation.
Malheureusement, je me suis aperçu que certains sont erronés, par exemple ceux des animations CHICKEN_BROWN et CHICKEN_WHITE qui mentionnent les fichiers bam MCHB et MCHW alors que ce sont les fichiers ACHB et ACHW qu'il faut utiliser.
Je dois donc les modifier et je me demande si la fonction REPLACE_TEXTUALLY fonctionne aussi avec ces fichiers qui ne sont que des fichiers txt à la base.
Bref, est-ce qu'une commande WeiDU du style
fonctionne ou bien doit-on procéder autrement ?
Posté : sam. 12 nov. 2016, 19:48
par Isaya
Oui, ça fonctionne. Je pense l'avoir vu utilisé dans BG2 Tweaks pour des fichiers 2DA.
Et je m'en suis servi pour le mod de traduction partielle de BG2EE afin d'ajouter la langue française au menu du jeu, où il m'a fallu modifier un fichier .lua :
Code : Tout sélectionner
COPY_EXISTING ~BGEE.lua~ ~override/BGEE.lua~
REPLACE_TEXTUALLY ~\( {'en_US', 99385, 99386, 'English'},\)~ ~\1
{'fr_FR', %transDesc1%, %transDesc2%, 'Français'},~
UNLESS ~'fr_FR'~
Nota : la mise en forme est due au format du fichier à modifier, il faut ajouter une ligne avec un certain format à la suite de celui recherché.
Posté : sam. 12 nov. 2016, 20:18
par Freddy_Gwendo
Génial, en plus ton exemple vient de me donner l'idée de modifier l'ensemble des fichiers ini concernés d'un coup en utilisant des variables définies dans un array.
Je testerai ça demain.
Je ne sais pas comment les devs s'y sont pris, ni pourquoi personne ne semble s'en être aperçu, mais une bonne douzaine de ces fichiers ne sont pas corrects.
Posté : dim. 13 nov. 2016, 20:49
par Freddy_Gwendo
J'ai réussi à pondre un truc qui fonctionne :
Code : Tout sélectionner
ACTION_DEFINE_ASSOCIATIVE_ARRAY GW_ini_files BEGIN
MCHB, ACHB => 7d02
MCHW, ACHW => 7d03
MGVE, MGHI => e293
...
END
ACTION_PHP_EACH GW_ini_files AS donnees => inifile BEGIN
ACTION_IF (FILE_EXISTS_IN_GAME ~%inifile%.ini~) THEN BEGIN
OUTER_SPRINT bamold EVAL "%donnees_0%"
OUTER_SPRINT bamnew EVAL "%donnees_1%"
OUTER_SPRINT headerold EVAL "// %donnees_0%"
OUTER_SPRINT headernew EVAL "// %donnees_1%"
COPY_EXISTING ~%inifile%.ini~ ~override/%inifile%.ini~
REPLACE_TEXTUALLY ~\(resref=\)%bamold%~ ~\1%bamnew%~
REPLACE_TEXTUALLY ~%headerold%~ ~%headernew%~
BUT_ONLY
END
END
Comme d'hab, puisque je suis fâché avec les expressions régulières, il a fallu que je me replonge dans la doc.
Seul souci : je n'ai pas réussi à trouver une formulation avec /1 /2 pour effectuer un remplacement d'une traite dans un seul REPLACE_TEXTUALLY. Il faut jongler avec les caractères spéciaux et avec les %WNL% et compagnie...
J'aurais aussi pu intégrer "resref =" dans les variables. Mais bon...
Posté : dim. 13 nov. 2016, 23:23
par Isaya
Ma foi, il y a une bonne dizaine de lignes entre les deux éléments à remplacer, dont des débuts de section. Faire une expression régulière qui couvre précisément ce qui est entre les deux, sans risque d'attraper autre chose au passage, c'est une folie. Mieux vaut deux recherches sans ambiguïté qu'on monstre incompréhensible dès les jours qui suivent sa réalisation.
Toujours pour la lisibilité, il vaut mieux que tu réserves bien tes variables à quelque chose qui a un sens et que le resref n'en fasse pas partie.
Posté : dim. 13 nov. 2016, 23:44
par Freddy_Gwendo
Et en plus, selon le format de l'animation, le nombre de lignes renseignées n'est pas le même !
C'est après avoir été fouiller dans quelques tp2 de mods que j'ai fini par renoncer.
Si tu me dis que c'est "
une folie", alors je prends ! Tu maîtrises beaucoup mieux ce genre de point que moi.
Posté : lun. 14 nov. 2016, 23:14
par Isaya
J'ai écrit "de la folie", car c'est faire compliqué pour la beauté de l'art (écrire une seule expression) au détriment de la facilité de mise au point et de la lisibilité. Et il y a toujours le risque qu'une évolution du contenu du fichier casse l'expression et que ça ne fonctionne plus. Bref, comme le dit le "zen" du langage Python, "simple is better than complex", "readability counts" ou encore "if the implementation is hard to explain, it's a bad idea".
Posté : lun. 14 nov. 2016, 23:48
par Freddy_Gwendo
Effectivement.
D'ailleurs j'ai suivi à la lettre ces conseils le week-end dernier. Après avoir commencé à pondre une usine à gaz pour éviter d'avoir à fournir deux fichiers de description d'objets pour les versions classiques et enhanced en supprimant les références inusabilité des objets, j'ai fini par me dire qu'au moins un mod avait sûrement déjà eu la même idée.
Et poum ! J'ai trouvé mon bonheur dans Item Revision. Je n'ai eu qu'à adapter le code - qui ne fait que quelques lignes - à mes descriptions.