From 90d46c6a78f8d54d9ff7489fd6d6a9d91e6b2c5d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 14 Oct 2024 03:46:09 +0200 Subject: [PATCH 1/7] Init settings before sheets Eviter que le chargement d'acteurs ait lieu avant le chargement des settings --- module/dialog-chronologie.js | 2 +- module/environnement.js | 2 +- module/rdd-hotbar-drop.js | 3 +- module/rdd-main.js | 60 +++++++++++++------------- module/rdd-tmr-dialog.js | 2 +- module/settings/options-avancees.js | 2 +- module/settings/regles-optionnelles.js | 2 +- module/settings/system-compendiums.js | 2 +- module/time/auto-adjust-darkness.js | 2 +- module/time/rdd-calendrier.js | 2 +- module/time/rdd-timestamp.js | 2 +- 11 files changed, 40 insertions(+), 41 deletions(-) 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/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/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..ca9b5fc4 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 { @@ -144,9 +151,10 @@ export class SystemReveDeDragon { console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e) } }) - + /* -------------------------------------------- */ // Define custom Entity classes + console.log(`Initializing Reve de Dragon Documents`) CONFIG.Actor.documentClass = RdDBaseActor CONFIG.Item.documentClass = RdDItem CONFIG.RDD = { @@ -155,7 +163,7 @@ export class SystemReveDeDragon { ajustementsConditions: RdDUtility.getAjustementsConditions(), difficultesLibres: RdDUtility.getDifficultesLibres() } - + /* -------------------------------------------- */ // Register sheet application classes Actors.unregisterSheet("core", ActorSheet) @@ -166,7 +174,7 @@ export class SystemReveDeDragon { Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true }) Items.unregisterSheet("core", ItemSheet) await RdDActorExportSheet.init() - + RdDItemSheet.register(RdDSigneDraconiqueItemSheet) RdDItemSheet.register(RdDRencontreItemSheet) RdDItemSheet.register(RdDConteneurItemSheet) @@ -176,7 +184,7 @@ export class SystemReveDeDragon { RdDItemSheet.register(RdDIngredientItemSheet) RdDItemSheet.register(RdDServiceItemSheet) RdDItemSheet.register(RdDBlessureItemSheet) - + Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, { types: [ "objet", "arme", "armure", "livre", "potion", "munition", @@ -192,16 +200,10 @@ 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() + console.log(`Initializing Reve de Dragon Hooks and handlers`) + CONFIG.Combat.documentClass = RdDCombatManager RdDUtility.init() RdDDice.init() RdDCommands.init() @@ -211,15 +213,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 +319,3 @@ export class SystemReveDeDragon { } SystemReveDeDragon.start() - diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 5b388e2b..eab55338 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)", 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..31321d6d 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, { 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", -- 2.35.3 From 501f1f2e4fcdeeff1cfd488a9fe9283dc2e303cc Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 14 Oct 2024 03:47:04 +0200 Subject: [PATCH 2/7] Fix: Messages de maladies non publics Les messages de maladies sont uniquement pour les "owners" (ce qui inclut les MJs) --- changelog.md | 2 ++ module/chat-utility.js | 4 ++++ module/item/maladie.js | 10 +++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index e1d942a5..acdb92cd 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,6 @@ # 12.0 +## 12.0.15 - Le messager d'Astrobazzarh +- Les messages de maladies ne sont plus publics ## 12.0.14 - Les légions d'Astrobazzarh - Feuille de PNJ: - boutons standard (encaissement, ...) diff --git a/module/chat-utility.js b/module/chat-utility.js index 6e0386ff..c5a56534 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -118,6 +118,10 @@ export class ChatUtility { return undefined; } + static getOwners(actor) { + return game.users.filter(it => actor.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) + } + /* -------------------------------------------- */ static getWhisperRecipientsAndGMs(...names) { let recipients = [...ChatMessage.getWhisperRecipients('GM')] 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) } } -- 2.35.3 From 582df7e290f89e8347719a15fc3ac412bb1af80e Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 16 Oct 2024 23:18:15 +0200 Subject: [PATCH 3/7] Simplify ChatMessage whispers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les messages dans les TMRs sont envoyés au GM Simplification des messages de tchat liés à un actor: on peut utiliser les Owners (car les GMs sont owner). Au lieu de passer le name de l'Actor (qui peut être incorrect si deux actors ont le même, mais pas les mêmes propriétaires), on passe directement l'actor pour déterminer mles destinataires de messages --- changelog.md | 2 + module/actor.js | 50 +++++----- module/actor/base-actor-reve.js | 27 +++--- module/actor/base-actor-sang-sheet.js | 4 +- module/actor/base-actor-sang.js | 17 +++- module/actor/base-actor.js | 12 +-- module/chat-utility.js | 122 ++++++++++++++---------- module/coeur/rdd-coeur.js | 14 +-- module/dialog-create-signedraconique.js | 2 +- module/item/blessure.js | 2 +- module/rdd-combat.js | 36 +++---- module/rdd-commands.js | 21 ++-- module/rdd-dice.js | 22 +---- module/rdd-empoignade.js | 15 +-- module/rdd-main.js | 21 ++-- module/rdd-meteo.js | 3 +- module/rdd-namegen.js | 3 +- module/rdd-resolution-table.js | 25 ++--- module/rdd-tmr-dialog.js | 54 ++++++----- module/rdd-utility.js | 32 +++---- module/settings/system-compendiums.js | 6 +- module/tmr/effets-rencontres.js | 6 +- module/tmr/present-cites.js | 2 +- module/tmr/urgence-draconique.js | 2 +- module/voyage/dialog-fatigue-voyage.js | 2 +- 25 files changed, 256 insertions(+), 246 deletions(-) diff --git a/changelog.md b/changelog.md index acdb92cd..93a4e484 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,8 @@ # 12.0 ## 12.0.15 - Le messager d'Astrobazzarh - Les messages de maladies ne sont plus publics +- Les messages privés dans les TMR sont aussi envoyés au GM + ## 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 c5a56534..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,77 +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 getOwners(actor) { - return game.users.filter(it => actor.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) - } - - /* -------------------------------------------- */ - 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-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/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/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..e9003005 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -169,7 +169,7 @@ export class RdDDice { 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 +223,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-main.js b/module/rdd-main.js index ca9b5fc4..18778107 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -116,11 +116,11 @@ export class SystemReveDeDragon { this.AppAstrologie = AppAstrologie console.log(`Initializing Reve de Dragon System Settings`) - + // preload handlebars templates RdDUtility.preloadHandlebarsTemplates() AppPersonnageAleatoire.preloadHandlebars() - + /* -------------------------------------------- */ ReglesOptionnelles.initSettings() OptionsAvancees.initSettings() @@ -131,13 +131,13 @@ export class SystemReveDeDragon { DialogChronologie.initSettings() RdDTMRDialog.initSettings() Environnement.initSettings() - + this.initSettings() - + /* -------------------------------------------- */ // Set an initiative formula for the system 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) => { @@ -151,7 +151,7 @@ export class SystemReveDeDragon { console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e) } }) - + /* -------------------------------------------- */ // Define custom Entity classes console.log(`Initializing Reve de Dragon Documents`) @@ -163,7 +163,7 @@ export class SystemReveDeDragon { ajustementsConditions: RdDUtility.getAjustementsConditions(), difficultesLibres: RdDUtility.getDifficultesLibres() } - + /* -------------------------------------------- */ // Register sheet application classes Actors.unregisterSheet("core", ActorSheet) @@ -174,7 +174,7 @@ export class SystemReveDeDragon { Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true }) Items.unregisterSheet("core", ItemSheet) await RdDActorExportSheet.init() - + RdDItemSheet.register(RdDSigneDraconiqueItemSheet) RdDItemSheet.register(RdDRencontreItemSheet) RdDItemSheet.register(RdDConteneurItemSheet) @@ -184,7 +184,7 @@ export class SystemReveDeDragon { RdDItemSheet.register(RdDIngredientItemSheet) RdDItemSheet.register(RdDServiceItemSheet) RdDItemSheet.register(RdDBlessureItemSheet) - + Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, { types: [ "objet", "arme", "armure", "livre", "potion", "munition", @@ -204,7 +204,8 @@ export class SystemReveDeDragon { // préparation des différents modules console.log(`Initializing Reve de Dragon Hooks and handlers`) CONFIG.Combat.documentClass = RdDCombatManager - RdDUtility.init() + ChatUtility.init() + RdDUtility.initHooks() RdDDice.init() RdDCommands.init() RdDCombatManager.init() 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 eab55338..a80eaba3 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -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/system-compendiums.js b/module/settings/system-compendiums.js index 31321d6d..2a405b06 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -291,7 +291,7 @@ export class CompendiumTableHelpers { sound: CONFIG.sounds.dice, content: flavorContent }; - await ChatUtility.createChatWithRollMode(game.user.id, messageData) + await ChatUtility.createChatWithRollMode(messageData) } /* -------------------------------------------- */ @@ -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/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, -- 2.35.3 From 226afc1680e767ba4030af9225336d2a22deee22 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 16 Oct 2024 23:21:22 +0200 Subject: [PATCH 4/7] =?UTF-8?q?Fix:=20tooltip=20augmentation=20comp=C3=A9t?= =?UTF-8?q?ences?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 1 + templates/actor/competence.html | 32 +++++++++++++++++--------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/changelog.md b/changelog.md index 93a4e484..354259e2 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## 12.0.15 - Le messager d'Astrobazzarh - 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 ## 12.0.14 - Les légions d'Astrobazzarh - Feuille de PNJ: 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 -- 2.35.3 From 5004774a1534a566244ea5db096df9b7de4ee8e9 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 16 Oct 2024 23:29:18 +0200 Subject: [PATCH 5/7] Rendu des tables de compendiums --- changelog.md | 1 + module/settings/system-compendiums.js | 18 +++++++++--------- module/tmr-rencontres.js | 2 +- ...> chat-compendium-table-roll-rencontre.hbs} | 0 ...oll.html => chat-compendium-table-roll.hbs} | 0 ...um-table.html => chat-compendium-table.hbs} | 7 ++++--- 6 files changed, 15 insertions(+), 13 deletions(-) rename templates/{chat-compendium-table-roll-rencontre.html => chat-compendium-table-roll-rencontre.hbs} (100%) rename templates/{chat-compendium-table-roll.html => chat-compendium-table-roll.hbs} (100%) rename templates/{chat-compendium-table.html => chat-compendium-table.hbs} (59%) diff --git a/changelog.md b/changelog.md index 354259e2..6992eb93 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,7 @@ - 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: diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js index 2a405b06..5fa34329 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -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, @@ -296,7 +296,7 @@ export class CompendiumTableHelpers { /* -------------------------------------------- */ 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, 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/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 @@
      {{#each table as |row|}} -
    • - {{row.min}}{{#unless (eq row.min row.max)}}-{{row.max}}{{/unless}} :   - {{linkCompendium row.document.pack row.document.id row.document.name}} +
    • + + {{row.min}}{{#unless (eq row.min row.max)}}-{{row.max}}{{/unless}} : {{linkCompendium row.document.pack row.document.id row.document.name}} +
    • {{/each}}
    -- 2.35.3 From 3888efc6aacec935b99ba82bdd1c2f3c29b0ef0b Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Oct 2024 02:07:24 +0200 Subject: [PATCH 6/7] =?UTF-8?q?Correction=20d=C3=A9s=20dice-so-nice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 1 + module/rdd-dice.js | 53 ++++++++++++++++++++++------------------------ styles/simple.css | 4 ++++ 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/changelog.md b/changelog.md index 6992eb93..ad50c309 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,6 @@ # 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 diff --git a/module/rdd-dice.js b/module/rdd-dice.js index e9003005..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,14 +160,6 @@ 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) { 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; -- 2.35.3 From e2c4d93413db7b8b508f1de3c9c3a4b319e2e859 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Oct 2024 02:08:03 +0200 Subject: [PATCH 7/7] Version 12.0.15 --- system.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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": { -- 2.35.3