Table des matières

Création d'un botobject

On désigne sous le terme de botobject les objets dont le datasheet est de type .creature sans IA particulière ni interaction prévue, qui servent généralement à placer du décor.

Georges, tout content de ses nouveaux tonneaux

Nous allons prendre un exemple de botobject très simple, un classique du genre, un tonneau. Puis envisager le cas où nous aurons à en créer plus d'un, de façon à améliorer notre flux de production et, également, économiser sur les tailles des fichiers.

Création simple

Pour pouvoir le faire apparaître, il suffit d'indiquer ces renseignements :

barrel.creature
<?xml version="1.0"?>
<FORM Revision="$Revision: 1.6 $" State="modified">
  <STRUCT>
    <STRUCT Name="Basics">
      <STRUCT Name="MovementSpeeds">
        <ATOM Name="WalkSpeed" Value="0"/>
        <ATOM Name="RunSpeed" Value="0"/>
      </STRUCT>
      <STRUCT Name="Equipment">
        <STRUCT Name="Body">
          <ATOM Name="Item" Value="barrel_01.shape"/>
          <ATOM Name="Texture" Value="Desert/Medium Quality/Normal"/>
        </STRUCT>
      <ATOM Name="Fame" Value="none"/>
    </STRUCT>
    <STRUCT Name="3d data">
      <ATOM Name="DisplayOSD" Value="false"/>
      <ATOM Name="DisplayInRadar" Value="false"/>
      <ATOM Name="DisplayName" Value="false"/>
      <ATOM Name="DisplayBars" Value="false"/>
    </STRUCT>
    <STRUCT Name="Collision">
      <ATOM Name="NotTraversable" Value="true"/>
      <ATOM Name="CollisionRadius" Value="0.48"/>
      <ATOM Name="Length" Value="0"/>
      <ATOM Name="Width" Value="0"/>
      <ATOM Name="Height" Value="1"/>
    </STRUCT>
    <STRUCT Name="Properties">
      <ATOM Name="Selectable" Value="false"/>
      <ATOM Name="Attackable" Value="false"/>
      <ATOM Name="Curativable" Value="false"/>
      <ATOM Name="Turn" Value="false"/>
    </STRUCT>
  </STRUCT>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <LOG></LOG>
</FORM>

Nous allons détailler ci-dessous les différents éléments que nous avons indiqués.

MovementSpeeds

Walkspeed

Vu que c'est un objet statique, on met la valeur à 0.

Runspeed

Vu que c'est un objet statique, on met la valeur à 0.

Equipment

Body

Item

C'est là qu'on indique le fichier 3D qui sera appelé pour représenter notre botobject. Ici, ce sera barrel_01.shape. On peut, le cas échéant utiliser un système de particules.

Texture

Cette entrée n'est pas obligatoire si le shape n'a qu'une texture ou si on applique à un objet multitexturé sa texture de base. Dans le cas contraire (voir le multitexturage ici), on peut indiquer les variation (selon le nombre de textures dans le shape). Les valeurs possibles nous sont indiquées par rcdstyp_creature_texture_equipment :

Nous choisissons la valeur “Desert/Medium Quality/Normal” pour que notre tonneau ait la seconde texture, vu que c'est un fichier multitexturé.

Fame

Vu qu'aucune interaction n'est prévue avec notre tonneau, pas besoin de s'encombrer des renommées, on indique “none”

3d data

Cette section semble un peu capricieuse, des tests complémentaires sont nécessaires.

Display OSD

La valeur “false” permet de ne pas afficher le botobject sur l'OSD.

DisplayInRadar

La valeur “false” permet de ne pas afficher le botobject dans le radar.

DisplayName

La valeur “false” permet de ne pas afficher le nom du botobject au-dessus de lui.

DisplayBars

La valeur “false” permet de ne pas afficher les caractéristiques du botobject au-dessus de lui.

Collision

NotTraversable

La valeur “true” permet de bloquer le passage à travers ce botobject.

CollisionRadius

On indique en mètres le rayon de collision, si notre objet est cylindrique pour celle-ci. Sinon on remplit les deux champs suivants.

Length

On indique en mètre la longueur de notre objet, si il est parallélépipédique.

Width

On indique en mètre la largeur de notre objet, si il est parallélépipédique.

Height

On indique en mètre la hauteur de notre objet.

Properties

Selectable

La valeur false permet d'empêcher la sélection du botobject.

Attackable

La valeur false permet d'empêcher l'attaque du botobject.

Curativable

La valeur false permet d'empêcher de soigner le botobject.

Turn

La valeur false permet de faire que l'objet ne tourne pas quand on clique dessus (pour une mission par exemple).

Et voilà nous avons un magnifique tonneau prêt à apparaître dans le Khanat.

L'héritage

Si on veut faire un second tonneau, avec une texture différente (vu que le shape en contient plusieurs), ce serait dommage de devoir copier l'intégralité des indications vu que les deux tonneaux en partagent pas mal (toutes, sauf celle de la texture en fait). Mais on peut en profiter pour créer un parent qui sera partagé par tous les botobjects de base, vu que seul le shape, et les tailles de collision changent.

Création du parent

On va donc créer un parent qui contient toutes les informations constantes pour les botobjects.Cela ne nous empêchera pas de modifier quelques paramètres au sein d'un botobject, la valeur héritée du parent étant toujours écrasée par celle de l'enfant en cas de redondance.

On pourra donc rendre un botobject sélectionnable en mettant la valeur selectable à “true” dans sa datasheet enfant.

Par convention, on utilise un underscore comme premier caractère de nom. Ainsi, on sait qu'il ne sert à rien d'utiliser directement cette datasheet dans une primitive ou un script, les informations sur la créature ne sont pas complètes.

_parent_botobject.creature
<?xml version="1.0"?>
<FORM Revision="$Revision: 1.6 $" State="modified">
  <STRUCT>
    <STRUCT Name="Basics">
      <STRUCT Name="MovementSpeeds">
        <ATOM Name="WalkSpeed" Value="0"/>
        <ATOM Name="RunSpeed" Value="0"/>
      </STRUCT>
      <ATOM Name="Fame" Value="none"/>
    </STRUCT>
    <STRUCT Name="3d data">
      <ATOM Name="DisplayOSD" Value="false"/>
      <ATOM Name="DisplayInRadar" Value="false"/>
      <ATOM Name="DisplayName" Value="false"/>
      <ATOM Name="DisplayBars" Value="false"/>
    </STRUCT>
    <STRUCT Name="Collision">
      <ATOM Name="NotTraversable" Value="true"/>
    </STRUCT>
    <STRUCT Name="Properties">
      <ATOM Name="Selectable" Value="false"/>
      <ATOM Name="Attackable" Value="false"/>
      <ATOM Name="Curativable" Value="false"/>
      <ATOM Name="Turn" Value="false"/>
    </STRUCT>
  </STRUCT>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <LOG></LOG>
</FORM>

Création des enfants

Nous pouvons créer deux tonneaux (vu que notre shape contient deux textures) qui hériteront de ce parent juste en indiquant le nom du parent au début de la datasheet :

barrel_closed.creature
<?xml version="1.0"?>
<FORM Revision="$Revision: 1.9 $" State="modified">
  <PARENT Filename="_parent_botobject.creature"/>
  <STRUCT>
    <STRUCT Name="Basics">
      <STRUCT Name="Equipment">
        <STRUCT Name="Body">
          <ATOM Name="Item" Value="barrel_01.shape"/>
        </STRUCT>
      </STRUCT>
    </STRUCT>
    <STRUCT Name="Collision">
      <ATOM Name="CollisionRadius" Value="0.48"/>
      <ATOM Name="Length" Value="0"/>
      <ATOM Name="Width" Value="0"/>
      <ATOM Name="Height" Value="1"/>
    </STRUCT>
  </STRUCT>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <LOG></LOG>
</FORM>

Le second avec la seconde texture (et pas celle par défaut) :

barrel_powder.creature
<?xml version="1.0"?>
<FORM Revision="$Revision: 1.9 $" State="modified">
  <PARENT Filename="_parent_botobject.creature"/>
  <STRUCT>
    <STRUCT Name="Basics">
      <STRUCT Name="Equipment">
        <STRUCT Name="Body">
          <ATOM Name="Item" Value="barrel_01.shape"/>
          <ATOM Name="Texture" Value="Desert/Medium Quality/Normal"/>
        </STRUCT>
      </STRUCT>
    </STRUCT>
    <STRUCT Name="Collision">
      <ATOM Name="CollisionRadius" Value="0.48"/>
      <ATOM Name="Length" Value="0"/>
      <ATOM Name="Width" Value="0"/>
      <ATOM Name="Height" Value="1"/>
    </STRUCT>
  </STRUCT>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <STRUCT/>
  <LOG></LOG>
</FORM>

On pourrait aller encore plus loin, si on prévoyait d'avoir énormément de types de tonneaux, en faisant un parent _parent_tonneau.creature, qui hériterait de _parent_botobject.creature et qui comporterait toutes les informations sauf celles de texture. Il n'y aurait plus qu'à créer alors les différents tonneaux héritant de _parent_tonneau.creature, mais ayant le paramètre texture indiqué pour chaque.

L'affichage du nom

Une fois toutes ces opérations effectuées, il est préférable de pourvoir notre objet d'un nom dans les différentes langues. On veillera donc à créer une entrée dans creature_words_wk.txt dans le répertoire work avant de lancer le pipeline de traduction. L'Id de cette entrée est le nom de notre fichier, sans son extension. Pour nos deux tonneaux, nous aurons donc deux entrées :