Cela fait un bout de temps que nous en parlions et cette semaine Zatalyz a attaqué le problème de front : revoir les tenues de réfugiés lors de la création des personnages en jeu afin d'avoir une vraie tenue d'oublieux, une tenue qui nous soit propre. Le résultat est une magnifique tenue de Ra déclinée en deux versions : une pour chaque sexe.
Ce blog est l'occasion de relater le dessous des cartes, lever quelque peu le voile sur ce travail à deux, fait en coulisse avant l'obtention du résultat que vous pouvez admirer ci-dessous. C'est aussi l'occasion de jeter un œil au fonctionnement interne du moteur de jeu et comprendre la manière dont sont construites ces tenues.
La première étape a résidé dans la création d'une tenue originale. Si ce que vous voyez sur ces images ressemble à ce que vous pouvez trouver sur Ryzom, regardez plus attentivement. Vous verrez qu'il n'existe aucune tenue comme celle-ci. Chaque élément a été retravaillé, en y introduisant des couleurs, des textures et des détails spécifiques.
Ouvrons le capot et jetons un œil sur la manière dont les tenues sont construites en Jeu. Pour cela rendons-nous dans le dossier « /data/ » du client du jeu. Ce dossier contient une série de fichiers à l'extension « .bnp ». Ces fichiers sont en fait l'équivalent de « .zip ». Ils permettent de regrouper les fichiers graphiques (textures, modèles 3d, animations, squelettes) par thème. L'outil « bnp_make » permet de zipper ou dézipper ces fichiers. Un listage des fichiers « .bnp » débutant par « characters_maps* » permet de se rendre compte qu'ils contiennent les textures des tenues des personnages avec la codification suivante :
$ ls -1 characters_maps_* characters_maps_fy_hof_armor00_hr.bnp characters_maps_fy_hom_armor00_hr.bnp characters_maps_ma_hof_armor00_hr.bnp characters_maps_ma_hom_armor00_hr.bnp characters_maps_tr_hof_armor00_hr.bnp …
Les noms de ces fichiers sont tous sous la forme : « characters_maps_XX_YYY_ZZZ_hr.bnp
» avec :
Notez que la tenue de réfugié est considérée comme une tenue « tryker ». Nous avons donc décompilé les deux fichiers « characters_maps_tr_hof_refugee_hr.bnp » et « characters_maps_tr_hom_refugee_hr.bnp » pour étudier plus attentivement leur contenu.
$ ls tr_hof_refugee_dos_c1_FY_U1.dds tr_hof_refugee_jambeavar_c1_FY_U1.dds tr_hof_refugee_jupe_c1_FY_U1.dds tr_hof_refugee_torse_c1_FY_U1.dds …
Là encore, nous découvrons tout une série de fichiers images (les textures) au format « .dds » dont le nom semble suivre la nomenclature suivante « XX_YY_ZZZZZ_WWWW_PP_ RR_CC
.dds » :
Ainsi comme le montre l'image ci-dessus, pour la face avant (« torse ») du haut noir (« U8 ») plan 1 (« c1 ») de la tenue de réfugié (« refugee ») homine (« hof ») qui est considéré comme une tenue tryker (« tr »), nous avons quatre déclinaisons, une pour chaque race car la couleur de la peau change à chaque fois :
tr_hof_refugee_torse_c1_MA_U8.dds tr_hof_refugee_torse_c1_ZO_U8.dds tr_hof_refugee_torse_c1_FY_U8.dds tr_hof_refugee_torse_c1_TR_U8.dds
Voici pour exemple le travail réalisé par Zatalyz sur la robe d'oublieux (à droite) basée sur le modèle de robe zoraï homine légère de mage (plan 1, couleur blanche). Cela a demandé de revoir les couleurs des textures de bases pour garder une cohérence avec tous les éléments de notre tenue d'oublieux, la modifications de détails, et parfois l'ajout d'éléments nouveaux sur certaines textures. Pour cela, il a fallu détourer selon le cas les éléments à retravailler, mais aussi reporter ces modifications pour chaque race.
Sur le plan technique cela impose un workflow spécifique :
L'étape suivante a consisté à tester ce résultat en jeu. Initialement nous pensions juste remplacer les textures d'origines par celle de notre tenue. Le premier test effectué sur le gilet oublieux nous a montré que nous avions laissé de coté un élément essentiel :
Tout d'abord, nous notons un rendu (effet gloss) qui n'est pas celui attendu. Ensuite nous remarquons que la veste n'épouse pas la forme réelle du torse. Le problème provient du fait qu'il n'y a pas un modèle unique 3D sur lequel on plaque une texture, mais bien un modèle 3D par type de tenue. Ainsi l'image ci dessus montre (sans aucune texture) les modèles 3D du torse pour les vestes tryker et fyros des homins :
Vous pouvez voir que le modèle 3D n'est pas le même et que donc les textures ne peuvent s'appliquer de manière identique.
C'est ainsi que nous avons découvert que nous devions à la fois redessiner les textures des tenues, mais aussi changer les shapes (la dénomination NEL pour les modèles 3D) des avatars pour refléter nos choix.
Pour cela il fallait revoir la définition même des tenues coté serveur, et plus exactement ces petits fichiers XML qui décrivent chaque élément en jeu, que nous appelons « datasheet ». Les datasheets des tenues de réfugiés du serveur sont situés dans le dossier : ryzomcore/code/ryzom/common/data_leveldesign/leveldesign/game_element/sitem/armor/refugee/
Vous pouvez les consulter via notre wiki DS ici : http://khaganat.net/dswiki/datasheet:rc:leveldesign:game_element:sitem:armor:refugee:start
Ce dossier contient les datasheets (fichiers) suivants :
$ ls icraba.sitem icrabe.sitem icrabg.sitem icrabr.sitem icrabt.sitem icrabu.sitem icrabv.sitem icrabw.sitem icraga.sitem icrage.sitem icragg.sitem icragr.sitem icragt.sitem icragu.sitem icragv.sitem icragw.sitem icralb.sitem icralg.sitem icrals.sitem icrapa.sitem icrape.sitem icrapg.sitem icrapr.sitem icrapt.sitem icrapu.sitem icrapv.sitem icrapw.sitem icrasa.sitem icrase.sitem icrasg.sitem icrasr.sitem icrast.sitem icrasu.sitem icrasv.sitem icrasw.sitem icrava.sitem icrave.sitem icravg.sitem icravr.sitem icravt.sitem icravu.sitem icravv.sitem icravw.sitem
Le prefixe « icra » du nom de fichier est spécifique à la tenue de réfugié. L'avant dernière lettre du nom dénote l'élément de la tenue (ce qui nous intéresse de notre cote est la veste « v » et la robe « p »). La dernière lettre du nom, la couleur, à savoir « e » pour beige dans notre cas. Ainsi nous devions revoir les deux fichiers datasheets :
(cf. http://khaganat.net/dswiki/datasheet:rc:leveldesign:game_element:sitem:armor:refugee:icrave.sitem )
$ more icrave.sitem <?xml version="1.0"?> <FORM Revision="$Revision: 1.4 $" State="modified"> <PARENT Filename="_c_ar.sitem"/> <STRUCT> <STRUCT Name="basics"> <ATOM Name="name" Value="refugee beige vest"/> <ATOM Name="ItemType" Value="Light vest"/> <STRUCT Name="EquipmentInfo"> <ARRAY Name="EquipmentSlots"> <ATOM Value="Chest"/> </ARRAY> </STRUCT> <ATOM Name="CraftPlan" Value="bcraea33.sbrick"/> </STRUCT> <STRUCT Name="3d"> <ATOM Name="shape" Value="TR_HOM_refugee_gilet.shape"/> <ATOM Name="shape_female" Value="TR_HOF_refugee_gilet.shape"/> <ATOM Name="map_variant" Value="Low Quality"/> <ATOM Name="icon" Value="AR_gilet.tga"/> <ATOM Name="icon background" Value="BK_generic.tga"/> <ATOM Name="color" Value="Beige"/> </STRUCT> <STRUCT Name="faber"> <ATOM Name="Tool type" Value="ArmorTool"/> </STRUCT> </STRUCT> <STRUCT/> <STRUCT/> <STRUCT/> <STRUCT/> </FORM>
A la lecture de ce fichier, nous devinons qu'il se rapporte à la veste beige de la tenue de réfugié, et qu'il utilise 2 modèles 3D (shape) différents, un pour chaque sexe :
Si celui des homines était le bon, celui des homins ne correspondait pas. Il nous fallait trouver le bon shape. Retour vers le dossier /data/ du jeu et exploration des fichiers «.bnp ». Après quelques tâtonnements nous trouvons enfin le bon fichier « bnp », à savoir « characters_shape.bnp » qui contient les modèles 3d de chaque élément d'un avatar en fonction de la tenue portée. Encore des tâtonnements pour retrouver le « shape » cette fois et finalement il suffisait dans ce cas de changer la ligne
<ATOM Name="shape" Value="TR_HOM_refugee_gilet.shape"/>
en
<ATOM Name="shape" Value="FY_HOM_armor00_gilet.shape"/>
Pour le cas de la robe, nous avons rencontré un tout autre problème. Voici le datasheet d'origine pour la robe beige de réfugié :
(cf. http://khaganat.net/dswiki/datasheet:rc:leveldesign:game_element:sitem:armor:refugee:icrape.sitem )
$ more icrape.sitem <?xml version="1.0"?> <FORM Revision="$Revision: 1.4 $" State="modified"> <PARENT Filename="_c_ar.sitem"/> <STRUCT> <STRUCT Name="basics"> <ATOM Name="name" Value="refugee beige pants"/> <ATOM Name="ItemType" Value="Light pants"/> <STRUCT Name="EquipmentInfo"> <ARRAY Name="EquipmentSlots"> <ATOM Value="Legs"/> </ARRAY> </STRUCT> <ATOM Name="CraftPlan" Value="bcraea17.sbrick"/> </STRUCT> <STRUCT Name="3d"> <ATOM Name="shape" Value="TR_HOM_refugee_pantabottes.shape"/> <ATOM Name="shape_female" Value="TR_HOF_refugee_pantabottes.shape"/> <ATOM Name="map_variant" Value="Low Quality"/> <ATOM Name="icon" Value="AR_pantabotte.tga"/> <ATOM Name="icon background" Value="BK_generic.tga"/> <ATOM Name="color" Value="Beige"/> </STRUCT> <STRUCT Name="faber"> <ATOM Name="Tool type" Value="ArmorTool"/> </STRUCT> </STRUCT> <STRUCT/> <STRUCT/> <STRUCT/> <STRUCT/> </FORM>
A priori après avoir travaillé sur la texture de la robe zoraï légère, et sachant que nous voulions la même robe pour les deux sexes, nous avions initialement modifié le datasheet « icrape.sitem » pour qu'il pointe le même shape pour les deux sexes, celui des homines zoraï :
<ATOM Name="shape" Value="ZO_HOF_caster01_pantabottes.shape"/> <ATOM Name="shape_female" Value="ZO_HOF_caster01_pantabottes.shape"/>
Sauf qu'après test, nous nous sommes rendu compte que le modèle 3d des jambes d'un avatar féminin et masculin n'est pas du tout identique :
Du coup il a fallu reprendre le modèle 3d (shape) mâle. Cela nous a aussi obligé à retravailler la texture car elle ne s'appliquait pas de la même manière sur ce modèle 3d mâle :
<ATOM Name="shape" Value="ZO_HOM_caster01_pantabottes.shape"/> <ATOM Name="shape_female" Value="ZO_HOF_caster01_pantabottes.shape"/>
La dernière étape a consisté à voir où était défini les habits par défaut lors de la création des personnages afin de retirer les gants, manches et bottes de la tenue de réfugié pour ne garder que la robe et la veste.
Il se trouve que les datasheets de définition des avatars à la création (équipements, tenues, morphlogie, race, etc… ) sont dans le dossier « [[kh>dswiki/datasheet:rc:leveldesign:game_elem:createperso:0parent:start] » et son parent. Plus exactement c'est le fichier « _parent.starting_role|ryzomcore/code/ryzom/common/data_leveldesign/leveldesign/Game_elem/CreatePerso/_parent/ » qui nous intéresse :
<?xml version="1.0"?> <FORM Revision="$Revision: 1.4 $" State="modified"> <STRUCT> <STRUCT Name="StartEquipment1"> <STRUCT Name="Body"> <ATOM Name="Item" Value="icrave.sitem"/> <ATOM Name="Quality" Value="1"/> </STRUCT> <STRUCT Name="Legs"> <ATOM Name="Item" Value="icrape.sitem"/> <ATOM Name="Quality" Value="1"/> </STRUCT> <STRUCT Name="Arms"> <ATOM Name="Item" Value="icrase.sitem"/> <ATOM Name="Quality" Value="1"/> </STRUCT> <STRUCT Name="Hands"> <ATOM Name="Item" Value="icrage.sitem"/> <ATOM Name="Quality" Value="1"/> </STRUCT> <STRUCT Name="Feet"> <ATOM Name="Item" Value="icrabe.sitem"/> <ATOM Name="Quality" Value="1"/> </STRUCT> <STRUCT Name="Head"> <ATOM Name="Quality" Value="0"/> </STRUCT> <STRUCT Name="Face"> <ATOM Name="Quality" Value="0"/> </STRUCT> <STRUCT Name="Headdress"> <ATOM Name="Quality" Value="0"/> </STRUCT> <STRUCT Name="EarL"> <ATOM Name="Quality" Value="0"/> </STRUCT> <STRUCT Name="EarR"> <ATOM Name="Quality" Value="0"/> </STRUCT> .... ( etc )
On se rend compte que ce datasheet indique chaque élément porté par un avatar lors de sa création : éléments de tenues, armes, parures, etc…
La Modification a consisté à retirer les pièces : bottes, manches, et gants. Donc corriger les lignes suivantes, en retirant le nom de l'item porté et en mettant le champ “Value” à zérro :
<STRUCT Name="Arms"> <ATOM Name="Quality" Value="0"/> </STRUCT> <STRUCT Name="Hands"> <ATOM Name="Quality" Value="0"/> </STRUCT> <STRUCT Name="Feet"> <ATOM Name="Quality" Value="0"/> </STRUCT>
Ainsi à présent lors de la création d'un nouveau personnage en jeu, celui-ci est équipé uniquement de notre robe et d'une veste.
Pour conclure, ce travail est l'occasion d'ouvrir quelques portes et réflexions pour le futur :
plume de sérénité
” dans son inventaire par exemple.