Page 1 sur 1

[DLG] Comment utiliser des variables dans un dialogue ?

Posté : sam. 10 août 2013, 10:19
par Cocrane
Petite question que je n'ai pas encore approfondi de mon coté.

Si dans le cadre d'un dialogue, le Charname fait un choix de réponse qui oriente l'histoire, je suppose qu'il est possible de mettre à jour des paramètres via le dialogue?

Exemple
Le Charname se fait un ami ou un ennemi selon la réponse sélectionnée. On peut imaginer une variable du jeu qui s’appelle 'relation' qui prendra la valeur 'ami' ou 'ennemi'.

Existe t'il des mots clés ACTION qui permettent de mettre à jour la valeur d'une variable?
Existe t'il des mots clés CONDITION qui permettent de tester la valeur d'une variable?

Dans le cadre de l'éditeur, je propose cette liste de mots clés CONDITION et ACTION. Existe-t-il un lien qui explique le rôle de chaque mot clé ?

Cocrane

Posté : sam. 10 août 2013, 22:44
par Freddy_Gwendo
Réponse en deux points :

Si ce que tu cherches, c'est rendre ton interlocuteur ennemi, c'est simple. A la fin du dialogue, tu insères DO ~Enemy()~ EXIT.


Quant aux variables, oui, on peut les gérer avec les dialogues, comme avec les scripts :
30 SetGlobal(S:Name*,S:Area*,I:Value*)
This action sets a variable (specified by name) in the scope (specified by area) to the value (specified by value).


109 IncrementGlobal(S:Name*,S:Area*,I:Value*)
This action alters the specified variable, in the specified scope, by the amount indicated. The amount can be positive or negative. Variables in the local scope cannot be changed with this action.

Et tu peux les utiliser dans des conditions avec
0x400F Global(S:Name*,S:Area*,I:Value*)
Returns true only if the variable with name 1st parameter of type 2nd parameter has value 3rd parameter.


0x4034 GlobalGT(S:Name*,S:Area*,I:Value*)
See Global(S:Name*,S:Area*,I:Value*) except the variable must be greater than the value specified to be true.


0x4035 GlobalLT(S:Name*,S:Area*,I:Value*)
As above except for less than
:!: Le hic, c'est que la mise-à-jour des variables se fait lorsque le dialogue se termine. :(
En d'autres termes, tu ne peux pas définir une variable dans une session de dialogue et t'en servir comme condition dans la même session. Il faut que le dialogue prenne fin pour qu'elle soit mise-à-jour.
Une des astuces consistait à terminer le dialogue par une cinématique rapide qui se conclue par une reprise du dialogue déclenché en utilisant la variable modifiée.


Heureusement, ToBEx remédie à ce problème, mais il faut l'installer et modifier les actions que je t'ai indiquées par celles de ToBEx : SetGlobal(....) est remplacé par DialogueSetGlobal(....) qui enregistre automatiquement la variable lorsqu'elle est définie pendant une session du dialogue. On peut donc utiliser sa dernière définition dans une condition ultérieure pendant la même session.


Quant aux liens, tu trouveras ton bonheur dans la bible IESDP :

- Actions : http://iesdp.gibberlings3.net/scripting ... /index.htm
- Triggers : http://iesdp.gibberlings3.net/scripting ... /index.htm

Posté : sam. 10 août 2013, 22:54
par Isaya
Dans le jeu, les variables utilisées sont des nombres. La signification des différentes valeurs est au choix de l'auteur. Une variable non utilisée vaut 0 en cas de test de sa valeur, il vaut donc mieux réserver 0 à ce cas. Dans ton cas, tu pourrais associer ami à 1 et ennemi à 2, 0 signifiant que le dialogue n'a pas encore eu lieu.

La référence pour les actions et les triggers est encore et toujours IESDP.

Pour fixer la valeur d'une variable, c'est la fonction SetGlobal. Il existe aussi IncrementGlobal pour ajouter ou retrancher une valeur à une variable (pas forcément 1). Elles sont décrites dans la page des actions. J'ai indiqué celles pour BG II puisque c'est le jeu que tu couvres, mais la liste varie d'un jeu à l'autre.

Pour tester les variables, on utilise Global pour tester si une variable a une valeur bien précise. Il existe aussi des tests inférieur, supérieur : GlobalLT (Less Than) et GlobalGT (Greater Than). Ils sont décrits sur la page des triggers.
Il existe aussi un moyen de comparer deux variables globales : GlobalsEqual, GlobalsLT, GlobalsGT.

Il y a d'autres éléments qui peuvent servir dans des dialogues, notamment des variables de type timer (qui déclenchent lorsqu'un certain temps s'est écoulé), qui ont des actions et des triggers spécifiques. Cherche les noms de fonctions avec le mot Timer pour les trouver dans les pages indiquées.

Posté : lun. 12 août 2013, 19:50
par Cocrane
Freddy_gendo, Ysaya,
merci pour vos retours. Ca confirme ce que j'imaginais mis à par que les noms de variables sont des nombres. Ca va nécessiter d'être encore plus vigilant dans le codage script et dialogue.

La liste des conditions et actions étant très longue, je sais quoi faire dans le métro Parisien si je m'ennuie. ^^

D'après ce que j'ai vu, les variables peuvent être créées par rapport à une zone Area mais pouvons nous en créer par rapport à toutes les maps (sorte de variable globale au jeu).
Exemple:
le mod est divisé en n chapitres.

Selon le chapitre en cours les évènements ne seront pas les mêmes. J'ai donc besoin de savoir à tous moments quelque soit la carte à quel chapitre on est.

Cocrane

Posté : lun. 12 août 2013, 20:41
par Freddy_Gwendo
Petite précision : ce sont les valeurs des variables qui sont des nombres.

Ex : SetGlobal("GWEnemy";"LOCALS";1) --> la créature à laquelle cette variable est appliquée devient ennemie.

Quant au champ d'application des variables, il y en a 3 :

- GLOBAL : s'applique dans tout le jeu.
- AREA : s'applique uniquement dans une zone.
- LOCALS : s'applique une créature et est reprise dans son script et/ou ses dialogues.

D'où :

Code : Tout sélectionner

IF
  Global("GWExplore";"GLOBAL",1)
  Global("GWExplore";"GW0001";0)
THEN
  RESPONSE #100
    SetGlobal("GWExplore";"GW0001",1)
    Explore()
END

--> La valeur "1" de la variable GWExplore indique que les cartes ne sont plus recouvertes par le "brouillard de guerre".
--> Le script précédent en début de GW0001.bcs supprime le brouillard lorsque je pénètre dans la carte. Je dois le rajouter à toutes les cartes concernées.

En gros, tu peux utiliser le même nom de variable pour les cartes que pour des codes globaux, mais ça devient vite difficile de s'y retrouver...

Quant à ta gestion des chapitres, j'ai utilisé des variables globales, du style SetGlobal("GWMission";"GLOBAL";n) avec n dépendant du degré d'achèvement de la mission ou de la connaissance de certains éléments.
Chaque fois que l'on pénètre dans une carte, un script du style du précédent permet d'accéder à certaines parties de la carte, ouvre des portes, affiche des animations autrefois désactivées, active des spawn points, crée de nouvelles créatures à des endroits spécifiques, etc....

Tu pourrait procéder de même avec les chapitres.