90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
|
|
import DiceTerm from "./dice.mjs";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* A type of DiceTerm used to represent flipping a two-sided coin.
|
||
|
|
* @implements {DiceTerm}
|
||
|
|
*/
|
||
|
|
export default class Coin extends DiceTerm {
|
||
|
|
constructor(termData) {
|
||
|
|
termData.faces = 2;
|
||
|
|
super(termData);
|
||
|
|
}
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
static DENOMINATION = "c";
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
static MODIFIERS = {
|
||
|
|
"c": "call"
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
async roll({minimize=false, maximize=false, ...options}={}) {
|
||
|
|
const roll = {result: undefined, active: true};
|
||
|
|
if ( minimize ) roll.result = 0;
|
||
|
|
else if ( maximize ) roll.result = 1;
|
||
|
|
else roll.result = await this._roll(options);
|
||
|
|
if ( roll.result === undefined ) roll.result = this.randomFace();
|
||
|
|
this.results.push(roll);
|
||
|
|
return roll;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
getResultLabel(result) {
|
||
|
|
return {
|
||
|
|
"0": "T",
|
||
|
|
"1": "H"
|
||
|
|
}[result.result];
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
getResultCSS(result) {
|
||
|
|
return [
|
||
|
|
this.constructor.name.toLowerCase(),
|
||
|
|
result.result === 1 ? "heads" : "tails",
|
||
|
|
result.success ? "success" : null,
|
||
|
|
result.failure ? "failure" : null
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/** @override */
|
||
|
|
mapRandomFace(randomUniform) {
|
||
|
|
return Math.round(randomUniform);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
/* Term Modifiers */
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Call the result of the coin flip, marking any coins that matched the called target as a success
|
||
|
|
* 3dcc1 Flip 3 coins and treat "heads" as successes
|
||
|
|
* 2dcc0 Flip 2 coins and treat "tails" as successes
|
||
|
|
* @param {string} modifier The matched modifier query
|
||
|
|
*/
|
||
|
|
call(modifier) {
|
||
|
|
|
||
|
|
// Match the modifier
|
||
|
|
const rgx = /c([01])/i;
|
||
|
|
const match = modifier.match(rgx);
|
||
|
|
if ( !match ) return false;
|
||
|
|
let [target] = match.slice(1);
|
||
|
|
target = parseInt(target);
|
||
|
|
|
||
|
|
// Treat each result which matched the call as a success
|
||
|
|
for ( let r of this.results ) {
|
||
|
|
const match = r.result === target;
|
||
|
|
r.count = match ? 1 : 0;
|
||
|
|
r.success = match;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|