Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Recuperer dans une variable le texte tapé au clavier
Recuperer dans une variable le texte tapé au clavier
Par Prophetia Astrae le 16/12/2002 Ã 0:33:41 (#2798270)
Voila, j'ai un pnj qui dois avoir une action differente en fonction de ce que dit le joueur, jusque là , pas de probleme.
La ou ça se corce, c'est que le joueur ne dois pas choisir dans une liste, mais taper le texte lui meme au clavier.
Le script et quasi finit, mais il me manque une chose, comment recuperer le text taper au clavier pour l'enregister dans une variable?
Là je séche complétement....
J'ai cherché dans les les scripts, mais j'ai rien trouvé, alors si vous avez une idée, moi je prends
Merci d'avance
Prophetia
Par Tynril le 16/12/2002 Ã 0:37:51 (#2798294)
Par coolstar le 16/12/2002 Ã 6:17:16 (#2799474)
/* Approche générique de l'utilisation des PATTERNS : SetListenPattern.
- Le 16 Décembre 2002 - 06h40 - */
/* By coolstar d'après le travail exposé par LeProctophantasmiste */
/* Le rôle des PATTERNS est de permettre l'utilisation du 'Clavier' (CRI) afin
que n'importe quel type d''Expression' préalablement déterminée puisse être Entendue.
- A mettre dans le OnSpwan - */
/* RAPPEL de la Fonction 'SetListenPattern' :
// Set the string for oObject to listen for.
// Note: this does not set oObject to be listening.
void SetListenPattern(object oObject, string sPattern, int nNumber=0)
*/
void main()
{
// Declaration des variables.
object oObject = OBJECT_SELF;
// Mettre le NPC Ã l'Ecoute afin qu'il puisse 'activer' ses Patterns.
SetListening(oObject, TRUE); // (FALSE coupe la fonction)
// Comparaison entre les Expressions 'Entendues' par le NPC et ses Patterns...
// Si une Expression 'Entendue' est 'Unifiée'(~EGALE) à un Pattern son "OnConversation" sera lancé.
// Règles de l''UNIFICATION' des PATTERNS : (où "GetListenPatternNumber" prendra la valeur de "nNumber")
// SetListenPattern(oObject, "**", nNumber); // S’unifiera avec toute 'expression' ou 'Caractères'(wildcard)
// SetListenPattern(oObject, "*w", n); // SÂ’unifiera avec un ou plusieurs 'Espaces'
// SetListenPattern(oObject, "*n", n); // SÂ’unifiera avec un ou plusieurs 'Chiffres'
// SetListenPattern(oObject, "*p", n); // SÂ’unifiera avec un ou plusieurs 'Signes de Ponctuations'(.?!)
// SetListenPattern(oObject, "*a", n); // S’unifiera avec une ou plusieurs 'Lettres Alphabétiques'
// SetListenPattern(oObject, "|", n); // SPECIAL : vaut 'OU' (permet l'Alternative entre 2 'expressions')
// SetListenPattern(oObject, "()", n); // SPECIAL : permettent de Construire des 'Bloques' d'expression
SetListenPattern(oObject, "a*a", 1); // EXEMPLE : reconnaîtra tout 'Mot' commençant par 'a'(>= 2 Lettres)
SetListenPattern(oObject, "pattern 2", 2); // EXEMPLE : reconnaîtra Uniquement cette 'expression'
SetListenPattern(oObject, "bien(tôt|venue)", 3); // EXEMPLE : reconnaîtra "bientôt" OU "bienvenue"
SetListenPattern(oObject, "**(bonjour|pas)***n", 4); // EXEMPLE : reconnaîtra toute 'expression' avec
// "bonjour" OU "pas" a gch & un 'Chiffre' a drt...
SetListenPattern(oObject, "meurs", 5); // TEST : simulation de 'Mots de Pouvoir'
SetListenPattern(oObject, "bois", 6); // Idem
SetListenPattern(oObject, "salue", 7); // Idem
SetListenPattern(oObject, "ob(é|e)is", 8); // Idem (avec l'Alternative des 'Accents')
SetListenPattern(oObject, "** merci **|merci", 9); // 'Combinaison complexe'
SetListenPattern(oObject, "** merci|merci **", 10); // 'Extension' de la Combinaison
// (NOTE: Extension non gérable autrement)...
SetListenPattern(oObject, "enchant(é|e|ée|ee)|salut|hi|hello", 11); // 'Enchaînement' d'Expressions
}
/* Approche générique de l'utilisation des PATTERNS : GetListenPatternNumber.
- Le 16 Décembre 2002 - 06h40 - */
/* By coolstar d'après le travail exposé par LeProctophantasmiste */
/* Le rôle des PATTERNS est de permettre l'utilisation du 'Clavier' (CRI) afin
que n'importe quel type d''Expression' préalablement déterminée puisse être Entendue. */
/* RAPPEL de la Fonction GetListenPatternNumber:
// In an onConversation script this gets the number of the string pattern
// matched (the one that triggered the script).
// * Returns -1 if no string matched
int GetListenPatternNumber()
- A mettre dans le OnConversation - */
void main()
{
// Déclaration des variables.
int nMatch = GetListenPatternNumber(); // Renvoie la 'Valeur' du Pattern 'Entendu'.
float fSpeed = 1.0;
float fSeconds = 1.5;
// Comparaison avec la 'Valeur' du Pattern fixé par l'appel correspondant du "SetListenPattern"
// NOTE: La distinction entre 'Majuscule' et 'Minuscule' lors du 'CRI' est sans importance.
if (nMatch == 1) // Où 1 renvoie a "a*a" (valider si "a*a" a été 'Entendu')
PlayAnimation(ANIMATION_FIREFORGET_VICTORY3, fSpeed, fSeconds);
if (nMatch == 2) // Où 2 renvoie a "pattern 2" (valider si "pattern 2" a ete 'Entendu')
PlayAnimation(ANIMATION_FIREFORGET_VICTORY2, fSpeed, fSeconds);
if (nMatch == 3) // Où 3 renvoie a "bien(tôt|venue)" (valider si "bien(tôt|venue)"...)
PlayAnimation(ANIMATION_FIREFORGET_VICTORY1, fSpeed, fSeconds);
if (nMatch == 4) // Où 4 renvoie a "**(bonjour|pas)***n" (valider si "**(bonjour|pas)***n"...)
PlayAnimation(ANIMATION_FIREFORGET_TAUNT, fSpeed, fSeconds);
if (nMatch == 5) // Où 5 renvoie a "meurs"
PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, fSpeed, fSeconds);
if (nMatch == 6) // Où 6 renvoie a "bois"
PlayAnimation(ANIMATION_FIREFORGET_DRINK, fSpeed, fSeconds);
if (nMatch == 7) // Où 7 renvoie a "salue"
PlayAnimation(ANIMATION_FIREFORGET_BOW, fSpeed, fSeconds);
if (nMatch == 8) // Où 8 renvoie a "ob(é|e)is"
PlayAnimation(ANIMATION_LOOPING_WORSHIP, fSpeed, fSeconds);
if (nMatch == 9 | nMatch == 10) // 'Extension' de la 'Combinaison complexe' d'Expressions.
PlayAnimation(ANIMATION_LOOPING_SIT_CROSS, fSpeed, fSeconds);
if (nMatch == 11) // Où 11 renvoie a "enchant(é|e|ée|ee)|salut|hi|hello"
PlayAnimation(ANIMATION_FIREFORGET_GREETING, fSpeed, fSeconds);
/* ATTENTION: Si l'on saisit au 'Clavier' un 'CRI' comportant plusieurs PATTERNS
"différemment Unifiables", seul le 1er dans le 'Déroulement' des "if" sera pris en compte
(comme pour les "ordres de priorité" des 'Conditions d'exécution' des Dialogues)... */
}
:D
EDIT
------------------
Petit rajout pour préciser où qu'on doit mettre les Scripts... :rasta:
------------------
EDIT2
------------------
ATTENTION: Même si ça peut paraître élémentaire, je tiens à préciser (comme me l'a fait justement constater mon ami Thetrollfarceur!) que si d'aventure on saisi au Clavier une phrase comportant plusieurs Patterns Différents... et ben seul le 1er dans le déroulement des if sera pris en compte (comme pour les "ordres de priorité" des Conditions d'exécution des Dialogues!)... :maboule:
------------------
Par RAT le 16/12/2002 Ã 10:05:42 (#2800191)
Par Prophetia Astrae le 16/12/2002 Ã 13:35:24 (#2802393)
Prophetia
Par coolstar le 16/12/2002 Ã 13:59:01 (#2802663)
Content que cette merveilleuse option ainsi proposée puisse te ravir... mais c LeProctophantasmiste qu'il faut remercier... ;)
@Prophetia
De rien Miss! Mais... je ne suis pas sûr d'avoir saisi ta question?? d'autant que je pensais mon Post suffisamment élagué pour répondre au plus clair au plus grand nombre de questions (je sais, c impossible!)... il faut dire que moi aussi, au cours de cette longue nuit, j'ai eu tout de même un peu de mal à saisir spontanément le principe de fonctionnement des Patterns, alors j'ai voulu partager les résultats de mon dur labeur avec les membres Communautaires déjà afférés par ailleurs... :ange:
Mais pour revenir en à ta question… que désires-tu au juste? que seuls les Textes précis d'un PCs soient entendus?? que seuls les Textes d'un PCs précis soient entendus?? que seuls les textes des PCs (en opposition à ceux des PNCs!) soient entendus?? car aucune des ces conditions de n'apparaît impossible à réaliser... :doute:
Lis bien ce qu'avait rédigé LeProctophantasmiste , tu verras (je m'en suis d'ailleurs essentiellement inspiré!)... :rolleyes:
Sinon... La valeur 'nNumber' est faite pour garantit l'isolation des Pattern 'Entendus', évitant ainsi les chevauchements avec des 'bruits de fond' (Dialogue en fond de tâche des NPCs ou PCs!)... Par ailleurs, il suffit de localiser chaque PC (par un SetLocalxxx, genre!) pour conditionner en plus la réceptivité du NPC!... Et, autrement, on peut toujours conditionner à volonté le déclenchement d'un Script par le biais d'un GetPCSpeaker ou autre GetIsPC(GetEnteringObject), non? :D
...
Par eMRaistlin le 16/12/2002 Ã 15:11:57 (#2803358)
GetLastSpeaker()
Sur les OnConversation.
Apres, tu peut faire des
if (GetIsPC(GetLastSpeaker()))
{...}
ou bien des
if (GetName(GetLastSpeaker))
{...}
En teorie, ca peut permettre d'avoir un dialogue a base de SpeakString entre 2 NPC sans faire de DelayCommande (même si dans la pratque, c'est inutile)
En tout cas, ce sont des fonctions tres puissantes de Timing et de detection, ainsi que des triggers tres acceptable dans de nombreux cas... a condition de bien savoir ce que l'on attend.
Par coolstar le 16/12/2002 Ã 16:06:38 (#2803917)
Par eMRaistlin le 16/12/2002 Ã 16:13:16 (#2803987)
Donne moi le dernier PC a avoir parlé qui ait declenché cette conversation => Y'en a pas.
Et
Est-ce que le dernier a avoir parlé etait un PC ? => Non
Je sais : la nuance est faible, mais disons que je n'utilise personnelement le GetPCSpeaker que dur des dalogue, et GetLastSpeaker que sur les script de conversation... (en gros)
Par coolstar le 16/12/2002 Ã 16:18:08 (#2804041)
Par coolstar le 16/12/2002 Ã 16:40:41 (#2804273)
Par Prophetia Astrae le 16/12/2002 Ã 18:58:01 (#2805773)
J'ai un pnj qui à un dialogue associé et fait des actions en fonction des réponses selectionnées, jusque là rien de sorcier.
A un momment donné, aucune réponse n'est proposés au joueur, c'est lui meme qui doit taper un text, si le pnj reconnais le texte, il fait une action, si il ne le reconnait pas, le pnj repond simplement qu'il ne voit pas de quoi le joueur veut parler....
En gros c'est le systeme de mot clefs qui est utilisé pour les pnjs de T4C.
Donc le pnj ne doit écouter tou les textes, mais seulement ceux d'un PC donné, celui qui à lancé le dialogue avec le pnj...
Je sais pas si je suis tres clair...
Prophetia
Par coolstar le 17/12/2002 Ã 7:08:26 (#2810378)
Provient du message de AURORA
'Proposition1': Félicitation encore, vous avez vraiment été brillant ! (Script1)
'Proposition2': Alors, qu'attendez-vous donc pour répondre ? (Script2)
'Proposition3': J'ai une énigme pour vous.
----------'Proposition3a': D'accord !
------------------------'Proposition3a1': Voici l'énigme !
--------------------------------------'Proposition3a1a': (Vous réfléchissez à la question...) (Script3)
----------'Proposition3b': Non, merci !
/* coolstar - 17 Décembre 02 - 08h00 - (Script1) */
/* Dialogue de 'Félicitation' du NPC envers le PC concerné uniquement (et non pour les autres PCs) :
- A mettre dans les "Conditions d'exécution" de la 'Proposition1'. */
int StartingConditional()
{
object oPC = GetPCSpeaker();
string sVarName = "enigme";
int iValueCondition = GetLocalInt(oPC, sVarName);
return iValueCondition == 2;
}
/* coolstar - 17 Décembre 02 - 08h00 - (Script2) */
/* Pour le Dialogue d''Attente' du NPC envers le PC concerné uniquement (et non pour les autres PCs) :
- A mettre dans les "Conditions d'exécution" de la 'Proposition2'. */
int StartingConditional()
{
object oPC = GetPCSpeaker();
string sVarName = "enigme";
int iValueCondition = GetLocalInt(oPC, sVarName);
return iValueCondition == 1;
}
/* coolstar - 17 Décembre 02 - 08h00 - (Script3) */
/* Paramétrage des conditions de l'Enigme pour affecter le PC seul concerné :
- A mettre dans les "Actions conséquentes" (en Fin de Dialogue, comme la 'Proposition3a1a'). */
void main()
{
object oNPC = OBJECT_SELF;
object oPC = GetPCSpeaker();
int iNo1 = 1;
int iNo2 = 2;
int bValue = TRUE;
SetListening(oNPC, bValue);
SetListenPattern(oNPC, "(é|e)nigme", iNo1);
SetListenPattern(oNPC, "**", iNo2);
SetLocalInt(oPC, "enigme", iNo1);
}
/* coolstar - 17 Décembre 02 - 08h00 - (Script4) */
/* Script de tri des Patterns pour gérer l'Enigme envers le PC seul concerné ;
l'Exercice présent permet par ailleurs à n'importe quels PCs de pouvoir Dialoguer avec le NPC :
- A mettre dans le 'OnConversation' du NPC. */
void main()
{
object oPC = GetLastSpeaker();
string sVarName = "enigme";
int iNo1 = 1;
int iNo2 = 2;
int nValue = GetLocalInt(oPC, sVarName) == iNo1;
int nMatch = GetListenPatternNumber();
if (nMatch == iNo1 && nValue)
{
PlayAnimation(ANIMATION_FIREFORGET_BOW);
SpeakString("Très bien !");
SetLocalInt(oPC, sVarName, iNo2);
}
else
if (nMatch == iNo2 && nValue)
SpeakString("Je ne vois pas de quoi vous voulez parler !");
else
if (nMatch == iNo1 || nMatch == iNo2)
ClearAllActions();
else
{
ClearAllActions();
BeginConversation();
}
}
Par Prophetia Astrae le 17/12/2002 Ã 15:43:25 (#2813657)
J'ai viens juste de réussir, merci tout particulièrement à Tynril pour m'avoir mis sur la voie, et à Coolstar sans qui je ne comprendrais toujours rien au paterns ;)
Et pis merci à eMRaistlin pour le petit truc du GetPCSpeacker
Et pleins de gros bisous à vous tous :)
Prophatia
Par coolstar le 17/12/2002 Ã 15:55:14 (#2813765)
JOL Archives 1.0.1
@ JOL / JeuxOnLine