Stocker des variables.

Une des choses les plus courantes que vous aurez à faire est de stocker des variable et de les retrouver… C’est la seul manière de déterminer comment la plupart des événements vont prendre place ou bien de changer/garder l’état d’une quête.

La commande que vous utiliserez le plus fréquemment pour stocker des variables est celle ci:


void SetLocalInt(object oObject, string sVarName, int nValue)

Cette commande stocke une ‘local integer’ (un entier local). Qu’est ce que local veut bien dire ? Cela veut dire que l’entier est référencé, ou ‘stocké’, dans « l’ oObject » que vous avez spécifié. (Il n’est pas enregistré la physiquement, mais il est plus facile de penser que c’est le cas.)

Il y a trois choses qui sont importantes à retenir ici :

- l' «object oObject » doit être un objet valide. Vous verrez beaucoup de commandes qui renvoient un objet au début de leur structure (comme il est marqué « void » au début de la commande « SetLocalInt ») Cela signifie que ces commandes retournent comme donnée le type de l’objet.

Dans tous les cas, l’objet que vous spécifié est la où « l’integer » est référencé. Si vous êtes dans un dialogue, utiliser GetPCSpeaker() retournera le PC qui est en train de parler au NPC qui est l’objet. Vous pouvez utiliser GetModule() pour enregistrer « l’integer » dans le module lui même… Vous pouvez utiliser OBJECT_SELF pour nommer l’objet qui est utilisé dans le script actuel, etc.

C’est important parce que la variable que vous choisissez deviens unique pour cet objet. Si vous stockez une variable avec le nom « VARIABLE 1 » avec la valeur 1 dans le module, c’est la seule variable qui peut être appelée par ce nom. Vous pouvez avoir une « VARIABLE 1 » enregistrée dans un autre objet, comme un PC, et il peut avoir des valeurs complètement différentes.

- La « string sVarName » est le nom que vous donnez à votre variable. Vérifiez bien qu’il est unique. Comme toutes les strings (chaînes de caractères), il doit être entouré de guillemets (comme « VARIABLE 1 » ci dessus). Les noms de variables ne différencient pas les majuscules des minuscules.

-La « int nValue » est l’information que vous voulez stocker dans la variable. Tant que c’est un entier nous utiliserons cette commande, mais ca doit être un entier (sans décimales) (NdT c’est pas moi qui insiste autant, c’est Bioware)…
comme 1, 15 ou 320. Si vous voulez entrer différentes informations ici, vous avez besoin d’autres commandes :
SetLocalFloat = enregistrer un « float number » (un nombre avec une partie décimale)
SetLocalString = enregistrer une « string » (comme un mot, une phrase ou le nom d’un objet… Elle doit juste être écrite entre guillemets, comme le nom de la variable.)
SetLocalLocation = enregistrer une localisation
SetLocalObject = enregistrer un objet (comme un « placeable object », un objet d’inventaire ou une créature.)

NdT : à partir de maintenant, par soucis de clarté, j’utiliserais le terme d’integer (ou int) et non sa traduction

Comment dois je utiliser les variables ?
Bien, une fois que vous avez enregistré une variable dans quelque chose, elle reste la jusqu’à ce qu’elle soit remplacée ou détruite. N’importe quand, dans un autre script (ou dans le même) vous pouvez rappeler cette variable et l’information qu’elle contient.

Si je veux rappeler le nombre que je viens d’enregistrer dans la variable, je dois utiliser cela :


int GetLocalInt(object oObject, string sVarName)

C’est exactement la même commande que celle que vous avez utilisé pour enregistrer la variable… moins la valeur actuelle de la variable (c’est ce que nous attendons)

Remarquez que ce n’est pas une commande « void »…Elle retourne un entier. Cela veut dire que vous n’utilisez pas seulement toute seule. Utilisez la pour définir tout autre « int » nécessaire dans une autre commande ou variable comme cela :


int nValue = GetLocalInt(OBJECT_SELF, "VARIABLE1")

Cela signifie que vous avez spécifié une nouvelle variable appelée « nValue » qui est équale à l’integer qui était stocké dans l’OBJECT_SELF sous le nom "VARIABLE 1"

C’est encore un peu confus ? voici des exemples.

Un bon exemple pour comprendre comment une variable peut être utilisé est de suivre la progression d’une quête. Je veux avoir une variable qui s’appelle "STORY"… quand le joueur accepte la quête, je veux lui attribuer la valeur 1. Quand il l’a fini, je lui attribue la valeur 2.

Le joueur accepte la quête…
Au moment du dialogue ou le joueur accepte, je vais dans « Actions Taken » et fait un script qui entre 1 dans la variable "STORY" du PC.



void main()
{
SetLocalInt(GetPCSpeaker(),
"STORY", 1);
}

Le joueur termine la quête…
Une fois que le PC est revenu et a fait ce que le NPC veut, le NPC le félicite et la valeur 2 est stockée dans la variable "STORY" du PC.


void main()
{
SetLocalInt(GetPCSpeaker(),
"STORY", 2);
}

Comment je sais si le joueur a accepté ou terminé la quête ?
Au moment voulu dans le dialoque, vous avez juste besoin de créer un nouveau nœud pour chaque condition. L’ordinateur commencera par le haut et vérifiera tous les scripts dans la section « Text Appears When » et regarde si ils sont vrai (TRUE) (si il n’y a pas de scripts, il considérera automatiquement que c’est vrai.)
Dans ce cas, il commence ce nœud. Sinon, il passe au suivant.

C’est pourquoi, vous devez lister ces nœud du dernier au premier.

#1. (quête terminée) "Merci d’avoir accompli cette tache."
#2. (quête acceptée) "Avez vous terminé cette quête ?"
#3. (ni acceptée, ni terminée) "Bonjour"

Maintenant, vous avez besoin d’un script qui renvoie TRUE pour #1 si la variable "STORY" est égale à 2, n’est ce pas ?Et pour #2, le script doit retourner TRUE si la variable est égale à 1. Aucun script n’est nécessaire pour #3 car si #1 et #2 sont faux (FALSE pour le script), c’est que la quête n’a été ni acceptée, ni terminée.

Est ce que la quête est terminée ?


int StartingConditional()
{

int nDone = GetLocalInt(GetPCSpeaker(), "STORY") == 2;
return nDone;
}



Est ce que la quête a été acceptée ?


int StartingConditional()
{

int nAccept = GetLocalInt(GetPCSpeaker(), "STORY") == 1;
return nAccept;
}


Normalement, vous devriez arriver à ceci:
#1. (1er script dans "Text Appears When") " Merci d’avoir accompli cette tache."
#2. (2nd script dans "Text Appears When") " Avez vous terminé cette quête ?"
#3. (no script) " Bonjour "

Dans le script ci dessus, je voulais seulement que le NPC donne la quête à 1

Au moment ou il fixe la variable "STORY" à 1, pourquoi est ce qu’il n’a pas crée une variable "PLOT_GIVEN" rattachée à OBJECT_SELF (c.a.d le NPC) ?

Dans ce cas, lorsqu’un autre PC qui n’aurait pas de variable "STORY" parle au NPC, vous pourriez avoir à la place du texte par défault (#3) un dialogue divisé en 2 :
|
|
--> (script dans "Text Appears When" qui renvoie TRUE si "PLOT_GIVEN" de « OBJECT_SELF » a pour valeur 1)
"Désole, je n’ai pas de travail pour vous aujourd’hui"
|
|
--> (pas de script) "Est ce que vous êtes intéressé par un travail ?"


Un exemple très simple de dialogue de quête.
La chose à se souvenir est que quand vous créez votre premier nœud, juste en dessous de Root, les propositions doivent être dans l’ordre inverse de l’ordre dans lequel elles seront complétées. (cf exemple ci dessus)

Admettons maintenant que notre NPC donne 3 boulots. Imaginez la structure suivante sous le « root » :

#1. "Je n’ai plus aucun travail pour vous."
#2. "Avez vous fini le travail #3?"
#3. " Avez vous fini le travail #2?"
#4. " Avez vous fini le travail #1?"
#5. "Est ce que vous cherchez un travail ?"
#6. "Salut!"

Il faut se souvenir que lorsqu’on clique sur un NPC, l’ordinateur commence à vérifier le script « Text Appears When » des parties du noeud. Si le script renvoie TRUE (ou si il n’y a pas de script), ce nœud est initialisé. Si il retourne FALSE, il passe à la suite.

Voici la liste des script qui sont attribué à chaque nœud.

#1 - script dans 'Text Appears When' qui renvoie TRUE si la variable "Job" du PC a pour valeur 4:


int StartingConditional()
{

int nJob = GetLocalInt(GetPCSpeaker(), "Job") == 4;
return nJob;
}



#2 - script dans 'Text Appears When' qui renvoie TRUE si la variable "Job" du PC a pour valeur 3 (cf. ci dessus). Si le PC a fini le travail, le NPC donne la récompense et fixe la variable "Job" à 4 (plus de travail) dans « Action Taken » comme ceci :


void main()
{
SetLocalInt(GetPCSpeaker(),
"Job", 4);
}


#3 - script dans 'Text Appears When' qui renvoie TRUE si la variable "Job" du PC a pour valeur 2 (cf. ci dessus). Si le PC a fini le travail, le NPC donne la récompense et le travail #3 et fixe la variable "Job" à 3 dans « Action Taken »

#4 - script dans 'Text Appears When' qui renvoie TRUE si la variable "Job" du PC a pour valeur 1 (cf. ci dessus). Si le PC a fini le travail, le NPC donne la récompense et le travail #2 et fixe la variable "Job" à 2 dans « Action Taken »

#5 - Script dans 'Text Appears When' qui renvoie TRUE si la variable "TalkedToJoe" du PC est fixée à 1 (cf. ci dessus). Dans le dialoque, si le PC accepte le travail #1, fixe la variable "Job" du PC à 1 dans 'Actions Taken'.

#6 – Pas de script dans 'Text Appears When' (si tous les autres scripts qu dessus sont « FALSE », c’est que le PC a parlé pour la première fois au NPC). Sur la première ligne, placez un script dans « Action Taken » qui fixe la variable "TalkedToJoe" du PC à 1.


Voilà comment stocker et rappeler des variables. Utiliser les « strings », les « object data » et autres données est un peu plus compliquées... mais ça paraîtra plus aisé maintenant que vous êtes habitué à manipuler les «integers». En espérant que ca vous aidera à débuter.


PS: la traduction est parfois un peu approximative, mais l'ensemble devrais être clair et cohérent. Sinon envoyez moi un MP (même si je ne pourrais peut être pas repondre tout de suite.)

La suite devrais suivre d'ici peu de temps. Mais un peu de patience quand même car ce tutorial fait 68 pages...

__________________
Théranthil, Mage Elfe prêtre de Mystra Membre des GdE
Parti Elmotiste pour un parler jowilien: Ministre supérieur de la corruption

"Les langues vont toujours bon train. Les pieds ont du mal à suivre."
(les bourses aussi NdT )
Mespert de la porte de Baldur