From e82eaa2ad714fc19ff291f883c8963ed2142c062 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 24 Nov 2020 18:54:13 +0100 Subject: [PATCH] Dormir Chateau dormant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gestion de l'heure de chateau dormant. inclus * récupération blessures * récupération vie * conversion de stress * descente vers seuil de rêve --- module/actor-sheet.js | 5 +- module/actor.js | 132 ++++++++++++++++++++++++++++++++++--- module/rdd-utility.js | 9 +++ templates/actor-sheet.html | 2 +- 4 files changed, 136 insertions(+), 12 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index ee4d3d94..12f5330b 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -250,7 +250,10 @@ export class RdDActorSheet extends ActorSheet { html.find('.dormir-une-heure').click((event) => { this.actor.dormir(1); - } ); + }); + html.find('.dormir-chateau-dormant').click((event) => { + this.actor.dormirChateauDormant(); + }); // Display info about queue html.find('.queuesouffle-label a').click((event) => { diff --git a/module/actor.js b/module/actor.js index f34d0e96..ff80ba4a 100644 --- a/module/actor.js +++ b/module/actor.js @@ -331,6 +331,100 @@ export class RdDActor extends Actor { return explications } + async dormirChateauDormant() { + let message = { + whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ), + content : "" + + }; + const blessures = duplicate(this.data.data.blessures); + console.log("dormirChateauDormant", 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,"legere", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste); + await this.update( {"data.blessures": blessures } ); + await this._recupererVie(message); + await this.transformerStress(message); + await this.retourSeuilDeReve(message); + message.content = "A la fin Chateau Dormant, " + message.content +"
Un nouveau jour se lève"; + ChatMessage.create( message ); + } + + async _recupererBlessures(message, type, liste, moindres) { + let count = 0; + const definitions = RdDUtility.getDefinitionsBlessures(); + let definition = definitions.find( d => d.type == type); + for (let blessure of liste) { + if (blessure.jours >= definition.facteur) { + let rolled = await this._jetRecuperationConstitution(Misc.toInt(blessure.soins_complets), message); + blessure.soins_complets = 0; + if (rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) { + message.content += " -- une blessure " + type + " cicatrise"; + count++; + } + else if (rolled.isETotal) { + message.content += " -- une blessure " + type + " s'infecte (temps de guérison augmenté de " + definition.facteur + " jours, perte de vie)"; + blessure.jours = 0; + await this.santeIncDec("vie", -1); + } + else { + message.content += " -- une blessure " + type + " reste stable"; + } + } + else { + blessure.jours++; + } + } + } + + _retrograderBlessure(type, blessure, blessuresMoindres) + { + if (type != "legere") { + let retrograde = blessuresMoindres.find(b => !b.active); + if (!retrograde) { + return false; + } + mergeObject(retrograde, { "active": true, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "localisation": blessure.localisation }); + } + mergeObject(blessure, { "active": false, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "localisation": "" }); + return true; + } + + async _recupererVie(message) { + let blessures = [].concat(this.data.data.blessures.legeres.liste).concat(this.data.data.blessures.graves.liste).concat(this.data.data.blessures.critiques.liste); + let nbBlessures = blessures.filter(b => b.active); + let vieManquante = this.data.data.sante.vie.max - this.data.data.sante.vie.value; + if (nbBlessures == 0 && vieManquante>0) { + let bonusSoins = 0; + for (let b of blessures) + { + bonusSoins = Math.max(bonusSoins, Misc.toInt(b.soins_complets)); + } + let rolled = await this._jetRecuperationConstitution(bonusSoins, message) + if (rolled.isSuccess) { + const gain = Math.min(rolled.isPart ? 2 : 1, vieManquante); + message.content += " -- récupération de vie: " + gain; + await this.santeIncDec("vie", gain); + } + else if (rolled.isETotal) { + message.content += " -- perte de vie: 1"; + await this.santeIncDec("vie", -1); + } + else{ + message.content +=" -- vie stationnaire "; + } + } + } + + async _jetRecuperationConstitution(bonusSoins, message = undefined) { + let difficulte = Misc.toInt(bonusSoins) + Math.min(0, this.data.data.sante.vie.value - this.data.data.sante.vie.max); + let rolled = await RdDResolutionTable.roll(this.data.data.carac.constitution.value, difficulte); + if (message) { + message.content += RdDResolutionTable.explain(rolled).replace(/Jet :/, "Constitution :"); + } + return rolled; + } + /* -------------------------------------------- */ async dormir(heures=1) { let message = { @@ -415,6 +509,14 @@ export class RdDActor extends Actor { } } } + async retourSeuilDeReve(message) { + const seuil = this.data.data.reve.seuil.value; + const reveActuel = this.getReveActuel(); + if (reveActuel > seuil) { + message.content += "
Votre rêve redescend vers son seuil naturel (seuil " + seuil + ", nouveau rêve actuel "+(reveActuel-1)+")"; + await this.reveActuelIncDec(-1); + } + } /* -------------------------------------------- */ async combattreReveDeDragon(force){ @@ -901,17 +1003,27 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async stressTest() { - let stressRoll = this._stressRoll(); - let compteurs = duplicate(this.data.data.compteurs); - let convertion = Math.floor(compteurs.stress.value * stressRoll.factor); - - compteurs.experience.value += convertion; - compteurs.stress.value = Math.max(compteurs.stress.value - convertion - 1, 0); - - ChatMessage.create({ - content: "Vous avez transformé " + convertion + " points de Stress en Expérience" + stressRoll.comment, + const message = { + content: "", whisper: ChatMessage.getWhisperRecipients(game.user.name) - }); + }; + await this.transformerStress(message); + + ChatMessage.create(message); + } + + async transformerStress(message) { + const stress = Misc.toInt(this.data.data.compteurs.stress.value); + if (stress<=0) { + return; + } + let stressRoll = await this._stressRoll(); + let convertis = Math.floor(stress * stressRoll.factor); + + let compteurs = duplicate(this.data.data.compteurs); + compteurs.experience.value += convertis; + compteurs.stress.value = Math.max(stress - convertis - 1, 0); + message.content += "
Vous transformez " + convertis + " points de Stress en Expérience" + stressRoll.comment; await this.update({ "data.compteurs": compteurs }); } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 60fcd3d2..7ab7f419 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -75,6 +75,12 @@ const table2func = { "queues": {descr: "queues : Tire une queue de Dragon", fun "souffle": { descr: "souffle: Tire un Souffle de Dragon", func: RdDRollTables.getSouffle}, "tarot" : { descr: "tarot: Tire une carte de Tarot Dracnique", func: RdDRollTables.getTarot} }; +const definitionsBlessures = [ + { type: "legere", facteur: 2 }, + { type: "grave", facteur : 4 }, + { type: "critique", facteur : 6 } +] + const definitionsEncaissement = { "mortel": [ { minimum: undefined, maximum: 0, endurance: "0", vie: "0", legeres: 0, graves: 0, critiques: 0 }, @@ -289,6 +295,9 @@ export class RdDUtility { return ajustementsConditions; } + static getDefinitionsBlessures() { + return definitionsBlessures; + } /* -------------------------------------------- */ static isTronc( compName ) { diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index d4708cb3..2765b7cd 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -60,7 +60,7 @@
Encaisser des dommages Dormir une heure - Chateau Dormant + Chateau Dormant Montée dans les Terres Médianes ! Montée accélérée dans les Terres Médianes ! Regarder les Terres Médianes