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