Baldur's Gate et Dragon Age | La Couronne de Cuivre
Merci de prendre connaissance des conditions d'utilisation des forums, des blogs et du chat

Précédent   Baldur's Gate et Dragon Age | La Couronne de Cuivre > La Forge de GrondMarteau > La Forge des Apprentis > Les Outils

Les Outils
Besoin d'outils pour concevoir vos mods ? Ne cherchez plus, vous êtes à la bonne adresse. Trouvez ici une description des différents outils disponibles.

Réponse
 
Outils de la discussion Noter la discussion
Vieux 29/04/2008, 17h06   #1
Jack The Ripper, Aventurier
Araignée Géante
 
Avatar de Jack The Ripper
 
Date d'inscription: décembre 2007
Localisation: A l'hôpital psychiatrique
Messages: 552
Envoyer un message via MSN à Jack The Ripper
Par défaut [TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 7

Dans la leçon 6, nous abordions les fichiers .tra et même si ce tutorial pouvait vous sembler long et laborieux (ce qui n’est en fait pas du tout le cas), nous abordions la partie la plus soft de la programmation d’un mod.
Soyez particulièrement concentré pour ce tutorial-ci : il n’y a plus de texte, rien que du code, et en plus, il est long.

Leçon 7 : LES FICHIERS .D (PARTIE 1)
à Cette leçon fait suite à la Leçon 6 ([TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 6)

LOGICIELS NECESSAIRES : Blocnote ou ConText (ou les deux)

MOD BELLA JANSEN FORTEMENT RECOMMANDE


1/ Le fichier Dialogue : fonctions

Le fichier .d (pour Dialogue) est un fichier crée avec Blocnote ou ConText (voir Leçon 1), de la même façon que le fichier .tra, sauf qu’ici vous changerez l’extension : .tra à .d
Ainsi, en reprenant l’exemple Bella Jansen fortement recommandé pour cette leçon, nous aurons :


- Un fichier #TBella.tra, qui contient le texte
- Un fichier #TBella.d qui contient des codes

Ce qui m’amène donc à expliquer qu’un fichier .d contient toute la programmation du fichier .tra qui lui est associé (même nom, mais l’extension change). Sans ce fichier .d, impossible à WeiDU de savoir comment vous avez voulu agencer votre texte, n’est-ce pas ?

Il n’existe qu’un seul type de fichier .d (hourrah !) mais attention, autant écrire du texte est à la portée de (presque) tout le monde car cela ne nécessite aucun apprentissage particulier, autant ici, il s’agit d’apprendre un langage nouveau, celui de WeiDU.

2/ Une syntaxe précise

Le langage de WeiDU est simple, mais il importe de l’écrire correctement. La moindre erreur peut être fatale et mettre en échec l’installation de votre mod. C’est ce qui s’appelle une « parse error », qui survient à l’installation de votre mod : WeiDU va lire votre fichier .d mais s’il est mal écrit, alors il va bloquer et signaler une « Parse error ». La Parse error sera abordée dans la leçon sur les bugs, avec les tuyaux pour la corriger facilement ; toutefois j’insiste dès à présent sur l’utilisation de ConText, seul ou en complément avec Blocnote, ConText qui vous permettra de débusquer votre Parse error plus facilement.

3/ Variables, triggers…

Un fichier .d contient nécessairement des variables et des triggers.
Une variable est une condition, que l’on peut poser de deux façons.
Un trigger, qui signifie en anglais « déclenchement, bascule », provoque une action (le PNJ quitte la party, quitte la zone, ect).
Ces deux indispensables seront abordés plus loin dans la leçon.

4/ Ecriture d’un fichier .d

Il y a de nombreux cas de figure selon les dialogues que vous aurez bâtis dans votre fichier .tra correspondant. Dès à présent, associons le fichier .d au fichier .tra :

Exemple : #TBella.tra correspond au #TBella.d (même nom, seule l’extension change).

Une fois votre fichier .d nommé correctement, vous le rangerez dans le sous-répertoire Dialogues de votre mod.
A présent, étudions la syntaxe, l’organisation et les différends cas de figure, selon les dialogues écrits.
RAPPEL : tout ce qui figure après // est une annotation qui n’a pas lieu d’être mise dans votre fichier .d. Il ne s’agit que d’explications de ma part. En bref, tout ce qui figure en bleu participe de la syntaxe proprement dite.

A/ ORGANISATION

BEGIN ~[nomdufichier.dsansextension]~

-> Tout fichier .d commence obligatoirement par cette ligne, que ce soit celui de votre PNJ ou celui d’une autre créature (contrairement au .tra).

Une fois cette introduction posée, vous avez ce que l’on appelle toute une série de blocs de discussion. Qu’est-ce qu’un bloc ?


-> Un bloc équivaut dans le jeu à une fenêtre de discussion, pourvu d’un bouton sur lequel le joueur est invité à cliquer, soit :
- FIN DE LA DISCUSSION
- CONTINUER


Exemple d’un bloc :

IF ~~ THEN BEGIN Label
SAY @0
IF ~~ THEN EXIT
END

-> Règle d’or: un bloc commence toujours par un IF et se termine toujours par un END.

Traduction en français du bloc :


IF ~~ THEN BEGIN à SI ~~ ALORS COMMENCE
Label à le nom de votre bloc, c’est vous-même qui le déterminez
SAY @0 à DIT réplique @0 (contenue dans le fichier .tra associé)
IF ~~ THEN EXIT à SI ~~ ALORS SORTIE
END à FIN (DU BLOC)

~~ à entre ces deux signes, vous placez variable ou trigger, selon le cas. S’il n’y en a pas, il faut laisser vide tout en conservant les ~~


Traduction concrète du bloc :

@0 = ~Salut ! ça te dirait qu’on mange une pizza ensemble ?~ // Votre PNJ
-> Fin de la discussion

Mais vous aimeriez n’est-ce pas, pouvoir répondre à cette proposition ? C’est ce que nous allons voir dans les CAS DE FIGURE.

B/ CAS DE FIGURE

Votre dialogue dans le fichier .tra n’est naturellement pas figé selon le schéma présenté ci-dessus. Plusieurs cas de figure se présentent donc à vous selon que Charname a droit de réponse, ect.
/ !\ ATTENTION : cette série de cas de figure n’est valable qu’en cas de conversation à deux voix, pas plus. Le cas de conversation à 3 protagonistes, puis à 4 et plus seront abordés plus loin. / !\
Note: les labels employés ici sont à titre d'exemple, vous les remplacez naturellement par les vôtres.

a) 1er cas de figure : le monologue

IF ~~ THEN BEGIN Pizza
SAY @0
IF ~~ THEN EXIT
END

-> Comme nous l'avons vu plus haut, Charname ici n'a aucun droit de réponse. Le PNJ sort la réplique @0 contenue dans son fichier .tra et c'est tout, fin de la discussion.
-> Le label Pizza se réfère à un mot-clé contenu dans la réplique @0, en l'occurence ici la Pizza, ce qui permet de se retrouver facilement dans sa programmation.
-> Tout bloc doit obligatoirement avoir un label.

Une variante du monologue :

IF ~~ THEN BEGIN Pizza
SAY @0 = @1 = @2
IF ~~ THEN EXIT
END


-> Admettons que vous ayez écrit @0, @1 et @2 au sujet de la pizza, et que ces répliques appartiennent à votre PNJ, mais que le texte soit trop long. Vous écrirez donc @0 = @1 = @2, ce qui équivaut au bouton CONTINUER ingame. Pratique pour alléger et rendre votre texte plus esthétique. Vous retrouvez ce procédé dans le mod Bella Jansen. En tout cas, Charname n’a toujours pas la parole dans cette variante, logique.

b) 2ème cas de figure : le dialogue à deux voix

IF ~~ THEN BEGIN Pizza
SAY @0
IF ~~ THEN REPLY @100 EXIT // Traduction : SI ~~ ALORS REPOND @100 SORTIE
END

Traduction concrète du bloc :

@0 = ~Salut ! ça te dirait qu’on mange une pizza ensemble ?~ // Votre PNJ
@100 = ~Et pourquoi pas un petit Mac Do’, plutôt ?~ // Charname

-> Charname a eu droit à la parole, en l’occurrence la réplique @100 du fichier .tra du PNJ (puisque je rappelle la règle d’or : - Est considérée comme appartenant à un personnage toute discussion débutée par lui.
-> Le bloc se terminant sur un EXIT, ceci signifie la fin de la discussion.
-> Le END ferme le bloc (il n’a strictement rien à voir avec un EXIT).


Tout ça, c’est bien beau, mais vous aimeriez sans doute avoir une conversation bien plus longue que cela. Après tout, la réponse de Charname implique une réaction du PNJ.


c) Troisième cas de figure : Enchaînement de blocs de discussion

Le label ici prend tout son sens, car il n’y en a plus un (Pizza) mais plusieurs, comme vous pouvez le voir dans cette suite de blocs :

IF ~~ THEN BEGIN Pizza
SAY @0
IF ~~ THEN REPLY @100 GOTO Pouah // Traduction : SI ~~ ALORS REPOND @100 ALLER A Pouah
END

IF ~~ THEN BEGIN Pouah
SAY @2
IF ~~ THEN REPLY @200 GOTO PasQuestion
END

IF ~~ THEN BEGIN PasQuestion
SAY @3
IF ~~ THEN EXIT
END

-> Vous voici en présence de trois blocs, ce qui donne concrètement ceci:


@0 = ~Salut ! ça te dirait qu’on mange une pizza ensemble ?~ // Votre PNJ
@100 = ~Et pourquoi pas un petit Mac Do’, plutôt ?~ // Charname
@2 = ~Pouah ! Vive la malbouffe…~ // Votre PNJ
@200 = ~N’importe quoi ! C’est gras, c’est industriel, c’est bon !~ // Charname
@3 = ~Pas question que je mette les pieds là-dedans. Bye bye !~ // Votre PNJ

-> Les labels relient les blocs entre eux. Sans les labels, impossible de savoir quel bloc est relié à tel autre bloc.

A présent, vous aimeriez que Charname ait plusieurs choix de réponses ?
/ !\ ATTENTION : je rappelle ici que la numérotation employée est toute personnelle. / !\

IF ~~ THEN BEGIN Pizza
SAY @0
IF ~~ THEN REPLY @100 GOTO Pouah
IF ~~ THEN REPLY @101 GOTO Youpee
END

IF ~~ THEN BEGIN Youpee
SAY @4
IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN Pouah
SAY @2
IF ~~ THEN REPLY @200 GOTO PasQuestion
END

IF ~~ THEN BEGIN PasQuestion
SAY @3
IF ~~ THEN EXIT
END


Traduction concrète :

@0 = ~Salut ! ça te dirait qu’on mange une pizza ensemble ?~ // Votre PNJ
@100 = ~Et pourquoi pas un petit Mac Do’, plutôt ?~ // Charname
@101 = ~D’accord, je te suis.~ // Charname - @4
@2 = ~Pouah ! Vive la malbouffe…~ // Votre PNJ
@200 = ~N’importe quoi ! C’est gras, c’est industriel, c’est bon !~ // Charname
@3 = ~Pas question que je mette les pieds là-dedans. Bye bye !~ // Votre PNJ
@4 = ~Youpee !~ // Votre PNJ



Vous venez de découvrir la Syntaxe de base de WeiDU, c’est-à-dire sans Variables ni Triggers. Cependant, sans ces derniers, vous n’irez pas bien loin.

C / LE TRIGGER

Découvrons sans attendre le TRIGGER.
Comme expliqué plus haut, il s’agit d’un déclencheur, qui se place entre ~~, mais JAMAIS après un IF, qui est réservé à la VARIABLE.
Si vous avez lu le petit dialogue concocté pour l’exemple, vous avez remarqué la réplique @3 et le « Bye bye » qui la conclut. Vous vous doutez bien qu’à ce moment-là, le PNJ n’est pas content et quitte la party (eh oui, il en faut peu !). Et voici comment cela se présente :

IF ~~ THEN BEGIN Pizza
SAY @0
IF ~~ THEN REPLY @100 GOTO Pouah
IF ~~ THEN REPLY @101 GOTO Youpee
END

IF ~~ THEN BEGIN Youpee
SAY @4
IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN Pouah
SAY @2
IF ~~ THEN REPLY @200 GOTO PasQuestion
END

IF ~~ THEN BEGIN PasQuestion
SAY @3
IF ~~ THEN DO ~ LeaveParty()
EscapeArea()~ EXIT // Traduction : SI ~~ ALORS FAIRE ~Quitte la party, Quitte la zone~ SORTIE
END

-> La partie surlignée en orange est donc composée de deux triggers : l'un déclenche le départ du PNJ du groupe et l'autre, de la zone.
-> La syntaxe utilisée est THEN DO ~~


1ère variante :

Charname refuse que le PNJ s’en aille (je reprends juste ici le bloc concerné) :

IF ~~ THEN BEGIN PasQuestion
SAY @3
IF ~~ THEN REPLY @300 DO ~ LeaveParty()
EscapeArea()~ EXIT
END

Traduction concrète :

@3 = ~Pas question que je mette les pieds là-dedans. Bye bye !~ // Votre PNJ
@300 = ~Eh, attends, je plaisantais !~ // Charname
-> PNJ quitte partie et zone.

---------------------------------------------
-> Dans cette variante, le THEN DO devient seulement DO car nous avons déjà un THEN avec THEN REPLY.
-> Il est capital de respecter à la lettre cette syntaxe sous peine de "Parse error" (voir "Une syntaxe précise" dans la même leçon).

D/ LA VARIABLE

La Variable tient une place capitale dans un mod. Sans elle, rien ne peut se déclencher car elle sert de déterminant pour lancer les dialogues, les cutscenes, ect. S'il n'y en a pas, comment WeiDU peut-il savoir qu'à tel moment du jeu, il faudra déclencher tel dialogue?


La variable fonctionne moitié de la même façon que le Label : c’est à vous de la nommer, cependant il y a des syntaxes à respecter, là encore.
Il existe trois types de variables :
- La variable GLOBAL
- La variable LOCALS
- La variable AREA


GLOBAL : Ce type de variable peut être vue par tout autre script dans le jeu mais il faut savoir qu’elle ralentira la lecture de WeiDU, il faut donc tâcher autant que faire se peut d’utiliser la variable LOCALS. Ce type de variable GLOBAL doit surtout être utilisé si l’enjeu est important (Quête, par exemple).
LOCALS : ce type de variable est spécifique à une créature, et ne sera pas lu par l’ensemble du programme.
AREA : Ce type de variable est lu au même titre que GLOBAL, à ceci près qu’elle n’est posée que si une action est effectuée un nombre limité de fois dans une zone précise.

Tout ceci peut paraître vague, consultez ce lien pour plus d’informations (attention, c’est en anglais) : http://iesdp.gibberlings3.net/appendices/variables.htm

a) Syntaxe de la Variable

Il y a deux façons d'utiliser la Variable:

- Vous souhaitez installer une variable:


àSetGlobal("XXXXXX", "GLOBAL", 1) (si de type GLOBAL)
à SetGlobal("XXXXXX", "LOCALS", 1) (si de type LOCALS)
à SetGlobal("XXXXXX", "ARXXXX", 1) (si de type AREA)

- Vous souhaitez la poser comme condition de déclenchement d’un trigger/bloc/réplique:

à Global("XXXXXX", "GLOBAL", X) (si de type GLOBAL)
à Global("XXXXXX", "LOCALS", X) (si de type LOCALS)
à Global("XXXXXX", "ARXXXX", X) (si de type AREA)


NOTE 1 : « XXXXXX » doit être remplacé par le nom de votre variable.
NOTE 2 : « X » remplaçant le 1 dans le second paragraphe doit être remplacé une valeur que vous aurez déterminé dans un précédent SetGlobal. L’exemple ci-dessous vous aidera à y voir plus clair :

Prenons #TBella.d dans le sous-répertoire Dialogues (téléchargement du mod ici).

Vue d’ensemble

----------------------------------------
BEGIN ~#TBella~

IF ~Global("#TBellaJansen","GLOBAL",2)~ THEN BEGIN Rencontre
SAY @0
IF ~~ THEN REPLY @100 GOTO Amende
END

IF ~~ THEN BEGIN Amende
SAY @2 = @3
IF ~~ THEN REPLY @300 GOTO Chouette
IF ~~ THEN REPLY @301 GOTO Ensemble
IF ~~ THEN REPLY @302 GOTO Vexee
END

IF ~~ THEN BEGIN Vexee
SAY @4
IF ~~ THEN DO ~EscapeArea()~ EXIT // Quitte la zone
END

IF ~~ THEN BEGIN Ensemble
SAY @7
IF ~~ THEN REPLY @700 GOTO PoilGratter
END

IF ~~ THEN BEGIN PoilGratter
SAY @8
IF ~~ THEN REPLY @800 GOTO Presentation
END

IF ~~ THEN BEGIN Presentation
SAY @9
IF ~~ THEN DO ~ SetGlobal("#TBellaJansen","GLOBAL",3)
JoinParty()~ EXIT // Rentre dans party
END

IF ~~ THEN BEGIN Chouette
SAY @5
IF ~~ THEN REPLY @500 GOTO NouvellesAventures
END

IF ~~ THEN BEGIN NouvellesAventures
SAY @6 = @9
IF ~~ THEN DO ~ SetGlobal("#TBellaJansen","GLOBAL",3)
JoinParty()~ EXIT // Rentre dans party
END


-> Le code surligné en orange est une modification de variable (de 2, elle passe à 3
-> Le code surligné en vert est une condition : c’est la condition de déclenchement de ce dialogue.
-> "#TBellaJansen" est le nom de la variable, c’est ce qui permet à WeiDU de les lier entre elles. Le nom est à customiser comme pour un label, même principe.
-> Notez en passant le trigger, JoinParty(), qui permet d’introduire Bella dans la party.

NOTE : vous ne trouverez pas le code surligné en orange dans le mod Bella Jansen, je me suis aperçue de cet oubli après.


Interprétation de la première ligne du bloc Rencontre :

IF ~Global("#TBellaJansen","GLOBAL",2)~ THEN BEGIN Rencontre


-> SI ~Variable #TBellaJansen, GLOBAL, est à 2 ~ALORS COMMENCE RENCONTRE

Interprétation des lignes dans blocs NouvellesAventures & Présentation :

IF ~~ THEN DO ~ SetGlobal("#TBellaJansen","GLOBAL",3)
JoinParty()~ EXIT
END

-> SI ~~ ALORS FAIRE ~Installer/modifier variable #TBellaJansen, GLOBAL, à 3)~ SORTIE
FIN DU BLOC


A ce stade de votre apprentissage, peut-être avez-vous remarqué (si c’est le cas, vous êtes en bonne voie) que la variable IF ~Global("#TBellaJansen","GLOBAL",2)~ THEN BEGIN Rencontre qui débute le dialogue de Bella n’a été posée nulle part. Logiquement, nous devrions trouver un SetGlobal(«#TBellaJansen », « GLOBAL »,1) quelque part, non ?
Et en effet, la variable "#TBellaJansen" a bien été posée quelque part et ceci fera l’objet d’une prochaine leçon sur les SCRIPTS, car votre dialogue, en l'état, ne peut encore exister ingame, n'ayant aucune variable qui permette son déclenchement.

5/ CONCLUSION

Et voilà, vous êtes désormais capable de programmer votre fichier .tra…Mais peut-être ai-je oublié un cas de figure ou bien avez-vous mal saisi certains points. Comme d’habitude, par ici les questions.
Il existe moultes triggers, dans cette optique je dresserai une liste des triggers les plus utiles dans un avenir proche, dans une prochaine leçon.

Avant d'attaquer les scripts, il convient d'abord de s’intéresser à la Leçon 7 : Partie 2 où nous irons encore plus profondément dans la programmation d’un fichier .d, avec la programmation de dialogues à trois voix, et à quatre et plus.

LECON 7 : PARTIE 2 ([TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 7, Partie 2)
__________________
STATUT : Toujours sur la brèche pour votre plaisir, m'ssieurs dames
Lefou hurle sa démence en RP sur La Couronne de Zinc
Le Trailer des Chroniques de Severian, un mod PNJ pour La Couronne de Cuivre

Dernière modification par Jack The Ripper ; 30/04/2008 à 09h24.
Jack The Ripper est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Tags
Aucune


Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Noter la discussion
Noter la discussion:

Règles de messages
Vous pouvez créer de nouvelles discussions
Vous pouvez envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are non

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
[TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 5 Jack The Ripper Les Outils 1 03/05/2008 16h24
[TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 2 Jack The Ripper Les Outils 1 29/04/2008 13h57
[TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 6 Jack The Ripper Les Outils 0 29/04/2008 12h22
[TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 4 Jack The Ripper Les Outils 4 28/04/2008 15h06
[TUTORIAL] Le Mod Pnj pour les Nuls : Leçon 3 Jack The Ripper Les Outils 0 27/04/2008 20h09


Fuseau horaire GMT +2. Il est actuellement 06h39.



Merci de soutenir La Couronne de Cuivre et le Wiki consacré à Baldur's Gate et aux RPG

Les forums La Sirène Rougissante, La Couronne de Cuivre, ainsi que les sites associés Le Portail du Web et Le Monde de Baldur's Gate sont protégés par le Code de la propriété littéraire et artistique. Baldur's Gate I (1998), Tales of the Sword Coast (1999), Baldur's Gate II (2000) Shadows of Amn, et Throne of Bhaal (2001) sont ©BioWare, licenses et distribution ©ATARI. Dungeons & Dragons material est ©Wizards of the Coast. NeverWinter Nights est un produit ©Bioware, licenses et distribution ©ATARI. DRAGON AGE © 2002-2007 BioWare Corp. Dragon Age, the Dragon Age logo, BioWare Corp., and the BioWare logo are trademarks of BioWare Corp. in the United States, Canada and other countries. All other trademarks are the property of their respective owners. All rights reserved.
Conformément à l'article 34 de la loi 78-17 du 6 janvier 1978 dite loi "Informatiques et Libertés" vous disposez d'un droit d'accès, de modification, de rectification et de suppression de vos données personnelles (déclaration CNIL en cours mai 2007). Pour faire valoir ce droit contactez nous en cliquant ici et en utilisant le formulaire à votre disposition


Édité par : vBulletin® version 3.7.0
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185