52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
|
import "../xregexp-all.js";
|
||
|
import { TextRollManager } from "./text-roll-formatter.js";
|
||
|
|
||
|
const REGEXP_ROLL_FORMULA = "(?<formula>[^\\[\\]]+)"
|
||
|
const XREGEXP_ROLL_FORMULA = XRegExp("@roll\\[" + REGEXP_ROLL_FORMULA + "\\]", 'giu')
|
||
|
|
||
|
/**
|
||
|
* classe pour gérer les jets de dés (formules Foundry)
|
||
|
*/
|
||
|
export class TextRollFormula {
|
||
|
get code() { return 'formula' }
|
||
|
get template() { return `systems/foundryvtt-reve-de-dragon/templates/apps/textroll/link-text-roll-formula.hbs` }
|
||
|
|
||
|
async onReplaceRoll(context) {
|
||
|
const handler = new FormulaTextBuilder(context)
|
||
|
return await handler.replaceAll()
|
||
|
}
|
||
|
|
||
|
async onRollText(event, actor) {
|
||
|
const node = TextRollManager.getNode(event)
|
||
|
const rollFormula = node.data('roll-formula')
|
||
|
if (rollFormula) {
|
||
|
const roll = new Roll(rollFormula)
|
||
|
await roll.evaluate()
|
||
|
await roll.toMessage()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class FormulaTextBuilder {
|
||
|
constructor(context) {
|
||
|
this.context = context
|
||
|
}
|
||
|
|
||
|
async replaceAll() {
|
||
|
await XRegExp.forEach(this.context.text, XREGEXP_ROLL_FORMULA,
|
||
|
async (rollMatch, i) => await this.replaceMatch(rollMatch, i))
|
||
|
return this.context.text
|
||
|
}
|
||
|
|
||
|
async replaceMatch(rollMatch, i) {
|
||
|
if (rollMatch.formula) {
|
||
|
const replacement = await TextRollManager.createRollText(this.context.template,
|
||
|
{
|
||
|
code: this.context.code,
|
||
|
formula: rollMatch.formula,
|
||
|
})
|
||
|
this.context.text = this.context.text.replace(rollMatch[0], replacement)
|
||
|
}
|
||
|
}
|
||
|
}
|