TESCS2 : Les bases du scripting
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 qunad 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.