diff --git a/src/module/rolls/ds4roll.ts b/src/module/rolls/ds4roll.ts index 336fb354..162b6667 100644 --- a/src/module/rolls/ds4roll.ts +++ b/src/module/rolls/ds4roll.ts @@ -1,17 +1,44 @@ import { RollResult, RollResultStatus } from "./roll-data"; import { ds4roll } from "./roll-executor"; +interface TermData { + number: number; + faces: number; + modifiers: Array; + options: Record; +} + export class DS4Roll extends DiceTerm { - constructor({ faces = 20, modifiers = [], options = {} } = {}) { - super({ number: 1, faces: faces, modifiers: modifiers, options: options }); + constructor(termData: Partial) { + super({ + number: 1, + faces: termData.number ?? -1, + modifiers: termData.modifiers ?? [], + options: termData.options ?? {}, + }); + console.log("This @ constructor: ", termData); } + success = null; + failure = null; + number = 1; + /** * @override * @param param0 + * + * @private_notes This gets only called once for the first roll. */ roll({ minimize = false, maximize = false } = {}): RollResult { - return this.rollWithDifferentBorders(1, 20, { minimize, maximize }); + console.log(`This faces @ roll: ${this.faces}`); + const rollResult = this.rollWithDifferentBorders(1, 20, { minimize, maximize }); + this.results.push(rollResult); + if (rollResult.status == RollResultStatus.CRITICAL_SUCCESS) { + this.success = true; + } else if (rollResult.status == RollResultStatus.CRITICAL_FAILURE) { + this.failure = true; + } + return rollResult; } rollWithDifferentBorders( @@ -45,9 +72,17 @@ export class DS4Roll extends DiceTerm { }, []); } + get expression(): string { + return `${this.faces}ds${this.modifiers.join("")}`; + } + + get formula(): string { + return this.expression; + } + /** Term Modifiers */ crits(modifier: string): this { - const rgx: RegExp = /[c([0-9]+)?,([0-9]+)?]/; + const rgx = new RegExp("c([0-9]+)?,([0-9]+)?"); const match = modifier.match(rgx); if (!match) return this; const [parseCritSucc, parsedCritFail] = match.slice(1); @@ -66,8 +101,7 @@ export class DS4Roll extends DiceTerm { explode(modifier: string): this { // There should only ever be a single dice in the results-array at this point! if (this.results.length != 1) { - // TODO: Add 'expression' to types! - // console.error(`Skipped explode for term ${this.expression}`); + console.error(`Skipped explode for term ${this.expression}`); return this; } @@ -86,10 +120,18 @@ export class DS4Roll extends DiceTerm { if (r.dice[0] <= maxCritSucc) { r.exploded = true; - this.rollWithDifferentBorders(maxCritSucc, 21); + const newRoll = this.rollWithDifferentBorders(maxCritSucc, 21); + this.results.push(newRoll); } if (checked > 1000) throw new Error("Maximum recursion depth for explodign dice roll exceeded"); } } + + // TODO: To Types + static DENOMINATION = "s"; + static MODIFIERS = { + x: "explode", + c: "crits", + }; } diff --git a/src/module/rolls/roll-data.ts b/src/module/rolls/roll-data.ts index 516f8c61..0f298f7e 100644 --- a/src/module/rolls/roll-data.ts +++ b/src/module/rolls/roll-data.ts @@ -18,12 +18,21 @@ export class DefaultRollOptions implements RollOptions { export class RollResult { constructor( - public value: number, + public result: number, public status: RollResultStatus, public dice: Array, public active: boolean = true, public exploded: boolean = false, - ) {} + ) { + if (this.status == RollResultStatus.CRITICAL_FAILURE) { + this.failure = true; + } else if (this.status == RollResultStatus.CRITICAL_SUCCESS) { + this.success = true; + } + } + + public failure: boolean | void = undefined; + public success: boolean | void = undefined; } export enum RollResultStatus { diff --git a/src/module/rolls/roll-executor.ts b/src/module/rolls/roll-executor.ts index b28ca4a3..f5464ce3 100644 --- a/src/module/rolls/roll-executor.ts +++ b/src/module/rolls/roll-executor.ts @@ -43,9 +43,9 @@ export function rollCheckSingleDie( const usedOptions = new DefaultRollOptions().mergeWith(rollOptions); if (dice == null || dice.length != 1) { - console.error("Rolled a dice!"); - // TODO: Make "twist" from foundry.js available! + console.error(`Rolled a dice. Target: ${checkTargetValue}`); dice = [new DS4RollProvider().getNextRoll()]; + console.log(dice); } const usedDice = dice; const rolledDie = usedDice[0]; @@ -118,7 +118,7 @@ export function rollCheckMultipleDice( const evaluationResult = calculateRollResult(sortedRollResults, remainderTargetValue, usedOptions); - if (usedOptions.useSlayingDice && firstResult <= usedOptions.maxCritSucc) { + if (firstResult <= usedOptions.maxCritSucc) { return new RollResult(evaluationResult, RollResultStatus.CRITICAL_SUCCESS, usedDice, true); } else { return new RollResult(evaluationResult, RollResultStatus.SUCCESS, usedDice, true);