
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.







La date/heure actuelle est 08/04/2025 10:39:48
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Khorgan Ecuyer Messages: 67 |
Bonjour,
Je souhaiterais réaliser une quête dans laquelle un pnj pose des questions auxquelles le pj doit répondre. Seulement je voudrais que ce ne soit pas toujours les même questions. J'ai une liste de 16 questions différentes, et il faudait que le pnj en choisisse 3 parmis ces 16 là. Et bien suril faudait qu'il pose ces 3 questions les unes après les autres, et que dans les 3 questions il n'y ai pas 2 fois la même. Mais je n'ai aucune idée sur comment faire... J'était parti sur quelque chose dans ce genre là : NWScript :
void main() { object oPC = GetPCSpeaker(); string nTestA; string nTestB; string nTestC; int nRandomA = Random(16); switch (nRandomA) { case 1: nTestA = "question 1"; break; case 2: nTestA = "question 2"; break; case 3: nTestA = "question 3"; break; } int nRandomB = Random(16); switch (nRandomB) { case 1: nTestB = "question 1"; break; case 2: nTestB = "question 2"; break; case 3: nTestB = "question 3"; break; } int nRandomC = Random(16); switch (nRandomC) { case 1: nTestC = "question 1"; break; case 2: nTestC = "question 2"; break; case 3: nTestC = "question 3"; break; } } Après je pensais essayer de comparer nTestA, nTestB et nTestC pour vérifier qu'ils sont bien différent mais comment transformer tout en ça en conversation.... Si quelqu'un à une idée... ![]() Merci d'avance ![]() Dernière édition par Khorgan le 06/01/2006 01:37:09; édité 1 fois
|
Revenir en haut | ![]() ![]() ![]() |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Tu fait deux boucles (ou une seule ou tu inclus tout) avec un test du genre
NWScript : Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. _________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Ok merci je vais tester ça
![]() Et pour que le pnj "pose" les questions ? J'ai vu qu'il y avait un NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
mais il faut indiquer le nom d'un dialogue... alors comment "convertir" ce qu'il y a dans le script en dialogue ? |
Revenir en haut | ![]() ![]() ![]() |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
La fonction SetCustomToken
_________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Ivellios a écrit : La fonction SetCustomToken Hmm j'avais peur que tu me répondes ça, j'y avais déjà jeté un oeil mais j'avais pas tout bien compris ![]() J'ai donc pris mon courage à deux mains et j'ai essayé ![]() Je pense avoir à peu près compris cette fois-ci, mais je dois mal faire la boucle dont tu parles. J'ai modifié mon script comme suit : NWScript :
void main() { object oPC = GetPCSpeaker(); string nTestA; string nTestB; string nTestC; string sTokenA = nTestA; string sTokenB = nTestB; string sTokenC = nTestC; string sTokenRa = ""; string sTokenRb = ""; string sTokenRc = ""; string sTokenRd = ""; string sTokenRe = ""; string sTokenRf = ""; string sTokenRg = ""; string sTokenRh = ""; string sTokenRi = ""; int nRandomA = Random(16); switch (nRandomA) { case 1: nTestA = "question 1"; break; case 2: nTestA = "question 2"; break; case 3: nTestA = "question 3"; break; } int nRandomB = Random(16); switch (nRandomB) { case 1: nTestB = "question 1"; break; case 2: nTestB = "question 2"; break; case 3: nTestB = "question 3"; break; } int nRandomC = Random(16); switch (nRandomC) { case 1: nTestC = "question 1"; break; case 2: nTestC = "question 2"; break; case 3: nTestC = "question 3"; break; } while(nTestA == nTestB) { nRandomB = Random(16); } while(nTestA == nTestC) { nRandomC = Random(16); } while(nTestC == nTestB) { nRandomC = Random(16); } SetCustomToken(100,sTokenA); SetCustomToken(101,sTokenB); SetCustomToken(102,sTokenC); SetCustomToken(200,sTokenRa); SetCustomToken(201,sTokenRb); SetCustomToken(202,sTokenRc); SetCustomToken(203,sTokenRd); SetCustomToken(204,sTokenRe); SetCustomToken(205,sTokenRf); SetCustomToken(206,sTokenRg); SetCustomToken(207,sTokenRh); SetCustomToken(208,sTokenRi); } Dans mon dialogue ça donne un truc de ce genre : [PROPRIETAIRE]Commençons les questions |__ d'accord (<= ici il y a le script ci-dessus en "Actions Conséquentes") |___[PROPRIETAIRE]<CUSTOM100> |____<CUSTOM200> |____<CUSTOM201> |____<CUSTOM202> |____<CUSTOM203> (etc.. bref l'ensemble des réponses possibles) Et quand je le teste, les réponses apparaissent correctement, mais la question n'apparait pas ! Il n'y a rien, comme si la phrase était invisible... (précision : je viens de tester en supprimant les boucles et ça me fait toujours la même chose) J'ai du faire une grosse bourde quelque part mais quoi et où ? ![]() Et j'aurais une question supplémentaire : comme les questions seront aléatoires, comment rattacher les réponses aux questions ? Merci d'avance ![]() |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Salut Khorgan, juste quelques questions (si j'ose dire !).
Que se passe-t-il si le joueur donne la mauvaise réponse ? Est-ce qu'on lui repose les questions depuis le début ? (Les mêmes ou d'autres ?) Le dialogue s'arrête-t-il ? Le PNJ pose-t-il les questions jusqu'au bout si le joueur se trompe pour lui dire à la fin que une, deux ou trois réponses sont fausses ? Ou bien ton PNJ tel le Sphinx de la mythologie dévore-t-il l'ignorant ? A plus tard ! |
Revenir en haut | ![]() ![]() ![]() |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Pour la boucle place là avant de choisir quel nombre tu va choisir dans les switchs (et par la même occasion je trouve mieu de comparer les nombres au lieu des questions elle même).
_________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Ivelios : ok je vais tester en mettant la boucle avant. Quand tu dis de comparer les nombres, tu veux dire que je devrais la mettre plutôt comme ça ? :
NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Enki a écrit : Salut Khorgan, juste quelques questions (si j'ose dire !).
Ben fait oui je pensais faire comme ça : à chaque mauvaise réponse, le PNJ dit que c'est une erreur et le PJ doit recommencer (toujours avec les questions aléatoires)
Que se passe-t-il si le joueur donne la mauvaise réponse ? Est-ce qu'on lui repose les questions depuis le début ? (Les mêmes ou d'autres ?) Le dialogue s'arrête-t-il ? Enki a écrit : Le PNJ pose-t-il les questions jusqu'au bout si le joueur se trompe pour lui dire à la fin que une, deux ou trois réponses sont fausses ? ![]() ![]() Merci à vous 2 de vous pencher sur mon problème ![]() |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Salut Khorgan,
Bon j'ai trouvé une solution à ton problème. A mon avis, la solution d'Ivellios est la meilleure. Mais probablement pas la plus simple. Ce que je vais te proposer est satisfaisant à 90%. Il y a juste un petit hic, pas très gênant à mon avis, mais je n'ai pas réussi à faire autrement, et je n'ai malheureusement plus beaucoup de temps (ces jours-ci en tout cas). Tu verras si tu peux t'en accomoder. Ma démarche est très différente de celle que vous avez adopté. Au lieu de faire un script compliqué avec des CustomTokens, j'ai fait un dialogue avec plusieurs petits scripts tout simple et quelques variables. En fait des variables de type int : - une variable "random" que jai mis sur le joueur. Cette variable prend une valeur de 1 à 16 de façon aléatoire. - Une variable "reponse" qui sert à savoir combien de réponse juste à donné le joueur. - 16 variables "question1" pour la question 1, "question2" pour la question 2, etc... Pour savoir si la question numéro X a été posé au joueur. J'ai un fait un dialogue très simple pour tester mes scripts. Il faut que tu en respectes la structure de base, mais le reste est à ta discrétion : Bonjour, j'ai trois questions à vous poser. |__________Allez-y ! * |__________________Question 1 ? ** |____________________________réponse 1-1 (bonne) *** |____________________________________ Bravo, bien jouer ! fin du dialogue. **** |____________________________________ J'ai encore 1 question ! ***** |______________________________________________ Allez-y ! > on fait un coller an tant que lien de la branche N°2) |____________________________________ J'ai encore 2 questions ! ****** |______________________________________________ Allez-y ! > on fait un coller an tant que lien de la branche N°2) |____________________________réponse 1-2 (mauvaise) |____________________________________ Perdu ! |____________________________réponse 1-3 (mauvaise) |____________________________________ Perdu ! |__________________Question 2 ? ** |____________________________réponse 2-1 (bonne) *** |____________________________réponse 2-2 (mauvaise) |____________________________réponse 2-3 (mauvaise) |__________________Question 3 ? etc jusqu'à 16 ! Mais il y a une 17e branche ! |__________________Humm, hum, un instant ! |____________________________ Allez-y ! > (on fait un coller an tant que lien de la branche N°2) La 17e branche est très importante, c'est ça l'inconvénient dont je parlais tantôt. * Sur la 2e branche ("Allez-y !") je mets ce script dans les conséquences : NWScript :
void main() { object oPC=GetPCSpeaker(); int iRandom=Random(16)+1; SetLocalInt(oPC,"random",iRandom); } Il génère de façon aléatoire une variable sur le PC qui sera testé dans branches suivantes. ** Sur la question 1, dans les conditions je mets cela : NWScript :
int StartingConditional() { object oPC=GetPCSpeaker(); int iRandom=GetLocalInt(oPC,"random"); if(iRandom != 1) return FALSE; { if (GetLocalInt(oPC,"question1") != 0) /// c'est cette variable qui change selon les scripts "question1" pour le script 1, "question2" pour le script 2, etc... return FALSE; SetLocalInt(oPC,"question1",1); return TRUE; } } Dans les conditions de la question 2 ceci : NWScript :
int StartingConditional() { object oPC=GetPCSpeaker(); int iRandom=GetLocalInt(oPC,"random"); if (GetLocalInt(oPC,"question2") != 0) return FALSE; { if(iRandom != 2) return FALSE; SetLocalInt(oPC,"question2",1); return TRUE; } } Et ainsi de suite pour les 16 questions. Donc 16 petits scripts sur lesquels ne change qu'un simple numéro et une variable. *** Sur chaque bonne réponse, mets ce script dans les conséquences : NWScript : Cela permet de savoir combien de bonne réponse le joueur a donné, et si le PNJ doit lui poser encore une question.
void main() { int nReponse=(GetLocalInt(GetPCSpeaker(), "reponse")); nReponse++; SetLocalInt(GetPCSpeaker(), "reponse",nReponse); } **** Sur "Bravo, bien jouer !" mets ce script dans les conditions : NWScript :
int StartingConditional() { // Inspecter variables locales if(!(GetLocalInt(GetPCSpeaker(), "reponse") == 3)) return FALSE; return TRUE; } ***** Sur " il me reste 1 question ! " toujours dans les conditions : NWScript :
int StartingConditional() { // Inspecter variables locales if(!(GetLocalInt(GetPCSpeaker(), "reponse") == 2)) return FALSE; return TRUE; } ****** Sur " il me reste 2 questions ! " toujours dans les conditions : NWScript :
/////// int StartingConditional() { // Inspecter variables locales if(!(GetLocalInt(GetPCSpeaker(), "reponse") == 1)) return FALSE; return TRUE; } En plus, uniquement pour le tester, tu peux mettre ce script sur les conséquences de "Bravo, bien jouer !" : NWScript :
void main() { object oPC=GetPCSpeaker(); DeleteLocalInt(oPC,"question1"); DeleteLocalInt(oPC,"question2"); DeleteLocalInt(oPC,"question3"); DeleteLocalInt(oPC,"question4"); DeleteLocalInt(oPC,"question5"); DeleteLocalInt(oPC,"question6"); DeleteLocalInt(oPC,"question7"); DeleteLocalInt(oPC,"question8"); DeleteLocalInt(oPC,"question9"); DeleteLocalInt(oPC,"question10"); DeleteLocalInt(oPC,"question11"); DeleteLocalInt(oPC,"question12"); DeleteLocalInt(oPC,"question13"); DeleteLocalInt(oPC,"question14"); DeleteLocalInt(oPC,"question15"); DeleteLocalInt(oPC,"question16"); DeleteLocalInt(oPC,"reponse"); } Il efface les variables afin de recommencer le dialogue au début. Bon, je suis désolé ce n'est pas terminé. Mais je n'ai pas eu le temps de faire plus ou de mettre plus d'explications. Si tu te couches tard, on se croisera peut-être ce soir ! N'hésites pas à donner ton avis ! |
Revenir en haut | ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Merci beaucoup Enki, juste quelques précisions :
1) je suppose que pour chaque question je dois reproduire ce schéma : |__________________Question X ? ** |____________________________réponse X-1 (bonne) *** |____________________________________ Bravo, bien jouer ! fin du dialogue. **** |____________________________________ J'ai encore 1 question ! ***** |______________________________________________ Allez-y ! > on fait un coller an tant que lien de la branche N°2) |____________________________________ J'ai encore 2 questions ! ****** |______________________________________________ Allez-y ! > on fait un coller an tant que lien de la branche N°2) |____________________________réponse X-2 (mauvaise) |____________________________________ Perdu ! |____________________________réponse X-3 (mauvaise) |____________________________________ Perdu ! 2) question bête mais... suis-je obligé de mettre toujours la bonne réponse en 1ere position ? (je pense que non mais je préfère demander ^^) 3) tu parles d'une 17eme branche très importante.... quelle est-elle ? Voilà et encore merci pour tout le travail que ça représente ![]() |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Salut Khorgan !
Bien sûr que tu peux mettre la bonne réponse où tu veux, ce serait trop facile sinon ! la 17e branche est celle-ci : |__________________Humm, hum, un instant ! avec en lien un retour sur la réponse du joueur : |____________________________ Allez-y ! > (on fait un coller an tant que lien de la branche N°2) Cette branche est importante dans le cas où le joueur tomberait lors de sa deuxième question ou sa troisième sur une question déja posée. Si tu ne mets pas cette "branche" (sans aucune condition) le dialogue s'arrête et le joueur doit le recommencer depuis le début pour faire un nouveau tirage aléatoire. |
Revenir en haut | ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Ok je teste tout ça et je te tient au courant
![]() |
Revenir en haut | ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Enki : Bon j'ai testé tes scripts
![]() Apparament ça fonctionne bien sauf que.... à chaque fois que je clique sur "Allez-y" le dialogue s'arrête ![]() J'ai vérifié et je pense avoir tout bien mis les script comme tu le prescrit, mais vu la taille énorme de mon fichier de dialogue j'ai pu zapper quelque chose... |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Salut, cette erreur peut avoir deux causes à mon avis.
la première : ton dialogue a-t-il bien cete allure : Salut, j'ai des questions : |____________ Allez-y ? |______________________Question 1 |______________________Question 2 |______________________Question 3 |______________________Question 4 |______________________Question 5 |______________________Question 6 |______________________Question 7 |______________________Question 8 |______________________Question 9 |______________________Question 10 |______________________Question 11 |______________________Question 12 |______________________Question 13 |______________________Question 14 |______________________Question 15 |______________________Question 16 |______________________ Humm, humm, un instant... (ici aucun script) |_________________________________ Allez-y ! La deuxième cause possible à mon avis c'est que tu as oublié une variable ou que tu t'es trompé dans les numéros : revérifie TOUS tes scripts. Sinon, je t'ai envoyé un MP, à toi de voir. |
Revenir en haut | ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Oui mon fichier a bien cette allure là...
Je te répond par MP ^^ |
Revenir en haut | ![]() ![]() ![]() |
Khorgan Ecuyer Messages: 67 |
Problème résolu en MP : en fait j'avais "coller" les "allez-y" au lieu de les "coller en tant que lien"
![]() Merci Enki pour ton aide ![]() |
Revenir en haut | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
J'ai fait un module de demo utilisant SetCustomToken. Je l'ai envoyé à Khorgan, mais si quelqu'un d'autre est interessé c'est là : demo.
|
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Chapeau-bas pour ton module, Sith Vicious, où l'on voit trés clairement la puissance de la fonction SetCustomToken. Les explications que tu donnes ponctuellement m'ont permis de mieux comprendre l'utilisation d'une telle fonction.
Merci, et à bientôt ! |
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