diff --git a/changelog.md b/changelog.md index 2166a38c..a3e28177 100644 --- a/changelog.md +++ b/changelog.md @@ -4,6 +4,7 @@ - Correction du recul contre une entité de cauchemar (qui utilise le rêve comme force) - Correction erreur lors de la suppression d'un objet d'un conteneur +- Meilleure gestion des messages publics/GM, en particulier pour les tirage dans les compendiums ## 13.0.34 - La saumuche d'Illysis diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index f4532795..396f8b66 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -665,12 +665,12 @@ export class RdDBaseActorReve extends RdDBaseActor { show: show ?? {} }, { overwrite: false }); - await ChatUtility.createChatWithRollMode({ - roll: encaissement.roll, - content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.hbs', encaissement) - }, - this - ) + await ChatMessage.create(ChatUtility.adaptVisibility( + { + roll: encaissement.roll, + content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.hbs', encaissement) + }, + { actor: this })) if (!encaissement.hasPlayerOwner && encaissement.endurance != 0) { encaissement = foundry.utils.duplicate(encaissement) diff --git a/module/chat-utility.js b/module/chat-utility.js index 8e5bf61b..3fe713cb 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -92,27 +92,28 @@ export class ChatUtility { } /* -------------------------------------------- */ - static async createChatWithRollMode(messageData, actor = undefined, rollMode = game.settings.get("core", "rollMode")) { - switch (rollMode) { + static adaptVisibility( messageData, options = { actor: undefined, rollMode: undefined }) { + foundry.utils.mergeObject(options, { rollMode: game.settings.get("core", "rollMode") }, { overwrite: false }); + switch (options.rollMode) { case "blindroll": // GM only if (!game.user.isGM) { ChatUtility.blindMessageToGM(messageData) - messageData.whisper = [game.user]; - messageData.content = "Message envoyé en aveugle au Gardien" + messageData.whisper = [game.user] + messageData.content = "Message envoyé en aveugle au Gardien"; } else { messageData.whisper = ChatUtility.getGMs() } - break + break; case "gmroll": - messageData.whisper = actor ? ChatUtility.getOwners(actor) : ChatUtility.getUserAndGMs() - break + messageData.whisper = options.actor ? ChatUtility.getOwners(options.actor) : ChatUtility.getUserAndGMs() + break; case "selfroll": messageData.whisper = [game.user] break } - messageData.alias = messageData.alias ?? actor?.name ?? game.user.name - return await ChatMessage.create(messageData) + messageData.alias = messageData.alias ?? options.actor?.name ?? game.user.name + return messageData } static tellToUser(message) { @@ -134,6 +135,7 @@ export class ChatUtility { whisper: ChatUtility.getUserAndGMs() }) } + static getOwners(document) { return document ? game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) : [game.user] } @@ -216,7 +218,7 @@ export class ChatUtility { static async onRenderChatMessage(chatMessage, html, data) { const rddTimestamp = chatMessage.getFlag(SYSTEM_RDD, 'rdd-timestamp') const heureRdD = $(html).find('header.message-header .heure-rdd') - if (rddTimestamp && heureRdD.length==0) { + if (rddTimestamp && heureRdD.length == 0) { const messageTimestamp = $(html).find('header.message-header .message-timestamp'); const timestamp = new RdDTimestamp(rddTimestamp); const timestampData = timestamp.toCalendrier(); diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 5262e5fd..a606ead7 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -996,9 +996,9 @@ export class RdDCombat { const arme = rollData.arme; const avecArme = !['', 'sans-armes', 'armes-naturelles'].includes(arme?.system.categorie_parade ?? ''); const action = (rollData.attackerRoll ? (arme ? "la parade" : "l'esquive") : "l'attaque"); - ChatUtility.createChatWithRollMode( + await ChatMessage.create(ChatUtility.adaptVisibility( { content: `Maladresse à ${action}! ` + await RdDRollTables.getMaladresse({ arme: avecArme }) }, - this.defender) + { actor: this.defender })) } /* -------------------------------------------- */ @@ -1122,9 +1122,9 @@ export class RdDCombat { async infoAttaquantDesarme(rollData) { if (/*TODO: parade?*/!rollData.attackerRoll?.particuliere) { // TODO: attaquant doit jouer résistance et peut être désarmé p132 - ChatUtility.createChatWithRollMode( + await ChatMessage.create(ChatUtility.adaptVisibility( { content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` }, - this.defender) + { actor: this.defender })) } } @@ -1156,9 +1156,9 @@ export class RdDCombat { console.log("RdDCombat._onParadeParticuliere >>>", defenderRoll); if (!defenderRoll.attackerRoll.isPart) { // TODO: attaquant doit jouer résistance et peut être désarmé p132 - ChatUtility.createChatWithRollMode( + await ChatMessage.create(ChatUtility.adaptVisibility( { content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` }, - this.defender) + { actor: this.defender })) } } /* -------------------------------------------- */ @@ -1243,9 +1243,9 @@ export class RdDCombat { /* -------------------------------------------- */ async _onEsquiveParticuliere(defenderRoll) { console.log("RdDCombat._onEsquiveParticuliere >>>", defenderRoll); - ChatUtility.createChatWithRollMode( + await ChatMessage.create(ChatUtility.adaptVisibility( { content: "Vous pouvez esquiver une deuxième fois!" }, - this.defender); + { actor: this.defender })) } /* -------------------------------------------- */ diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index ffaf3d40..835d587d 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -224,12 +224,10 @@ export class RdDEmpoignade { const isNouvelle = empoignade == undefined; empoignade = empoignade ?? (await RdDEmpoignade.createEmpoignade(attacker, defender)) if ((isNouvelle || empoignade.system.pointsemp == 0) && defender.hasArmeeMeleeEquipee()) { - ChatUtility.createChatWithRollMode( - { - content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.hbs`, { attacker: attacker, defender: defender }) - }, - attacker - ) + await ChatMessage.create(ChatUtility.adaptVisibility( + { content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.hbs`, { attacker: attacker, defender: defender }) }, + { actor: attacker } + )) } else { await this.onAttaqueEmpoignadeValidee(attacker, defender) } diff --git a/module/rdd-roll-result.js b/module/rdd-roll-result.js index 2495e366..3e244258 100644 --- a/module/rdd-roll-result.js +++ b/module/rdd-roll-result.js @@ -4,12 +4,10 @@ import { renderTemplate } from "./constants.js"; export class RdDRollResult { static async displayRollData(rollData, actor = undefined, template = 'chat-resultat-general.hbs') { - const chatMessage = await ChatUtility.createChatWithRollMode( + return await ChatMessage.create(ChatUtility.adaptVisibility( { content: await RdDRollResult.buildRollDataHtml(rollData, template) }, - actor, - rollData.current?.rollmode?.key - ) - return chatMessage + { actor: actor, rollMode: rollData.current?.rollmode?.key } + )) } static async buildRollDataHtml(rollData, template = 'chat-resultat-general.hbs') { diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index 8ad7ed36..ca1ed14a 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -34,9 +34,9 @@ export class RdDRollTables { } /* -------------------------------------------- */ - static async getCompetence(toChat = false) { + static async getCompetence(toChat = false, rollMode = "gmroll") { if (toChat == 'liste') { - return await RdDRollTables.listOrRoll('competences', 'Item', ['competence'], toChat, it => 1); + return await RdDRollTables.listOrRoll('competences', 'Item', ['competence'], toChat, rollMode, it => 1); } else { return await RdDRollTables.drawItemFromRollTable("Détermination aléatoire de compétence", toChat); @@ -44,56 +44,58 @@ export class RdDRollTables { } /* -------------------------------------------- */ - static async getSouffle(toChat = false) { - return await RdDRollTables.listOrRoll('souffles-de-dragon', 'Item', ['souffle'], toChat); + static async getSouffle(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('souffles-de-dragon', 'Item', ['souffle'], toChat, rollMode); } /* -------------------------------------------- */ - static async getQueue(toChat = false) { - return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat); + static async getQueue(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat, rollMode); } - static async getDesirLancinant(toChat = false) { - return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat, + static async getDesirLancinant(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat, rollMode, it => it.system.frequence, it => it.system.categorie == 'lancinant'); } - static async getIdeeFixe(toChat = false) { - return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat, + static async getIdeeFixe(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('queues-de-dragon', 'Item', ['queue'], toChat, rollMode, it => it.system.frequence, it => it.system.categorie == 'ideefixe'); } /* -------------------------------------------- */ - static async getTeteHR(toChat = false) { - return await RdDRollTables.listOrRoll('tetes-de-dragon-pour-haut-revants', 'Item', ['tete'], toChat); + static async getTeteHR(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('tetes-de-dragon-pour-haut-revants', 'Item', ['tete'], toChat, rollMode); } /* -------------------------------------------- */ - static async getTete(toChat = false) { - return await RdDRollTables.listOrRoll('tetes-de-dragon-pour-tous-personnages', 'Item', ['tete'], toChat); + static async getTete(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('tetes-de-dragon-pour-tous-personnages', 'Item', ['tete'], toChat, rollMode); } /* -------------------------------------------- */ - static async getOmbre(toChat = false) { - return await RdDRollTables.listOrRoll('ombres-de-thanatos', 'Item', ['ombre'], toChat); + static async getOmbre(toChat = false, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('ombres-de-thanatos', 'Item', ['ombre'], toChat, rollMode); } /* -------------------------------------------- */ - static async getTarot(toChat = true) { - return await RdDRollTables.listOrRoll('tarot-draconique', 'Item', ['tarot'], toChat); + static async getTarot(toChat = true, rollMode = "gmroll") { + return await RdDRollTables.listOrRoll('tarot-draconique', 'Item', ['tarot'], toChat, rollMode); } /* -------------------------------------------- */ - static async listOrRoll(compendium, type, subTypes, toChat, itemFrequence = it => it.system.frequence, filter = it => true) { + static async listOrRoll(compendium, type, subTypes, toChat, rollMode, + itemFrequence = it => it.system.frequence, + filter = it => true) { const table = new CompendiumTable(compendium, type, subTypes); if (toChat == 'liste') { return await table.toChatMessage(itemFrequence, filter); } const row = await table.getRandom(itemFrequence, filter); if (row) { - await CompendiumTableHelpers.tableRowToChatMessage(row, type); + await CompendiumTableHelpers.tableRowToChatMessage(row, type, { rollMode: rollMode }); return row.document; } return undefined; diff --git a/module/roll/chat-roll-result.mjs b/module/roll/chat-roll-result.mjs index 2d138921..a048b5d5 100644 --- a/module/roll/chat-roll-result.mjs +++ b/module/roll/chat-roll-result.mjs @@ -43,13 +43,13 @@ export default class ChatRollResult { async display(roll, impacts) { this.prepareDisplay(roll) - const chatMessage = await ChatUtility.createChatWithRollMode( + const chatMessage = await ChatMessage.create(ChatUtility.adaptVisibility( { content: await this.buildRollHtml(roll) }, roll.active.actor, roll.current?.rollmode?.key - ) + )) await this.saveChatMessageRoll(chatMessage, roll, impacts) return chatMessage diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js index 275dd5ce..09cc5e7b 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -289,24 +289,26 @@ export class CompendiumTableHelpers { } /* -------------------------------------------- */ - static async tableRowToChatMessage(row, type, options = { showSource: true }) { + static async tableRowToChatMessage(row, type, options = {}) { + foundry.utils.mergeObject(options, { showSource: true, rollMode: undefined }, { overwrite: false }) if (!row) { - return; + return } const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll.hbs', { roll: row.roll, document: row.document, typeName: Misc.typeName(type, row.document?.type ?? 'objet'), isGM: game.user.isGM, - options - }); - const messageData = { - user: game.user.id, - rolls: [row.roll], - sound: CONFIG.sounds.dice, - content: flavorContent - }; - await ChatUtility.createChatWithRollMode(messageData) + options: { showSource: options.showSource } + }) + await ChatMessage.create(ChatUtility.adaptVisibility( + { + user: game.user.id, + rolls: [row.roll], + sound: CONFIG.sounds.dice, + content: flavorContent + }, + { rollMode: options.rollMode })) } /* -------------------------------------------- */ @@ -316,13 +318,14 @@ export class CompendiumTableHelpers { typeName: typeName ?? Misc.typeName(type, subTypes[0]), table, isGM: game.user.isGM, - }); - const messageData = { - user: game.user.id, - whisper: [game.user], - content: flavorContent - }; - await ChatUtility.createChatWithRollMode(messageData) + }) + await ChatMessage.create(ChatUtility.adaptVisibility( + { + user: game.user.id, + whisper: [game.user], + content: flavorContent + } + )) } } \ No newline at end of file