id Tech 4 : entités

Tout permuter

=Notes générales

Les entités sont créées dans des fichiers .def. Ces fichiers déterminent les attributs de toutes les entités utilisées dans le jeu et font toutes référence à des classes C++ dans le code.

  • Fichiers de définition des entités

    • Les entités func_ sont définies dans pak000/def/func.def
    • Le modèle du joueur est défini dans pak000/def/player.def et s'appelle model_sp_marine. Le fichier .md5mesh est ici : pak002/models/md5/characters/npcs/playermoves/spplayer.md5mesh
    • L'entité de la tête du joueur est définie dans pak000/def/heads.def et s'appelle head_player. Le modèle est ici : pak002/models/md5/heads/player/player.md5mesh
    • Les entités non catégorisables sont définies dans pak000/def/misc.def
    • Les entités target_ sont définies dans pak000/def/target.def
  • Création d'une entité

    Les entités sont définies comme objets entityDef, dans des fichiers .def.

    On peut déclarer une entité comme suit :

    entityDef custom/nom_entité
    {
    "editor_color"     "0 1 0"
    "editor_mins"      "-8 -8 -8"
    "editor_maxs"      "8 8 8"
    "editor_material"  "textures/common/speaker"
    "editor_usage"     "Texte de description"
    "spawnclass"       "MaClasse"
    }

    nom_entité est évidemment le nom de l'entité et MaClasse est une classe qui hérite d'idEntity. Noter que le nom de l'entité ne doit pas commencer par un chiffre, car cela peut causer des problèmes d'interprétation de scripts.

    Dans DarkRadiant, cette entité sera visible dans le répertoire avec le nom indiqué ; dans le cas courant, base/custom.

  • L'entité du joueur

    Les mesh, les animations et les propriétés du joueur sont définis dans pak000/def/player.def.

    Propriétés notables :

    • pm_walkspeed : la vitesse de déplacement de base du joueur

=Entités notables

  • Liste d'entités utiles

    Dans DarkRadiant, on ajoute une entité à la map en faisant un clic droit dans une vue 2D, en en sélectionnant Create Entity....

    func_cameraTarget darkmod > Func > Movers
    func_door Cette entité a été définie dans le code de Doom 3, et non celui du Dark mod. Elle ne peut donc pas être ajoutée dans DarkRadiant à moins que le dossier des ressources soit celui de Doom 3 (voir la section Game dans les préférences de DarkRadiant). Solution partielle : ouvrir la map dans DOOMEdit, créer l'entité ([clic droit] > func_door), puis rouvrir le fichier dans DarkRadiant
    func_explosion Une explosion sans modèle. Pour l'activer, on utilise la fonction de script sys.trigger().Note : si l'explosion se trouve à l'intérieur d'un mur, elle n'aura aucun effet sur les entités dans la scène.
    func_securitycamera darkmod > Func
    func_static darkmod > Func
    monster_zombie_fat base
    target_endlevel base
    target_null base

La liste suivante offre plus de détails sur certaines entités. Dans les cas où les classes C++ correspondantes ont été confirmées, elles sont indiquées entre parenthèses.

  • info_location

    Définie dans : pak000/def/misc.def

    Cette entité affiche le nom de la salle dans le HUD du joueur, les salles étant séparées entre autres par des portes.

  • light

    Définie dans : pak000/def/misc.def

    Notes :

    • Les lumières peuvent être redimensionnées de façon uniforme, ou un côté à la fois ; l'option peut être choisie avec le bouton Drag-resize entities symmetrically, en haut de l'écran.
    • Une lumière peut être ambiante pour l'illumination globale, si on lui ajoute ces propriétés :

      texture     lights/ambientlight
      noshadows   1
      nospecular  1
      nodiffuse   1

      La propriété _color devra aussi se voir attribuée une valeur faible.

    • L'origine de la lumière peut être déplacée pour empêcher qu'elle soit obstruée par le joueur. Il suffit de modifier la propriété light_center (un vecteur de trois nombres).
    • À partir du moment qu'une lumière reçoit une texture (comme lights/barrelexplode) à l'aide de la propriété texture, la propriété _color est ignorée pour l'affichage.
  • func_beam

    Définie dans : pak005/def/func.def

    On peut créer un laser semi-transparent qui passe d'un func_beam à un autre comme ceci :

    1. Créer deux func_beam (func_beam_1 et func_beam_2)
    2. Donner à func_beam_1 les propriétés suivantes :
      • skin : skins/beam_blue (par exemple)
      • target : func_beam_2

    Cela affichera un laser bleu qui commencera à l'origine de func_beam_1 et finira à celle de func_beam_2.

    Note : Je n'ai trouvé que deux skins possibles : beam_blue et beam_red. Il faudra probablement en créer des nouveaux ; les deux versions (presque identiques) du fichier sont dans :

    • pak000/skins/skins.skin
    • pak005/skins/skins.skin
  • func_cameraview

    Définie dans : pak005/def/func.def

    Une vue de caméra. Cette entité n'a pas de modèle, contrairement à func_securitycamera.

    • Il semble que les func_cameraview regardent dans la direction x positive par défaut.
    • Comme les entités qui y font référence, cet objet peut lui-même avoir une propriété cameraTarget, qui permet de voir la scène à partir d'une autre entité.

    Problèmes rencontrés :

    • La vue d'une func_cameraview est croche lorsqu'elle est envoyée à un GUI (mais pas quand on utilise sys.setCamera())

      Inspecter la CVar image_downSize dans base/DoomConfig.cfg. Elle doit avoir une valeur de 0.

    • La vue d'une func_cameraview est distordueLorsqu'on applique une rotation libre à une caméra (c'est-à-dire avec la souris plutôt qu'avec l'interface), sa vue peut se distordre.

      Réinitialiser la propriété rotation de la caméra, et utiliser les boutons dans la barre des gauche, ou l'option Modify > Rotate and Scale...

    • Si la vue de caméra est appliquée sur un GUI, elle doit avoir l'orientation par défaut. Sinon, le modèle sur lequel le GUI est affiché subira une rotation.

      Ce problème réside dans le code C++ du moteur de jeu.

  • func_door

    Définie dans : pak005/def/func.def

    Notes :

    • La porte coulissante fonctionne par défaut en glissant sur l'axe x. Pour changer l'angle (de déplacement) de la porte, lui donner une propriété angle (avec une valeur de 90, par exemple).
    • Si la propriété locked a la valeur 1, la porte s'ouvrira lorsqu'elle sera déverrouillée (dans un script, par exemple). Si elle a la valeur 2, elle ne s'ouvrira pas (informations provenant de DOOMEdit).
  • func_forcefield

    Cette entité pousse les objets qui y touchent dans une direction particulière. Pour en créer une, on sélectionne une brush dans le niveau, puis on fait un clic droit et on sélectionne Create entity... ; l'entité à choisir est bien sûr func_forcefield.Propriétés notables :

    • start_on : une valeur de 1 assurera que l'entité est active dès le lancement de la map ; avec une valeur de 0, on devra l'activer via une entité trigger
    • uniform : cette propriété accepte un vecteur (trois nombres séparés d'espaces) pour indiquer un déplacement sur les axes x, y et z
    • target : il est également possible de pousser vers une entité target_null, au lieu d'utiliser un vecteur

    On peut faire exploser une vitre (func_fracture) dans une direction précise en plaçant le func_forcefield de façon à intersecter la vitre et en activant les deux entités (par un script ou par un trigger).

    Dans ce cas, ajouter deux propriétés pour affecter correctement la vitre : applyImpulse (valeur de 1) et wait (valeur de .1). D'autres propriétés sont aussi utiles dans d'autres situations ; voir leurs descriptions dans DarkRadiant.

  • speaker

    Définie dans : pak000/def/misc.def

    http://www.iddevnet.com/doom3/sounds.php

    Les speaker sont des représentations de sons dans le niveau.

    La propriété s_shader de l'objet détermine le shader sonore (sound shader) à utiliser. Les shader sonores déterminent le ou les sons à jouer, et leur appliquent des propriétés particulières.

    Les sound shader doivent se trouver dans le dossier base/sound. En voici un exemple :

    loop_deep_01
    {
    global
    looping
    sound/soundscape/loop_deep_01.ogg
    }

    Ce shader joue un son ambiant (global) en boucle (looping). Les shaders sonores peuvent jouer des fichiers .wav et .ogg, et peut-être d'autres aussi.

  • target_entity_fadeout

    Définie dans : pak000/def/target.def

    Cette entité sert à faire disparaître lentement une lumière.

    On crée l'objet et on règle deux propriétés : target (la lumière) et, optionnellement, fadeTime (le temps, en seconde, de la transition).

    Il y a aussi l'entité target_entity_fadein.

  • trigger_hurt (idTrigger_Hurt)

    Définie dans : pak000/def/triggers.def

    Peut contenir quelques propriétés utiles :

    • def_damage : l'entité qui représente le montant des dégats subis par l'entité visée (le joueur, par défaut).Valeurs possibles : damage_triggerhurt_100, damage_triggerhurt_1000, entre autres
    • on : si l'entité est active.Valeurs possibles : 1 ou 0
  • trigger_once (idTrigger_Multi)

    Définie dans : pak000/def/triggers.def

    Les entités trigger peuvent appeler directement une fonction de script avec la propriété call, ou activer un trigger_relay avec la propriété target.

    Avec la propriété call, utiliser comme valeur espaceNom::fonction (sans parenthèses ; on ne peut pas passer de paramètres).

=Propriétés notables

Toutes les entités visibles

noshadows Désactiver les ombres pour cette entité

Monstres

enemy Le monstre attaquera l'entité avec le nom donné (permet aux monstres de se battre entre eux)

=Modifications

  • Modifier la vitesse de déplacement d'un personnage

    Il y a cinq types de mouvement pour les personnages dans Doom 3. Tous sont définis dans ai_base.script : MOVETYPE_DEAD, MOVETYPE_ANIM, MOVETYPE_SLIDE, MOVETYPE_FLY et MOVETYPE_STATIC.

    Les personnages qui se déplacent à la marche utilisent MOVETYPE_ANIM, c'est-à-dire que la vitesse de déplacement du personnage dépend de l'animation qu'il utilise.

    Par exemple, l'animation de marche du monstre « Bernie » (l'entité monster_zombie_bernie) se trouve dans pak002/models/md5/monsters/zombies/bernie/fastwalk.md5anim. Au début du fichier, on trouvera la ligne suivante :

    frameRate 24

    Cette ligne détermine la cadence de l'animation et, par conséquent, la vitesse de déplacement.

    Note : Semblerait-il que les mouvements de type MOVETYPE_FLY et MOVETYPE_SLIDE peuvent être accélérés ou ralentis via la fonction de script setFlySpeed() (voir pak008/script/doom_events.script).