Get basic features to work.

This commit is contained in:
Oliver Rümpelein 2021-01-07 02:26:09 +01:00
parent ab450808f5
commit 1422f28760
3 changed files with 63 additions and 12 deletions

View file

@ -1,17 +1,44 @@
import { RollResult, RollResultStatus } from "./roll-data"; import { RollResult, RollResultStatus } from "./roll-data";
import { ds4roll } from "./roll-executor"; import { ds4roll } from "./roll-executor";
interface TermData {
number: number;
faces: number;
modifiers: Array<string>;
options: Record<string, unknown>;
}
export class DS4Roll extends DiceTerm { export class DS4Roll extends DiceTerm {
constructor({ faces = 20, modifiers = [], options = {} } = {}) { constructor(termData: Partial<TermData>) {
super({ number: 1, faces: faces, modifiers: modifiers, options: options }); 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 * @override
* @param param0 * @param param0
*
* @private_notes This gets only called once for the first roll.
*/ */
roll({ minimize = false, maximize = false } = {}): RollResult { 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( 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 */ /** Term Modifiers */
crits(modifier: string): this { 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); const match = modifier.match(rgx);
if (!match) return this; if (!match) return this;
const [parseCritSucc, parsedCritFail] = match.slice(1); const [parseCritSucc, parsedCritFail] = match.slice(1);
@ -66,8 +101,7 @@ export class DS4Roll extends DiceTerm {
explode(modifier: string): this { explode(modifier: string): this {
// There should only ever be a single dice in the results-array at this point! // There should only ever be a single dice in the results-array at this point!
if (this.results.length != 1) { 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; return this;
} }
@ -86,10 +120,18 @@ export class DS4Roll extends DiceTerm {
if (r.dice[0] <= maxCritSucc) { if (r.dice[0] <= maxCritSucc) {
r.exploded = true; 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"); 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",
};
} }

View file

@ -18,12 +18,21 @@ export class DefaultRollOptions implements RollOptions {
export class RollResult { export class RollResult {
constructor( constructor(
public value: number, public result: number,
public status: RollResultStatus, public status: RollResultStatus,
public dice: Array<number>, public dice: Array<number>,
public active: boolean = true, public active: boolean = true,
public exploded: boolean = false, 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 { export enum RollResultStatus {

View file

@ -43,9 +43,9 @@ export function rollCheckSingleDie(
const usedOptions = new DefaultRollOptions().mergeWith(rollOptions); const usedOptions = new DefaultRollOptions().mergeWith(rollOptions);
if (dice == null || dice.length != 1) { if (dice == null || dice.length != 1) {
console.error("Rolled a dice!"); console.error(`Rolled a dice. Target: ${checkTargetValue}`);
// TODO: Make "twist" from foundry.js available!
dice = [new DS4RollProvider().getNextRoll()]; dice = [new DS4RollProvider().getNextRoll()];
console.log(dice);
} }
const usedDice = dice; const usedDice = dice;
const rolledDie = usedDice[0]; const rolledDie = usedDice[0];
@ -118,7 +118,7 @@ export function rollCheckMultipleDice(
const evaluationResult = calculateRollResult(sortedRollResults, remainderTargetValue, usedOptions); 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); return new RollResult(evaluationResult, RollResultStatus.CRITICAL_SUCCESS, usedDice, true);
} else { } else {
return new RollResult(evaluationResult, RollResultStatus.SUCCESS, usedDice, true); return new RollResult(evaluationResult, RollResultStatus.SUCCESS, usedDice, true);