diff --git a/module/actor.js b/module/actor.js
index e171b65a..53ac2d52 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -12,6 +12,7 @@ import { Misc } from "./misc.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { RdDDice } from "./rdd-dice.js";
import { RdDRollTables } from "./rdd-rolltables.js";
+import { ChatUtility } from "./chat-utility.js";
export class RdDActor extends Actor {
@@ -197,7 +198,7 @@ export class RdDActor extends Actor {
if (rolled.isSuccess) {
// Message spécial pour la rapidité, qui reste difficile à gérer automatiquement
if ( rollData.particuliereAttaque == 'rapidite') {
- ChatMessage.create( { contet: "Vous avez attaqué en Rapidité. Ce cas n'est pas géré autmatiquement, donc suivez les directives de votre MJ pour gérer ce cas.",
+ ChatMessage.create( { content: "Vous avez attaqué en Rapidité. Ce cas n'est pas géré autmatiquement, donc suivez les directives de votre MJ pour gérer ce cas.",
whisper: ChatMessage.getWhisperRecipients( this.name ) } );
}
rollData.domArmePlusDom = this._calculBonusDommages(rollData.selectedCarac, rollData.arme, rollData.particuliereAttaque == 'force' );
@@ -232,11 +233,10 @@ export class RdDActor extends Actor {
+ "
Difficultés libre : " + rollData.diffLibre + " / conditions : " + Misc.toSignedString(rollData.diffConditions) +" / état : " + rollData.etat
+ RdDResolutionTable.explain(rolled)
+ "
" + quality + ""
- + explications + xpmsg,
- user: game.user._id,
- title: "Résultat du test"
+ + explications + xpmsg
}
- ChatMessage.create(chatOptions);
+
+ ChatUtility.chatWithRollMode(chatOptions, this.name)
// This an attack, generate the defense message
if (defenseMsg) {
@@ -322,7 +322,7 @@ export class RdDActor extends Actor {
await this.update({ "data.reve.reve": myReve });
if (myReve.value == 0) { // 0 points de reve
- ChatMessage.create({ title: "Zero Points de Reve !", content: this.name + " est réduit à 0 Points de Rêve, et tombe endormi !" });
+ ChatMessage.create({ content: this.name + " est réduit à 0 Points de Rêve, et tombe endormi !" });
closeTMR = true;
}
if (closeTMR) {
@@ -333,7 +333,10 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async dormir(heures=1) {
- let message = { title : "Récupération", content :"Vous dormez " + heures + " heure" + (heures > 1 ? "s": "") };
+ let message = {
+ whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ),
+ content : "Vous dormez " + heures + " heure" + (heures > 1 ? "s": "")
+ };
await this.recupereEndurance(message);
for (let i=0; iVous avez suffisament rêvé (seuil " + seuil + ", rêve actuel "+reve+")";
}
else {
- let deRecuperation = RdDDice.deDraconique();
+ let deRecuperation = await RdDDice.deDraconique();
console.log("recuperationReve", deRecuperation);
if (deRecuperation>=7)
{
@@ -670,7 +674,6 @@ export class RdDActor extends Actor {
this.createOwnedItem(queue);
ChatMessage.create({
- title: "Queue de Dragon",
content: this.name + " subit un Queue de Dragon : " + queue.name
});
@@ -910,7 +913,7 @@ export class RdDActor extends Actor {
compteurs.stress.value = Math.max(compteurs.stress.value - convertion - 1, 0);
ChatMessage.create({
- title: "Jet de Stress", content: "Vous avez transformé " + convertion + " points de Stress en Expérience" + stressRoll.comment,
+ content: "Vous avez transformé " + convertion + " points de Stress en Expérience" + stressRoll.comment,
whisper: ChatMessage.getWhisperRecipients(game.user.name)
});
await this.update({ "data.compteurs": compteurs });
@@ -1009,8 +1012,9 @@ export class RdDActor extends Actor {
{
let minReveValue = (isRapide) ? 3 : 2;
if (this.getReveActuel() < minReveValue ) {
- ChatMessage.create( { title: "Montée impossible !", content: "Vous n'avez plus assez de Points de Reve pour monter dans les Terres Médianes",
- whisper: ChatMessage.getWhisperRecipients(game.user.name) } );
+ ChatMessage.create( {
+ content: "Vous n'avez plus assez de Points de Reve pour monter dans les Terres Médianes",
+ whisper: ChatMessage.getWhisperRecipients(game.user.name) } );
return;
}
}
diff --git a/module/chat-utility.js b/module/chat-utility.js
new file mode 100644
index 00000000..6f63f483
--- /dev/null
+++ b/module/chat-utility.js
@@ -0,0 +1,70 @@
+
+/**
+ * Class providing helper methods to get the list of users, and
+ */
+export class ChatUtility {
+
+ static chatWithRollMode(chatOptions, name) {
+ let rollMode = game.settings.get("core", "rollMode");
+ chatOptions.user = game.user._id;
+
+ switch (rollMode) {
+ case "blindroll": {//GM only
+ if (!game.user.isGM) {
+ ChatUtility.blindMessageToGM(chatOptions);
+
+ chatOptions = {
+ user: game.user._id,
+ whisper: [game.user._id],
+ content: "Message envoyé en aveugle au Gardien"
+ }
+ }
+ else {
+ chatOptions.whisper = ChatUtility.getUsers(user => user.isGM);
+ }
+ }
+ break;
+ case "gmroll": //GM + rolling player
+ chatOptions.user = game.user._id;
+ chatOptions.whisper = ChatUtility.getWhisperRecipientsAndGMs(name);
+ break;
+ case "selfroll": // only the user
+ chatOptions.user = game.user._id;
+ chatOptions.whisper = [game.user._id];
+ break;
+ default:
+ case "roll": //everybody
+ chatOptions.whisper = undefined;
+ break;
+ }
+
+ console.log("roll message", chatOptions);
+ ChatMessage.create(chatOptions);
+ }
+
+ static getWhisperRecipientsAndGMs(name) {
+ return ChatMessage.getWhisperRecipients(name)
+ .concat(this.getUsers(user => user.isGM));
+ }
+
+ static getUsers(filter) {
+ return game.users.filter(filter).map(user => user.data._id);
+ }
+
+ static blindMessageToGM(chatOptions) {
+ let chatGM = 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.foundryvtt-reve-de-dragon", { msg: "msg_gm_chat_message", data: chatGM });
+ }
+
+ static handleGMChatMessage(data) {
+ console.log("blindMessageToGM", data);
+ if (game.user.isGM) { // message privé pour GM only
+ data.user = game.user._id;
+ ChatMessage.create(data);
+ }
+ }
+
+}
diff --git a/module/rdd-dice.js b/module/rdd-dice.js
index 3d208c13..bdd3be73 100644
--- a/module/rdd-dice.js
+++ b/module/rdd-dice.js
@@ -1,3 +1,5 @@
+import { ChatUtility } from "./chat-utility.js";
+
export class RdDDice {
/* -------------------------------------------- */
@@ -9,32 +11,30 @@ export class RdDDice {
/* -------------------------------------------- */
- static async show(roll, rollMode = "roll") {
+ static async show(roll, rollMode = undefined) {
if (roll.showDice || game.settings.get("foundryvtt-reve-de-dragon", "dice-so-nice") == true) {
await this.showDiceSoNice(roll, rollMode);
}
return roll;
}
-
+
/* -------------------------------------------- */
- static async showDiceSoNice(roll, rollMode = "roll") {
+ static async showDiceSoNice(roll, rollMode = undefined) {
if (game.modules.get("dice-so-nice") && game.modules.get("dice-so-nice").active) {
let whisper = null;
let blind = false;
+ rollMode = rollMode == undefined ? game.settings.get("core", "rollMode") : rollMode;
switch (rollMode) {
case "blindroll": //GM only
blind = true;
case "gmroll": //GM + rolling player
- let gmList = game.users.filter(user => user.isGM);
- let gmIDList = [];
- gmList.forEach(gm => gmIDList.push(gm.data._id));
- whisper = gmIDList;
+ whisper = ChatUtility.getUsersIds(user => user.isGM);
break;
case "roll": //everybody
- let userList = game.users.filter(user => user.active);
- let userIDList = [];
- userList.forEach(user => userIDList.push(user.data._id));
- whisper = userIDList;
+ whisper = ChatUtility.getUsersIds(user => user.active);
+ break;
+ case "selfroll":
+ whisper = [game.user._id];
break;
}
await game.dice3d.showForRoll(roll, game.user, true, whisper, blind);
diff --git a/module/rdd-main.js b/module/rdd-main.js
index 396e3a75..1c958fc3 100644
--- a/module/rdd-main.js
+++ b/module/rdd-main.js
@@ -142,7 +142,6 @@ Hooks.once("init", async function() {
carac_array : RdDUtility.getCaracArray(),
ajustementsConditions : RdDUtility.getAjustementsConditions(),
difficultesLibres : RdDUtility.getDifficultesLibres()
-
}
// Register sheet application classes
@@ -178,17 +177,12 @@ Hooks.once("renderApplication", () => {
});
function messageDeBienvenue(){
- game.messages.filter(it => {
- console.log(it);
- return it.data.content.match(/^Bienvenu(e)? dans le Rêve des Dragons/);
- })
- .forEach(it => {
- console.log("deleting",it);
- it.delete();
- });
+ game.messages
+ .filter(it => it.user._id == game.user._id && it.data.content.match(/^Bienvenu(e)? dans le Rêve des Dragons/))
+ .forEach(it => it.delete());
ChatMessage.create( {
- whisper: [game.user],
- title: "Bienvenue dans le Rêve !",
+ user: game.user._id,
+ whisper: [game.user._id],
content : "Bienvenue dans le Rêve des Dragons !
" +
"Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}" }
);
@@ -216,4 +210,4 @@ Hooks.on("chatMessage", (html, content, msg) => {
let commands = content.match(regExp);
return RdDUtility.processChatCommand( commands, content, msg );
-} );
+});
diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js
index 9882191b..8d7e530b 100644
--- a/module/rdd-tmr-dialog.js
+++ b/module/rdd-tmr-dialog.js
@@ -224,12 +224,12 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */
_tellToUser(message) {
- ChatMessage.create({ title: "TMR", content: message, user: game.user._id });
+ ChatMessage.create({ content: message, user: game.user._id });
}
/* -------------------------------------------- */
_tellToGM(message) {
- ChatMessage.create({ title: "TMR", content: message, user: game.user._id, whisper: ChatMessage.getWhisperRecipients("GM") });
+ ChatMessage.create({ content: message, user: game.user._id, whisper: ChatMessage.getWhisperRecipients("GM") });
}
/* -------------------------------------------- */
diff --git a/module/rdd-utility.js b/module/rdd-utility.js
index 9d752b95..652a98f4 100644
--- a/module/rdd-utility.js
+++ b/module/rdd-utility.js
@@ -2,6 +2,7 @@
import { TMRUtility } from "./tmr-utility.js";
import { RdDRollTables } from "./rdd-rolltables.js";
+import { ChatUtility } from "./chat-utility.js";
const level_category = {
"generale": "-4",
@@ -601,27 +602,38 @@ export class RdDUtility {
static performSocketMesssage( sockmsg )
{
console.log(">>>>> MSG RECV", sockmsg);
- if ( sockmsg.msg == "msg_encaisser" ) {
- if ( game.user.isGM ) { // Seul le GM effectue l'encaissement sur la fiche
- let rollData = game.system.rdd.rollDataHandler[sockmsg.data.attackerid]; // Retrieve the rolldata from the store
- let defenderActor = game.actors.get( sockmsg.data.defenderid );
- defenderActor.encaisserDommages( rollData );
- }
- } else if (sockmsg.msg == "msg_defense" ) {
- let defenderActor = game.actors.get( sockmsg.data.defenderid );
- if ( defenderActor ) {
- if ( (game.user.isGM && !defenderActor.hasPlayerOwner) || (defenderActor.hasPlayerOwner && (game.user.character.id == defenderActor.id) ) ) {
- console.log("User is pushing message...", game.user.name);
- game.system.rdd.rollDataHandler[sockmsg.data.attackerid] = duplicate(sockmsg.data.rollData);
- sockmsg.data.whisper = [ game.user ];
- sockmsg.data.blind = true;
- sockmsg.data.rollMode = "blindroll";
- ChatMessage.create( sockmsg.data );
- }
+ switch(sockmsg.msg) {
+ case "msg_encaisser":
+ return RdDUtility._handleMsgEncaisser(sockmsg.data);
+ case "msg_defense" :
+ return RdDUtility._handleMsgDefense(sockmsg.data);
+ case "msg_gm_chat_message":
+ return ChatUtility.handleGMChatMessage(sockmsg.data);
+ }
+ }
+
+ static _handleMsgDefense(data) {
+ let defenderActor = game.actors.get(data.defenderid);
+ if (defenderActor) {
+ if ((game.user.isGM && !defenderActor.hasPlayerOwner) || (defenderActor.hasPlayerOwner && (game.user.character.id == defenderActor.id))) {
+ console.log("User is pushing message...", game.user.name);
+ game.system.rdd.rollDataHandler[data.attackerid] = duplicate(data.rollData);
+ data.whisper = [game.user];
+ data.blind = true;
+ data.rollMode = "blindroll";
+ ChatMessage.create(data);
}
}
}
-
+
+ static _handleMsgEncaisser(data) {
+ if (game.user.isGM) { // Seul le GM effectue l'encaissement sur la fiche
+ let rollData = game.system.rdd.rollDataHandler[data.attackerid]; // Retrieve the rolldata from the store
+ let defenderActor = game.actors.get(data.defenderid);
+ defenderActor.encaisserDommages(rollData);
+ }
+ }
+
/* -------------------------------------------- */
static async chatListeners( html )
{