Page 1 sur 1

[DLG] Problèmes divers rencontrés lors de la création d'un dialogue de PNJ

Posté : dim. 01 juil. 2007, 12:48
par Shinook
Voilà un problème que je n'avais pas encore rencontré dans le codage de dialogues.

Pour mon personnage Flora, je voulais la faire interagir avec le Duergar Ilyich qui détient les fameux glands. Ilyich enclenche un dialogue à partir du moment où il détecte le PJ pour la première fois (le PJ n'a pas à venir lui parler donc).

J'ai donc réussi à créer une alternative à ce dialogue, puisqu'à partir de la première réplique d'Ilyich, j'utilise les fonctions EXTEND_BOTTOM et APPEND pour parler sur un dialogue entre lui et Flora, sans que le PJ puisse intervenir ( il avait normalement plusieurs réponses possibles suite à la première réplique d'Ilyich ). Mais bon, pour que ce soit plus clair, voici les parties de code.

Code : Tout sélectionner

EXTEND_BOTTOM ILYICH 0
IF ~InParty("Flora")
      Global("FloIlyich","GLOBAL",0)~ THEN DO ~SetGlobal("FloIlyich","GLOBAL",1)~ EXTERN ILYICH IlyichFlo1
END 

APPEND ILYICH
IF ~~ THEN BEGIN IlyichFlo1 
  SAY ~Tiens tiens, mais ne serait-ce pas une des chères compagnes de notre maître ?~
  IF ~~ THEN EXTERN Flora FloIlyich1
END
Voilà le début du dialogue. Comme vous pouvez le voir, après la première réplique d'Ilyich (non présente ici), il renchaîne sur une autre réplique. Jusque là, ça marche. Cependant, la suite du dialogue que je n'ai pas indiquée ne s'enclenche pas. Normalement, Flora devrait lui répondre, grâce à la fonction APPEND toujours, mais rien ne se passe, le dialogue se termine comme ça.

J'ai essayé différentes façons de procéder (avec CHAIN, ou avec un bloc de dialogue normal pour les répliques de Flora), mais rien non plus.
J'ai aussi remarqué autre chose de bizarre. Dans le tutorial de WeiDU, il faut utiliser normalement la condition "IsValidForPartyDialog("Flora")" plutôt que celle que j'utilise, "InParty("Flora")". Cependant, cette fonction ne semble pas vérifiée dans le jeu, et le dialogue ne s'enclenche donc pas, en remettant à la place les réponses du PJ. Je ne vois pas pourquoi cette fonction ne marche pas, puisque Flora est là lors du dialogue, elle n'est pas morte, rien... et ce dialogue se trouve dans le même fichier .d que les autres dialogues que j'ai déjà codés et qui fonctionnent.
Pour les blocs APPEND de Flora, j'ai essayé les minuscules (Flora) et les majuscules (FLORA) mais ce n'est pas ça... j'ai essayé de mettre une variable pour voir si elle est vérifiée mais ça ne marche pas non plus, le dialogue s'arrête donc à la fin de ma réplique d'Iliych.

Qu'est-ce qui ne marche pas ?

Posté : dim. 01 juil. 2007, 15:43
par Garfield
La commande APPEND ne devrait-elle pas se situer en premier, afin de signaler a weidu que tu colle ce morceaux de code au fichier dialogue de Ilyich?
Sinon:
IF ~~ THEN EXTERN Flora FloIlyich1
"Flora" c'est le nom du fichier de dialogue dans lequel se trouve FloIlyich1?

Posté : dim. 01 juil. 2007, 19:18
par Isaya
L'intérêt de WeiDU est d'éviter d'avoir à se taper des références EXTERN comme tu le fais là. Il y a un bon exemple de ce genre de dialogue dans la documentation WeiDU : partie Tutorials sur INTERJECT. L'exemple de Minsc avec les dryades semble tout à fait comparable à ce que tu veux faire.
Comme disent les anglais, RTFM.

Posté : sam. 28 juil. 2007, 09:43
par Shinook
Bon, juste pour dire que le problème est réglé ( depuis un moment d'ailleurs ^^ ). En fait, il fallait simplement mettre ce dialogue dans le fichier xxxxxxP.dlg du PNJ, que je n'avais pas encore créé, car ce dialogue devait s'enclencher lorsque Flora serait dans le groupe. Maintenant ça marche :) .

Autre problème par contre, que j'avais déjà signalé : pour ces dialogues en question, le trigger "IsReadyForPartyDialog" ne fonctionne pas avec mon PNJ, le dialogue ne s'enclenche pas. Avec un autre trigger comme "InParty" par exemple, ça fonctionne...

Posté : dim. 29 juil. 2007, 18:20
par Isaya
Bonne nouvelle. Juste pour information (pour ceux qui se poseraient la même question), pourrais-tu préciser comment tu as opéré, s'il te plaît ? Merci beaucoup.

Je suppose que tu veux parler de IsValidForPartyDialog ? Car IsReadyForPartyDialog n'existe pas, en tout cas avec les fichiers TRIGGER.IDS d'origine.
Si tu t'es trompé de nom, tu aurais dû au moins avoir un message d'alerte dans le fichier log de WeiDU à la compilation ou à l'installation. As-tu vérifié ?

Dans tous les cas, la meilleure méthode consiste souvent à comparer comment Bioware a codé ça dans le jeu original. On trouve de nombreux usages de IsValidForPartyDialog pour les interventions des PNJ, en particulier lorsque le dialogue vérifie la présence de plusieurs personnages (si plusieurs peuvent intervenir). Mais on trouve aussi InParty, comme dans l'exemple suivant, le dialogue de Ribald pour reconnaître la présence de Mazzy :

Code : Tout sélectionner

InParty("Mazzy")
See("Mazzy")
!StateCheck("Mazzy",STATE_SLEEPING)
Global("RibaldMazzy","LOCALS",0)
J'ignore pourquoi on trouve les deux formes. On pourrait croire que IsValidForPartyDialog est un trigger incluant tous les tests de cet exemple mais IESDP est très peu bavard sur ce trigger.

Posté : lun. 30 juil. 2007, 13:19
par Shinook
Comment j'ai fait ? Bon, reprenons...

Au départ, j'avais tout mis dans le même fichier dialogue, nommé "flora.d", et considéré comme le dialogue associé au personnage "Flora" via CreMaker. Cependant, ce fichier dialogue ne fonctionne que lorsque le personnage est en-dehors du groupe. Autrement dit, on mettra dans ce fichier le dialogue qui permettra de recruter le PNJ.

Donc, comme le dialogue devait avoir lieu après le recrutement du PNJ, ça ne pouvait pas marcher.

A partir du moment où un personnage est recruté, il est doté de plusieurs fichiers dialogues spécifiques ( je prendrai ici l'exemple de mon PNJ, Flora ) : BFLORA.dlg ( pour les banters ), FLORAP ( lorsque le PNJ est renvoyé du groupe ), FLORAJ ( pour les diverses interventions du PNJ en cours de partie ), je dois en oublier un, mais je sais plus lequel.

Suivant ce que je viens de dire, l'intervention de mon PNJ doit être écrite dans un nouveau fichier .d ( qui sera ensuite compilé en .dlg ) que je nomme FLORAJ.d. Et voilà, ça fonctionne... car à partir du moment où le PNJ est recruté, il ne tiens plus compte que de ces fichiers que j'ai cité, le "Flora.d" ne fonctionne donc plus.


Maintenant pour mon autre problème, alors oui c'est bien du "IsValidForPartyDialog" dont je parlais, désolé je me suis trompé en écrivant ^^ . Weidu reconnaît bien le trigger puisqu'il n'y a pas de message d'erreur, c'est dans le jeu que ça ne fonctionne pas. Je me dis que ça a peut-être un rapport avec le fichier .cre, enfin, tant que ça marche avec l'autre trigger, "InParty", ça me va...

Posté : mar. 31 juil. 2007, 19:49
par Isaya
Merci pour les explications que tu as fournies qui sont très intéressantes pour les personnes intéressées par la création d'un PNJ. C'est peut-être une introduction utile au tutorial de xena.

Cela dit, j'aurais dû être plus explicite pour ma demande d'explication. Ton premier message montrait une méthode de modification "à la main" des dialogues n'exploitant pas les capacités un peu avancées de WeiDU qui simplifient ce genre d'ajout. Donc ma question portait plutôt sur le fait de savoir quelle commandes tu avais finalement utilisées : INTERJECT, CHAIN, ... avec éventuellement un extrait de code montrant l'équivalent (a priori beaucoup plus simple) de ce que tu avais montré dans ton premier message. Une sorte de "ne faites pas ça mais plus simplement ceci".

J'ai toutefois une toute petite réserve. L'utilisation des 4 fichiers DLG (au fait, le quatrième, c'est celui qui sert avant le premier recrutement) n'est pas obligatoire mais elle a l'avantage de respecter la convention de nommage mise en place par Bioware. Par ailleurs elle simplifie l'écriture des conditions de déclenchement des différentes répliques (par exemple en évitant d'avoir à traiter la présence dans le groupe) et est donc préférable.
Enfin, il n'y a pas de lien direct entre fichier .D et fichier .DLG. L'ajout par WeiDU des éléments dans l'un ou l'autre des fichiers DLG dépend simplement des instructions BEGIN <nom du DLG> ou APPEND <nom du DLG> qui précèdent les blocs d'arborescence de discussion dans ton fichier .D. Tu peux donc avoir un seul et même fichier .D si tu le souhaites ou au contraire en avoir 10 rien que pour générer le fichier Bxxx (par exemple si ton personnage est très bavard avec les autres membres du groupe et que tu veux éviter d'avoir un fichier .D trop gros). Mais c'est bien plus simple pour t'y retrouver si tu as effectivement un fichier .D par DLG.

Posté : dim. 05 août 2007, 09:53
par Shinook
Je suis d'accord avec ton dernier paragraphe, j'avais dû mal m'exprimer :) .

J'ai simplement utilisé la commande APPEND, comme prévu au départ, parce que INTERJECT et INTERJECT_COPY_TRANS causent quelques petits problèmes embêtants assez difficiles à décrire, mais ce que je peux dire, c'est que dans mon cas, où je cherche à faire intervenir un PNJ alors que normalement le PJ a plusieurs choix de réplique à ce moment, ça fou le bourdel dans le fichier .dlg.

Cependant, je viens de me rendre compte combien il était important de mettre bien ordre les fichiers .d. Par exemple, bien faire attention à mettre tous les dialogues d'un PNJ externe ( en utilisant APPEND ) au même endroit, histoire qu'il n'y ait pas plusieurs fois le même APPEND, sinon certains dialogues peuvent ne pas fonctionner. Il faut aussi mettre les dialogues du PNJ en premier dans le fichier, puis les APPEND et les INTERJECT_COPY_TRANS.

L'utilisation de la commande APPEND n'est finalement pas si compliquée, à partir du moment où comme je l'ai dit il faut s'organiser et organiser proprement le fichier dialogue.