Salut Gilmash.
Passer par le script me semble indispensable, alors voilà comment je résoudrais tes questions:
1°) J´utiliserais le script avec la fonction "GetLocalInt" pour contrôler la variable locale et "SetLocalInt" pour la stocker dans le joueur afin de voir s´il lui a déja parlé. La variable serait stockée sur le PJ.
Exemple:
Dans ton dialogue, tu vas à la première partie du discours ("ah tiens c´est la première fois que je vous vois, vous !" ), tu vas dans conditions, puis dans l´éditeur de script, et tu tapes:
int StartingConditional(){
return
(GetLocalInt(GetPCSpeaker(),"A_RENCONTRE_PERSO1")=
=0); //Recherche si la variable A_RENCONTRE_PERSO1
stockée dans le joueur entrain de parler (fonction GetPCSpeaker()) vaut 0. Si oui, on renvoie vrai, et donc on affiche le dialogue en conséquence.
}
Ensuite, tu vas dans actions conséquentes, et là, pareil, tu tapes:
void main(){
SetLocalInt(GetPCSpeaker(),"A_RENCONTRE_PERSO1",1)
; //Attribue la valeur 1 à la variable A_RENCONTR
E_PERSO1 stockée dans le joueur entrain de parler (fonction GetPCSpeaker()).
}
2°) Je mettrais un déclencheur, avec un script dans "OnEnter" et une fonction qui vérifie si l´élement entrant est bien le joueur considéré, puis qui commencerait la conversation.
Exemple:
Tu traces un déclencheur générique sur le sol, tu vas dans onEnter, puis dans l´éditeur de script, et tu tapes:
void main(){
object oPlayer = GetEnteringObject(); //Stocke le
joueur dans la variable oPlayer.
object oBonhommeAQuiParler =
GetNearestObjectByTag("LeTagDeLaPersonne");//Rempl
acer LeTagDeLaPersonne par le tag de celui qui vie
nt parler.
if(GetIsPC(oPlayer)) //Si l´objet entrant est un j
oueur, alors
AssignCommand(oBonhommeAQuiParler,ActionStartConve
rsation(oPlayer));//on dit à oBonhommeAQuiParler d
e commencer à... parler.
}
Après, si tu veux éviter qu´il parle deux fois, tu fais:
void main(){
if (GetLocalInt(OBJECT_SELF,"EST_VENU_PARLER")==0)
{ //A-t-on déja parlé?
object oPlayer = GetEnteringObject(); //Stocke le
joueur dans la variable oPlayer.
object oBonhommeAQuiParler =
GetNearestObjectByTag("LeTagDeLaPersonne");//Rempl
acer LeTagDeLaPersonne par le tag de celui qui vie
nt parler.
if(GetIsPC(oPlayer)) //Si l´objet entrant est un j
oueur, alors
AssignCommand(oBonhommeAQuiParler,ActionStartConve
rsation(oPlayer));//on dit à oBonhommeAQuiParler d
e commencer à... parler.
SetLocalInt(OBJECT_SELF,"EST_VENU_PARLER",1); //On
a parlé au joueur.
}
}
3°) Pareil pour la 1°) (et la 2°)), mais avec un évènement différent.
Exemple:
Tu vas sur la créature à tuer (où celle dont la mort va influencer le dialogue. Là, tu vas dans OnDeath, et tu mets:
void main(){
SetLocalInt(GetNearestCreature(CREATURE_TYPE_PLAYE
R_CHAR,PLAYER_CHAR_IS_PC),"A_TUE_LE_FRERE",1); //
Attribue la valeur 1 à la variable A_TUE_LE_FRERE stockée dans le joueur le plus près, par conséquent celui qui l´a tué (fonction
GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYE
R_CHAR_IS_PC)).
}
Et dans ton dialogue, tu vas dans Conditions d´éxecution, et tu mets:
int StartingConditional(){
return
(GetLocalInt(GetPCSpeaker(),"A_RENCONTRE_PERSO1")=
=1); //Recherche si la variable A_TUE_LE_FRERE sto
ckée dans le joueur (fonction GetPCSpeaker()) vaut 1. Si oui, on renvoie vrai, et donc on affiche le dialogue en conséquence.
}
et enfin, pour la 4°), j´utiliserais la fonction GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA)) pour le joueur et GetAbilityScore(OBJECT_SELF,ABILITY_CHARISMA)) pour le NPC.
Exemple:
Dans conditions d´exécution, tu mets:
int StartingConditional(){
int iCharismeDuJoueur =
GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA));
//Récupère la valeur du charisme du joueur en tra
in de parler (GetPCSpeaker()) et la met dans iCharismeDuJoueur.
int iCharismeDuNPC =
GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA));
//Récupère la valeur du charisme du NPC en train
de parler (OBJECT_SELF, car c´est la conversation DU NPC) et la met dans iCharismeDuNPC.
return iCharismeDuJoueur>iCharismeDuNPC; //Vérifie
si le charisme du joueur est supérieur à celui du NPC. Si oui, on renvoie vrai, et donc on affiche le dialogue en conséquence.
}
/!\ : Mets toujours les intitulés de dialogues avec une condition EN DÉBUT de dialogue. Sinon... Tu vas avoir des surprises (un dialogue qui ne change jamais, par exemple).
Voilà. Si tu as des questions, le mieux est d´aller voir dans l´éditeur de script les fichiers des campagnes (c´est comme ça que je m´y suis mis) ou l´excellent site anglais
http://nwvault.ign.com/.
Bon courage dans le scripting NWN Aurora,
PoufPoufPouf.
P.S.: si tu veux que j´éclaircisse certains points de ce que je t´ai passé, n´hésite pas. Mais je ne suis pas sur l´ordi souvent.