Arma: Script – les fondamentaux

Utiliser des ; ou non. Telle est la question ? La réponse est simple, en cas de doute, OUI!

Laisse moi t’expliquer (..) Les points virgules sont utilisés dans les scripts pour dire au moteur quand une commande se termine, et une autre commence. Si tu oublies un ; quand cela est nécessaire, le script va se crasher et écrire un beau message d’erreur dans ton .rpt disant que t’as oublié un ; Je t’aurais prévenu (..)

Bien entendu tout cela serait si simple, s’il n’y avait pas quelques exceptions (..)

a = b;
c = d;
//ok

a = b
c = d;
//error

a = {c = d;};
//ok

a = {c = d};
//also ok

Comme tu le vois au dessus, il est autorisé d’omettre le ; avant le crochet } car c’est la fin d’une portion de code (scope). Tu as aussi le droit d’omettre le ; à la fin de la dernière ligne du code pour la même raison, car c’est la fin du fichier, et que c’est donc aussi considéré comme la fin du scope. A contrario, dans ces cas de figure, tu peux aussi mettre normalement un ; , cela n’est pas choquant.

while {true} do {hint "ok"; breakOut ""}
//fine

while {true;} do {hint "ok too"; breakOut "";};
//also fine

Par contre, il faut quand même être attentif en passant des paramètres car les ; peuvent provoquer des erreurs.

a = {"ok"}; hint format ["%1",call a;];
//error

a = {"ok"}; hint format ["%1",call a];
//much better

La même chose pour les parenthèses. Les parenthèses sont utilisées par le moteur pour définir dans quel ordre évaluer les expressions. L’expression la plus imbriqué est calculée en premier, puis son parent, puis son grand parent, etc. Mal définir le positionnement des parenthèses peut produire des effets indésirables.

{diag_log format ["%1",_x]} forEach position player nearObjects 50;
// incorrecte

{diag_log format ["%1",_x]} forEach ((position player) nearObjects 50);
// correcte

Bien que la première expression ne renvoie pas d’erreur, le résultat est plusieurs nombres aléatoires et n’est pas ce qui est attendu.

Ce qui est attendu est la liste d’objets dans un périmètre de 50mêtres autour de la position du joueur, et la seconde expression avec les parenthèses fait exactement cela!

Appeler une fonction
Tu vas voir maintenant comment appeler une fonction. Dans un premier temps, tu vas en créer une. Une fonction n’est rien de plus qu’une variable qui contient du code. Les variables peuvent être publique ou privée. Pour appeler une fonction, tu dois utiliser la commande call.

mafonction = {
a = 1;
b = 2;
c = a + b;
};
call mafonction; 
//cc vaut 3

Une fonction peut prendre en paramètre plusieurs arguments, et retourner un résultat. Pour passer un arguments à une fonction en utilisant call, il faut le faire précéder par une variable contenant les arguments. S’il y a plusieurs arguments, il faut utiliser un tableau d’arguments. Les arguments passés en paramètre seront accessibles depuis l’intérieur de la fonction via la variable spéciale _this. Pour retourner un résultat, la fonction doit se terminer avec une simple variable ou une expression non définie.

mafonction = {
private ["_a","_b","_c"];
_a = _this select 0;
_b = _this select 1;
_c = _a + _b;
_c
};

mafonction = {
(_this select 0) + (_this select 1)
};

_resultat = [1,2] call mafonction;
//_result est 3

Cet article a été initialement rédigé par Killzone Kid, réactualisé par Code34

Laisser un commentaire