CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Forum
  • Accueil
  • Actus
  • Tests
  • Vidéos
  • Images
  • Soluces
  • Forum
Liste des sujets

Editeur : Une nouvelle FAQ !

Gilmash
Gilmash
Niveau 1
29 juin 2006 à 02:45:35

Voilà, j´ai cherché sur ce forum et n´ai pas trouvé de réponses. J´ai également farfouillé les nombreux tutoriaux (très bien faits) fr du net et j´en ai pas trouvé non plus. Questions très simples donc :
1) comment empêcher mon personnage de répéter deux fois le même dialogue ? (qu´il ne répète pas "ah tiens c´est la première fois que je vous vois, vous !" à chaque fois qu´on vient lui parler.
2) si possible, comment se débrouiller pour qu´un personnage VIENNE parler au joueur de lui-même ?
3)Comment faire pour que certaines réponses ne soient visibles qu´en fonction d´une quête ? (exemple : qu´un pnj ne me dise pas "Pourquoi avez-vous tué mon frère ?" avant que je ne l´ai réellement fait (tuer son frangin).
4)Comment faire des combats de charisme entre PNJ et joueur lors d´un dialogue ? (exemple, le joueur veut mentir au pnj, pour cela il doit le battre en charisme (et pas seulement avoir un niveau minimum de charisme comme le propose l´assistant de scripts).

Voilà, merci infiniment de répondre aux questions (si réponses il y´a). Je précise que je suis une nullité en script et que s´il y´a moyen de passer par des fonctions "spéciales nullos" de l´éditeur, ce sera avec grand plaisir.

poufpoufpouf
poufpoufpouf
Niveau 2
03 juillet 2006 à 22:00:33

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.

poufpoufpouf
poufpoufpouf
Niveau 2
03 juillet 2006 à 22:01:49

Oups! JV a tronqué mes retours à la ligne!
Dans le code, reviens uniquement à la ligne après
le ";" ou à la fin du commentaire de ligne ("// ...").

PoufPoufPouf

Gilmash
Gilmash
Niveau 1
04 juillet 2006 à 04:16:12

Merci infiniment ! Je m´y remet dès ce soir ou demain et je te tiendrai au courant ! Bon, heu sur papier comme ca je t´avoue que tu parles un hybride chtullinostartrekien pour moi ^^ En tout cas en pratique j´essaierais et si jamais ca marche pas promis je te le dirais. En tout cas, quoiqu´il arrive, merci infiniment de ta réponse si rapide et si construite ! Bonne continuation sur le net et ailleurs !

poufpoufpouf
poufpoufpouf
Niveau 2
04 juillet 2006 à 10:04:43

Avec plaisir! Cependant, après une nuit de sommeil, j´y vois plus clair.
Pour la 3°); j´y pense, cela ne marchera que pour le PJ qui aura tué le frère. Si tu veux que ça marche pour tous les PJ, il faut que tu changes deux petits trucs:
Sur la créature à tuer dans OnDeath, tu mets:

void main(){
oModule = GetModule(); //Récupère le module en cou
rs.
SetLocalInt(oModule,"A_TUE_LE_FRERE",1); //
Attribue la valeur 1 à la variable A_TUE_LE_FRERE
stockée dans le module.
}

Et dans ton dialogue, tu vas dans Conditions d´éxecution, et tu mets:
int StartingConditional(){
return
(GetLocalInt(GetModule(),"A_RENCONTRE_PERSO1")=
=1); //Recherche si la variable A_TUE_LE_FRERE sto

ckée dans le module (fonction GetModule()) vaut 1. Si oui, on renvoie vrai, et donc on affiche le dialogue en conséquence.
}

Enfin, pour le dialogue, pour éviter les bugs (style le dialogue qui ne change jamais), fais une condition contraire: par exemple, supposons que tu aies deux intitulés, un "Bonjour, mon ami" et un "Pourquoi avez-vous tué mon frère ?" .

Dans le premier, tu mets le script du dessus, et dans le second tu mets:

Et dans ton dialogue, tu vas dans Conditions d´éxecution, et tu mets:
int StartingConditional(){
return
(GetLocalInt(GetModule(),"A_RENCONTRE_PERSO1")=
=0); //Recherche si la variable A_TUE_LE_FRERE sto

ckée dans le module (fonction GetModule()) vaut 0. Si oui, on renvoie vrai, et donc on affiche le dialogue en conséquence.
}

Là, tu es sûr que ton dialogue changera automatiquement.

Si tu veux, tu peux même faire en sorte que le NPC attaque le PJ à la fin du dialogue (d´après ce que j´ai compris, il a tué son frère, alors c´est normal qu´il soit un chouïa en colère).
Tu crées une dernière phrase, et tu vas sur le truc "FIN DIALOGUE" du PJ et tu mets, toujours dans actions conséquentes:

void main(){
AdjustReputation(GetPCSpeaker(), OBJECT_SELF, -100
); //Met la faction du joueur (GetPCSpeaker()) en tant qu´ennemie (100(amical)-100 =0 (hostile)) de la sienne (OBJECT_SELF).
DetermineCombatRound(GetPCSpeaker());//Commence à
lui taper dessus.
}

Bref, tu peux faire n´importe quoi (ou presque, détruire le monde, c´est pas possible) avec les scripts, donc n´hésites pas! J´ai créé un module avec une seule pièce qui me sert uniquement de module de test. Au pire, si tu te plantes, ton ordi va faire pareil, alors, vas-y!

Erratum: Dans le 2°, (j´étais vraiment endormi, moi!) j´ai oublié l´accolade ouvrante:

if(GetIsPC(oPlayer)) //Si l´objet entrant est un j
oueur, alors

doit être remplacé par:

if(GetIsPC(oPlayer)){ //Si l´objet entrant est un
joueur, alors

(/!\:IL N´Y A PAS DE RETOUR A LA LIGNE)

-----

PoufPoufPouf

La vidéo du moment