diff --git a/module/actor.js b/module/actor.js index 6c8be21a..f6cade15 100644 --- a/module/actor.js +++ b/module/actor.js @@ -371,12 +371,7 @@ export class RdDActor extends RdDBaseActor { }; for (let i = 0; i < nGrisReve; i++) { await this.dormir(6, { grisReve: true }); - const blessures = duplicate(this.system.blessures); - await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), []); - await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste); - await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste); - await this.update({ "system.blessures": blessures }); - await this._recupererVie(message); + await this._recuperationSante(message); const moralActuel = Misc.toInt(this.system.compteurs.moral.value); if (moralActuel != 0) { @@ -390,6 +385,43 @@ export class RdDActor extends RdDBaseActor { this.sheet.render(true); } + async _recuperationSante(message) { + const maladiesPoisons = this._maladiePoisons(message); + this._messageRecuperationMaladiePoisons(maladiesPoisons, message); + const isMaladeEmpoisonne = maladiesPoisons.length > 0; + const blessures = duplicate(this.system.blessures); + await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), [], isMaladeEmpoisonne); + await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste, isMaladeEmpoisonne); + await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste, isMaladeEmpoisonne); + await this.update({ "system.blessures": blessures }); + await this._recupererVie(message, isMaladeEmpoisonne); + } + + _maladiePoisons(message) { + const actifs = this.items.filter(item => item.type == 'maladie' || (item.type == 'poison' && item.system.active)); + return actifs; + } + + _messageRecuperationMaladiePoisons(actifs, message) { + if (actifs.length > 0) { + const identifies = actifs.filter(it => it.system.identifie); + const nonIdentifies = actifs.filter(it => !it.system.identifie); + message.content += 'Vous souffrez'; + switch (nonIdentifies.length) { + case 0: break; + case 1: message.content += ` d'un mal inconnu`; break; + default: message.content += ` de ${nonIdentifies.length} maux inconnus`; break; + } + if (identifies.length > 0) { + if (nonIdentifies > 0) { + message.content += ' et'; + } else { + message.content += ' de ' + identifies.map(it => it.name).reduce(Misc.joining(', ')); + } + } + } + } + /* -------------------------------------------- */ async dormirChateauDormant() { let message = { @@ -398,11 +430,7 @@ export class RdDActor extends RdDBaseActor { }; const blessures = duplicate(this.system.blessures) - await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), []); - await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste); - await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste); - await this.update({ "system.blessures": blessures }); - await this._recupererVie(message); + await this._recuperationSante(message) await this._jetDeMoralChateauDormant(message); await this._recupereChance(); await this.transformerStress(); @@ -433,7 +461,7 @@ export class RdDActor extends RdDBaseActor { } /* -------------------------------------------- */ - async _recupererBlessures(message, type, liste, moindres) { + async _recupererBlessures(message, type, liste, moindres, isMaladeEmpoisonne) { if (!this.bonusRecuperationPotion) this.bonusRecuperationPotion = 0; let count = 0; const definitions = RdDUtility.getDefinitionsBlessures(); @@ -442,7 +470,7 @@ export class RdDActor extends RdDBaseActor { if (blessure.jours >= definition.facteur) { let rolled = await this._jetRecuperationConstitution(Misc.toInt(blessure.soins_complets) + this.bonusRecuperationPotion, message); blessure.soins_complets = 0; - if (rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) { + if (!isMaladeEmpoisonne && rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) { message.content += ` -- une blessure ${type} cicatrise`; count++; } @@ -481,7 +509,7 @@ export class RdDActor extends RdDBaseActor { } /* -------------------------------------------- */ - async _recupererVie(message) { + async _recupererVie(message, isMaladeEmpoisonne) { const tData = this.system let blessures = [].concat(tData.blessures.legeres.liste).concat(tData.blessures.graves.liste).concat(tData.blessures.critiques.liste); let nbBlessures = blessures.filter(b => b.active); @@ -492,7 +520,7 @@ export class RdDActor extends RdDBaseActor { bonusSoins = Math.max(bonusSoins, Misc.toInt(b.soins_complets)); } let rolled = await this._jetRecuperationConstitution(bonusSoins, message) - if (rolled.isSuccess) { + if (!isMaladeEmpoisonne && rolled.isSuccess) { const gain = Math.min(rolled.isPart ? 2 : 1, vieManquante); message.content += " -- récupération de vie: " + gain; await this.santeIncDec("vie", gain); @@ -1727,7 +1755,7 @@ export class RdDActor extends RdDBaseActor { await item.diminuerQuantite(doses, options); } - + /* -------------------------------------------- */ async boire(item, doses, options = { diminuerQuantite: true }) { const desaltere = item.system.desaltere; @@ -1741,7 +1769,7 @@ export class RdDActor extends RdDBaseActor { } await item.diminuerQuantite(doses, options); } - + static $calculNewSust(value, sust, doses) { return Misc.keepDecimals(Number(value) + Number(sust) * Number(doses), 1); }