Débutant... Scripting de quête

Répondre
Partager Rechercher
Bonjour (ou bonsoir plutôt vu l'heure ^^) aux habitués du coin...
Ca fait sûrement bizarre de voir un débutant complet en script NWN depuis le temps qu'il est sorti, mais c'est le cas...

Voilà mon problème est que j'essaie de créer une quête entièrement grâce au script (l'assistant d'intrigue me horripile à dupliquer mes NPC ><) et... bah déjà coincé aux balbutiements.

J'ai un bête script pour vérifier si la quête a déjà été commencée ou pas...

Code:
void main()
{
 int StartingConditional()
{
object oPC = GetPCSpeaker() ;
    return (GetLocalInt(oPC, "NW_JOURNAL_VAMP0001") == 0) ;
}
}
où vamp0001 (avec des minuscules) est le Tag de la quête dans le Journal.
...mais quand je compile ça, ça me donne
Citation :
qst_vamp0001vf.nss(3): ERREUR : PARSING VARIABLE LIST
à la ligne 3 (donc dans int StartingConditional())... et je ne sais pas du tout d'où ça vient. J'ai trouvé ce code en faisant une recherche sur le scripting de quêtes sur ce forum même, et pour la fille à qui on l'a donné ça a l'air d'avoir bien marché... Suis-je stupide ? ^^

En jeu, ça donne que le NPC me parle jusqu'au moment où ce script est en Condition d'exécution, après quoi le dialogue s'interrompt et le journal de quêtes n'est pas mis à jour, alors que ça marche si je ne mets pas ça en script Condition d'exécution...

(version NWN de base sans aucune extension, précision au cas où)

En espérant avoir de l'aide, merci
Oh oui... je me sens bête... C'était bien ça en effet, merci ^^
Maintenant ça marche, mais une autre condition me bloque à nouveau...
J'essaie de vérifier si un PJ a un objet spécial dont j'utilise le Tag et ce script :
Code:
#include "nw_i0_tool"

int StartingConditional()
{

    // Vérifier que le PJ qui parle possède ces objets dans son inventaire
    if(!HasItem(GetPCSpeaker(), "item004"))
        return FALSE;

    return TRUE;
}
mais le problème c'est que, que le PJ ait l'objet ou non, le NPC lui sort automatiquement le message qu'il devrait dire si le PJ n'a pas cet objet ! Mon dialogue est construit comme ceci...
Joueur : Voici les objets.
>>>Propriétaire : Merci, c'était ce qu'il fallait. (avec la condition de déclenchement qui ne marche pas...)
>>>Propriétaire : Vous n'avez pas assez d'objets. (réplique sans condition qui ne devrait s'enclencher que si la première condition n'a pas été rencontrée...)

Donc j'aimerais bien savoir ce que j'ai mal fait... ^^" (oui, le tag est correct j'ai vérifié) et aussi, comment puis-je modifier la condition pour que le NPC réponde que la quête est terminée si on a 10 exemplaires de cet objet (au moins) et à 9 en en-dessous, il renvoie le PJ continuer la quête ?

Merci d'avance, désolé du dérangement mais... J'y connais encore strictement rien !
Code:
 #include "nw_i0_tool" 
 
int StartingConditional()
{
	if(GetItemPossessedBy(GetPCSpeaker(), "item004") != OBJECT_INVALID)
	return TRUE;
 
	return FALSE;
}
ça doit marcher comme condition pour avoir 1 objet ça

Code:
 
int StartingConditional()
{
	 int i=0;
	 object oItem = GetFirstItemInInventory();
	 while(GetIsObjectValid(oItem))
	 {
	 if(GetTag(oItem) == "tag")
	 {
		 i++;
	 }
	 oItem = GetNextItemInInventory();
	 }
	 if(i >= X)
		return TRUE;
	 return FALSE; 
}
ps: x est le nombre d'objet que tu veux que le PJ possède
et celui là pour le nombre
Je te remercie beaucoup pour ta peine, mais le script pour plusieurs objets ne marche pas... J'ai essayé toutes les combinaisons possibles, et ça refuse de fonctionner. Est-ce que ça vient de la ligne
Code:
	 while(GetIsObjectValid(oItem))
? Je suppose que ceci vérifie si l'objet est un objet légal, or l'objet que j'utilise est un objet de la palette personnalisée. Je me trompe ?
Non en fait la grande boucle while dit précisément :

"tant que l'objet existe on prend le suivant dans l'inventaire"

cela permet de faire un tour complet de l'inventaire

par contre dans le second il faut changer "tag" par "item004" si ce n'est pas fait.


Ya un autre soucis c'est si l'item est empilable, là il faut utiliser la fonction GetItemStackSize pour lui faire faire un test sur le nombre d'objets, la "grosseur" de la pile en fait.

Les scripts c'est comme une langue et pareil pour bien la parler il te faut du vocabulaire.

Va faire un tour du coté du lexicon, tu y apprendras pleins de choses

http://www.nwnlexicon.com/

cherche à inventory, ya toutes les fonctions d'inventaire
Il y a une fonction bien pratique pour ça écrite par les développeurs de Bioware: int GetNumItems(object oTarget, string sTag) qui retourne le nombre d'objet de tag sTag possédés par oTarget. C'est plus pratique que la boucle car elle consiste en une simple fonction et elle prend en compte les objets empilés. (stack items)

Pour utiliser cette fonction, il faut inclure la bibliothèque "nw_i0_plot"
Code:
#include "nw_i0_plot"
Explications dans NWN_Lexicon : http://www.nwnlexicon.com/compiled/f...tNumItems.html
__________________
http://www.multimania.com/bbm2/signmajora.gif
Citation :
Publié par Coeur Pur


int StartingConditional()
{
object oPC = GetPCSpeaker() ;
return (GetLocalInt(oPC, "NW_JOURNAL_VAMP0001") == 0) ;
}
}[/code]
où vamp0001 (avec des minuscules) est le Tag de la quête dans le Journal.
...mais quand je compile ça, ça me donne
Bonjour c'est le réactiveur de post plein de poussiere lol ^^ alias noob_total_script aussi à mes heures perdues lool ^^

Bon voila mon souci le script ci-dessus m'interesse fortement

Par contre pas moyen qu'il me donne satisfaction: je le met en condition de réponse du PC (est-ce bon??) c'est à dire donc si le PC a la quete la condition déclenche un autre choix de réponse que s'il n'avait pas la quete. Mais là ça ne marche, le PC a la quete active mais le dialogue du NPC fait comme si le PC n'avait pas la quete. Donc voila j'ai dut forcement me planter quelque part alors HELP!!!

D'avance merci à ceux qui me répondront
Bah honnêtement comme ça c'est dur à dire

Vu que le script est bon, c'est une erreur de ta part. Ca peut être que tu t'es :
- planté dans le tag de l'entrée du journal
- planté dans l'endroit où tu a mis le script (mauvaise ligne du dialogue par exemple)
- etc.

A noter que ce script EMPECHE l'apparition de la ligne de dialogue concernée si le PJ a la quête. Vérifie que tu t'es pas planté.

Regarde aussi si le résultat est le même dans le cas où le PJ a pris la quête et dans le cas où il l'a pas.

Good luck


(ps: déjà en 2006 NWN paraissait vieux :P qui aurait parié sur sa survie jusqu'en 2008 ?)
oki lol je vais aller m'arracher ce qu'il me reste de cheveux pour trouver ou j'ai fais le boulet mdr ^^
Bah je vous dirai quoi quand même au cas ou :P

Mis à part ça bah pour la survie de nwn1 moi j'y joue depuis 5 ans et je m'y suis remis il y a quelque mois (j'ai tenté le mapping sur nwn2 = trop long... du cup hop me revoilou sur nwn1 mais bon plus de scripteur dans le groupe alors voila quoi ^^ )
[quote=Taern;15508241]

A noter que ce script EMPECHE l'apparition de la ligne de dialogue concernée si le PJ a la quête. Vérifie que tu t'es pas planté.

Rquote]

aaaaaaaaaaahh... okiiiii
J'avais pigé à l'envers^^
En faite moi il me faut un script qui fasse apparaitre la ligne de dialogue si le PC a la quête^^
Faut jouer sue le " == " juste l'ID de la quete (qui doit etre le "0" dans le script cité plus haut)
D'avance merciiiii
Alors pour ça, soit tu modifie le script en mettant "== 1" au lieu de "== 0", soit tu met le script à un autre endroit. Je m'explique :

solution 1 : (pas de changement du script)
début du dialogue
|---> (script qui bloque si quête active) Bonjour vous voulez une quête ?
|---> Alors la quête ça se passe ?


solution 2 :
début du dialogue
|---> (script qui bloque si quête inactive) Alors la quête ça se passe ?
|---> Bonjour vous voulez une quête ?


Bon enfin bref tout ça pour dire, fais comme tu veux
Okiiiii merci de ta réponse Taern!

Ce n'était pas un problème de script mais plus un problème de logique d'arborescence du dialogue.

Je teste ce soir mais ça devrait tourner comme un personnage courant (en rond donc) autour d'un arbre pour échapper à un ennemi avec un FP "impossible"

En tout cas merci de prendre du temps pour me répondre
Citation :
Publié par Coeur Pur

Code:
void main()
{
 int StartingConditional()
{
object oPC = GetPCSpeaker() ;
    return (GetLocalInt(oPC, "NW_JOURNAL_VAMP0001") == 0) ;
}
}
où vamp0001 (avec des minuscules) est le Tag de la quête dans le Journal.
Bon je suis toujours embété avec ce script à croire qu'il m'en veut ou que je suis en mode total boulet -.- lol bon bref!

J'ai appliqué ta solution n°1 Taern dans un module test tout simple et avec juste 2 ligne de dialogue soit:

solution 1 : (pas de changement du script)
début du dialogue
|---> (script qui bloque si quête active) Bonjour vous voulez une quête ?
|---> Alors la quête ça se passe ?

Donc au début seule la ligne n°1 apparait (normal la quete est pas active) mais par la suite, lorsque le PJ a la quete et bien la ligne n°1 s'affiche toujours sans que la ligne n°2 apparaisse - donc voilaaa je foire ou??

Mais à tout hasard dans l'expression "NW_JOURNAL_vamp0001 ou vamp0001 est le TAG de la quete en question le NW_JOURNAL_ est-il au final une expression toujours valable même toutes mes mise à jour du jeu?

Là franchement en copiant/collant betement le script et en nommant ma quete test de la meme maniere que dans le script copier (vamp0001) bah le résultat est l'échec.

Donc voila... merci de m'éclairer sur mon erreur car la je seche je déséspère même
Voilà ce que c'est avec des scripts pas clairs

Un script de ce genre renvoie VRAI ou FAUX. Jusque là, nous sommes d'accord, je suppose.

Or, cette expression "return (GetLocalInt(oPC, "NW_JOURNAL_VAMP0001") == 0) ;", elle renvoie quoi ?

Et bien, VRAI dans le cas où la variable locale NW_JOURNAL_VAMP0001 sur le PJ est égale à 0. Donc, si je suppose qu'on met cette variable à 1 si la quête est prise, elle retourne VRAI si le joueur n'a pas pris la quête et FAUX si le joueur a déjà pris la quête (cette variable peut prendre n'importe quelle valeur différente de zéro pour que l'assertion soit fausse).
Conséquence directe: si le joueur a commencé la quête, il FAUT POSITIONNER cette même variable à autre chose que zéro dans une autre branche du dialogue. Sinon, elle sera TOUJOURS à zéro.
Tu me suis ?

Par conséquent, si tu ne changes pas l'état de cette variable sur le PJ, l'assertion sera toujours VRAIE. Question de logique pure

Comme tu ne dis pas que tu touches à cette variable, ni où, je suppose (encore) qu'elle reste à zéro, d'où ton soucis. Voili voilou.
Merci pour ta réponse Azmathiel

Donc si j'ai bien suivi je doit avoir 2 lignes de dialogue ou:

- La 1ère aura la variable == 0 donc VRAI la ligne de dialogue apparaitra si le PC n'a pas la quête.

- La 2nd aura la variable == 1 donc VRAI la ligne de dialogue apparaitra si le PC a la quête.

Bon si j'ai pas pigé je le saurai tres vite ^^
En fait, ce serait plutôt une logique comme ça:

// Condition d'apparition: Variable NWxxx à 0 (ton script)
--> ligne 1: Bonjour, voilà la quête // Mise à 1 de la variable SetLocaLInt(oPC, NWxxxx, 1)

// Elle apparaît si l'autre n'apparaît pas.
--> ligne 2: Vous avez déjà la quête, désolé
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés