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