Cours de Scripts pour les Quiches. Leçon Une.

Introduction
Le but de cette série de leçons, est d'apprendre a se servir des scripts a n'importe qui. Cette première leçon est très simple, et quiconque ayant déjà codé devrait pouvoir s'en passer. Maintenant, il est toujours possible d'y apprendre un truc ou deux.

Je ne m'étendrais pas en détail sur le fonctionnement du toolset, ceci est suppose comme déjà connu.

Ouvrez le Toolset et créez un nouveau module, que nous appellerons 'Test Module'. Créez une nouvelle zone, que nous appellerons 'Test Area 001'. Utilisez la taille et le tileset qui vous plait, cela n'a aucune incidence sur les scripts. Préférez cependant une taille pas trop grande, il vous sera plus facile de vous y retrouver et cela prendra moins de temps à sauvegarder/charger pour les innombrables tests que vous devrez forcément faire.

Placez un npc sur votre carte. Donnez-lui l'apparence que vous voulez.
Puis :
- Clic droit sur le npc.
- Choisissez l'option de menu 'Propriétés' ( properties )
- Changez le tag du NPC en CHANTEUR
- Ouvrez l'onglet des scripts.
- Il y a des scripts par défaut a chaque option. Cliquez sur chacun et supprimez-les.
- Cliquez sur le bouton 'Edit' a coté du script sur le 'On Heartbeat'.
- Tapez le script suivant en respectant les minuscules et les majuscules.


void main()
{
    
ClearAllActions();
    
ActionSpeakString("Ils sont dans les vignes les moineaux...");
    
ActionWait(1.5);
    
ActionSpeakString("Ils ont manges les raisins...");
    
ActionWait(1.5);
    
ActionSpeakString("Ils ont craches les pepins...");
    
ActionWait(1.5);
}


- Je vous conseille de tapez le texte plutôt que de le copier/coller. Vous apprendrez mieux ainsi. Et si vous faites une erreur, vous n'en apprendrez que plus.
- Cliquez sur 'Save As' et appelez le tm_chanteur_hb
- Vérifiez que le résultat ressemble à : "0 Errors. ‘tm_singer_hb’ Compiled successfully." Sinon c'est que vous avez du faire une erreur quelque part... revérifiez !
- Fermez l'éditeur de script.
- Cliquez sur "OK" dans la fenêtre du NPC.
- Sauvegardez votre module.
- Relancez le jeu et choisissez 'Other Modules' pour vérifier ce que vous avez fait.
- Votre npc devrait chanter cette ritournelle... encore et encore...


Analyse.
Tentons maintenant d'explique ce que nous venons de faire. Ceci sera fait par le biais de questions / Réponses, en tentant d'imaginer les questions que vous pourriez vous poser.

Pourquoi l'appeler 'Test Module' ?
Cela n'a en fait aucune importance. Le seul intérêt est de le distinguer facilement des autres dans la liste des modules proposés. Pour cela, il est préférable que tous vos modules ne commencent pas par 'Module'...

Pourquoi avoir appelé la zone 'Test Area 001' ? Est-ce que le nom par défaut n'était pas suffisant ?
Pour ce petit module de test, cela ne devrait effectivement pas prêter à conséquences. Mais c'est une bonne habitude à prendre que de renommer les choses que l'on customise, afin que chacune aie un nom unique et non équivoque. Si tout le monde utilise 'Area 001', alors le transfert de zones d'un module a l'autre risque d'être problématique.

Pourquoi avoir donné au npc le tag CHANTEUR ? Pourquoi l'avoir mis tout en majuscules ?
Il est préférable pour des raisons internes au programme, de mettre les tag en majuscules. Vous pourriez très bien ne jamais avoir de problèmes, mais c'est quand même une bonne habitude à prendre.
Je recommande de la même manière de donner à chaque créature ou npc un tag clair et non équivoque. CHANTEUR décrit parfaitement le npc. Il est maintenant plus simple de s'y référer dans un script plus compliqué.
Les tags doivent également rester court. Evitez les tags de plus de 8 caractères.

Pourquoi avoir supprimer tous les scripts par défaut ? A quoi servent-ils si on doit les détruire ?
Les scripts par défaut définissent tout un tas de comportements dont nous n'avons que faire pour le moment. Nous les avons supprimés afin qu'ils n'interfèrent dans notre test. Nous souhaitions que notre npc chante, et rien d'autre.
Nous verrons dans de prochaines leçons comment se servir des scripts par défaut.

Pourquoi avoir placé notre script sur le 'On Heartbeat' ? Pourquoi est ce qu'il y a tant de choix ?
Chacun de ces choix, définit un moment ou le script est appelé. Le 'On Heartbeat' appelle le script a chaque battement de cœur, soit toutes les 6 secondes. C'est pourquoi le chanteur ne s'arrête jamais. Toutes les six secondes, il recommence sa chanson.
Chacun des autres choix a son utilisation, en fait, le "On Heartbeat' est celui qui devrait être le moins utilisé. Trop de scripts lancés toutes les six secondes devraient rapidement mettre votre ordinateur sur les rotules.

Qu'est ce que ce "void main()" ?
Ce petit bout de code n'a l'air de rien, mais essayez donc de l'oublier et vous verrez son importance. Je vais essayer de vous l'expliquer, même si cela ne sera sans doutes clair qu'après les autres chapitres.
Les scripts sont codés en utilisant des 'fonctions', qui disent au programme ce qu'il doit faire. Certaines fonctions sont déjà écrites, et nous ne faisons que les utiliser. Ecrire un script revient en fait à créer une nouvelle fonction. Cette ligne est en quelque sorte une description de cette fonction.
Premièrement le mot "void". Qui peut signifier néant. Cela indique au script la "réponse" qui va revenir de la fonction. Notre chanteur fait des choses, mais il ne calcule rien. Ce "néant" indique que la fonction ne ramènera aucune réponse.
Le mot "main" qui signifie principal indique que cette fonction est la principale. Nous pouvons en écrire d'autres, et nous le ferons, mais ce mot indique l'endroit ou le script commencera.
Entre les parenthèses se trouvent les arguments, ou paramètres, ou encore informations qui sont donnés et nécessaires à la fonction pour qu'elle s'exécute. Dans ce cas, notre script se suffit à lui-même et n'a besoin d'aucunes informations.

Qu'est ce que les { et } ?
Ils sont utilisés pour délimiter les sections du script et les fonctions. Cela signifie que tout ce qui est entre nos deux { } fait partie de notre fonction "main".

Pourquoi est ce que chaque ligne se termine par un ; ?
Principalement pour indiquer au script que la ligne se termine. Certaines instructions sont parfois trop complexes pour tenir sur une seule ligne. Il est ainsi possible de les écrire sur autant de ligne que l'on veut. Le programme les considérera comme une seule et même ligne tant qu'il ne tombera pas sur un ;

A quoi sert le ClearAllActions() ?
En fait dans ce cas, a rien
C’est une garantie.
Chacune des autres lignes du script est une commande. Le npc va les exécuter une par une, en prenant bien soin de finit la première avant de passer à la suivante.
Mais, notre fonction est placée dans le "On Heartbeat" et va donc être appelée toutes les 6 secondes. Mais nous avons 7 actions. Que se passe t'il s’il a seulement le temps d'en faire 3 en 6 secondes ? Il reste encore 4 actions à faire et on lui redemande d'en faire 7... ce qui lui en fait 11 maintenant... Cela va aller en augmentant, et au bout d'un moment, cela risque de poser problème.
Il y a de meilleurs moyens de régler ces problèmes. Mais pour l'instant, contentons-nous de dire au npc d'oublier tout ce qu'il lui reste à faire. C'est ce que fait le ClearAllActions().
Si vous voulez expérimenter, éditez le script et changez les valeurs a l'intérieur des commandes ActionWait. Remplacez par exemple le 1.5 par 3.0
Pendant qu'on y est. Le ClearAllActions est une fonction, comme notre main. Une fois de plus, le fait qu'il n'y ait rien entre les parenthèses signifie qu'on ne passe aucune information a cette fonction. Par contre, la fonction ActionWait, elle a besoin d'informations, en l'occurrence le temps qu'il va falloir attendre. D'où la présence d'un nombre a l'intérieur des parenthèses...

Et pour les autres lignes du main ?
Ce sont toutes les instructions expliquant au npc ce qu'il doit faire. Elles sont assez explicites, mais je vais quand même détailler un peu.
ActionSpeakString fait dire au npc quelque chose. Ce quelque chose étant le texte passé en paramètre a la fonction. Ce texte est une Chaîne de caractères ( String ), et doit être encadré par des ".
ActionWait fait asseoir et attendre le npc, le nombre de secondes précisé. ActionWait(0.5) fait attendre le npc pendant 0.5 secondes entre chaque phrase.

Pourquoi nommer le script tm_chanteur_hb ?
Une fois encore, vous pouvez l'appeler comme bon vous semble, du moment que vous vous en souvenez.
"tm" signifie ici Test Module. Tous nos scripts pour ce module commenceront ainsi.
"chanteur" signifie que ce script s'applique au npc chanteur. Il est préférable de mettre les noms de scripts en minuscules, et je vous recommandais de garder les noms de tags sur 8 caractères au plus, de façon justement a ce qu'on puisse les réutiliser dans les noms de scripts sans que cela soit gênant.
"hb" signifie que le script concerne le "On Heartbeat".

Pourquoi est ce que cette leçon n'est pas plus longue ?
Je trouve pour ma part qu'elle est suffisamment longue. Elle le fut à écrire au moins. De plus je ne souhaite pas vous noyer sous des tonnes d'informations. Laissez-moi quelques jours, et vous aurez votre deuxième leçon.

__________________
Amaranthe.
Thoerel, un monde semi-persistant pour Neverwinter Nights.