Project

Profile

Help

Triggers » History » Sprint/Milestone 3

Vincent Le Goff, 12/15/2017 08:16 AM

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 3 Vincent Le Goff
Cet exemple sera différent sur différents MUDs, 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 1 Vincent Le Goff
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 3 Vincent Le Goff
[hrp] Edgar dit : je n'y comprend rien, quelqu'un pourrait-il m'aider ?
212 1 Vincent Le Goff
</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 3 Vincent Le Goff
Vous trouverez plus d'informations sur ce concept et leur utilisation avec triggers en lisant [[Channels|la documentation des canaux]].
227 1 Vincent Le Goff
228
h2. Les triggers muets
229
230
Dans certains cas, quand on reçoit une certaine ligne, on ne veut pas l'afficher sur le client.
231
232
bq. Cela arrive vraiment ?
233
234
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.
235
236
<pre>
237
Un noeud dans le bois éclate en une pluie d'étincelles.
238
</pre>
239
240
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.
241
242
Pour ce faire, créez un nouveau trigger.  En passant par l'interface :
243
244
* Ouvrez le menu *Jeu* -> *Trigger* ;
245
* Ajoutez un trigger en cliquant sur *Ajouter* ;
246
* Collez la ligne dans le déclencheur : @Un noeud dans le bois éclate en une pluie d'étincelles.@ ;
247
* Pas besoin de sélectionner une action, sauf si vous voulez jouer un son approprié, cela dit.
248
* Tabulez jusqu'à trouver la case "Trigger muet". Cochez-la.
249
* Validez plusieurs fois sur *OK* pour sortir de la boîte de dialogue en sauvegardant.
250
251
Si le client reçoit cette ligne, il ne l'affichera plus.
252
253
Créer ce trigger en SharpScript est assez simple :
254
255
<pre>
256
#trigger {Un noeud dans le bois éclate en une pluie d'étincelles.} {} +mute
257
</pre>
258
259
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).
260
261
Vous pouvez très bien avoir un trigger muet qui exécute cependant des actions, cela n'est pas du tout incompatible.
262
263
h2. Les triggers marqués
264
265
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.
266
267
C'est le même principe pour créer ce trigger :
268
269
* Dans la barre de menu, sélectionnez *Jeue* -> *Triggers*.
270
* Cliquez sur le bouton *Ajouter* pour créer un nouveau trigger.
271
* Écrivez dans le déclencheur quelque chsoe comme : @Sorties :*@ .
272
* Tabulez plusieurs fois pour cocher la case "trigger marqué".
273
274
La prochaine fois que vous recevrez une ligne commençant par @Sorties : @, le curseur sera déplacé automatiquement dessus.
275
276
Créer ce trigger avec une instruction SharpScript donne :
277
278
<pre>
279
#trigger {Sorties : *} {} +mark
280
</pre>
281
282
h2. Les triggers avec substitution
283
284
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 :
285
286
<pre>
287
Quelqu'un parle publiquement sur le canal 'hrp' avec une petite voix inquiète : c'est sans danger ?
288
</pre>
289
290
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.
291
292
<pre>
293 3 Vincent Le Goff
[hrp] Quelqu'un : c'est sans danger ? (une petite voix inquiète)
294 1 Vincent Le Goff
</pre>
295
296
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.
297
298
* Dans la barre de menu *Jeu* -> *Triggers* ;
299
* Cliquez sur *Ajouter* pour créer un nouveau trigger ;
300
* Écrivez le déclencheur comme d'habitude :
301
<pre>
302
* parle publiquement sur le canal '*' avec * : *
303
</pre>
304
* 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 ;
305
* Tabulez jusqu'à trouver la zone de texte appelée "Message de remplacement de la ligne ayant déclenché le trigger".
306
* Dedans, écrivez :
307
<pre>
308
[$2] $1 : $4 ($3)
309
</pre>
310
C'est compréhensible ? Si ce n'est pas le cas, prenez le temps de relire à quoi correspond chaque variable.
311
312
Créer le même trigger en SharpScript serait :
313
314
<pre>
315
#trigger {* parle publiquement sur le canal '*' avec * : *} {} {[$2] $1 : $4 ($3)}
316
</pre>
317
318
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).
319
320
h2. Les triggers déclenchés par expressions régulières
321
322
Cette section et celles qui suivent sont un peu plus avancées.
323
324
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).
325
326
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 :
327
328
<pre>
329
^Vous recevez \d+ XP.$
330
</pre>
331
332
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."
333
334
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).
335
336
<pre>
337
^Vous recevez (\d+) XP.$
338
</pre>
339
340
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@.
341
342
h2. Des triggers avancés en Python
343
344
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.
345
346
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.
347
348
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.
349
350
Par exemple :
351
352
<pre>
353
Vous recevez 37 XP et avez besoin de 500 pour passer au niveau suivant.
354
</pre>
355
356
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.
357
358
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".
359
360
<pre>
361
#trigger {Vous recevez * XP et avez besoin de * pour passer au niveau suivant.} {+
362
    # $1 contient le nombre d'XP gagné
363
    # $2 contient le total pour passer au niveau suivant
364
    xp = args["1"]
365
    total = args["2"]
366
367
    # On convertit ces deux nombres
368
    try:
369
        xp = int(xp)
370
        total = int(total)
371
    except ValueError:
372
        # La conversion n'a pas marché, mais on ne fait rien
373
        pass
374
    else:
375
        pourcent = xp * 100.0 / total
376
        say("Vous recevez {}/{} XP ({}%).".format(xp, total, int(pourcent)))
377
}
378
</pre>
379
380
Voilà du trigger plutôt avancé ! Quelques explications :
381
382
* Le déclencheur du trigger ne devrait pas être une grosse surprise pour vous à ce stade ;
383
* 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.
384
* 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) ;
385
* Quelques commentaires. Cela peut toujours être utile.
386
* 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"]@.
387
* 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.
388
* On crée ensuite le pourcentage. Puisqu'il s'agit de Python2, il faut lui indiquer de faire attention aux virgules.
389
* 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.
390
391
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 :
392
393
<pre>
394
#trigger {^Vous recevez (\d+) XP et avez besoin de (\d+) pour passer au niveau suivant.$} {+
395
    # $1 contient le nombre d'XP gagné
396
    # $2 contient le total pour passer au niveau suivant
397
    xp = int(args["1"])
398
    total = int(args["2"])
399
    pourcent = xp * 100.0 / total
400
    say("Vous recevez {}/{} XP ({}%).".format(xp, total, int(pourcent)))
401
}
402
</pre>
403
404
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.
405
406
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]].