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 20:53:51


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
whiteange
Novice
Inscrit le: 03 Juil 2003
Messages: 11
Répondre en citant
Posté le : 24/11/2003 18:10:23 Sujet du message : Problème avec les variables

Bonjour à tous,

Je débute en script NVWS et je me trouve confronter à une difficulté au niveau de la gestion des variables.
Le contexte :
UN NPC possède deux dialogues (inscrit sous root dans cet ordre) :
1 - Le premier dialogue concerne la récompense pour la quete : diag1
2 - Le deuxième dialogue concerne une question debouchant sur 2 reponses possibles de la part du PJ :
2a - Je prends la quete qui consite a tuer un monstre (diag2a)
2b - le NPC me remercie (diag2b)
2c - Je pose une question (diag2c)
================
Ce qui fais que :

diag1 ne s'excute que si GetLocalInt(GetPCSpeaker(),"QUETE") == 2, puis initalise cette valeur à 3 (3=Effectue, plsu possible de la faire)

diag2a ne s'execute que si GetLocalInt(GetPCSpeaker(),"QUETE") =/= 1 et =/=2 et =/=3

diag2b initialise SetLocalInt(GetPCSpeaker(),"QUETE",1)
diag2c n'itialise rien
================
Conséquence :
Lorsque je parle avec le NPC il n'y a pas de soucis, le diag2 n'apparait qu'une fois s'il est selctionne, et n'apparait plus après.
================
Ensuite je vais tuer mon monstre qui se trouve dans une autre zone, et dans le script onDeath, j'initialise QUETE à 2 de la même façon que précedemment.
================
Je reviens voir mon NPC et là rien du tout Sad

==========================
==========================
Je pense qu'il y a donc un problème de variable, mais je ne sait pas comment le résoudre, et quelqu'un a t'il une solution plus simple que la façon dont je fais les tests pour connaitre l'etat de la quete, car j'ai l'impression que c'est une soupe infame de script Smile


Merci à tous Very Happy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 24/11/2003 19:35:03 Sujet du message :

Reporte toi à ce topic :

[http]

...qui a été fait tout exprès pour ce genre de chose.
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
Dernière édition par finipe le 25/11/2003 06:55:56; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
whiteange
Novice
Inscrit le: 03 Juil 2003
Messages: 11
Répondre en citant
Posté le : 24/11/2003 20:52:13 Sujet du message :

Hum oui ,j'ai lu ce sujet, j'ai exactement celà dans mes definitons, mais le résultat ne donne pas la chose attendue : Sad :

Donc, j'aimerais avoir si quelqu'un aurait une idée du pourquoi du comment ?

Je viens de faire un test dans la case OnDeath ou se trouve un script par defaut (pour un monstre), j'ai inclut ceci (c'est qd ce monstre meurt que QUETE devient = à 2) :

NWScript :
#include "x0_i0_spawncond"

void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
//Inclusion
  if(GetLocalInt(GetPCSpeaker(), "QUETE") == 1)
  {
    SetLocalInt(GetPCSpeaker(), "QUETE", 2);
  }
//Fin d'Inclusion
    if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        object oKiller = GetLastKiller();
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }
    int nQuete = GetLocalInt(GetPCSpeaker(), "QUETE");
//Ajout de ActionSpeak
    ActionSpeakString(IntToString(nQuete));
//Fin Ajout

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


==> J'obtient 0 au lieu de la valeur attendue 2, alors que puisque dans mon dialogue initiale avec le NPC QUETE est initialisée à 1 puisque je ne peut plus choisir cette option dans les dialogues.
Sad

EDIT de finipe : pense à utiliser les balises de code pour tes scripts, sinon on comprend rien
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 25/11/2003 07:05:12 Sujet du message :

Donne plus de précision et de manière plus claire, car il est évident que tu as fait une erreur quelquepart... vérifie bien les erreurs habituelles :

- script dans action conséquente/condition d'utilisation ?
- ordre des phrases dans le dialogue ?
- égalité/inégalité de variable non exacte ?
- ...

Difficile de te dire d'où vient ton erreur avec ce que tu donnes comme indice.
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
whiteange
Novice
Inscrit le: 03 Juil 2003
Messages: 11
Répondre en citant
Posté le : 25/11/2003 07:47:34 Sujet du message :

Oki doki, désolé pour le peu d'inidce, alors je reprends Smile
-Voici le dialogue pour la quête dans l'odre exacte et les conditions :
Première partie (condition, consequence)
NWScript :
int StartingConditional()
{

    // Inspecter variables locales
    if(!(GetLocalInt(GetPCSpeaker(), "QUETE") == 2))
        return FALSE;

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

NPC : Merci Jeune Aventurier. Voici votre récompense [FIN]
NWScript :
void main()
{
   
    SetLocalInt(GetPCSpeaker(), "QUETE", 3);

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


(Suite du dialogue )
NPC : Bonjour Jeune aventurier, que puis je pour vous ?
(Deuxième partie, condition pour le dialogue du PJ)
NWScript :
int StartingConditional()
{

    // Inspecter variables locales
    if(!(GetLocalInt(GetPCSpeaker(), "QUETE") != 1))
        return FALSE;
    if(!(GetLocalInt(GetPCSpeaker(), "QUETE") != 2))
        return FALSE;
    if(!(GetLocalInt(GetPCSpeaker(), "QUETE") != 3))
        return FALSE;

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

PJ : Auriez vous une tache ?
NPC : Oui, figure vous que .... [FIN] (Action conséquente ci dessous)
NWScript :
void main()
{
   
    SetLocalInt(GetPCSpeaker(), "QUETE", 1);

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

(Suite dialogue)
PJ : Ou suis je ?
NPC : Blablablabla .... [FIN]

==========
Je tue le monstre (voir script de mort du monstre plus haut)
Je revient, et là rien.

Merci de ton aide
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
whiteange
Novice
Inscrit le: 03 Juil 2003
Messages: 11
Répondre en citant
Posté le : 25/11/2003 11:02:54 Sujet du message :

suite du post Smile

Je vient de faire un test avec l'affichage des variables :
Le NPC affiche à la fin de chaque dialogue la valeur de QUETE, elle se trouve toujours à 1 quand j'ai selectionne la quete a faire.

Lorsque je tue le monstre, la variable est à 0

Lorsque je revient au NPC, la variable est à 1

Voilà Smile Merci de votre aide.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 25/11/2003 15:14:52 Sujet du message :

Bon alors déjà, dans ton script onDeath du monstre, essaye de remplacer les GetPCSpeaker() par des GetLastKiller()... Ton GetPCSPeaker ne renvoie à rien dans un script de onDeath, et donc il est normal qu'une fois le monstre tué, ta variable locale soit toujours à 1.

C'est une erreur bête et basique que je fais moi-même encore souvent, fais bien attention à ce qui définit l'objet porteur de ta variable. Pour être sûr de pas te tromper, mets la sur le module avec un GetModule(), comme ça c'est valable partout.
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
whiteange
Novice
Inscrit le: 03 Juil 2003
Messages: 11
Répondre en citant
Posté le : 25/11/2003 16:15:17 Sujet du message :

Tout d'abord merci Smile Effectivement en mettant GetLastKiller celà fonctionne Smile

Euh GetModule() ? si tu as le temps, explique moi ce que tu veut dire par là . Je suis un peu noob Smile

Sinon donc tout marche sauf que maintenant le NPC reste bloquer sur le dialogue "Merci ...", alors qu'il ne devrait plus le dire la seconde fois que je l'interroge Smile

Enfin bon je vais chercher le pourquoi du comment, merci encore Wink
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
whiteange
Novice
Inscrit le: 03 Juil 2003
Messages: 11
Répondre en citant
Posté le : 25/11/2003 17:06:50 Sujet du message :

Pour ceux que celà interesserait, voici la réponse :
Quand le NPC remercie, j'avais mis dans action conséquente QUETE à 3 ce qui faisait qu'il ne pourrait plus la faire, mais cette valeur n'était pas prise en compte et je restai à 2.

J'ai donc rajouter, un dialogue PJ, qui lorsqu'il est sélectionné a pour action conséquente de mettre QUETE à 3. Et là celà fonctionne.

Peut être y a t'il une solution plus simple, mais je ne voit pas laquelle.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 25/11/2003 23:01:25 Sujet du message :

GetPCSpeaker() renvoie le joueur dans un script de conversation. Tu stockes donc dans ces cas là la valeur de ta variable locale sur l'objet joueur. Il est donc logique que pour récupérer la valeur de ta variable ensuite, il faut que tu la cherches sur le joueur : tout dépendra donc à quel endroit se situe ton script pour récupérer la valeur. Si c'est toujours dans une converstion, pas de problème, tu gardes GetPCSpeaker(). Par contre, si c'est sur un déclencheur par exemple, tu utiliseras plutôt GetEnteringObject(). Si c'est sur le onDeath d'une créature, tu utiliseras GetLastKiller(). Etc.

Mais tu peux stocker ta variable sur plein d'autres choses, et tout bêtement sur le module lui-même. Dans ce cas là, tu n'as qu'à utiliser un GetModule(), ça marche quelque soit l'endroit où tu l'utilises.

L'endroit où tu stockes ta variable (le module, le joueur, un objet autre quelconque - placeable ou npc par ex. -) est à définir selon ce que tu veux faire et selon ton module. Si tu fais un module solo, stockes tes variables sur le module lui-même c'est plus simple. A partir du moment où tu as plusieurs joueurs, ça devient différent : selon que tu stockes sur le module ou sur le joueur, ta variable aura des conséquences différentes.

Ca paraît tout bête, mais finalement ça a beaucoup d'implications, mais surtout d'avantages ! Une variable bien placée peut faire gagner un temps précieux Very Happy
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur 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 58.574ms