TESCS2 : Les bases du scripting

De Wiwiki
Aller à la navigation Aller à la recherche
La version imprimable n’est plus prise en charge et peut comporter des erreurs de génération. Veuillez mettre à jour les signets de votre navigateur et utiliser à la place la fonction d’impression par défaut de celui-ci.


Les règles de syntaxe ci dessous ne concernent que les scripts nommés, c'est à dire les scripts de quête, d'effet magique ou d'objet.

Pour avoir une liste des règles de base qui sont détaillées ici, vous pouvez aussi regarder ce sujet.

Pour savoir à quels moments les scripts sont exécutés, vous pouvez regarder cette page.


Définir le nom du script

Un script doit obligatoirement commencer par son nom, qui est défini grace à la fonction ScriptName (ou à son raccourci, Scn). Un script "vide" ne contenant qu'un nom est le minimum syndical pour créer un script nommé (mais vous avouerez que point de vue utilité, on peut quand même mieux faire ! ^^).

 ScriptName MonPremierScriptVide
 Scn MonSecondScriptVide


Les variables locales

Après la définition du nom du script, vous pouvez définir les variables locales que contient ce script. Ces variables peuvent être de type Short (nombre entier), Float (nombre réel), Ref (référence d'objet) ou Long (nombre entier de grande taille). Par défaut, si vous n'effectuez aucune autre action, ces variables seront mises à la valeur 0.

Les variables locales sont définies pour chaque instance du script. Prenons l'exemple du script suivant :

 Scn ZeScript
 
 Short var

Supposons qu'on associe ce script à un personnage dont il existe deux copies dans le jeu. Si, pour une raison quelconque, la variable "var" du premier était mise à la valeur 1, la variable du second resterait à la valeur 0. Bien qu'ayant le même nom, les variables locales sur des objets séparés ont donc leur vie propre et n'interagissent pas entre elles !


Séparation du code en blocs

Dans Oblivion, le code exécuté à chaque appel du script est divisé en unités distinctes qui ne seront effectivement exécutées que sous certaines conditons. Par exemple, un bloc MenuMode n'est exécuté que quand le joueur est en mode menu (actuellement dans l'interface), un bloc GameMode est exécuté en permanence, et un bloc ScriptEffectStart ne sera exécuté que quand un effet scripté s'activera pour la première fois.


Attention, tout algorithme présent dans un script nommé doit obligatoirement se trouver à l'intérieur d'un des blocs Begin/End !!


Cette séparation est très interessante pour n'effectuer une action spécifique que quand on le souhaite. Supposons que vous vouliez afficher un message quand on active une porte, puis jouer un son en permanence après son ouverture. Vous utiliserez alors un bloc OnActivate pour l'ouvrir et un bloc GameMode pour jouer le son en permanence (et non pas seulement à la frame pendant laquelle la porte est activée) :

 Scn SesameOuvreToi
 
 Short ouvert
 
 Begin OnActivate
     Message "La porte s'ouvre." 3
     Set ouvert to 1
     Activate
 End
 
 Begin GameMode
     if ( ouvert == 1 )
         PlaySound MonSon
     endif
 End

Il existe un certain nombre de blocs Begin/End pouvant être utilisés.


Les commentaires

Quand vous allez commencer à créer des scripts complexes, vous aurez tout intérêt à commenter votre code pour pouvoir (re)comprendre plus rapidement ce qu'il fait, sans avoir à le redécoder à chaque fois. Dans Oblivion, tout ce qui succède un point-virgule (jusqu'à la ligne suivante) est considéré comme commentaire par le script.


Les commentaires peuvent être placés aussi bien dans une nouvelle ligne qu'à la fin d'une ligne de code existante.

Si on commente le code précédent, on obtient donc :

 Scn SesameOuvreToi
 ; Le nom du script est déclaré au dessus de cette ligne
 
 Short ouvert ; Variable indiquant si la porte a déjà été ouverte ou non
 
 ; Le bloc OnActivate permet de détecter quand on active (ouvre) la porte
 Begin OnActivate
     Message "La porte s'ouvre." 3 ; On affiche un message quand la porte s'ouvre...
     Set ouvert to 1 ; ...on modifie la variable "ouvert" pour indiquer que la porte a été ouverte...
     Activate ; ...et on l'ouvre effectivement avec Activate
 End ; Fin du bloc OnActivate
 
 ; Le bloc GameMode sert à jouer le son
 Begin GameMode
     if ( ouvert == 1 ) ; Si la porte a déjà été ouverte...
         PlaySound MonSon ; ...on joue le son
     endif ; Fin du test
 End ; Fin du bloc GameMode

Les tests logiques

Un test permet de n'effectuer une action que si certaines conditions sont remplies. Par exemple, dans le code :

     if ( ouvert == 1 ) ; Si la porte a déjà été ouverte...
         PlaySound MonSon ; ...on joue le son
     endif ; Fin du test

... on ne joue le son qu'à la condition que la variable ouvert soit égale à 1, ce qui n'est censé arriver que si la porte a déjà été ouverte.


Le début d'un test de type "si" doit toujours commencer par if (suivi sur la même ligne par une expression logique), et se terminer par un endif après le code contenu dans le test.

Sous Morrowind, il existait également des tests de type "tant que" (while). Ces tests n'existent plus sous Oblivion.


Nous avons vu ci dessus l'opérateur mathématique d'égalité "==". Il existe d'autres opérateurs mathématiques de test disponibles sous Oblivion.