[Bibliothèque]Custom tokens !

Répondre
Partager Rechercher
Voilà ce que j'ai à proposer :

[Edit by eM :]
ICI .

Une bibliothèque de gestion des tokens, non des tokens dans l'inventaire, mais bien de ceux qu'on peut utiliser dans les dialogues pour obtenir le nom du PC par exemple. ( <FirstName>, <Sir/Madam>, etc...)

Les tokens proposés en standard par Bioware sont utiles mais un peu limité, surtout en français et surtout en grammaire française : il n'existe même pas de token permettant l'accord au féminin comme </e> !

Aussi Bioware a-t-il fourni un outil pour se créer ses propres tokens : les customs tokens, ils s'écrivent <CUSTOMn> (avec n un entier entre 1 et 99999 environ) et ont une valeur bien déterminée. Autrement dit, pour tout accord de genre ces tokens sont lourdement inadaptés puisqu'il faut pour les utiliser dans ce cas, créer un script qui change leur valeur en fonction du sexe du PC ET placer ce script dans toutes les conversations où on va utiliser ce token...

Tout cela devient franchement très lourd lorsqu'on doit gérer plusieurs tokens qu'on emploie fréquemment, d'autant plus que les tokens de Bioware souffrent d'une seconde limitation :
On ne peut pas les utiliser dans un script ! L'emploi des tokens (aussi bien standard que custom) est limité aux dialogues.
Alors d'accord un peu d'imagination permet de huiler les rouages et d'éviter d'avoir à personnaliser ses scripts en fonction du PC auquel on s'adresse (tâche la plupart du temps très lourde il faut bien l'avouer), mais n'est-il pas regrettable de se priver ainsi d'un monde ou les NPCs, soudain guéri de leur presbytie, s'adresse aux PCs selon leur apparence, leur réputation, leur sexe et leur race...
N'est-il pas regrettable que la plupart des taverniers elfes traitent les PCs nains comme des clients normaux alors qu'ils ne devraient leur adresser la parole que pour des injures pleines de fiel ?...

Pour pallier à tous ces inconvénients, je me propose de mettre à disposition ce que je considère comme l'aboutissement de mes efforts en ce domaine. C'est à dire une bibliothèque (inspirée par une idée fondatrice de Lendraste et par une fonction de Gloirin/Wololo) qui permet ce que je crois être la solution la plus souple et la plus puissante qui soit actuellement possible (tant que Bioware n'aura pas autorisé le dialog.tlk dans les haks, on ne trouvera pas mieux qui soit indépendant de la machine) : Une solution qui vous permet d'associer deux concepts intéressants, c'est à dire l'association d'un script à un type de token, et la personnalisation de ce type de token indépendamment du script. Je m'explique :

"<mf:cuisinier/cuisinière>", ce token est lié au script "tok_mf" qui renvoie 0 si la cible du token est masculine, 1 si elle est féminine. Ce script se présente ainsi :
Code PHP:

#include "nwl_sti"

void main()
{
    
object oTest GetObjectTokTarget();
    
int nChoice = -1;

    if (
GetGender(oTest) == GENDER_FEMALEnChoice 1;
        else 
nChoice 0;

    
ReponseInt(nChoice);

Comme vous le voyez, ce script est totalement indépendant du contexte, sa mise en oeuvre est assuré par la bibliothèque centrale qui se chargera de le lancer automatiquement si le token est utilisé, de lui fournir les bonnes valeurs et de récolter le résultat, résultat qui sera utilisé pour obtenir un résultat final qui n'est pas explicité dans le script.
Ce script est bien évidemment l'un des plus utile : il permet d'utiliser des tokens comme : "<mf:/e>" (le fameux token d'accord dont je vous parlais) ou même :
"<mf:Viens te battre femmelette, on va voir ce que tu vaux !/Désolé m'dame, j'croyais qu'c'était quelqu'un d'autre [Il incline respectueusement son chapeau].>"

Ce concept est extensible à toute sorte de chose, en fait à tout ce que vous permet votre imagination : il vous suffit de rédiger une fois un script, vous n'êtes plus limité par une mise en place fastidieuse puisque c'est la bibliothèque qui s'en occupe à votre place.
Notez que ce token est utilisable aussi bien dans les scripts (ou il est possible de le "calculer" grâce à l'une des fonctions de la bibliothèque) que dans les dialogues. Pour ces derniers, une seule opération suffit à rendre le token disponible et dynamique :
Code PHP:

AddCustomToken(666"<mf:cuisinier/cuisinière>"); 

Suite à l'utilisation de cette fonction, ce token sera disponible sous l'appellation "<CUSTOM666>" dans tous les dialogues et ceci sans qu'il soit nécessaire de placer un quelconque script pour recalculer sa valeur : la bibliothèque s'en chargera toute seule !



Vous êtes encore là ?
Bon, si vous êtes intéressé ou désirez des précisions n'hésitez pas !
Wink
Ca m'intéresse beaucoup, je suis en train de me farcir la traduction de l'ATS de Mojo et y'en a partout des Custom tokens. Même si j'arrive à me démerder avec ça reste quand même assez obscure. Alors si tu veux développer plus loin tu auras une oreille attentive en ce qui me concerne

Jaha Effect
[edit] je parle bien des CUSTOM TOKEN qui se trouvent dans les dialogues et pas ceux dans l'inventaire
En ce moment, j'utilise des tokens qui doivent être calculé à la seconde près où la discussion a lieu donc ça ne m'intéresse pô directement mais je vais kan même (essayer de) suivre ce système de prêt
Citation :
j'utilise des tokens qui doivent être calculé à la seconde près où la discussion a lieu donc ça ne m'intéresse pô directement
A la seconde près vraiment ou alors ça suffirait qu'il soit calculé juste au début de la conversation ?
Parce que c'est exactement ce que fait ma bibliothèque (bah voui, sinon ça n'a aucun intérêt).

Par ailleurs il existe une fonction qui recalcule automatiquement tout les customs tokens à la demande. Ca peut servir.


Citation :
Ca m'intéresse beaucoup, je suis en train de me farcir la traduction de l'ATS de Mojo et y'en a partout des Custom tokens. Même si j'arrive à me démerder avec ça reste quand même assez obscure. Alors si tu veux développer plus loin tu auras une oreille attentive en ce qui me concerne
Ah une oreille attentive, y a rien de tel !
En fait si tu cherche des informations sur les customs tokens en eux-mêmes, ça pisse pas loin parce que l'implémentation de Bioware pour les tokens customs est totalement basique : il s'agit simplement d'une chaîne en mémoire, numéroté et accessible (uniquement en écriture) par la fonction SetCustomToken(int nN° Du Token, string sChaine Du Token).
Elle remplace directement le token correspondant <CUSTOMn> si il se trouve dans un dialogue.
Comme tu le vois, de base les custom token n'offre aucune place au dynamisme. Ce traitement de l'information doit donc se faire en aval au travers d'un script qui vérifiera le sexe (par exemple) du PC qui tape la discute et qui modifiera la valeur du token en fonction de cela. Bien sur c'est lourd, bien sur c'est chiant....

Alors qu'il aurait été si simple pour Bioware d'offrir la possibilité de créer un script "lié" à un custom token qui en aurait décidé la valeur juste quand le token aurait été rencontré dans une phrase...

Mais il ne l'ont pas fait, d'où la création de cette bibliothèque qui permet également d'étendre la notion de token au script.
Exemple : Ce script fait appel à l'une des fonctions de remplacement de ma bibliothèque pour délivrer un message personnalisé (il est vrai peu original...):
Code PHP:

#include "nwl_tokcust"

void main()
{
    
object oPC GetLastPerceived();
        
    if(
GetLastPerceptionSeen())
    {
        
SpeakTokStr("<bTimelocalint:Excusez-moi, vous m'empéchez de me concentrer, faites plus attention./" +
        
"J'en suis à une phase cruciale de ma méditation, et vous la troublez, retirez-vous !/" +
        
"Je vous ai déjà dit que vous êtes chiant<mf:/e> ?/" +
        
"Etes vous <mf:un crétin/une idiote> ou simplement <mf:un inconscient/une inconsciente> ?/" +
        
"Mais qu'avez vous à passer et à repasser ?!/" +
        
"Vous allez vous en mordre les doigts !!!/" +
        
"Cette fois c'en est trop, disparaissez pauvre <mf:sot/sotte> ! [l'air semble crépiter tandis qu'il se lève]>"oPC);
                
        
nTime GetLocalInt(oPC"bTime");
        
        if(
nTime == 6)
        {
            
ClearAllActions();
            
ActionCastFakeSpellAtObject(SPELL_FINGER_OF_DEATHoPC);
            
ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANTExtraordinaryEffect(EffectDeath(), oPC));
            
ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE1.03600.0);
            
SetLocalInt(oPC"bTime"0);
        }
        else 
SetLocalInt(oPC"bTime"nTime+1);        
    }

Haaaaaaaa

Ok, je croyais que la bibliothèque définissait des CUSTOM au lancement du module et qu'une fois ceci fait, ils restaient fixe.

Donc début de conversation, oui ça m'intéresse

Plus précisement, j'aimerais qu'un PNJ (un horloger par exemple) puisse me dire l'heure exact:
"Bouyour, il est 13h37."

J'arrive à reproduire ce phénoméne en attachant un script de mon cru dans les conditions d'éxecution.
Code PHP:

Il est <StartAction><CUSTOM6734></Start>:<StartAction><CUSTOM6735></Start>(<StartAction><CUSTOM6736></Start>). 

Code PHP:

int StartingConditional() {
    
int nHour GetTimeHour();
    
int nSecond GetTimeSecond();
    
int nMinByHour FloatToIntHoursToSeconds1)) / 60;

    
int nMinute = (60 nMinByHour) * GetTimeMinute();
    
nMinute nMinute nSecond nMinByHour;

    
sHour IntToString(nHour);

    if (
nMinute 10)
        
sMinute "0" IntToStringnMinute);
    else
        
sMinute IntToStringnMinute);

    if (
nSecond 10)
        
sSecond "0" IntToStringnSecond);
    else
        
sSecond IntToStringnSecond);

    
SetCustomToken6734IntToString(nHour));
    
SetCustomToken6735sMinute);
    
SetCustomToken6736sSecond);

    return 
TRUE;
    } 
Bon c'est du script de barbare

Les secondes sont facultatives, ça me sert de debug. Je viens de remarquer que le token des heures existe déjà dans nwn lol, mais pô pour les minutes.

J'ai encore plein d'autres tokens comme ça pour les mois, les jours de la semaine, etc.

Vu que je serais pô seul à utiliser ces token, ta biblio me semble très très intéressante
Si je peut me permettre d'ajouter ma tite pierre à l'édifice au vu du script de Skanzo (même si ça traite pas directement du sujet) :
tu peux obtenir un texte coloré plus simplement qu'en utilisant <StartAction> etc.
Je m'explique : dans ton dialogue, tu réduit ceci :
Code PHP:

Il est <StartAction><CUSTOM6734></Start>:<StartAction><CUSTOM6735></Start>(<StartAction><CUSTOM6736></Start> ). 

en ceci :
Code PHP:

Il est <CUSTOM6734>. 

Ensuite, dans ton token 6734, tu enregistre la string complète "heure:minute:seconde".

Puis vient le moment de la coloration En mettant une balise <c...> dans une string, tous les caractères qui la suive seront colorés selon ce que tu as mis après le "<c".
En gros, tu a 3 caractères à mettre : le premier commande le rouge, le 2e le vert et le 3e le bleu (à revérifier ). Ce qui sera pris en compte, c'est le code ASCII du caractère que tu mets.

exemple : <c+dd>
+ = 200 en ASCII
d = 100
Ce qui me donnera un texte légèrement rouge et un peu sombre (j'ai pas testé hein ).

Pour accéder aux caractères ASCII, tape : ALT[maintenu] + (code du caractère tapé sur le clavier num)
(j'ai essayé en le tapant dans le bloc notes et en le copiant dans le script, ça marche impec)

Pfiou, voilà, c'était complètement HS mais je m'en voulais de te voir galérer avec les tokens d'action

__________________

http://i70.servimg.com/u/f70/09/00/20/26/userba10.gif
Militant pour la résurrection de NWN1
Citation :
Ok, je croyais que la bibliothèque définissait des CUSTOM au lancement du module et qu'une fois ceci fait, ils restaient fixe.
Tu me prend pour un fou !!

Je me serais pas tapé plus de mille lignes de code pour faire la même chose que ce que fait déjà très bien NWN !!!!

Quant à ton token, on pourrais le "traduire" par le token "<time:>" et le script "tok_time" suivant :
Code PHP:

#include "nwl_sti"

void main()
{
    
string sChoice "";
    
    
int nHour GetTimeHour();
    
int nSecond GetTimeSecond();
    
int nMinByHour FloatToIntHoursToSeconds1)) / 60;

    
int nMinute = (60 nMinByHour) * GetTimeMinute();
    
nMinute nMinute nSecond nMinByHour;

    
sHour IntToString(nHour);

    if (
nMinute 10)
        
sMinute "0" IntToStringnMinute);
    else
        
sMinute IntToStringnMinute);

    if (
nSecond 10)
        
sSecond "0" IntToStringnSecond);
    else
        
sSecond IntToStringnSecond);
    
    
sChoice sHour ":" sMinute ":" sSecond;
    
ReponseString(sChoice);    

Token que tu pourras à présent employer dans tes scripts (c'est un truc de fainéant ça) et dans tes dialogues si tu mets ceci dans ton OnModuleLoad :

Code PHP:

AddCustomToken(6000"<time:>"); 

Bon tu pourras pas faire tes deux points en noir et les chiffres en couleurs (note que tu pourrais si tu définissais trois tokens, ou si je faisais l'effort d'essayer de comprendre les "tokens de couleurs" que Bioware a récemment dévoilé) mais le token <CUSTOM6000> sera disponible dans tous tes dialogues avec l'heure de début de conversation (pourvue que celle-ci ne dure pas trop...).

Le token pour les mois est fourni en standard mais je ne vois pas trop comment tu obtient le jour de la semaine ? De toute façon si tu pouvais le faire avec le système de Bioware, tu pourras le faire dans ma bibliothèque.
Whouaa

Déjà, les color token, ça m'enlève une épine du pied! Paske ça fait un bail que je me pose la question:
"Comment c'est qu'ça marche ce foutu <c machin qui me fait toujours un texte bizar hyper sombre?"

Trop extra
Merci Taern!


Ben heu, sinon Jed, ta biblio, c'est on ne peut plus simple, il me la faut!
Mais bon, je sais que tu y arrivera parce que t'es complétement fou!

J'essaie d'inclure dans mon module mon propre système de date qui n'a plus rien à voir avec celui de Nwn. C'est un truc de zinglé du neurone

Jedaï, I you si ça marche!
Bah voilà les deux nouvelles versions des scripts que j'avais donné hier, les changements résultent de tout ce que j'ai modifié entretemps. Je précise qu'il ne s'agit pas là de théorie, mais que ma bibliothèque est d'ores et déjà capable de gérer ça :

Code PHP:

#include "nwl_sti"

void main()
{
    
string sChoice "";
    
    
int nHour GetTimeHour();
    
int nSecond GetTimeSecond();
    
int nMinByHour FloatToIntHoursToSeconds1)) / 60;

    
int nMinute = (60 nMinByHour) * GetTimeMinute();
    
nMinute nMinute nSecond nMinByHour;

    
sHour IntToString(nHour);

    if (
nMinute 10)
        
sMinute "0" IntToStringnMinute);
    else
        
sMinute IntToStringnMinute);

    if (
nSecond 10)
        
sSecond "0" IntToStringnSecond);
    else
        
sSecond IntToStringnSecond);
    
    
sChoice "{c(red:}" sHour "{c(white:}:" +"{c(red:}" sMinute "{c(white:}:" +"{c(red:}" sSecond "{c(white:}" ;
    
ReponseString(sChoice);    

Et pour initialiser le token pour les dialogues :
Code PHP:

AddCustomToken(6000"{time(:}"); 

Là en fait j'ai terminé presque tous les tests préliminaires, ma prochaine tentative va être de surcharger le système (sachant que j'ai un 500 MHz et 64 MO de RAM, ça devrait pas être trop difficile ) pour voir combien de token il peut gérer sans peine et si ça vaut le coup de repenser un grand coup (même si là je ne vois pas de solution : on n'a pas accès aux dialogues par les scripts donc on peut pas savoir ce qu'il y a comme token à l'intérieur ) le système de recalcul automatique de custom token.
Voilà, elle est disponible, manque un peu d'un tutoriel sur la création de script-token, mais c'est pas trop dur de toute façon. Je verrais à améliorer le tutorial quand j'aurais un peu de temps libre (tout de suite je suis un peu submergé... ). L'utilisation est expliqué dans le readme.

Vous la trouverez à ce lien.

En espérant que ça vous serve !
J'ai commencé à regarder. Dès demain je vais bidouiller tout ça pour mon module.
Mais vu dans quel état j'ai laissé mon module, ça va pô être de la tarte de s'y retrouver

Edit: Houla, excuse Jed. Oubli le PM que je t'ai envoyé. Il me manquait un include, j'avais pô téléchargé le bon zip
bon, j'arrive un peu après la bataille, mais elle m'a mis ds tt mes états cette bibliothèque ^_^
c très vachement térrible pour faire des machin rp super custom de la mort avé plein d'aléatoire dedans
mais je me demandais : est ce qu'on peut traiter les tokens avant de lancer la "speaktokstr"' ?
je m'explique : en fait le but ce serais de faire des réplique qui dépendrais Et de la race du PNJ ET de la race du PJ
alors, déjà comme c'est des string on peut bien les torturer les tokens, mais est ce que c'est possible ? parce que pour l'instant ils sont appliqués qu'a un seul objet ... ou alors g loupé un épisode ?
Je pense que c'est possible mais faut que Jedaï puisse confirmer.

Faut créer un script tok_* qui vérifie la classe du PJ avec comme déclarations:
Code PHP:

object oTest GetLocalObject(oMod"oTok_Target"); 

Et pour le PNJ, je pense que cette déclarations devrait fonctionner:
Code PHP:

object oSpeaker OBJECT_SELF
Après ya plus qu'à se donner du courage et traduire chaques possibilités


J'ai dit une conneurie ou pô? :bouffon:
ba justement, c un peu complètement c*****t
donc je me demandais si y avait pas moyen de faire un machin du genre
Code PHP:

void SpeakTokStr(string strtoketospeakobject oObjobject oObj2); 

avec par exemple oObj qui correspond au token normaux et oObj2 qui correspondrais aux tok qu'ont une forme un pitit peu différent, genre, ba ché pas {mf2(:/e} par exemple, qui accorderais les adj en fonction du oObj2
en fait c t a ca que je pensais, parce que je voyais pas comment accordés les tok avant de faire un "SpeakTokStr"

ou alors plus simple, un truc du genre

Code PHP:

string MixTkStr(string strtomoxobject oObj); 

qui permettrais de récupérer dans le script une string accordée à coup de tokens ... ainsi après on l'inclu dans la string que l'on veut faire dire au PNJ et ainsi elle est accordée et au pj et au pnj ...
disons que personnellement ca me simplifierais plus ou mois la vie
ca m'éviterais de passer par les custom tokens par exemple (ce a quoi je commence a penser) ou bien ca simplifierais les
Citation :
monstrueux amalgame de Select Case
enfin bon, c p-e n'importe quoi ce que je dis là ...
J'ai du mal à comprendre ce que tu cherche à faire malgré tes efforts, sorry

Pour moi, cela me semble toujours aussi simple, j'ai du louper un épisode ou un chapitre..


Dans la bibliothèque nwl_sti, tu as deux fonctions, GetObjectTokTarget et GetObjectTokSpeaker.

Code PHP:

object oObj GetObjectTokTarget();
object oObj2 GetObjectTokSpeaker(); 
Avec le oObj2, tu peut accordé en fonction du PNJ.


Code PHP:

// sauvegardé sous "tok_mf2"
#include "nwl_sti"

void main()
{   
object oTest GetObjectTokSpeaker();
    
int nChoice = -1;

    if (
GetGender(oTest) == GENDER_FEMALEnChoice 1;
        else 
nChoice 0;

    
ReponseIntnChoice);

Avec ça, ton mf2 devrait fonctionner... non?
*front plissé sous l'effet d'une reflexion intense sûrement*



mici, j'avais pas trop vu a quoi correspondait ces deux fonctions
genial, merci
excellent !
/me est content, il vient de comprendre un truc

bon, la question subsidiaire : est que y a une limite aux tokens ?
ouai mais les token fo bien les mettre quelque part aussi... Alors dans une boite placé dans l'inventaire ? (bans la limite c la boite ^^) dans l'inventaire (tain ca va etre lourd les token qui se balade partout, ben la la limite c l'inventaire ^^
sspas drole
g fais des grosses phrase plien de token et ca me met des "too mainie instructions" gnagnagna plantage
bon, je reprend tt ca au propre et c bon
le pb avec ce genre de truc c qu'on risque de partir en "création pure" a tt moment *retournes se cacher*
@ Darkshaman > Ce sont les tokens des DIALOGUES.....

@ Reyan > Te fatigues pas à faire un nouveau token, c'est géré dans la bibli depuis longtemps la possibilité de viser deux objets différents dans la même phrase : si tu mets
Code PHP:

SpeakTokStr"Moi {object_self?mf):Tarzan/Jane}, toi {mf(:ami/amie}"oPC ); 

Ca devrait le faire !

Mais j'avais mis ces possibilités supplémentaires sous le tapis vu que j'avais l'impression que les tokens de base suffisait et que les avancés étaient assez compliqués comme ça....
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés