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 21:28:53
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 |
L'Erudit Seigneur Messages: 167 |
Voilà, j'ai construit un petit système pour ajouter des phrases à tel ou tel PNJ, et à les lui faire dire selon certaines circonstances, de manière aléatoire parmi un choix de plusieurs phrases.
Au départ, je faisais ca pour un mendiant qui demandait la charité, pusi je me susi dit pourquoi aps l'étendre à tous les PNJ que je souhaite faire intervenir. Comme le script faisait appel à des mêmes données, j'ai voulu faire un unique script pour tosu les PNJ. Pour l'instant j'en ai ajouté 2. Il y a aussi un script qui contient toutes les phrases. J'aimerais que vous m'aidiez, si possible, à optimiser ce système. Peut être que j'ai fais trop compliqué, ou peut être qu'il ya des meilleures méthodes pour le scripter, via des fonctions que je ne connapitrais pas. Merci beaucoup. J'attends vos commentaires ! P.S.: je n'ai pas mis de commentaire sur le script (flemme), mais si vous en voulez pour plus de clarté, demandez moi. NWScript :
string sMendicite_01 = "* Cet homme vous regarde faiblement, tout en grelotant. Apres quelques instants, il tend machinalement la main vers vous *"; string sMendicite_02 = "J'ai si faim... S'il vous plait, aidez moi !"; string sMendicite_03 = "* Ce mendiant semble en piteux etat *"; string sMendicite_04 = "Je vous en prie ! *Affiche un regard implorant * Aidez moi !"; string sMendicite_05 = "* La main tendue, le corps immobile, ce pauvre homme semble a moitie mort *"; string sMendicite_06 = "* Long rale * Je meurs... Aidez moi !"; string sAristocrate_01 = "* Air meprisant * Qui etes vous?!"; string sAristocrate_02 = "N'approchez pas, vermine !"; string sAristocrate_03 = "* D'un air hautain * Ne devriez vous pas etre en train de nettoyer, hum?"; NWScript : #include "phrases" void main() { object oPJ = GetLastPerceived(); if (!GetIsPC(oPJ)) return; string sPNJ = GetTag(OBJECT_SELF); int nNombre = GetUserDefinedEventNumber(); if (nNombre == 1002 || 1004) { vector vPJ = GetPosition(oPJ); SetFacingPoint(vPJ); int n = Random(2); switch (n) { case 0: return; break; case 1: { if (sPNJ == "Mendiant") { int n = Random(6); switch (n) { case 0: SpeakString(sMendicite_01); break; case 1: SpeakString(sMendicite_02); break; case 2: SpeakString(sMendicite_03); break; case 3: SpeakString(sMendicite_04); break; case 4: SpeakString(sMendicite_05); break; case 5: SpeakString(sMendicite_06); return; } } if (sPNJ == "Aristocrate" && nNombre == 1004) { int n = Random(3); switch (n) { case 0: SpeakString(sAristocrate_01); break; case 1: SpeakString(sAristocrate_02); break; case 2: SpeakString(sAristocrate_03); return; } } } } } } |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Bonjour, l'Erudit !
Ton système à l'air très bien, personnellement, je ne vois pas de moyen de l'optimiser, si tu en entends par là de le réécrire de façon plus simple. J'ai juste un question à la ligne : 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. Pourquoi mets-tu un return; ? Un break n'aurrait-il pas été suffisant ? idem pour cette ligne : NWScript :
case 0: return; break; Sinon, sans nécessairement le changer beaucoup, tu pourrais rajouter quelques animations. Je te suggère : - De faire en sorte que le mendiant parle de façon implorante ou à genou pour prier. - Que ton Aristocrate soit arrogant lorsqu'il parle. - S'il y a des PNJs qui croisent le mendiant, cela serait sympa s'ils réagissaient à certaines phrases du type : "Tenez monsieur, voilà un pièce !" ou bien : "Quel scandale que l'on laisse des créatures aussi sales se promener dans cette ville ! ". Avec la fonction SetListenPattern();. Voilà, et au fait, bienvenu sur ce Forum ! |
Revenir en haut | |
L'Erudit Seigneur Messages: 167 |
Salut!
Tout dabord merci pour tous ces conseils, je vais répondre à chacune de tes remarques. Pour l'optimisation, je pensais aux lourds et pas toujours appropriés copier/coller, que je suis obligé de faire pour ajouter des strings différents, pour chaque phrase. Mais bon, peut être que je me prends la tête pour rien ! Pour le return; en fait au moment où j'ai fait le script (très tard), je pensais que cela stoppait net l'exécution de la fonction. Et je pensais ainsi, éviter au script de parcourir toute la listes des PNJ (qui vont augmenter vite), lorsque celui-ci était trouvé. Mais je crois que j'ai un peu surestimé cette fonction, qui retourne juste une valeur, içi, rien du tout, si j'ai bien compris. Mais pour le break, je crois qu'il est optionnel. En effet, supposons que n=5, donc le script passe directement à la case: 5, or celle-ci est la dernière, donc inutile de breaker ! Pour le reste, j'aime beaucoup tes idées, et je vais développer tout ça. Des animations, des dialogues, des interactions, il faut de tout pour faire un monde de PNJ vivant. Quant à la fonction SetListenPattern(), j'ai du lire quelquechose à ce sujet sur Jol, mais j'avoue n'avoir rien compris à ce qui s'y disait. Si tu as le smoyens de m'expliquer cette fonction, je suis tout ouïe ! |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Pour le SetListenPattern(); , c'est assez simple et très utile.
Par exemple : Tu mets dans le script onSpawn du PNJ qui passe devant le mendiant : NWScript :
SetListenPattern(OBJECT_SELF, "J'ai si faim... S'il vous plait, aidez moi !", 500); SetListenPattern(OBJECT_SELF,"* La main tendue, le corps immobile, ce pauvre homme semble a moitie mort *", 501); juste en dessous, par exemple, de : 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.
et tu enlèves les commentaires de cette ligne : NWScript :
// SetSpawnInCondition(NW_FLAG_ON _DIALOGUE_EVENT); Ensuite, dans le script OnUserDefined de ce PNJ, tu places : NWScript :
void main() { int nUser = GetUserDefinedEventNumber(); if(nUser == 1004) { object oTricheur = GetLastSpeaker(); int nMatch = GetListenPatternNumber(); switch (nMatch) { case 500: // "J'ai si faim... S'il vous plait, aidez moi !" if (GetAlignmentGoodEvil(OBJECT_SELF)== ALIGNMENT_GOOD) { SpeakString(""); } else { SpeakString(""); } break; // "* La main tendue, le corps immobile, ce pauvre homme semble a moitie mort *"; case 501: SpeakString( ""); break; } } } Ce qui a pour effet que lorsqu'un PNJ d'alignement Bon, entend la phrase /500/, il donne une pièce au mendiant (ou du moins il le dit, à toi de personnaliser un peu plus). S'il entend la phrase /501/, il dit "Quel scandale etc..." . Tu peux rajouter toutes les actions, animations, commentaires que tu juges utiles, d'autres conditions, etc ... Ce que tu peux faire également, c'est créer une boucle sur le script OnEnter de ta zone pour que TOUS les PNJs de ta zone puissent réagir à ces patterns, y compris les HenchMen. Ce qui peut renforcer le coté Rôle Play de ton module. En outre, je te conseille de regarder le Post (Scripts de tavernes), dans le quel je présente pour une scène assez simple une utilisation des Patterns. Voilà, à bientôt ! |
Revenir en haut | |
L'Erudit Seigneur Messages: 167 |
Super merci beaucoup pour cette lesson Enki, je vais regarder de plus près et essayer par moi même.
C'est ce post qui m'avait un peu décontenancé ! |
Revenir en haut | |
BenGorre Légende vivante Messages: 301 |
Bonjour bonjour,
Première chose: return n'est pas une fonction mais une commande une fonction est caractérisé par ses parentheses. Deuxième chose: return ne fait pas que retourner une valeur, il arrête en effet la fonction comme tu le pensais au départ. Troisième chose: Il ya moyen d'optimiser par rapport au nombre de variable, il est fort conseiller d'utiliser le moins de variable possible car pour chaque variable un emplacement mémoire est réservé. Pour ce faire tu fais qu'une variable et tu rentre ta phrase dedans dans ton switch exemple: NWScript :
string sPhrase; int nDice = d3(); switch(nDice) { case 1: sPhrase="Salut";break; case 2: sPhrase="Bonjour";break; case 3: sPhrase="Hum!";break; default: sPhrase="";break; } SpeakString(sPhrase); ce qui me permet de parler d'une dernière chose. Quatrième chose: break force à sortir de la boucle il peut aussi être utiliser dans un while ou un for pour sortir à un instant donné. Il n'est pas obligé de mettre un break à chaque ligne d'un switch mais si on n'en met pas il passe à la case d'après. Info: le default est une case qui sera sélectionner dans tous les autres cas. Sinon je trouve que c'est une très bonne idée. _________________ La mort n'est rien seul le fait de mourir est terrible Henry Fielding 1745 Le serveur Filandre a été stoppé pour le moment, je on travail à la conversion vers NWN2. |
Revenir en haut | |
L'Erudit Seigneur Messages: 167 |
Merci BenGore pour ces informations !
Comme toi, j'aimerais utiliser moins de variables mais je ne crosi pas que ce soit possible dans mon cas. En effet, j'ai deux scripts l'un contient tous les strings et l'autre se charge de gerer les comportements des PNJs. De plus, imagine que je souhaite associer a une phrase, une reponse particuliere, ce n'est pas possible sans les variables. Mais comme elles ne servent que pour le script, prennent elles tant de ressources? Enfin, j'envisage de faire un script général, et pas seulement pour ma propre utilisation avec des phrases préconcues, donc je ne vois pas comment faire autrement que d'utiliser des variables locales. Mais peut etre qu'il exist eune autre solution que je ne connais pas? (J'ai des problèmes avec la connexion: -> AOL donc, mes reponses peuvent tarder) |
Revenir en haut | |
L'Erudit Seigneur Messages: 167 |
Au fait, je me demandais, s'il était possible de convertir un integer en un texte (pas un string), en gros:
NWScript : 01 -> O1 |
Revenir en haut | |
BenGorre Légende vivante Messages: 301 |
|
Revenir en haut | |
L'Erudit Seigneur Messages: 167 |
Alors en fait ce que j'ai dit n'est vraiment pas très clair. Tout ce que je sais, c'est qu'il n'y a pas de solution que je puisse envisager, en tout cas je n'en vois vraiment pas de cette manière, ou alors il faut contourner d'une autre manière que je ne connais pas non plus.
Ce que je souhaitais, pour exprimer précisément mon idée, c'était de convertir un integer en caractère, comme ceux que j'ecris en ce moment, mais pas ceux d'un string "...". Exemple: NWScript :
string sBla_1 = "..."; string sBla_2 = "..."; srting sBla_3 = "..."; int n = Random(3); SpeakString(sBla_n); Bien entendu, vous comprenez que ce n'est pas possible ainsi. De toute façon, après maintes discussion avec un éminent scripteur, il s'est avéré que l'utilisation d'un tel système ne serait pas utile. En définitive, je n'en ai plus besoin, et je ne pense pas que quiconque en ait besoin ! C'est donc, un vrai faux problème ! Désolé pour le dérangement ... |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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