From 09f68a5c7c906ffc5343a0402f4d3d0800565d81 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 16 Nov 2020 03:52:34 +0100 Subject: [PATCH 1/5] =?UTF-8?q?#24=20Ajouter=20le=20seuil=20de=20r=C3=AAve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor-sheet.js | 6 ++++++ module/actor.js | 14 ++++++++++++++ system.json | 2 +- template.json | 5 +++++ templates/actor-sheet.html | 6 +++++- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 2f56abe0..058097a1 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -333,6 +333,12 @@ export class RdDActorSheet extends ActorSheet { reve.value = reveValue; this.actor.update( { "data.reve.reve": reve } ); } ); + + // On seuil de reve change + html.find('.seuil-reve-value').change((event) => { + console.log("seuil-reve-value", event.currentTarget) + this.actor.setPointsDeSeuil(event.currentTarget.value); + } ); // On competence change html.find('.competence-xp').change((event) => { diff --git a/module/actor.js b/module/actor.js index 867814e7..27221827 100644 --- a/module/actor.js +++ b/module/actor.js @@ -552,7 +552,21 @@ export class RdDActor extends Actor { reve.value = Math.max(reve.value + value, 0); await this.update( {"data.reve.reve": reve } ); } + + async updatePointDeSeuil(value=1) { + const seuil = Misc.toInt(this.data.data.reve.seuil.value); + const reve = Misc.toInt(this.data.data.carac.reve.value); + if (seuil < reve) { + await this.setPointsDeSeuil(Math.min(seuil+value, reve)); + } + } + async setPointsDeSeuil( value ) { + let seuil = duplicate(this.data.data.reve.seuil); + seuil.value = value; + await this.update( {"data.reve.seuil": seuil } ); + } + /* -------------------------------------------- */ testSiSonne( sante, endurance ) { diff --git a/system.json b/system.json index 6e7ce04d..2fff7d79 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "0.9.48", + "version": "0.9.49", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.6", "templateVersion": 46, diff --git a/template.json b/template.json index 18fbf7be..e975da72 100644 --- a/template.json +++ b/template.json @@ -395,6 +395,11 @@ "value": 0, "label": "Points de Rêve actuels" }, + "seuil": { + "max": 0, + "value": 0, + "label": "Seuil de Rêve" + }, "tmrpos": { "coord": "A1", "label": "Position TMR" diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 15871aec..f76ee362 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -398,7 +398,11 @@
  1. Points de Rêve actuels : - + +
  2. +
  3. + Seuil de Rêve : +
  4. {{#if data.isGM}}
  5. From fd107db75753645c74221c24f7cdb993c09c8b4f Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 16 Nov 2020 03:54:43 +0100 Subject: [PATCH 2/5] =?UTF-8?q?#24=20Ajout=20du=20d=C3=A9=20draconique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/rdd-dice.js | 44 +++++++++++++++++++++++++++ module/rdd-resolution-table.js | 55 +++++++++++++--------------------- 2 files changed, 65 insertions(+), 34 deletions(-) create mode 100644 module/rdd-dice.js diff --git a/module/rdd-dice.js b/module/rdd-dice.js new file mode 100644 index 00000000..f4557fbc --- /dev/null +++ b/module/rdd-dice.js @@ -0,0 +1,44 @@ +export class RdDDice { + static async deRencontre() { + let roll = this.show(new Roll("1d7").evaluate()); + // let roll = this.show(new Roll("1d8r8").evaluate()); + // roll.total = roll.total % 8; + return roll; + } + + static async deDraconique() { + let roll = new Roll("1d8x8").evaluate(); + await this.show(roll); + return roll.total - Math.ceil(roll.total / 8); + } + + static async show(roll, rollMode = "roll") { + await this.showDiceSoNice(roll, rollMode); + return roll; + } + + /* -------------------------------------------- */ + static async showDiceSoNice(roll, rollMode = "roll") { + if (game.modules.get("dice-so-nice") && game.modules.get("dice-so-nice").active) { + let whisper = null; + let blind = false; + switch (rollMode) { + case "blindroll": //GM only + blind = true; + case "gmroll": //GM + rolling player + let gmList = game.users.filter(user => user.isGM); + let gmIDList = []; + gmList.forEach(gm => gmIDList.push(gm.data._id)); + whisper = gmIDList; + break; + case "roll": //everybody + let userList = game.users.filter(user => user.active); + let userIDList = []; + userList.forEach(user => userIDList.push(user.data._id)); + whisper = userIDList; + break; + } + await game.dice3d.showForRoll(roll, game.user, true, whisper, blind); + } + } +} \ No newline at end of file diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 52385881..8f2e0f4b 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -1,4 +1,5 @@ import { Misc } from "./misc.js"; +import { RdDDice } from "./rdd-dice.js"; /** * difficultés au delà de -10 @@ -67,52 +68,38 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static getResultat(code) - { + static getResultat(code) { let resultat = reussites.filter(r => code == r.code); - if (resultat == undefined) - { + if (resultat == undefined) { resultat = reussites.find(r => r.code == "error"); } return resultat; } - /* -------------------------------------------- */ - static roll(carac, difficulte) { - const chances = this.computeChances(carac, difficulte); - let rolled = this.rollChances(chances); - return rolled; - } - - /* -------------------------------------------- */ - static async showDiceSoNice(roll, rollMode = "roll") { - if (game.modules.get("dice-so-nice") && game.modules.get("dice-so-nice").active) { - let whisper = null; - let blind = false; - switch (rollMode) { - case "blindroll": //GM only - blind = true; - case "gmroll": //GM + rolling player - let gmList = game.users.filter(user => user.isGM); - let gmIDList = []; - gmList.forEach(gm => gmIDList.push(gm.data._id)); - whisper = gmIDList; - break; - case "roll": //everybody - let userList = game.users.filter(user => user.active); - let userIDList = []; - userList.forEach(user => userIDList.push(user.data._id)); - whisper = userIDList; - break; - } - await game.dice3d.showForRoll(roll, game.user, true, whisper, blind); + static explain(rolled) { + let message = "
    Jet : " + rolled.roll + " sur " + rolled.score + "%"; + if (rolled.carac != null && rolled.finalLevel!= null) { + message += " (" + rolled.carac + " à " + Misc.toSignedString(rolled.finalLevel) + ")"; } + return message; + + } + /* -------------------------------------------- */ + static async roll(carac, finalLevel, showDice=false) { + let chances = this.computeChances(carac, finalLevel); + chances.showDice = showDice; + let rolled = await this.rollChances(chances); + rolled.carac = carac; + rolled.finalLevel = finalLevel; + return rolled; } /* -------------------------------------------- */ static async rollChances(chances) { let myRoll = new Roll("d100").roll(); - await this.showDiceSoNice(myRoll ); + if (chances.showDice) { + await RdDDice.showDiceSoNice(myRoll); + } chances.roll = myRoll.total; mergeObject(chances, this._computeReussite(chances, chances.roll)); return chances; From bddad92f5cbffc851be41044ce4a7e365f546daa Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 16 Nov 2020 04:01:36 +0100 Subject: [PATCH 3/5] renommer getReveActuel --- module/actor.js | 12 ++++++------ module/rdd-tmr-dialog.js | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/module/actor.js b/module/actor.js index 27221827..6cd29ae9 100644 --- a/module/actor.js +++ b/module/actor.js @@ -88,7 +88,7 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - getCurrentReve() { + getReveActuel() { return this.data.data.reve.reve.value; } @@ -364,7 +364,7 @@ export class RdDActor extends Actor { for(let troncName of troncList) { message += "
    " + troncName; } - ChatMessage.create( { title : "Compétence Tron", + ChatMessage.create( { title : "Compétence Tronc", content: message } ); } const update = {_id: comp._id, 'data.niveau': maxNiveau }; @@ -577,7 +577,7 @@ export class RdDActor extends Actor { sante.sonne.value = true; if (result == 1) { sante.sonne.value = false; - let xp = parseInt(this.data.data.carac.constitution.xp) + parseInt(1); + let xp = Misc.toInt(this.data.data.carac.constitution.xp) + 1; this.update( {"data.carac.constitution.xp": xp } ); // +1 XP ! // TODO : Output to chat } @@ -781,7 +781,7 @@ export class RdDActor extends Actor { let carac; if ( caracName == "reveActuel") { // Fake carac for Reve Actuel carac = {type: "number", - value: this.data.data.reve.reve.value, + value: this.getReveActuel(), label: "Rêve Actuel" } } else { @@ -818,7 +818,7 @@ export class RdDActor extends Actor { if (mode != "visu") { let minReveValue = (isRapide) ? 3 : 2; - if (this.data.data.reve.reve.value <= minReveValue ) { + if (this.getReveActuel() < minReveValue ) { ChatMessage.create( { title: "Montée impossible !", content: "Vous n'avez plus assez de Points de Reve pour monter dans les Terres Médianes", whisper: ChatMessage.getWhisperRecipients(game.user.name) } ); return; @@ -830,7 +830,7 @@ export class RdDActor extends Actor { draconic: this.getDraconicList(), sort: this.getSortList(), caracReve: this.data.data.carac.reve.value, - pointsReve: this.data.data.reve.reve.value, + pointsReve: this.getReveActuel(), isRapide: isRapide } let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', data ); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 64df5d9e..51635f21 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -103,7 +103,7 @@ export class RdDTMRDialog extends Dialog { this.updatePreviousRencontres(); const draconic = this.actor.getBestDraconic(); - const carac = this.actor.getCurrentReve(); + const carac = this.actor.getReveActuel(); // TODO: ajouter l'état général? const etatGeneral = this.actor.data.data.compteurs.etat.value const difficulte = draconic.data.niveau - this.currentRencontre.force; @@ -149,6 +149,7 @@ export class RdDTMRDialog extends Dialog { if (rencontre) { // Manages it console.log("manageRencontre", rencontre) this.currentRencontre = duplicate(rencontre); + let dialog = new Dialog({ title: "Rencontre en TMR!", content: "Vous recontrez un " + rencontre.name + " de force " + rencontre.force + "
    ", @@ -205,7 +206,7 @@ export class RdDTMRDialog extends Dialog { if (cellDescr.type == "lac" || cellDescr.type == "fleuve" || cellDescr.type == "marais") { let draconic = this.actor.getBestDraconic(); - let carac = this.actor.getCurrentReve(); + let carac = this.actor.getReveActuel(); // TODO: ajouter l'état général? const etatGeneral = this.actor.data.data.compteurs.etat.value let difficulte = draconic.data.niveau - 7; From d3e48d6e5b2c647d49346f1f7de5b49e0f80ad0f Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 16 Nov 2020 04:31:53 +0100 Subject: [PATCH 4/5] =?UTF-8?q?#24=20Fix=20sur=20la=20rencontre=20de=20R?= =?UTF-8?q?=C3=AAve=20de=20Dragon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + evaluation de la force --- module/rdd-dice.js | 6 -- module/rdd-tmr-dialog.js | 11 ++-- module/rdd-utility.js | 1 - module/tmr-utility.js | 124 +++++++++++++++++++++++---------------- 4 files changed, 77 insertions(+), 65 deletions(-) diff --git a/module/rdd-dice.js b/module/rdd-dice.js index f4557fbc..873fab56 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -1,10 +1,4 @@ export class RdDDice { - static async deRencontre() { - let roll = this.show(new Roll("1d7").evaluate()); - // let roll = this.show(new Roll("1d8r8").evaluate()); - // roll.total = roll.total % 8; - return roll; - } static async deDraconique() { let roll = new Roll("1d8x8").evaluate(); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 51635f21..5b0cb86b 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -111,16 +111,15 @@ export class RdDTMRDialog extends Dialog { let rolled = RdDResolutionTable.roll(carac, difficulte); let message = "
    Test : Rêve actuel / " + draconic.name + " / " + this.currentRencontre.name + "" + "
    " - + "
    Jet : " + carac + " / " + difficulte + " -> " + rolled.score + "%
    Résutat : " + rolled.roll; - + + RdDResolutionTable.explain(rolled); if (rolled.isEchec) { - TMRUtility.processRencontreEchec(this.actor, this.currentRencontre); + TMRUtility.processRencontreEchec(this.actor, this.currentRencontre, rolled); this._tellToUser("Vous avez échoué à maîtriser un " + this.currentRencontre.name + " de force " + this.currentRencontre.force - + "
    Vous quittez brutalement les Terres Médianes !" + message);; + + "
    Vous quittez brutalement les Terres Médianes !" + message); this.close(); } else { - TMRUtility.processRencontreReussite(this.actor, this.currentRencontre); + TMRUtility.processRencontreReussite(this.actor, this.currentRencontre, rolled); this._tellToUser("Vous avez réussi à maîtriser un " + this.currentRencontre.name + " de force " + this.currentRencontre.force + message); } console.log("-> matriser", this.currentRencontre); @@ -142,7 +141,7 @@ export class RdDTMRDialog extends Dialog { console.log("manageRencontre", deRencontre, rencontre); if (rencontre == undefined) { if (deRencontre.total == 7) { - rencontre = TMRUtility.rencontreTMRRoll(coordTMR, cellDescr); + rencontre = await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr); } } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index a87341bd..308c03c2 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -2,7 +2,6 @@ import { TMRUtility } from "./tmr-utility.js"; import { RdDRollTables } from "./rdd-rolltables.js"; -import { RdDResolutionTable } from "./rdd-resolution-table.js"; const level_category = { "generale": "-4", diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 24e5abbc..c1099357 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -1,3 +1,5 @@ +import { RdDDice } from "./rdd-dice.js"; + /* -------------------------------------------- */ const TMRMapping = { A1: { type: "cite", label: "Cité Vide"}, @@ -233,7 +235,7 @@ const rencontresTable = [ {name:"Tourbillon noir", data: { force: "2d8", ignorer: false, derober: true, refoulement: 1, cite: "95-97", sanctuaire: "95-97", plaines: "94-97", pont: "94-97", collines: "94-97", forêt: "94-97", monts: "93-97", desert: "93-97", fleuve: "90-97", lac: "90-97", marais: "87-97", gouffre: "90-97", necropole: "81-97", desolation: "81-97" } }, - {name:"Rêve de Dragon", data: { force: "1d7", ignorer: false, derober: true, refoulement: 2, + {name:"Rêve de Dragon", data: { force: "1ddr + 7", ignorer: false, derober: true, refoulement: 2, cite: "98-00", sanctuaire: "98-00", plaines: "98-00", pont: "98-00", collines: "98-00", forêt: "98-00", monts: "98-00", desert: "98-00", fleuve: "98-00", lac: "98-00", marais: "98-00", gouffre: "98-00", necropole: "98-00", desolation: "98-00" } } ] @@ -264,32 +266,80 @@ export class TMRUtility { } /* -------------------------------------------- */ - static rencontreTMRRoll( coordTMR, cellDescr ) + static async rencontreTMRRoll( coordTMR, cellDescr ) { - let val = new Roll("d100").roll().total; - //console.log("Rencontre !!!!", val, coordTMR, cellDescr); - + let rencontre = this.rencontreTMRTypeCase(cellDescr.type); + if (rencontre){ + rencontre = duplicate(rencontre); + rencontre.force = await this.evaluerForceRencontre(rencontre); + rencontre.coord = coordTMR; + } + return rencontre; + } + + static rencontreTMRTypeCase(typeTMR, roll=undefined) { + if (!roll) + { + roll = new Roll("d100").roll().total; + } + typeTMR = typeTMR.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); for( let rencontre of rencontresTable) { - let scoreDef = rencontre.data[cellDescr.type]; + let scoreDef = rencontre.data[typeTMR]; let min = scoreDef.substr(0,2); let max = scoreDef.substr(3,2); - //console.log(val, scoreDef, min, max); - if ( val >= min && val <= max) { - rencontre.force = new Roll(rencontre.data.force).roll().total; - rencontre.coord = coordTMR + if (max=="00") max = 100; + if (roll >= min && roll <= max) { return rencontre; } } } + + /* -------------------------------------------- */ + /** + * Retourne une recontre en fonction de la case et du tirage + * @param {*} caseName + * @param {*} roll + */ + static async getRencontre( caseName, roll ) { + if (!roll) { + roll = new Roll("1d100").roll().total; + } + if ( !caseName) { + ChatMessage.create({ content: "Un nom de case doit être indiqué (ie /tmrr desert ou /tmrr cite)" }); + return false; + } + + let rencontre = this.rencontreTMRTypeCase(caseName, roll); + if (rencontre){ + let force = await this.evaluerForceRencontre(rencontre); + ChatMessage.create({ content: "Rencontre en " + caseName + "(jet : " + roll + "%)
    Vous rencontrez un " + rencontre.name + " d'une force de " + force + " Points de Rêve" }); + } + return false; + } + /* -------------------------------------------- */ static getRandomLocationType( coordTMR ) { let descr = this.getTMRDescription( coordTMR ); // TODO random get same type - } - + + static async evaluerForceRencontre(rencontre) { + if (this.isReveDeDragon(rencontre)) { + let ddr = await RdDDice.deDraconique(); + return ddr + 7; + } + else { + const roll = new Roll(rencontre.data.force).evaluate(); + return roll.total; + } + } + + static isReveDeDragon(rencontre) { + return rencontre.name.toLowerCase() == "Rêve de Dragon".toLowerCase(); + } + /* -------------------------------------------- */ - static async processRencontreReussite( actor, rencontre ) { + static async processRencontreReussite( actor, rencontre, rolled ) { let msg = "Vous avez réussi votre maîtrise ! "; console.log("processRencontreReussite", actor, rencontre); if (rencontre.name == "Messagers des Rêves") { @@ -321,18 +371,18 @@ export class TMRUtility { msg += "Ce Tourbillon Noir disparait !" } else if (rencontre.name == "Rêve de Dragon") { - msg += "Un Rêve de Dragon survient !" - + msg += "Vous maîtrisez le Rêve de Dragon !" + msg += actor.appliquerReveDeDragon(rolled, rencontre.force); } } /* -------------------------------------------- */ - static async processRencontreEchec( actor, rencontre ) { + static async processRencontreEchec( actor, rencontre, rolled ) { let msg = "Vous avez échoué à votre maîtrise ! "; if (rencontre.name == "Messagers des Rêves") { msg += "Le Messager des Rêves s'éloigne de vous !"; - + } else if (rencontre.name == "Passeur des Rêves") { msg += "Le Passeur des Rêves s'éloigne de vous !"; @@ -342,7 +392,6 @@ export class TMRUtility { } else if (rencontre.name == "Mangeur de Rêve") { await actor.updatePointsDeReve( -rencontre.force ); msg += "Ce Mangeur des Rêves croque votre Rêve ! Vous perdez " + rencontre.force + " points de rêve actuels, votre nouveau total est de " + actor.data.data.reve.reve.value; - } else if (rencontre.name == "Changeur de Rêve") { let coordTMR = actor.data.data.reve.tmrpos.coord; let newcoordTMR = this.getRandomLocationType(coordTMR); @@ -353,15 +402,16 @@ export class TMRUtility { } else if (rencontre.name == "Reflet d'ancien Rêve") { msg += "Votre Rêve est Brisé, vous quittez les Terres Médianes"; - + } else if (rencontre.name == "Tourbillon blanc") { msg += "Votre Rêve est Brisé, vous quittez les Terres Médianes"; - + } else if (rencontre.name == "Tourbillon noir") { msg += "Votre Rêve est Brisé, vous quittez les Terres Médianes"; - - } else if (rencontre.name == "Rêve de Dragon") { + } else if (rencontre.name == "Rêve de Dragon") { + msg += "Le Rêve de Dragon tourne au cauchemar !" + msg += actor.appliquerReveDeDragon(rolled, rencontre.force); } } @@ -377,36 +427,6 @@ export class TMRUtility { return result; } - /* -------------------------------------------- */ - /** - * Retourne une recontre en fonction de la case ou du tirage - * @param {*} caseName - * @param {*} roll - */ - static getRencontre( caseName, roll ) { - if (!roll) { - roll = new Roll("1d100").roll().total; - } - if ( !caseName) { - ChatMessage.create({ content: "Un nom de case doit être indiqué (ie /tmrr desert ou /tmrr cite)" }); - return false; - } - caseName = caseName.toLowerCase(); - caseName = caseName.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - //console.log("Case : ", caseName); - for( let renc of rencontresTable) { - let scoreDef = renc.data[caseName]; - let min = scoreDef.substr(0,2); - let max = scoreDef.substr(3,2); - if ( roll >= min && roll <= max) { - let force = new Roll(renc.data.force).roll().total; - ChatMessage.create({ content: "Rencontre en " + caseName + "(jet : " + roll + "%)
    Vous rencontrez un " + renc.name + " d'une force de " + force + " Points de Rêve" }); - return false; - } - } - - } - /* -------------------------------------------- */ /** * From 351e8484966a851130856d2b9b835964624ea2f6 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 16 Nov 2020 04:32:42 +0100 Subject: [PATCH 5/5] #24 Ajout d'action pour dormir 1h --- module/actor-sheet.js | 4 ++ module/actor.js | 125 ++++++++++++++++++++++++++++++++++--- module/rdd-roll-dialog.js | 2 +- module/rdd-tmr-dialog.js | 2 +- templates/actor-sheet.html | 3 + 5 files changed, 124 insertions(+), 12 deletions(-) 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 @@ +