Différences entre les versions de « TESCS2 : Les bases du scripting »

De Wiwiki
Aller à la navigation Aller à la recherche
 
m (→‎Les commentaires : - faute de frappe)
 
(7 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Catégorie:TESCS2 : Scripting|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.
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.


Un script doit obligatoirement commencer par son nom, qui est défini grace à la fonction ScriptName (ou à son raccourci, Scn).
Pour avoir une liste des règles de base qui sont détaillées ici, vous pouvez aussi regarder [[TESCS2 : Les scripts|ce sujet]].
 
Pour savoir à quels moments les scripts sont exécutés, vous pouvez regarder [[TESCS2 : Exécution des scripts|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 ! ^^).
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
   ScriptName MonPremierScriptVide
Ligne 8 : Ligne 16 :




== 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.
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.


Ligne 14 : Ligne 23 :
    
    
   Short var
   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 à 1, ''la variable du second resterait à 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 !
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 [[TESCS2 : Frame|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 [[TESCS2 : Activate|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.''




... à poursuivre : les blocs Begin/End, les commentaires, les opérateurs de comparaison et les opérateurs logiques.
Nous avons vu ci dessus l'opérateur mathématique d'égalité "==". Il existe d'autres [[TESCS2 : Opérateurs mathématiques de test|opérateurs mathématiques de test]] disponibles sous Oblivion.

Version actuelle datée du 15 novembre 2006 à 06:59


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.