diff --git a/module/environnement.js b/module/environnement.js index 38b8c554..9130cd39 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); @@ -139,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) => { @@ -156,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 diff --git a/module/rdd-commands.js b/module/rdd-commands.js index f567dcfb..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, ' '); @@ -382,15 +401,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; } 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; -}); - 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 {