diff --git a/module/actor.js b/module/actor.js index ec2ac7cf..f107bc3e 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1850,26 +1850,6 @@ export class RdDActor extends RdDBaseActorSang { return undefined; } - async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) { - RdDEmpoignade.checkEmpoignadeEnCours(this) - const competence = this.getCompetence(compName); - await this.openRollDialog({ - name: 'jet-competence', - label: 'Jet ' + Grammar.apostrophe('de', competence.name), - template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html', - rollData: { - alias: this.getAlias(), - carac: this.system.carac, - selectedCarac: this.getCaracByName(caracName), - selectedCaracName: caracName, - diffLibre: diff, - competence: competence, - show: { title: options?.title ?? '' } - }, - callbackAction: r => this.$onRollCompetence(r, options) - }); - } - /* -------------------------------------------- */ async rollTache(id, options = {}) { RdDEmpoignade.checkEmpoignadeEnCours(this) diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index ae40b532..b920cf8a 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -294,6 +294,25 @@ export class RdDBaseActorReve extends RdDBaseActor { createCallbackAppelAuMoral() { return this.createEmptyCallback(); } async _onCloseRollDialog(html) { } + async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) { + RdDEmpoignade.checkEmpoignadeEnCours(this) + const competence = this.getCompetence(compName); + await this.openRollDialog({ + name: 'jet-competence', + label: competence? 'Jet ' + Grammar.apostrophe('de', competence.name) : `Jet sans compétence (${compName})`, + template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html', + rollData: { + alias: this.getAlias(), + carac: this.system.carac, + selectedCarac: this.getCaracByName(caracName), + selectedCaracName: caracName, + diffLibre: diff, + competence: competence, + show: { title: options?.title ?? '' } + }, + callbackAction: r => this.$onRollCompetence(r, options) + }); + } /** * Méthode pour faire un jet prédéterminer sans ouvrir la fenêtre de dialogue * @param {*} caracName code ou label de la caractéristique. On peut utiliser 'intel' pour Intellect. diff --git a/module/actor/creature.js b/module/actor/creature.js index 78d3f0cc..8f65041f 100644 --- a/module/actor/creature.js +++ b/module/actor/creature.js @@ -36,12 +36,14 @@ export class RdDCreature extends RdDBaseActorSang { mapCarac(caracCode) { switch (caracCode) { - case 'vue': case 'ouie': - case 'odoratgout': - case 'empathie': + case 'vue': case 'ouie': case 'odoratgout': case 'empathie': case 'perception': return 'perception' + case 'agilite': + return 'force' + case 'force': case 'constitution': case 'taille': case 'reve': case 'volonte': + return caracCode } - return caracCode + return undefined } } diff --git a/module/actor/entite.js b/module/actor/entite.js index ee6e480b..eea0b9cb 100644 --- a/module/actor/entite.js +++ b/module/actor/entite.js @@ -121,6 +121,7 @@ export class RdDEntite extends RdDBaseActorReve { mapCarac(caracCode) { switch (caracCode) { case 'taille': + case 'reve': return caracCode } return 'reve' diff --git a/module/apps/rdd-text-roll-editor.js b/module/apps/rdd-text-roll-editor.js index 1cadfbfa..33463eca 100644 --- a/module/apps/rdd-text-roll-editor.js +++ b/module/apps/rdd-text-roll-editor.js @@ -9,16 +9,17 @@ import { TextRollManager } from "./textroll/text-roll-formatter.js"; const TEXT_ROLL_MANAGERS = [ new TextRollAlchimie(), new TextRollCaracCompetence(), - new TextRollFormula()]; + new TextRollFormula()] export class RdDTextEditor { static registerChatCallbacks(html) { html.on("click", '.roll-text', async event => await RdDTextEditor.rollText(event)) } - static async enrichHTML(text, object, options = {}) { + static async enrichHTML(text, object, options = {showlink:true}) { const context = { - text, object, + text, + object, options, competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage), } @@ -29,7 +30,6 @@ export class RdDTextEditor { context.text = await manager.onReplaceRoll(context); } - // TEXT_ROLL_MANAGERS.forEach(async manager => await RdDTextEditor._applyReplaceAll(manager, context)) return await TextEditor.enrichHTML(context.text, { relativeTo: object, secrets: object?.isOwner, diff --git a/module/apps/textroll/text-roll-carac-competence.js b/module/apps/textroll/text-roll-carac-competence.js index 1f0f23c2..7c2f5572 100644 --- a/module/apps/textroll/text-roll-carac-competence.js +++ b/module/apps/textroll/text-roll-carac-competence.js @@ -1,11 +1,13 @@ import "../xregexp-all.js"; -import { ACTOR_TYPES } from "../../item.js"; import { RdDCarac } from "../../rdd-carac.js"; import { RdDItemCompetence } from "../../item-competence.js"; import { RdDUtility } from "../../rdd-utility.js"; import { TextRollManager } from "./text-roll-formatter.js"; -const REGEXP_ROLL_CARAC_COMP = "(?[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)(\\/(?[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+))?(/(?[\\+\\-]?\\d+))?" +const REGECP_CARAC = "(?[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)" +const REGEXP_COMP = "(\\/(?[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+))?" +const REGEXP_DIFF = "(/(?[\\+\\-]?\\d+(d\\d+)?))?" +const REGEXP_ROLL_CARAC_COMP = REGECP_CARAC + REGEXP_COMP + REGEXP_DIFF const XREGEXP_ROLL_CARAC_COMP = XRegExp("@roll\\[" + REGEXP_ROLL_CARAC_COMP + "\\]", 'giu') /** @@ -26,25 +28,33 @@ export class TextRollCaracCompetence { const caracCode = node.data('carac-code') if (caracCode) { const competence = node.data('competence') - const diff = node.data('diff') + const diff = await this.calculDiff(node) const actors = this.getSelectedActors(actor) actors.forEach(async it => await this.doRoll(it, caracCode, competence, diff)) } } + async calculDiff(node) { + const diff = node.data('diff') ?? 0 + if (!Number.isInteger(diff)) { + const roll = new Roll(diff) + await roll.evaluate() + await roll.toMessage({ flavor: `La difficulté de ${diff} a donné ${roll.total}` }) + return roll.total + } + return diff + } + async doRoll(actor, caracCode, competence, diff) { caracCode = actor.mapCarac(caracCode) - if (competence) { - if (actor.type == ACTOR_TYPES.personnage) { + if (caracCode) { + if (competence) { await actor.rollCaracCompetence(caracCode, competence, diff) } else { - await actor.doRollCaracCompetence(caracCode, competence, diff) + await actor.rollCarac(caracCode, { diff }) } } - else { - await actor.rollCarac(caracCode, { diff }) - } } getSelectedActors(actor) { diff --git a/module/chat-utility.js b/module/chat-utility.js index 5f515ce8..9f6c053e 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -1,6 +1,7 @@ import { Misc } from "./misc.js"; import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { RdDTimestamp } from "./time/rdd-timestamp.js"; +import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js"; /** @@ -198,6 +199,7 @@ export class ChatUtility { static async onCreateChatMessage(chatMessage, options, id) { if (chatMessage.isAuthor) { await chatMessage.setFlag(SYSTEM_RDD, 'rdd-timestamp', game.system.rdd.calendrier.getTimestamp()); + await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, {showLink:false}) }) } } } diff --git a/module/rdd-roll.js b/module/rdd-roll.js index b76e64b0..c6d2f029 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -8,6 +8,7 @@ import { RdDCarac } from "./rdd-carac.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"; import { Grammar } from "./grammar.js"; +import { ACTOR_TYPES } from "./item.js"; /** * Extend the base Dialog entity to select roll parameters @@ -62,7 +63,7 @@ export class RdDRoll extends Dialog { forceDiceResult: -1 } // Mini patch :Ajout du rêve actuel - if (actor.system.type == "personnage") { + if (actor.type == ACTOR_TYPES.personnage) { defaultRollData.carac["reve-actuel"] = actor.system.reve.reve } @@ -131,11 +132,12 @@ export class RdDRoll extends Dialog { console.log('RdDRoll.activateListeners', this.rollData); // Update html, according to rollData - if (this.rollData.competence) { - const defaut_carac = this.rollData.competence.system.defaut_carac + if (!this.rollData.selectedCarac && this.rollData.competence) { // Set the default carac from the competence item - this.rollData.selectedCarac = this.rollData.carac[defaut_carac]; - this.html.find("[name='carac']").val(defaut_carac); + this.rollData.selectedCarac = this.rollData.carac[this.actor.mapCarac(this.rollData.competence.system.defaut_carac)] + } + if (this.rollData.selectedCarac) { + this.html.find("[name='carac']").val(RdDCarac.caracDetails(this.rollData.selectedCarac.label).code) } if (this.rollData.selectedSort) { this.setSelectedSort(this.rollData.selectedSort); diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index 16e74554..d24d474b 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -102,10 +102,9 @@ export class RdDRollTables { /* -------------------------------------------- */ static async getMaladresse(options = { toChat: false, arme: false }) { - const maladresse = await RdDRollTables.drawTextFromRollTable( + return await RdDRollTables.drawTextFromRollTable( options.arme ? "Maladresse armé" : "Maladresses non armé", - options); - return await RdDTextEditor.enrichHTML(maladresse, undefined, {showLink:false}) + options) } } diff --git a/packs_src/sorts-hypnos/sort_D_rision_7q0zFbBhxYdf6OZ2.yml b/packs_src/sorts-hypnos/sort_D_rision_7q0zFbBhxYdf6OZ2.yml index 9beab6ca..251de16d 100644 --- a/packs_src/sorts-hypnos/sort_D_rision_7q0zFbBhxYdf6OZ2.yml +++ b/packs_src/sorts-hypnos/sort_D_rision_7q0zFbBhxYdf6OZ2.yml @@ -18,8 +18,8 @@ system:

Si un personnage ainsi rendu dérisoire participe à un combat, il peut tenter une fois par round de lancer une plaisanterie en guise d’attaque - (tout en esquivant/parant normalement). Il joue pour cela @roll[APPARENCE/Comédie] - à @roll[-1d4] (ce d4 résume les conditions ponctuelles plus ou moins propices, et + (tout en esquivant/parant normalement). Il joue pour cela @roll[APPARENCE/Comédie/-1d4] + (ce d4 résume les conditions ponctuelles plus ou moins propices, et il est en fait soustrait du bonus de +4 conféré par le sort). Puis selon la réussite, on obtient un ajustement :

diff --git a/packs_src/tables-diverses/tables_Maladresse_arm__pXYVWRlCftWdwsBP.yml b/packs_src/tables-diverses/tables_Maladresse_arm__pXYVWRlCftWdwsBP.yml index b6dcd07f..205e3a8a 100644 --- a/packs_src/tables-diverses/tables_Maladresse_arm__pXYVWRlCftWdwsBP.yml +++ b/packs_src/tables-diverses/tables_Maladresse_arm__pXYVWRlCftWdwsBP.yml @@ -23,7 +23,7 @@ results: type: text text: >- Ami bousculé : Le compagnon bousculé doit réussir - @roll[Empathie/Vigilance] à @roll[-1d6] ou être en + @roll[Empathie/Vigilance/-1d6] ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 @@ -91,7 +91,7 @@ results: flags: {} type: text text: >- - Déséquilibré : Réussir @roll[Agilité/Vigilance] à @roll[-1d6] ou être en demi-surprise + Déséquilibré : Réussir @roll[Agilité/Vigilance/-1d6] ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 @@ -125,7 +125,7 @@ results: flags: {} type: text text: >- - Déséquilibré : Réussir @roll[Agilité/Vigilance] à @roll[-1d6] ou être en demi-surprise + Déséquilibré : Réussir @roll[Agilité/Vigilance/-1d6] ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 @@ -194,7 +194,7 @@ results: type: text text: >- Ami bousculé : Le compagnon bousculé doit réussir - @roll[Empathie/Vigilance] à @roll[-1d6] ou être en + @roll[Empathie/Vigilance/-1d6] ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 diff --git a/packs_src/tables-diverses/tables_Maladresses_non_arm__7Py520wVyrjAgS9j.yml b/packs_src/tables-diverses/tables_Maladresses_non_arm__7Py520wVyrjAgS9j.yml index 4e5efc79..f67785e4 100644 --- a/packs_src/tables-diverses/tables_Maladresses_non_arm__7Py520wVyrjAgS9j.yml +++ b/packs_src/tables-diverses/tables_Maladresses_non_arm__7Py520wVyrjAgS9j.yml @@ -23,7 +23,7 @@ results: type: text text: >- Ami bousculé : Le compagnon bousculé doit réussir - @roll[Empathie/Vigilance] à @roll[-1d6] ou être en + @roll[Empathie/Vigilance/-1d6] ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 @@ -57,9 +57,8 @@ results: flags: {} type: text text: >- - Déséquilibré : Réussir @roll[Agilité/Vigilance] - à @roll[-1d6] ou être en demi-surprise - jusqu’à la fin du round suivant. + Déséquilibré : Réussir @roll[Agilité/Vigilance/-1d6] + ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 range: @@ -92,9 +91,8 @@ results: flags: {} type: text text: >- - Déséquilibré : Réussir @roll[Agilité/Vigilance] - à @roll[-1d6] ou être en demi-surprise - jusqu’à la fin du round suivant. + Déséquilibré : Réussir @roll[Agilité/Vigilance/-1d6] + ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 range: @@ -128,7 +126,7 @@ results: type: text text: >- Ami bousculé : Le compagnon bousculé doit réussir - @roll[Empathie/Vigilance] à @roll[-1d6] ou être en + @roll[Empathie/Vigilance/-1d6] ou être en demi-surprise jusqu’à la fin du round suivant. img: icons/svg/d20-black.svg weight: 1 diff --git a/templates/apps/textroll/link-text-roll-carac-competence.hbs b/templates/apps/textroll/link-text-roll-carac-competence.hbs index af0528c8..212628a7 100644 --- a/templates/apps/textroll/link-text-roll-carac-competence.hbs +++ b/templates/apps/textroll/link-text-roll-carac-competence.hbs @@ -2,8 +2,8 @@ data-code="{{param.code}}" data-json="{{json-stringify param}}" data-carac-code="{{param.carac.code}}" - {{#if competence}}data-competence="{{param.competence}}"{{/if~}} - {{#if diff}}data-diff="{{param.diff}}"{{/if~}}> + {{#if param.competence}}data-competence="{{param.competence}}"{{/if~}} + {{#if param.diff}}data-diff="{{param.diff}}"{{/if~}}> {{~uppercase param.carac.label~}} {{#if param.competence}} / {{upperFirst param.competence}}{{/if~}} diff --git a/templates/chat-demande-attaque-particuliere.html b/templates/chat-demande-attaque-particuliere.html index 77456709..031d4c5b 100644 --- a/templates/chat-demande-attaque-particuliere.html +++ b/templates/chat-demande-attaque-particuliere.html @@ -2,19 +2,19 @@

{{alias}} réussit une attaque particulière!

{{#if isForce}}
-
+ Attaquer en Force {{/if}} {{#if isRapide}}
- + Attaquer en Rapidité {{/if}} {{#if isFinesse}}
- + Attaquer en Finesse {{/if}}