From 66dff68daf63d0fc5409eea420fd338ae7e2e17d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 29 Jan 2021 15:13:59 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20rencontre=20TMR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mise en forme des messages - Ajout de messages poétiques - regroupement par rencontre de la gestion et des messages - séparation table de proba/type de rencontre - quelques fixes lors de tests (mes régressions?) - lors d'un déplacement avec un tourbillon, on n'a pas à vaincre les cases humides - pas de rencontre après un déplacement par une rencontre --- module/actor.js | 10 +- module/rdd-commands.js | 3 +- module/rdd-main.js | 8 +- module/rdd-tmr-dialog.js | 450 +++++++++++++------------- module/rdd-tmr-rencontre-dialog.js | 13 +- module/rolldata-ajustements.js | 6 + module/tmr-rencontres.js | 487 +++++++++++++++++++++++++++++ module/tmr-utility.js | 381 +++++++--------------- styles/simple.css | 8 + templates/chat-rencontre-tmr.html | 16 + 10 files changed, 865 insertions(+), 517 deletions(-) create mode 100644 module/tmr-rencontres.js create mode 100644 templates/chat-rencontre-tmr.html diff --git a/module/actor.js b/module/actor.js index 5ea535e0..0470f4d4 100644 --- a/module/actor.js +++ b/module/actor.js @@ -549,7 +549,7 @@ export class RdDActor extends Actor { 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); + /*message.content += */await this.combattreReveDeDragon(deRecuperation); } else { message.content += `
Vous récupérez ${deRecuperation} Points de rêve`; @@ -599,7 +599,11 @@ export class RdDActor extends Actor { if (roll.isETotal) { message += "
A cause de votre échec total, vous subissez une deuxième Queue de Dragon: " + await this.ajouterQueue(); } - return message; + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + content: message + }); + } /* -------------------------------------------- */ @@ -1704,7 +1708,7 @@ export class RdDActor extends Actor { competence: this.getBestDraconic(), selectedSort: sortList[0], coord: coord, - coordLabel: TMRUtility.getTMRDescription(coord).label, + coordLabel: TMRUtility.getTMR(coord).label, diffLibre: sortList[0].data.difficulte, // Per default at startup coutreve: Array(20).fill().map((item, index) => 1 + index) } diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 8190042c..d148eca9 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -9,6 +9,7 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js"; import { RdDRollTables } from "./rdd-rolltables.js"; import { RdDUtility } from "./rdd-utility.js"; +import { TMRRencontres } from "./tmr-rencontres.js"; import { TMRUtility } from "./tmr-utility.js"; const rddRollNumeric = /(\d+)\s*([\+\-]?\d+)?\s*(s)?/; @@ -187,7 +188,7 @@ export class RdDCommands { /* -------------------------------------------- */ async getRencontreTMR(params) { if (params.length == 1 || params.length ==2) { - return TMRUtility.getRencontre(params[0], params[1]) + return TMRRencontres.rollRencontre(params[0], params[1]) } else { return false; diff --git a/module/rdd-main.js b/module/rdd-main.js index 761d6f85..aa5c25b5 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -26,6 +26,7 @@ import { RdDItemCompetence } from "./item-competence.js"; import { StatusEffects } from "./status-effects.js"; import { RddCompendiumOrganiser } from "./rdd-compendium-organiser.js"; import { ReglesOptionelles } from "./regles-optionelles.js"; +import { TMRRencontres } from "./tmr-rencontres.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -108,7 +109,10 @@ Hooks.once("init", async function () { // preload handlebars templates RdDUtility.preloadHandlebarsTemplates(); // Create useful storage space - game.system.rdd = { TMRUtility: TMRUtility } + game.system.rdd = { + TMRUtility, + RdDUtility + } /* -------------------------------------------- */ game.settings.register("foundryvtt-reve-de-dragon", "accorder-entite-cauchemar", { @@ -225,6 +229,8 @@ Hooks.once("init", async function () { RdDActor.init(); RddCompendiumOrganiser.init(); ReglesOptionelles.init(); + TMRUtility.init(); + TMRRencontres.init(); }); /* -------------------------------------------- */ diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index fc54fa2b..61b9059e 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -2,21 +2,14 @@ * Extend the base Dialog entity by defining a custom window to perform spell. * @extends {Dialog} */ +import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RdDUtility } from "./rdd-utility.js"; import { TMRUtility } from "./tmr-utility.js"; -import { RdDRollTables } from "./rdd-rolltables.js"; +import { tmrConstants } from "./tmr-utility.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; - -/* -------------------------------------------- */ -const tmrConstants = { - col1_y: 30, - col2_y: 55, - cellw: 55, - cellh: 55, - gridx: 28, - gridy: 28 -} +import { TMRRencontres } from "./tmr-rencontres.js"; +import { ChatUtility } from "./chat-utility.js"; /* -------------------------------------------- */ export class RdDTMRDialog extends Dialog { @@ -46,22 +39,22 @@ export class RdDTMRDialog extends Dialog { this.nbFatigue = this.viewOnly ? 0 : 1; // 1 premier point de fatigue du à la montée this.rencontresExistantes = duplicate(this.actor.data.data.reve.rencontre.list); this.sortReserves = duplicate(this.actor.data.data.reve.reserve.list); - this.casesSpeciales = this.actor.data.items.filter( item => item.type == 'casetmr'); + this.casesSpeciales = this.actor.data.items.filter(item => item.type == 'casetmr'); this.allTokens = []; this.rencontreState = 'aucune'; this.pixiApp = new PIXI.Application({ width: 720, height: 860 }); - if (!this.viewOnly){ + if (!this.viewOnly) { this.actor.setStatusDemiReve(true); this._tellToGM(this.actor.name + " monte dans les terres médianes (" + mode + ")"); } } - + /* -------------------------------------------- */ close() { this.actor.santeIncDec("fatigue", this.nbFatigue).then(super.close()); // moving 1 cell costs 1 fatigue this.actor.tmrApp = undefined; // Cleanup reference this.actor.setStatusDemiReve(false); - if (! this.viewOnly) { + if (!this.viewOnly) { this._tellToGM(this.actor.name + " a quitté les terres médianes"); } } @@ -78,14 +71,14 @@ export class RdDTMRDialog extends Dialog { displaySpecificCase() { for (let caseTMR of this.casesSpeciales) { console.log("SPEC CASE ", caseTMR); - if ( caseTMR.data.specific == 'trounoir') { - this._trackToken(this._tokenTrouNoir( caseTMR.data.coord )); - } else if ( caseTMR.data.specific == 'attache') { - this._trackToken(this._tokenTerreAttache( caseTMR.data.coord )); - } else if ( caseTMR.data.specific == 'debordement') { - this._trackToken(this._tokenDebordement( caseTMR.data.coord )); - } else if ( caseTMR.data.specific == 'maitrisee') { - this._trackToken(this._tokenMaitrisee( caseTMR.data.coord )); + if (caseTMR.data.specific == 'trounoir') { + this._trackToken(this._tokenTrouNoir(caseTMR.data.coord)); + } else if (caseTMR.data.specific == 'attache') { + this._trackToken(this._tokenTerreAttache(caseTMR.data.coord)); + } else if (caseTMR.data.specific == 'debordement') { + this._trackToken(this._tokenDebordement(caseTMR.data.coord)); + } else if (caseTMR.data.specific == 'maitrisee') { + this._trackToken(this._tokenMaitrisee(caseTMR.data.coord)); } } } @@ -120,10 +113,10 @@ export class RdDTMRDialog extends Dialog { this.close(); } /* -------------------------------------------- */ - async refouler(data) { - this._tellToGM(this.actor.name + " a refoulé : " + this.currentRencontre.name ); + async refouler() { + this._tellToGM(this.actor.name + " a refoulé : " + this.currentRencontre.name); await this.actor.deleteTMRRencontreAtPosition(); // Remove the stored rencontre if necessary - let result = await this.actor.ajouterRefoulement( this.currentRencontre.data.refoulement ); + await this.actor.ajouterRefoulement(this.currentRencontre.refoulement ?? 1); this.updatePreviousRencontres(); console.log("-> refouler", this.currentRencontre) this.updateValuesDisplay(); @@ -131,11 +124,20 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - colorierZoneRencontre( locList) { + async ignorerRencontre() { + this._tellToGM(this.actor.name + " a ignoré : " + this.currentRencontre.name); + await this.actor.deleteTMRRencontreAtPosition(); // Remove the stored rencontre if necessary + this.updatePreviousRencontres(); + this.updateValuesDisplay(); + this.nettoyerRencontre(); + } + + /* -------------------------------------------- */ + colorierZoneRencontre(locList) { this.currentRencontre.graphics = []; // Keep track of rectangles to delete it this.currentRencontre.locList = duplicate(locList); // And track of allowed location for (let loc of locList) { - let rect = this._getCaseRectangleCoord( loc); + let rect = this._getCaseRectangleCoord(loc); var rectDraw = new PIXI.Graphics(); rectDraw.beginFill(0xFFFF00, 0.3); // set the line style to have a width of 5 and set the color to red @@ -148,132 +150,118 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async gererTourbillon( value ) { - this.nbFatigue += 1; - await this.actor.reveActuelIncDec( -value ); - if ( !this.currentRencontre.tourbillonDirection ) { - this.currentRencontre.tourbillonDirection = TMRUtility.getDirectionPattern(); - } - let tmrPos = this.actor.data.data.reve.tmrpos; - tmrPos.coord = TMRUtility.deplaceTMRSelonPattern( tmrPos.coord, this.currentRencontre.tourbillonDirection, value ); - await this.actor.update({ "data.reve.tmrpos": tmrPos }); - console.log("NEWPOS", tmrPos); + // garder la trace de l'état en cours + setStateRencontre(state) { + this.rencontreState = state; } - /* -------------------------------------------- */ - async gererTourbillonRouge( ) { - this.nbFatigue += 1; - await this.actor.reveActuelIncDec( -2 ); // -2 pts de Reve a chaque itération - if ( !this.currentRencontre.tourbillonDirection ) { - this.currentRencontre.tourbillonDirection = TMRUtility.getDirectionPattern(); - } - let tmrPos = this.actor.data.data.reve.tmrpos; - tmrPos.coord = TMRUtility.deplaceTMRSelonPattern( tmrPos.coord, this.currentRencontre.tourbillonDirection, 4 ); // Depl. 4 cases. - await this.actor.update({ "data.reve.tmrpos": tmrPos }); - await this.actor.santeIncDec( "vie", -1); // Et -1 PV - console.log("TOURBILLON ROUGE", tmrPos); + async choisirCasePortee(coord, portee) { + // Récupère la liste des cases à portées + let locList = TMRUtility.getTMRPortee(coord, portee); + this.colorierZoneRencontre(locList); } - - /* -------------------------------------------- */ - /** Gère les rencontres avec du post-processing graphique (passeur, messagers, tourbillons, ...) */ - async rencontrePostProcess( rencontreData) { - if (!rencontreData) return; // Sanity check - this.rencontreState = rencontreData.state; // garder la trace de l'état en cours - - let locList - if ( this.rencontreState == 'passeur' || this.rencontreState == 'messager' ) { - // Récupère la liste des cases à portées - locList = TMRUtility.getTMRArea(this.actor.data.data.reve.tmrpos.coord, this.currentRencontre.force, tmrConstants ); - - } else if ( this.rencontreState == 'passeurfou' ) { // Cas spécial du passeur fou - let sortReserve = this.actor.data.data.reve.reserve[0]; - let tmrPos - if ( sortReserve ) { - tmrPos = sortReserve.coord; // Passeur fou positionne sur la case d'un ort en réserve (TODO : Choisir le plus loin) - } else { - let direction = TMRUtility.getDirectionPattern(); // Déplacement aléatoire de la force du Passeur Fou - tmrPos = TMRUtility.deplaceTMRSelonPattern(this.actor.data.data.reve.tmrpos.coord, direction, this.currentRencontre.force ); - } - await this.actor.update({ "data.reve.tmrpos": tmrPos }); - - } else if ( this.rencontreState == 'changeur' ) { - // Liste des cases de même type - locList = TMRUtility.getLocationTypeList( this.actor.data.data.reve.tmrpos.coord ); - - } else if ( this.rencontreState == 'reflet' ) { - this.nbFatigue += 1; - - } else if ( this.rencontreState == 'tourbillonblanc' ) { - await this.gererTourbillon(1); - - } else if ( this.rencontreState == 'tourbillonnoir' ) { - await this.gererTourbillon(2); - - } else if ( this.rencontreState == 'tourbillonrouge' ) { - await this.gererTourbillonRouge(); - - } else { - this.currentRencontre = undefined; // Cleanup, not used anymore - } - - if ( locList ) - this.colorierZoneRencontre( locList ); + async choisirCaseType(type) { + const locList = TMRUtility.getListCoordTMR(type); + this.colorierZoneRencontre(locList); } + /* -------------------------------------------- */ checkQuitterTMR() { - if ( this.actor.data.data.reve.reve.value == 0) { - this._tellToGM("Vos Points de Rêve sont à 0 : vous quittez les Terres médianes !"); + + if (this.actor.isDead()) { + this._tellToGM("Vous êtes mort : vous quittez les Terres médianes !"); this.close(); + return true; } - if ( this.nbFatigue == this.actor.data.data.sante.fatigue.max ) { + const resteAvantInconscience = this.actor.getFatigueMax() - this.actor.getFatigueActuelle() - this.nbFatigue; + if (resteAvantInconscience <= 0) { this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !"); - this.close(); + this.quitterLesTMRInconscient(); + return true; } - if ( this.actor.data.data.sante.vie.value == 0 ) { - this._tellToGM("Vous n'avez plus de Points de Vie : vous quittez les Terres médianes !"); - this.close(); + if (this.actor.getReveActuel() == 0) { + this._tellToGM("Vos Points de Rêve sont à 0 : vous quittez les Terres médianes !"); + this.quitterLesTMRInconscient(); + return true; } + return false; + } + + async quitterLesTMRInconscient() { + if (this.currentRencontre?.isPersistant) { + await this.refouler(); + } + this.close(); } /* -------------------------------------------- */ - async maitriser(data) { - this.actor.deleteTMRRencontreAtPosition(); // Remove the stored rencontre if necessary + async maitriser() { + this.actor.deleteTMRRencontreAtPosition(); this.updatePreviousRencontres(); - const draconic = this.actor.getBestDraconic(); - const carac = this.actor.getReveActuel(); - const etatGeneral = this.actor.getEtatGeneral(); - const difficulte = draconic.data.niveau - this.currentRencontre.force + etatGeneral; - console.log("Maitriser", carac, draconic.data.niveau, this.currentRencontre.force, etatGeneral); - let rolled = await RdDResolutionTable.roll(carac, difficulte); - let message = "
Test : Rêve actuel / " + draconic.name + " / " + this.currentRencontre.name + "" + "
" - + RdDResolutionTable.explain(rolled); - - let rencontreData - if (rolled.isEchec) { - rencontreData = await TMRUtility.processRencontreEchec(this.actor, this.currentRencontre, rolled, this); - message += rencontreData.message; - this._tellToGM("Vous avez échoué à maîtriser un " + this.currentRencontre.name + " de force " + this.currentRencontre.force + message); - - if (this.currentRencontre.data.quitterTMR) { // Selon les rencontres, quitter TMR ou pas - this.close(); - } - } else { - rencontreData = await TMRUtility.processRencontreReussite(this.actor, this.currentRencontre, rolled); - message += rencontreData.message; - this._tellToGM("Vous avez réussi à maîtriser un " + this.currentRencontre.name + " de force " + this.currentRencontre.force + message); + let rencontreData = { + actor: this.actor, + alias: this.actor.name, + reveDepart: this.actor.getReveActuel(), + competence: this.actor.getBestDraconic(), + rencontre: this.currentRencontre, + nbRounds: 1, + tmr: TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord) } - await this.rencontrePostProcess( rencontreData ); + await this._tentativeMaitrise(rencontreData); + } + + async _tentativeMaitrise(rencontreData) { + console.log("-> matriser", rencontreData); + + rencontreData.reve = this.actor.getReveActuel(); + rencontreData.etat = this.actor.getEtatGeneral(); + + RollDataAjustements.calcul(rencontreData, this.actor); + + rencontreData.rolled = await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements)); + + let postProcess = await TMRRencontres.gererRencontre(this, rencontreData); + + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.html`, rencontreData) + }); + + if (postProcess) { + /** Gère les rencontres avec du post-processing (passeur, messagers, tourbillons, ...) */ + await postProcess(this, rencontreData); + } + else { + this.currentRencontre = undefined; + } - console.log("-> matriser", this.currentRencontre); this.updateValuesDisplay(); - - this.checkQuitterTMR(); - if ( this.rencontreState == 'reflet' || this.rencontreState == 'tourbillonblanc' || this.rencontreState == 'tourbillonnoir' ) - this.maitriser(); + if (this.checkQuitterTMR()) { + return; + } + else if (rencontreData.rolled.isEchec && rencontreData.rencontre.isPersistant) { + setTimeout(() => { + rencontreData.nbRounds++; + this.nbFatigue += 1; + this._tentativeMaitrise(rencontreData); + setTimeout(() => this._deleteTmrMessages(rencontreData.actor, rencontreData.nbRounds), 500); + }, 2000); + } + } + + _deleteTmrMessages(actor, nbRounds = -1) { + if (nbRounds < 0) { + ChatUtility.removeChatMessageContaining(`

`); + } + } } /* -------------------------------------------- */ @@ -285,7 +273,7 @@ export class RdDTMRDialog extends Dialog { _tellToGM(message) { ChatMessage.create({ content: message, user: game.user._id, whisper: ChatMessage.getWhisperRecipients("GM") }); } - + /* -------------------------------------------- */ async manageRencontre(coordTMR, cellDescr) { if (this.viewOnly) { @@ -293,7 +281,7 @@ export class RdDTMRDialog extends Dialog { } this.currentRencontre = undefined; let rencontre = await this._jetDeRencontre(coordTMR, cellDescr); - + if (rencontre) { // Manages it if (rencontre.rencontre) rencontre = rencontre.rencontre; // Manage stored rencontres console.log("manageRencontre", rencontre); @@ -306,21 +294,19 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async _jetDeRencontre(coordTMR, cellDescr) { - - let rencontre = this.rencontresExistantes.find(prev => prev.coord == coordTMR); - if (rencontre == undefined) { - let myRoll = new Roll("1d7").roll(); - if (myRoll.total == 7) { - let isSpecial = this.actor.isRencontreSpeciale(); - rencontre = await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr, isSpecial ); - } else { - this._tellToUser(myRoll.total + ": Pas de rencontre en " + cellDescr.label + " (" + coordTMR + ")"); - } - } if (TMRUtility.isForceRencontre()) { return await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr); } - return rencontre; + let rencontre = this.rencontresExistantes.find(prev => prev.coord == coordTMR); + if (rencontre) { + return rencontre; + } + let myRoll = new Roll("1d7").evaluate(); + if (myRoll.total == 7) { + let isMauvaise = this.actor.isRencontreSpeciale(); + return await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr, isMauvaise); + } + this._tellToUser(myRoll.total + ": Pas de rencontre en " + cellDescr.label + " (" + coordTMR + ")"); } /* -------------------------------------------- */ @@ -329,7 +315,7 @@ export class RdDTMRDialog extends Dialog { ptsreve.innerHTML = this.actor.data.data.reve.reve.value; let tmrpos = document.getElementById("tmr-pos"); - let tmr = TMRUtility.getTMRDescription(this.actor.data.data.reve.tmrpos.coord); + let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord); tmrpos.innerHTML = this.actor.data.data.reve.tmrpos.coord + " (" + tmr.label + ")"; let etat = document.getElementById("tmr-etatgeneral-value"); @@ -344,26 +330,27 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async manageCaseSpeciale( cellDescr, coordTMR ) { - for( let caseTMR of this.casesSpeciales) { + async manageCaseSpeciale(cellDescr, coordTMR) { + for (let caseTMR of this.casesSpeciales) { if (caseTMR.data.coord == coordTMR) { // Match ! if (caseTMR.data.specific == 'trounoir') { let newTMR = TMRUtility.getTMRAleatoire(); let tmrPos = duplicate(this.actor.data.data.reve.tmrpos); - tmrPos.coord = newTMR; - await this.actor.update( { "data.reve.tmrpos": tmrPos } ); - ChatMessage.create( { + tmrPos.coord = newTMR; + await this.actor.update({ "data.reve.tmrpos": tmrPos }); + ChatMessage.create({ content: "Vous êtes rentré sur un Trou Noir : ré-insertion aléatoire.", - whisper: ChatMessage.getWhisperRecipients(game.user.name) } ); + whisper: ChatMessage.getWhisperRecipients(game.user.name) + }); } } } } /* -------------------------------------------- */ - isCaseMaitrisee( coordTMR) { - for( let caseTMR of this.casesSpeciales) { - if (caseTMR.data.coord == coordTMR && caseTMR.data.specific == 'maitrisee') { + isCaseMaitrisee(coordTMR) { + for (let caseTMR of this.casesSpeciales) { + if (caseTMR.data.coord == coordTMR && caseTMR.data.specific == 'maitrisee') { return true; } } @@ -378,15 +365,16 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async manageCaseHumide(cellDescr, coordTMR) { - if (this.viewOnly) { + if (this.viewOnly || this.currentRencontre) { return; } let isHumide = this.actor.checkIsAdditionnalHumide(cellDescr, coordTMR); if (cellDescr.type == "lac" || cellDescr.type == "fleuve" || cellDescr.type == "marais" || isHumide) { - if ( this.isCaseMaitrisee( coordTMR ) ) { - ChatMessage.create( { + if (this.isCaseMaitrisee(coordTMR)) { + ChatMessage.create({ content: "Cette case humide est déja maitrisée grâce à votre Tête Quête des Eaux", - whisper: ChatMessage.getWhisperRecipients(game.user.name) } ); + whisper: ChatMessage.getWhisperRecipients(game.user.name) + }); return; } // TODO: permettre de choisir la voie de draconic? @@ -396,11 +384,11 @@ export class RdDTMRDialog extends Dialog { const etatGeneral = this.actor.getEtatGeneral(); let difficulte = draconic.data.niveau - 7; let rolled = await RdDResolutionTable.roll(carac, difficulte); - + // Gestion du souffle Double Résistance du Fleuve - if ( this.actor.isDoubleResistanceFleuve() ) { + if (this.actor.isDoubleResistanceFleuve()) { let rolled2 = await RdDResolutionTable.roll(carac, difficulte); - if (rolled2.isEchec) + if (rolled2.isEchec) rolled = rolled; } console.log("manageCaseHumide >>", rolled); @@ -420,18 +408,18 @@ export class RdDTMRDialog extends Dialog { + RdDResolutionTable.explain(rolled); if (rolled.isETotal) { - let souffle = await this.actor.ajouterSouffle({chat: false}); + let souffle = await this.actor.ajouterSouffle({ chat: false }); explication += "
Vous avez fait un Echec Total. Vous subissez un Souffle de Dragon : " + souffle.name; msg2MJ += "
Et a reçu un Souffle de Dragon : " + souffle.name; } if (rolled.isPart) { explication += "
Vous avez fait une Réussite Particulière"; - this.actor._appliquerAjoutExperience({ rolled: rolled, seletedCarac: { label: 'reve'}, competence: draconic.name }) + this.actor._appliquerAjoutExperience({ rolled: rolled, seletedCarac: { label: 'reve' }, competence: draconic.name }) msg2MJ += "
Et a fait une réussite particulière"; } // Notification au MJ - ChatMessage.create( { content: msg2MJ, whisper: ChatMessage.getWhisperRecipients("GM") } ); + ChatMessage.create({ content: msg2MJ, whisper: ChatMessage.getWhisperRecipients("GM") }); // Et au joueur (ca pourrait être un message de tchat d'ailleurs) let humideDiag = new Dialog({ title: "Case humide", @@ -445,9 +433,9 @@ export class RdDTMRDialog extends Dialog { } } /* -------------------------------------------- */ - isReserveExtensible( coordTMR) { - for( let caseTMR of this.casesSpeciales) { - if (caseTMR.data.specific == 'reserve_extensible' && caseTMR.data.coord == coordTMR ) + isReserveExtensible(coordTMR) { + for (let caseTMR of this.casesSpeciales) { + if (caseTMR.data.specific == 'reserve_extensible' && caseTMR.data.coord == coordTMR) return true; } return false; @@ -458,55 +446,57 @@ export class RdDTMRDialog extends Dialog { if (this.viewOnly) { return; } - - let sortReserveList = TMRUtility.getSortReserveList( this.sortReserves, coordTMR ); - if (sortReserveList.length > 0 ) { - if ( this.actor.isReserveEnSecurite() || this.isReserveExtensible(coordTMR) ) { - let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête Reserve en Sécurité ou Réserve Exensible, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher :