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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Les tokens pour les modules en français

Par Cassin le 18/7/2002 à 16:59:17 (#1824034)

J'avais jusque là réussis à éviter dans mes dialogues d'utiliser une notion de genre (il/elle etc...), mais là je me retrouve un peu coincé.

Or avec les tokens on ne peut apparamment faire apparaître que he/she...

Somme nous condamnés, nous, pôvres français, à faire des dialogues doubles et utiliser les Text Appear When... dès qu'on veut introduire une notion particulière, ou y a-t-il une autre solution ?

Par tonton le grognon le 18/7/2002 à 16:59:59 (#1824040)

attendre la version francaise :D

Par Caepolla le 18/7/2002 à 17:31:55 (#1824227)

Oui, même problème. :(

Les tokens sont une notion de scripts et ont été conçus dans l'optique de la langue anglaise.
Et ça m'étonnerait que ça soit touché dans la version française (aaah, les dialogues de Baldur où tous les PNJ parlaient aux personnages comme si c'était une femme :p).

J'ai peur que le seul moyen ce soit en effet Text appear when, ce qui oblige à singulièrement se compliquer la tâche.

Par Uther le 18/7/2002 à 17:46:42 (#1824309)

Dans l'éditeur, tu peux rédiger des dialogues en fonction du genre de l'interlocuteur (le PJ). Mais ça oblige effectivement à doubler toutes les répliques "personnalisées".

Pour utiliser des variables adaptées aux interlocuteurs, comme le note Tonton, je crains effectivement qu'il faille attendre la version localisée du jeu...

Par Kemay le 18/7/2002 à 18:06:16 (#1824410)

En fait tu peux créer toi-même tes propres tokens avec la fonction SetCustomToken(int nCustomTokenNumber, string sTokenValue). Par exemple pour créer un token "il/elle" le script serait

void main() {
string sToken;
if ( GetGender(GetPCSpeaker()) == GENDER_FEMALE )
sToken="elle";
if ( GetGender(GetPCSpeaker()) == GENDER_MALE )
sToken="il";
SetCustomToken(100,sToken); }

Avec cet example, a chaque fois que tu utilises dans une conversation, ce sera remplacé par "il" ou "elle" selon le genre de l'interlocuteur.

Voilà J'espère que ca répond à ta question :)

Par Cassin le 19/7/2002 à 8:43:55 (#1826867)

Vi, merci ! :merci:

C'est pas le plus pratique mais ça l'est toujours plus que de tout doubler à chaque fois !

Par contre ça ne change rien à notre grammaire tellement chiante et ses accords é/ée par exemple, ça c'est un problème typiquement français !

Par Mellinsa le 19/7/2002 à 21:03:28 (#1830821)

Je crois pas que ds la version français il est arranger tout les syntaxe possible de cette merveilleuse langue qu'est le Français et si oui ben je comprend pour il sort juste en octobre

Par Ryval le 24/7/2002 à 15:48:31 (#1854366)

Tu peux faire exactement la même chose pour"é" "ée" que pour "il" "elle". Ton dialogue va ressembler à rien mais pas grave c'est le rendu qui compte. Moi g fait avec " "e" c'es mieux pour "content" "contente"

Houlà, ça date ça !

Par Cassin le 11/10/2002 à 10:51:02 (#2315467)

Hop-là, je me permet de remonter ce topic antédiluvien car j'ai un petit problème avec ces tokens "made in french"...

Si les tokens d'origine ont bien été traduit ( donne "garçon/fille" par exemple), j'ai voulu en créer un pour mon/ma.

Suivant le script de Kemay, j'ai fais ça :

void main() {
string sToken;
if ( GetGender(GetPCSpeaker()) == GENDER_FEMALE )
sToken="ma";
if ( GetGender(GetPCSpeaker()) == GENDER_MALE )
sToken="mon";
SetCustomToken(100,sToken); }


et dans mon dialogue j'appelle bien le token par , mais j'obtiens dans le jeu un UNRECOGNIZED TOKEN.
J'avais d'abord nommé mon script "tok_mon_ma", puis je me suis dis qu'il fallait peut-être le nommer "custom100", ce que j'ai fais ; mais le résultat est le même.

Quelqu'un qui a déjà bossé sur des tokens perso pourrait-il éclairer ma lanterne ???

Par LeProctophantasmiste le 11/10/2002 à 16:57:48 (#2317866)

Bon, je ne vois pas de raison pour que cela ne marche pas. Où as tu placé le script en question ? Je te demande cela parce que c'est un main{}, et le plus naturel me semble de le mettre en Starting conditional.

Par Jedaï le 11/10/2002 à 21:47:38 (#2319629)

Et non mon cher LeProctophantasmiste (hop, copier-coller), on ne peut mettre de fonction main() dans un startingconditional()...:rolleyes:
En réalité les Custom Tokens sont une belle saloperie, surtout que je viens de passer trois heures à tester des tas de scripts alors que le premier était bon : je ne savais pas si l'ortographe correcte était ou (alors que c'est ....) :sanglote: :bouffon:
Bon maintenant ça marche au poil : je pense améillorer et agrandir ma bibliothèque de tokens customs, en fait je vais traduire beaucoup des tokens par défaut et je vais en rajouter quelques uns pour coller à la grammaire française.
J'ai en fait créé une "librairie" de une fonction ( :D ) : TokenPersos() qui va implanter ces tokens si on la met dans le OnDialog du NPC (Ce qui présente un avantage : la plupart des NPCs susceptible de grands discours ont le même script OnDialog par défaut, il suffit de sauvegarder le script aucquel on a rajouté TokenPersos() et hop, la plupart des NPCs ont les Tokens customs)...

On ouvre le script du OnDialog par défaut, on include ma "librairie", on insère la fonction TokenPersos() au début du script, on sauvegarde sous le nom d'origine et c'est bon...

Par Jedaï le 11/10/2002 à 21:53:00 (#2319663)

Pour répondre à ta question, mon cher Cassin (je ne sais pas pourquoi je donne du "mon cher" à tous le monde ce soir c'est peut-être parce que j'ai enfin réussi à faire marcher ces :hardos: de tokens customs), met ton script dans le 1er "action taken", ça devrait marcher.

Par LeProctophantasmiste le 11/10/2002 à 23:40:13 (#2320168)

Et non mon cher LeProctophantasmiste (hop, copier-coller), on ne peut mettre de fonction main() dans un startingconditional()...

?
Ben oui, c'est bien pour cela que je le mentionnais... J'en déduisais que Cassin n'avait pas mis ce script dans un starting conditional. Le problème de action taken c'est que ça intervient au pus tôt après la première réplique non?

Bonne idée le On Dialog, je n'ai jamais utilisé ce slot je crois, GetPCSpeaker marche? EDIT: De toute façon GetLastSpeaker est le PJ donc pas de pbm.

Les tokens par défaut sont traduis quand tu utilise les dialog.tlk français donc là à mon avis tu te complique la vie.

EDIT: à propos du OnConversation, est ce que cela marche même si la conversation est initiée par le PNJ? Quand un joueur clique sur un PNJ, il lui "dit" en fait une chaine vide et c'est cela qui lance le OnConversation. Il y a un point bizaroïde d'ailleurs puisque si la chaîne est vide (ListenPatern = -1) BeginConversation est appelé, pourtant si l'on supprime le script, le dialogue par défaut à tout de même lieu (désolé si je ne suis pas clair). Je suppose donc que BeginConversation ne lance pas l'evénement OnConversation . Du coups je ne sais pas si ta méthode marche dans le cas sus mentionné, je testerais. De toute façon je vais te piquer l'idée, c'est mieux que ce que je fais pour l'instant (c'est à dire un gros bordel).

Par eMRaistlin le 12/10/2002 à 0:44:24 (#2320387)

est ce que cela marche même si la conversation est initiée par le PNJ

normalement, c'est impossible

Par Cassin le 12/10/2002 à 11:21:40 (#2321432)

Bon, j'ai donc mis mon script custom100 dans le ActionTaken de la 1ère phrase (de toutes façons il n'y en a qu'une ;) ), et dans le jeu, je n'ai en effet plus de UNRECOGNIZED TOKEN... mais je n'ai rien du tout à la place !
Ca me donne "Va, fils/fille (token du jeu)" au lieu de "Va, mon/ma fils/fille" !

Et j'ai d'autres questions, si on a besoin de mettre plusieurs tokens persos dans un dialogue, comment fait-on ? Tous dans le même script au début ?
Et si on a besoin de mettre un autre script sur la première phrase, comment faire ?

Par Jedaï le 12/10/2002 à 13:02:05 (#2321966)


Ben oui, c'est bien pour cela que je le mentionnais... J'en déduisais que Cassin n'avait pas mis ce script dans un starting conditional.


Ah, excuse moi LeProctophantasmiste, j'avais mal compris.


Le problème de action taken c'est que ça intervient au pus tôt après la première réplique non?


Pour le Action Taken je me suis aussi posé la question mais c'est Gaider lui même qui proposais de le mettre là donc...
Pour ma part je trouve que le mettre dans le OnDialog par défaut est la meilleure solution dans l'état actuel des choses (je trouve qu'il serait bien plus pratique de pouvoir créer des tokens indépendamment des conversations et de leur donner un vrai nom (parce que CUSTOM100 ça cause pas trop... ;) )).


Bonne idée le On Dialog, je n'ai jamais utilisé ce slot je crois, GetPCSpeaker marche? EDIT: De toute façon GetLastSpeaker est le PJ donc pas de pbm.


GetPCSpeaker() ne marche pas j'ai vérifié, mais GetLastSpeaker() marche effectivement, j'ai testé.


à propos du OnConversation, est ce que cela marche même si la conversation est initiée par le PNJ?


Après vos remarques j'ai changé ma fonction en ConvTokPersos(object oObjectToConverseWith, string sDialogResRef=", int bPrivateConversation=FALSE) qui lance la conversation tout en configurant les Tokens customs à partir de oObjectToConverseWith. Utilisée à la place de ActionStartConversation() elle marche parfaitement et règle le problème du NPC qui initie la conversation.


Les tokens par défaut sont traduis quand tu utilise les dialog.tlk français donc là à mon avis tu te complique la vie.


Ca marche vraiment bien ? Et avec la 1.25 ? Même sans changer la langue dans les options du jeu ?
De toute façon je rajouterai tout de même quelques token custom et puis j'ai fait cette fonction de telle façon qu'il soit enfantin de rajouter des tokens si l'on en a besoin. :cool:


Bon, j'ai donc mis mon script custom100 dans le ActionTaken de la 1ère phrase (de toutes façons il n'y en a qu'une ), et dans le jeu, je n'ai en effet plus de UNRECOGNIZED TOKEN... mais je n'ai rien du tout à la place !
Ca me donne "Va, fils/fille (token du jeu)" au lieu de "Va, mon/ma fils/fille" !


Comprend pas ?:confus:
Peut-être ton token est-il dans la 1ère phrase (David Gaider a dit de faire comme ça mais j'ai un doute..) ?
Peut-être est tu un hermaphrodite ou un extraterrestre ?:bouffon:
Si tu continue à avoir des problèmes je t'enverrais ma fonction à utiliser à la place de ActionStartConversation(), ça marche parfaitement pour moi et j'ai mis un mon/ma dedans.


Et j'ai d'autres questions, si on a besoin de mettre plusieurs tokens persos dans un dialogue, comment fait-on ? Tous dans le même script au début ?
Et si on a besoin de mettre un autre script sur la première phrase, comment faire ?


1. Tout à fait : dans le même script au début (avec des numéros différents)
2. Ben tu rajoute ton script après la configuration du token custom :

void main()
{
stoken = ... ;
SetCustomToken(666, stoken);

les actions de ton autre script...
....
}

Par LeProctophantasmiste le 12/10/2002 à 14:33:21 (#2322457)

eMRaistlin :


normalement, c'est impossible

EDIT: message tronqué, je ne voulais pas être sec :). Je ne te suis pas là, si tu veux parler d'une conversation intitiée par un PNJ, BeginConversation(",oPC) marche très bien par exemple.
Jedaï :

Ah, excuse moi LeProctophantasmiste, j'avais mal compris.

Je ne peux pas te blâmer, je viens de la relire, ma phrase n’était pas claire du tout, je ferais plus attention à l’usage des temps.


Après vos remarques j'ai changé ma fonction en ConvTokPersos(object oObjectToConverseWith, string sDialogResRef=", int bPrivateConversation=FALSE) qui lance la conversation tout en configurant les Tokens customs à partir de oObjectToConverseWith. Utilisée à la place de ActionStartConversation() elle marche parfaitement et règle le problème du NPC qui initie la conversation.

Je suis convaincu. Tu l’as surement déjà prévu mais, au cas où, Ca vaut peut-être le coup de définir BeginTokConversation(string sResRef = « », object oObjectToConverseWith = OBJECT_INVALID) aussi, histoire de pouvoir modifier les scripts le moins possible (notamment celui par défaut ), en prenant GetLastSpeaker pour les tokens dans le cas où oObjectToConverseWith =OBJECT_INVALID (peut-être pas très propre dans le cas des conv initiée par un PNJ mais de toute façon, dans ce contexte, ça n’a pas de sens de ne pas préciser l’interlocuteur) .

Ca marche vraiment bien ? Et avec la 1.25 ?

Oui à la première question (Cassin, je crois, est tombé sur un unrecognize token mais rien de plus grave) ceci dit je viens d’y passer (hier) donc je ne peux pas prétendre avoir tout vu. Il est très pratique d’avoir les descriptions par défaut en français. Pour les conversations cela simplifie la vie aussi : si tu laisse la conversation française vide, la conversation « anglaise » s’affiche. Donc quand tu n’as pas besoin de la variation homme/femme tu peux utiliser cela (j’aimerais bien être sûr que cela marche pour une vraie version française, s’il y a un volontaire, je lui envoie un module de test).
Pour la langue dans les options de jeu je ne te suis pas, il me semble que justement cette option n’existe pas si ? La seule mention de la langue que j’ai trouvée est dans config.ini mais cela n’a aucun impacte sur le jeu, je pense que c’est pour les patchs. Sinon, le fait de mettre les dialog.tlk français te fait passer en apparence à la version française (si le jeu est en cours il faut le relancer) : dans le cas des tokens par défaut tu auras le bon rendu (mais puisque les .tlk n’ont pas le support multilingue tu ne pourrais pas avoir autre chose), mais plus significatif, si tu écris une conversation avec du texte dans les fenêtres anglaise et françaises c’est le texte des fenêtres françaises (homme/femme fonctionne correctement) qui va s’afficher.
Non à la deuxième: ça je ne m’y risquerais pas tant que le version 1.25 du texte français ne sera pas sortie (si quelqu’un a essayé je veux bien connaître le résultat :)). Ne serait ce que parce qu’il y a de nouvelles créatures qui ne serait donc pas référencées (nom, description…).

Cassin : je suis aussi perplexe que Jedaï, si tu as mis la def du token dans le action taken de la réplique dans laquelle il est employé, je trouverai cela étrange que cela marche, donc le mieux est de suivre la méthode de Cassin ou d’utiliser le starting conditionnal. Sinon envoie le script histoire que l’on puisse tester.

Par Jedaï le 12/10/2002 à 16:31:58 (#2323059)

Effectivement j'ai essayé les dialog.tlk français, pour l'instant ça marche avec la v 1.25 mais évidemment je n'ai pas testé les nouvelles créatures. Les tokens marchent mais n'incluent pas les indispensable (en français) mon/ma et "/"e".

Sinon voici ma fonction pour l'instant, je reste méfiant à l'égard des dialogues français et de leur compatibilité avec les prochaînes versions de NWN :


//::///////////////////////////////////////////////
//:: Name Token Custom
//:: FileName TokCust
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Ce fichier sera a inclure dans tous les OnDialog des modules, il contient
en effet une fonction qui creera tous les tokens custom dont on m'aura fait part
du besoin notamment les tokens de grammaire francaise non-present dans la VF.
*/
//:://////////////////////////////////////////////
//:: Created By: Jedaï
//:://////////////////////////////////////////////

//Cette fonction initie la conversation et cree les token customs dont voici la liste :
//99 : /e (PC masc/fem)
//100 : mon/ma (PC masc/fem)
//101 : frere/soeur (idem)
//102 : homme/femme (idem)
//103 : monsieur/madame (idem)
//104 : race (elfe, humain/humaine...)
//1100 : Mon/Ma, 1101 : Frere/Soeur, etc...
void ActionStartTokConv(object oObjectToConverseWith, string sDialogResRef=", int bPrivateConversation=FALSE);

//Cette fonction initie la conversation et cree les token customs dont voici la liste :
//99 : /e (PC masc/fem)
//100 : mon/ma (PC masc/fem)
//101 : frere/soeur (idem)
//102 : homme/femme (idem)
//103 : monsieur/madame (idem)
//104 : race (elfe, humain/humaine...)
//1100 : Mon/Ma, 1101 : Frere/Soeur, etc...
int BeginTokConv(string sResRef=", object oObjectToDialog=OBJECT_INVALID);

void ActionStartTokConv(object oObjectToConverseWith, string sDialogResRef=", int bPrivateConversation=FALSE)
{
object o = OBJECT_SELF;
object oPC = oObjectToConverseWith;
int nTok;

if (GetGender(oPC) == GENDER_FEMALE)
{
SetLocalString(o, "s99","e");
SetLocalString(o, "s100","ma");
SetLocalString(o, "s101","soeur");
SetLocalString(o, "s102","femme");
SetLocalString(o, "s103","madame");
}
else
{
SetLocalString(o, "s99", ");
SetLocalString(o, "s100", "mon");
SetLocalString(o, "s101", "frère");
SetLocalString(o, "s102", "homme");
SetLocalString(o, "s103", "monsieur");
}
switch (GetRacialType(oPC))
{
case RACIAL_TYPE_ELF :
{
SetLocalString(o, "s104", "elfe");
break;
}
case RACIAL_TYPE_GNOME :
{
SetLocalString(o, "s104", "gnome");
break;
}
case RACIAL_TYPE_HALFELF :
{
SetLocalString(o, "s104", "demi"+GetLocalString(o, "s99")+"-elfe");
break;
}
case RACIAL_TYPE_HALFLING :
{
SetLocalString(o, "s104", "hobbit");
break;
}
case RACIAL_TYPE_HALFORC :
{
SetLocalString(o, "s104", "demi"+GetLocalString(o, "s99")+"-orc");
break;
}
case RACIAL_TYPE_HUMAN :
{
SetLocalString(o, "s104", "humain"+GetLocalString(o, "s99"));
break;
}
default :
{
SetLocalString(o, "s104", "euh... bidule");
}
}
string sMaj,sMin;

for (nTok = 99; nTok <= 104; nTok++)
{
sMin = GetLocalString(o, "s"+IntToString(nTok));
sMaj = GetStringUpperCase(GetStringLeft(sMin, 1))+GetStringRight(sMin, GetStringLength(sMin)-1);
SetCustomToken(nTok, sMin);
SetCustomToken(nTok+1000, sMaj);
DeleteLocalString(o, "s"+IntToString(nTok));
}
ActionStartConversation(oPC, sDialogResRef, bPrivateConversation);
}

int BeginTokConv(string sResRef=", object oObjectToDialog=OBJECT_INVALID)
{
object o = OBJECT_SELF;
object oPC = oObjectToDialog;
if (!GetIsObjectValid(oPC)) oPC = GetLastSpeaker();
int nTok;

if (GetGender(oPC) == GENDER_FEMALE)
{
SetLocalString(o, "s99","e");
SetLocalString(o, "s100","ma");
SetLocalString(o, "s101","soeur");
SetLocalString(o, "s102","femme");
SetLocalString(o, "s103","madame");
}
else
{
SetLocalString(o, "s99", ");
SetLocalString(o, "s100", "mon");
SetLocalString(o, "s101", "frère");
SetLocalString(o, "s102", "homme");
SetLocalString(o, "s103", "monsieur");
}
switch (GetRacialType(oPC))
{
case RACIAL_TYPE_ELF :
{
SetLocalString(o, "s104", "elfe");
break;
}
case RACIAL_TYPE_GNOME :
{
SetLocalString(o, "s104", "gnome");
break;
}
case RACIAL_TYPE_HALFELF :
{
SetLocalString(o, "s104", "demi"+GetLocalString(o, "s99")+"-elfe");
break;
}
case RACIAL_TYPE_HALFLING :
{
SetLocalString(o, "s104", "hobbit");
break;
}
case RACIAL_TYPE_HALFORC :
{
SetLocalString(o, "s104", "demi"+GetLocalString(o, "s99")+"-orc");
break;
}
case RACIAL_TYPE_HUMAN :
{
SetLocalString(o, "s104", "humain"+GetLocalString(o, "s99"));
break;
}
default :
{
SetLocalString(o, "s104", "euh... bidule");
}
}
string sMaj,sMin;

for (nTok = 99; nTok <= 104; nTok++)
{
sMin = GetLocalString(o, "s"+IntToString(nTok));
sMaj = GetStringUpperCase(GetStringLeft(sMin, 1))+GetStringRight(sMin, GetStringLength(sMin)-1);
SetCustomToken(nTok, sMin);
SetCustomToken(nTok+1000, sMaj);
DeleteLocalString(o, "s"+IntToString(nTok));
}
return BeginConversation(sResRef, oPC);
}


Les deux fonctions marchent je les ai testées.Cassin, tu n'as qu'à copier cette mini-librairie dans un script que tu appellera comme tu veux, sauvegarde le, ouvre le script standard nw_c2_default4, au début met #include "le nom que tu as donné à ma mini librairie" et dans le corps du script remplace BeginConversation() par BeginTokConv(). le token mon/ma est le 100ème et "/"e" le 99ème.

Je lance un appel au token :

FAITES MOI PART DE TOUS LES TOKENS QUI VOUS PARAITRONT UTILE, JE POURRAIS AINSI LES INTEGRER A CETTE MINI-LIBRAIRIE

Vous pouvez aussi faire des suggestions de nouvelles fonctions, si c'est faisable je les rajouterais

Par Cassin le 12/10/2002 à 22:22:45 (#2325015)

Wahou, un grand merci Jedaï !

Bon, le script marche pas pour l'instant :D : quand je veux l'enregistrer il me dit qu'il n'y a pas void main() et me demande si je veux l'enregistrer en tant que script conditonnel ou un truc du genre. Quand je répond "oui", il me sort un ERREUR : NO FUNCTION STARTINGCONDITIONAL() IN SCRIPT.

Quoiquejefais ?

Mais sinon nul doute que ce script deviendra LA référence pour les tokens français ! ;)

Par Jedaï le 12/10/2002 à 22:32:20 (#2325087)

Tout à fait normal Cassin : étant une librairie, ce script ne peut effectivement se compiler, si tu ne veux pas obtenir de message d'erreur utilise save as et pas save and compile (je crois). Mais de toute façon quoi que tu utilise ce n'est pas un problème : tu fait l'include dans le script de OnConversation par défaut et tu remplace BeginConversation() par BeginTokConv() et ça marchera (par contre si là tu obtient une erreur informe-moi, ce ne sera pas normal).

Par Cassin le 13/10/2002 à 0:22:34 (#2325603)

Impeccable ! Ca marche !

Merci à toi !

JOL Archives 1.0.1
@ JOL / JeuxOnLine