88 lines
2.5 KiB
JavaScript
88 lines
2.5 KiB
JavaScript
import { statDice } from "../../config.mjs";
|
|
|
|
/**
|
|
* A subclass of DataField that allows ActiveEffects to integrate with dice
|
|
* values and increase/decrease the value step-wise according to the dice ladder.
|
|
*/
|
|
export class DiceField extends foundry.data.fields.DataField {
|
|
static get _defaults() {
|
|
return foundry.utils.mergeObject(super._defaults, {
|
|
trim: true,
|
|
blank: true,
|
|
initial: ``,
|
|
choices: [``, ...statDice],
|
|
});
|
|
};
|
|
|
|
constructor(options = {}, context = {}) {
|
|
super(options, context);
|
|
|
|
// v- because for some reason Foundry doesn't respect the _defaults getter
|
|
this.blank = true;
|
|
};
|
|
|
|
_cast(value) { return value };
|
|
_castChangeDelta(delta) { return delta };
|
|
|
|
/**
|
|
* @param {string} value The current value
|
|
* @param {string} delta The AE value
|
|
* @param {unknown} model
|
|
* @param {unknown} changes
|
|
*/
|
|
_applyChangeAdd(value, delta, model, changes) {
|
|
if (value === "") return value;
|
|
delta = parseInt(delta);
|
|
const dieIndex = statDice.findIndex(die => die === value);
|
|
const newIndex = Math.min(Math.max(0, dieIndex + delta), statDice.length - 1);
|
|
value = statDice[newIndex];
|
|
return value;
|
|
};
|
|
|
|
/**
|
|
* @param {string} value The current value
|
|
* @param {string} delta The AE value
|
|
* @param {unknown} model
|
|
* @param {unknown} changes
|
|
*/
|
|
_applyChangeMultiply(value, delta, model, changes) {
|
|
console.warn(`.dungeon | Cannot apply Multiply ActiveEffects to DiceFields. Not changing value.`);
|
|
return value;
|
|
};
|
|
|
|
/**
|
|
* @param {string} value The current value
|
|
* @param {string} delta The AE value
|
|
* @param {unknown} model
|
|
* @param {unknown} changes
|
|
*/
|
|
_applyChangeOverride(value, delta, model, changes) {
|
|
return delta;
|
|
};
|
|
|
|
/**
|
|
* @param {string} value The current value
|
|
* @param {string} delta The AE value
|
|
* @param {unknown} model
|
|
* @param {unknown} changes
|
|
*/
|
|
_applyChangeUpgrade(value, delta, model, changes) {
|
|
if (value === "") return value;
|
|
const currentIndex = statDice.findIndex(die => die === value);
|
|
const upgradedIndex = statDice.findIndex(die => die === delta);
|
|
return statDice[Math.max(currentIndex, upgradedIndex)];
|
|
};
|
|
|
|
/**
|
|
* @param {string} value The current value
|
|
* @param {string} delta The AE value
|
|
* @param {unknown} model
|
|
* @param {unknown} changes
|
|
*/
|
|
_applyChangeDowngrade(value, delta, model, changes) {
|
|
if (value === "") return value;
|
|
const currentIndex = statDice.findIndex(die => die === value);
|
|
const upgradedIndex = statDice.findIndex(die => die === delta);
|
|
return statDice[Math.min(currentIndex, upgradedIndex)];
|
|
};
|
|
};
|