La tenue des Oublieux

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.

tenue-refugiee-feminine.png, juin 2014

tenue-refugiee-masculine.png, juin 2014

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 » :

texture-torse-par-race.png, juin 2014

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

travail-sur-la-robe.png, juin 2014

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 :

  1. importer les images au format DDS via un plugin spécifique de gimp (https://code.google.com/p/gimp-dds/).
  2. Travailler sur des calques pour conserver les modifications et les reporter sur chaque race.
  3. Exporter le résultat au format TGA pour pouvoir
  4. reconvertir la texture au format DDS via l'outil dédié de NEL : « tga2dds .»

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 :

texture-sur-mauvais-shape.png, juin 2014

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 :

Torse-Homme-Shape.png, juin 2014

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 :

shape-homine-sur-homin.png, juin 2014

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"/>

shape-homin-sur-homin.png, juin 2014

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 :