Sommaire

Transcription

Sommaire
Sommaire
Introduction au langage de Scripts ............................................................................................. 2
Introduction ............................................................................................................................ 2
Lancez une cinématique ......................................................................................................... 3
Le Sorceleur et son équipement ........................................................................................... 13
Test de Flag (drapeau) .......................................................................................................... 21
Aide aux langages des Scripts .............................................................................................. 28
Introduction au langage de Scripts
INTRODUCTION
Ce chapitre traite des scripts. Plus précisément, c’est une introduction à la création de scripts. Idéalement, ce
chapitre est prévu pour celles et ceux qui développent déjà sur d’autres langages de scripts (Java, C++, C#) ou
encore ont déjà utilisé les scripts de Neverwinter Nights. Je préviens que c’est seulement une introduction en la
matière, parce que détailler les scripts pourrait prendre 200 pages de ce manuel, ce qui n’est pas vraiment
l’intention. Je couvrirais simplement avec quelques exemples de scripts.
“The Witcher” utilise deux langages de script – les types de scripts LUA et Neverwinter Nights. Dans ce chapitre,
nous verrons ce dernier. C’est même langage utilisé dans Neverwinter Nights. Naturellement, ces scripts
peuvent être écrits dans l’éditeur D’jinni. Le D’jinni a un éditeur de script, qui possède 3 fonctions principales –
la syntaxe colorée, la range numérotée et les conseils de syntaxe de scripts. L’éditeur de script peut être lancé
de 2 façons. La première façon est de choisir dans le menu File : New->Neverwinter Script (.nss) :
Une fenêtre new neverwinternights scripts apparaît :
C’est l’éditeur de scripts. La seconde manière de le lancer sera décrite plus loin dans le chapitre. Chaque script
doit être compilé ou être « traduit », en code compréhensible par l’ordinateur. La compilation de script peut
être effectuée de 2 façons. L’une consiste à sauvegarder le fichier et dans ce cas, il sera automatiquement
compilé, l’autre est de choisir à partir du menu tool, la commande Compile :
N’oubliez pas que la commande Compile du menu Tools, n’est accessible que si l’éditeur de scripts est actif. Par
ailleurs, une fois compilé de cette manière, le script sera sauvegardé.
LANCEZ UNE CINÉMATIQUE
Dans le chapitre précédent nous avons vu comment créer une cinématique. Cependant, elle ne se lancera
jamais ainsi, à moins de lui attribuer plus d’options qui la rendront jouable. Pour ce faire, nous allons lui ajouter
un déclencheur et un script, lançant une cinématique quand Geralt (le joueur) fait un pas sur la zone du
déclencheur. En plus, puisque nous voulons que la cinématique ne se joue qu’une seule fois, le script devra
désactiver le déclencheur.
Tout d’abord, nous avons besoin d’ajouter un déclencheur. Si vous ne savez plus comment faire, n’hésitez pas à
consulter la section appropriée du manuel. Lorsque vous êtes prêt, placez un déclencheur de manière à ce qu’il
soit sur le point de départ :
Si vous vous souvenez, le point de départ se trouvait dans la première zone que nous avons créée, c'est-à-dire
g31_cave. Mettez le déclencheur à cet endroit et ouvrez ses propriétés à partir de la fenêtre de l’explorateur
de Module :
La fenêtre des propriétés apparaît :
Tapez trigg_movie dans la section General pour l’attribut Tag :
Soyez certain que dans la section Attributes, l’attribut soit sur True :
Cela signifie que le déclencheur est actif. Maintenant, voyons la section Scripts. Un attribut appelé On Enter
devrait être affiché ici. Le script alloué à cet attribut se déclenchera au passage de Geralt (Geralt ou un PNJ).
C’est précisément le script de cet attribut qui déclenchera la cinématique. Puisque le déclencheur se trouve
dans le secteur du point de départ, la cinématique sera jouée après le chargement du module, dès que Geralt
apparaîtra dans le déclencheur.
Maintenant nous verrons comment lancer l’éditeur de script sans utiliser le menu File. Tapez le nom de fichier
launch_film à l’attribut On Enter et validez par ENTER :
Cliquez sur l’icône rouge NSS :
L’éditeur de script apparaît :
Notez que le script sera automatiquement baptisé du nom que vous avez entré. Cette méthode pour lancer
l’éditeur est meilleur que celle utilisée par le menu File, parce que le script est directement nommé et assigné à
l’attribut.
Il est temps d’écrire votre premier script. Comme vous pouvez le voir, chaque script démarre avec la fonction
void main {}. Le contenu du script devra être entré dans le corps de la fonction entre les accolades « {} ».
Commençons par écrire un commentaire de telle sorte que quiconque lit ce script sache de quoi il s’agit. Taper
ce qui suit (notre premier script) :
Tout ce qui est écrit entre ‘/*’ et ‘*/’ est traité comme un commentaire et ne sera pas pris en compte par le
compilateur. Le commentaire est un texte servant à donner de l’information au lecteur pour qu’il sache de quoi
il s’agit. Comme vous pouvez le voir, ce type de commentaire peut être écrit sur plusieurs lignes. Un autre type
de commentaire peut être utilisé en utilisant les signes ‘//’. Mettez ce qui suit (cinématique) :
Ce type de commentaire s’appelle un recouvrement. Comme son nom l’indique, il ne le met que sur une ligne.
Si vous voulez mettre plusieurs commentaires de ce type, vous allez devoir mettre les // à chaque ligne.
Ajoutons notre première fonction. En dessous du dernier commentaire, rajoutez ce qui suit :
Notez qu’une apparaît dès que vous commencez à écrire le mot Play. La fenêtre contient la liste des fonctions
disponibles que vous pouvez utiliser dans ce contexte. Ce sont les 6 fonctions que commence avec le mot Play
– déplacez-vous dans la liste avec les flèches de l’ascenseur  . Après avoir sélectionnez la fonction
PlayCutscene, pressez la touche TAB ou ENTER. Il est évident que vous pouvez également écrire la fonction
manuellement.
Puisque nous voulons lancer une cinématique, tapez PlayCutscene. Ouvrez ensuite une ‘(‘.
Notez qu’une fenêtre d’information c’est ouverte. Cette fois il s’agit de la syntaxe de fonction. En suivant la
suggestion proposée, nous rajouterons le nom de la cinématique. Mettons un nom de fichier, mais sans
l’extension .cut (mon_film).
L’argument suivant de la fonction PlayCutscene function est le nom du script qui sera lancé à la fin de la
cinématique. Nous n’avons pas besoin de ce type de script, utilisez les quotations vide “”.
Le troisième argument est plus important pour notre action. Il s’agit du mode d’affichage du film. S’il est
configuré sur 1 (vrai-True) alors les personnages ne seront pas montrés. Par contre, s’il est configuré sur 0
(Faux-False), alors ils seront montrés, et c’est cela que nous allons choisir. Pendant le mouvement des 2
caméras, nous pourrons voir Jethro, Siegfried, et Geralt (à condition d’avoir placé la caméra vers le point
d’arrivé des personnages). Voyons ce que donne le code :
Rappelez-vous de placer un ‘;’ après chaque fin de ligne de script. La fonction PlayCutscene se lancera dans la
cinématique spécifique. Il ne reste plus qu’à arrêter le déclencheur à la fin de la cinématique.
Avant cela, rajoutons un autre commentaire (arrêt du déclencheur) :
Cela indique que la fonction suivante fera arrêter le déclencheur. Ajoutons maintenant la prochaine fonction,
entrez ce qui suit :
Comme vous pouvez le voir, il y a un nombre de fonction commençant par le mot Enable. Mais attendez – si
nous voulons arrêter un déclencheur, pourquoi utiliser une fonction d’activation au lieu d’une fonction d’arrêt?
Vous allez bientôt comprendre.
La fonction qui est nécessaire pour notre réalisation s’appelle EnableTrigger. Tapez là et ouvrez la ‘(‘ :
Comme vous pouvez le voir, le premier argument de la fonction EnableTrigger est l’objet du déclencheur.
Cependant, il est important de définir le déclencheur, et cela de 2 façons. La première est de rajouter une ligne
avec le script suivant :
object oTrigger = GetObjectByTag(“trigg_movie”);
Object est un mot-clé qui signifie que nous définirons un objet. oTrigger est un nom arbitraire, auquel l’objet
sera assigné. La fonction GetObjectByTag définira l’étiquette utilisée sur l’objet. Dans notre cas, nous voulons
définir sur l’objet le déclencheur, qui, si vous vous rappelez, porte le nom de trigg_movie. Continuez avec ce
qui suit :
EnableTrigger(oTrigger
Il y a une manière plus simple – le mot-clé OBJECT_SELF. Les mots-clés sont marqués en bleu dans l’éditeur de
script. OBJECT_SELF se rapporte à l’objet qui possède le script. Puisque le script est assigné au déclencheur de
trigg_movie, l’utilisation du mot-clé OBJECT_SELF indiquera automatiquement le déclencheur trigg_movie. Du
coup, plus besoin d’écrire la ligne avec l’objet oTrigger.
Le script devrait s’afficher comme cela :
La fonction EnableTrigger commute le déclencheur on/off. Le second argument de la fonction peut prendre la
valeur TRUE (on) ou FALSE (off). Tapez FALSE après la virgule et terminez par ‘)’ :
N’oubliez pas le ‘;’ à la fin.
Voilà, notre script est prêt à fonctionner. Sauvegardons-le sous le nom launch_film.nss:
Si la sauvegarde launch_film.nss n’apparaît pas dans le menu file, ou s’il y a un autre nom à la place, c’est sans
doute parce que la fenêtre launch_film.nss n’est pas active à ce moment. Activez là en cliquant sur la barre du
titre launch_film.nss et choisissez Save launch_film.nss à partir du menu File. La fenêtre Save File apparaîtra :
En sauvegardant le fichier, vous aurez le choix de le faire dans la globalité (cela signifie qu’il sera disponible
dans d’autres modules) ou seulement dans ce module ci. Cliquez sur le bouton Global cette fois-c mais
souvenez que vous pouvez le faire uniquement pour un module spécifique. Ce dernier est un bon choix si vous
voulez éditer votre travail sur internet pour le partager sur un intranet ou pour la communauté, puisqu’il sera
sauvé entièrement sous le format de fichier .adv. Cela a été déjà été évoqué plus tôt dans le manuel.
Cliquez sur le bouton Global pour ouvrir la fenêtre. Allez dans le dossier Data\Scripts folder, tapez le nom de
fichier et sauvez. Il est évident qu’un fichier sauvegardé de cette manière peut être utilisé plus tard dans un
autre module. Nous allons procéder comme cela, cliquez sur le bouton Module, une fenêtre Enter Name
apparaîtra. Tapez le nom du script launch_film :
Validez. Click OK. Le script sera compilé et apparaîtra dans l’explorateur de Module dans la sous-branche
Neverwinter scripts sources :
Maintenant que le script a été compilé, voyons ce que cela donne dans le registre d’évenèment, l’Aurora log :
Si des erreurs surgissent lors de la compilation, elles apparaîtront en rouge. Comme vous pouvez le voir, notre
compilation c’est mal terminée et affiche une erreur :
NWNScript Compiler: \..\ launch_film.nss did not Compile successfully
Cela signifie que le script launch_film.nss n’a pas été correctement compilé. L’erreur est décrite dans la ligne
suivante :
NWNScript Compiler: launch_film.nss(10): ERROR: UNDEFINED IDENTIFER (PlayCuscene)
Le numéro de la ligne est donné entre parenthèses ‘()’, après le nom du script. Suit le type d’erreur –
UNDEFINED IDENTIFIER. Le nom de l’identifiant est marqué après entre parenthèses. Et l’ordinateur dit vrai – il
n’y a pas de fonction appelé PlayCuscene, seulement PlayCutscene. Naturellement, l’écriture doit être exacte
et script recompilé :
NWNScript Compiler: \..\launch_film compiled successfully
Cela signifie que le script est maintenant correctement compilé, mais il faut aussi sauvegarder le module dans
son intégralité. Choisissez Save Module dans le menu Module :
Voilà, nous avons créé notre premier script. Je vous l’accorde, il n’est pas bien compliqué, mais suffisant pour le
moment.
LE SORCELEUR ET SON ÉQUIPEMENT
Un des éléments important quand on créé un module est de définir l’équipement de Geralt. Malheureusement
ce n’est pas si simple. Pour faire ce travail, nous avons besoin de créer un script qui aidera à le définir.
Cette fois, nous créerons un à partir du menu File en choisissant New -> Neverwinter Script (.nss):
Une nouvelle fenêtre new neverwinternights script apparaîtra :
Tout d’abord, mettez un commentaire dans le script (Equipement de Geralt) :
La fonction que nous emploierons pour créer l’équipement de Geralt se nomme CreateItemOnObject. L’un des
arguments que nous devons définir est l’objet qui va être assigné à l’Item. Dans notre cas, il s’agit de Geralt.
Ceci est fait grâce à la fonction GetFirstPC.
Ajoutons tout d’abord un nouveau commentaire afin de réaliser un script bien clair (rassembler les objets du
joueur) :
Ajoutez ensuite la fonction GetFirstPC dans la ligne d’après :
La ligne peut être lue de la manière suivante : dessinez sur l’objet du premier joueur et assignez-le à l’objet
oPC.
Il est temps maintenant d’employer la fonction de création d’équipement. Dans la fonction
CreateItemOnObject nous avons besoin de définir le nom des modèles d’item. Tous les modèles sont
sauvegardés dans le dossier Data\Templates\Items. Donc, par exemple, rajoutons quelques Orins (la monnaie
utilisée dans The Witcher) et une épée d’argent (l’épée en acier est ajoutée par défaut, nous avons donc pas
besoin de nous en faire pour cela) à l’équipement de Geralt.
Les modèles d’orins sont classés de it_gold_001.uti à it_gold_014.uti. Ces modèles sont sauvegardés dans le
dossier Data\Templates\Items\Valuables. Le modèle de l’épée d’argent s’appelle it_svswd_004.uti et est
sauvegardé dans le dossier Data\Templates\Items\Weapons&Armor. Gardez en mémoire que dans la fonction
CreateItemOnObject les noms de modèles doivent être écrits sans l’extension.uti.
Retournons à notre script. Mettez une ‘(‘ après avoir écrit la fonction CreateItemOnObject :
Une info-bulle est apparue après la fonction. Il s’agit du modèle de l’item et de la cible de l’objet et le dernier
argument que nous devons déterminer dans la fonction CreateItemOnObject est la quantité de l’item. C’est le
nombre d’objet du même modèle qui doit être saisie. Tapez la ligne entière :
N’oubliez pas de rajouter un ‘;’. Rajoutons un commentaire supplémentaire, mais dans un endroit différent
(nombre d’orins):
Comme vous pouvez le voir, nous pouvons écrire un commentaire en fin de ligne. Vous ne pouvez pas le faire
en début de ligne, cependant, en utilisant les symboles ‘//’. Si vous voulez vraiment rajouter un commentaire
au début de la ligne (ce n’est pas recommander de le faire), il faudra utiliser les symboles de commentaire ‘/*’
‘*/’ :
La ligne ci-dessus peut être lue de la manière suivante : ajouter 50 items, basé sur le modèle it_gold_005, à
l’objet oPC.
Rajoutons maintenant l’épée en argent (Epée en argent) :
Ce sera tout, notre script est prêt. Sauvegardons-le à partir du menu File, en choisissant Save As… :
Allez dans le dossier Data\Scripts, et nommez le equipment puis cliquez sur Save. Rappelez-vous que le nom du
fichier ne peut pas dépasser 16 caractères. Soyez sur de le sauvegarder au format .nss :
Si un message différent apparaît, c’est probablement que vous essayez de sauvegarder quelque chose d’autre
qui s’est ouvert par accident. Avant de la sauvegarder, soyez certain que fenêtre new neverwinternights script
soit active. Si elle n’est pas active, elle sera affichée par une barre grise :
Une couleur différente signifie que la fenêtre est active :
L’astérisque devant le nom dans la barre de titre signifie que le fichier n’a pas été sauvegardé depuis le dernier
changement effectué. Souvenez-vous que le script peut être sauvegardé directement à partir du module. Pour
cela, choisissez Save new neverwinternights scripts dans le menu File et sélectionnez Module dans la fenêtre
Save File qui apparaîtra.
Dans ce manuel, nous n’avions pas employé cette méthode, préférant sauver dans la globalité et ajouter alors
des fichiers manuellement aux modules, en utilisant l’explorateur de ressources. Cette méthode a été discutée
dans un des chapitres précédents. Vérifions maintenant le résultat de l’Aurora log pour voir si la compilation
c’est bien déroulée :
La première entrée signifie que la sauvegarde s’est bien passée, alors la deuxième indique que la compilation a
eu lieu sans échec. La troisième entrée une sauvegarde réussit subséquente.
Ajoutons maintenant notre script au module. La meilleure façon de procéder est de l’assigner dans les
propriétés du module à l’évènement On Client Enter. De cette façon, le script sera lancé toute les fois où Geralt
apparaît dans le module. Chargez le module, si ce n’est pas déjà fait, et ouvrez l’explorateur de module :
Double cliquez sur Module Properties à partir de l’explorateur :
La fenêtre des propriétés apparaît. Cliquez sur l’icône jaune :
Allez dans le dossier Data\Scripts folder, sélectionnez equipment.nss et cliquez sur Open. Cela allouera le script
equipment.nss à l’action On client enter :
Sauvegardez l’intégralité du module :
Lors du chargement du module, Geralt aura alors 50 orins et une épée en argent. Cette méthode peut-être
employé pour déterminer les équipements d’autres personnages.
TEST DE FLAG (DRAPEAU)
En créant des conversations et des quêtes dans les chapitres précédents, nous avons employés des flags
(drapeaux), qui, selon la situation, ont été assignés des valeurs 0 (faux) ou 1 (vrai). En préparant la quête
utilisée dans ce manuel, le plus grand problème que j’ai rencontré était de vérifier si un flag donné avait
réellement la valeur appropriée. Malheureusement, le D’jinni ne vous permet pas de vérifier son statut. La
bonne nouvelle, c’est que nous pouvons le faire en utilisant un script. Pour rappel, nous avons utilisé les falgs
suivants :

orders_received,

leader_killed,

results_reported.
Nous allons créer un nouveau script. Sélectionnez New -> Neverwinter Script (.nss) à partir du menu File :
La fenêtre new neverwinternights script apparaîtra :
Comme à l’accoutumé, rajoutons un commentaire (test des flags) :
Tapez les lignes suivantes :
Notez qu’à la fin de la ligne contenant le mot clé “if”, il n’y a pas de point virgule. C’est extrêmement
important, car si vous mettez le point virgule, le script ne fonctionnera pas correctement.
Le mot clé “if” est une instruction conditionnelle. La tâche d’une instruction conditionnelle est de contrôler un
script dont les pièces seront exécutées quand les conditions particulières sont réunit. Le résultat d’exécution du
cette instruction conditionnelle “if” est, la valeur 0 (faux) quand la condition est fausse, et la valeur 1 (vrai)
quand la condition est vraie. La fonction GetDialogFlagValue agit sur la valeur du flag de dialogue du nom
donné.
L’expression entière peut être lue comme suit : quand la valeur du flag de dialogue appelé orders_received est
égale à 0 alors… Naturellement nous devons terminer le script et déterminer ce qui va se passer quand la
valeur est égale à 0. Ecrivez la partie suivante de l’instruction conditionnelle “if” comme suit :
La fonction PrintString affiche le texte donné dans l’Aurora log. L’expression entière peut maintenant être lue :
quand la valeur du dialogue de flag appelé orders_received est égale à 0, alors affiche le texte du flag
orders_received = 0 dans la fenêtre de registre d’évènement. Simple, non ? Maintenant, nous devons écrire
dans le cas ou l’instruction conditionnelle “if” est égale à 1:

Le même script peut être utilisé pour les 2 autres flags. The same script can be used to check the other
two flags. Copiez le bloc de code et rajouter les noms des 2 autres flags, leader_killed et results_reported :
Rajoutons maintenant quelque chose de différent. Les anciens, qui ont appris à coder dans les livres, se
rappellerons que les premières machines montrée seulement du texte et le texte “Hello World” a été utilisé en
instruction commune au scripting. Afin d’honorer ces vieilles conventions, nous allons ajouter à la fin du script
ce qui suit :
Le codage est plus complexe aujourd’hui, mais il a beaucoup plus de style. Sélectionnez Save As… à partir du
menu File :
Allez dans le dossier Data\Scripts folder, tapez test_flag comme nom et cliquez sur Save. Vérifiez qu’il ne
dépasse pas 16 caractères et qu’il soit bien sauvegarder au format de fichier .nss :
Si un message différent apparaît, c’est probablement que vous essayez de sauvegarder quelque chose d’autre
qui s’est ouvert par accident. Avant de la sauvegarder, soyez certain que fenêtre new neverwinternights script
soit active. Si elle n’est pas active, elle sera affichée par une barre grise :
Une couleur différente signifie que la fenêtre est active :
L’astérisque devant le nom dans la barre de titre signifie que le fichier n’a pas été sauvegardé depuis le dernier
changement effectué. Souvenez-vous que le script peut être sauvegardé directement à partir du module. Pour
cela, choisissez Save new neverwinternights scripts dans le menu File et sélectionnez Module dans la fenêtre
Save File qui apparaîtra.
Après avoir sauvegardé le fichier, vérifions qu’aucune erreur ne s’est produite lors de la sauvegarde et la
compilation du script. Pour cela, Ouvrez la fenêtre de l’explorateur de ressources : Cliquez sur Utility Windows > Resources Explorer à partir du menu View :
Dans la fenêtre de l’explorateur de ressource, déployez l’arbre Data puis Scripts pour voir appraître le script
test_flag.nss :
Maintenant passez en mode jeu. Pour cela sélectionnez Play à partir du menu Game :
Après être passé en mode jeu, chargez le module. Une fois lancé, allez dans la fenêtre de l’explorateur de
ressources et cliquez-droit sur le script test_flag.nss. Sélectionnez Run script à partir du menu :
Dans la fenêtre de l’Aurora log vous devriez avoir ce qui suit :
Comme vous pouvez le constater, tous les flags ont la valeur initiale de 0. Maintenant, faîtes la quête de Jethro
et relancez le script. Tuez ke chef des bandits et relancez une nouvelle fois le script. Vous verrez des
changements. Comme vous pouvez le constater, les scripts peuvent vous simplifier la vie.
AIDE AUX LANGAGES DES SCRIPTS
C’est tout concernant les scripts. Le langage des scripts utilisé dans “The Witcher” est exactement le même que
celui employé dans “Neverwinter Nights”. Cependant, les deux langages peuvent différer quand vient la
fonction des noms, la manière dont les fonctions sont appelées, etc. Si vous voulez approfondir les scripts du
D’jinni sérieusement, alors vous allez devoir apprendre les pratiques de l’éditeur de “Neverwinter Nights”. La
plupart des fonctions sont pratiquement semblables.
Je vous invite à jeter un coup d’œil sur les guides et manuels en ligne de l’éditeur NWN : Le lexique peut être
trouvé à l’adresse suivante http://www.nwnlexicon.com/. La plupart des fonctions utilisés dans NWN sont
listées et décrites là.