Syntaxe du Lua
Cette page a pour but d'expliquer le fonctionnement du Lua, au travers de plusieurs exemples. Suivre cette page permet de découvrir les différents aspects de ce langage. Si une information spécifique sur une fonction donnée est recherchée, se reporter à la page Références du LUA.
Sommaire
Les Variables
Qu'est-ce qu'une variable ?
Une variable est quelque chose que l'on nomme et qui va contenir une certaine valeur en mémoire. A chaque fois que le nom de la variable sera employé, l'ordinateur considérera la valeur de celle-ci.
Une variable est donc un mot quelconque. Pour attribuer une valeur à une variable, il faut faire :
VARIABLE = VALEUR
Bien que l'on attribue une "valeur" à la variable, celle-ci peut être un nombre, mais également une chaîne de caractères.
Types de variables
En Lua, les types de variables sont assez simples. On peut considérer qu'il existe trois types principaux de variables.
- Variables numériques : Les nombres entiers ou décimaux
- Variables chaines de caractères : Une suite de caractères, donc pour faire simple, du texte
- Variables booléennes : Prennent la valeur true (vrai) ou false (faux)
Lorsque l'on attribue une valeur à une variable, son type est automatiquement reconnu, ce qui simplifie les choses. Par exemple :
variable_alpha = 12.5 variable_beta = 13 variable_gamma = "Le petit oiseau" variable_pi = 3.1415926535898 variable_bool = true
La variable variable_gamma est de type chaîne de caractères. Vous noterez que sa valeur (Le petit oiseau) est placée entre guillemets. Il faut toujours mettre une chaîne de caractères entre guillemets pour qu'elle soit reconnue.
Tout texte qui n'est pas entre guillemets sera considéré comme une variable, fonction ou mot-clé.
Notez également que les nombres décimaux sont marqués par des points, et non des virgules.
Variable = Variable
Puisqu'une variable conserve sa valeur, vous pouvez parfaitement attribuer à une variable la valeur d'une autre variable. Par exemple :
var1 = "chat" var2 = var1
La variable var1 aura pour valeur "chat", et la variable var2 aura pour valeur la valeur de var1, donc également "chat".
Notez bien qu'il n'y a pas de guillemets autour de var1, car c'est la valeur de la variable var1 et non le texte "var1" qui veut être attribué à la variable var2.
Restrictions sur les noms de variables
Bien qu'un nom de variable puisse être ce que l'on veut, il y a tout de même des limites.
Premièrement, une variable doit obligatoirement être dépourvue d'espaces. Si vous mettez un espace, cela sera considéré comme deux noms séparés. Si vous voulez absolument séparer les deux noms, pour que ce soit plus lisible, vous pouvez utiliser un underscore (tiret bas), comme dans les exemples précédents : variable_quelconque
Ensuite, un nom de variable peut contenir des chiffres, mais ne peut pas commencer par un chiffre. Les variables test1, l33t, tt12rf3 sont corrects, mais le nom 12test est incorrect.
Enfin, il existe certains noms dit "réservés". Ces noms signifient déjà quelque chose en Lua, et ne peuvent donc pas être employés en tant que nom de variables. Les valeurs des variables booléennes, true et false font partie de ces mots réservés.
and break do else elseif end false for function if in local nil not or repeat return then true until while
Appels de fonctions
Les fonctions sont des morceaux de code qui vont accomplir une certaine tâche. Le Lua de Runes of Magic contient énormément de fonctions prédéfinies qui servent par exemple à envoyer du texte dans la fenêtre de discussion.
Une fonction peut ou non posséder des paramètres. Les paramètres sont des valeurs qu'il faut fournir à la fonction pour qu'elle accomplisse sa tâche. Exemples :
- ReloadUI() : Recharge l'interface utilisateur, en déconnectant de tous les canaux privés. Cette fonction ne possède aucun paramètre.
- SendChatMessage(X,Y) : Envoie un message sur la fenêtre de discussion, dans le canal considéré, les paramètres sont X (le message) et Y (le canal).
Pour appeler une fonction, il suffit de marquer son nom en respectant la casse (minuscules et majuscules), et en indiquant les paramètres entre parenthèses, chaque paramètre étant séparé par une virgule. Par exemple :
SendChatMessage("Salut la compagnie !","say")
Cette fonction enverra le message "Salut la compagnie !" sur le canal Dire.
Certaines fonctions renvoient une ou plusieurs valeurs. Ce genre de fonctions sert à obtenir un résultat. Par exemple la fonction UnitName(unit) renvoie le nom de l'unité définie par le paramètre unit.
var_nom_cible = UnitName("target")
La variable var_nom_cible aura alors pour valeur le nom de l'unité que vous avez ciblé. Si la fonction renvoie plusieurs valeurs, il faut alors mettre plusieurs variables devant pour pouvoir obtenir tous les résultats. C'est par exemple le cas de la fonction UnitLevel(unit), qui renvoie les niveaux des classes de l'unité définie par le paramètre unit.
var_niv_primaire, var_niv_secondaire = UnitLevel("target")
Les niveaux des classes seront ainsi placés dans les variables var_niv_primaire et var_niv_secondaire.
La liste des fonctions prédéfinies de Runes Of Magic, avec leur utilisation, se trouve sur la page Liste des fonctions Lua.
Opérateurs arithmétiques et concaténation
Un opérateur est une petite chose qui sert à effectuer une opération. Les opérateurs servent par exemple à effectuer des additions, assigner une valeur à une variable. Il existe différents types d'opérateurs, les premiers seront traités ici, les autres dans la partie suivante.
Opérateurs arithmétiques
Opérateur | Effet | Exemple | Résultat |
---|---|---|---|
+ | Addition | var1 = 12 + 5 | var1 prend la valeur 17 |
- | Soustraction | var2 = 8 - 16 | var2 prend la valeur -8 |
* | Multiplication | var3 = 6 * 3 | var3 prend la valeur 18 |
/ | Division | var5 = 5 / 2 | var4 prend la valeur 2.5 |
% | Reste de division euclidienne | var5 = 5 % 2 | var5 prend la valeur 1 |
^ | Puissance | var6 = 11^2 | var6 prend la valeur 121 |
Bien entendu, il est possible d'utiliser ces opérateurs avec des variables au lieu de nombres directement.
var_result = (var1 + var2) * var3
Les parenthèses fonctionnent comme en mathématiques, les calculs entre parenthèses seront traités en premier. Si par exemple var1, var2 et var3 valent respectivement 17, -8 et 18, la variable var_result vaudra 162.
Concaténation de chaînes de caractères
La concaténation de chaînes de caractères permet d'accoler des chaînes de caractères, pour en former une seule. Cela permet également d'accoler des chaînes de caractères et des nombres.
Pour concaténer deux chaînes, il faut employer placer l'opérateur .. entre les deux chaînes à accoler. Deux points à la suite. Donc par exemple, pour créer le mot "rateau", on pourrai faire :
var_rateau = "rat".."eau"
La variable var_rateau aura alors pour valeur "rateau". Il est donc également possible de concaténer des variables pour obtenir un résultat. Seulement, si vous concaténez deux mots pour faire une phrase, il faut prendre garde à bien laisser un espace entre les deux. Voici les différentes possibilités :
Code | Résultat |
---|---|
var = "Chapeau" .. "blanc" | Chapeaublanc |
var = "Chapeau " .. "blanc" | Chapeau blanc |
var = "Chapeau" .. " blanc" | Chapeau blanc |
var = "Chapeau" .. " " .. "blanc" | Chapeau blanc |
Vous pouvez donc rajouter un espace à la fin du premier mot, ou un espace au début du deuxième. Enfin, vous pouvez ne laisser aucun espace, mais concaténer avec une chaîne de caractères ne contenant qu'un espace.
La concaténation s'applique également pour les nombres, mais le résultat sera toujours une chaîne de caractères.
var = "J'ai " .. 2500 .. " pièces d'or" : Renvoie "J'ai 2500 pièces d'or" var = 12 .. 50 : Renvoie "1250"
Vous pouvez omettre les espaces avant et après les deux points si vous ne concaténez que des chaînes de caractère. Mais, si vous ne les mettez pas avec des chiffres, cela ne fonctionnera pas.
Structures conditionnelles
Le Lua permet de vérifier si une condition est une vérifiée, par exemple, si la cible a moins de 80% de vie, utiliser un sort de soin faible, sinon si la cible a moins de 20% de vie, utiliser un sort de soin puissant.
Pour cela, il faut d'abord définir ce qu'est une condition. Une condition prend la forme suivante :
Éléments OpérateurRelationnel Éléments
Les éléments peuvent être des variables ou des valeurs, et peuvent également contenir des opérateurs logiques. Les différents opérateurs sont expliqués ci-dessous.
Une condition renvoie une valeur booléenne, à savoir true (vrai), ou false (false)
Opérateurs relationnels
Les opérateurs relationnels servent à définir ce qui est vérifié dans une condition. Ce sont les opérateurs qui permettent de dire si l'on veut vérifier que ce soit égal, différent, etc.
Opérateur | Effet | Exemple | Résultat |
---|---|---|---|
== | Égal à | 12 == 12 8 == 3 |
true false |
~= | Différent de | 12 ~= 12 8 ~= 3 |
false true |
< | Strictement inférieur à | 12 < 12 8 < 3 |
false false |
> | Strictement supérieur à | 12 > 12 8 > 3 |
false true |
<= | Inférieur ou égal à | 12 <= 12 8 <= 3 |
true false |
>= | Supérieur ou égal à | 12 >= 12 8 >= 3 |
true true |
Veuillez à bien mettre un double signe égal pour vérifier une égalité. Si par erreur vous ne mettez qu'un seul signe égal, cela ne sera plus une condition, mais une attribution.
Opérateurs logiques
Les opérateurs logiques servent à assembler plusieurs conditions, par exemple si a est égal à b et si a est égal à c.
Opérateur | Effet | Exemple | Résultat |
---|---|---|---|
and | Et Les différentes conditions doivent toutes êtres respectées pour que la valeur renvoyée soit true |
12 == 12 and 8 == 3 1 == 1 and 2 == 2 |
false true |
or | Ou L'un des conditions doit être respectée pour que la valeur renvoyée soit true |
12 == 5 or 8 == 3 1 == 1 or 2 == 8 |
false true |
not | Négation Renvoie l'opposé de la condition |
not(12 == 5) not(8 > 3) |
true false |
Si, alors, sinon
Afin de vérifier une condition et d'effectuer des actions en conséquence, il faut employer la structure conditionnelle Si, alors, sinon. Cette structure a plusieurs formes, plus ou moins complètes.
if condition1 then action_si_vrai end
La condition condition1 sera donc vérifiée. Si celle-ci est vraie (true), l'action action_si_vrai sera exécutée.
if condition1 then action_si_vrai else action_si_faux end
La condition condition1 sera donc vérifiée. Si celle-ci est vraie (true), l'action action_si_vrai sera exécutée, sinon l'action action_si_faux sera exécutée.
if condition1 then action_si_vrai1 elseif condition2 then action_si_vrai2 else action_si_tout_faux end
La condition condition1 sera vérifiée. Si celle-ci est vraie (true), l'action action_si_vrai1 sera exécutée. Si ce n'est pas le cas, la condition condition2 sera vérifiée. Si celle-ci est vraie (true), l'action action_si_vrai2 sera exécutée, sinon l'action action_si_tout_faux sera exécutée.
Il est possible de rajouter autant de elseif que voulu, pour tester différentes conditions si les précédentes sont fausses.
Exemple de code, en appelant la fonction SendChatMessage énoncée dans un paragraphe précédent :
if var1 == var2 or var2 == var3 then SendChatMessage("Cela fonctionne","say") else SendChatMessage("Échec","say") end
Boucles
Il peut parfois être utile de répéter une action plusieurs fois. Pour cela, il faut employer des instructions permettant de faire des boucles. Trois types de boucles sont détaillés ici.
Tant que X, faire Y
Cette boucle prend la forme suivante :
while Condition1 do Instructions end
La condition Condition1 sera tout d'abord vérifiée. Si elle est vraie (true), alors les Instructions suivant le do seront effectuées. Puis, la condition Condition1 sera à nouveau testée, et cela recommencera jusqu'à ce que la condition ne soit plus respectée.
Exemple de code, en appelant la fonction SendChatMessage énoncée dans un paragraphe précédent :
while var1~=var2 do SendChatMessage("La variable vaut " .. var1,"say") var1 = var1+1 end
Répéter X jusqu'à ce que l'on ait Y
Cette boucle est similaire à la précédente. Elle a la forme :
repeat Instructions until Condition1 end
Les instructions Instructions seront tout d'abord effectuées. Puis, la condition Condition1 sera vérifiée. Si elle n'est pas respectée, les Instructions sont reproduites, jusqu'à ce que la condition soit respectée. Contrairement à While-Do, les instructions sont au moins exécutées une fois.
Exemple de code similaire au code précédent.
repeat SendChatMessage("La variable vaut " .. var1,"say") var1 = var1+1 until var1>var2 end
Répéter X en allant de Y à Z
Cette boucler permet de répéter une action un nombre défini de fois. Elle a la forme :
for Compteur=début,fin do Instructions end
La variable Compteur prend la valeur début. Si Compteur inférieur ou égal à fin, les Instructions sont exécutées, et la variable Compteur augmente de 1. La différence entre les deux et revérifiée, et la boucle s'accomplit jusqu'à ce que la variable Compteur soit égale à la valeur fin/
Exemple de code similaire au code précédent
for var1=1,4 do SendChatMessage("La variable vaut " .. var1,"say") end
Notez que ces fonctions peuvent être inscrites sur une seule ligne dans les macros, mais il préférable d'utiliser des addons pour les employer, vous pourrez ainsi écrire les boucles sur plusieurs lignes, améliorant la lisibilité.
Déclaration de fonctions
Nous avons vu précédemment qu'il est possible d'appeler des fonctions existantes. Il est également possible de créer ses propres fonctions. Par contre, ceci est utilisé la plupart du temps dans les addons uniquement, car écrire une fonction sur une seule ligne avec une macro n'est pas très pratique.
Forme générale
Une fonction est définie par :
function Nom(paramètres) Instructions end
- Le Nom de la fonction est le nom qu'il faudra marquer pour appeler la fonction. Faites attention à respecter la casse, à savoir l'emploi des majuscules et minuscules.
- Les paramètres sont des variables qui seront utilisables dans la fonction. Ces variables auront la valeur qui leur a été donnée en appelant la fonction. Par exemple :
function CollerTextes(Texte1,Texte2) SendChatMessage(Texte1..Texte2,"say") end
Les deux paramètres sont ici Texte1 et Texte2. Appeler la fonction aura alors cette forme :
CollerTextes("Le petit ", "chat blanc")
Cette fonction aura pour effet d'afficher en canal dire "Le petit chat blanc". Vous pouvez tester cette fonction sans macro ou addon en tapant uniquement ceci dans le canal Dire :
/run function CollerTextes(Texte1,Texte2) SendChatMessage(Texte1..Texte2,"say") end CollerTextes("Le petit ", "chat blanc")
Cela tiens effectivement sur une ligne, mais ce n'est pas très joli. Cependant cela reste pratique pour tester les très petites fonctions. En effet, une fonction écrite en ligne comme ceci reste valable jusqu'à ce que le personnage se déconnecte ou face /run ReloadUI().
Fonctions sans paramètres
Toute les fonctions ne doivent pas nécessairement posséder des paramètres. La fonction ReloadUI, n'en possède par exemple aucun. Pour déclarer une fonction sans paramètres, on procède de la même façon, sauf qu'il n'y a rien à mettre entre les parenthèses. Par exemple :
function AFKEating() SendChatMessage("Je vais manger, à plus tard","say") end
Cette fonction sert ici à signaler en canal dire que l'on va manger. Pour l'appeler, il suffit alors de marquer :
AFKEating()
Notez bien la présence des deux parenthèses. En effet, même s'il n'y a aucun paramètre, il faut tout de même spécifier les parenthèses.
Renvoi de valeurs
Les fonctions ne servent pas uniquement à accomplir une action donnée. Elles permettent aussi de récupérer un ou plusieurs résultats. Pour pouvoir dire à une fonction de renvoyer une valeur, on emploie le mot-clé return. Ce mot-clé s'emploie de la façon suivante :
return valeur1, valeur2, ... , valeurN
Ainsi, une fonction effectuant le calcul du périmètre d'un rectangle serait écrite ainsi :
function RectanglePerimeter(largeur, hauteur) return 2*(largeur+hauteur) end
Donc, pour afficher le périmètre d'un rectangle, on pourrait appeler la fonction ainsi :
SendChatMessage("Périmètre : " .. RectanglePerimeter(12,25),"say")
Ceci était un exemple avec le renvoi d'une seule valeur. Si maintenant vous souhaitez en plus renvoyer l'aire du rectangle, avec la même fonction, celle-ci deviendrait par exemple :
function RectangleValues(largeur, hauteur) return 2*(largeur+hauteur), largeur*hauteur end
La première valeur renvoyée serait le périmètre et la deuxième l'aire. Pour afficher cette fois-ci le résultat, il faut tout d'abord obtenir les valeurs dans deux variables séparées. En effet, il n'est plus possible de mettre directement la fonction dans un SendChatMessage si plusieurs valeurs sont renvoyées. Donc, pour afficher le résultat, il faut faire :
perim, area = RectangleValues(12,25) SendChatMessage("Périmètre : " .. perim .. " ; Aire : " .. area,"say")
Vous pouvez tester cette fonction sans macro ou addon, en mettant la fonction en une ligne, et en entrant séparément les deux lignes :
/run function RectangleValues(largeur, hauteur) return 2*(largeur+hauteur), largeur*hauteur end /run perim, area = RectangleValues(12,25) /run SendChatMessage("Périmètre : " .. perim .. " ; Aire : " .. area,"say")
Cependant, une fois encore, ce n'est pas très pratique, d'où un meilleur confort en utilisant des addons, qui permettent notamment de se dispenser des /run.
Un dernier exemple de fonction, qui renvoie une valeur et qui n'a pas besoin de paramètres :
function Pi() return 3.1415926535898 end
Cette fonction servirait tout simplement à obtenir la valeur de Pi, en mettant juste Pi() dans le code.