Vous devrez bien y passer un jour...
"BASE - LES SCRIPTS"
Alors autant commencer !
Ahh "script"... ce doux mot, lorsqu'on le susure, en fait fuir plus d'un... Pourtant, c'est quelque chose qui permet de vraiment faire des mods que l'on peut appeler mod, car le script étend l'horizon créatif. Vous devez être capable d'utiliser le TESC pour suivre ce tuto.
Des sites très utiles :
http://wiwiki.wiwiland.net/index.php/Accueil
http://cs.elderscrolls.com/constwiki/in ... /Main_Page
C'est quoi un script ?
Comme vous l'avez sûrement déjà lu dans le "Tuto - Notions de vocabulaire bizarre - BASE", il s'agit d'une liste d'instruction. Un script, c'est du texte que l'on peut rattacher à un objet pour qu'il se passe quelque chose de spécial quand on y touche etc.
Le principe d'action-réaction :
Action-réaction ou entrée-sortie. Vous appuyer sur un interrupteur et que la lumière soit. Jour, nuit, jour, nuit, jour, nuit... Action, réaction. Pas explosion. Réaction. Un programme c'est pareil. Quand vous appuyer sur le bouton du réveil digital 4X pour indiquer 4h, le réveil compte le nombre de fois que vous appuyez pour afficher ce nombre à l'écran. Vous avez fait 4 actions, le programme a réagi 4 fois. Ensuite vous appuyez sur le bouton "Alarme enclenchée". Le programme va mémoriser cela et à 4h, "dring dring dring"... Le principe d'action-réaction n'est rien d'autre que cela : lorsqu'il se passe quelque chose, la boîte noire qu'est le programme fait son petit calcul à l'abris des regards et nous pond un oeuf pas toujours comestible... Nous verrons après avoir vu quelques concepts comment le français se traduit en langage codé.
Utiliser un autre éditeur de texte que celui du TESC :
Sinon vous serez puni. En effet, je vous conseille d'utiliser un éditeur tel que textpad ou notepad++. Vous trouverez un fichier de définition de syntaxe sur http://www.tesnexus.com/downloads/file.php?id=20588
Les fichiers d définition de syntaxe sont des liste des mots à afficher dans certaines couleurs. Ca permet de différencier le commentaire du code, les fonctions des variables, etc. On y voit beaucoup plus clair, et quand on fait une faute d'ortographe dans un nom de fonction, on le voit puisque le mot ne s'affiche pas en couleur.
Les types de script :
Il y a 3 types de scripts dans Oblivion. Les scripts d'objets (object) qui peuvent être appliqué à des objets, les scripts d'effet magique (magic effect) qui sont utilisé pour les sorts et enchantements. Les scripts de quêtes (quest) sont utilisé pour...les quêtes.
Un script a un nom :
C'est la première ligne que vous allez taper "ScriptName" ou "scn" suivit du nom de votre script. Procédez comme pour les IDs, puisqu'il s'agit en fait de l'ID de votre script !
Des commentaires :
Les commentaires ne sont pas exécutés par le jeu. C'est simplement une phrase du genre "Ca c'est mon premier script". C'est du blabla pour vous aidez à vous y retrouvez. N'hésitez pas à crier haut et fort qu'un script sans commentaire est un mauvais script ! Par principe, mettez au moin une ligne de commentaire pour dire ce que fait le script, et s'il est vraiment trop simple, ce n'est pas encore trop grave. car le commentaire, c'est avant tout pour aider le et les programmeurs a s'y retrouver. Tout commentaire commence par ";"
Les variables :
Il y a des variables de type short, long, float et ref.
Les short sont des entiers dont la valeur est comprise entre -32768 et 32767. Ce sont des entiers courts.
Les long sont des entiers longs. Leur valeur est comprise entre -2147483648 et 2147483647.
Les float sont des nombres flottant ou à virgule. Leur valeur est comprise entre 1,18E-38 et 3,40E38.
Les ref sont des références.
short A ; Commentaire : A est un entier court
long B ; B est un entier long
float fgh ; fgh est un float
ref ref01 ; ref01 est une référence
Les noms de variable ne commencent pas par des chiffres et on ne contiennent aucun caractère spécial.
Variable locale et variable externe :
Lorsqu'on défini une variable dans le script qu'on est en train d'écrire, il s'agit d'une variable locale à ce script. Si on utilise une variable définie ailleur, il s'agit d'une variable externe
Accéder à une variable externe :
Par exemple, dans un script de quête, on a défini une variable "RobocopDitCouCou" si Robocop dit "coucou", la variable vaut 1, sinon, elle vaut 0. L'ID de la quête est "RobocopQuest". On écrira "RobocopQuest.RobocopDitCouCou" pour atteindre la variable externe.
L'affectation :
Vous savez qu'une variable, c'est une boîte dont on peut faire changer le contenu, et qu'un programme est une suite d'action exécutée dans l'ordre d'exécution...
set A to 1
set A to 23
Donc "set A to 1" signifie que l'on affecte A à la valeur 1, donc qu'on met 1 dans A. "set A to 23" veut dire qu'on met 23 dans la boîte, et que si avant il y avait 1, he bien on s'en fou maintenant c'est 23 et c'est comme ça un point c'est tout.
Les règles par rapport aux opérateurs sont les mêmes qu'en math, mais c'est toujours plus clair d'utiliser des parenthèses :
set A to (84 + 1)
set A to ((25/100) * (-1) * (211 + 45))
Il est aussi possible d'additionner une variable à son état antérieur. Ca s'appelle l'incrémentation :
set A to (A + 1)
Si A valait 9, maintenant A vaut 10.
Les blocs d'exécution du jeu :
Dans les scripts pour Oblivion, on travaille avec des blocs d'action pour décider quand certaines actions doivent être exécutée ou non. Un bloc commence par "Begin" et se termine par "End".
Le bloc "GameMode" est la patie du script exécutée en mode jeu, c'est-à-dire lorsque votre personnage fait des galipettes.
Le bloc "MenuMode" est exécuté durant l'affichage d'un menu comme par exemple lorsque vous ouvrez votre inventaire.
Le bloc "OnEquip" est exécuté lorsque l'objet est équipé
Il y a d'autre bloc, lisez la documentation sur le bloc du wiwiki.
Les conditions :
"Si ceci, alors cela" se traduit par "if -conidition- -action- endif"
Les conditions, c'est simplement vérifier l'état d'une variable, d'un attribut, à l'aide des opérateurs mathématique suivant :
A == B pour l'égalité entre A et B
A != B pour A différent de B
A < B pour A plus petit que B
A > B pour A plus grand que B
A >= B pour A plus grand ou égal à B
A <= B pour A plus petit ou égal à B
Si vous avez déjà regardé quelques fonctions, pour savoir si le joueur est équippé de la dague de fer :
if (player.GetEquipped WeapIronDagger == 1)
; Commentaire : C'est ici qu'on fait des actions
elseif (A == B)
; Autres actions
else
; Autres actions
endif
Car la fonction renvoie 1 si le joueur est équippé de l'objet dont on spécifie l'ID.
Si vous avez plus ou moin suivi jusqu'ici :
Revenons en au prinicpe d'action-réaction et à notre réveil. Arrêtez de revasser et concentrez-vous !
Dans le programme de notre petit réveil, il y a une variable qui est incrémentée à chaque fois que l'utilisateur appuye sur le bouton :
if (UtilisateurAppuyeBouton == 1)
set heure to (heure + 1)
endif
Le signal électrique du bouton est binaire : du jus (1) ou pas de jus (0). Quand il y a du jus, le processeur reçoit une petite décharge (pas de quoi le secouer) et il sait que le signal correspond à "UtilisateurAppuyeBouton".
Et quand l'utilisateur appuye sur le bouton "Alarme" ? C'est la même chose. Un signal électrique est envoyé sur le processeur qui sait sur quel bouton on a appuyé et comme il reçoit un signal "UtilisateurEnclencheAlarme" passe à 1.
Et comment je sais que le bouton dans le programme c'est "UtilisateurAppuyeBouton" ? Parceque c'est moi qui décide d'appeler le bouton comme ça dans mon code. En fait, mais c'est plus complexe, les entrées du processeur sont différenciée par une adresse. la 1ère est à l'adresse 1, la seconde à la 2, etc. Et quand je soude le fil sur la 1ère borne, je sais que le bouton à l'autre bout du fil et bien il est à l'adresse 1. Quand j'ouvrirai l'interface de programmation, je pourrai changer "Adr01In01" qui signifie en anglais "Adress byte 1 at input 1" et en français "Byte à l'adresse 1 entrée n°1" en "UtilisateurAppuyeBouton" qui est beaucoup plus clair et facile à retenir. On sait directement de quoi on parle.
Le principe du verrou :
Il s'agit d'utiliser une condition sur l'état d'une variable d'état binaire. Si la variable vaut 0, on la met à 1 puis on fait quelque chose, si elle vaut 1 on ne fait rien (ou autre chose). Cela permet par exemple de n'exécuter une action qu'une seule fois.
if (A == 0)
set A to 1
set B to 200
endif
Ici, lorsque A vaut 0, on met A à 1 puis B à 200, comme ça, au cycle d'exécution suivant, on ne risque pas de recommencer.
Boucle :
Dans Oblivion, il n'y a pas de boucle à proprement parler. Une boucle, c'est un cycle. Donc des actions exécutées en boucle sont exécutée tout le temps.
Oblvion utilise les blocs, mais certains blocs sont exécuté en boucle comme par exemple le bloc "GameMode", d'autre non, comme par exemple le bloc "OnAdd".
Begin GameMode
set A to (A + 1)
End
Ce bout de code incrémente la valeur de A infiniment. Ce n'est pas pour ça que A vaudra l'infini ! Plus haut nous avons vu que A ne pouvait avoir qu'une valeur finie, puisque comprise entre -32768 et 32767 si A est un short. Entre -2147483648 et 2147483647 si c'est un long. Donc après avoir atteint 2147483647, on est à l'overflow (par-dessus le flux, ce qui signifie au-delà de la valeur maximale possible), donc A retombe à sa valeur minimale qui est -2147483648 pour un long.
Exemple de script :
Vous créez une nouvelle épée, puis vous allez dans la barre d'outil "Gameplay", "Edit Script", puis "Script", "New". Vous copiez-coller le script ci-dessous. Attention ! Remplacez moi ce fichu espace par des tabulation, que le script ressemble à quelque chose de presque lisible !
Enregistrer en cliquant sur la disquette brune à gauche. La rouge ne sert à rien, sauf à réenregistrer tous les scripts, ce qui n'est pas utile car vous ne modifiez pas les script d'origine.
Code : Tout sélectionner
scn NOMDUNSCRIPT ; A remplacer par une ID normale donc.
; Ceci est un commentaire puisqu'on commence par ";"
; Définition des variables :
ref Target ; Target, ou "cible", la référence ciblée
Begin OnEquip ; Lorsque quelqu'un s'équippe de l'objet
set Target to GetContainer ; On cible le container, ce qui possède l'objet
if (Target == player) ; Si c'est le joueur
Return ; On arrête ici et on n'exécute pas le reste, donc le message ne s'affichera pas
else ; Si ce n'est pas vrai, donc si la cible n'est pas le joueur
Target.Kill ; On tue la cible
endif ; Fin du bloc conditionnel
MessageBox "Voleur tué !" ; Message affiché à l'écran, sauf si "Return" a été exécuté
End ; Fin du bloc d'exécution
Avant d'écrire un script :
Il vaut mieux toujours coucher ses idées sur papier, même dans les grandes lignes, avant d'écrire son script. Noter ses idées permet de visualiser ce qu'on veut obtenir comme résultat, ça permet aussi de voir si on n'a pas oublié quelques conditions. Ensuite on fait un premier jet du script (sur PC ?) qu'on teste et qu'on corrige.
Step by step :
Le "step by step" est une technique de programmation propre quand on l'utilise proprement. Il s'agit en fait de découper son programme en diverses étapes successives, une étape renvoyant toujours à l'étape suivante.
Si étape 1
Je mange des fruits.
Si les fruits sont mangés, je vais à l'étape 2
Si étape 2
...
Aller à l'étape 3
Si étape 3
...
Mais il existe toujours des petits malins qui ne comprennent pas ce que "propre" signifie. Ceux-là vous sorte des programmes qui ne fonctionneront jamais que comme il ont été pondu la 1ère fois. Le programmeur cochon finit par ne plus s'y retrouver lui-même dans son programme, et c'est souvent lui le premier à rigoler !
Ne pas faire ceci :
Etape 1
Action
Aller à l'étape 30
Etape 30
Action
Aller à l'étape 4
Etape 2
Action
Aller à l'étape 5
Etape 4
Action
Aller à l'étape 2
Etape 5
Action
Si A == B alors aller à l'étape 6
Si A != B alors aller à l'étape 8
Etape 6
Action
Aller à l'étape 70
Etape 70
Action
Aller à l'étape 9
Etape 8
Action
Aller à l'étape 9
Vous voyez bien que ce programme n'est pas propre. Il y a des étapes qui ne se suivent pas. Si vous n'y trouvez rien à redire, ne programmez pas ou faites des efforts.
Le step by step exige que les étapes soient successives. Les sauts sont autorisés à la seule conditions qu'il ne soient pas excessif, c'est-à-dire lorsqu'ils permettent d'éviter de faire des actions qui ne doivent pas être remplie à une certaine condition. Les sauts ne doivent pas rendre le programme plus difficile à comprendre.
Vous pouvez faire ceci :
Si étape 1
Initialisation
Aller à l'étape 2
Si étape 2
Si nombre_de_bouteilles < 10
set nombre_de_bouteilles to (nombre_de_bouteilles + 1)
sinon
Aller à l'étape 3
endif
Si étape 3
if recompter_les_bouteilles == 1
set nombre_de_bouteilles to 0
Aller à l'étape 2
else
Aller à l'étape 4
Si étape 4
Réinitialisation, aller à l'étape 1
Ce programme utilise une boucle à l'étape 2 pour compter le nombre de bouteille tant qu'il est plus petit que 10. Si le nombre de bouteille arrive à 10, alors on va à l'étape 3 où on retourne à l'étape 2 uniquement si il faut recompter les bouteilles. Cette utilisation des sauts est propre, car elle conserve le sens de lecture général du programme du haut vers le bas sans le compliquer d'avantage. La succession des étapes est logique. Le fil conducteur est conservé, on ne se retrouve pas devant un programme "spagethi".
L'identation :
Il s'agit de faire des tabulation pour différencier les blocs imbriqués. En gros, un bloc imbriqué dans un autre est écrit plus en retrait que celui dans lequel il est imbriqué.
Du texte avec identation :
if ceci
if oui
action
endif
action
endif
if cela
action
endif
Sans identation :
if ceci
if oui
action
endif
action
endif
if cela
action
endif
...
L'identation éclairci le code.
Liste des fonctions :
Les fonctions sur le TESCWiki
Les fonctions sur le Wiwiki
LEs blocs sur le TESCWiki
Les blocs sur le Wiwiki
Conclusion :
Idées claires, structure et méthode.
C'est en programmant qu'on devient programmeur.