Add customizable rolls to items

This commit is contained in:
mstein
2022-07-23 18:50:08 +02:00
parent 58ed9d7d74
commit b3e2771e91
24 changed files with 361 additions and 155 deletions
+60 -14
View File
@@ -17,19 +17,24 @@ export class M5Roll { // extends Roll<M5RollData>
// @ts-ignore
//override evaluate(options?: InexactPartial<RollTerm.EvaluationOptions>): Evaluated<Roll<M5RollData>> | Promise<Evaluated<Roll<M5RollData>>> {
evaluate() {
const indexMap = new Map<number, string>()
const rollNames = Object.keys(this.data.rolls)
const rolls = rollNames.map(rollName => {
const rolls = rollNames.filter(rollName => this.data.rolls[rollName].enabled).map((rollName, index) => {
indexMap.set(index, rollName)
const formula = this.data.rolls[rollName]
const roll = new Roll(formula.formula, this.data)
return roll
})
this.pool = PoolTerm.fromRolls(rolls)
console.log("evaluate", this._evaluated, this.pool)
return this.pool.evaluate({ async: true }).then(results => {
this._total = 0
results.rolls.forEach((roll, index) => {
const rollResult = this.data.rolls[index.toString()] as M5RollResult
const rollIndex = indexMap.get(index)
const rollResult = this.data.rolls[rollIndex] as M5RollResult
rollResult.result = roll.result
rollResult.total = roll.total
rollResult.totalStr = roll.total.toString()
@@ -37,27 +42,29 @@ export class M5Roll { // extends Roll<M5RollData>
this._total += roll.total
let rowRes = M5EwResult.TBD
let face100 = -1
roll.dice.forEach((d, dIndex) => {
rollResult.dice[dIndex.toString()] = d.total
if (rowRes === M5EwResult.TBD && dIndex === 0) {
if (rollResult.type === "ew") {
if (d.faces === 20) {
//if (rollResult.type === "ew") {
if (d.total === 1)
rowRes = M5EwResult.FUMBLE
else if (d.total === 20)
rowRes = M5EwResult.CRITICAL
else if (d.total >= 16)
rowRes = M5EwResult.HIGH
} else if (rollResult.type === "pw") {
if (d.total === 1)
rowRes = M5EwResult.FUMBLE
else if (d.total === 20)
rowRes = M5EwResult.CRITICAL
} else if (d.faces === 100) {
face100 = d.total as number
}
}
})
if (rollResult.type === "ew") {
const parseResult = M5Roll.parseDiceSides(rollResult.formula)
//console.log("evaluate roll", parseResult)
if (parseResult?.sides === 20) {
if (roll.total < 20) {
if (rowRes === M5EwResult.TBD || rowRes === M5EwResult.HIGH)
rowRes = M5EwResult.FAIL
@@ -65,10 +72,18 @@ export class M5Roll { // extends Roll<M5RollData>
if (rowRes === M5EwResult.TBD)
rowRes = M5EwResult.PASS
}
} else if (rollResult.type === "pw") {
if (roll.total < 0) {
} else if (face100 >= 0) {
const threshold100 = roll.total + face100
const threshold = Math.floor(threshold100 / 10)
if (face100 === 100) {
if (rowRes === M5EwResult.TBD)
rowRes = M5EwResult.FUMBLE
} else if (roll.total < 0) {
if (rowRes === M5EwResult.TBD)
rowRes = M5EwResult.FAIL
} else if (face100 <= threshold) {
if (rowRes === M5EwResult.TBD)
rowRes = M5EwResult.CRITICAL
} else {
if (rowRes === M5EwResult.TBD)
rowRes = M5EwResult.PASS
@@ -114,7 +129,7 @@ export class M5Roll { // extends Roll<M5RollData>
rollData.i = attribute.value + attribute.bonus
rollData.rolls["0"] = {
formula: "@i - 1d100",
type: "pw",
enabled: true,
label: (game as Game).i18n.localize("midgard5.pw"),
result: "",
total: 0,
@@ -135,7 +150,7 @@ export class M5Roll { // extends Roll<M5RollData>
rollData.rolls["0"] = {
formula: "1d20 + @c.calc.stats.brawl + @c.calc.stats.attackBonus + @i.attackBonus",
type: "ew",
enabled: true,
label: (game as Game).i18n.localize("midgard5.attack"),
result: "",
total: 0,
@@ -146,7 +161,7 @@ export class M5Roll { // extends Roll<M5RollData>
rollData.rolls["1"] = {
formula: "1d6 - 4 + @c.calc.stats.damageBonus + @i.damageBonus",
type: "dmg",
enabled: true,
label: (game as Game).i18n.localize("midgard5.damage"),
result: "",
total: 0,
@@ -157,4 +172,35 @@ export class M5Roll { // extends Roll<M5RollData>
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.brawl"))
}
static parseDiceSides(formula: string): FormulaParseResult {
const ewMatcher: RegExp = /\d*[dD]20/g
const pwMatcher: RegExp = /(\d+)\s*\-\s*\d*[dD]100/g
let res = formula.match(ewMatcher)
if (res && !!res[0]) {
return {
sides: 20,
type: "ew",
threshold: null
}
}
res = formula.match(pwMatcher)
if (res && !!res[1]) {
return {
sides: 100,
type: "pw",
threshold: parseInt(res[1])
}
}
return null
}
}
interface FormulaParseResult {
sides: number,
type: string,
threshold: number
}