Bonjour bonjour,
Suite à une discussion très intéressante avec Skanzo et Azrael07 sur le chan #NWN, je vais essayer de mettre ici le bilan de nos connaissances sur le sujet.
Bon. Le sujet est donc l'édition de l'ensemble des menus de NWN, des menus de création de personnage aux menus qui apparaissent au cours du jeu. Je crois que pratiquement tous les menus du jeu sont engendrés par des fichiers de type .gui, à part la feuille de personnage dont je n'ai pas trouvé le fichier correspondant. Ces fichiers se trouvent dans aurora_gui.bif (extractables avec Zviewer).
Un fichier .gui est un fichier GFF, qui marche donc par listes de variables répertoriées dans des entrées, etc.
Chaque élément du menu est défini par cette suite de variable :
*obj_caption [liste] (facultatif) : texte de l'élément (détail après)
*obj_layer [int >0, pair] : je ne suis pas sûr, mais je suppose que c'est la priorité de l'élément (devant / derrière les autres éléments)
*obj_locked [int =0] : aucune idée, toujours à 0
*obj_parent [string] : tag de la fenêtre de fond (cf. après)
*obj_parent_hook [string] : resref de la fenêtre
*obj_resref [string] (facultatif) : resref de l'élément (cf. après)
*obj_tag [string] : tag de l'élément (pas sûr de l'utilité, apparemment ça sert à attribuer des fonctions hardcodées aux éléments)
*obj_type [int] : type d'élément (cf. après)
*obj_x, _y, _z [float] : coordonnées de l'élément par rapport au centre de l'écran
Détail de obj_caption (peut-être incomplet
) :
*alignement horizontal/vertical avec l'élément [2 floats]
*couleur du texte [3 floats]
*StrRef du texte : référence au dialog.tlk dans le cas de textes statiques (exemple : "OK", "Fermer", etc.), sinon mystère dans le cas de textes dynamiques (mais dans ce cas changer la valeur n'a pas l'air d'influer en quoique ce soit sur ledit texte)
En ce qui me concerne, il reste quelques zones d'ombres, principalement au niveau du tag. Par exemple, j'ai essayé de supprimer la description dans le menu qui apparait lorsque l'on examine un objet. Cet élément portait le tag "Description". Dès que je changeait le tag, ou que je supprimais l'élément, le jeu plantait après examen d'un objet. J'en ai déduit que le code du jeu exigait qu'un élément taggé "Description" soit présent dans le menu pour que tout fonctionne.
Concernant le menu en lui même (la fenêtre de fond si vous préférez), voilà les variables qui le définissent :
*entrées des éléments [liste] (facultatif) : liste tous les éléments du menu, dont les index doivent être consécutifs, enfin je suppose
*obj_layer [int =0] : toujours à 0 dans le cas de la fenêtre de fond
*obj_locked [int =0] : idem
*obj_resref [string] : resref de la fenêtre
*obj_tag [string] : tag de la fenêtre
*obj_type [int =3] : type d'élement (cf. après) (3 dans le cas d'une fenêtre)
*obj_x, _y, _z [float] : coordonnées de la fenêtre par rapport au centre de l'écran
Ensuite vient la liste des différents types d'objet que j'ai répertorié jusque là (pas forcément exhaustive donc) :
0 = divers : barre de chargement, slots d'inventaire
1 = petite croix de fermeture (style windows)
3 = fenêtre de menu
5 = texte (statique ou dynamique)
8 = description, contenant le texte, l'évaluation de FP dans le cas d'une créature, etc. (ce type d'élément reste dur à modifier, puisque majoritairment hardcodé)
9 = bouton (avec texte statique ou dynamique)
Remarque : après reflexion, je suis à 99% sûr que le contenu d'un texte dynamique est choisi en fonction de son tag; par exemple, le texte qui s'affiche en haut de la fenêtre d'examen d'objet, porte le tag "Name" (et pas de resref) et affiche effectivement le nom de l'objet.
Enfin, les quelques resrefs que j'ai répertorié (liste sûrement pas exhaustive) :
*ctl_btn_pre_116 : bouton
*ctl_btn_pre_176 : bouton (un peu plus gros je crois)
*ctl_btn_x : croix de fermeture
*ctl_exam_item01 : description d'objet
Dans le cas de ces éléments précis, le resref est spécifié et est probablement indispensable (créer un élément de type 9, soit un bouton, sans préciser un des resrefs au dessus, peut donner des résultats imprévisibles). Même chose pour la description, supprimer le resref n'a amené qu'un joli plantage.
Dernière chose : l'ajout comme la suppression d'éléments non-cruciaux (cf. description) semble ne pas poser de problèmes si elle est faite avec rigueur. Par contre, le programme semble attribuer une fonction uniquement au premier bouton portant le tag qu'il attend; ainsi, une croix de fermeture que j'avais rajouté, alors qu'un autre était déjà là, n'était pas "cliquable" car aucune fonction ne lui était associée. (son index était supérieur à la croix de fermeture originale).
Au final, rajouter des éléments présente donc bien peu d'intérêt, à moins de maîriser parfaitement le fonctionnement des textes dynamiques (ce qui n'est pas mon cas
).
Quand j'aurais répertorié les différents tags associés à leurs fonctions respectives, je les posterais ici.
Voilà, fin du premier compte-rendu sur le sujet. Ca peut paraître un peu léger et surtout très flou, mais ça a demandé pas mal d'essais et de cafouillements
Avec tout ça, je pense qu'il est possible de créer un éditeur de menus rudimentaire. Les fonctions seraient principalement :
* modification des coordonnées d'éléments existants, de leur texte (statique uniquement), éventuellement de leur fonction
* rajout/suppression d'éléments
* euh... peut-être permettre de modifier la skin du menu, mais ça demanderait la liste des resref des menus associés à leurs images respectives
Bon, allez, j'ai fait mon devoir pour aujourd'hui
Bonne nuit à tous