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 @@