La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 14:05:16
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Baldurien L'homme qui chutait sur le macadam Messages: 14066 Localisation: Quadran Alpha |
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 | |
Baldurien L'homme qui chutait sur le macadam Messages: 14066 Localisation: Quadran Alpha |
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 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 | |
Baldurien L'homme qui chutait sur le macadam Messages: 14066 Localisation: Quadran Alpha |
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 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 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 | |
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