From f4d074fa31a8af59a69ff245d2aeb225f8229204 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Jan 2023 21:51:49 +0100 Subject: [PATCH] =?UTF-8?q?Param=C3=A9trage=20des=20compendiums=20de=20rec?= =?UTF-8?q?herche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/environnement.js | 3 +- module/item.js | 17 +- module/rdd-commands.js | 2 +- module/rdd-main.js | 8 +- module/settings/system-compendiums.js | 6 +- module/tirage/fenetre-recherche-tirage.js | 242 ++++++++++++------ module/tirage/raretes.js | 41 ++- .../fenetre-recherche-configuration.hbs | 22 ++ 8 files changed, 237 insertions(+), 104 deletions(-) create mode 100644 templates/tirage/fenetre-recherche-configuration.hbs diff --git a/module/environnement.js b/module/environnement.js index 9beffd89..f11b5493 100644 --- a/module/environnement.js +++ b/module/environnement.js @@ -99,8 +99,7 @@ export class Environnement { if (!milieux) { milieux = await this.milieux() } - const frequence = item => item.getRarete(milieux)?.frequence ?? 0; - return await this.table.buildTable(frequence, it => frequence(it) > 0 && filter(it)); + return await this.table.buildTable(it => it.getFrequence(), filter); } async getElements(itemFrequence, filter) { diff --git a/module/item.js b/module/item.js index a05339db..12dc1749 100644 --- a/module/item.js +++ b/module/item.js @@ -186,28 +186,19 @@ export class RdDItem extends Item { ? this.system?.environnement.filter(env => !milieux || milieux.includes(env.milieu)) : [] } - getEnvRarete(milieux = undefined) { - if (this.isEnvironnement()) { - const list = this.getEnvironnements(milieux); - const frequenceMax = Math.max(...list.map(env => env.frequence)); - return list.find(env => env.frequence == frequenceMax); - } - return {} - } getRarete(milieux = undefined) { if (this.isEnvironnement()) { - const env = this.getEnvRarete(milieux); - return RdDRaretes.getRarete(env.rarete); + return RdDRaretes.rareteEnvironnement(this, milieux) } if (this.isInventaire()) { return RdDRaretes.rareteEquipement(this) } - return RdDRaretes.getRareteFrequente(); + return RdDRaretes.rareteFrequente(); } + getFrequence(milieux = undefined) { - const frequence = this.getRarete(milieux)?.frequence; - return frequence == undefined ? 1 : frequence; + return this.getRarete(milieux)?.frequence ?? 0; } getItemGroup() { diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 2f48da54..51b7e12c 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -511,7 +511,7 @@ export class RdDCommands { } async tirage() { - new FenetreRechercheTirage({}).render(true); + FenetreRechercheTirage.create(); } } diff --git a/module/rdd-main.js b/module/rdd-main.js index 226c3256..44fb3c38 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -50,6 +50,7 @@ import { RdDConteneurItemSheet } from "./item-conteneur-sheet.js"; import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js"; import { TMRRencontres } from "./tmr-rencontres.js"; +import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js"; /** * RdD system @@ -182,6 +183,7 @@ export class SystemReveDeDragon { RdDPossession.init(); TMRRencontres.init(); Environnement.init(); + FenetreRechercheTirage.init(); Hooks.once('ready', () => this.onReady()); } @@ -265,7 +267,7 @@ export class SystemReveDeDragon { let sidebar = document.getElementById("sidebar"); sidebar.style.width = "min-content"; } - + if (Misc.isUniqueConnectedGM()) { new Migrations().migrate(); } @@ -296,9 +298,9 @@ export class SystemReveDeDragon { this.registerUsageCount(SYSTEM_RDD); } } - + /* -------------------------------------------- */ - messageDeBienvenue() { + messageDeBienvenue() { if (game.user.isGM) { ChatUtility.removeChatMessageContaining('
'); ChatMessage.create({ diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js index 2128e8bd..b9bc9a80 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -52,6 +52,10 @@ export class SystemCompendiums extends FormApplication { } static getPack(compendium) { + const pack = game.packs.get(compendium); + if (pack) { + return pack; + } return game.packs.get(SystemCompendiums.getCompendium(compendium)) ?? game.packs.get(SystemCompendiums._getDefaultCompendium(compendium)); } @@ -187,7 +191,7 @@ export class CompendiumTable { async getContent(itemFrequence = it => it.system.frequence, filter = it => true) { return await SystemCompendiums.getContent(this.compendium, this.type, - it => (!this.subTypes || this.subTypes.includes(it.type)) && filter(it), + it => (!this.subTypes || this.subTypes.includes(it.type)) && itemFrequence(it) > 0 && filter(it), itemFrequence, this.sorting); } diff --git a/module/tirage/fenetre-recherche-tirage.js b/module/tirage/fenetre-recherche-tirage.js index 0ff6c7d7..f82d6d69 100644 --- a/module/tirage/fenetre-recherche-tirage.js +++ b/module/tirage/fenetre-recherche-tirage.js @@ -3,6 +3,7 @@ import { HtmlUtility } from '../html-utility.js'; import { Misc } from "../misc.js"; import { CompendiumTable, CompendiumTableHelpers, SystemCompendiums } from '../settings/system-compendiums.js'; import { RdDRaretes } from './raretes.js'; +import { SYSTEM_RDD } from '../constants.js'; const FILTER_GROUPS = [ { group: 'type', label: "Type d'objet" }, @@ -50,8 +51,75 @@ const FILTERS = [ { group: "prix", code: "dragons", label: "Dragons (or) 1+ ", check: item => item.isInventaire() && 10 <= item.system.cout }, ] +const COMPENDIUMS_RECHERCHE = 'compendiums-recherche'; + +function $typeToFilter(type) { return { group: 'type', code: type, label: Misc.typeName('Item', type), check: item => item.type == type }; } + +function $filterMilieux(milieux) { + return milieux.map(m => { return { group: 'milieu', code: m, label: m, check: item => item.isPresentDansMilieux(m) } }) +} + +function $filterRarete() { + return RdDRaretes.raretes() + .filter(it => it.frequence > 0) + .map(r => { return { group: 'rarete', code: r.code, label: r.label, check: item => item.getRarete()?.code == r.code }; }); +} + +function $filterTypes() { + return [ + { group: 'type', code: 'inventaire', label: 'Inventaire', check: item => item.isInventaire() && !item.isEnvironnement() }, + ] + .concat(['arme', 'armure'].map(it => $typeToFilter(it))) + .concat([{ group: 'type', code: 'environement', label: 'Faune, Flore, Ingrédients', check: item => item.isEnvironnement() }]) + .concat(RdDItem.getItemTypesEnvironnement().map(it => $typeToFilter(it))) +} + +function $getAllFilters(milieux) { + return FILTERS + .concat($filterTypes()) + .concat($filterMilieux(milieux)) + .concat($filterRarete()); +} + +function $addFilterToGroup(groups, filter) { + if (filter.group && filter.code && filter.label) { + let fg = groups.find(g => g.group == filter.group); + if (fg == undefined) { + groups.push({ group: filter.group, label: filter.group, filters: [filter] }) + } + else if (fg.filters == undefined) { + fg.filters = [filter]; + } + else { + fg.filters.push(filter); + } + } + else { + console.warn("Filtre incorrect, pas de groupe/code/label", filter); + } +} + +function $loadFilters(parameters) { + $getAllFilters(parameters.milieux).forEach(f => $addFilterToGroup(parameters.filterGroups, f)); +} + + + export class FenetreRechercheTirage extends Application { + static init() { + game.settings.register(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, { + name: COMPENDIUMS_RECHERCHE, + default: [ + SystemCompendiums.getCompendium('faune-flore-mineraux'), + SystemCompendiums.getCompendium('equipement') + ], + scope: "world", + config: false, + type: Object + }); + } + static get defaultOptions() { return mergeObject(super.defaultOptions, { template: "systems/foundryvtt-reve-de-dragon/templates/tirage/fenetre-recherche-tirage.hbs", @@ -64,72 +132,32 @@ export class FenetreRechercheTirage extends Application { }); } - static async $filterMilieux() { - const milieux = await game.system.rdd.environnement.milieux(); - return milieux.map(m => { return { group: 'milieu', code: m, label: m, check: item => item.isPresentDansMilieux(m) } }) + static async create() { + const parameters = { + milieux: await game.system.rdd.environnement.milieux(), + filterGroups: duplicate(FILTER_GROUPS).filter(it => it.group), + } + const options = {} + $loadFilters(parameters); + + new FenetreRechercheTirage(parameters, options).render(true); } - static $filterRarete() { - return RdDRaretes.raretes() - .map(r => { return { group: 'rarete', code: r.code, label: r.label, check: item => item.getRarete()?.code == r.code }; }); - } - - static $filterTypes() { - return [ - { group: 'type', code: 'inventaire', label: 'Inventaire', check: item => item.isInventaire() && !item.isEnvironnement() }, - ] - .concat(['arme', 'armure'].map(it => FenetreRechercheTirage.$typeToFilter(it))) - .concat([{ group: 'type', code: 'environement', label: 'Faune, Flore, Ingrédients', check: item => item.isEnvironnement() }]) - .concat(RdDItem.getItemTypesEnvironnement().map(it => FenetreRechercheTirage.$typeToFilter(it))) - } - static $typeToFilter(type) { return { group: 'type', code: type, label: Misc.typeName('Item', type), check: item => item.type == type }; } - - static async create(options) { - new FenetreRechercheTirage(options).render(true); - } - - constructor(options) { + constructor(parameters, options) { super(options); - this.tirage = {}; - this.compendiums = [ - SystemCompendiums.getCompendium('faune-flore-mineraux'), - SystemCompendiums.getCompendium('equipement') - ] + this.parameters = parameters; + this.buildCompendiumTables(); + } + + buildCompendiumTables() { + this.parameters.compendiums = game.settings.get(SYSTEM_RDD, COMPENDIUMS_RECHERCHE); + this.parameters.compendiumTables = this.parameters.compendiums.map(it => new CompendiumTable(it, 'Item')); } async getData() { - const filterGroups = duplicate(FILTER_GROUPS); - FILTERS - .concat(FenetreRechercheTirage.$filterTypes()) - .concat(await FenetreRechercheTirage.$filterMilieux()) - .concat(FenetreRechercheTirage.$filterRarete()) - .forEach(f => addFilterToGroup(filterGroups, f)) - mergeObject(this.tirage, - { - filterGroups: filterGroups.filter(it => it.group) - }) - let formData = super.getData(); - mergeObject(formData, this.tirage) + mergeObject(formData, this.parameters) return formData; - - function addFilterToGroup(filterGroups, filter) { - if (filter.group && filter.code && filter.label) { - let fg = filterGroups.find(g => g.group == filter.group); - if (fg == undefined) { - filterGroups.push({ group: filter.group, label: filter.group, filters: [filter] }) - } - else if (fg.filters == undefined) { - fg.filters = [filter]; - } - else { - fg.filters.push(filter); - } - } - else { - console.warn("Filtre incorrect, pas de groupe/code/label", filter); - } - } } _canDragStart() { @@ -138,6 +166,18 @@ export class FenetreRechercheTirage extends Application { _onDragStart(event) { console.log('_onDragStart', event) } + _getHeaderButtons() { + let buttons = super._getHeaderButtons(); + if (game.user.isGM) { + buttons.unshift({ + class: "configurer", + label: "Configurer", + icon: "fas fa-cogs", + onclick: ev => this.configurer() + }); + } + return buttons + } activateListeners(html) { super.activateListeners(html); @@ -179,17 +219,17 @@ export class FenetreRechercheTirage extends Application { } async buildTable() { - const filter = this.getSelectedItemsFilter(); - const equipementCompendiumTable = new CompendiumTable('equipement', 'Item'); - const equipements = await equipementCompendiumTable.buildTable(it => it.getFrequence(), filter) - const environnements = await game.system.rdd.environnement.buildEnvironnementTable(undefined, filter); - return CompendiumTableHelpers.concatTables(environnements, equipements); + const filter = this.buildCheckedItemsFilter(); + const allTables = await Promise.all( + this.parameters.compendiumTables.map(async compTable => await compTable.buildTable(it => it.getFrequence(), filter)) + ); + return CompendiumTableHelpers.concatTables(...allTables); } - getSelectedItemsFilter() { - const byGroup = this.getSelectedFiltersByGroup(); + buildCheckedItemsFilter() { + const byGroup = this.getCheckedFiltersByGroup(); const groupSummaries = Object.entries(byGroup).map(([key, list]) => { - const group = this.tirage.filterGroups.find(g => key == g.group); + const group = this.parameters.filterGroups.find(g => key == g.group); const filters = list.map(it => it.code).map(code => group.filters.find(f => code == f.code)) return filters .map(f => f.check) @@ -210,9 +250,9 @@ export class FenetreRechercheTirage extends Application { } changeListeFiltresActifs() { - const byGroup = this.getSelectedFiltersByGroup(); + const byGroup = this.getCheckedFiltersByGroup(); const groupSummaries = Object.entries(byGroup).map(([key, list]) => { - const group = this.tirage.filterGroups.find(g => key == g.group); + const group = this.parameters.filterGroups.find(g => key == g.group); const filters = list.map(it => it.code).map(code => group.filters.find(f => code == f.code)) return group.label + ': ' + filters .map(f => f.label) @@ -222,12 +262,70 @@ export class FenetreRechercheTirage extends Application { this.html.find('span.liste-filtres-actifs').text(fullText); } - getSelectedFiltersByGroup() { + getCheckedFiltersByGroup() { const selectedFilters = jQuery.map(this.html.find('input.activate-filter:checked'), it => { const element = this.html.find(it); return { group: element.data('group'), code: element.data('code') }; }); - const byGroup = Misc.classify(selectedFilters, it => it.group); - return byGroup; + return Misc.classify(selectedFilters, it => it.group); } -} \ No newline at end of file + + async configurer() { + const itemPacks = game.packs.filter(it => it.metadata.type == 'Item'); + console.log('packs1', itemPacks); + + const configuration = { + compendiums: itemPacks.map(it => duplicate(it.metadata)).map(it => mergeObject(it, { selected: this.parameters.compendiums.includes(it.id) })) + } + FenetreRechercheConfiguration.create(configuration, c => this.setConfiguration(c)); + } + + setConfiguration(configuration) { + const compendiums = configuration.compendiums.filter(it => it.selected).map(it => it.id); + game.settings.set(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, compendiums); + this.buildCompendiumTables() + } + +} + +class FenetreRechercheConfiguration extends Dialog { + static async create(configuration, onSave) { + const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/tirage/fenetre-recherche-configuration.hbs", configuration); + new FenetreRechercheConfiguration(html, configuration, onSave).render(true); + } + + constructor(html, configuration, onSave) { + const options = { + classes: ["fenetre-recherche-configuration"], + width: 600, + height: 'fit-content', + 'max-height': 600, + height: 'fit-content', + 'z-index': 99999 + }; + const conf = { + title: 'Configuration de la recherche', + content: html, + buttons: { + } + }; + super(conf, options) + this.configuration = configuration; + this.onSave = onSave; + } + activateListeners(html) { + this.html = html; + super.activateListeners(html); + this.html.find("button.configuration-save").click(event => this.sauvegarder()) + } + + async sauvegarder() { + const compendiumIds = jQuery.map(this.html.find("input.select-compendium:checked"), it => { + return this.html.find(it).data('id'); + }); + this.configuration.compendiums.forEach(c => { + c.selected = compendiumIds.includes(c.id) + }) + this.onSave(this.configuration) + } +} diff --git a/module/tirage/raretes.js b/module/tirage/raretes.js index dc6f4d28..fa93cda4 100644 --- a/module/tirage/raretes.js +++ b/module/tirage/raretes.js @@ -1,15 +1,21 @@ +const RARETE_COMMUNE = { code: 'Commune', label: 'Commune', frequence: 54, min: 27, max: 108 }; +const RARETE_FREQUENTE = { code: 'Frequente', label: 'Fréquente', frequence: 18, min: 9, max: 36 }; +const RARETE_RARE = { code: 'Rare', label: 'Rare', frequence: 6, min: 3, max: 12 }; +const RARETE_RARISSIME = { code: 'Rarissime', label: 'Rarissime', frequence: 2, min: 1, max: 4 }; +const RARETE_INEXISTANT = { code: 'Inexistant', label: 'Inexistant', frequence: 0, min: 0, max: 0 }; const RARETES = [ - { code: 'Commune', label: 'Commune', frequence: 54, min: 27, max: 108 }, - { code: 'Frequente', label: 'Fréquente', frequence: 18, min: 9, max: 36 }, - { code: 'Rare', label: 'Rare', frequence: 6, min: 3, max: 12 }, - { code: 'Rarissime', label: 'Rarissime', frequence: 2, min: 1, max: 4 }] -const DEFAULT_RARETE = 1; + RARETE_COMMUNE, + RARETE_FREQUENTE, + RARETE_RARE, + RARETE_RARISSIME, + RARETE_INEXISTANT, +] export class RdDRaretes { static getRarete(code = undefined) { - return RARETES.find(it => it.code == code) ?? RARETES[DEFAULT_RARETE]; + return RARETES.find(it => it.code == code) ?? RARETE_FREQUENTE; } static getChamp(rarete, field = undefined) { @@ -17,8 +23,8 @@ export class RdDRaretes { return field ? selected[field] : selected[frequence]; } - static getRareteFrequente() { - return RARETES[DEFAULT_RARETE]; + static rareteFrequente() { + return RARETE_FREQUENTE; } static raretes() { @@ -29,17 +35,28 @@ export class RdDRaretes { return RdDRaretes.rareteEquipement(item).frequence } + + static rareteEnvironnement(item, milieux = undefined) { + const list = item.getEnvironnements(milieux); + const freqMax = Math.max(0, ...list.map(env => env.frequence)); + const env = list.find(env => env.frequence == freqMax); + return env ? RdDRaretes.getRarete(env.rarete) : RARETE_INEXISTANT; + + } static rareteEquipement(item) { const qualite = item.system.qualite ?? 0; if (qualite <= 0) { - return RARETES[0] + return RARETE_COMMUNE } if (qualite <= 3) { - return RARETES[1] + return RARETE_FREQUENTE } if (qualite <= 6) { - return RARETES[2] + return RARETE_RARE } - return RARETES[3] + if (qualite <= 9) { + return RARETE_RARISSIME + } + return RARETE_INEXISTANT } } \ No newline at end of file diff --git a/templates/tirage/fenetre-recherche-configuration.hbs b/templates/tirage/fenetre-recherche-configuration.hbs new file mode 100644 index 00000000..6e575ca5 --- /dev/null +++ b/templates/tirage/fenetre-recherche-configuration.hbs @@ -0,0 +1,22 @@ +
+
+

Recherche dans les compendiums

+
+
+
    + {{#each compendiums as |compendium|}} +
  • + + +
  • + {{/each}} +
+
+
+ +
+
+