6. Les fonctions
Une fonction vous permet de faire plusieurs choses :
- premièrement, elle vous permet d'éviter les répétitions dans votre code : en créant une fonction, vous pouvez par exemple éviter de réécrire 5000 fois le même code.
- deuxièmement : une fonction vous permet de généraliser vos codes sources. Si par exemple votre bout de code crée automatiquement un objet qui a un blueprint commençant par « nws_ » vous pourrez tout à fait définir une fonction qui va ajouter « nws_ » à vos blueprint.
- troisièmement une fonction vous permet de conserver des routines (un bloc de code) dans des fichiers d'inclusions ce qui évidemment vous rend la vie plus facile lorsqu'il s'agit de les modifier.
Il existe deux types généraux de fonctions : les fonctions qui renvoient une valeur, et les fonctions qui n'en renvoient pas (c'est le cas des procédures en Delphi par exemple). Avec les NWScripts, il n'y a pas de réelles différences entre une fonction qui renvoie quelque chose et une autre qui ne renvoie rien.
Voici la définition d'une fonction :
type FunctionName( [[type Argument1 [= ValeurArg1][ , ..., type ArgumentN [= ValeurArgN ]]] )
{
return Variable;
}
Oui, ce n'est pas très clair, décomposons :
- type FunctionName : ici vous devez indiquer le type de la fonction, c'est-à-dire le type de contenu qu'elle va renvoyer. Par exemple, un entier (int). Si celle-ci ne renvoie rien, vous devrez mettre void FunctionName (par exemple), si elle renvoie quelque chose alors Variable devra être du même type que la fonction (par exemple, int). FunctionName correspond à un nom de fonction, tout comme les variables le nom de fonction ne peut pas être n'importe quoi : il ne doit contenir que des lettres, des chiffres et le tiret « _ » et doit commencer par une lettre. Aussi, le nom de la fonction ne doit jamais être celui d'une fonction déjà existante, il ne doit pas être égal à « main » ou à « StartingConditionnal ».
-
entre parenthèses, vous devez indiquer les différents paramètres. Exemple avec une fonction « officielle » :
talent GetCreatureTalentRandom( int nCategory, object oCreature = OBJECT_SELF );
Vous devez aussi indiquer le type des paramètres et une valeur optionnelle : par exemple OBJECT_SELF. Néanmoins, vous n'êtes absolument pas forcé d'utiliser des arguments : ceci est possible :
- l'instruction return vous permet de renvoyer une valeur qui devra être du type de la fonction, sauf si la fonction est de type void (elle ne renvoie rien donc). Return fonctionne comme les instructions break et continue : c'est à dire que le code placé après return n'est pas exécuté. Le mieux est de stocker la valeur qui va être renvoyée dans une variable temporaire et la renvoyer en fin de fonction. (note : vous pouvez quand même utiliser l'instruction return dans une fonction de type void pour par exemple cesser l'exécution de code)
Pour appeler une fonction : vous devez en connaître sa définition : vous pouvez double cliquer sur le nom de celle-ci dans l'éditeur de script de Neverwinter. Cependant, cela ne vous indiquera jamais les définitions de vos fonctions : pour cela, vous devez effectuer une manipulation particulière :
type FunctionName( [[type Argument1 [= ValeurArg1][ , ..., type ArgumentN [= ValeurArgN ]]] );
Vous devez placer la définition de la fonction en entête de votre script. Vous pouvez la faire précéder d'un commentaire décrivant son action. Dans ce cas, vous ne devrez utiliser que des commentaires sur une ligne, sinon ceux-ci ne s'afficheront jamais.
Une fois que vous avez la définition : vous pouvez l'appeler :
FunctionName( [[[ValeurArg1], ...,] ValeurArgN][,][[ValeurArgOpt1], ...,] ValeurArgOptN] );
Par exemple :
void Foo( int i, int j = 0, object = OBJECT_SELF )
{
instruction;
}
Pour appeler Foo :
Foo( 0 );
Foo( 0, 1 );
Foo( 0, 1, OBJECT_SELF );
Mais pas :
(Vous devez respecter l'ordre des arguments, même ceux qui sont optionnels)
Dans notre exemple, Foo ne renvoie rien : si vous tentiez de faire ceci :
L'éditeur de script vous renverrait une erreur. Cependant, si Foo est définie ainsi :
int Foo( int i, int j = 0, object = OBJECT_SELF )
{
instruction;
}
Alors int i = Foo( 1 ); n'affichera plus d'erreur.
C'est à peu près tout ce qu'il y a à savoir sur les fonctions : ensuite, vous êtes libre de mettre ce que vous voulez dans votre fonction : par exemple, une fonction qui créerait 5 créatures à côté du joueur... etc.
Dans la section précédente nous vous avions parlé des fonctions récursives. Il s'agit de fonctions qui vont se rappeler elle-même :
void Foo( int i = 0 )
{
if ( i < 100 )
Foo( ++i );
else
instruction;
}
Cette fonction revient au même que faire :
int i = 0;
while ( ++i <= 100 )
continue;
instruction;
L'existence des fonctions récursives est bonne à savoir, cependant vous ne devriez pas trop en avoir besoin dans vos NWScripts. Ces fonctions sont utiles pour par exemple « visiter » le contenu d'un répertoire.
C'est à peu près tout ce que vous avez à savoir sur les fonctions.