La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 14:16:45


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Baldurien
L'homme qui chutait sur le macadam
Inscrit le: 12 Sep 2002
Messages: 14066
Localisation: Quadran Alpha
Répondre en citant
Posté le : 26/07/2004 12:54:58 Sujet du message : WeiDU : Fichiers D

Les fichiers D sont la base de tout dialogues. Bien entendu, ceux-ci seront automatiquement converti en fichier *.DLG par WeiDU. Les Dialogues dans le moteur Infinity reposent sur les états machine (Finite State Machine dans la documentation).

Le langage D n'est qu'un moyen facilitant l'écriture de fichier DLG.

Pour ceux qui ont fait du NWScript, je peux déjà dire que c'est plus simple sur certains points mais bien plus compliqué. D'autant qu'il n'y pas d'IDE (ie: un logiciel qui facilite la création de dialogues) pour faire ça.

Comme beaucoup de tutoriaux que j'ai pu trouver ne sont pas très explicites, j'ai décidé de créer mon propre tutorial, qui pourra en aider plus d'un je l'espère.

Pour commencer, règles de bases

Comme en NWScript, le langage D supporte (bien entendu hein) les commentaires, et il y en a deux : les commentaires sur une ligne et sur plusieurs lignes.

Ex:
Code :

// Début du fichier dialogue BAERIE
BEGIN ~BAERIE~
/* Commentaire multiligne
IF ~True()~
THEN BEGIN 0
  SAY ~Bon...bonjour?~
END
*/


Donc :
// jusqu'à un saut de ligne produit un commentaire sur une ligne
/* et */ produisent des commentaires multilignes.

Dans l'exemple, on remarque des "trucs" entre ~ et ~ (alt Gr + 2).

Ces trucs sont analysés différemment selon là où ils sont utilisés.

1. Dans le cas d'une condition d'un IF ou d'une action DO, il s'agit de Scripts. Dans l'exemple, True() renvoie vrai quoiqu'il advienne et on afficherait (s'il n'y avait pas les commentaires) "Bon... bonjour?"

2. Dans le cas où il s'agit de dire quelque chose : il s'agit d'une chaîne de caractères que l'on va afficher afin que le joueur puisse avoir un texte, ici dans l'exemple en commentaire il s'agit de Bon...bonjour.
Cependant, on peut vouloir utiliser un index du fichier TLK (talktable) que vous pourrez lire avec Infinity Explorer (en Delphi) ou encore Near Infinity (en Java, nécessite Java de SUN), dans ce cas il suffit d'écrire # suivi d'un nombre entre 0 et le nombre d'index du fichier TLK. Par exemple : #2260 donne Bonjour, <CHARNAME>. Oncle Quayle m'avait dit que vous reviendriez... (<CHARNAME> = nom du protagoniste, ie: celui qui s'il meurt fait perdre toute la partie).
Aussi, on peut vouloir utiliser un index d'un fichier TRA. (voir plus bas) Dans ce cas, il suffit d'écrire @ suivi d'un nombre représentant un index du fichier TRA (voir plus bas, bis)

Fichiers TRA, qu'est-ce??

Un fichier TRA est un fichier ne contenant que des textes; celui-ci facilite la traduction d'un fichier D (ou d'un script, *.BAF) voici un exemple:
Code :
@0    = ~STARTING 1~
@1    = ~EOF~

Ainsi dans le fichier *.D, écrire @1 reviendra à écrire ~EOF~.

Je vous conseille personnellement de nommer votre fichier D machin-full.D et d'utiliser cette commande :

(déjà faire Exécuter, cmd, puis cd [chemin vers WeiDU])

WeiDU.exe" --traify machin-full --dout "machin.d"

Cela créera un fichier machin.D et un fichier machin.TRA.

Vous n'aurez plus qu'à utiliser le fichier machin.d pour les versions "installables" de vos mod, et le fichier machin-full.D pour travailler dessus simplement (je dis ça, c'est surtout que SAY @0 me dit rien)

Syntaxe

A suivre!
_________________
#nwnights-fr @ irc.darkmyst.org TitanQuest-FR
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Baldurien
L'homme qui chutait sur le macadam
Inscrit le: 12 Sep 2002
Messages: 14066
Localisation: Quadran Alpha
Répondre en citant
Posté le : 26/07/2004 13:34:52 Sujet du message :

Syntaxe D Action

Un fichier D doit comporter une liste de "D Action"; par liste on comprendra 0 ou plusieurs "D Action".

Pour D Action, on comprendra cela : une D Action définit comment WeiDU interagira avec les dialogues de l'Infinity Engine.

D Action que j'ai compris :

1. Création de dialogues
Code :
BEGIN filename [nonPausing]
liste d'états


Crée un dialogue du nom de filename. Si nonPausing est fourni et non nul, alors le dialogue ne mettra pas le jeu en pause comme par défaut. Pour ce qu'est une Liste d'états, voir plus bas.

Ex:
Code :
BEGIN ~MULTIJ~
IF ~Global( "Waiting", "LOCALS", 1 ) !InParty(Myself)~
THEN BEGIN default
   SAY ~On y va ?~
   IF ~~ THEN DO ~SetGlobal( "Waiting", "LOCALS", 0 ) JoinParty()~ EXIT
END


Ceci crée le fichier MULTIJ.DLG avec une certaine liste d'états.

2. Ajout de liste d'états
Code :
APPEND filename
  liste d'états
END


Code :
APPEND MULTIJ
   IF ~Global( "Waiting", "LOCALS", 1 ) !InParty(Myself)~
   THEN BEGIN default
      SAY ~On y va ?~
      IF ~~ THEN DO ~SetGlobal( "Waiting", "LOCALS", 0 ) JoinParty()~ EXIT
   END
END


Ceci va ajouter au fichier MULTIJ (nb: je ne sais pas si les ~ autour sont obligatoires) un nouvel état.

3. Interjection

Une interjection c'est quand un autre NPC parle. Par exemple, Viconia se met à critiquer Aérie (ici, elle a raison) ou Jaheira (là, elle a forcément raison) : INTERJECT nous permet de "changer" de personnage.

On peut décliner l'interjection en deux types : le cas où y en a pas encore, et le cas où y en a une et on veut éviter de couper la parole : imaginez que l'on veuille ajouter un texte entre Viconia et Aérie du genre "Viconia a raison, t'es qu'une pinbêche Aérie".

Une interjection n'a lieu qu'une seule fois

Code :

INTERJECT entryFilename entryLabel globalVariable
/* Liste d'états */
[url=http://www.weidu.org/WeiDU/README-WeiDU.html#chainEpilogue]chainEpilogue[/url]

Code :

INTERJECT_COPY_TRANS entryFilename entryLabel globalVariable
/* Liste chainText*/
END


ie: on va ajouter au fichier entryFilename.DLG après l'état entryLabel (ou plutôt dans l'état je dirais, après avoir fait des tests) qui sera visible que si globalVariable vaut 0.

Exemple avec INTERJECT_COPY_TRANS (qui conserve les transitions, ie: ce que pourra dire le joueur)
Code :
INTERJECT_COPY_TRANS VICONIJ 0 MMViconiaSex
   == VICONIJ
      IF ~Global( "MMInterjectionSex", "GLOBAL", 1 )
            InParty("Viconia")~
      THEN
         ~A ce que je vois, même les chiens de la surface se laissent faire par certaines femelles...~
   == EDWINJ
      IF ~Global( "MMInterjectionSex", "GLOBAL", 1 )
            InParty("Edwin")
            Gender(Myself, Female)~
      THEN
         ~Non, non ... ce n'est pas la même chose. Ici elle vend son corps (qui ne vaut rien comparé à mon nouveau corps de femme!)~
   == KELDORJ
      IF ~Global( "MMInterjectionSex", "GLOBAL", 1 )
            InParty("Keldorn")
            InParty("Edwin")
            Gender("Edwin", Female)~
      THEN
         ~A ce propos, Edwin, cette féminité vous va à ravir... Il faudra songer à vous raser le crâne pour être parée à la mode de Thay, mon épée pourra y faire si vous le voulez!~
END


Pour ce qui concerne ces deux instructions, je commence à m'en servir; avec le temps j'en saurais plus Wink

Note chainText correspond à la syntaxe suivante :

== fileName [IF liste de Trigger (cf plus bas) THEN ] sayText [= sayText[ = sayTexte [...]]

et ce une ou plusieurs fois.

fileName : correspond au nom du fichier où l'on ajoute le texte
IF .. THEN : correspond à une vérification à faire
sayText : voir plus bas
_________________
#nwnights-fr @ irc.darkmyst.org TitanQuest-FR
Dernière édition par Baldurien le 26/07/2004 13:56:02; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Baldurien
L'homme qui chutait sur le macadam
Inscrit le: 12 Sep 2002
Messages: 14066
Localisation: Quadran Alpha
Répondre en citant
Posté le : 26/07/2004 13:52:40 Sujet du message :

Syntaxe D états

Voyons voir la syntaxe d'un état, c'est pas compliqué du tout. Cependant, il vous faudra une connaissance de Bioware Script (dans Bg2, vous trouverez une référence dans le dossier script compiler). Le Bioware Script distingue deux types : les actions, et les triggers. Ceux-ci sont documentés ici pour la plupart, mais je pense ajouter ma surcouche;).

Une action c'est simple : c'est une action que va effectuer le joueur, comme par exemple JumpToPoint([869.340]) pour "sauter" aux coordonnées x: 869, y: 340 de la zone. Un trigger c'est quoi ? C'est simple : c'est un déclencheur. Le Bioware Script utilise une syntaxe assez simplifiée et proche ('fin je trouve) de l'assembleur :

Code :
IF TriggerList THEN
  RESPONSE #100
    ActionList
END


Un trigger renvoie True ou False selon la condition, et bref quoi Smile cf. Tutorial sur Scripts si j'en fais un.

Voici un état :

Code :
IF [ WEIGHT #weightNumber  ] stateTriggerString
[ THEN  ] [ BEGIN  ] stateLabel
  SAY sayText  [ = SayText ...  ]
  transition list
END


Un peu dire non? Voyons :

WEIGHT : littéralement le poids. M'en suis pas encore servi, donc oubliez!
stateTriggerString : une liste de triggers entre ~~ ex: ~True()
!InParty(Myself)~. Peut être vide, mais je crois que cela cache l'état (je l'appelerai certainement noeud), le rendant accessible seulement via GOTO (voir plus bas)

THEN, BEGIN : facultatifs, semble-t'il. Je préfère les mettre Smile

stateLabel : un "truc" qui identifie l'état où on est. Dans la plupart des dialogues de BG2 c'est un nombre, mais ça peut aussi être un identifiant de variable commun genre : "bonjour" ou MMViconiaDialog etc.

Code :
SAY sayText (=
  sayText)*


Le NPC va dire le texte sayText. Si vous rajoutez un signe égal (=) et un autre texte, alors le joueur devra cliquer pour continuer de parler avec le NPC (exemple : NPCs récitant des poèmes). On peut en mettre plus d'un.

sayText est soit un index de tlk, soit un index de fichier TRA, soit un texte littéral. S'il est suivi (le texte littéral, hé!) d'un [fichier son] alors le jeu éxécutera le fichier son associé. m'en demandez pas plus pour le son, je sais pas!


transition list : une liste de réponses que l'utilisateur pourra dire. Cf plus bas.

END : obligatoire
_________________
#nwnights-fr @ irc.darkmyst.org TitanQuest-FR
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 30.526ms