diff --git a/module/rdd-main.js b/module/rdd-main.js index a1029eeb..0b1146c9 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -37,6 +37,7 @@ import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js"; import { Misc } from "./misc.js"; import { Migrations } from './migrations.js'; import { DialogChronologie } from "./dialog-chronologie.js"; +import { SystemCompendiums } from "./settings/system-compendiums.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -195,6 +196,7 @@ Hooks.once("init", async function () { CONFIG.Combat.documentClass = RdDCombatManager; // préparation des différents modules + SystemCompendiums.init(); DialogChronologie.init(); ReglesOptionelles.init(); RdDUtility.init(); diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index 9ba058c5..8db91cf5 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -1,3 +1,5 @@ +import { SystemCompendiums } from "./settings/system-compendiums.js"; + export class RdDRollTables { /* -------------------------------------------- */ @@ -14,7 +16,7 @@ export class RdDRollTables { } static async getSystemTable(tableName) { - const pack = game.packs.get("foundryvtt-reve-de-dragon.tables-diverses"); + const pack = SystemCompendiums.getPack("tables-diverses"); const index = await pack.getIndex(); const entry = index.find(e => e.name === tableName); return await pack.getDocument(entry._id); @@ -24,8 +26,7 @@ export class RdDRollTables { static async drawItemFromRollTable(tableName, toChat = false) { const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat); const pack = game.packs.get(drawResult.documentCollection) - let doc = await pack.getDocument(drawResult.documentId) - return doc + return await pack.getDocument(drawResult.documentId) } /* -------------------------------------------- */ diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js new file mode 100644 index 00000000..4d612148 --- /dev/null +++ b/module/settings/system-compendiums.js @@ -0,0 +1,116 @@ +import { SYSTEM_RDD } from "../constants.js"; + +const COMPENDIUM_SETTING_PREFIX = 'compendium-'; + +const CONFIGURABLE_COMPENDIUMS = { + 'tables-diverses': { label: "Tables aléatoires", type: "RollTable" }, + 'competences': { label: "Compétences", type: "Item" }, + 'queues-de-dragon': { label: "Queues de dragon", type: "Item" }, + 'ombres-de-thanatos': { label: "Ombres de Thanatos", type: "Item" }, + 'souffles-de-dragon': { label: "Souffles de Dragon", type: "Item" }, + 'tarot-draconique': { label: "Tarots draconiques", type: "Item" }, + 'tetes-de-dragon-pour-haut-revants': { label: "Têtes de dragons (haut-rêvant)", type: "Item" }, + 'tetes-de-dragon-pour-tous-personnages': { label: "Têtes de dragons (tous)", type: "Item" }, +} + +export class SystemCompendiums extends FormApplication { + static init() { + Object.keys(CONFIGURABLE_COMPENDIUMS).forEach(compendium => { + const definition = CONFIGURABLE_COMPENDIUMS[compendium]; + mergeObject(definition, { + compendium: compendium, + default: SystemCompendiums._getDefaultCompendium(compendium), + setting: SystemCompendiums._getSettingCompendium(compendium) + }); + + game.settings.register(SYSTEM_RDD, definition.setting, { + name: definition.label, + default: definition.default, + scope: "world", + config: false, + type: String + }); + }); + + game.settings.registerMenu(SYSTEM_RDD, "compendium-settings", { + name: "Choisir les compendiums système", + label: "Compendiums système", + hint: "Ouvre la fenêtre de sélection des compendiums système", + icon: "fas fa-bars", + type: SystemCompendiums + }) + } + + static getPack(compendium) { + return game.packs.get(SystemCompendiums.getCompendium(compendium)); + } + + static async getContent(compendium, docType) { + const pack = SystemCompendiums.getPack(compendium); + if (pack.metadata.type == docType) + { + return await pack.getDocuments(); + } + return []; + } + + static async getItems(compendium) { + return await SystemCompendiums.getContent(compendium, 'Item') + } + + static getCompendium(compendium) { + const setting = CONFIGURABLE_COMPENDIUMS[compendium]?.setting; + return setting ? game.settings.get(SYSTEM_RDD, setting) : SystemCompendiums._getDefaultCompendium(compendium); + } + + static _getSettingCompendium(compendium) { + return COMPENDIUM_SETTING_PREFIX + compendium; + } + + static _getDefaultCompendium(compendium) { + return `${SYSTEM_RDD}.${compendium}`; + } + + constructor(...args) { + super(...args); + } + + static get defaultOptions() { + const options = super.defaultOptions; + mergeObject(options, { + id: "system-compendiums", + template: "systems/foundryvtt-reve-de-dragon/templates/settings/system-compendiums.html", + height: 'fit-content', + width: 600, + minimizable: false, + closeOnSubmit: true, + title: "Compendiums système" + }); + return options; + } + + getData() { + const systemCompendiums = Object.values(CONFIGURABLE_COMPENDIUMS) + .map(it => mergeObject(it, { value: SystemCompendiums.getCompendium(it.compendium) })); + const availableCompendiums = game.packs.map(pack => { return { + name: pack.collection, + path: pack.collection.replace('.', " / "), + type: pack.metadata.type + } }); + return mergeObject(super.getData(), { + systemCompendiums: systemCompendiums, + availableCompendiums: availableCompendiums + }); + } + + activateListeners(html) { + html.find("select.system-compendium-setting").change((event) => { + const compendium = $(event.currentTarget).data('compendium') + const value = $(event.currentTarget).val(); + const systemCompendium = CONFIGURABLE_COMPENDIUMS[compendium]; + + game.settings.set(SYSTEM_RDD, systemCompendium.setting, value); + }); + } + +} \ No newline at end of file diff --git a/templates/settings/system-compendiums.html b/templates/settings/system-compendiums.html new file mode 100644 index 00000000..089c6fb5 --- /dev/null +++ b/templates/settings/system-compendiums.html @@ -0,0 +1,21 @@ +
+