diff --git a/module/actor-sheet.js b/module/actor-sheet.js
index 058097a1..cb509865 100644
--- a/module/actor-sheet.js
+++ b/module/actor-sheet.js
@@ -299,6 +299,10 @@ export class RdDActorSheet extends ActorSheet {
this.actor.displayTMR( "rapide" );
});
+ html.find('.dormir-une-heure').click((event) => {
+ this.actor.dormir(1);
+ } );
+
// Display info about queue
html.find('.queuesouffle-label a').click((event) => {
let myID = event.currentTarget.attributes['data-item-id'].value;
diff --git a/module/actor.js b/module/actor.js
index 6cd29ae9..66d33bd0 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -10,6 +10,8 @@ import { RdDTMRDialog } from "./rdd-tmr-dialog.js";
import { Misc } from "./misc.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js";
+import { RdDDice } from "./rdd-dice.js";
+import { RdDRollTables } from "./rdd-rolltables.js";
export class RdDActor extends Actor {
@@ -120,11 +122,10 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async performRoll(rollData) {
-
- // Perform the roll
- let rolled = await RdDResolutionTable.rollChances(rollData.rollTarget);
+ let rolled = await RdDResolutionTable.roll(rollData.carac, rollData.finalLevel);
//rolled.isPart = true; // Pour tester le particulières
rollData.rolled = rolled; // garder le résultat
+ console.log("performRoll", rollData, rolled)
this.currentRollData = rollData;
if (rolled.isPart && rollData.arme && !rollData.attackerRoll) { // Réussite particulière avec attaque -> choix !
let message = "Réussite particulière en attaque";
@@ -221,7 +222,7 @@ export class RdDActor extends Actor {
let chatOptions = {
content: "Test : " + rollData.selectedCarac.label + " / " + resumeCompetence + ""
+ "
Difficultés libre : " + rollData.diffLibre + " / conditions : " + Misc.toSignedString(rollData.diffConditions) +" / état : " + rollData.etat
- + "
Jet : " + rolled.roll + " sur "+ rolled.score + "% (" + rollData.selectedCarac.value + " à " +Misc.toSignedString(rollData.finalLevel) + ")"
+ + RdDResolutionTable.explain(rolled)
+ "
" + quality + ""
+ explications + xpmsg,
user: game.user._id,
@@ -319,6 +320,76 @@ export class RdDActor extends Actor {
return explications
}
+ async dormir(heures=1) {
+ for (let i=0; i seuil) {
+ message.content = "Vous avez déjà récupéré suffisament (seuil " + seuil + ", rêve actuel "+reve+")";
+ }
+ else {
+ let deRecuperation = await RdDDice.deDraconique();
+ console.log("recuperationReve", deRecuperation);
+ if (deRecuperation>=7)
+ {
+ // Rêve de Dragon !
+ message.content = "Vous faites un Rêve de Dragon de " + deRecuperation + " Points de rêve";
+ message.content += await this.combattreReveDeDragon(deRecuperation);
+ }
+ else{
+ message.content = "Vous récupérez " + deRecuperation + " Points de rêve";
+ await this.updatePointsDeReve(deRecuperation);
+ }
+ }
+ ChatMessage.create( message );
+ }
+
+ async combattreReveDeDragon(force){
+ let draconic = this.getBestDraconic();
+ let niveau = Math.max(0, draconic.data.niveau);
+ let etat = this.data.data.compteurs.etat.value;
+ let difficulte = niveau - etat - force;
+ let reveActuel = this.getReveActuel();
+ let roll = await RdDResolutionTable.roll(reveActuel, difficulte);
+ let message = ""
+ const resultatRdD = await this.appliquerReveDeDragon(roll, force);
+ return resultatRdD;
+ }
+
+ async appliquerReveDeDragon(roll, force) {
+ let message = "";
+ if (roll.isSuccess) {
+ message += "
Vous gagnez " + force + " points de Rêve";
+ this.updatePointDeSeuil();
+ await this.updatePointsDeReve(force);
+ }
+ if (roll.isPart) {
+ // TODO: Dialog pour choix entre HR opu général?
+ let tete = "à déterminer";
+ message += "
Vous gagnez une Tête de dragon: " + tete;
+ }
+ if (roll.isEchec) {
+ message += "
Vous subissez une Queue de Dragon";
+ this.ajouterQueue();
+ }
+ if (roll.isETotal) {
+ message += "
A cause de votre échec total, vous subissez une deuxième Queue de Dragon !"
+ this.ajouterQueue();
+ }
+ return message;
+ }
+
/* -------------------------------------------- */
async sortMisEnReserve(rollData, sort) {
let reserve = duplicate(this.data.data.reve.reserve);
@@ -331,6 +402,11 @@ export class RdDActor extends Actor {
updateCarac( caracName, caracValue )
{
let caracpath = "data.carac." + caracName + ".value"
+ if (caracName == reve) {
+ if (caracValue > Misc.toInt(this.data.data.reve.seuil.value)) {
+ this.setPointDeSeuil(caracValue);
+ }
+ }
this.update( { caracpath: caracValue } );
}
@@ -499,18 +575,47 @@ export class RdDActor extends Actor {
let total = new Roll("d20").roll().total;
if ( total <= refoulement.value ) {
refoulement.value = 0;
-
- let souffle = RdDRollTables.getSouffle();
- ChatMessage.create( { title : "Souffle de Dragon",
- content: game.user.name + " subit un Souffle de Dragon : " + souffle.name } );
- this.actor.createOwnedItem(souffle);
-
+ this.ajouterSouffle();
ret = "souffle";
}
await this.update( {"data.reve.refoulement": refoulement } );
return ret;
}
+
+ ajouterSouffle() {
+ let souffle = RdDRollTables.getSouffle();
+ // ChatMessage.create({
+ // title: "Souffle de Dragon",
+ // content: this.name + " subit un Souffle de Dragon : " + souffle.name
+ // });
+ // this.actor.createOwnedItem(souffle);
+ }
+
+ async ajouterQueue() {
+ // TODO: Déterminer si Thanatos a été utilisé? => laisser le joueur ne pas choisir Thanatos => choisir sa voie?
+ let utiliseThanatos = false;
+ let queue;
+ if (utiliseThanatos) {
+ queue = await RdDRollTables.getOmbre();
+ // mettre à jour: plus d'ombre en vue
+ }
+ else {
+ queue = await RdDRollTables.getQueue();
+ }
+ /*
+ // TODO: convertir la queue obtenue en nouvel item ...
+ // ou bien l'ajouter à la liste spécifique => this.data.data.reve.queues
+ this.createOwnedItem(queue);
+
+ ChatMessage.create({
+ title: "Queue de Dragon",
+ content: this.name + " subit un Queue de Dragon : " + queue.name
+ });
+
+ return queue.name;
+ */
+ }
/* -------------------------------------------- */
async deleteTMRRencontreAtPosition( ) {
diff --git a/module/rdd-roll-dialog.js b/module/rdd-roll-dialog.js
index f1615405..d315e679 100644
--- a/module/rdd-roll-dialog.js
+++ b/module/rdd-roll-dialog.js
@@ -66,7 +66,7 @@ export class RdDRollDialog extends Dialog {
let rollLevel = RdDRollDialog._computeFinalLevel(rollData);
rollData.finalLevel = rollLevel;
- rollData.rollTarget = RdDResolutionTable.computeChances(rollData.selectedCarac.value, rollData.finalLevel);
+ rollData.carac = rollData.selectedCarac.value
// Sort management
if ( rollData.selectedSort ) {
diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js
index 5b0cb86b..36df713a 100644
--- a/module/rdd-tmr-dialog.js
+++ b/module/rdd-tmr-dialog.js
@@ -222,7 +222,7 @@ export class RdDTMRDialog extends Dialog {
explication += "Vous êtes entré sur une case humide, et vous avez réussi votre maîtrise !"
}
explication += "
Test : Rêve actuel / " + draconic.name + " / " + cellDescr.type + ""
- + "
Jet : " + carac + " / " + difficulte + " -> " + rolled.score + "%
Résutat : " + rolled.roll;
+ + RdDResolutionTable.explain(rolled);
if (rolled.isETotal) {
let souffle = RdDRollTables.getSouffle();
diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html
index f76ee362..8e26041d 100644
--- a/templates/actor-sheet.html
+++ b/templates/actor-sheet.html
@@ -394,6 +394,9 @@
+