From faff6e54ef9efcd70eb9ae8384de68aca43fdda9 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 30 Nov 2022 14:21:09 +0100 Subject: [PATCH 1/4] Fix arborescence de conteneur --- styles/simple.css | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/styles/simple.css b/styles/simple.css index 2c69cd41..a068c96a 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -947,23 +947,23 @@ ul, li { text-align: center; } -ul.list-item-margin1 { - margin-left: 0.5rem; +ul.list-item-margin1 li { + margin-left: 0.8rem; } -ul.list-item-margin2 { - margin-left: 1rem; +ul.list-item-margin2 li { + margin-left: 1.6rem; } -ul.list-item-margin3 { - margin-left: 1.5rem; +ul.list-item-margin3 li { + margin-left: 2.4rem; } -ul.list-item-margin4 { - margin-left: 2rem; +ul.list-item-margin4 li { + margin-left: 3.2rem; } -ul.list-item-margin5 { - margin-left: 2.5rem; +ul.list-item-margin5 li { + margin-left: 4rem; } -ul.list-item-margin6 { - margin-left: 3rem; +ul.list-item-margin6 li { + margin-left: 4.8rem; } .grid-select-type-tmr { From 979a48e4d95ef32b11ebfe459f7d2b0fda33bca1 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 30 Nov 2022 13:32:42 +0100 Subject: [PATCH 2/4] =?UTF-8?q?Am=C3=A9lioration=20recherche=20dans=20un?= =?UTF-8?q?=20milieu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Si la recherche est sur un milieu exact, seul ce millieu est considéré. ie: chercher en "Forêts" ne cherchera pas en "Forêts humides". Le recherche en "for" cherchera dans tous les milieux contenant "for". Un message d'avertissement est affiché, et la description de la table contient la liste des milieux correspondants. Si plusieurs milieux cherchés ont une fréquence pour une ressource, la fréquence la plus élevée est utilisée. --- module/environnement.js | 32 ++++++++++++++++++++++---------- module/rdd-commands.js | 13 +++++++++---- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/module/environnement.js b/module/environnement.js index 38b8c554..93c98b8c 100644 --- a/module/environnement.js +++ b/module/environnement.js @@ -58,7 +58,7 @@ export class Environnement { const milieux = new Set(this.getMilieuxSettings()); const elements = await this.getElements(it => 1, it => ITEM_ENVIRONNEMENT_TYPES.includes(it.type)); elements.forEach(it => it.system.environnement.forEach(env => milieux.add(env.milieu))) - return [...milieux]; + return [...milieux].filter(env => env); } getMilieuxSettings() { @@ -66,22 +66,34 @@ export class Environnement { } async findEnvironnementsLike(search) { - return (await this.milieux()).filter(it => Grammar.includesLowerCaseNoAccent(it, search)); + const milieux = (await this.milieux()).filter(it => Grammar.includesLowerCaseNoAccent(it, search)); + if (milieux.length > 1){ + const milieuExact = milieux.find(it => Grammar.equalsInsensitive(it, search)); + if (milieuExact) { + return [milieuExact]; + } + } + return milieux; } - async searchToChatMessage(search) { - const table = await this.buildEnvironnementTable(search); - await CompendiumTableHelpers.tableToChatMessage(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, `ressources en "${search}"`); + async searchToChatMessage(milieux, typeName) { + const table = await this.buildEnvironnementTable(milieux); + await CompendiumTableHelpers.tableToChatMessage(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, typeName); return true } - async getRandom(search) { - const table = await this.buildEnvironnementTable(search); - return await CompendiumTableHelpers.getRandom(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, undefined, `ressources en "${search}"`); + async getRandom(milieux, typeName) { + const table = await this.buildEnvironnementTable(milieux); + return await CompendiumTableHelpers.getRandom(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, undefined, typeName); } - async buildEnvironnementTable(search) { - const itemRareteEnMilieu = item => item.system?.environnement.find(env => Grammar.includesLowerCaseNoAccent(env.milieu, search)); + async buildEnvironnementTable(milieux) { + const filterMilieux = item => item.system?.environnement.filter(env => milieux.includes(env.milieu)); + const itemRareteEnMilieu = item => { + const raretes = filterMilieux(item); + const frequenceMax = Math.max(raretes.map(env => env.frequence)); + return raretes.find(env => env.frequence == frequenceMax); + } const itemFrequenceEnMilieu = item => itemRareteEnMilieu(item)?.frequence ?? 0; const isPresentEnMilieu = item => itemFrequenceEnMilieu(item) > 0; return await this.table.buildTable(itemFrequenceEnMilieu, isPresentEnMilieu); diff --git a/module/rdd-commands.js b/module/rdd-commands.js index f567dcfb..38a564a7 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -382,15 +382,20 @@ export class RdDCommands { async tableMilieu(msg, params, toChat) { if (params && params.length > 0) { const search = Misc.join(params, ' '); - const searches = game.system.rdd.environnement.findEnvironnementsLike(search); - if (searches.length == 0) { + const milieux = await game.system.rdd.environnement.findEnvironnementsLike(search); + if (milieux.length == 0) { return RdDCommands._chatAnswer(msg, 'Aucun milieu correspondant à ' + search); } + if (milieux.length > 1) { + ui.notifications.warn(`Plusieurs milieux correspondent à '${search}': +
`); + } + const tableName = `ressources en ${milieux.reduce(Misc.joining(', '))}`; if (toChat == 'liste') { - return await game.system.rdd.environnement.searchToChatMessage(search); + return await game.system.rdd.environnement.searchToChatMessage(milieux, tableName); } else { - const row = await game.system.rdd.environnement.getRandom(search); + const row = await game.system.rdd.environnement.getRandom(milieux, tableName); await CompendiumTableHelpers.tableRowToChatMessage(row, 'Item'); return true; } From e67ac96e93888c443cb40ced83469b8466d1c08b Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 30 Nov 2022 13:27:05 +0100 Subject: [PATCH 3/4] Fix: /roll MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regression sur /roll causée par méthode async: return Promise(false)=>true au lieu de false... --- module/rdd-commands.js | 73 ++++++++++++++++++++++++++---------------- module/rdd-main.js | 14 -------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 38a564a7..9b21f0ea 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -22,7 +22,20 @@ const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/; export class RdDCommands { static init() { - game.system.rdd.commands = new RdDCommands(); + const rddCommands = new RdDCommands(); + + Hooks.on("chatMessage", (html, content, msg) => { + if (content[0] == '/') { + let regExp = /(\S+)/g; + let commands = content.match(regExp); + if (rddCommands.processChatCommand(commands, content, msg)) { + return false; + } + } + return true; + }); + + game.system.rdd.commands = rddCommands; } constructor() { @@ -50,8 +63,8 @@ export class RdDCommands {
/table rencontre deso affiche la table des rencontres en Désolation
/table rencontre mauvaise affiche la table des mauvaises rencontres` }); - this.registerCommand({ path: ["/table", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params,'liste'), descr: "Affiche la table des ressource naturelles pour un milieu donné" }); - + this.registerCommand({ path: ["/table", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'liste'), descr: "Affiche la table des ressource naturelles pour un milieu donné" }); + this.registerCommand({ path: ["/tirer", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('chat'), descr: "Tire une compétence au hasard" }); this.registerCommand({ path: ["/tirer", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('chat'), descr: "Tire une Queue de Dragon" }); this.registerCommand({ path: ["/tirer", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre('chat'), descr: "Tire une Ombre de Thanatos" }); @@ -63,7 +76,7 @@ export class RdDCommands { this.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" }); this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` }); this.registerCommand({ path: ["/tirer", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'chat'), descr: "Effectue un tirage dans la table desressource naturelles pour un milieu donné" }); - + this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" }); this.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" }); @@ -154,14 +167,7 @@ export class RdDCommands { /* -------------------------------------------- */ registerCommand(command) { - this._addCommand(this.getCommands(), command.path, '', command); - } - - getCommands() { - if (!this.commandsTable){ - this._registerCommands(); - } - return this.commandsTable; + this._addCommand(this.commandsTable, command.path, '', command); } /* -------------------------------------------- */ @@ -198,18 +204,29 @@ export class RdDCommands { processChatCommand(commandLine, content = '', msg = {}) { // Setup new message's visibility let rollMode = game.settings.get("core", "rollMode"); - if (["gmroll", "blindroll"].includes(rollMode)) msg["whisper"] = ChatMessage.getWhisperRecipients("GM"); - if (rollMode === "blindroll") msg["blind"] = true; + if (["gmroll", "blindroll"].includes(rollMode)) { + msg["whisper"] = ChatMessage.getWhisperRecipients("GM"); + } + if (rollMode === "blindroll"){ + msg["blind"] = true; + } msg["type"] = 0; + if (!this.commandsTable) { + this._registerCommands(); + } + let command = commandLine[0].toLowerCase(); - let params = commandLine.slice(1); - - return this.process(command, params, content, msg); + if (this._isCommandHandled(command)) { + let params = commandLine.slice(1); + this._processCommand(this.commandsTable, command, params, content, msg); + return true; + } + return false; } - process(command, params, content, msg) { - return this._processCommand(this.getCommands(), command, params, content, msg); + _isCommandHandled(command){ + return this.commandsTable[command] != undefined; } async _processCommand(commandsTable, name, params, content = '', msg = {}, path = "") { @@ -217,18 +234,20 @@ export class RdDCommands { path = path + name + " "; if (command && command.subTable) { if (params[0]) { - return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path) + this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path) } else { this.help(msg, command.subTable); - return true; } + return true; } if (command && command.func) { - const result = await command.func(content, msg, params); - if (result == false) { - RdDCommands._chatAnswer(msg, command.descr); - } + new Promise(async () => { + const result = await command.func(content, msg, params); + if (result == false) { + RdDCommands._chatAnswer(msg, command.descr); + } + }); return true; } return false; @@ -240,7 +259,7 @@ export class RdDCommands { } async help(msg, table) { let commands = [] - this._buildSubTableHelp(commands, table ?? this.getCommands()); + this._buildSubTableHelp(commands, table ?? this.commandsTable); let html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/settings/dialog-aide-commands.html", { commands: commands }); let d = new Dialog( @@ -366,7 +385,7 @@ export class RdDCommands { } return false; } - + async tableRencontres(msg, params) { if (params && params.length > 0) { const search = Misc.join(params, ' '); diff --git a/module/rdd-main.js b/module/rdd-main.js index 50f49f90..f4d5c361 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -345,17 +345,3 @@ async function migrationPngWebp_1_5_34() { /* -------------------------------------------- */ Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d)); -/* -------------------------------------------- */ -/* Foundry VTT chat message */ -/* -------------------------------------------- */ -Hooks.on("chatMessage", (html, content, msg) => { - if (content[0] == '/') { - let regExp = /(\S+)/g; - let commands = content.match(regExp); - if (game.system.rdd.commands.processChatCommand(commands, content, msg)) { - return false; - } - } - return true; -}); - From 98c016696d52aa9dc3cb836b8210a194c0ff9c04 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 30 Nov 2022 15:31:26 +0100 Subject: [PATCH 4/4] Correction de l'ajout de milieux parfois KO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pas sûr du pourquoi, il semble qu'il y a un souci jQuery (avec deux fenêtres?) --- module/environnement.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/environnement.js b/module/environnement.js index 93c98b8c..9130cd39 100644 --- a/module/environnement.js +++ b/module/environnement.js @@ -151,7 +151,7 @@ export class EnvironmentSheetHelper { static activateListeners(sheet, html) { if (!sheet.options.editable) return; - html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(sheet, event)); + html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(html, sheet, event)); html.find("div.environnement-milieu a.milieu-delete").click(event => EnvironmentSheetHelper.onDeleteMilieu(sheet, event)); html.find("div.environnement-milieu select.environnement-rarete").change(event => EnvironmentSheetHelper.onChange(sheet, event, (updated) => { @@ -168,8 +168,8 @@ export class EnvironmentSheetHelper { })); } - static async onAddMilieu(sheet, event) { - const milieu = $("input.input-selection-milieu").val(); + static async onAddMilieu(html, sheet, event) { + const milieu = html.find('input.input-selection-milieu').val(); if (!milieu) { ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${sheet.item.name}`); return