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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Comment utiliser les Conditions d'Exécution "Selon les Attributs" des PNJ ?

Par coolstar le 10/11/2002 à 19:44:12 (#2527169)

Hi!


Voilà... je souhaite créer un Canevas de Dialogue... Canevas qui marcherait pour TOUS les PNJ, s'adaptant selon LEURS Attributs... et que je personnaliserai ensuite au cas par cas, selon les besoins (pour seulement 10% en fait, le reste n'étant que des moutons :D)...


Donc... comment conditionner les phrases accessibles au PNJ, selon LEURS Attributs (Sexe / Race / Classe / Caractéristiques)... à l'instar des Conditions d'Exécution déjà proposées par l'Assistant script pour les PJ ??? :confus:

...


Grand Merci! :merci:

Par LeProctophantasmiste le 10/11/2002 à 19:49:50 (#2527234)

Ben tu peux récupérer le propriétaire du dialogue par OBJECT_SELF, et tester les attributs en question...

Par coolstar le 10/11/2002 à 19:54:31 (#2527271)

Merci Procto! toujours aussi Prompt au soutien... ;)


Mais... aurez-tu l'amabilité par la même de soumettre un Script en exemple (vu que je m'essaye tout juste depuis quelques jours au Script à proprement parlé... :D) ??


:merci:

Par LeProctophantasmiste le 10/11/2002 à 20:11:54 (#2527472)

Une réplique qui apparaît si le PNJ est de niveau supérieur à 10 ça te va?


int StartingConditional()
{
return (GetHitDice(OBJECT_SELF) > 10);
/*la même chose que:
if (GetHitDice(OBJECT_SELF) > 10)
return TRUE;
else
return FALSE; */
}

Gardes bien en mémoire cependant que les entrées son parcourues de haut en bas, donc la condition pour qu'une phrase d'un PNJ apparaisse est non seulement que son StartingConditional renvoie TRUE, mais encore que ceux des phrases au dessus aient renvoyés FALSE. Si par exemple tu mets une réplique en dessous de celle que je viens d'imaginer pour laquelle tu vérifie que le PNJ est de niveau supérieur à 5, elle s'affichera dans le cas ou le niveau du PNJ est entre 6 (EDIT: non pas 5 :o) et 10, au dessus de 10 ce sera la première.

Par coolstar le 10/11/2002 à 20:16:36 (#2527534)

Je vais voir ça de suite! je te remercie beaucoup... :merci:

Par coolstar le 10/11/2002 à 21:16:36 (#2528227)

Grrrmblrglm! :p


Peux pas faire autrement que de faire un 2e Post pour que tu (Procto) saches que j'ai quelque chose à rajouter...



Bon... tout d'abord merci pour ton tuyau qui marche effectivement très bien... et merci aussi pour ton rapelle sur les ordres de Priorités d'Exécution (même si je connaissais déjà... :D) !! ;)

Cependant... cette façon de concevoir le Script ("Return" au lieu de "If"), tel que tu me l'as présenté, induit en erreur... en effet, Return renvoie dans ce cas là à Return True et non Return False... ce qui veut dire qu'il faut mettre dans le script le contraire de ce que je veux obtenir pour valider la Réplique...


Donc... si je veux une Réplique de Femme, il faut...

int StartingConditional()
{
return (GetGender(OBJECT_SELF) != GENDER_MALE);
}


Dire que c'était si simple... je re remercie encore... :merci: :merci: :merci:


---------------------------------------

Heeuuu... une chose encore ?? :ange:

Est-il possible de procéder ainsi aussi pour déterminer la Faction ou le Tag du PNJ par exemple ??? :confus:


Heu... ce sera tout pour cette fois là! :blabla:
---------------------------------------


...

Par Jedaï le 10/11/2002 à 21:24:29 (#2528317)


Cependant... cette façon de concevoir le Script ("Return" au lieu de "If"), tel que tu me l'as présenté, induit en erreur... en effet, Return renvoie dans ce cas là à Return True et non Return False... ce qui veut dire qu'il faut mettre dans le script le contraire de ce que je veux obtenir pour valider la Réplique...


Donc... si je veux une Réplique de Femme, il faut...


PHP:--------------------------------------------------------------------------------
int StartingConditional()
{
return (GetGender(OBJECT_SELF) != GENDER_MALE);
}

--------------------------------------------------------------------------------

Pas vraiment Coolstar parce que tu peux aussi écrire :




int StartingConditional()
{
return (GetGender(OBJECT_SELF) == GENDER_FEMALE);
}

:D

Par coolstar le 10/11/2002 à 22:13:33 (#2528849)

Ca n'invalide pas ce que je signifiais Jedaï... mais je te remercie d'avoir fourni cet indice supplémentaire que j'ignorais encore (au fait pourquoi "==" au lieu de "!=", que signifie tout ça ?)... ;)



PS : Heuu... serait-il possible d'avoir une réponse pour les FACTIONS et les TAGS ??? Merci! :D

Par Jedaï le 10/11/2002 à 22:48:11 (#2529272)

Ben si Coolstar, ça l'invalide : ce n'est pas parce qu'on utilise "return" au lieu de "if" que ça change quoi que ce soit au test : ça dépend juste de ce que tu veux faire.

Quant aux "!=" et "==", c"est simplement que ton test vérifie si le NPC n'est pas de sexe masculin , en pseudo-code :

renvoyer (ObtenirLeSexe(Moi Même) "est différent de" Sexe_Masculin);

Ce test renvoit VRAI (TRUE) si Moi Même (le NPC : OBJECT_SELF) n'est pas de sexe masculin et FAUX (FALSE) si Moi Même est de sexe masculin.
Donc si le NPC est masculin, cette phrase ne sera pas dite, dans tous les autres cas (y compris si le NPC est hermaphrodite) cette phrase sera dite.



Tandis que mon test vérifie si le NPC est bien de sexe féminin, en pseudo-code :

renvoyer (ObtenirLeSexe(Moi Même) "est égal à" Sexe_Féminin);

Ce test renvoit VRAI (TRUE) si Moi Même (le NPC : OBJECT_SELF) est de sexe féminin et FAUX (FALSE) si Moi Même n'est pas de sexe féminin.
Donc cette fois, la phrase ne sera dite que si le NPC est bien de sexe féminin (et pas si elle est hermaphrodite, neutre ou autre chose).

Ben ça confirme au contraire... moi qui comprends rien qui voulais Valider FEMME...

Par coolstar le 10/11/2002 à 22:58:34 (#2529367)

k! Question d'interprétation, si je suis bien... ;)


"!=" signifierais donc "Strictement Différent... tandis que "==" signifierait Strictement Egal... c ça ?? :D

...



Et pour le reste de ma question ??? :confus:

Par Jedaï le 10/11/2002 à 23:05:06 (#2529423)

Pour la faction, je ne sais pas, peut-être avec GetFactionLeader(OBJECT_SELF) mais comme je sais pas comment les leaders sont déterminés...
Peut-être que tu pourrais faire un quasi demi-dieu de chaque faction et les enfermer dans une petite pièce inatteignable (veille à leur mettre des scripts vides : void main(){}, sinon ils vont se taper dessus... :D ).

Ensuite tu fais un truc du style :


int StartingConditional()
{
return (GetName(GetFactionLeader(OBJECT_SELF)) == "Le Nom Du Leader De La Faction Brol");
}



Pour les tags, tu as GetTag(OBJECT_SELF); mais tu vas être obligé de faire des actions sur les tags pour en extraire de l'information (pourvu que tu aies choisi de bonnes rêgles de "taggage", c'est faisable).


Pour être encore plus clair par rapport à la différence entre return et if :

Ces deux codes ont exactement le même effet :


int StartingConditional()
{
return (GetGender(OBJECT_SELF) != GENDER_MALE);
}



int StartingConditional()
{
if (GetGender(OBJECT_SELF) != GENDER_MALE)
return TRUE;
return FALSE;
}

Par coolstar le 10/11/2002 à 23:13:10 (#2529486)

Provient du message de Jedaï

Pour être encore plus clair par rapport à la différence entre return et if :

Ces deux codes ont exactement le même effet :


int StartingConditional()
{
return (GetGender(OBJECT_SELF) != GENDER_MALE);
}



int StartingConditional()
{
if (GetGender(OBJECT_SELF) != GENDER_MALE)
return TRUE;
return FALSE;
}
Je vois... c bien ce que je pensais... c l'inverse donc du résultat proposés pour un PC à propos des Returns, quand on utilise l'Assistant script... :maboule:

int StartingConditional()
{

// Ajouter restrictions de sexe
if(GetGender(GetPCSpeaker()) != GENDER_FEMALE)
return FALSE;

return TRUE;
}



k! et encore merci pour tout! :merci:

Par Tynril le 10/11/2002 à 23:36:22 (#2529720)

Le mieux pour éviter de s'en tirer avec 250 script (1 par réplique), c'est de travailler avec les custom token dans un seul script :)

Par coolstar le 11/11/2002 à 0:05:36 (#2530001)

Traduction svp ??

Par Tynril le 11/11/2002 à 0:20:05 (#2530126)

En très gros :

void main() {
object oSelf = OBJECT_SELF;
object oPC = GetPCSpeaker();
string sReturn;

if (GetGender(oSelf) == GENDER_FEMALE) {
if(GetGender(oPC) == GENDER_MALE) {
sReturn = "Bonjour, bel homme !";
} else if(GetGender(oPC) == GENDER_FEMALE) {
sReturn = "Bonjour, Dame.";
}
} else if(GetGender(oSelf) == GENDER_MALE) {
if(GetGender(oPC) == GENDER_MALE) {
sReturn = "Bonjour, Sire.";
} else if(GetGender(oPC) == GENDER_FEMALE) {
sReturn = "Bonjour, Belle Damoiselle !";
}
}
SetCustomToken(sReturn,666);
}
A coller en action taken sur la phrase juste avant ce que doit dire le PNJ, puis dans ce que doit dire le PNJ : .

Par coolstar le 11/11/2002 à 0:29:39 (#2530202)

Je te remercie beaucoup Tyn pour l'exemple donné... ;)


Mais ce que je voulais dire c que je n'ai vraiment aucune notion de ce qu'est le Custom Token et donc là je ferais qu'un bête "Copié/Collé" à l'état... :D

Alors si tu pouvais méclairer au mieux sur le principe ce serait super ! :ange:


Merci. :merci:

Par Jedaï le 11/11/2002 à 11:20:48 (#2532825)

Bon alors, les Custom Tokens :

Tu utilise probablement déjà les tokens tout prêt qui sont fournis par Bioware : , , (ou si tu as la VO), etc....
Ils sont tous disponible en faisant "clic droit--->insérer Token" dans la zone de frappe de l'éditeur de conversation.
Une fois dans le jeu, ils sont remplacés par les bons mots en fonction du PC qui dialogue (son nom dans le cas de , "Monsieur" s'il est de sexe masculin et que tu as mis ...).
Les Custom Tokens sont une extension du principe, ils permettent de créer ses propres Tokens : sera remplacé par "bonjour", si avant qu'il soit utilisé tu as fait :


SetCustomToken(666, "bonjour");

par "cuisinier" ou "cuisinière" selon le sexe du PC si tu as mis dans un des Action Taken du dialogue où il est utilisé (mais avant son utilisation) :

string sTok;
object oPC = GetPCSpeaker();

if (GetGender(oPC) == GENDER_FEMALE)
sTok = "cuisinière";
else sTok = "cuisinier";

SetCustomToken(999, sTok);


Gros problème de ces Custom Token, leur mise en place est lourde et peu pratique dés qu'on veux les utiliser dans plusieurs dialogues, dans la première phrase du dialogue....
De plus on ne peut utiliser les token dans les fonctions du type SpeakString(). C'est pourquoi j'ai créé une bibliothèque qui automatise ces processus et les facilite.

Bon alors, ce que t'as proposé Tyn est bon mais je te propose mieux : :D


#include "nwl_tokcust"

void main()
{
AddCustomToken(666, "<OBJECT_SELF?mf:/>");
}


Et une fois faite cette manipulation, le Custom Token numéro 666 sera "recalculé" à chaque nouvelle conversation, automatiquement, pourvu que tu te sois procuré ma bibliothèque "nwl_tokcust" sur NWN-Fr.

JOL Archives 1.0.1
@ JOL / JeuxOnLine