From 5e5e391e8dbe393a161ab1261a4c25b3de510df7 Mon Sep 17 00:00:00 2001
From: sladecraven <sylvain@lahiette.com>
Date: Fri, 25 Jun 2021 13:24:43 +0200
Subject: [PATCH 1/5] Fix startup calendar

# Conflicts:
#	system.json
---
 module/rdd-calendrier.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js
index 72aed10b..f17ce6b1 100644
--- a/module/rdd-calendrier.js
+++ b/module/rdd-calendrier.js
@@ -88,7 +88,7 @@ export class RdDCalendrier extends Application {
     // nombre astral
     if (game.user.isGM) {
       this.listeNombreAstral = this._loadListNombreAstral();
-      await this.rebuildListeNombreAstral(); // Ensure always up-to-date
+      await this.rebuildListeNombreAstral(undefined, false); // Ensure always up-to-date
     }
     console.log(this.calendrier, this.calendrierPos, this.listeNombreAstral);
   }
@@ -197,7 +197,7 @@ export class RdDCalendrier extends Application {
   }
 
   /* -------------------------------------------- */
-  async rebuildListeNombreAstral( raison = 'incjour') {
+  async rebuildListeNombreAstral( raison = 'incjour', showDice = true) {
     if (game.user.isGM) {
       let jourCourant = this.getCurrentDayIndex();
 
@@ -208,7 +208,7 @@ export class RdDCalendrier extends Application {
         if (na) {
           newList[i] = duplicate(na);
         } else {
-          newList[i] = await this.ajouterNombreAstral(dayIndex, raison == 'incjour' );
+          newList[i] = await this.ajouterNombreAstral(dayIndex, showDice );
         }
       }
       console.log("SAVE list", newList, jourCourant);

From c094128582a33f1518e4b1f3934bb37d961d5baf Mon Sep 17 00:00:00 2001
From: Vincent Vandemeulebrouck <vincent.vandemeulebrouck@itiviti.com>
Date: Fri, 25 Jun 2021 14:17:58 +0200
Subject: [PATCH 2/5] =?UTF-8?q?Fix:=20raison=20non=20utilis=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

# Conflicts:
#	module/rdd-calendrier.js
---
 module/rdd-astrologie-editeur.js | 2 +-
 module/rdd-calendrier.js         | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/module/rdd-astrologie-editeur.js b/module/rdd-astrologie-editeur.js
index 65ea242d..75913483 100644
--- a/module/rdd-astrologie-editeur.js
+++ b/module/rdd-astrologie-editeur.js
@@ -25,7 +25,7 @@
   /* -------------------------------------------- */  
   async resetNombreAstraux() {
     game.system.rdd.calendrier.resetNombreAstral();
-    await game.system.rdd.calendrier.rebuildListeNombreAstral( 'reset' );
+    await game.system.rdd.calendrier.rebuildListeNombreAstral();
 
     game.system.rdd.calendrier.showAstrologieEditor();
   }
diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js
index f17ce6b1..e387312c 100644
--- a/module/rdd-calendrier.js
+++ b/module/rdd-calendrier.js
@@ -88,7 +88,7 @@ export class RdDCalendrier extends Application {
     // nombre astral
     if (game.user.isGM) {
       this.listeNombreAstral = this._loadListNombreAstral();
-      await this.rebuildListeNombreAstral(undefined, false); // Ensure always up-to-date
+      await this.rebuildListeNombreAstral(false); // Ensure always up-to-date
     }
     console.log(this.calendrier, this.calendrierPos, this.listeNombreAstral);
   }
@@ -197,7 +197,7 @@ export class RdDCalendrier extends Application {
   }
 
   /* -------------------------------------------- */
-  async rebuildListeNombreAstral( raison = 'incjour', showDice = true) {
+  async rebuildListeNombreAstral(showDice = true) {
     if (game.user.isGM) {
       let jourCourant = this.getCurrentDayIndex();
 
@@ -438,7 +438,7 @@ export class RdDCalendrier extends Application {
     this.calendrier.heureRdD = RdDCalendrier.getDefSigne(calendrierData.heureKey); // Index dans heuresList
     game.settings.set("foundryvtt-reve-de-dragon", "calendrier", duplicate(this.calendrier));
 
-    await this.rebuildListeNombreAstral( 'reset' );
+    await this.rebuildListeNombreAstral();
 
     game.socket.emit("system.foundryvtt-reve-de-dragon", {
       msg: "msg_sync_time",

From b06018d252f09f95362998bce82d01e5f6e72820 Mon Sep 17 00:00:00 2001
From: Vincent Vandemeulebrouck <vincent.vandemeulebrouck@itiviti.com>
Date: Fri, 25 Jun 2021 14:40:25 +0200
Subject: [PATCH 3/5] =?UTF-8?q?Fix:=20re-tirage=20de=20d=C3=A9s=20sur=20re?=
 =?UTF-8?q?load?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- ajout d'une option pour explicitement masquer les dés
- si showDice=false dans rdd-calendar, masquer les dés
- sauvegarde de la nouvelle liste plutôt que l'ancienne
---
 module/rdd-calendrier.js | 14 ++++++++------
 module/rdd-dice.js       |  8 +++++---
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js
index e387312c..e4479202 100644
--- a/module/rdd-calendrier.js
+++ b/module/rdd-calendrier.js
@@ -148,13 +148,15 @@ export class RdDCalendrier extends Application {
   }
 
   /* -------------------------------------------- */
-  async ajouterNombreAstral(index, showdice = true) {
-    const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: showdice, rollMode: "selfroll" });
+  async ajouterNombreAstral(index, showDice = true) {
+    const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: showDice, hideDice: !showDice, rollMode: "selfroll" });
     const dateFuture = this.getDateFromIndex(index);
-    ChatMessage.create({
-      whisper: ChatMessage.getWhisperRecipients("GM"),
-      content: `Le chiffre astrologique du ${dateFuture} sera le ${nombreAstral}`
-    });
+    if (showDice) {
+        ChatMessage.create({
+        whisper: ChatMessage.getWhisperRecipients("GM"),
+        content: `Le chiffre astrologique du ${dateFuture} sera le ${nombreAstral}`
+      });
+    }
     return {
       nombreAstral: nombreAstral,
       valeursFausses: [],
diff --git a/module/rdd-dice.js b/module/rdd-dice.js
index ec3afc10..cc4121c4 100644
--- a/module/rdd-dice.js
+++ b/module/rdd-dice.js
@@ -134,12 +134,14 @@ export class RdDDice {
   static async roll(formula, options = { showDice: false, rollMode: undefined }) {
     const roll = new Roll(formula);
     await roll.evaluate({ async: true });
-    roll.showDice = options.showDice;
-    await RdDDice.show(roll, options.rollMode ?? game.settings.get("core", "rollMode"));
+    if (!options.hideDice) {
+      roll.showDice = options.showDice;
+      await RdDDice.show(roll, options.rollMode ?? game.settings.get("core", "rollMode"));
+    }
     return roll;
   }
 
-  static async rollTotal(formula, options = { showDice: false }) {
+  static async rollTotal(formula, options = { showDice: false, hideDice: false }) {
     const roll = await RdDDice.roll(formula, options);
     return roll.total;
   }

From 4f6cc3e6e35da67e5a1725b5194d14158e98532f Mon Sep 17 00:00:00 2001
From: Vincent Vandemeulebrouck <vincent.vandemeulebrouck@itiviti.com>
Date: Sat, 26 Jun 2021 00:09:28 +0200
Subject: [PATCH 4/5] =?UTF-8?q?Fix:=20draconic=20optionnel=20pour=20R?=
 =?UTF-8?q?=C3=AAve=20de=20dragon?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 module/actor.js | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/module/actor.js b/module/actor.js
index 6609d976..e3f200c8 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -371,11 +371,16 @@ export class RdDActor extends Actor {
   /* -------------------------------------------- */
   getBestDraconic() {
     const list = this.getDraconicList();
+    return duplicate(list[0]);
+  }
+  getDraconicOrZero() {
+    const list = this.getDraconicList().filter(it => Misc.data(it).data.niveau >= 0);
     if (list.length == 0) {
-      return { name: "Aucun", data: { name: "Aucun", data: { niveau: 0 } } };
+      return { name: "Aucun", data: { niveau: 0 } };
     }
     return duplicate(list[0]);
   }
+
   getDemiReve() {
     return Misc.templateData(this).reve.tmrpos.coord;
   }
@@ -724,7 +729,7 @@ export class RdDActor extends Actor {
   async combattreReveDeDragon(force) {
     let rollData = {
       actor: this,
-      competence: duplicate(this.getBestDraconic()),
+      competence: duplicate(this.getDraconicOrZero()),
       canClose: false,
       rencontre: duplicate(TMRRencontres.getRencontre('rdd')),
       tmr: true,

From 959093fdd5dc969a52063e81555b4e7a1878699e Mon Sep 17 00:00:00 2001
From: Vincent Vandemeulebrouck <vincent.vandemeulebrouck@itiviti.com>
Date: Sat, 26 Jun 2021 00:55:54 +0200
Subject: [PATCH 5/5] Options de repos #205

---
 module/actor-sheet.js       |   8 +--
 module/actor.js             | 124 +++++++++++++++++++++++++-----------
 module/dialog-repos.js      |  56 ++++++++++++++++
 templates/actor-sheet.html  |   3 +-
 templates/dialog-repos.html |  38 +++++++++++
 5 files changed, 184 insertions(+), 45 deletions(-)
 create mode 100644 module/dialog-repos.js
 create mode 100644 templates/dialog-repos.html

diff --git a/module/actor-sheet.js b/module/actor-sheet.js
index ed649231..d35afefe 100644
--- a/module/actor-sheet.js
+++ b/module/actor-sheet.js
@@ -14,6 +14,7 @@ import { RdDCarac } from "./rdd-carac.js";
 import { RdDItem } from "./item.js";
 import { DialogSplitItem } from "./dialog-split-item.js";
 import { ReglesOptionelles } from "./regles-optionelles.js";
+import { DialogRepos } from "./dialog-repos.js";
 
 /* -------------------------------------------- */
 export class RdDActorSheet extends ActorSheet {
@@ -372,11 +373,8 @@ export class RdDActorSheet extends ActorSheet {
       this.actor.displayTMR("rapide");
     });
 
-    html.find('.dormir-une-heure').click(async event => {
-      this.actor.dormir(1);
-    });
-    html.find('.dormir-chateau-dormant').click(async event => {
-      this.actor.dormirChateauDormant();
+    html.find('.repos').click(async event => {
+      await DialogRepos.create(this.actor);
     });
     html.find('.enlever-tous-effets').click(async event => {
       this.actor.enleverTousLesEffets();
diff --git a/module/actor.js b/module/actor.js
index e3f200c8..05a27000 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -33,7 +33,6 @@ import { RollDataAjustements } from "./rolldata-ajustements.js";
 import { DialogItemAchat } from "./dialog-item-achat.js";
 import { RdDItem } from "./item.js";
 
-
 /* -------------------------------------------- */
 /**
  * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
@@ -55,7 +54,7 @@ export class RdDActor extends Actor {
     switch (sockmsg.msg) {
       case "msg_remote_actor_call":
         return RdDActor.onRemoteActorCall(sockmsg.data);
-      case "msg_reset_nombre_astral": 
+      case "msg_reset_nombre_astral":
         console.log("RESET ASTRAL", game.user.character);
         game.user.character.resetNombreAstral();
         return;
@@ -387,7 +386,7 @@ export class RdDActor extends Actor {
 
   /* -------------------------------------------- */
   async verifierPotionsEnchantees() {
-    let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.categorie.toLowerCase().includes('enchant') );
+    let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.categorie.toLowerCase().includes('enchant'));
     for (let potion of potionsEnchantees) {
       if (!potion.prpermanent) {
         console.log(potion);
@@ -437,6 +436,34 @@ export class RdDActor extends Actor {
     return '';
   }
 
+
+  /* -------------------------------------------- */
+  async grisReve(nGrisReve) {
+    let message = {
+      whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
+      content: `${nGrisReve} jours de gris rêve sont passés. `
+    };
+    for (let i = 0; i < nGrisReve; i++) {
+      await this.dormir(6, { grisReve: true });
+      const blessures = duplicate(Misc.templateData(this).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({ "data.blessures": blessures });
+      await this._recupererVie(message);
+
+      const moralActuel = Misc.toInt(Misc.templateData(this).compteurs.moral.value);
+      if (moralActuel != 0) {
+        await this.moralIncDec(-Math.sign(moralActuel));
+      }
+      await this._recupereChance();
+      await this.transformerStress();
+      this.bonusRecuperationPotion = 0; // Reset potion
+    }
+    ChatMessage.create(message);
+    this.sheet.render(true);
+  }
+
   /* -------------------------------------------- */
   async dormirChateauDormant() {
     let message = {
@@ -457,8 +484,10 @@ export class RdDActor extends Actor {
     this.bonusRecuperationPotion = 0; // Reset potion
     await this.retourSust(message);
     await this.verifierPotionsEnchantees();
-    message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
-    ChatMessage.create(message);
+    if (message.content != "") {
+      message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
+      ChatMessage.create(message);
+    }
     this.sheet.render(true);
   }
 
@@ -593,22 +622,45 @@ export class RdDActor extends Actor {
   }
 
   /* -------------------------------------------- */
-  async dormir(heures) {
+  async dormir(heures, options = { grisReve: false }) {
     let message = {
       whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
-      content: `${this.name}: Vous dormez ${heures == 1 ? 'une' : heures} heure${heures == 1 ? '' : 's'}.`
+      content: ""
     };
     await this.recupereEndurance(message);
-    for (let i = 0; i < heures; i++) {
+    let sep = ""
+    let recuperationReve = "";
+    let i = 0;
+    for (; i < heures; i++) {
       await this._recupererEthylisme(message);
       await this.recupererFatigue(message);
-      await this.recuperationReve(message, 1);
-      if (EffetsDraconiques.isDonDoubleReve(this)) {
-        await this.recuperationReve(message, 2);
+      if (!options.grisReve) {
+        let r = await this.recuperationReve(message);
+        if (r >= 0) {
+          recuperationReve += sep + r;
+          sep = "+";
+        }
+
+        if (r >= 0 && EffetsDraconiques.isDonDoubleReve(this)) {
+          r = await this.recuperationReve(message);
+          if (r >= 0) {
+            recuperationReve += sep + r;
+          }
+        }
+        if (r < 0) {
+          i++;// rêve de dragon pendant l'heure en cours
+          break;
+        }
       }
     }
-    ChatMessage.create(message);
+    if (!options.grisReve) {
+      message.content = `${this.name}: Vous dormez ${i == 0 ? 'une' : i} heure${i == 1 ? '' : 's'}. `
+        + (recuperationReve == "" ? "" : `Vous récupérez ${recuperationReve} Points de rêve. `)
+        + message.content;
+      ChatMessage.create(message);
+    }
     this.sheet.render(true);
+    return i;
   }
 
   /* -------------------------------------------- */
@@ -640,7 +692,6 @@ export class RdDActor extends Actor {
       let fatigue = Misc.templateData(this).sante.fatigue.value;
       const fatigueMin = this._computeFatigueMin();
       if (fatigue <= fatigueMin) {
-        message.content += "Vous êtes déjà reposé. ";
         return;
       }
       fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue));
@@ -672,27 +723,24 @@ export class RdDActor extends Actor {
   }
 
   /* -------------------------------------------- */
-  async recuperationReve(message, demiHeure) {
+  async recuperationReve(message) {
     const seuil = Misc.templateData(this).reve.seuil.value;
     const reveActuel = this.getReveActuel();
-    if (reveActuel >= seuil) {
-      if (demiHeure == 1) {
-        message.content += `Vous avez suffisament rêvé, au delà de votre seuil. `;
-      }
-    }
-    else {
+    if (reveActuel < seuil) {
       let deRecuperation = await RdDDice.rollTotal("1dr");
       console.log("recuperationReve", deRecuperation);
       if (deRecuperation >= 7) {
         // Rêve de Dragon !
-        message.content += `Vous faites un <strong>Rêve de Dragon</strong> de ${deRecuperation} Points de rêve! `;
+        message.content += `Vous faites un <strong>Rêve de Dragon</strong> de ${deRecuperation} Points de rêve qui vous réveille! `;
         await this.combattreReveDeDragon(deRecuperation);
+        return -1;
       }
       else {
-        message.content += `Vous récupérez ${deRecuperation} Points de rêve. `;
         await this.reveActuelIncDec(deRecuperation);
+        return deRecuperation;
       }
     }
+    return 0;
   }
 
   /* -------------------------------------------- */
@@ -749,7 +797,7 @@ export class RdDActor extends Actor {
         label: 'Maîtriser le Rêve de Dragon',
         callbacks: [
           this.createCallbackExperience(),
-          { action: r => this.resultCombatReveDeDragon(r) }
+          { action: async r => this.resultCombatReveDeDragon(r) }
         ]
       }
     );
@@ -903,7 +951,7 @@ export class RdDActor extends Actor {
   async updateCompetenceXP(compName, newXp) {
     let comp = this.getCompetence(compName);
     if (comp) {
-      if ( isNaN(newXp)  || typeof(newXp) != 'number') newXp = 0;
+      if (isNaN(newXp) || typeof (newXp) != 'number') newXp = 0;
       this.checkCompetenceXP(compName, newXp);
       const update = { _id: comp.id, 'data.xp': newXp };
       await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
@@ -918,7 +966,7 @@ export class RdDActor extends Actor {
   async updateCompetenceXPSort(compName, compValue) {
     let comp = this.getCompetence(compName);
     if (comp) {
-      if ( isNaN(compValue)  || typeof(compValue) != 'number') compValue = 0;
+      if (isNaN(compValue) || typeof (compValue) != 'number') compValue = 0;
       const update = { _id: comp.id, 'data.xp_sort': compValue };
       await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
       this.updateExperienceLog("XP Sort", compValue, "XP modifié en sort de " + compName);
@@ -1459,7 +1507,7 @@ export class RdDActor extends Actor {
 
   /* -------------------------------------------- */
   getSonne() {
-    let data = Misc.templateData(this);    
+    let data = Misc.templateData(this);
     return !this.isEntiteCauchemar() && (data.sante?.sonne?.value ?? false);
   }
 
@@ -1699,14 +1747,14 @@ export class RdDActor extends Actor {
   /* -------------------------------------------- */
   async jetDeMoral(situation, messageReussi = undefined, messageManque = undefined) {
     let jetMoral = await this._jetMoral(situation)
-
-    let defaultMessage = `Vous ${jetMoral.ajustement > 0 ? "gagnez du moral" : jetMoral.ajustement < 0 ? "perdez du moral" : "gardez votre moral"}.`;
-    let finMessage = jetMoral.succes ? (messageReussi != undefined ? messageReussi : defaultMessage) : (messageManque != undefined ? messageManque : defaultMessage);
-    let message = `Jet de moral ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}). <br/>${finMessage}`;
-    ChatMessage.create({
-      whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
-      content: message
-    });
+    if (jetMoral.ajustement != 0) {
+      let defaultMessage = jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral";
+      let finMessage = jetMoral.succes ? (messageReussi != undefined ? messageReussi : defaultMessage) : (messageManque != undefined ? messageManque : defaultMessage);
+      ChatMessage.create({
+        whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
+        content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}).`
+      });
+    }
     return jetMoral.ajustement;
   }
 
@@ -2171,7 +2219,7 @@ export class RdDActor extends Actor {
         it = duplicate(Misc.data(it))
         it.data.defaut_carac = "reve";
         return it;
-    });
+      });
     for (let sort of sortList) {
       let draconicsSort = this.getDraconicsSort(draconicList, sort).map(it => it.name);
       for (let index = 0; index < draconicList.length && sort.data.listIndex == undefined; index++) {
@@ -2928,7 +2976,7 @@ export class RdDActor extends Actor {
     const deletions = toDelete.map(it => it._id);
     await this.deleteEmbeddedDocuments("Item", deletions);
   }
-  
+
   /* -------------------------------------------- */
   async ajouteNombreAstral(data) {
     // Gestion expérience (si existante)
@@ -3502,7 +3550,7 @@ export class RdDActor extends Actor {
 
   async ajouterDeniers(gain, fromActorId = undefined) {
     gain = Number.parseInt(gain);
-    if (gain == 0){
+    if (gain == 0) {
       return;
     }
     if (fromActorId && !game.user.isGM) {
@@ -4043,7 +4091,7 @@ export class RdDActor extends Actor {
     effet.flags.core.statusId = effet.id;
     let effectArray = await this.createEmbeddedDocuments('ActiveEffect', [effet]);
     //if (effectArray[0]) {
-      //await effectArray[0].setFlag('core', 'statusId', effet.id);
+    //await effectArray[0].setFlag('core', 'statusId', effet.id);
     //}
   }
 
diff --git a/module/dialog-repos.js b/module/dialog-repos.js
new file mode 100644
index 00000000..e63ee31c
--- /dev/null
+++ b/module/dialog-repos.js
@@ -0,0 +1,56 @@
+import { Misc } from "./misc.js";
+
+export class DialogRepos extends Dialog {
+
+  static async create(actor) {
+    let actorData = Misc.data(actor)
+    const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actorData);
+    new DialogRepos(html, actor).render(true);
+  }
+
+  constructor(html, actor) {
+    let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 400, 'z-index': 99999 };
+    let conf = {
+      title: "Se reposer",
+      content: html,
+      default: "repos",
+      buttons: {
+        "repos": { label: "Se reposer", callback: async it => { this.repos(); } }
+      }
+    };
+    super(conf, options);
+    this.actor = actor;
+  }
+
+  async repos() {
+    await $("[name='nb-heures']").change();
+    await $("[name='nb-jours']").change();
+    const selection = await $("[name='repos']:checked").val();
+    const nbHeures = Number.parseInt(await $("[name='nb-heures']").val());
+    const nbJours = Number.parseInt(await $("[name='nb-jours']").val());
+    switch (selection) {
+      case "sieste": {
+        await this.actor.dormir(nbHeures);
+        return;
+      }
+      case "nuit": {
+        let heuresDormies = await this.actor.dormir(nbHeures);
+        if (heuresDormies == nbHeures){
+          await this.actor.dormirChateauDormant();
+        }
+        return;
+      }
+      case "chateau-dormant":
+        await this.actor.dormirChateauDormant();
+        return;
+      case "gris-reve": {
+        await this.actor.grisReve(nbJours);
+        return;
+      }
+    }
+  }
+  /* -------------------------------------------- */
+  activateListeners(html) {
+    super.activateListeners(html);
+  }
+}
\ No newline at end of file
diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html
index 4358a4a1..e6da1fc8 100644
--- a/templates/actor-sheet.html
+++ b/templates/actor-sheet.html
@@ -57,8 +57,7 @@
             <div>
               <span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
               <span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
-              <span class="dormir-une-heure"><a title="Dormir une heure"><img class="button-img" src="icons/svg/sleep.svg" alt="Dormir une heure"/></a></span>
-              <span class="dormir-chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span>
+              <span class="repos"><a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a></span>
               {{#if data.attributs.hautrevant.value}}
               <span class="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span>
               <span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span>
diff --git a/templates/dialog-repos.html b/templates/dialog-repos.html
new file mode 100644
index 00000000..48aabdd2
--- /dev/null
+++ b/templates/dialog-repos.html
@@ -0,0 +1,38 @@
+<form class="skill-roll-dialog">
+  <div class="flexcol">
+  <div class="flex-group-left">
+    <div class="flexrow"><span>
+      <img class="chat-icon" src="{{img}}" title="{{name}}" alt="{{name}}" />
+      <h4>{{name}} se repose</h4>
+    </span></div>
+    <div class="flexrow"><span>
+      <input type="radio" name="repos" id="chateau-dormant" value="chateau-dormant">
+      <label for="chateau-dormant">Château Dormant</label>
+    </span></div>
+    <hr>
+    <div class="flexrow"><span>
+      <input class type="radio" name="repos" id="sieste" value="sieste">
+      <label for="sieste">Sieste de quelques heures</label>
+    </span></div>
+    <div class="flexrow"><span>
+      <input type="radio" name="repos" id="nuit" value="nuit" checked>
+      <label for="nuit">Dormir la nuit</label>
+    </span></div>
+    <br>
+    <div class="flexrow">
+      <label for="nb-heures">Nombre d'heures</label>
+      <input type="number" name="nb-heures" value="4" data-dtype="Number" />
+    </div>
+    <hr>
+    <div class="flexrow"><span>
+      <input type="radio" name="repos" id="gris-reve" value="gris-reve">
+      <label for="gris-reve">Gris rêve</label>
+    </span></div>
+    <br>
+    <div class="flexrow">
+      <label for="nb-jours">Nombre de jours</label>
+      <input type="number" name="nb-jours" value="2" data-dtype="Number" />
+    </div>
+  </div>
+  </div>
+</form>
\ No newline at end of file