diff --git a/module/actor.js b/module/actor.js index 8374e42c..9faf2b56 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2109,7 +2109,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ _getSignesDraconiques(coord) { const type = TMRUtility.getTMRType(coord); - return this.itemTypes["signedraconique"].filter(it => it.system.typesTMR.includes(type)); + return this.itemTypes[ITEM_TYPES.signedraconique].filter(it => it.system.typesTMR.includes(type)); } /* -------------------------------------------- */ @@ -2406,7 +2406,7 @@ export class RdDActor extends RdDBaseActorSang { if (this.tmrApp) { ui.notifications.warn("Vous êtes déja dans les TMR....") this.tmrApp.forceTMRDisplay() - return + return false } if (mode != 'visu' && this.isDemiReve()) { ui.notifications.warn("Le personnage est déjà dans les Terres Médianes, elles s'affichent en visualisation") @@ -2414,6 +2414,7 @@ export class RdDActor extends RdDBaseActorSang { } if (mode == 'visu') { await this._doDisplayTMR(mode) + return false } else { const rencontre = this.getRencontreTMREnAttente(); @@ -2426,6 +2427,7 @@ export class RdDActor extends RdDBaseActorSang { buttonLabel: 'Monter dans les TMR', onAction: async () => await this._doDisplayTMR(mode) }) + return true } } @@ -2463,6 +2465,29 @@ export class RdDActor extends RdDBaseActorSang { await this.tmrApp.onDeplacement() } + async quitterTMR(message, viewOnly, cumulFatigue) { + if (this.tmrApp) { + this.tmrApp = undefined + const appliquerFatigue = ReglesOptionnelles.isUsing("appliquer-fatigue"); + await this.santeIncDec( + appliquerFatigue ? "fatigue" : "endurance", + (appliquerFatigue ? 1 : -1) * cumulFatigue) + if (!viewOnly) { + await this.supprimerSignesDraconiques(it => it.system.ephemere && it.system.duree == '1 round', { render: false }) + await this.setEffect(STATUSES.StatusDemiReve, false) + ChatUtility.tellToUserAndGM(message) + } + } + } + + async supprimerSignesDraconiques(filter = it => true, options = { render: true }) { + const signes = this.itemTypes[ITEM_TYPES.signedraconique].filter(filter) + if (signes.length > 0) { + this.deleteEmbeddedDocuments("Item", signes.map(item => item.id), options) + } + } + + /* -------------------------------------------- */ async rollSoins(blesse, blessureId) { const blessure = blesse.blessuresASoigner().find(it => it.id == blessureId); diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 5e548843..bc9b256b 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -246,10 +246,10 @@ export class RdDBaseActorReve extends RdDBaseActor { if (this.isEffectAllowed(statusId)) { const effect = this.getEffectByStatus(statusId); if (!status && effect) { - await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]); + await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true}) } if (status && !effect) { - await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)]); + await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true}) } } } diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index a3f00555..59bdcbb5 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -116,6 +116,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve { blessure: blessure }); } + /* -------------------------------------------- */ async santeIncDec(name, inc, isCritique = false) { if (name == 'fatigue' && !ReglesOptionnelles.isUsing("appliquer-fatigue")) { @@ -179,6 +180,26 @@ export class RdDBaseActorSang extends RdDBaseActorReve { return Math.max(0, Math.min(maxEndVie, maxEndGraves, maxEndCritiques)); } + async onCreateItem(item, options, id) { + switch (item.type) { + case ITEM_TYPES.blessure: + await this.changeBleedingState() + break + } + } + + async onUpdateItem(item, options, id) { + switch (item.type) { + case ITEM_TYPES.blessure: + await this.changeBleedingState() + break + } + } + + async changeBleedingState() { + const bleeding = this.itemTypes[ITEM_TYPES.blessure].find(it => it.isBleeding()) + await this.setEffect(STATUSES.StatusBleeding, bleeding ? true : false) + } /* -------------------------------------------- */ async ajouterBlessure(encaissement, attackerToken = undefined) { diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index b0d8cab0..a1a9b6cb 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -248,28 +248,12 @@ export class RdDBaseActor extends Actor { /* -------------------------------------------- */ async onPreUpdateItem(item, change, options, id) { } - async onCreateItem(item, options, id) { - switch (item.type) { - case ITEM_TYPES.blessure: - await this.changeBleedingState() - break - } - } + async onCreateItem(item, options, id) { } - async onUpdateItem(item, options, id) { - switch (item.type) { - case ITEM_TYPES.blessure: - await this.changeBleedingState() - break - } - } - - async changeBleedingState() { - const bleeding = this.itemTypes[ITEM_TYPES.blessure].find(it => it.isBleeding()) - await this.setEffect(STATUSES.StatusBleeding, bleeding ? true : false) - } + async onUpdateItem(item, options, id) { } async onUpdateActor(update, options, actorId) { } + async onDeleteItem(item, options, id) { if (item.isInventaire()) { await this._removeItemFromConteneur(item) diff --git a/module/chat-utility.js b/module/chat-utility.js index 68f88d4f..bd3e97c8 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -106,6 +106,25 @@ export class ChatUtility { return await ChatMessage.create(messageData) } + static tellToUser(message) { + ChatMessage.create({ content: message, user: game.user.id, whisper: [game.user.id] }); + } + + static tellToGM(message) { + ChatMessage.create({ + user: game.user.id, + content: message, + whisper: ChatUtility.getGMs() + }); + } + + static tellToUserAndGM(message) { + ChatMessage.create({ + user: game.user.id, + content: message, + whisper: ChatUtility.getUserAndGMs() + }) + } static getOwners(document) { return document ? game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) : [game.user] } diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 762f8d23..2f889ba1 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -461,12 +461,7 @@ export class RdDCommands { async supprimerSignesDraconiquesEphemeres() { if (game.user.isGM) { - game.actors.forEach(actor => { - const ephemeres = actor.items.filter(item => item.type = 'signedraconique' && item.system.ephemere); - if (ephemeres.length > 0) { - actor.deleteEmbeddedDocuments("Item", ephemeres.map(item => item.id)); - } - }); + game.actors.forEach(actor => actor.supprimerSignesDraconiques(it => it.system.ephemere)) } else { ui.notifications.warn("Seul le MJ est autorisé à utiliser la commande /signe"); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index fbc88b7f..aa4d1182 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -82,7 +82,7 @@ export class RdDTMRDialog extends Dialog { this.subdialog = undefined this.displaySize = undefined if (!this.viewOnly && !game.user.isGM) { - this.$tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")"); + ChatUtility.tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")"); } this.callbacksOnAnimate = []; const displaySize = TMR_DISPLAY_SIZE.clamp(game.settings.get(SYSTEM_RDD, TMR_DISPLAY_SIZE.code) ?? TMR_DISPLAY_SIZE.def); @@ -343,19 +343,8 @@ export class RdDTMRDialog extends Dialog { this.forceTMRContinueAction() return false } - this.descenteTMR = true; - if (this.actor.tmrApp) { - this.actor.tmrApp = undefined // Cleanup reference - const appliquerFatigue = ReglesOptionnelles.isUsing("appliquer-fatigue") - await this.actor.santeIncDec( - appliquerFatigue ? "fatigue" : "endurance", - (appliquerFatigue ? 1 : -1) * this.cumulFatigue) - if (!this.viewOnly) { - await this.actor.setEffect(STATUSES.StatusDemiReve, false) - this.$tellToUserAndGM(message) - } - - } + this.descenteTMR = true + await await this.actor.quitterTMR(message, this.viewOnly, this.cumulFatigue) this.pixiTMR.close(); this.pixiTMR = undefined await super.close(); @@ -412,7 +401,7 @@ export class RdDTMRDialog extends Dialog { async $ignorerRencontre() { if (this.currentRencontre) { console.log("-> ignorer", this.currentRencontre); - this.$tellToGM(this.actor.name + " a ignoré: " + this.currentRencontre.name); + ChatUtility.tellToGM(this.actor.name + " a ignoré: " + this.currentRencontre.name); await this.$deleteRencontreTMRAtPosition() this.updateTokens(); this.$updateValuesDisplay(); @@ -578,29 +567,6 @@ export class RdDTMRDialog extends Dialog { }, 500); } - /* -------------------------------------------- */ - _tellToUser(message) { - ChatMessage.create({ content: message, user: game.user.id, whisper: [game.user.id] }); - } - - /* -------------------------------------------- */ - $tellToGM(message) { - ChatMessage.create({ - user: game.user.id, - content: message, - whisper: ChatUtility.getGMs() - }); - } - - /* -------------------------------------------- */ - $tellToUserAndGM(message) { - ChatMessage.create({ - user: game.user.id, - content: message, - whisper: ChatUtility.getUserAndGMs() - }) - } - /* -------------------------------------------- */ async manageRencontre(tmr) { if (this.viewOnly) { @@ -680,10 +646,10 @@ export class RdDTMRDialog extends Dialog { const myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE }); this.restoreTMRAfterAction() if (myRoll == 7) { - this._tellToUser(myRoll + ": Rencontre en " + coordTMR); + ChatUtility.tellToUser(myRoll + ": Rencontre en " + coordTMR); return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) } else { - this._tellToUser(myRoll + ": Pas de rencontre en " + coordTMR); + ChatUtility.tellToUser(myRoll + ": Pas de rencontre en " + coordTMR); return undefined; } }