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 21:28:53


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 17/01/2006 04:45:45 Sujet du message : Interactivité + phrases

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 Smile!

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?";
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.


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;
                }
                }
              }
      }
      }
}
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.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 17/01/2006 11:56:49 Sujet du message : Mendicité

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 :
case 5: SpeakString(sMendicite_06); return;
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;
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 17/01/2006 14:23:07 Sujet du message :

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 Smile !

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 Laughing !

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 Smile !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 17/01/2006 14:59:25 Sujet du message :

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);
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.


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);
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.


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;
}
}
}
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 17/01/2006 15:24:09 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
BenGorre
Légende vivante
Inscrit le: 12 Fév 2004
Messages: 301
Répondre en citant
Posté le : 17/01/2006 22:22:25 Sujet du message :

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);
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 18/01/2006 12:12:53 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 18/01/2006 12:13:16 Sujet du message :

Au fait, je me demandais, s'il était possible de convertir un integer en un texte (pas un string), en gros:

NWScript :
01 -> O1
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.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
BenGorre
Légende vivante
Inscrit le: 12 Fév 2004
Messages: 301
Répondre en citant
Posté le : 18/01/2006 20:04:21 Sujet du message :

Bonjour bonjour,

Comment ça en un texte ça n'existe pas le type texte, pour toi c'est quoi?
_________________
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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 18/01/2006 22:11:43 Sujet du message :

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);
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.

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 Laughing!
C'est donc, un vrai faux problème Very Happy !

Désolé pour le dérangement Embarassed...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé 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 72.283ms