I made this API script for Abomination vault, cause by default&nbsp; all the level is in one handout ant it's not possible to pinpoint. The script create as many handouts as there are rooms. var DecoupageDonjon = (function () { &nbsp; &nbsp; "use strict"; &nbsp; &nbsp; var NOM_COMMANDE = "!decouper-donjon"; &nbsp; &nbsp; var NOM_COMMANDE_ID = "!decouper-donjon-id"; &nbsp; &nbsp; var NOM_COMMANDE_PAGE = "!decouper-donjon-page"; &nbsp; &nbsp; var HANDOUTS_PAR_PAGE = 12; &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Affiche un message dans le chat. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function afficherMessage(message) { &nbsp; &nbsp; &nbsp; &nbsp; sendChat("Découpage Donjon", message); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Envoie un message au joueur qui a lancé la commande. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function envoyerAuJoueur(playerId, message) { &nbsp; &nbsp; &nbsp; &nbsp; var joueur = getObj("player", playerId); &nbsp; &nbsp; &nbsp; &nbsp; if (joueur) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var nomJoueur = joueur.get("displayname") || ""; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Découpage Donjon", &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '/w "' + nomJoueur.replace(/"/g, '\\"') + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '" ' + message &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; afficherMessage(message); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Échappe les caractères HTML. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function echapperHTML(texte) { &nbsp; &nbsp; &nbsp; &nbsp; return String(texte || "") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;/g, "&amp;amp;") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&lt;/g, "&amp;lt;") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&gt;/g, "&amp;gt;") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/"/g, "&amp;quot;") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/'/g, "&amp;#39;"); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Décode les principales entités HTML. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function decoderEntites(texte) { &nbsp; &nbsp; &nbsp; &nbsp; return String(texte || "") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;nbsp;/gi, " ") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;#160;/gi, " ") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;amp;/gi, "&amp;") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;apos;/gi, "'") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;#39;/gi, "'") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;#x27;/gi, "'") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;quot;/gi, '"') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;lt;/gi, "&lt;") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&amp;gt;/gi, "&gt;"); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Transforme les liens HTML en liens Markdown. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* Exemple : &nbsp; &nbsp; &nbsp;* &lt;a href="<a href="https://exemple.com&quot;&gt;Voir" rel="nofollow">https://exemple.com"&gt;Voir</a> le site&lt;/a&gt; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* devient : &nbsp; &nbsp; &nbsp;* [Voir le site](<a href="https://exemple.com" rel="nofollow">https://exemple.com</a>) &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function conserverLiensHTML(texte) { &nbsp; &nbsp; &nbsp; &nbsp; return String(texte || "").replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&lt;a\b[^&gt;]*href\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s&gt;]+))[^&gt;]*&gt;([\s\S]*?)&lt;\/a\s*&gt;/gi, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function ( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; correspondance, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; urlDouble, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; urlSimple, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; urlSansGuillemets, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; libelle &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var url = urlDouble || urlSimple || urlSansGuillemets || ""; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var texteLien = String(libelle || "") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/&lt;[^&gt;]*&gt;/g, ""); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; texteLien = decoderEntites(texteLien); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url = decoderEntites(url); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!/^https?:\/\//i.test(url)) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return texteLien; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "[" + texteLien + "](" + url + ")"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Convertit le contenu HTML en texte pour détecter &nbsp; &nbsp; &nbsp;* les titres de salles et séparer les descriptions. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* Les balises blockquote sont conservées sous la forme &nbsp; &nbsp; &nbsp;* de lignes commençant par &gt;. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function preparerPourDetection(contenu) { &nbsp; &nbsp; &nbsp; &nbsp; var texte = String(contenu || ""); &nbsp; &nbsp; &nbsp; &nbsp; // Conserver les liens avant de retirer les balises HTML. &nbsp; &nbsp; &nbsp; &nbsp; texte = conserverLiensHTML(texte); &nbsp; &nbsp; &nbsp; &nbsp; // Identifier les citations HTML. &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&lt;blockquote\b[^&gt;]*&gt;/gi, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "\n__DEBUT_CITATION__\n" &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&lt;\/blockquote\s*&gt;/gi, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "\n__FIN_CITATION__\n" &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Convertir les séparations HTML en retours à la ligne. &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace(/&lt;br\b[^&gt;]*&gt;/gi, "\n"); &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&lt;\/(?:p|div|li|h[1-6]|tr|section|article)\s*&gt;/gi, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "\n" &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Supprimer les autres balises HTML. &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace(/&lt;[^&gt;]*&gt;/g, ""); &nbsp; &nbsp; &nbsp; &nbsp; // Décoder les entités HTML. &nbsp; &nbsp; &nbsp; &nbsp; texte = decoderEntites(texte); &nbsp; &nbsp; &nbsp; &nbsp; // Uniformiser les fins de ligne. &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace(/\r\n?/g, "\n"); &nbsp; &nbsp; &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Transformer les blocs de citation en lignes Markdown. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; &nbsp; &nbsp; texte = texte.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /__DEBUT_CITATION__([\s\S]*?)__FIN_CITATION__/g, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function (correspondance, contenuCitation) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lignes = contenuCitation.split("\n"); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lignes = lignes.map(function (ligne) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ligne = ligne.trim(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!ligne) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ""; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (/^&gt;\s?/.test(ligne)) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ligne; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "&gt; " + ligne; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "\n" + lignes.join("\n") + "\n"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Nettoyer les espaces et les lignes vides superflues. &nbsp; &nbsp; &nbsp; &nbsp; texte = texte &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/[ \t]+\n/g, "\n") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/\n{3,}/g, "\n\n") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .trim(); &nbsp; &nbsp; &nbsp; &nbsp; return texte; &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Détecte les titres de salles. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* Formats reconnus : &nbsp; &nbsp; &nbsp;* A1. Entrée &nbsp; &nbsp; &nbsp;* A21. Atelier de Volluk &nbsp; &nbsp; &nbsp;* B2. Salle des serviteurs &nbsp; &nbsp; &nbsp;* # A1. Entrée &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function detecterSalles(contenu) { &nbsp; &nbsp; &nbsp; &nbsp; var texte = preparerPourDetection(contenu); &nbsp; &nbsp; &nbsp; &nbsp; var regex = &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /^\s*(?:#{1,6}\s*)?([A-Z]\d+)\.\s*(.+?)\s*$/gm; &nbsp; &nbsp; &nbsp; &nbsp; var salles = []; &nbsp; &nbsp; &nbsp; &nbsp; var resultat; &nbsp; &nbsp; &nbsp; &nbsp; while ((resultat = regex.exec(texte)) !== null) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salles.push({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; code: resultat[1], &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; titre: resultat[2].trim(), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index: resultat.index, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; longueur: resultat[0].length &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; return { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; texte: texte, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; salles: salles &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Convertit le texte Markdown simple en HTML. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* Les liens Markdown sont transformés en liens HTML &nbsp; &nbsp; &nbsp;* cliquables. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function convertirTexte(texte) { &nbsp; &nbsp; &nbsp; &nbsp; var html = echapperHTML(texte || ""); &nbsp; &nbsp; &nbsp; &nbsp; // Liens Markdown. &nbsp; &nbsp; &nbsp; &nbsp; html = html.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)/g, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function (correspondance, libelle, url) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return '&lt;a href="' + url + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '" target="_blank"&gt;' + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; libelle + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;/a&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Texte en gras : **texte**. &nbsp; &nbsp; &nbsp; &nbsp; html = html.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\*\*([\s\S]+?)\*\*/g, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;strong&gt;$1&lt;/strong&gt;" &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Texte en italique : *texte*. &nbsp; &nbsp; &nbsp; &nbsp; html = html.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /(^|[^*])\*([^*\n]+)\*(?!\*)/g, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "$1&lt;em&gt;$2&lt;/em&gt;" &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Texte en italique : _texte_. &nbsp; &nbsp; &nbsp; &nbsp; html = html.replace( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /(^|[^_])_([^_\n]+)_(?!_)/g, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "$1&lt;em&gt;$2&lt;/em&gt;" &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; // Convertir les retours à la ligne en HTML. &nbsp; &nbsp; &nbsp; &nbsp; html = html.replace(/\n/g, "&lt;br&gt;"); &nbsp; &nbsp; &nbsp; &nbsp; return html; &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Sépare la description des joueurs et les notes du MJ. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* Les paragraphes entièrement précédés de &gt; sont &nbsp; &nbsp; &nbsp;* considérés comme des descriptions destinées aux joueurs. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* La description est ensuite enveloppée dans une balise &nbsp; &nbsp; &nbsp;* blockquote pour obtenir un véritable style de citation. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function separerContenu(texte) { &nbsp; &nbsp; &nbsp; &nbsp; var blocs = String(texte || "") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .split(/\n\s*\n/) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(function (bloc) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return bloc.trim(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(function (bloc) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return bloc.length &gt; 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; var blocsNotes = []; &nbsp; &nbsp; &nbsp; &nbsp; var blocsGMNotes = []; &nbsp; &nbsp; &nbsp; &nbsp; blocs.forEach(function (bloc) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lignes = bloc.split("\n"); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var estDescriptionJoueurs = lignes.every( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function (ligne) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return /^\s*&gt;/.test(ligne); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (estDescriptionJoueurs) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var description = lignes.map(function (ligne) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ligne.replace(/^\s*&gt;\s?/, ""); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }).join("\n").trim(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (description) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blocsNotes.push(description); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blocsGMNotes.push(bloc); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; var descriptionHTML = blocsNotes.length &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? "&lt;blockquote&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; convertirTexte(blocsNotes.join("\n\n")) + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;/blockquote&gt;" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : ""; &nbsp; &nbsp; &nbsp; &nbsp; var notesMJHTML = convertirTexte( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blocsGMNotes.join("\n\n") &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; return { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notes: descriptionHTML, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gmnotes: notesMJHTML &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Affiche la liste des handouts disponibles. &nbsp; &nbsp; &nbsp;* La liste est paginée. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function afficherListeHandouts(playerId, pageDemandee) { &nbsp; &nbsp; &nbsp; &nbsp; var handouts = findObjs({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _type: "handout" &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; handouts.sort(function (a, b) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return String(a.get("name") || "").localeCompare( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String(b.get("name") || "") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; var nombrePages = Math.max( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Math.ceil(handouts.length / HANDOUTS_PAR_PAGE) &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; var page = parseInt(pageDemandee, 10); &nbsp; &nbsp; &nbsp; &nbsp; if (isNaN(page) || page &lt; 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; page = 0; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (page &gt;= nombrePages) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; page = nombrePages - 1; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; var debut = page * HANDOUTS_PAR_PAGE; &nbsp; &nbsp; &nbsp; &nbsp; var selection = handouts.slice( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debut, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debut + HANDOUTS_PAR_PAGE &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; var html = &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;div style='border:1px solid #666;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "background:#fff;padding:8px;color:#222;'&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;h3&gt;Découpage Donjon&lt;/h3&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;p&gt;Sélectionne le handout contenant les salles.&lt;/p&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; if (!selection.length) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += "&lt;p&gt;Aucun handout trouvé.&lt;/p&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; selection.forEach(function (handout) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var nom = echapperHTML( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handout.get("name") || "Sans titre" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;div style='margin:4px 0;'&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;a style='display:inline-block;padding:4px 8px;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "background:#e8e8e8;border:1px solid #999;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "border-radius:3px;color:#222;text-decoration:none;' " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "href='" + NOM_COMMANDE_ID + " " + handout.id + "'&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nom + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;/a&gt;&lt;/div&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; html += "&lt;hr&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; if (page &gt; 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;a href='" + NOM_COMMANDE_PAGE + " " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (page - 1) + "'&gt;« Page précédente&lt;/a&gt; "; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; html += &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; " Page " + (page + 1) + " / " + nombrePages + " "; &nbsp; &nbsp; &nbsp; &nbsp; if (page &lt; nombrePages - 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;a href='" + NOM_COMMANDE_PAGE + " " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (page + 1) + "'&gt;Page suivante »&lt;/a&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; html += "&lt;/div&gt;"; &nbsp; &nbsp; &nbsp; &nbsp; envoyerAuJoueur(playerId, html); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Crée un handout pour une salle. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function creerHandoutSalle(nom, contenu) { &nbsp; &nbsp; &nbsp; &nbsp; var parties = separerContenu(contenu); &nbsp; &nbsp; &nbsp; &nbsp; var handout = createObj("handout", { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name: nom, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inplayerjournals: "", &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; archived: false &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; if (!handout) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; handout.set("notes", parties.notes); &nbsp; &nbsp; &nbsp; &nbsp; handout.set("gmnotes", parties.gmnotes); &nbsp; &nbsp; &nbsp; &nbsp; return true; &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Récupère le contenu du handout source. &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;* On privilégie GM Notes, comme dans la version précédente. &nbsp; &nbsp; &nbsp;* Si GM Notes est vide, on utilise Notes. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function decouperHandout(handout, playerId) { &nbsp; &nbsp; &nbsp; &nbsp; var nomSource = handout.get("name") || "Handout sans titre"; &nbsp; &nbsp; &nbsp; &nbsp; handout.get("gmnotes", function (contenuGM) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!contenuGM || !String(contenuGM).trim()) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handout.get("notes", function (contenuNotes) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; traiterContenuSource( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contenuNotes, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nomSource, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerId &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; traiterContenuSource( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contenuGM, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nomSource, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerId &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Découpe le contenu et crée les handouts. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function traiterContenuSource(contenu, nomSource, playerId) { &nbsp; &nbsp; &nbsp; &nbsp; if (!contenu || !String(contenu).trim()) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; envoyerAuJoueur( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerId, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Le handout source est vide. Aucun découpage effectué." &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; var resultat = detecterSalles(contenu); &nbsp; &nbsp; &nbsp; &nbsp; var texte = resultat.texte; &nbsp; &nbsp; &nbsp; &nbsp; var salles = resultat.salles; &nbsp; &nbsp; &nbsp; &nbsp; if (!salles.length) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; envoyerAuJoueur( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerId, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Aucune salle détectée dans &lt;b&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echapperHTML(nomSource) + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;/b&gt;.&lt;br&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Vérifie que les titres sont au format " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;code&gt;A1. Nom de la salle&lt;/code&gt;." &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; var creees = 0; &nbsp; &nbsp; &nbsp; &nbsp; var erreurs = 0; &nbsp; &nbsp; &nbsp; &nbsp; salles.forEach(function (salle, index) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var debut = salle.index + salle.longueur; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var fin = index + 1 &lt; salles.length &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? salles[index + 1].index &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : texte.length; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var contenuSalle = texte.substring(debut, fin).trim(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var nomSalle = salle.code + ". " + salle.titre; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (creerHandoutSalle(nomSalle, contenuSalle)) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; creees++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; erreurs++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (erreur) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; erreurs++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Découpage Donjon : erreur lors de la création de " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nomSalle + " : " + erreur &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; var message = &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;b&gt;Découpage terminé&lt;/b&gt;&lt;br&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Handout source : &lt;b&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echapperHTML(nomSource) + "&lt;/b&gt;&lt;br&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Salles détectées : " + salles.length + "&lt;br&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Handouts créés : " + creees + "&lt;br&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Erreurs : " + erreurs + "&lt;br&gt;&lt;br&gt;" + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Le handout source n'a pas été modifié."; &nbsp; &nbsp; &nbsp; &nbsp; message += &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;br&gt;&lt;br&gt;&lt;b&gt;Classement :&lt;/b&gt; crée ou utilise un dossier " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;b&gt;" + echapperHTML(nomSource) + "&lt;/b&gt; dans le Journal, " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "puis déplace-y les handouts créés. Le script ne peut pas " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "les déplacer automatiquement dans un dossier."; &nbsp; &nbsp; &nbsp; &nbsp; envoyerAuJoueur(playerId, message); &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Gestion des commandes du chat. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; function traiterCommande(msg) { &nbsp; &nbsp; &nbsp; &nbsp; if (msg.type !== "api") { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; var contenu = String(msg.content || "").trim(); &nbsp; &nbsp; &nbsp; &nbsp; // Afficher la liste des handouts. &nbsp; &nbsp; &nbsp; &nbsp; if (contenu === NOM_COMMANDE) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; afficherListeHandouts(msg.playerid, 0); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; // Changer de page. &nbsp; &nbsp; &nbsp; &nbsp; if (contenu.indexOf(NOM_COMMANDE_PAGE + " ") === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var page = contenu.substring( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOM_COMMANDE_PAGE.length &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ).trim(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; afficherListeHandouts(msg.playerid, page); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; // Découper le handout sélectionné. &nbsp; &nbsp; &nbsp; &nbsp; if (contenu.indexOf(NOM_COMMANDE_ID + " ") === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var id = contenu.substring( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOM_COMMANDE_ID.length &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ).trim(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var handout = getObj("handout", id); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!handout) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; envoyerAuJoueur( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg.playerid, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Handout introuvable. Relance la commande " + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&lt;code&gt;" + NOM_COMMANDE + "&lt;/code&gt;." &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decouperHandout(handout, msg.playerid); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; } &nbsp; &nbsp; /* &nbsp; &nbsp; &nbsp;* Initialisation du script. &nbsp; &nbsp; &nbsp;*/ &nbsp; &nbsp; on("ready", function () { &nbsp; &nbsp; &nbsp; &nbsp; on("chat:message", traiterCommande); &nbsp; &nbsp; &nbsp; &nbsp; log("Découpage Donjon chargé."); &nbsp; &nbsp; }); &nbsp; &nbsp; return {}; })();