From 43763dbe3ac0f2ff1341e0a66150e2d9b624120f Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 9 Oct 2022 02:19:33 +0200 Subject: [PATCH] =?UTF-8?q?Jets=20d'encaissement=20valid=C3=A9s=20par=20le?= =?UTF-8?q?=20MJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ajout d'une option pour activer la validation par le MJ * lors d'un jet d'encaissement, une fenêtre s'ouvre chez le MJ avec le résultat d'encaissement * le MJ peut changer le jet d'encaissement * si le MJ annule, l'encaissement n'a pas lieu * Attention, si plusieurs MJ, un seul doit valider, sinon encaissements multiples --- module/actor.js | 94 ++++++------------- module/dialog-validation-encaissement.js | 70 ++++++++++++++ module/item.js | 4 +- module/rdd-combat.js | 2 +- module/rdd-dice.js | 29 +++++- module/rdd-roll-encaisser.js | 2 +- module/rdd-utility.js | 76 ++++++++++++++- module/regles-optionelles.js | 49 +++++----- templates/dialog-roll-encaisser.html | 12 +-- templates/dialog-validation-encaissement.html | 45 +++++++++ 10 files changed, 279 insertions(+), 104 deletions(-) create mode 100644 module/dialog-validation-encaissement.js create mode 100644 templates/dialog-validation-encaissement.html diff --git a/module/actor.js b/module/actor.js index 206f193f..e21d8d0c 100644 --- a/module/actor.js +++ b/module/actor.js @@ -33,8 +33,9 @@ import { RollDataAjustements } from "./rolldata-ajustements.js"; import { DialogItemAchat } from "./dialog-item-achat.js"; import { RdDItem } from "./item.js"; import { RdDPossession } from "./rdd-possession.js"; -import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; +import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { RdDConfirm } from "./rdd-confirm.js"; +import { DialogValidationEncaissement } from "./dialog-validation-encaissement.js"; const POSSESSION_SANS_DRACONIC = { img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp', @@ -3330,20 +3331,39 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async encaisserDommages(rollData, attacker = undefined, defenderRoll = undefined) { + async encaisserDommages(rollData, attacker = undefined, show = undefined) { if (attacker && !await attacker.accorder(this, 'avant-encaissement')) { return; } + this.validerEncaissement(rollData, show); + } - console.log("encaisserDommages", rollData) + async validerEncaissement(rollData, show) { + if (ReglesOptionelles.isUsing('validation-encaissement-gr') && !game.user.isGM) { + RdDActor.remoteActorCall({ + actorId: this.id, + method: 'validerEncaissement', + args: [rollData, show] + }); + return; + } + const armure = await this.computeArmure(rollData); + if (ReglesOptionelles.isUsing('validation-encaissement-gr')) { + DialogValidationEncaissement.validerEncaissement(this, rollData, armure, show, (encaissement, show) => this._appliquerEncaissement(encaissement, show)); + } + else { + let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE }); + await this._appliquerEncaissement(encaissement, show) + } + } + async _appliquerEncaissement(encaissement, show) { let santeOrig = duplicate(this.system.sante); - let encaissement = await this.jetEncaissement(rollData); this.ajouterBlessure(encaissement); // Will upate the result table const perteVie = this.isEntite() ? { newValue: 0 } - : await this.santeIncDec("vie", - encaissement.vie); + : await this.santeIncDec("vie", -encaissement.vie); const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, encaissement.critiques > 0); this.computeEtatGeneral(); @@ -3356,7 +3376,7 @@ export class RdDActor extends Actor { jetEndurance: perteEndurance.jetEndurance, endurance: santeOrig.endurance.value - perteEndurance.newValue, vie: this.isEntite() ? 0 : (santeOrig.vie.value - perteVie.newValue), - show: defenderRoll?.show ?? {} + show: show ?? {} }); await ChatUtility.createChatWithRollMode(this.name, { @@ -3374,65 +3394,6 @@ export class RdDActor extends Actor { } } - /* -------------------------------------------- */ - async jetEncaissement(rollData) { - let formula = "2d10"; - - // Chaque dé fait au minmum la difficulté libre - if (ReglesOptionelles.isUsing('degat-minimum-malus-libre')) { - if (rollData.diffLibre < 0) { - let valeurMin = Math.abs(rollData.diffLibre); - formula += "min" + valeurMin; - } - } - // Chaque dé fait au minmum la difficulté libre - if (ReglesOptionelles.isUsing('degat-ajout-malus-libre')) { - if (rollData.diffLibre < 0) { - let valeurMin = Math.abs(rollData.diffLibre); - formula += "+" + valeurMin; - } - } - - let roll = await RdDDice.roll(formula); - - // 1 dé fait au minmum la difficulté libre - if (ReglesOptionelles.isUsing('degat-minimum-malus-libre-simple')) { - if (rollData.diffLibre < 0) { - let valeurMin = Math.abs(rollData.diffLibre); - if (roll.terms[0].results[0].result < valeurMin) { - roll.terms[0].results[0].result = valeurMin; - } else if (roll.terms[0].results[1].result < valeurMin) { - roll.terms[0].results[1].result = valeurMin; - } - roll._total = roll.terms[0].results[0].result + roll.terms[0].results[1].result; - } - } - - const armure = await this.computeArmure(rollData); - const jetTotal = roll.total + rollData.dmg.total - armure; - - let encaissement = RdDUtility.selectEncaissement(jetTotal, rollData.dmg.mortalite) - let over20 = Math.max(jetTotal - 20, 0); - encaissement.dmg = rollData.dmg; - encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(this.type); - encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;' - encaissement.roll = roll; - encaissement.armure = armure; - encaissement.total = jetTotal; - encaissement.vie = await RdDActor._evaluatePerte(encaissement.vie, over20); - encaissement.endurance = await RdDActor._evaluatePerte(encaissement.endurance, over20); - encaissement.penetration = rollData.arme?.system.penetration ?? 0; - - return encaissement; - } - - /* -------------------------------------------- */ - static async _evaluatePerte(formula, over20) { - let perte = new Roll(formula, { over20: over20 }); - await perte.evaluate({ async: true }); - return perte.total; - } - /* -------------------------------------------- */ ajouterBlessure(encaissement) { if (this.type == 'entite') return; // Une entité n'a pas de blessures @@ -3699,8 +3660,7 @@ export class RdDActor extends Actor { actorId: achat.vendeurId ?? achat.acheteurId, method: 'achatVente', args: [achat] - }, - ); + }); return; } diff --git a/module/dialog-validation-encaissement.js b/module/dialog-validation-encaissement.js new file mode 100644 index 00000000..addcf45c --- /dev/null +++ b/module/dialog-validation-encaissement.js @@ -0,0 +1,70 @@ +import { HIDE_DICE, SHOW_DICE } from "./constants.js"; +import { RdDUtility } from "./rdd-utility.js"; + +/** + * Extend the base Dialog entity by defining a custom window to perform roll. + * @extends {Dialog} + */ +export class DialogValidationEncaissement extends Dialog { + + static async validerEncaissement(actor, rollData, armure, show, onEncaisser) { + let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE }); + const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', { + actor: actor, + rollData: rollData, + encaissement: encaissement, + show: show + }); + const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, show, onEncaisser); + dialog.render(true); + } + + /* -------------------------------------------- */ + constructor(html, actor, rollData, armure, encaissement, show, onEncaisser) { + // Common conf + let buttons = { + "valider": { label: "Valider", callback: html => this.validerEncaissement() }, + "annuler": { label: "Annuler", callback: html => { } }, + }; + + let dialogConf = { + title: "Validation d'encaissement", + content: html, + buttons: buttons, + default: "valider" + } + + let dialogOptions = { + classes: ["rdddialog"], + width: 350, + height: 290 + } + + // Select proper roll dialog template and stuff + super(dialogConf, dialogOptions); + + this.actor = actor + this.rollData = rollData; + this.armure = armure; + this.encaissement = encaissement; + this.show = show; + this.onEncaisser = onEncaisser; + this.forceDiceResult = {total: encaissement.roll.result }; + } + + /* -------------------------------------------- */ + activateListeners(html) { + super.activateListeners(html); + html.find('input.encaissement-roll-result').keyup(async event => { + this.forceDiceResult.total = event.currentTarget.value; + this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: HIDE_DICE, forceDiceResult: this.forceDiceResult}); + $('label.encaissement-total').text(this.encaissement.total); + $('label.encaissement-blessure').text(this.encaissement.blessures) + }); + } + + async validerEncaissement() { + this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult}); + this.onEncaisser(this.encaissement, this.show) + } +} diff --git a/module/item.js b/module/item.js index 8cd285a3..30bd3859 100644 --- a/module/item.js +++ b/module/item.js @@ -21,7 +21,7 @@ const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "dan const typesObjetsDraconiques = ["queue", "ombre", "souffle", "tete", "signedraconique", "sortreserve"] const typesObjetsConnaissance = ["meditation", "recettealchimique", "sort"] const typesObjetsEffet = ["possession", "poison", "maladie"] -const typesObjetsCompetence = ["competence", "compcreature"] +const typesObjetsCompetence = ["competence", "competencecreature"] const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierres/faits-et-chiffres/ @@ -29,7 +29,7 @@ densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierre export const defaultItemImg = { competence: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp", - compcreature: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp", + competencecreature: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp", arme: "systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_gnome.webp", armure: "systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp", conteneur: "systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp", diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 8b3e9cfc..af430b59 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -1303,7 +1303,7 @@ export class RdDCombat { attackerRoll.defenderTokenId = defenderTokenId; await this.computeRecul(defenderRoll); - this.defender.encaisserDommages(attackerRoll, this.attacker, defenderRoll); + this.defender.encaisserDommages(attackerRoll, this.attacker, defenderRoll?.show); } else { // envoi à un GM: les joueurs n'ont pas le droit de modifier les personnages qu'ils ne possèdent pas game.socket.emit(SYSTEM_SOCKET_ID, { diff --git a/module/rdd-dice.js b/module/rdd-dice.js index 007abf8e..cba20726 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -187,7 +187,7 @@ export class RdDDice { case '1d100': return terms1d100(total); case "2d10": - // TODO + return await terms2d10(total); } return undefined; @@ -211,6 +211,33 @@ export class RdDDice { options: {} }]; } + + async function terms2d10(total) { + if (total>20 || total<2) { return undefined } + let first = await RdDDice.d10(); + let second = Math.min(total-first, 10); + first = Math.max(first, total-second); + return [{ + resultLabel:first, + result: first, + type: "d10", + vectors: [], + options: {} + }, + { + resultLabel: second, + result: second, + type: "d10", + vectors: [], + options: {} + }]; + } + } + + static async d10() { + let roll = new Roll('1d10'); + await roll.evaluate({ async: true }); + return roll.total; } static _getWhisperBlind(options) { diff --git a/module/rdd-roll-encaisser.js b/module/rdd-roll-encaisser.js index 8efbc397..109e6fbf 100644 --- a/module/rdd-roll-encaisser.js +++ b/module/rdd-roll-encaisser.js @@ -33,7 +33,7 @@ export class RdDEncaisser extends Dialog { let dialogOptions = { classes: ["rdddialog"], width: 320, - height: 240 + height: 260 } // Select proper roll dialog template and stuff diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 617d9ff3..1e14f75c 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -13,6 +13,7 @@ import { Monnaie } from "./item-monnaie.js"; import { RdDPossession } from "./rdd-possession.js"; import { RdDNameGen } from "./rdd-namegen.js"; import { RdDConfirm } from "./rdd-confirm.js"; +import { RdDActor } from "./actor.js"; /* -------------------------------------------- */ // This table starts at 0 -> niveau -10 @@ -213,6 +214,7 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.html', 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-sort.html', 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-encaisser.html', + 'systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-meditation.html', 'systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-alchimie.html', @@ -652,7 +654,68 @@ export class RdDUtility { } /* -------------------------------------------- */ - static selectEncaissement(degats, mortalite) { + static async jetEncaissement(rollData, armure, options = { showDice: HIDE_DICE }) { + let formula = "2d10"; + + // Chaque dé fait au minmum la difficulté libre + if (ReglesOptionelles.isUsing('degat-minimum-malus-libre')) { + if (rollData.diffLibre < 0) { + let valeurMin = Math.abs(rollData.diffLibre); + formula += "min" + valeurMin; + } + } + // Chaque dé fait au minmum la difficulté libre + if (ReglesOptionelles.isUsing('degat-ajout-malus-libre')) { + if (rollData.diffLibre < 0) { + let valeurMin = Math.abs(rollData.diffLibre); + formula += "+" + valeurMin; + } + } + + let roll = await RdDDice.roll(formula, options); + + // 1 dé fait au minmum la difficulté libre + if (ReglesOptionelles.isUsing('degat-minimum-malus-libre-simple')) { + if (rollData.diffLibre < 0) { + let valeurMin = Math.abs(rollData.diffLibre); + if (roll.terms[0].results[0].result < valeurMin) { + roll.terms[0].results[0].result = valeurMin; + } else if (roll.terms[0].results[1].result < valeurMin) { + roll.terms[0].results[1].result = valeurMin; + } + roll._total = roll.terms[0].results[0].result + roll.terms[0].results[1].result; + } + } + + return await RdDUtility.prepareEncaissement(rollData, roll, armure); + } + + /* -------------------------------------------- */ + static async prepareEncaissement(rollData, roll, armure) { + const jetTotal = roll.total + rollData.dmg.total - armure; + let encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite); + let over20 = Math.max(jetTotal - 20, 0); + encaissement.dmg = rollData.dmg; + encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(this.type); + encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;'; + encaissement.roll = roll; + encaissement.armure = armure; + encaissement.total = jetTotal; + encaissement.vie = await RdDUtility._evaluatePerte(encaissement.vie, over20); + encaissement.endurance = await RdDUtility._evaluatePerte(encaissement.endurance, over20); + encaissement.penetration = rollData.arme?.system.penetration ?? 0; + encaissement.blessures = ( + encaissement.critiques> 0 ? "Critique": + encaissement.graves> 0 ? "Grave": + encaissement.legeres> 0 ? "Légère": + encaissement.eraflures>0 ? "Contusions/Eraflures": + 'Aucune' + ); + return encaissement; + } + + /* -------------------------------------------- */ + static _selectEncaissement(degats, mortalite) { const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite]; for (let encaissement of table) { if ((encaissement.minimum === undefined || encaissement.minimum <= degats) @@ -663,6 +726,13 @@ export class RdDUtility { return duplicate(table[0]); } + /* -------------------------------------------- */ + static async _evaluatePerte(formula, over20) { + let perte = new Roll(formula, { over20: over20 }); + await perte.evaluate({ async: true }); + return perte.total; + } + /* -------------------------------------------- */ static currentFatigueMalus(value, max) { if (ReglesOptionelles.isUsing("appliquer-fatigue")) { @@ -697,8 +767,8 @@ export class RdDUtility { static async loadCompendium(compendium, filter = it => true) { let compendiumData = await RdDUtility.loadCompendiumData(compendium); return compendiumData.filter(filter); - } - + } + /* -------------------------------------------- */ static async loadCompendiumData(compendium) { const pack = game.packs.get(compendium); diff --git a/module/regles-optionelles.js b/module/regles-optionelles.js index 20c49b0e..ec93b239 100644 --- a/module/regles-optionelles.js +++ b/module/regles-optionelles.js @@ -2,29 +2,32 @@ import { SYSTEM_RDD } from "./constants.js"; import { Misc } from "./misc.js"; const listeReglesOptionelles = [ - { name: 'recul', group: 'Règles de combat', descr: "Appliquer le recul en cas de particulière en force ou de charge" }, - { name: 'resistanceArmeParade', group: 'Règles de combat', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" }, - { name: 'deteriorationArmure', group: 'Règles de combat', descr: "Tenir compte de la détérioration des armures" }, - { name: 'defenseurDesarme', group: 'Règles de combat', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" }, - { name: 'categorieParade', group: 'Règles de combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" }, - { name: 'tripleSignificative', group: 'Règles de combat', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" }, - { name: 'degat-minimum-malus-libre-simple', group: 'Règles de combat', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si 1 résultat est inférieur à 4, alors il devient 4.", default: false }, - { name: 'degat-minimum-malus-libre', group: 'Règles de combat', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false }, - { name: 'degat-ajout-malus-libre', group: 'Règles de combat', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false }, - { name: 'astrologie', group: 'Règles générales', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"}, - { name: 'afficher-prix-joueurs', group: 'Règles générales', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true}, - { name: 'appliquer-fatigue', group: 'Règles générales', descr: "Appliquer les règles de fatigue"}, - { name: 'afficher-colonnes-reussite', group: 'Règles générales', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false }, - { name: 'confirmation-tmr', group: 'Confirmations', descr: "Confirmer pour monter dans les TMR", scope: "client"}, - { name: 'confirmation-vider', group: 'Confirmations', descr: "Confirmer pour vider l'équipement", scope: "client"}, - { name: 'confirmation-supprimer-lien-acteur', group: 'Confirmations', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"}, - { name: 'confirmation-supprimer-equipement', group: 'Confirmations', descr: "Confirmer la suppression des équipements", scope: "client"}, - { name: 'confirmation-supprimer-oeuvre', group: 'Confirmations', descr: "Confirmer la suppression des oeuvres", scope: "client"}, - { name: 'confirmation-supprimer-connaissance', group: 'Confirmations', descr: "Confirmer la suppression des connaissances", scope: "client"}, - { name: 'confirmation-supprimer-draconique', group: 'Confirmations', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"}, - { name: 'confirmation-supprimer-effet', group: 'Confirmations', descr: "Confirmer la suppression des effets", scope: "client"}, - { name: 'confirmation-supprimer-competence', group: 'Confirmations', descr: "Confirmer la suppression des compétences", scope: "client"}, - { name: 'confirmation-supprimer-autres', group: 'Confirmations', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"}, + { group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" }, + { group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" }, + { group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" }, + { group: 'Règles de combat', name: 'defenseurDesarme', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" }, + { group: 'Règles de combat', name: 'categorieParade', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" }, + { group: 'Règles de combat', name: 'tripleSignificative', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" }, + { group: 'Règles de combat', name: 'degat-minimum-malus-libre-simple', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si le plus petit dé est inférieur à 4, alors il devient 4.", default: false }, + { group: 'Règles de combat', name: 'degat-minimum-malus-libre', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false }, + { group: 'Règles de combat', name: 'degat-ajout-malus-libre', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false }, + { group: 'Règles de combat', name: 'validation-encaissement-gr', descr: "Le Gardien des Rêves doit valider les jets d'encaissement et peut les changer.", default: false }, + + { group: 'Règles générales', name: 'astrologie', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"}, + { group: 'Règles générales', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true}, + { group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"}, + { group: 'Règles générales', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false }, + + { group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-connaissance', descr: "Confirmer la suppression des connaissances", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-draconique', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-effet', descr: "Confirmer la suppression des effets", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-competence', descr: "Confirmer la suppression des compétences", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-supprimer-autres', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"}, ]; const uniquementJoueur = listeReglesOptionelles.filter(it => it.uniquementJoueur).map(it=>it.name); diff --git a/templates/dialog-roll-encaisser.html b/templates/dialog-roll-encaisser.html index 73244852..a794c67a 100644 --- a/templates/dialog-roll-encaisser.html +++ b/templates/dialog-roll-encaisser.html @@ -1,8 +1,8 @@

-
- - {{#select modificateurDegats}} {{#each ajustementsEncaissement as |key|}} @@ -10,9 +10,9 @@ {{/select}}
-
- - diff --git a/templates/dialog-validation-encaissement.html b/templates/dialog-validation-encaissement.html new file mode 100644 index 00000000..a0c9a10f --- /dev/null +++ b/templates/dialog-validation-encaissement.html @@ -0,0 +1,45 @@ + +
+
Encaisser des dommages
+

Encaissement de {{actor.name}}

+
{{actor.name}}
+
+
    +
  • + + +
  • +
  • + + + +
    +
    Armure: {{encaissement.armure}}
    + {{#if rollData.dmg.penetration}} +
    Pénétration: -{{rollData.dmg.penetration}}
    + {{/if}} +
    + {{#if rollData.dmg.dmgArme}} +
    +dom arme: {{numberFormat rollData.dmg.dmgArme decimals=0 sign=true}}
    + {{/if}} + {{#if rollData.dmg.dmgActor}} +
    +dom attaquant: {{numberFormat rollData.dmg.dmgActor decimals=0 sign=true}}
    + {{/if}} + {{#if rollData.dmg.dmgParticuliere}} +
    +dom particulière: {{numberFormat rollData.dmg.dmgParticuliere decimals=0 sign=true}}
    + {{/if}} + {{#if rollData.dmg.dmgTactique}} +
    +dom tactique: {{numberFormat rollData.dmg.dmgTactique decimals=0 sign=true}}
    + {{/if}} + {{#if rollData.dmg.dmgSurprise}} +
    +dom surprise: {{numberFormat rollData.dmg.dmgSurprise decimals=0 sign=true}}
    + {{/if}} +
    +
    +
  • +
  • + + +
  • +
+