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
All checks were successful
Release Creation / build (release) Successful in 1m35s
Reviewed-on: #739
This commit is contained in:
commit
8e578c6566
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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 undefined
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -121,6 +121,7 @@ export class RdDEntite extends RdDBaseActorReve {
|
||||
mapCarac(caracCode) {
|
||||
switch (caracCode) {
|
||||
case 'taille':
|
||||
case 'reve':
|
||||
return caracCode
|
||||
}
|
||||
return 'reve'
|
||||
|
@ -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,
|
||||
|
@ -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 = "(?<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')
|
||||
|
||||
/**
|
||||
@ -26,26 +28,34 @@ 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 (caracCode) {
|
||||
if (competence) {
|
||||
if (actor.type == ACTOR_TYPES.personnage) {
|
||||
await actor.rollCaracCompetence(caracCode, competence, diff)
|
||||
}
|
||||
else {
|
||||
await actor.doRollCaracCompetence(caracCode, competence, diff)
|
||||
}
|
||||
}
|
||||
else {
|
||||
await actor.rollCarac(caracCode, { diff })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getSelectedActors(actor) {
|
||||
const selected = canvas.tokens.controlled.map(it => it.actor).filter(it => it)
|
||||
|
@ -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}) })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,8 +18,8 @@ system:
|
||||
|
||||
<p>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 :</p>
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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~}}>
|
||||
<a class="roll-text">
|
||||
{{~uppercase param.carac.label~}}
|
||||
{{#if param.competence}} / {{upperFirst param.competence}}{{/if~}}
|
||||
|
@ -2,19 +2,19 @@
|
||||
<h4 class="rdd-roll-part">{{alias}} réussit une attaque particulière!</strong></h4>
|
||||
{{#if isForce}}
|
||||
<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
|
||||
</a>
|
||||
{{/if}}
|
||||
{{#if isRapide}}
|
||||
<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é
|
||||
</a>
|
||||
{{/if}}
|
||||
{{#if isFinesse}}
|
||||
<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
|
||||
</a>
|
||||
{{/if}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user