From 979a48e4d95ef32b11ebfe459f7d2b0fda33bca1 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 30 Nov 2022 13:32:42 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20recherche=20dans=20un=20mil?= =?UTF-8?q?ieu?= 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; }