Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > PNJs avec de la mémoire...
PNJs avec de la mémoire...
Par Xune Vrinn le 24/6/2002 Ã 12:34:46 (#1703139)
En gros, j'aimerais que une fois les présentations faites avec un PNJ, celui-ci se souvienne du PJ et évite de lui reservir l'intro habituelle.
J'ai vu qu'il était possible de spécifier "text appears when...", mais vu que j'y touche pas grand chose en scripts, quelqu'un pourraît me donner le truc? J'dois définir une variable et la set sur False tant qu'il a pas papoté avec le PJ? Si oui, je fais ça où? Comment?
Heeeeeeelp ou je flingue la marmotte de Jey que j'ai en hotage!
Par souana le 24/6/2002 Ã 13:08:09 (#1703294)
sinon pour ton script ca doit etre ca.J'dois définir une variable et la set sur False tant qu'il a pas papoté avec le PJ
trent en avait parler il y a peu .
c'est quelque chose de simple mais je n'ai pas la reponse sous les yeux, ni le jeu d'ailleur.
Par Delis le 24/6/2002 Ã 16:02:19 (#1704103)
Je ne l'ai pas sous les yeux par contre ...
Il suffit de positionner une variable lors du premier dialogue, et de relire cette variable la deuxieme fois.
Par Jey le 24/6/2002 Ã 20:27:41 (#1705385)
Bon, je paie la rançon pour sauver la Marmotte... mais la prochaine fois... je te tue!!! :p
Par Majca le 25/6/2002 Ã 0:50:42 (#1706479)
Imaginons que Babarian (ben quoi!;)) aille parler à un vieillard dans la rue.
Voici le code à mettre dans l'évent "onConverstation" du vieillard.
void main()
{
string sNomJoueur = GetPCPlayerName(GetLastSpeaker());
if (GetLocalInt(sNomJoueur) == 0)
{
SetLocalInt(sNomJoueur,1); // pour la prochaine fois.
// dialogue d'introduction
}
else
{
// dialogue aux rencontres suivantes
}
}
Bien entendu, rien ne t'empêche d'ajouter plus de couche. Par exemple:
void main()
{
string sNomJoueur = GetPCPlayerName(GetLastSpeaker());
switch(GetLocalInt(sNomJoueur))
{
case 0: // dialogue d'introduction
break;
case 1: // votre tête me dit quelque chose...
break;
case 2: // content de vous revoir
break;
case 3: // ...
break;
case 4: // je suis occupé
break;
case 5: // laissez moi tranquille
break;
case 6: // je suis un vieillard ! j'ai besoin de repos, HOUSTE !!
break;
.
.
.
case 100: // ARGH !! GARDES!, GARDES !
break;
}
if (nWork ne se souviendra plus de Babarian la prochaine fois
}
Bon, comme je l'ai déjà dit, je ne suis sûr de rien. Je viens de terminer mes examens aujourd'hui... => C'est mon premier script :mdr:
edit: euh oui, comme tu l'auras remarqué, les variables sont stockées chez le viaillard et non chez le joueur. La raison en est qu'à mon sens, c'est plus léger pour le serveur étant donné que les seules variables en mémoires seront les variables des pnj des aréas chargées.
Par contre, si on avait décidé de stocker sur le joueur une variable pour chaque pnj rencontré, le nombre de variables totales existantes serait bien entendu identique, mais elles seraient toutes chargées constament en mémoire puisque liées au joueur.
Majca
ps: désolé, je n'ai pas la force de me relire... démain :p.
Par Myvain le 25/6/2002 Ã 17:35:56 (#1709945)
(note: je n'ai pas pu tester, je n'ai pas encore le jeu)
Le NPC vieillard stocke les variables qui permettent de déterminer si oui ou non, le joueur a déjà discuté avec lui. Ce qui me gène dans ce principe là c'est que pour une partie à plusieurs joueurs, la variable sNomJoueur va être écrasé chaque fois qu'un nouveau joueur viendra discuter avec lui, je m'explique.
Le joueur A discute avec le vieillard -> sNomJoueur = A.
Un peu plus tard, le joueur B vient à son tour lui causer -> sNomJoueur = B
Joueur A étant très bavard, il décide de reparler au NPC qu'il trouve très sympathique -> la variable sNomJoueur est encore fixée sur B donc le NPC considère qu'il n' jamais parlé à A et la conversation repart de 0 comme s'ils ne s'étaient jamais vu.
Le même problème se pose si la variable est stockée sur le joueur: chaque fois qu'il ira discuter avec un NPC utilisant ce type de script, la variable sera réinitialisée.
Tu me suis?
Une solution (à tester afin de verifier si ça marche et si ce n'est pas trop lourd) serait que le développeur du module crée une variable pour chacun des NPC de son module susceptible de réagir différement si le joueur vient lui parler plusieurs fois:
Imaginons un module comportant 3 NPC ayant un script de ce type: Caepollita, Ponpon le trognon et W Plop-Strike (toute ressemblance avec des pseudos existants ne serait qu'une pure coincidence :rolleyes: )
int iTalkToCaepollita;
int iTalkToPonponLeTrognon;
int iTalkToWPlopStrike;
Chaque fois qu'un joueur vient parler à l'un de ces NPC, une variable attachée au joueur sera mise sur 1.
En cas de nouvelle conversation avec ce NPC, un simpe test permettra de déterminer si oui ou non la conversation a déjà eu lieu.
exemple:
avant de commencer la conversation (script à placer dans Text appears When -> Edit)
int StartingConditional()
{
test si la variable est à 0 ou 1, si c'est FALSE la conversation démarre normalement, si c'est TRUE, le vieillard se souvient avoir déjà parlé avec le joueur. La suite du dialogue dépendra de ce test.
}
A la fin de la conversation avec Caepollita (script à placer dans Action Taken... -> Edit)
void main()
{
SetLocalInt(GetPCSpeaker(), "iTalkToCaepollita", 1);
}
ce qui mettra la variable à 1 pour un eventuel futur test si le joueur décide de revenir parler à ce NPC.
Autre chose:if (GetLocalInt(sNomJoueur) == 0)
et
SetLocalInt(sNomJoueur,1);
sNomJoueur est une varibale de type string donc tu ne peux pas lui attribuer une valeur numérique, ça doit forcément être une chaîne de caractère.
Un post du forum officiel traitant ce sujet: http://nwn.bioware.com/forums/viewtopic.html?topic=53539&forum=46&sp=0
En espérant que mon raisonnement est bon... :maboule:
:doute:
Par Majca le 25/6/2002 Ã 18:24:38 (#1710177)
Je suis parti du principe que SetLocalInt exige comme paramètre un nom de variable et c'est dans ce nom que sera stocké la valeur.
Imaginons que l'on veuille associer une variable "coucou" Ã l'objet "O".
Tu es d'accord que SetLocalInt(O, "coucou",1); est valide ?
Vois la chose autrement à présent. Stockons le nom "coucou" dans un string S.
string S = "coucou";
=> Au lieu passer "coucou" dans l'appel à la fonction SetLocalInt, on passe S.
Ce qui donne SetLocalInt(O, S,1);
En théorie, ça devrait marcher. En pratique, c'est à essayer ;).
Je vais le faire desuite d'ailleurs, comme ça on est fixé.
Si ça fonctionne (ce que je crois), la méthode que j'ai écrite dans mon post précédent permet d'associer de manière dynamique des variables à un objet. Dynamique dans le sens où on ne connait pas à l'avance le nom des variables qui serton liées à un objet.
Par contre, je viens de penser à un GROS MAUVAIS point pour cette méthode.
Si un joueur parle à un pnj.
Le pnj stocke une variable du nom du joueur => cool
Le joueur revient parler au pnj => nickel, on le reconnait
Le joueur ne revient plus jamais... => argh! et d'une variable qu'on ne pourra jamais plus détruire, une ! :D (on ne connait pas son nom!)
Je vais réfléchir au problème... Bon, je vais voir si ça fonctionne ou non comme je l'ai indiqué.
edit: Je confirme, ça fonctionne impecablement :)
Par Elmo le 25/6/2002 Ã 18:59:43 (#1710372)
Par Majca le 25/6/2002 Ã 19:10:30 (#1710422)
D'autre part, au cas où tu ne l'aurais pas remarqué, en final, ça te crée quoi? un script ! ;)
Par Myvain le 25/6/2002 Ã 19:28:21 (#1710512)
Elmo, perso je ne me casse rien du tout, je m'amuse et j'essaye de progresser en manipulant les scripts :p .
Par contre pas évident quand on ne peut pas tester directement :/
Par Majca le 25/6/2002 Ã 19:51:39 (#1710640)
Provient du message de Myvain
Pour SetLocalInt, je n'avais pas vu ça comme ça par contre ça demande à être travaillé ;)
Elmo, perso je ne me casse rien du tout, je m'amuse et j'essaye de progresser en manipulant les scripts :p .
Par contre pas évident quand on ne peut pas tester directement :/
:merci:
Par Elmo le 25/6/2002 Ã 22:29:23 (#1711448)
Par Xune Vrinn le 26/6/2002 Ã 8:52:20 (#1713015)
C'est possible d'avoir l'explication avec les endroits où cliquer et les cases à remplir? Passke le coup du script total, ça me fiche un peu les boutons, là .
Quand je vois un dialogue, je vois l'éditeur avec sa vision de la chose sous forme d'embranchement, mais je vois aussi tout un tas de champs à remplir en bas à droite.
Allez.... pensez qu'on n'est pas tous des stars du scripting. ;)
Par Myvain le 26/6/2002 Ã 10:52:38 (#1713587)
Ca fait la même chose que ce que j'essaye d'expliquer dans mon post et il y a des photos d'ecran pour expliquer.
Voilà , tu peux garder la marmotte ;)
JOL Archives 1.0.1
@ JOL / JeuxOnLine