Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

PNJs avec de la mémoire...

Par Xune Vrinn le 24/6/2002 à 12:34:46 (#1703139)

J'suis vraiment pas une star en scripts et on est visiblement obligés de passer par cette case pour ce que je veux faire.

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)

ho je suis menbre de la protection de la marmotte dans les alpes alors abstien toi de flingué cette gentille marmotte.:monstre:

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)

Dans le fichier readme qui se trouvait avec la beta d'Aurora Toolset, il y justement un exemple qui montre comment changer ce que dit un PNJ si c'est la premiere ou deuxieme rencontre.

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)

http://forums.jeuxonline.info/showthread.php?s=&threadid=93836&highlight=variable+locale

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)

Tu pourrais te baser sur un truc du genre... (je dis ça car je ne sais pas si c'est correct, faut être critique;)).

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)

Majca, quelques petits commentaires sur ton script:
(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)

Neni neni ! :)

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)

au lieu de vous casser le Q allez donc voir le sujet ou j'explique un truc sur les variables avec images, c'ets pile-poil ce qu'il te faut xune

Par Majca le 25/6/2002 à 19:10:30 (#1710422)

Elmo, cette méthode n'est valable que pour tester un variable connue à l'avance...

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)

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 :/

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)

mon système va plus vite à l'arrivée :D

Par Xune Vrinn le 26/6/2002 à 8:52:20 (#1713015)

Dites?

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)

Xune, voici le lien vers le message dont parle Elmo: http://forums.jeuxonline.info/showthread.php?s=&threadid=89498

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