Project

Profile

Help

Triggers » History » Sprint/Milestone 2

Vincent Le Goff, 11/08/2017 01:55 PM

1 1 Vincent Le Goff
h1. Les triggers dans CocoMUD
2
3
Il est possible que les triggers soient la fonctionnalité la plus puissante de tout client MUD. CocoMUD propose un système simple et flexible de triggers, qui sera présenté ici avec de nombreux exemples.
4
5
{{toc}}
6
7
h2. Qu'est-ce qu'un trigger ?
8
9
Normalement, si vous entrez une commande dans le client, le serveur devrait vous "répondre" en envoyant une ou plusieurs lignes. Cette réponse est constituée en grande partie (sinon en totalité, à l'exception des couleurs) de texte, tout comme votre commande.
10
11
Les triggers peuvent intercepter une ligne particulière et réagir en fonction, en faisant quelque chose. C'est l'expression la plus simple d'un trigger : je surveille le texte envoyé par le serveur, je réagis si je rencontre une certaine ligne et je fais quelque chose en retour.
12
13
Les triggers étant potentiellement puissants, leur configuration a été répartie dans différentes couches de complexité : vous n'avez pas besoin de comprendre (ni même de connaître l'existence) des types de triggers les plus avancés pour utiliser cette fonctionnalité. Cette documentation va décrire dans l'ordre la mise en place, pas à pas, des triggers les plus simples jusqu'aux triggers les plus complexes.
14
15
h2. Créer un trigger
16
17
Commençons par quelque chose de simple : un trigger qui joue un son quand quelqu'un (n'importe qui) parle sur un canal du jeu.
18
19
Cet exemple sera différent sur n'importe quel MUD, bien entendu, n'hésitez donc pas à l'adapter en fonction de vos besoins. Pour notre exemple, admettons que nous pouvons utiliser la commande "hrp" pour envoyer un message sur le canal "hrp", comme ceci :
20
21
<pre>
22
hrp bonjour à vous !
23
</pre>
24
25
Et si tout va bien, le MUD devrait répondre avec :
26
27
<pre>
28
[hrp] Vous dites : bonjour à vous !
29
</pre>
30
31
Ou bien, si quelqu'un d'autre parle sur le canal "hrp", vous pourriez voir un message comme ceci :
32
33
<pre>
34
[hrp] Aaron dit : coucou
35
</pre>
36
37
En bref, si nous voulons créer un trigger qui intercepte ces lignes, il nous faut un trigger qui intercepte les lignes qui commencent par "[hrp]" ("hrp" entouré de crochets).
38
39
bq. Pourquoi intercepter ces messages ?
40
41
Si vous êtes nouveau dans l'utilisation des triggers, vous pourriez vous demander à quoi ils servent. La réponse dans ce cas précis pourrait être que, quand on reçoit un message sur le canal "hrp", le client joue un son. C'est sur cela que nous allons travailler.
42
43
Nous allons donc voir comment créer un trigger qui :
44
45
* Réagit quand le client reçoit une ligne commençant par "[hrp]" ;
46
* Joue un son à ce moment.
47
48
Comme la plupart des fonctionnalités sur CocoMUD, on peut créer des triggers en passant par l'interface ou par une instruction SharpScript. La première étant la plus facile pour commencer, nous allons la voir d'abord.
49
50
h3. Depuis l'interface
51
52
Pour ajouter, éditer ou suppriemr un trigger depuis l'interface de CocoMUD, ouvrez la barre de menu, *Jeu* -> *Triggers*.
53
54
Vous devriez vous trouver dans une boîte de dialogue listant les triggers actuellement configurés sur cet univers. Il est très possible que cette liste soit vide la première fois que vous ouvrez cette boîte de dialogue. Pour créer un trigger, cliquez sur le bouton *Ajouter*.
55
56
Une nouvelle boîte de dialogue s'ouvre alors. Le curseur devrait se trouver dans une zone d'édition, où l'on vous demande d'entrer le trigger (c'est-à-dire, son déclencheur, la partie qui va indiquer à CocoMUD quoi surveiller).
57
58
Pour notre exemple, nous avons déterminé que notre trigger devrait s'exécuter quand le client reçoit une ligne commençant par @[hrp]@. Vous pouvez écrire @[hrp]@ dans cette zone de texte, mais ne la quittez pas encore : si vous créez un trigger déclenché par @[hrp]@, le trigger ne sera exécuté que si le client envoie une ligne ne contenant *que* @[hrp]@. Ce n'est pas ce que l'on veut faire ici : nous voulons que le trigger réagisse à une ligne commençant par @[hrp]@ . La solution est de mettre un signe astérisque (@*@) après @{hrp}@, pour dire au client que @[hrp]@ peut être suivi de n'importe quoi.
59
60
Peut-être reconnaissez-vous cette syntaxe : c'est la même que pour créer des [[Alias|alias]] avec variables, et ce n'est pas une coïncidence, nous verrons plus tard pourquoi.
61
62
Pour l'instant, vous pouvez écrire dans ce champ de texte :
63
64
<pre>
65
[hrp]*
66
</pre>
67
68
Si vous appuyez sur Tab, vous devriez vous trouver dans une liste d'actions que l'on peut associer à ce trigger. Dans notre exemple, nous voudrions jouer un son quand ce trigger se déclenche : parcourez la liste jusqu'à trouver l'action :
69
70
<pre>
71
Joue un son
72
</pre>
73
74
Et cliquez sur le bouton suivant : *Ajouter l'action*.
75
76 2 Vincent Le Goff
On vous demande maintenant de configurer cette action (dans notre cas, choisir le fichier sonore à jouer quand ce trigger se déclenche). Vous avez un bouton "Parcourir" qui vous permet de trouver le fichier sonore sur votre disque dur. Le bouton "Test" permet de vérifier que CocoMUD parvient bien à lire et jouer ce fichier (CocoMUD lit les fichiers @.wav@ et @.ogg@). Si tout se passe bien, cliquez sur *OK*. L'action sera ajoutée au trigger. vous vous trouverez dans la liste des actions liées à ce trigger :
77 1 Vincent Le Goff
78
<pre>
79
#play mon_fichier.wav
80
</pre>
81
82
Bien sûr, "mon_fichier.wav" sera remplacé par le chemin et le nom du fichier que vous avez sélectionné. La représentation de l'action est en version courte (version SharpScript), cela explique pourquoi vous voyez @#play mon_fichier.wav@. Ne vous en inquiétez pas trop, c'est surtout un point de repère pour vérifier que l'action a bien été ajoutée, ainsi qu'un moyen de l'éditer, si vous voulez par exemple jouer un autre fichier sonore à la place.
83
84
Ces deux listes et les quelques boutons qui l'entourent forment l'éditeur SharpScript, permettant de configurer des actions assez complexes sans toucher au SharpScript de près ou de loin. Cette fenêtre peut s'avérer un peu intimidante au premier abord, voici donc un résumé de ce qu'elle contient. Notez que vous trouverez la même hiérarchie pour configurer [[Alias|les alias]] ou [[Macros|les macros]] et d'autres fonctionnalités de CocoMUD dépendantes du SharpScript :
85
86
* La première chose à renseigner pour les triggers est le déclencheur, comme nous l'avons fait plus haut. C'est une zone de texte toute simple ;
87
* Au-dessous se trouve une liste d'actions connectés à ce trigger. C'est une liste, vous pouvez naviguer avec les flèches pour la parcourir ou sélectionner une action précise ;
88
* À droite se trouve le bouton pour éditer la ligne d'action sélectionnée (dans notre cas, nous pourrions vouloir changer le fichier sonore joué par le trigger) ;
89
* Toujours à droite se trouve le bouton pour supprimer la ligne d'action. Notez que ces trois champs (liste d'actions, bouton éditer et bouton supprimer) n'apparaissent pas si aucune action n'est associée à ce trigger ;
90
* Au-dessous se trouve une liste d'actions que l'on pourrait vouloir lier à ce trigger. C'est dans cette liste que nous avons sélectionné "joue un son" dans l'exemple ci-dessus. Elle apparaît dans tous les cas, car un trigger peut être connecté à aucune, une, deux ou de nombreuses actions, il n'y a pas vraiment de limite.
91
* À droite se trouve le bouton pour ajouter l'action sélectionnée.
92
* Le reste de la fenêtre contient d'autres cases à cocher et options qui seront détaillées dans la suite de cette documentation.
93
94
Nous avons créé notre trigger @[hrp]*@ connecté à une action pour jouer un son : vous pouvez donc cliquer sur *OK*. Vous devriez vous retrouver dans la liste des triggers actuels, sur le trigger que vous venez d'ajouter. Appuyez de nouveau sur *OK* pour fermer la boîte de dialogue en sauvegardant. Si vous quittez la boîte de dialogue autrement, le trigger ne sera pas ajouté.
95
96
Pour vérifier que notre nouveau trigger marche correctement, essayons d'envoyer un message sur le canal "hrp" :
97
98
<pre>
99
hrp Est-ce que ça marche ?
100
</pre>
101
102
Si tout va bien (et partant du principe que le serveur répond comme on l'attend), on devrait recevoir la ligne :
103
104
<pre>
105
[hrp] Vous dites : est-ce que ça marche ?
106
</pre>
107
108
Et vous devriez entendre le son que vous avez sélectionné à l'étape précédente. Voilà ! Ce n'était pas si difficile, si ?
109
110
h3. Depuis le SharpScript
111
112
Comme toujours, l'interface permet de manipuler des options potentiellement complexes, mais elles sont toutes converties en SharpScript à la fin, même si vous n'avez pas vraiment besoin de vous en occuper. Créer le trigger de notre exemple en SharpScript est assez facile : vous pouvez entrer cette ligne directement dans votre client, ou bien dans le fichier "config.set".
113
114
<pre>
115
#trigger [hrp]* {#play mon_fichier.wav}
116
</pre>
117
118
C'est une instruction SharpScript. De gauche à droite, nous avons :
119
120
* @#trigger@ est le nom de l'action SharpScript. Ici, @#trigger@ crée simplement un nouveau trigger ;
121
* @[hrp]*@ est notre déclencheur, ce que le trigger doit surveiller quand on reçoit des messages du serveur. Tout comme audessus, on a précisé @[hrp]*@ , qui veut dire "toute ligne commençant par @[hrp]@" ;
122
* Ensuite, on doit préciser la ou les actions à exécuter quand ce trigger se déclenche. Ici, @#play mon_fichier.wav@. @#play@ est une autre action SharpScript, qui permet simplement de jouer le fichier passé en argument. Puisque notre argument contient un espace entre le nom de l'action @#play@ et l'argument de la fonction @mon_fichier.wav@, on doit entourer l'argument d'accolades.
123
124
Ajouter un trigger en SharpScript est peut-être bien plus rapide, mais le système ne vous pardonnera pas facilement si vous faites des erreurs de syntaxe. L'interface nécessite d'avantage d'étapes, mais elle est généralement plus sûre.
125
126
h2. Editer un trigger
127
128
Dans la boîte de dialogue des triggers (menu *Jeu* -> *Triggers*), vous pouvez éditer un trigger. Vous aurez besoin d'éditer un trigger dans deux cas : si vous voulez changer son déclencheur (la partie qui indique au trigger quel morceau de texte surveiller) on ses actions (la partie qui décrit quoi faire quand ce trigger se déclenche).
129
130
h2. Supprimer un trigger
131
132
Supprimer un trigger peut se faire depuis l'interface également. Cliquez simplement sur le bouton *Supprimer* après avoir sélectionné un trigger existant. Confirmez que vous voulez supprimer ce trigger. N'oubliez pas de fermer la boîte de dialogue en cliquant sur *OK*, sans quoi votre trigger ne sera pas effacé.
133
134
h2. Utiliser des variables dans les triggers
135
136
Il est tant de regarder plus attentivement le signe astérisque (@*@) que nous avons utilisé plus haut. Ce n'est pas un hasard si vous reconnaissez cette syntaxe depuis la documentation des [[Alias|alias]], puisqu'il s'agit de la même chose : l'astérisque veut dire "tout et n'importe quoi".
137
138
Voici une liste des syntaxes possibles, pour vous donner une idée :
139
140
| Syntaxe | Signifie |
141
| @Bienvenue*@ | N'importe quelle ligne commençant par @Bienvenue@ . |
142
| @*classe@ | N'importe quelle ligne finissant par @classe@ . |
143
| @*passage*@ | N'importe quel ligne contenant (au début, à la fin ou au milieu) @passage@. Notez que ce trigger sera aussi déclenché si la ligne contient @passager@, par extension. |
144
| @* passage *@ | N'importe quelle ligne contenant le mot @passage@ entouré d'espaces. Le mot @passager@ ne déclenchera plus ce trigger cette fois. |
145
| @Vous gagnez * crédits en *.@ | Des lignes comme @Vous gagnez 80 crédits en combat.@ ou @Vous gagnez 10 crédits en management.@ déclencheront ce trigger. La ligne @Vous gagnez un certain nombre de crédits en quelque chose.@ déclenchera le trigger également. |
146
147
En bref, un signe astérisque veut dire n'importe quoi : une lettre, un chiffre, un mot, un nombre, un espace, un signe de ponctuation, un message assez long... voire rien du tout.
148
149
Un mot de mise en garde : la syntaxe de vos déclencheurs est très importante, et vous devriez vérifier avec soin les lignes que vous souhaitez intercepter.
150
151
<pre>
152
*table*
153
</pre>
154
155
Ce trigger se déclenchera quand le mot @table@ se trouve dans une ligne, au début, au milieu ou à la fin. Ce trigger se déclencherait donc avec les lignes suivantes :
156
157
<pre>
158
~ un tableau noir (commande board) se trouve ici
159
Dans l'angle nord-est de la cour se trouve un long bâtiment de bois peint en rouge, probablement une étable.
160
</pre>
161
162
Souvenez-vous qu'un trigger est autant facile à restrindre que facile à déclencher. Il vous faut trouver le bon équilibre entre les deux.
163
164
Retournons aux variables. Le signe astérisque (@*@) fait deux choses :
165
166
* Il aide à décrire quand le trigger doit se déclencher (il veut dire "n'importe quoi") ;
167
* Il écrit dans une ou plusieurs variables.
168
169
Utilisons le même exemple, avec notre trigger @[hrp[*@. Qu'arrive-t-il lorsque vous recevez une ligne comme celle-ci :
170
171
<pre>
172
[hrp] Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?
173
</pre>
174
175
D'abord, le trigger @[hrp]*@ est déclenché, puis la partie après @[hrp]@ (celle décrite par le signe astérisque) est capturée dans une variable. Les variables permettent de conserver des informations, et c'est justement ce qu'elles font ici. Les variables sont numérotées en partant de @$1@, @$2@, @$3@ et ainsi de suite. Donc dans notre exemple, si on reçoit la ligne suivante, le trigger va créer une variable @$1@ contenant la partie après @[hrp]@ :
176
177
<pre>
178
 Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?
179
</pre>
180
181
Que peut-on faire avec cette variable ? Beaucoup de choses. Chaque paramètre de nos actions liées au trigger peuvent utiliser les variables du trigger. Nous verrons des exemples concrets un peu plus bas, mais pour l'heure, nous pouvons commencer par l'afficher. Vous pouvez entrer l'instruction suivante dans votre client :
182
183
<pre>
184
#say $1
185
</pre>
186
187
Qui devrait vous afficher :
188
189
<pre>
190
 Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?
191
</pre>
192
193
bq. Pourquoi la ligne commence par un espace ?
194
195
Si vous vous posez cette question, essayez d'écrire le déclencheur du trigger et la ligne reçue l'un à côté de l'autre, cela devrait vous aider à comprendre :
196
197
* Déclencheur : @[hrp]*@ ;
198
* Ligne reçue : @[hrp] Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?@ .
199
200
Vous avez trouvé ? La ligne reçue par le client commence par "hrp" entre crochets, un espace puis le nom de la personne qui parle... alors que notre déclencheur capture tout ce qu'il y a après le crochet fermant de "[hrp]", ce qui inclue notre signe espace dans ce cas.
201
202
La solution : modifier quelque peu notre déclencheur.
203
204
<pre>
205
[hrp] *
206
</pre>
207
208
Cette fois, on met un espace entre le crochet fermant et le signe astérisque. Si l'on reçoit la ligne :
209
210
<pre>
211
[hrp] Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?[public] Edgar says: I don't get it at all, could someone help me?
212
</pre>
213
214
Et qu'on affiche @$1@, on devrait voir :
215
216
<pre>
217
Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?
218
</pre>
219
220
Les espaces dans les déclencheurs pourraient bien être l'une des erreurs principales quand on crée ses propres triggers la première fois. Le meilleur conseil que je puisse vous donner est de regarder avec attention les lignes que vous voulez surveiller à l'aide de triggers, et de n'utiliser le signe astérisque (@*@) que quand vous n'avez pas de moyen de savoir ce qui s'y trouve.
221
222
h2. Les canaux CocoMUD dans les triggers
223
224
CocoMUD offre un système assez puissant de canaux. Cette fonctionnalité est à différencier des canaux en jeu, qui sont dépendants du jeu où vous vous connectez. Les canaux CocoMUD sont des listes d'`'evènements dans lesquels vous mettez ce que vous voulez. Ce n'est pas obligatoire de mettre des canaux en jeu dans des canaux CocoMUD, c'est juste plus comfortable. Nous allons voir cela (pourquoi l'utiliser et comment faire).
225
226
Nous ne verrons pas ici comment créer des canaux CocoMUD. Ce sera expliqué dans une documentation séparée. Nous allons partir du principe que le canal "hrp" existe sur CocoMUD, et nous allons voir comment y mettre des messages à l'aide de triggers.
227
228
Premier réflexe quand il s'agit de créer un trigger, regardons les lignes qui devraient le déclencher. Il y en a deux dans notre cas :
229
230
Quand on envoie un message sur le canal "hrp", on pourrait voir quelque chose comme :
231
232
<pre>
233
[hrp] Vous dites : mon message
234
</pre>
235
236
Si c'est quelqu'un d'autre qui parle sur ce canal, vous pourriez voir :
237
238
<pre>
239
[hrp] Quelqu'un dit : mon message
240
</pre>
241
242
Voyons ce qui reste identique et ce qui diffère entre ces deux lignes :
243
244
* Et bien, d'abord, on a "[hrp]"(c'est-à-dire "hrp"entouré de crochets) suivi d'un espace ;
245
* Ensuite il y a le nom de l'auteur du message, soit "Vous" soit "Quelqu'un" ;
246
* Il y a ensuite le mot "dit" après un nouvel espace... ha bien non, si on écrit, le mot est "dites", si c'est un autre, c'est "dit". Que faire ?
247
* Un nouvel espace, un signe deux points (@:@), un espace et le message.
248
249
Pour résoudre notre problème entre dit/dites, on a deux solutions :
250
251
* On peutécrire un seul trigger qui se déclenche dans les deux cas, en incluant dans le déclencheur "dit*". Cela voudra dire "dit" suivi de n'importe quoi ;
252
* On peut aussi créer deux triggers distincts, l'un pour la première ligne et l'un pour la seconde.
253
254
J'ai tendance à préférer la seconde solution, mais je sais que certains préféreront la première, Nous verrons donc les deux ici :
255
256
h3. Un seul trigger
257
258
Voyons notre déclencheur pour un seul trigger. Vous êtes prêt ?
259
260
<pre>
261
[hrp] * dit*: *
262
</pre>
263
264
Trois astérisques ! Le premier capturera le nom de l'auteur du message. Le second capturera rien ou "es" (en fonction de si c'est vous ou un autre qui parle). Nous ne l'utiliseront pas. Le troisième capturera le message.
265
266
Pour créer ce trigger en passant par l'interface :
267
268
* Ouvrez la barre de menu, *Jeu* -> *Triggers* ;
269
* Cliquez sur *Ajouter* pour créer un trigger ;
270
* Entrez le déclencheur @[hrp] * dit*: *@ avant d'appuyer sur Tab ;
271
* Sélectionnez "Envoie un message dans un canal" ;
272
* Cliquez sur le bouton *Ajouter l'action* ;
273
* Dans le nom du canal dans lequel envoyer le message, écrivez @hrp@ ;
274
* Dans le message à envoyer au canal, entrez :
275
<pre>
276
$1: $3
277
</pre>
278
* Cliquez sur *OK* plusieurs fois pour fermer la boîte de dialogue en sauvegardant.
279
280
bq. Qu'est-ce que c'est que @$1 $3@?
281
282
@$1@ contient l'auteur du message (vous ou quelqu'un).  @$3@ contient le message envoyé. Quand on reçoit la ligne :
283
284
<pre>
285
[hrp] Jamie dit : bien joué !
286
</pre>
287
288
Notre canal CocoMUD devrait recevoir le message :
289
290
<pre>
291
Jamie: bien joué !
292
</pre>
293
294
Vous pouvez entrer @#channel hrp@ pour voir la liste des messages sur ce canal. Il est possible de relier cette action à un macro, pour afficher le canal quand on presse une touche de raccourci.
295
296
Vous pourriez avoir fait la même chose en utilisant une seule ligne de SharpScript:
297
298
<pre>
299
#trigger {[hrp] * dit*: *} {#feed hrp {$1: $3}}
300
</pre>
301
302
C'est peut-être un peu plus dur à comprendre en SharpScript, mais si vous êtes habitué à la syntaxe, c'est définitivement plus rapide.
303
304
Un dernier mot concernant ce trigger : vous aurez peut-être remarqué qu'on ne joue pas de son si ce trigger se déclenche. Rien ne vous empêche de le faire au travers de l'interface (d'avoir deux actions liés à un trigger). La même chose peut se faire en SharpScript :
305
306
<pre>
307
#trigger {[hrp] * dit*: *} {
308
    #feed hrp {$1: $3}
309
    #play sounds/public.wav
310
}
311
</pre>
312
313
h3. Deux triggers distincts
314
315
Comme dit plus haut, il y a deux façons de régler le problème posé par dit/dites. L'une de ces solutions est de créer deux triggers, l'un pour quand on est l'auteur, l'autre pour les autres.  Cela demandera un peu plus de configuration, mais cela reste plus lisible, je trouve. Parfois il sera impossible de faire autrement, cela dépend de la langue dans laquelle le MUD se trouve.
316
317
Nos deux déclencheurs seraient donc :
318
319
<pre>
320
[hrp] Vous dites : *
321
[hrp] * dit : *
322
</pre>
323
324
Je ne peux pas dire pour vous, mais ça me semble personnellement bien plus clair. Le premier trigger ne se déclenche que quand on est l'auteur du message (peut-être qu'on ne jouera pas de son à ce moment), le second se déclenche quand c'est quelqu'un d'autre qui parle sur le canal. Voici les instructions SharpScript pour créer ces triggers, mais comme d'habitude, vous pouvez le faire via l'interface :
325
326
<pre>
327
#trigger {[hrp] Vous dites : *} {#feed hrp {Vous : $1}}
328
#trigger {[hrp] * dit : *} {
329
    #feed hrp {$1 : $2}
330
    #play sounds/public.wav
331
}
332
</pre>
333
334
Choisissez la méthode qui vous para^8it la plus simple, en fonction du contexte.
335
336
h2. Les triggers muets
337
338
Dans certains cas, quand on reçoit une certaine ligne, on ne veut pas l'afficher sur le client.
339
340
bq. Cela arrive vraiment ?
341
342
Parfois. Par exemple, certains MUD envoient des messages d'ambiance régulièrement (toutes les 3-5 secondes) quand vous vous trouvez dans une certaine situation. Ce peut être agréable pour mettre dans l'ambiance, mais pas toujours avec un lecteur d'écran.
343
344
<pre>
345
Un noeud dans le bois éclate en une pluie d'étincelles.
346
</pre>
347
348
Joli et, bien il faut le reconnaître, près d'un feu de camp il est normal qu'il pétille, lance des étincelles et craque de temps en temps en temps. Mais avec un lecteur d'écran, ce n'est pas le plus utile. Nous allons donc retirer cette ligne de l'affichage.
349
350
Pour ce faire, créez un nouveau trigger.  En passant par l'interface :
351
352
* Ouvrez le menu *Jeu* -> *Trigger* ;
353
* Ajoutez un trigger en cliquant sur *Ajouter* ;
354
* Collez la ligne dans le déclencheur : @Un noeud dans le bois éclate en une pluie d'étincelles.@ ;
355
* Pas besoin de sélectionner une action, sauf si vous voulez jouer un son approprié, cela dit.
356
* Tabulez jusqu'à trouver la case "Trigger muet". Cochez-la.
357
* Validez plusieurs fois sur *OK* pour sortir de la boîte de dialogue en sauvegardant.
358
359
Si le client reçoit cette ligne, il ne l'affichera plus.
360
361
Créer ce trigger en SharpScript est assez simple :
362
363
<pre>
364
#trigger {Un noeud dans le bois éclate en une pluie d'étincelles.} {} +mute
365
</pre>
366
367
Notez que le second paramètre (définissant la liste d'actions associées à ce trigger) est vide dans notre exemple.  Le troisième paramètre quant à lui est un flag, commençant par @+@ ou @-@ et suivi du nom du flag (ici @mute@ pour créer un trigger muet).
368
369
Vous pouvez très bien avoir un trigger muet qui exécute cependant des actions, cela n'est pas du tout incompatible.
370
371
h2. Les triggers marqués
372
373
Les triggers marqués peuvent être utiles pour l'accessibilité. Quand un trigger marqué se déclenche, il place le curseur directement sur la ligne ayant déclenché ce trigger. Vous pourriez avoir un trigger sur la ligne décrivant les sorties d'une salle, par exemple. Si ce trigger est marqué, quand vous explorerez plusieurs salles, le curseur sera toujours déplacé sur la listes des sorties, plutôt que ramené en bas de la fenêtre, où vous devrez appuyez plusieurs fois sur la flèche haut pour lire les sorties disponibles.
374
375
C'est le même principe pour créer ce trigger :
376
377
* Dans la barre de menu, sélectionnez *Jeue* -> *Triggers*.
378
* Cliquez sur le bouton *Ajouter* pour créer un nouveau trigger.
379
* Écrivez dans le déclencheur quelque chsoe comme : @Sorties :*@ .
380
* Tabulez plusieurs fois pour cocher la case "trigger marqué".
381
382
La prochaine fois que vous recevrez une ligne commençant par @Sorties : @, le curseur sera déplacé automatiquement dessus.
383
384
Créer ce trigger avec une instruction SharpScript donne :
385
386
<pre>
387
#trigger {Sorties : *} {} +mark
388
</pre>
389
390
h2. Les triggers avec substitution
391
392
Dans certains cas, quand un trigger s'exécute, on veut modifier la ligne qui a déclenché le trigger. L'un des exemples les plus fréquents est pour réduire une ligne un peu longue. Certains MUDs ont de longues lignes de texte et mettent l'information importante à la fin, ce qui n'est pas super pratique avec un lecteur d'écran. Par exemple :
393
394
<pre>
395
Quelqu'un parle publiquement sur le canal 'hrp' avec une petite voix inquiète : c'est sans danger ?
396
</pre>
397
398
Bien que cette ligne de texte en apprenne beaucoup, l'information vraiment importante (le message) se trouve tout à la fin. Ce pourrait être bien de raccourcir un petit peu cette ligne de texte, et peut-être changer l'ordre des informations.
399
400
<pre>
401
[ooc] Quelqu'un : c'est sans danger ? (une petite voix inquiète)
402
</pre>
403
404
Pour faire cela, il faut créer un trigger, et créer une ligne de substitution. Quand le trigger est appelé, la ligne de substitution s'affichera à la place de la ligne d'origine qui a déclenché le trigger.
405
406
* Dans la barre de menu *Jeu* -> *Triggers* ;
407
* Cliquez sur *Ajouter* pour créer un nouveau trigger ;
408
* Écrivez le déclencheur comme d'habitude :
409
<pre>
410
* parle publiquement sur le canal '*' avec * : *
411
</pre>
412
* Notez que @$1@ contient le nom de l'auteur du message, @$2@ contient le nom du canal, @$3@ contient la voix utilisée et @$4@ contient le message lui-même ;
413
* Tabulez jusqu'à trouver la zone de texte appelée "Message de remplacement de la ligne ayant déclenché le trigger".
414
* Dedans, écrivez :
415
<pre>
416
[$2] $1 : $4 ($3)
417
</pre>
418
C'est compréhensible ? Si ce n'est pas le cas, prenez le temps de relire à quoi correspond chaque variable.
419
420
Créer le même trigger en SharpScript serait :
421
422
<pre>
423
#trigger {* parle publiquement sur le canal '*' avec * : *} {} {[$2] $1 : $4 ($3)}
424
</pre>
425
426
Note importante : nous avons trois arguments ici, dans notre action @#trigger@. Le premier contient toujours le déclencheur du trigger, le second la liste d'actions (vide ici). Le troisième contient la chaîne de substitution. Si il n'y a pas de troisième paramètre, ou que le paramètre est vide, la ligne est affichée telle qu'elle (c'est le cas dans tous nos exemples précédents).
427
428
h2. Les triggers déclenchés par expressions régulières
429
430
Cette section et celles qui suivent sont un peu plus avancées.
431
432
Le symbole astérisque (@*@) est très pratique. Mais il n'est pas très précis. CocoMUD permet d'écrire des "expressions régulières":https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2 . Le but ici n'est pas de décrire la syntaxe de ces expressions, c'est un sujet à part entière, mais vous trouverez de nombreuses ressources (à commencer par le lien ci-dessus).
433
434
Pour utiliser des expressions régulières dans des déclencheurs de trigger, il suffit de commencer le trigger avec le signe @^@. CocoMUD comprend que ce déclencheur doit être une expression régulière. Par exemple :
435
436
<pre>
437
^Vous recevez \d+ XP.$
438
</pre>
439
440
Ce trigger sera déclenché si vous recevez la ligne "Vous recevez ... XP.", avec ... étant un ou plusieurs chiffres. Ce trigger ne sera pas déclenché par la ligne : "Vous recevez un peu d'XP."
441
442
Une chose importante à garder à l'esprit quand on utilise des triggers avec expressions régulières, cependant, est que si on veut capturer des informations, il faut utiliser des groupes de capture (des parenthèses).
443
444
<pre>
445
^Vous recevez (\d+) XP.$
446
</pre>
447
448
Ici, le nombre d'XP sera mis dans @$1@.  Vous pouvez aussi utiliser des groupes nommés et y faire référence avec @$nom_du_groupe@.
449
450
h2. Des triggers avancés en Python
451
452
Le moteur SharpScript est léger et puissant, mais ce reste un langage de script qui ne permet pas tout. Et qui ne permettra pas tout : il est censé resté léger et optimisé. Ce n'est pas un langage de programmation. Mais Python en est un, et CocoMUD est développé en Python. Le moteur SharpScript a une syntaxe particulière pour envoyer du code à Python directement, ce qui permet d'outre-passer les limites du moteur SharpScript de façon assez définitive. Depuis le code Python, on peut toujours utiliser les fonctions SharpScript, ce qui rend l'élaboration de triggers plus complexes assez simple, dès lors que l'on connaît Python.
453
454
Nous allons prendre un exemple, comme toujours, mais souvenez-vous qu'il n'y a pas de réelle limite à ce que vous pouvez faire, tant que Python le permet.
455
456
Admettons que le jeu envoie une ligne quand on reçoit de l'XP mais précise aussi le nombre d'XP nécessaire pour passer au niveau suivant.
457
458
Par exemple :
459
460
<pre>
461
Vous recevez 37 XP et avez besoin de 500 pour passer au niveau suivant.
462
</pre>
463
464
On va vouloir extraire ces deux nombres et afficher un pourcentage à la place : @xp / total * 100@.  Ce n'est pas possible en utilisant simplement du SharpScript.
465
466
Pour l'instant, ce n'est pas possible d'utiliser l'interface pour manipuler du code Python. Vous devrez faire les essais en éditant directement le fichier "config.set".
467
468
<pre>
469
#trigger {Vous recevez * XP et avez besoin de * pour passer au niveau suivant.} {+
470
    # $1 contient le nombre d'XP gagné
471
    # $2 contient le total pour passer au niveau suivant
472
    xp = args["1"]
473
    total = args["2"]
474
475
    # On convertit ces deux nombres
476
    try:
477
        xp = int(xp)
478
        total = int(total)
479
    except ValueError:
480
        # La conversion n'a pas marché, mais on ne fait rien
481
        pass
482
    else:
483
        pourcent = xp * 100.0 / total
484
        say("Vous recevez {}/{} XP ({}%).".format(xp, total, int(pourcent)))
485
}
486
</pre>
487
488
Voilà du trigger plutôt avancé ! Quelques explications :
489
490
* Le déclencheur du trigger ne devrait pas être une grosse surprise pour vous à ce stade ;
491
* Le second paramètre commence par @{+@ (accolade gauche suivi du signe @+@).  C'est la syntaxe pour dire à CocoMUD que ce qui se trouve entre les accolades est du code Python.
492
* Notez que tout le code est indenté. Il ne s'agit plus d'un comfort de lecture ici, mais d'une nécessité. Python a besoin de l'indentation pour fonctionner. J'ai utilisé 4 espaces, mais vous pouvez en utiliser un (ou un signe de tabulation si vous voulez) ;
493
* Quelques commentaires. Cela peut toujours être utile.
494
* On extrait les deux nombres @xp@ et @total@. Pour accéder aux variables du trigger, on utilise @args@ qui est un dictionnaire les contenant. La première variable étant @$1@, on y accède en Python grâce à @args["1"]@.
495
* On a besoin de convertir ces variables. Pourquoi ? Ce sont toujours des chaînes de caractère à ce stade, il faut les convertir en nombre. CocoMUD ne vérifie pas que ce sont des nombres, on doit donc le faire manuellement. C'est pourquoi on convertit dans un bloc try/except/else. Notez qu'on ne fait rien si la conversion échoue pour X raison.
496
* On crée ensuite le pourcentage. Puisqu'il s'agit de Python2, il faut lui indiquer de faire attention aux virgules.
497
* On affiche notre message ensuite, en utilisant la fonction @say|()@. C'est exactement comme appeler la fonction @#say@ en SharpScript, c'est la même fonction qui est appelée. De même façon, on peut utiliser les fonctions @send()@, @play()@, @feed()@ et autre. La syntaxe diffère car on est en Python, mais ce sont les mêmes fonctions et mêmes arguments.
498
499
Bien... je ne suis pas vraiment satisfait par le trigger que je viens de créer... on pourrait le raccourcir un petit peu, et le rendre plus lisible. Il ne faut pas toujours chercher la concision, mais ça aide. Si on était sûr que nos variables contiennent des nombres, on aurait moins de code à faire :
500
501
<pre>
502
#trigger {^Vous recevez (\d+) XP et avez besoin de (\d+) pour passer au niveau suivant.$} {+
503
    # $1 contient le nombre d'XP gagné
504
    # $2 contient le total pour passer au niveau suivant
505
    xp = int(args["1"])
506
    total = int(args["2"])
507
    pourcent = xp * 100.0 / total
508
    say("Vous recevez {}/{} XP ({}%).".format(xp, total, int(pourcent)))
509
}
510
</pre>
511
512
Utiliser les expressions régulières ici ajoute un peu de complexité au déclencheur, mais ça rend le code bien plus lisible je trouve.
513
514
Si vous voulez plus d'informations sur l'utilisation de code Python dans les instructions SharpScript, vous trouverez une section détaillée dans [[SharpScript|la documentation du SharpScript]].