diff --git a/changelog.md b/changelog.md index e1d942a5..ad50c309 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,11 @@ # 12.0 +## 12.0.15 - Le messager d'Astrobazzarh +- Correction des faces de dés personalisés dice-so-nice +- Les messages de maladies ne sont plus publics +- Les messages privés dans les TMR sont aussi envoyés au GM +- Les informations de compétences pouvant augmenter s'affichent comme tooltips +- Amélioration du rendu des tables de compendiums (commande /table) + ## 12.0.14 - Les légions d'Astrobazzarh - Feuille de PNJ: - boutons standard (encaissement, ...) diff --git a/module/actor.js b/module/actor.js index ee0569d2..73c21990 100644 --- a/module/actor.js +++ b/module/actor.js @@ -159,7 +159,7 @@ export class RdDActor extends RdDBaseActorSang { const potionUpdates = await Promise.all(potions.map(async it => { const nouveauReve = Math.max(it.system.pr - 1, 0) ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html`, { pr: nouveauReve, alias: this.name, @@ -210,7 +210,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async grisReve(nbJours) { let message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `${nbJours} jours de gris rêve sont passés. ` }; for (let i = 0; i < nbJours; i++) { @@ -264,7 +264,7 @@ export class RdDActor extends RdDBaseActorSang { async dormirChateauDormant() { if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) { const message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: "" }; @@ -400,7 +400,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async remiseANeuf() { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: 'Remise à neuf de ' + this.name }); await this.supprimerBlessures(it => true); @@ -417,7 +417,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async dormir(heures, options = { grisReve: false, chateauDormant: false }) { const message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: this.name + ': ' }; const insomnie = this.system.sommeil?.insomnie || heures == 0; @@ -488,7 +488,7 @@ export class RdDActor extends RdDBaseActorSang { else { if (!ReglesOptionnelles.isUsing("recuperation-reve")) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `Pas de récupération de rêve (${reve} points ignorés)` }); jetsReve.push(0); @@ -919,7 +919,7 @@ export class RdDActor extends RdDBaseActorSang { await this.createEmbeddedDocuments('Item', [souffle]); if (options.chat) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: this.name + " subit un Souffle de Dragon : " + souffle.name }); } @@ -939,7 +939,7 @@ export class RdDActor extends RdDBaseActorSang { await this.createEmbeddedDocuments('Item', [queue]); if (options.chat) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: this.name + " subit une Queue de Dragon : " + queue.name }); } @@ -977,7 +977,7 @@ export class RdDActor extends RdDBaseActorSang { let tmr = await TMRUtility.getTMRAleatoire(tmr => accessible(tmr) && !innaccessible.includes(tmr.coord)); ChatMessage.create({ content: `${raison} : ré-insertion aléatoire.`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name) + whisper: ChatUtility.getOwners(this) }); await this.forcerPositionTMRInconnue(tmr); return tmr; @@ -1082,7 +1082,7 @@ export class RdDActor extends RdDBaseActorSang { const jetMoral = await this._jetDeMoral(situation); const finMessage = (jetMoral.succes ? messageReussi : messageManque) ?? (jetMoral.ajustement == 0 ? "Vous gardez votre moral" : jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral"); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}).` }); return jetMoral.ajustement; @@ -1419,7 +1419,7 @@ export class RdDActor extends RdDBaseActorSang { }; ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-transformer-stress.html`, stressRollData) }); @@ -1505,7 +1505,7 @@ export class RdDActor extends RdDBaseActorSang { } if (display) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html`, checkXp) }); } @@ -1537,7 +1537,7 @@ export class RdDActor extends RdDBaseActorSang { } if (display) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.html`, checkXp) }); } @@ -1563,7 +1563,7 @@ export class RdDActor extends RdDBaseActorSang { } else { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: content }); } @@ -1666,7 +1666,7 @@ export class RdDActor extends RdDBaseActorSang { } ChatMessage.create({ content: "Vous êtes sous le coup d'une Mauvaise Rencontre en Persective." + addMsg, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } return rencSpecial; @@ -1678,7 +1678,7 @@ export class RdDActor extends RdDBaseActorSang { if (countInertieDraconique > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'Inertie Draconique : vous perdrez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } return countInertieDraconique + 1; @@ -1690,7 +1690,7 @@ export class RdDActor extends RdDBaseActorSang { await this.reveActuelIncDec(-1); ChatMessage.create({ content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).", - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } } @@ -2270,7 +2270,7 @@ export class RdDActor extends RdDBaseActorSang { // Cas de désir lancinant, pas d'expérience sur particulière ChatMessage.create({ content: `Vous souffrez au moins d'un Désir Lancinant, vous ne pouvez pas gagner d'expérience sur une Particulière tant que le désir n'est pas assouvi`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); return [] } @@ -2405,7 +2405,7 @@ export class RdDActor extends RdDBaseActorSang { if (countMonteeLaborieuse > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteeLaborieuse} Point de Rêve de plus.`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } return countMonteeLaborieuse; @@ -2453,7 +2453,7 @@ export class RdDActor extends RdDBaseActorSang { if (this.getReveActuel() < minReveValue) { ChatMessage.create({ content: `Vous n'avez les ${minReveValue} Points de Reve nécessaires pour monter dans les Terres Médianes`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); return; } @@ -2850,7 +2850,7 @@ export class RdDActor extends RdDBaseActorSang { await this.setBonusPotionSoin(potionData.system.herbebonus); } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData) }); } @@ -2887,7 +2887,7 @@ export class RdDActor extends RdDBaseActorSang { this.bonusRepos = potionData.system.herbebonus; } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData) }); } @@ -2919,7 +2919,7 @@ export class RdDActor extends RdDBaseActorSang { this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html`, messageData) }); } @@ -2944,7 +2944,7 @@ export class RdDActor extends RdDBaseActorSang { } } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.html`, potionData) }); } @@ -3044,7 +3044,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ notifyGestionTeteSouffleQueue(item, manualMessage = true) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `${this.name} a reçu un/une ${item.type}: ${item.name}, qui ${manualMessage ? "n'est pas" : "est"} géré(e) automatiquement. ${manualMessage ? manualMessage : ''}` }); } diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 32015d56..06b560f5 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -189,7 +189,7 @@ export class RdDBaseActorReve extends RdDBaseActor { getEffect(effectId) { return this.getEmbeddedCollection("ActiveEffect").find(it => it.statuses?.has(effectId)); } - + async setEffect(effectId, status) { if (this.isEffectAllowed(effectId)) { const effect = this.getEffect(effectId); @@ -201,7 +201,7 @@ export class RdDBaseActorReve extends RdDBaseActor { } } } - + async removeEffect(id) { const effect = this.getEmbeddedCollection("ActiveEffect").find(it => it.id == id); if (effect) { @@ -296,7 +296,7 @@ export class RdDBaseActorReve extends RdDBaseActor { /* -------------------------------------------- */ async rollCarac(caracName, jetResistance = undefined) { - if (Grammar.equalsInsensitive(caracName, 'taille')){ + if (Grammar.equalsInsensitive(caracName, 'taille')) { return } RdDEmpoignade.checkEmpoignadeEnCours(this) @@ -418,9 +418,9 @@ export class RdDBaseActorReve extends RdDBaseActor { return; } const armure = await this.computeArmure(rollData); - if (ReglesOptionnelles.isUsing('validation-encaissement-gr')){ + if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) { await this.encaisserDommagesValidationGR(rollData, armure, attacker?.id, show); - } + } else { const jet = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE }); await this.$onEncaissement(jet, show, attacker); @@ -456,16 +456,19 @@ export class RdDBaseActorReve extends RdDBaseActor { show: show ?? {} }); - await ChatUtility.createChatWithRollMode(this.name, { - roll: encaissement.roll, - content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement) - }); + await ChatUtility.createChatWithRollMode( + { + roll: encaissement.roll, + content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement) + }, + this + ) if (!encaissement.hasPlayerOwner && encaissement.endurance != 0) { - encaissement = foundry.utils.duplicate(encaissement); - encaissement.isGM = true; + encaissement = foundry.utils.duplicate(encaissement) + encaissement.isGM = true ChatMessage.create({ - whisper: ChatMessage.getWhisperRecipients("GM"), + whisper: ChatUtility.getGMs(), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement) }); } diff --git a/module/actor/base-actor-sang-sheet.js b/module/actor/base-actor-sang-sheet.js index 2d45db03..2dcd511a 100644 --- a/module/actor/base-actor-sang-sheet.js +++ b/module/actor/base-actor-sang-sheet.js @@ -39,8 +39,8 @@ export class RdDBaseActorSangSheet extends RdDBaseActorReveSheet { ChatMessage.create({ content: `Jet d'Endurance : ${result.jetEndurance} / ${endurance}
${this.actor.name} a ${result.sonne ? 'échoué' : 'réussi'} son Jet d'Endurance ${result.sonne ? 'et devient Sonné' : ''}`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.actor.name) - }); + whisper: ChatUtility.getOwners(this.actor) + }) } } diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index 6e784920..978c27c2 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -5,6 +5,7 @@ import { ITEM_TYPES } from "../item.js"; import { RdDBaseActorReve } from "./base-actor-reve.js"; import { RdDDice } from "../rdd-dice.js"; import { RdDItemBlessure } from "../item/blessure.js"; +import { ChatUtility } from "../chat-utility.js"; /** * Classe de base pour les acteurs qui peuvent subir des blessures @@ -180,7 +181,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve { } } const endActuelle = this.getEnduranceActuelle(); - const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ??'', attacker); + const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ?? '', attacker); if (blessure.isCritique()) { encaissement.endurance = endActuelle; } @@ -196,9 +197,9 @@ export class RdDBaseActorSang extends RdDBaseActorReve { return blessure; } - async supprimerBlessure({gravite}) { + async supprimerBlessure({ gravite }) { const toDelete = this.itemTypes[ITEM_TYPES.blessure].find(it => it.system.gravite == gravite)?.id - if (toDelete){ + if (toDelete) { await this.deleteEmbeddedDocuments('Item', [toDelete]); } } @@ -216,7 +217,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve { /* -------------------------------------------- */ async jetDeVie() { if (this.isDead()) { - ChatMessage.create({ content: `Jet de Vie: ${this.name} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, whisper: ChatMessage.getWhisperRecipients(this.name) }); + ChatMessage.create({ + content: `Jet de Vie: ${this.name} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, + whisper: ChatUtility.getOwners(this) + }) return } const jetDeVie = await RdDDice.roll("1d20"); @@ -243,7 +247,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve { else if (prochainJet > 0) { msgText += `
Prochain jet de vie dans ${prochainJet} ${isCritique ? 'round' : 'minute'}${prochainJet > 1 ? 's' : ''} ${isCritique ? '(état critique)' : '(état grave)'}` } - ChatMessage.create({ content: msgText, whisper: ChatMessage.getWhisperRecipients(this.name) }); + ChatMessage.create({ + content: msgText, + whisper: ChatUtility.getOwners(this) + }); } /* -------------------------------------------- */ diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index 228181ad..57fbcb07 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -270,6 +270,7 @@ export class RdDBaseActor extends Actor { } let fortune = this.getFortune(); console.log("payer", game.user.character, depense, fortune); + // TODO: passer en handlebars let msg = ""; if (fortune >= depense) { await Monnaie.optimiserFortune(this, fortune - depense); @@ -279,11 +280,10 @@ export class RdDBaseActor extends Actor { msg = "Vous n'avez pas assez d'argent pour payer cette somme !"; } - let message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + ChatMessage.create({ + whisper: ChatUtility.getOwners(this), content: msg - }; - ChatMessage.create(message); + }) } async depenserSols(sols) { @@ -317,7 +317,7 @@ export class RdDBaseActor extends Actor { RdDAudio.PlayContextAudio("argent"); // Petit son ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this.name), content: `Vous avez reçu ${sols} Sols ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés à votre argent.` }); } @@ -371,7 +371,7 @@ export class RdDBaseActor extends Actor { ChatMessage.create({ user: achat.userId, speaker: { alias: (acheteur ?? vendeur).name }, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', chatAchatItem) }); diff --git a/module/chat-utility.js b/module/chat-utility.js index 6e0386ff..76792c86 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -8,15 +8,20 @@ import { RdDTimestamp } from "./time/rdd-timestamp.js"; */ export class ChatUtility { + static async init() { + Hooks.on("renderChatMessage", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg)) + Hooks.on("createChatMessage", async (chatMessage, options, id) => await ChatUtility.onCreateChatMessage(chatMessage, options, id)) + } + /* -------------------------------------------- */ static onSocketMessage(sockmsg) { switch (sockmsg.msg) { - case "msg_delete_chat_message": return ChatUtility.onRemoveMessages(sockmsg.data); - case "msg_user_ui_notifications": return ChatUtility.onNotifyUser(sockmsg.data); + case "msg_gm_chat_message": return ChatUtility.handleGMChatMessage(sockmsg.data) + case "msg_delete_chat_message": return ChatUtility.onRemoveMessages(sockmsg.data) + case "msg_user_ui_notifications": return ChatUtility.onNotifyUser(sockmsg.data) } } - /* -------------------------------------------- */ static notifyUser(userId, level = 'info', message) { const socketData = { @@ -78,73 +83,90 @@ export class ChatUtility { } /* -------------------------------------------- */ - static async createChatWithRollMode(name, chatOptions) { - let rollMode = game.settings.get("core", "rollMode") - switch (rollMode) { + static async createChatWithRollMode(messageData, actor = undefined) { + switch (game.settings.get("core", "rollMode")) { case "blindroll": // GM only if (!game.user.isGM) { - ChatUtility.blindMessageToGM(chatOptions); - - chatOptions.whisper = [game.user.id]; - chatOptions.content = "Message envoyé en aveugle au Gardien"; + ChatUtility.blindMessageToGM(messageData) + messageData.whisper = [game.user]; + messageData.content = "Message envoyé en aveugle au Gardien" } else { - chatOptions.whisper = ChatUtility.getUsers(user => user.isGM); + messageData.whisper = ChatUtility.getGMs() } - break; - default: - chatOptions.whisper = ChatUtility.getWhisperRecipients(rollMode, name); - break; + break + case "gmroll": + messageData.whisper = ChatUtility.getOwners(actor) + break + case "selfroll": + messageData.whisper = [game.user] + break } - chatOptions.alias = chatOptions.alias || name; - return await ChatMessage.create(chatOptions); + messageData.alias = messageData.alias ?? actor?.name ?? game.user.name + return await ChatMessage.create(messageData) + } + + static getOwners(document) { + return game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) + } + + static getUserAndGMs() { + return [game.user, ...ChatUtility.getGMs()] } /* -------------------------------------------- */ - static prepareChatMessage(rollMode, name) { - return { - user: game.user.id, - whisper: ChatUtility.getWhisperRecipients(rollMode, name) - } - } - - /* -------------------------------------------- */ - static getWhisperRecipients(rollMode, name) { - switch (rollMode) { - case "blindroll": return ChatUtility.getUsers(user => user.isGM); - case "gmroll": return ChatUtility.getWhisperRecipientsAndGMs(name); - case "selfroll": return [game.user.id]; - } - return undefined; - } - - /* -------------------------------------------- */ - static getWhisperRecipientsAndGMs(...names) { - let recipients = [...ChatMessage.getWhisperRecipients('GM')] - names.forEach(name => recipients.push(...ChatMessage.getWhisperRecipients(name))) - return recipients + static getMultipleActorsOwners(...actors) { + return Misc.concat(actors.map(it => it == undefined ? [] : ChatUtility.getOwners(it))) } /* -------------------------------------------- */ static getUsers(filter) { - return game.users.filter(filter).map(user => user.id); + return game.users.filter(filter) + } + + static getGMs() { + return game.users.filter(user => user.isGM) + } + + static applyRollMode(chatMessageData = {}, rollMode = game.settings.get("core", "rollMode")) { + switch (rollMode) { + case "blindroll": + chatMessageData.blind = true + chatMessageData.whisper = ChatUtility.getGMs() + break + case "gmroll": + chatMessageData.whisper = ChatUtility.getGMs() + chatMessageData.blind = false + break + case "roll": + chatMessageData.whisper = ChatUtility.getUsers(user => user.active) + chatMessageData.blind = false + break + case "selfroll": + chatMessageData.whisper = [game.user] + chatMessageData.blind = false + break + } + return chatMessageData } /* -------------------------------------------- */ static blindMessageToGM(chatOptions) { - let chatGM = foundry.utils.duplicate(chatOptions); - chatGM.whisper = ChatUtility.getUsers(user => user.isGM); - chatGM.content = "Message aveugle de " + game.user.name + "
" + chatOptions.content; - console.log("blindMessageToGM", chatGM); - game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_gm_chat_message", data: chatGM }); + const chatGM = foundry.utils.duplicate(chatOptions) + chatGM.content = "Message aveugle de " + game.user.name + "
" + chatOptions.content + console.log("blindMessageToGM", chatGM) + game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_gm_chat_message", data: chatGM }) } /* -------------------------------------------- */ static handleGMChatMessage(socketData) { console.log("blindMessageToGM", socketData); - if (game.user.isGM) { // message privé pour GM only - socketData.user = game.user.id; - ChatMessage.create(socketData); + if (Misc.firstConnectedGM()) { + ChatMessage.create({ + user: game.user.id, + whisper: ChatUtility.getGMs(), + content: socketData.content + }) } } diff --git a/module/coeur/rdd-coeur.js b/module/coeur/rdd-coeur.js index 4b85988f..f5a4a7f5 100644 --- a/module/coeur/rdd-coeur.js +++ b/module/coeur/rdd-coeur.js @@ -30,7 +30,8 @@ export class RdDCoeur { } static extractInfoCoeur(event) { - return ChatUtility.getMessageData(ChatUtility.getChatMessage(event), INFO_COEUR) + const chatMesage = ChatUtility.getChatMessage(event); + return ChatUtility.getMessageData(chatMesage, INFO_COEUR) } static getInfoCoeur(sourceActorId, targetActorId) { @@ -98,12 +99,11 @@ export class RdDCoeur { static async startSubActeurTendreMoment(actorId, subActeurId) { const infoCoeur = RdDCoeur.getInfoCoeur(actorId, subActeurId) - if (infoCoeur.target?.actor.id) { + if (infoCoeur.target?.actor?.id) { // TODO: passer par une fenêtre pour saisir sa proposition (lieu, heure, ...) - const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-proposer-tendre-moment.hbs`, infoCoeur) const chatMessage = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(infoCoeur.target?.actor.name), - content: chatHtml + whisper: ChatUtility.getOwners(infoCoeur.target.actor), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-proposer-tendre-moment.hbs`, infoCoeur) }) RdDCoeur.addTagsInfoCoeur(infoCoeur, chatMessage) } @@ -127,7 +127,7 @@ export class RdDCoeur { } const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-accepter-tendre-moment.hbs`, infoCoeur) const chatMessage = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(infoCoeur.source?.actor.name, infoCoeur.target?.actor.name), + whisper: ChatUtility.getMultipleActorsOwners(infoCoeur.source?.actor, infoCoeur.target?.actor), content: chatHtml }) RdDCoeur.addTagsInfoCoeur(infoCoeur, chatMessage) @@ -142,7 +142,7 @@ export class RdDCoeur { ChatUtility.removeChatMessageId(infoCoeur.chatMessageId) const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-refuser-tendre-moment.hbs`, infoCoeur) await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(infoCoeur.source?.actor.name, infoCoeur.target?.actor.name), + whisper: ChatUtility.getMultipleActorsOwners(infoCoeur.source?.actor, infoCoeur.target?.actor), content: chatHtml }); } diff --git a/module/dialog-chronologie.js b/module/dialog-chronologie.js index 781e31d1..5168870d 100644 --- a/module/dialog-chronologie.js +++ b/module/dialog-chronologie.js @@ -8,7 +8,7 @@ const LATEST_USED_JOURNAL_ID = "chronologie-dernier-journal"; export class DialogChronologie extends Dialog { - static init() { + static initSettings() { game.settings.register(SYSTEM_RDD, LATEST_USED_JOURNAL_ID, { name: "Dernier article de journal utilisé pour enregistrer la chronologie", scope: "client", diff --git a/module/dialog-create-signedraconique.js b/module/dialog-create-signedraconique.js index 48cc1654..0f50f21c 100644 --- a/module/dialog-create-signedraconique.js +++ b/module/dialog-create-signedraconique.js @@ -48,7 +48,7 @@ export class DialogCreateSigneDraconique extends Dialog { async _createSigneForActor(actor, signe) { actor.createEmbeddedDocuments("Item", [signe]); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), + whisper: ChatUtility.getOwners(actor), content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", { signe: signe, alias: actor.name diff --git a/module/environnement.js b/module/environnement.js index 2cb70e9c..c9071b45 100644 --- a/module/environnement.js +++ b/module/environnement.js @@ -7,7 +7,7 @@ import { CompendiumTableHelpers, CompendiumTable, SystemCompendiums } from "./se const COMPENDIUMS_RECHERCHE = 'compendiums-recherche'; export class Environnement { - static init() { + static initSettings() { game.settings.register(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, { name: COMPENDIUMS_RECHERCHE, default: [ diff --git a/module/item/blessure.js b/module/item/blessure.js index 04db4238..14c63724 100644 --- a/module/item/blessure.js +++ b/module/item/blessure.js @@ -62,7 +62,7 @@ export class RdDItemBlessure extends RdDItem { content: `Blessure ${definition.label} appliquée à ${actor.name}`+ `
Perte d'endurance : ${lostEndurance}`+ `
Perte de Vie : ${lostVie}`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name) + whisper: ChatUtility.getOwners(actor) }); } diff --git a/module/item/maladie.js b/module/item/maladie.js index c6cef1cf..bdf85e04 100644 --- a/module/item/maladie.js +++ b/module/item/maladie.js @@ -1,3 +1,4 @@ +import { ChatUtility } from "../chat-utility.js"; import { RdDItem } from "../item.js"; import { Misc } from "../misc.js"; import { RdDTimestamp } from "../time/rdd-timestamp.js"; @@ -21,9 +22,12 @@ export class RdDItemMaladie extends RdDItem { const souffrance = mal.system.identifie ? `de ${mal.name}` : `d'un mal inconnu` - ChatMessage.create({ content: `${mal.actor.name} souffre ${souffrance} (${Misc.typeName('Item', mal.type)}): vérifiez que les effets ne se sont pas aggravés !` }); - mal.postItemToChat('gmroll'); - await RdDItemMaladie.prolongerPeriode(mal,oldTimestamp, newTimestamp); + ChatMessage.create({ + whisper: ChatUtility.getOwners(mal.actor), + content: `${mal.actor.name} souffre ${souffrance} (${Misc.typeName('Item', mal.type)}): vérifiez que les effets ne se sont pas aggravés !` + }) + mal.postItemToChat('gmroll') + await RdDItemMaladie.prolongerPeriode(mal, oldTimestamp, newTimestamp) } } diff --git a/module/rdd-combat.js b/module/rdd-combat.js index be55bc5a..68947438 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -54,10 +54,10 @@ export class RdDCombatManager extends Combat { /* -------------------------------------------- */ async onPreDeleteCombat() { if (Misc.isUniqueConnectedGM()) { - await this.finDeRound({ terminer: true }); + await this.finDeRound({ terminer: true }) ChatUtility.removeChatMessageContaining(`
`) game.messages.filter(m => ChatUtility.getMessageData(m, 'attacker-roll') != undefined && ChatUtility.getMessageData(m, 'defender-roll') != undefined) - .forEach(it => it.delete()); + .forEach(it => it.delete()) RdDEmpoignade.deleteAllEmpoignades() } } @@ -698,7 +698,7 @@ export class RdDCombat { if (this.defender.isEntite([ENTITE_BLURETTE])) { ChatMessage.create({ content: `La cible est une blurette, l'arme à distance sera perdue dans le blurêve`, - whisper: ChatMessage.getWhisperRecipients("GM") + whisper: ChatUtility.getGMs() }) } else { @@ -721,7 +721,7 @@ export class RdDCombat { activite: activite, total: total }), - whisper: ChatMessage.getWhisperRecipients("GM") + whisper: ChatUtility.getGMs() }) } } @@ -846,7 +846,7 @@ export class RdDCombat { const choixParticuliere = await ChatMessage.create({ alias: this.attacker.name, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), + whisper: ChatUtility.getOwners(this.attacker), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', { alias: this.attacker.name, attackerId: this.attackerId, @@ -933,7 +933,7 @@ export class RdDCombat { // message privé: du défenseur à lui même (et aux GMs) speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)), alias: this.attacker.name, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.defender.name), + whisper: ChatUtility.getOwners(this.defender), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', paramDemandeDefense), }); // flag pour garder les jets d'attaque/defense @@ -976,7 +976,7 @@ export class RdDCombat { /* -------------------------------------------- */ async _onAttaqueEchecTotal(attackerRoll) { const choixEchecTotal = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), + whisper: ChatUtility.getOwners(this.attacker), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', { attackerId: this.attackerId, attacker: this.attacker, @@ -994,9 +994,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(this.defender.name, { - content: `Maladresse à ${action}! ` + await RdDRollTables.getMaladresse({ arme: avecArme }) - }); + ChatUtility.createChatWithRollMode( + { content: `Maladresse à ${action}! ` + await RdDRollTables.getMaladresse({ arme: avecArme }) }, + this.defender) } /* -------------------------------------------- */ @@ -1076,9 +1076,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(this.defender.name, { - content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` - }); + ChatUtility.createChatWithRollMode( + { content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` }, + this.defender) } } @@ -1152,9 +1152,9 @@ export class RdDCombat { /* -------------------------------------------- */ _onEsquiveParticuliere(rollData) { console.log("RdDCombat._onEsquiveParticuliere >>>", rollData); - ChatUtility.createChatWithRollMode(this.defender.name, { - content: "Vous pouvez esquiver une deuxième fois!" - }); + ChatUtility.createChatWithRollMode( + { content: "Vous pouvez esquiver une deuxième fois!" }, + this.defender); } /* -------------------------------------------- */ @@ -1322,10 +1322,10 @@ export class RdDCombat { await ChatMessage.create({ content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData), alias: actor.name - }); + }) await ChatMessage.create({ content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData), - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), + whisper: ChatUtility.getOwners(actor), alias: actor.name }); } diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 03b0ba8e..fcaa5b4f 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -17,6 +17,7 @@ import { RdDUtility } from "./rdd-utility.js"; import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js"; import { TMRUtility } from "./tmr-utility.js"; import { DialogFatigueVoyage } from "./voyage/dialog-fatigue-voyage.js"; +import { ChatUtility } from "./chat-utility.js"; const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/; @@ -206,26 +207,20 @@ export class RdDCommands { /* Manage chat commands */ processChatCommand(commandLine, content = '', msg = {}) { // Setup new message's visibility - let rollMode = game.settings.get("core", "rollMode"); - if (["gmroll", "blindroll"].includes(rollMode)) { - msg["whisper"] = ChatMessage.getWhisperRecipients("GM"); - } - if (rollMode === "blindroll") { - msg["blind"] = true; - } - msg["type"] = 0; + ChatUtility.applyRollMode(msg) + msg.type = 0; if (!this.commandsTable) { - this._registerCommands(); + this._registerCommands() } let command = commandLine[0].toLowerCase(); if (this._isCommandHandled(command)) { let params = commandLine.slice(1); - this._processCommand(this.commandsTable, command, params, content, msg); - return true; + this._processCommand(this.commandsTable, command, params, content, msg) + return true } - return false; + return false } _isCommandHandled(command) { @@ -300,7 +295,7 @@ export class RdDCommands { async getRencontreTMR(params) { if (params.length == 1 || params.length == 2) { return game.system.rdd.rencontresTMR.rollRencontre(params[0], params[1]) - } + } return false; } diff --git a/module/rdd-dice.js b/module/rdd-dice.js index cdc5c74f..b837e15b 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -2,19 +2,14 @@ import { ChatUtility } from "./chat-utility.js"; import { HIDE_DICE, SHOW_DICE } from "./constants.js"; import { Misc } from "./misc.js"; -function img(src) { - return `` -} - -function iconHeure(heure) { +const imgHeures = [1, 2, 3, 4, 5, 6, 7, 9, 9, 10, 11, 12].map(heure => { if (heure < 10) { heure = '0' + heure; } - return `systems/foundryvtt-reve-de-dragon/icons/heures/hd${heure}.webp` -} -const imagesHeures = [1, 2, 3, 4, 5, 6, 7, 9, 9, 10, 11, 12].map(it => iconHeure(it)); + return `` +}) -const imgSigneDragon = img(imagesHeures[4]); +const imgSigneDragon = imgHeures[4] /** De pour les jets de rencontre */ export class DeTMR extends Die { @@ -25,7 +20,7 @@ export class DeTMR extends Die { return { type: "dt", font: "HeuresDraconiques", - fontScale: 0.7, + fontScale: 0.8, labels: ['1', '2', '3', '4', '5', '6', 'd', '0'], system: system } @@ -37,13 +32,13 @@ export class DeTMR extends Die { } async evaluate(options) { - await super.evaluate(options); - this.explode("x=8"); + await super.evaluate(options) + await this.reroll('r=8', { recursive: true }) return this; } get total() { - return this.values.filter(it => it != 8).reduce(Misc.sum(), 0); + return this.values.map(it => Misc.modulo(it, 8)).reduce(Misc.sum(), 0); } getResultLabel(diceTerm) { @@ -56,13 +51,14 @@ export class DeTMR extends Die { /** DeDraconique pour le D8 sans limite avec 8=>0 */ export class DeDraconique extends Die { + /** @override */ static DENOMINATION = "r"; static diceSoNiceData(system) { return { type: "dr", font: "HeuresDraconiques", - fontScale: 0.7, + fontScale: 0.8, labels: ['1', '2', '3', '4', '5', '6', 'd', '0'], system: system } @@ -75,7 +71,7 @@ export class DeDraconique extends Die { async evaluate(options) { await super.evaluate(options); - this.explode("x=7"); + await this.explode("x=7"); return this; } @@ -85,7 +81,7 @@ export class DeDraconique extends Die { getResultLabel(diceTerm) { switch (diceTerm.result) { - case 7: return imgSigneDragon; + case 7: return imgSigneDragon case 8: return '0'; } return diceTerm.result.toString(); @@ -102,6 +98,7 @@ export class DeHeure extends Die { return { type: "dh", font: "HeuresDraconiques", + fontScale: 1.2, labels: ['v', 'i', 'f', 'o', 'd', 'e', 'l', 's', 'p', 'a', 'r', 'c'], system: system } @@ -113,15 +110,15 @@ export class DeHeure extends Die { } getResultLabel(diceTerm) { - return img(imagesHeures[diceTerm.result - 1]); + return imgHeures[diceTerm.result - 1] } } export class RdDDice { static init() { - CONFIG.Dice.terms[DeTMR.DENOMINATION] = DeTMR; - CONFIG.Dice.terms[DeDraconique.DENOMINATION] = DeDraconique; - CONFIG.Dice.terms[DeHeure.DENOMINATION] = DeHeure; + CONFIG.Dice.terms[DeTMR.DENOMINATION] = DeTMR + CONFIG.Dice.terms[DeDraconique.DENOMINATION] = DeDraconique + CONFIG.Dice.terms[DeHeure.DENOMINATION] = DeHeure } static onReady() { @@ -132,6 +129,14 @@ export class RdDDice { } } + static diceSoNiceReady(dice3d) { + dice3d.DiceFactory.systems.keys().forEach(system => { + dice3d.addDicePreset(DeTMR.diceSoNiceData(system)); + dice3d.addDicePreset(DeDraconique.diceSoNiceData(system)); + dice3d.addDicePreset(DeHeure.diceSoNiceData(system)); + }) + } + static async rollHeure(options = { showDice: HIDE_DICE }) { return await RdDDice.rollTotal("1dh", options) - 1 } @@ -155,21 +160,13 @@ export class RdDDice { return array[roll - 1]; } - static diceSoNiceReady(dice3d) { - for (const system of Object.keys(dice3d.DiceFactory.systems)) { - dice3d.addDicePreset(DeTMR.diceSoNiceData(system)); - dice3d.addDicePreset(DeDraconique.diceSoNiceData(system)); - dice3d.addDicePreset(DeHeure.diceSoNiceData(system)); - } - } - /* -------------------------------------------- */ static async showDiceSoNice(roll, options) { if (options.showDice == HIDE_DICE || !game.modules.get("dice-so-nice")?.active || !game.dice3d) { return; } - let { whisper, blind } = RdDDice._getWhisperBlind(options); + let { whisper, blind } = ChatUtility.applyRollMode({}, options?.rollMode); if (options.forceDiceResult?.total) { let terms = await RdDDice._getForcedTerms(options); if (terms) { @@ -223,24 +220,4 @@ export class RdDDice { await roll.evaluate(); return roll.total; } - - static _getWhisperBlind(options) { - let whisper = undefined; - let blind = false; - let rollMode = options.rollMode ?? game.settings.get("core", "rollMode"); - switch (rollMode) { - case "blindroll": //GM only - blind = true; - case "gmroll": //GM + rolling player - whisper = ChatUtility.getUsers(user => user.isGM); - break; - case "roll": //everybody - whisper = ChatUtility.getUsers(user => user.active); - break; - case "selfroll": - whisper = [game.user.id]; - break; - } - return { whisper, blind }; - } } \ No newline at end of file diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index 81c3b965..50307a4e 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -158,9 +158,12 @@ export class RdDEmpoignade { empoignade = empoignade ?? (await RdDEmpoignade.createEmpoignade(attacker, defender)) //console.log("W.", empoignade, defender.hasArmeeMeleeEquipee()) if ((isNouvelle || empoignade.system.pointsemp == 0) && defender.hasArmeeMeleeEquipee()) { - ChatUtility.createChatWithRollMode(attacker.name, { - content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.html`, { attacker: attacker, defender: defender }) - }) + ChatUtility.createChatWithRollMode( + { + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.html`, { attacker: attacker, defender: defender }) + }, + attacker + ) } else { await this.onAttaqueEmpoignadeValidee(attacker, defender) } @@ -213,7 +216,7 @@ export class RdDEmpoignade { competence: attacker.getCompetenceCorpsACorps() } const msg = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(attacker.name), + whisper: ChatUtility.getOwners(attacker), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-immobilise.html`, rollData) }) RdDEmpoignade.$storeRollEmpoignade(msg, rollData); @@ -300,7 +303,7 @@ export class RdDEmpoignade { /* -------------------------------------------- */ static async $onRollContrerLiberer(rollData) { let empoignade = rollData.empoignade - + if (rollData.mode == "contrer-empoigner" && !rollData.rolled.isSuccess) { empoignade.system.pointsemp++ RdDEmpoignade.$updateEtatEmpoignade(empoignade) @@ -309,7 +312,7 @@ export class RdDEmpoignade { empoignade.system.pointsemp-- RdDEmpoignade.$updateEtatEmpoignade(empoignade) } - + await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-empoignade-resultat.html') if (empoignade.system.pointsemp >= 2) { let msg = await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-empoignade-entrainer.html'); diff --git a/module/rdd-hotbar-drop.js b/module/rdd-hotbar-drop.js index 7bb6db05..979c2a08 100644 --- a/module/rdd-hotbar-drop.js +++ b/module/rdd-hotbar-drop.js @@ -79,8 +79,7 @@ export class RdDHotbar { * Actor - open actor sheet * Journal - open journal sheet */ - static init() { - + static initHooks() { Hooks.on('hotbarDrop', (bar, documentData, slot) => { // Create item macro if rollable item - weapon, spell, prayer, trait, or skill diff --git a/module/rdd-main.js b/module/rdd-main.js index 7dca3faa..18778107 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -61,7 +61,7 @@ import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js" import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js" import { AppAstrologie } from "./sommeil/app-astrologie.js" import { RdDItemArmure } from "./item/armure.js" -import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js" +import { AutoAdjustDarkness } from "./time/auto-adjust-darkness.js" import { RdDCreature } from "./actor/creature.js" import { RdDTMRDialog } from "./rdd-tmr-dialog.js" import { OptionsAvancees } from "./settings/options-avancees.js" @@ -80,7 +80,7 @@ export class SystemReveDeDragon { const system = new SystemReveDeDragon() Hooks.once('init', async () => await system.onInit()) Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d)) - Hooks.once('ready', () => system.onReady()) + Hooks.once('ready', async () => await system.onReady()) } constructor() { @@ -115,24 +115,31 @@ export class SystemReveDeDragon { game.system.rdd = this this.AppAstrologie = AppAstrologie - - console.log(`Initializing Reve de Dragon System`) + console.log(`Initializing Reve de Dragon System Settings`) // preload handlebars templates RdDUtility.preloadHandlebarsTemplates() AppPersonnageAleatoire.preloadHandlebars() /* -------------------------------------------- */ - this.initSystemSettings() + ReglesOptionnelles.initSettings() + OptionsAvancees.initSettings() + AutoAdjustDarkness.initSettings() + RdDTimestamp.initSettings() + RdDCalendrier.initSettings() + SystemCompendiums.initSettings() + DialogChronologie.initSettings() + RdDTMRDialog.initSettings() + Environnement.initSettings() + + this.initSettings() /* -------------------------------------------- */ // Set an initiative formula for the system - CONFIG.Combat.initiative = { - formula: "1+(1d6/10)", - decimals: 2 - } + CONFIG.Combat.initiative = { formula: "1+(1d6/10)", decimals: 2 } /* -------------------------------------------- */ + console.log(`Initializing Reve de Dragon Socket handlers`) game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => { console.log(">>>>> MSG RECV", sockmsg) try { @@ -147,6 +154,7 @@ export class SystemReveDeDragon { /* -------------------------------------------- */ // Define custom Entity classes + console.log(`Initializing Reve de Dragon Documents`) CONFIG.Actor.documentClass = RdDBaseActor CONFIG.Item.documentClass = RdDItem CONFIG.RDD = { @@ -192,17 +200,12 @@ export class SystemReveDeDragon { "tarot", "extraitpoetique", "empoignade" ], makeDefault: true }) - CONFIG.Combat.documentClass = RdDCombatManager // préparation des différents modules - AutoAdjustDarkness.init() - RdDTimestamp.init() - RdDCalendrier.init() - SystemCompendiums.init() - DialogChronologie.init() - ReglesOptionnelles.init() - OptionsAvancees.init() - RdDUtility.init() + console.log(`Initializing Reve de Dragon Hooks and handlers`) + CONFIG.Combat.documentClass = RdDCombatManager + ChatUtility.init() + RdDUtility.initHooks() RdDDice.init() RdDCommands.init() RdDCombatManager.init() @@ -211,15 +214,14 @@ export class SystemReveDeDragon { RdDCompendiumOrganiser.init() EffetsDraconiques.init() TMRUtility.init() - await RdDTMRDialog.init() - RdDHotbar.init() + RdDHotbar.initHooks() RdDPossession.init() TMRRencontres.init() - Environnement.init() ExportScriptarium.init() } - initSystemSettings() { + initSettings() { + // TODO: déplacer vers les modules correspondants game.settings.register(SYSTEM_RDD, "accorder-entite-cauchemar", { name: "Accorder le rêve aux entités", hint: "A quel moment les personnages doivent accorder leur rêve aux entités de cauchemar", @@ -318,4 +320,3 @@ export class SystemReveDeDragon { } SystemReveDeDragon.start() - diff --git a/module/rdd-meteo.js b/module/rdd-meteo.js index 8a705747..6b4266b3 100644 --- a/module/rdd-meteo.js +++ b/module/rdd-meteo.js @@ -1,3 +1,4 @@ +import { ChatUtility } from "./chat-utility.js" const vents = [ { min: 0, max: 0, valeur: 'Calme' }, @@ -117,7 +118,7 @@ export class RdDMeteo { ChatMessage.create({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.html', meteo), - whisper: ChatMessage.getWhisperRecipients('GM') + whisper: ChatUtility.getGMs() }); } diff --git a/module/rdd-namegen.js b/module/rdd-namegen.js index 80a47450..a5f27067 100644 --- a/module/rdd-namegen.js +++ b/module/rdd-namegen.js @@ -1,4 +1,5 @@ import { RdDBaseActor } from "./actor/base-actor.js"; +import { ChatUtility } from "./chat-utility.js"; import { Misc } from "./misc.js"; import { RdDDice } from "./rdd-dice.js"; @@ -15,7 +16,7 @@ export class RdDNameGen { const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-command-nom.html`, { nom: await RdDNameGen.generate() }); - ChatMessage.create({ content: html, whisper: ChatMessage.getWhisperRecipients("GM") }); + ChatMessage.create({ content: html, whisper: ChatUtility.getGMs() }); } static async generate() { diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index f8b341e2..d231370c 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -91,13 +91,14 @@ export class RdDResolutionTable { /* -------------------------------------------- */ static async displayRollData(rollData, actor = undefined, template = 'chat-resultat-general.html') { - return await ChatUtility.createChatWithRollMode(RdDResolutionTable.actorChatName(actor), { - content: await RdDResolutionTable.buildRollDataHtml(rollData, template) - }); + return await ChatUtility.createChatWithRollMode( + { content: await RdDResolutionTable.buildRollDataHtml(rollData, template) }, + actor + ) } static actorChatName(actor) { - return actor?.name ?? game.user.name; + return actor ?? game.user.name; } /* -------------------------------------------- */ @@ -138,14 +139,14 @@ export class RdDResolutionTable { if (carac == 0) { return NaN; } - if (rolled >= carac){ - const upper = Math.ceil(rolled/carac); - return 2*upper -10 + if (rolled >= carac) { + const upper = Math.ceil(rolled / carac); + return 2 * upper - 10 } - if (rolled > Math.floor(carac/2)) { + if (rolled > Math.floor(carac / 2)) { return -8 } - if (rolled > Math.floor(carac/4)) { + if (rolled > Math.floor(carac / 4)) { return -9 } if (rolled > 1) { @@ -265,7 +266,7 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static subTable(carac, level, delta = { carac: 2, level: 5}) { + static subTable(carac, level, delta = { carac: 2, level: 5 }) { return { carac, level, @@ -287,8 +288,8 @@ export class RdDResolutionTable { carac: carac, difficulte: level, min: minLevel, - rows: Misc.intArray(minCarac, maxCarac+1), - cols: Misc.intArray(minLevel, maxLevel+1) + rows: Misc.intArray(minCarac, maxCarac + 1), + cols: Misc.intArray(minLevel, maxLevel + 1) }); } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 5b388e2b..a80eaba3 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -34,7 +34,7 @@ const TMR_DISPLAY_SIZE = { /* -------------------------------------------- */ export class RdDTMRDialog extends Dialog { - static async init() { + static initSettings() { game.settings.register(SYSTEM_RDD, TMR_DISPLAY_SIZE.code, { name: 'Taille des cases des TMR', hint: "Taille en pixel des cases des TMR (réglable directement dans la fenêtre des TMR)", @@ -50,7 +50,7 @@ export class RdDTMRDialog extends Dialog { await PixiTMR.init() let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', tmrData); if (tmrData.mode != 'visu' && !game.user.isGM) { - ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatMessage.getWhisperRecipients("GM") }); + ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatUtility.getGMs() }); } return new RdDTMRDialog(html, actor, tmrData) } @@ -82,7 +82,7 @@ export class RdDTMRDialog extends Dialog { this.rencontreState = 'aucune'; this.subdialog = undefined this.displaySize = undefined - if (!this.viewOnly) { + if (!this.viewOnly && !game.user.isGM) { this._tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")"); } this.callbacksOnAnimate = []; @@ -496,7 +496,7 @@ export class RdDTMRDialog extends Dialog { rencData.message = this.formatMessageRencontre(rencData, result.message); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.html`, rencData) }); @@ -571,12 +571,20 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ _tellToGM(message) { - ChatMessage.create({ content: message, user: game.user.id, whisper: ChatMessage.getWhisperRecipients("GM") }); + ChatMessage.create({ + user: game.user.id, + content: message, + whisper: ChatUtility.getGMs() + }); } /* -------------------------------------------- */ _tellToUserAndGM(message) { - ChatMessage.create({ content: message, user: game.user.id, whisper: [game.user.id].concat(ChatMessage.getWhisperRecipients("GM")) }); + ChatMessage.create({ + user: game.user.id, + content: message, + whisper: ChatUtility.getUserAndGMs() + }) } /* -------------------------------------------- */ @@ -715,7 +723,7 @@ export class RdDTMRDialog extends Dialog { } rollData.poesie = await Poetique.getExtrait(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData) }); if (rollData.rolled.isEchec) { @@ -739,7 +747,7 @@ export class RdDTMRDialog extends Dialog { if (this.isCaseMaitrisee(tmr.coord)) { ChatMessage.create({ content: tmr.label + ": cette case humide est déja maitrisée grâce à votre Tête Quête des Eaux", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatUtility.getOwners(this.actor) }); return false; } @@ -751,14 +759,14 @@ export class RdDTMRDialog extends Dialog { if (tmr.type == 'pont' && EffetsDraconiques.isPontImpraticable(this.actor)) { ChatMessage.create({ content: tmr.label + ": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatUtility.getOwners(this.actor) }); return true; } if (this.isCaseInondee(tmr.coord)) { ChatMessage.create({ content: tmr.label + ": cette case est inondée, elle doit être maîtrisée comme une case humide.", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatUtility.getOwners(this.actor) }); return true; } @@ -832,7 +840,7 @@ export class RdDTMRDialog extends Dialog { } rollData.poesie = await Poetique.getExtrait(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData) }); if (rollData.rolled.isEchec) { @@ -882,17 +890,16 @@ export class RdDTMRDialog extends Dialog { const reserveSecurite = EffetsDraconiques.isReserveEnSecurite(this.actor); const reserveExtensible = this.isReserveExtensible(coord); if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (reserveSecurite || reserveExtensible)) { - const msg = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, { - actor: this.actor, - sorts: sorts, - coord: coord, - tete: { reserveSecurite: reserveSecurite, reserveExtensible: reserveExtensible } - }) ChatMessage.create({ - content: msg, - whisper: ChatMessage.getWhisperRecipients(game.user.name) - }); - return; + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, { + actor: this.actor, + sorts: sorts, + coord: coord, + tete: { reserveSecurite: reserveSecurite, reserveExtensible: reserveExtensible } + }), + whisper: ChatUtility.getOwners(this.actor) + }) + return } await this.processSortReserve(sorts[0]); } @@ -906,9 +913,8 @@ export class RdDTMRDialog extends Dialog { this.processSortReserve(sort); } else { ChatMessage.create({ - content: - "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.", - whisper: ChatMessage.getWhisperRecipients(game.user.name), + content: "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.", + whisper: ChatUtility.getOwners(this.actor) }); } } @@ -1091,7 +1097,7 @@ export class RdDTMRDialog extends Dialog { async notifierResonanceSigneDraconique(coord) { if (!this.viewOnly && this.actor.isResonanceSigneDraconique(coord)) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-resonance.html`, { alias: this.actor.name, typeTMR: TMRUtility.getTMRType(coord) }) }); } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 9b43c877..20b10526 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -99,9 +99,7 @@ export class RdDUtility { // persistent handling of conteneur show/hide static afficheContenu = {} /* -------------------------------------------- */ - static async init() { - Hooks.on("renderChatMessage", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg)) - Hooks.on("createChatMessage", async (chatMessage, options, id) => await ChatUtility.onCreateChatMessage(chatMessage, options, id)) + static async initHooks() { Hooks.on('renderChatLog', (log, html, chatLog) => RdDUtility.chatListeners(html)) } @@ -292,7 +290,7 @@ export class RdDUtility { Handlebars.registerHelper('array-includes', (array, value) => array.includes(value)); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); - Handlebars.registerHelper('isLastIndex', (index, list) => index+1 >= list.length); + Handlebars.registerHelper('isLastIndex', (index, list) => index + 1 >= list.length); Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option)); Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name))); Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences)); @@ -645,18 +643,16 @@ export class RdDUtility { /* -------------------------------------------- */ static onSocketMessage(sockmsg) { switch (sockmsg.msg) { - case "msg_gm_chat_message": - return ChatUtility.handleGMChatMessage(sockmsg.data); case "msg_app_astrologie_refresh": - return Hooks.callAll(APP_ASTROLOGIE_REFRESH); + return Hooks.callAll(APP_ASTROLOGIE_REFRESH) case "msg_request_nombre_astral": - return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data); + return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data) case "msg_tmr_move": let actor = game.actors.get(sockmsg.data.actorId); if (actor.isOwner || game.user.isGM) { - actor.refreshTMRView(); + actor.refreshTMRView() } - break; + break } } @@ -808,17 +804,13 @@ export class RdDUtility { user: game.user.id, rollMode: modeOverride || game.settings.get("core", "rollMode"), content: content - }; - - if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id); - if (chatData.rollMode === "blindroll") chatData["blind"] = true; - else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user]; + } + ChatUtility.applyRollMode(chatData) if (forceWhisper) { // Final force ! - chatData["speaker"] = ChatMessage.getSpeaker(); - chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper); + chatData.speaker = ChatMessage.getSpeaker(); + chatData.whisper = ChatMessage.getWhisperRecipients(forceWhisper); } - return chatData; } @@ -881,7 +873,7 @@ export class RdDUtility { const current = game.system.rdd.calendrier.heureCourante(); ChatMessage.create({ content: `A l'heure de ${current.label}, le modificateur de Chance/Malchance est de ${Misc.toSignedString(ajustement)} pour l'heure de naissance ${heure.label}.`, - whisper: ChatMessage.getWhisperRecipients("GM") + whisper: ChatUtility.getGMs() }); } else if (heureNaissance) { @@ -900,7 +892,7 @@ export class RdDUtility { if (compName.includes('Thanatos')) { let message = "Vous avez mis des points d'Expérience dans la Voie de Thanatos !
Vous devez réduire manuellement d'un même montant d'XP une autre compétence Draconique."; ChatMessage.create({ - whisper: ChatMessage.getWhisperRecipients(game.user.name), + whisper: ChatUtility.getUserAndGMs(), content: message }); } diff --git a/module/settings/options-avancees.js b/module/settings/options-avancees.js index a524bb01..c09c745b 100644 --- a/module/settings/options-avancees.js +++ b/module/settings/options-avancees.js @@ -8,7 +8,7 @@ const OPTIONS_AVANCEES = [ ] export class OptionsAvancees extends FormApplication { - static init() { + static initSettings() { for (const regle of OPTIONS_AVANCEES) { const name = regle.name const id = OptionsAvancees._getId(name) diff --git a/module/settings/regles-optionnelles.js b/module/settings/regles-optionnelles.js index bbb53638..3eac1e2d 100644 --- a/module/settings/regles-optionnelles.js +++ b/module/settings/regles-optionnelles.js @@ -46,7 +46,7 @@ const listeReglesOptionnelles = [ const uniquementJoueur = listeReglesOptionnelles.filter(it => it.uniquementJoueur).map(it=>it.name); export class ReglesOptionnelles extends FormApplication { - static init() { + static initSettings() { for (const regle of listeReglesOptionnelles) { const name = regle.name; const id = ReglesOptionnelles._getIdRegle(name); diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js index bdff885f..5fa34329 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -25,7 +25,7 @@ const CONFIGURABLE_COMPENDIUMS = { * ======= Gestion des accès aux compendiums systèmes (ou surchargés) ======= */ export class SystemCompendiums extends FormApplication { - static init() { + static initSettings() { Object.keys(CONFIGURABLE_COMPENDIUMS).forEach(compendium => { const definition = CONFIGURABLE_COMPENDIUMS[compendium]; foundry.utils.mergeObject(definition, { @@ -236,12 +236,12 @@ export class CompendiumTableHelpers { let max = 0; const total = rows.map(it => it.frequence).reduce(Misc.sum(), 0); return rows.map(row => { - const frequence = row.frequence; - row.min = max + 1; - row.max = max + frequence; + const frequence = row.frequence + row.min = max + 1 + row.max = max + frequence row.total = total - max += frequence; - return row; + max += frequence + return row }) } static async getRandom(table, type, subTypes = ['objet'], forcedRoll = undefined, localisation = undefined) { @@ -260,8 +260,8 @@ export class CompendiumTableHelpers { } const total = table[0].total; const formula = `1d${total}`; - if (forcedRoll == undefined && (forcedRoll > total || forcedRoll <= 0)) { - ui.notifications.warn(`Jet de rencontre ${forcedRoll} en dehors de la table [1..${total}], le jet est relancé`); + if (forcedRoll != undefined && (forcedRoll > total || forcedRoll <= 0)) { + ui.notifications.warn(`Jet forcé ${forcedRoll} en dehors de la table [1..${total}], le jet est relancé`); forcedRoll = undefined; } const roll = forcedRoll ? { total: forcedRoll, formula } : await RdDDice.roll(formula, { showDice: HIDE_DICE }); @@ -276,7 +276,7 @@ export class CompendiumTableHelpers { return; } const percentages = (row.total == 100) ? '%' : '' - const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll.html', { + const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll.hbs', { roll: row.roll, document: row.document, percentages, @@ -291,12 +291,12 @@ export class CompendiumTableHelpers { sound: CONFIG.sounds.dice, content: flavorContent }; - await ChatUtility.createChatWithRollMode(game.user.id, messageData) + await ChatUtility.createChatWithRollMode(messageData) } /* -------------------------------------------- */ static async tableToChatMessage(table, type, subTypes, typeName = undefined) { - const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table.html', { + const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table.hbs', { img: RdDItem.getDefaultImg(subTypes[0]), typeName: typeName ?? Misc.typeName(type, subTypes[0]), table, @@ -304,10 +304,10 @@ export class CompendiumTableHelpers { }); const messageData = { user: game.user.id, - whisper: game.user.id, + whisper: [game.user], content: flavorContent }; - await ChatUtility.createChatWithRollMode(game.user.id, messageData) + await ChatUtility.createChatWithRollMode(messageData) } } \ No newline at end of file diff --git a/module/time/auto-adjust-darkness.js b/module/time/auto-adjust-darkness.js index 1d851cf1..c7b320e8 100644 --- a/module/time/auto-adjust-darkness.js +++ b/module/time/auto-adjust-darkness.js @@ -4,7 +4,7 @@ export const AUTO_ADJUST_DARKNESS = "auto-adjust-darkness"; export class AutoAdjustDarkness { - static init() { + static initSettings() { game.settings.register(SYSTEM_RDD, AUTO_ADJUST_DARKNESS, { name: AUTO_ADJUST_DARKNESS, scope: "world", diff --git a/module/time/rdd-calendrier.js b/module/time/rdd-calendrier.js index b5b41088..b2a4129d 100644 --- a/module/time/rdd-calendrier.js +++ b/module/time/rdd-calendrier.js @@ -15,7 +15,7 @@ const TEMPLATE_CALENDRIER = "systems/foundryvtt-reve-de-dragon/templates/time/ca const INITIAL_CALENDAR_POS = { top: 200, left: 200, horlogeAnalogique: true }; /* -------------------------------------------- */ export class RdDCalendrier extends Application { - static init() { + static initSettings() { game.settings.register(SYSTEM_RDD, "liste-nombre-astral", { name: "liste-nombre-astral", scope: "world", diff --git a/module/time/rdd-timestamp.js b/module/time/rdd-timestamp.js index c10d55f6..27a5a80f 100644 --- a/module/time/rdd-timestamp.js +++ b/module/time/rdd-timestamp.js @@ -49,7 +49,7 @@ const FORMULES_PERIODE = [ export class RdDTimestamp { - static init() { + static initSettings() { game.settings.register(SYSTEM_RDD, WORLD_TIMESTAMP_SETTING, { name: WORLD_TIMESTAMP_SETTING, scope: "world", diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index 4610d6f4..ef8ea61a 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -105,7 +105,7 @@ export class TMRRencontres { /* -------------------------------------------- */ async $chatRolledRencontre(row, rencontre, tmr) { - const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll-rencontre.html', + const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll-rencontre.hbs', { roll: row.roll, rencontre, diff --git a/module/tmr/effets-rencontres.js b/module/tmr/effets-rencontres.js index 0ab7ebcb..898877c7 100644 --- a/module/tmr/effets-rencontres.js +++ b/module/tmr/effets-rencontres.js @@ -30,7 +30,7 @@ export class EffetsRencontre { static $reve_plus = async (actor, reve) => { if (!ReglesOptionnelles.isUsing("recuperation-reve") && reve < 0) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), + whisper: ChatUtility.getOwners(actor), content: `Pas de récupération de rêve (${reve} points ignorés)` }); return @@ -112,7 +112,7 @@ export class EffetsRencontre { poesie: await Poetique.getExtrait() }) ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(context.actor.name), + whisper: ChatUtility.getOwners(context.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, context) }); } @@ -127,7 +127,7 @@ export class EffetsRencontre { } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(context.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, context) }); } diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index 1b00a8b0..6112928a 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -28,7 +28,7 @@ export class PresentCites extends Draconique { let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); if (existants.length > 0) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(actor), content: "Vous avez encore des présents dans des cités, vous devrez tirer une autre tête pour remplacer celle ci!" }) } diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js index f3c00769..8ecbe572 100644 --- a/module/tmr/urgence-draconique.js +++ b/module/tmr/urgence-draconique.js @@ -19,7 +19,7 @@ export class UrgenceDraconique extends Draconique { // La queue se transforme en idée fixe const ideeFixe = await RdDRollTables.getIdeeFixe(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(actor), content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${ideeFixe.name}` }); await actor.createEmbeddedDocuments('Item', [ideeFixe]); diff --git a/module/voyage/dialog-fatigue-voyage.js b/module/voyage/dialog-fatigue-voyage.js index 591c1942..e4caa365 100644 --- a/module/voyage/dialog-fatigue-voyage.js +++ b/module/voyage/dialog-fatigue-voyage.js @@ -175,7 +175,7 @@ export class DialogFatigueVoyage extends Dialog { .forEach(async it => { const perteFatigue = fatigueBase + it.ajustement ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(it.actor.name), + whisper: ChatUtility.getOwners(it.actor), content: await renderTemplate( 'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs', foundry.utils.mergeObject(it, diff --git a/styles/simple.css b/styles/simple.css index 92ec5536..491e0f7b 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -567,7 +567,11 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) { .dice-img { border-width: 0; + max-width: 1.5rem; + max-height: 1.5rem; + vertical-align: top; } + .in-text-img { max-width: 1.2em; max-height: 1.2em; diff --git a/system.json b/system.json index 860a11ff..a92ba9db 100644 --- a/system.json +++ b/system.json @@ -1,8 +1,8 @@ { "id": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", - "version": "12.0.14", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.14.zip", + "version": "12.0.15", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.15.zip", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json", "changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md", "compatibility": { diff --git a/templates/actor/competence.html b/templates/actor/competence.html index 19d81ece..fb1624de 100644 --- a/templates/actor/competence.html +++ b/templates/actor/competence.html @@ -1,17 +1,19 @@ {{#unless system.isHidden}} -
  • - - - {{name}} - - - {{#if system.isLevelUp}} - Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}} - - - - {{/if}} - +
  • + + + + {{name}} + + + {{#if system.isLevelUp}} + Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}} + + + + {{/if}} + + @@ -50,7 +52,7 @@ {{/if}}   -
  • + {{/if}} - + {{/unless}} \ No newline at end of file diff --git a/templates/chat-compendium-table-roll-rencontre.html b/templates/chat-compendium-table-roll-rencontre.hbs similarity index 100% rename from templates/chat-compendium-table-roll-rencontre.html rename to templates/chat-compendium-table-roll-rencontre.hbs diff --git a/templates/chat-compendium-table-roll.html b/templates/chat-compendium-table-roll.hbs similarity index 100% rename from templates/chat-compendium-table-roll.html rename to templates/chat-compendium-table-roll.hbs diff --git a/templates/chat-compendium-table.html b/templates/chat-compendium-table.hbs similarity index 59% rename from templates/chat-compendium-table.html rename to templates/chat-compendium-table.hbs index ef61f351..1e822b66 100644 --- a/templates/chat-compendium-table.html +++ b/templates/chat-compendium-table.hbs @@ -11,9 +11,10 @@