Merge pull request 'Fix: lien jets de dés' (#739) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m35s

Reviewed-on: #739
This commit is contained in:
uberwald 2025-01-13 23:44:45 +01:00
commit 8e578c6566
14 changed files with 77 additions and 64 deletions

View File

@ -1850,26 +1850,6 @@ export class RdDActor extends RdDBaseActorSang {
return undefined; 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 = {}) { async rollTache(id, options = {}) {
RdDEmpoignade.checkEmpoignadeEnCours(this) RdDEmpoignade.checkEmpoignadeEnCours(this)

View File

@ -294,6 +294,25 @@ export class RdDBaseActorReve extends RdDBaseActor {
createCallbackAppelAuMoral() { return this.createEmptyCallback(); } createCallbackAppelAuMoral() { return this.createEmptyCallback(); }
async _onCloseRollDialog(html) { } 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 * 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. * @param {*} caracName code ou label de la caractéristique. On peut utiliser 'intel' pour Intellect.

View File

@ -36,12 +36,14 @@ export class RdDCreature extends RdDBaseActorSang {
mapCarac(caracCode) { mapCarac(caracCode) {
switch (caracCode) { switch (caracCode) {
case 'vue': case 'ouie': case 'vue': case 'ouie': case 'odoratgout': case 'empathie': case 'perception':
case 'odoratgout':
case 'empathie':
return 'perception' return 'perception'
} case 'agilite':
return 'force'
case 'force': case 'constitution': case 'taille': case 'reve': case 'volonte':
return caracCode return caracCode
} }
return undefined
}
} }

View File

@ -121,6 +121,7 @@ export class RdDEntite extends RdDBaseActorReve {
mapCarac(caracCode) { mapCarac(caracCode) {
switch (caracCode) { switch (caracCode) {
case 'taille': case 'taille':
case 'reve':
return caracCode return caracCode
} }
return 'reve' return 'reve'

View File

@ -9,16 +9,17 @@ import { TextRollManager } from "./textroll/text-roll-formatter.js";
const TEXT_ROLL_MANAGERS = [ const TEXT_ROLL_MANAGERS = [
new TextRollAlchimie(), new TextRollAlchimie(),
new TextRollCaracCompetence(), new TextRollCaracCompetence(),
new TextRollFormula()]; new TextRollFormula()]
export class RdDTextEditor { export class RdDTextEditor {
static registerChatCallbacks(html) { static registerChatCallbacks(html) {
html.on("click", '.roll-text', async event => await RdDTextEditor.rollText(event)) 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 = { const context = {
text, object, text,
object,
options, options,
competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage), competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage),
} }
@ -29,7 +30,6 @@ export class RdDTextEditor {
context.text = await manager.onReplaceRoll(context); context.text = await manager.onReplaceRoll(context);
} }
// TEXT_ROLL_MANAGERS.forEach(async manager => await RdDTextEditor._applyReplaceAll(manager, context))
return await TextEditor.enrichHTML(context.text, { return await TextEditor.enrichHTML(context.text, {
relativeTo: object, relativeTo: object,
secrets: object?.isOwner, secrets: object?.isOwner,

View File

@ -1,11 +1,13 @@
import "../xregexp-all.js"; import "../xregexp-all.js";
import { ACTOR_TYPES } from "../../item.js";
import { RdDCarac } from "../../rdd-carac.js"; import { RdDCarac } from "../../rdd-carac.js";
import { RdDItemCompetence } from "../../item-competence.js"; import { RdDItemCompetence } from "../../item-competence.js";
import { RdDUtility } from "../../rdd-utility.js"; import { RdDUtility } from "../../rdd-utility.js";
import { TextRollManager } from "./text-roll-formatter.js"; import { TextRollManager } from "./text-roll-formatter.js";
const REGEXP_ROLL_CARAC_COMP = "(?<carac>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)(\\/(?<competence>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+))?(/(?<diff>[\\+\\-]?\\d+))?" const REGECP_CARAC = "(?<carac>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)"
const REGEXP_COMP = "(\\/(?<competence>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+))?"
const REGEXP_DIFF = "(/(?<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') const XREGEXP_ROLL_CARAC_COMP = XRegExp("@roll\\[" + REGEXP_ROLL_CARAC_COMP + "\\]", 'giu')
/** /**
@ -26,26 +28,34 @@ export class TextRollCaracCompetence {
const caracCode = node.data('carac-code') const caracCode = node.data('carac-code')
if (caracCode) { if (caracCode) {
const competence = node.data('competence') const competence = node.data('competence')
const diff = node.data('diff') const diff = await this.calculDiff(node)
const actors = this.getSelectedActors(actor) const actors = this.getSelectedActors(actor)
actors.forEach(async it => await this.doRoll(it, caracCode, competence, diff)) 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) { async doRoll(actor, caracCode, competence, diff) {
caracCode = actor.mapCarac(caracCode) caracCode = actor.mapCarac(caracCode)
if (caracCode) {
if (competence) { if (competence) {
if (actor.type == ACTOR_TYPES.personnage) {
await actor.rollCaracCompetence(caracCode, competence, diff) await actor.rollCaracCompetence(caracCode, competence, diff)
} }
else {
await actor.doRollCaracCompetence(caracCode, competence, diff)
}
}
else { else {
await actor.rollCarac(caracCode, { diff }) await actor.rollCarac(caracCode, { diff })
} }
} }
}
getSelectedActors(actor) { getSelectedActors(actor) {
const selected = canvas.tokens.controlled.map(it => it.actor).filter(it => it) const selected = canvas.tokens.controlled.map(it => it.actor).filter(it => it)

View File

@ -1,6 +1,7 @@
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
import { RdDTimestamp } from "./time/rdd-timestamp.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) { static async onCreateChatMessage(chatMessage, options, id) {
if (chatMessage.isAuthor) { if (chatMessage.isAuthor) {
await chatMessage.setFlag(SYSTEM_RDD, 'rdd-timestamp', game.system.rdd.calendrier.getTimestamp()); await chatMessage.setFlag(SYSTEM_RDD, 'rdd-timestamp', game.system.rdd.calendrier.getTimestamp());
await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, {showLink:false}) })
} }
} }
} }

View File

@ -8,6 +8,7 @@ import { RdDCarac } from "./rdd-carac.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"; import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { ACTOR_TYPES } from "./item.js";
/** /**
* Extend the base Dialog entity to select roll parameters * Extend the base Dialog entity to select roll parameters
@ -62,7 +63,7 @@ export class RdDRoll extends Dialog {
forceDiceResult: -1 forceDiceResult: -1
} }
// Mini patch :Ajout du rêve actuel // 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 defaultRollData.carac["reve-actuel"] = actor.system.reve.reve
} }
@ -131,11 +132,12 @@ export class RdDRoll extends Dialog {
console.log('RdDRoll.activateListeners', this.rollData); console.log('RdDRoll.activateListeners', this.rollData);
// Update html, according to rollData // Update html, according to rollData
if (this.rollData.competence) { if (!this.rollData.selectedCarac && this.rollData.competence) {
const defaut_carac = this.rollData.competence.system.defaut_carac
// Set the default carac from the competence item // Set the default carac from the competence item
this.rollData.selectedCarac = this.rollData.carac[defaut_carac]; this.rollData.selectedCarac = this.rollData.carac[this.actor.mapCarac(this.rollData.competence.system.defaut_carac)]
this.html.find("[name='carac']").val(defaut_carac); }
if (this.rollData.selectedCarac) {
this.html.find("[name='carac']").val(RdDCarac.caracDetails(this.rollData.selectedCarac.label).code)
} }
if (this.rollData.selectedSort) { if (this.rollData.selectedSort) {
this.setSelectedSort(this.rollData.selectedSort); this.setSelectedSort(this.rollData.selectedSort);

View File

@ -102,10 +102,9 @@ export class RdDRollTables {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async getMaladresse(options = { toChat: false, arme: false }) { 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.arme ? "Maladresse armé" : "Maladresses non armé",
options); options)
return await RdDTextEditor.enrichHTML(maladresse, undefined, {showLink:false})
} }
} }

View File

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

View File

@ -23,7 +23,7 @@ results:
type: text type: text
text: >- text: >-
Ami bousculé : Le compagnon bousculé doit réussir 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. demi-surprise jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1
@ -91,7 +91,7 @@ results:
flags: {} flags: {}
type: text type: text
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. jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1
@ -125,7 +125,7 @@ results:
flags: {} flags: {}
type: text type: text
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. jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1
@ -194,7 +194,7 @@ results:
type: text type: text
text: >- text: >-
Ami bousculé : Le compagnon bousculé doit réussir 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. demi-surprise jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1

View File

@ -23,7 +23,7 @@ results:
type: text type: text
text: >- text: >-
Ami bousculé : Le compagnon bousculé doit réussir 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. demi-surprise jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1
@ -57,9 +57,8 @@ results:
flags: {} flags: {}
type: text type: text
text: >- text: >-
Déséquilibré : Réussir @roll[Agilité/Vigilance] Déséquilibré : Réussir @roll[Agilité/Vigilance/-1d6]
à @roll[-1d6] ou être en demi-surprise ou être en demi-surprise jusquà la fin du round suivant.
jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1
range: range:
@ -92,9 +91,8 @@ results:
flags: {} flags: {}
type: text type: text
text: >- text: >-
Déséquilibré : Réussir @roll[Agilité/Vigilance] Déséquilibré : Réussir @roll[Agilité/Vigilance/-1d6]
à @roll[-1d6] ou être en demi-surprise ou être en demi-surprise jusquà la fin du round suivant.
jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1
range: range:
@ -128,7 +126,7 @@ results:
type: text type: text
text: >- text: >-
Ami bousculé : Le compagnon bousculé doit réussir 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. demi-surprise jusquà la fin du round suivant.
img: icons/svg/d20-black.svg img: icons/svg/d20-black.svg
weight: 1 weight: 1

View File

@ -2,8 +2,8 @@
data-code="{{param.code}}" data-code="{{param.code}}"
data-json="{{json-stringify param}}" data-json="{{json-stringify param}}"
data-carac-code="{{param.carac.code}}" data-carac-code="{{param.carac.code}}"
{{#if competence}}data-competence="{{param.competence}}"{{/if~}} {{#if param.competence}}data-competence="{{param.competence}}"{{/if~}}
{{#if diff}}data-diff="{{param.diff}}"{{/if~}}> {{#if param.diff}}data-diff="{{param.diff}}"{{/if~}}>
<a class="roll-text"> <a class="roll-text">
{{~uppercase param.carac.label~}} {{~uppercase param.carac.label~}}
{{#if param.competence}} / {{upperFirst param.competence}}{{/if~}} {{#if param.competence}} / {{upperFirst param.competence}}{{/if~}}

View File

@ -2,19 +2,19 @@
<h4 class="rdd-roll-part">{{alias}} réussit une attaque particulière!</strong></h4> <h4 class="rdd-roll-part">{{alias}} réussit une attaque particulière!</strong></h4>
{{#if isForce}} {{#if isForce}}
<br> <br>
<a class="chat-card-button" id="particuliere-attaque" data-mode="force" data-attackerId="{{attackerId}}"> <a class="chat-card-button particuliere-attaque" data-mode="force" data-attackerId="{{attackerId}}">
Attaquer en Force Attaquer en Force
</a> </a>
{{/if}} {{/if}}
{{#if isRapide}} {{#if isRapide}}
<br> <br>
<a class="chat-card-button" id="particuliere-attaque" data-mode="rapidite" data-attackerId="{{attackerId}}"> <a class="chat-card-button particuliere-attaque" data-mode="rapidite" data-attackerId="{{attackerId}}">
Attaquer en Rapidité Attaquer en Rapidité
</a> </a>
{{/if}} {{/if}}
{{#if isFinesse}} {{#if isFinesse}}
<br> <br>
<a class="chat-card-button" id="particuliere-attaque" data-mode="finesse" data-attackerId="{{attackerId}}"> <a class="chat-card-button particuliere-attaque" data-mode="finesse" data-attackerId="{{attackerId}}">
Attaquer en Finesse Attaquer en Finesse
</a> </a>
{{/if}} {{/if}}