Grabbed dndbeyond's source code

```
~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js
```
This commit is contained in:
2025-05-28 11:50:03 -07:00
commit 8df9031d27
3592 changed files with 319051 additions and 0 deletions
@@ -0,0 +1,185 @@
/**
*
* @param modifier
*/
export function getComponentId(modifier) {
return modifier.componentId;
}
/**
*
* @param modifier
*/
export function getComponentTypeId(modifier) {
return modifier.componentTypeId;
}
/**
*
* @param modifier
*/
export function getDice(modifier) {
return modifier.dice;
}
/**
*
* @param modifier
*/
export function getStatId(modifier) {
return modifier.statId;
}
/**
*
* @param modifier
*/
export function getSubType(modifier) {
return modifier.subType;
}
/**
*
* @param modifier
*/
export function getType(modifier) {
return modifier.type;
}
/**
*
* @param modifier
*/
export function getFriendlyTypeName(modifier) {
return modifier.friendlyTypeName;
}
/**
*
* @param modifier
*/
export function getFriendlySubtypeName(modifier) {
return modifier.friendlySubtypeName;
}
/**
*
* @param modifier
*/
export function getRestriction(modifier) {
return modifier.restriction;
}
/**
*
* @param modifier
*/
export function getValue(modifier) {
return modifier.value;
}
/**
*
* @param modifier
*/
export function getEntityId(modifier) {
return modifier.entityId;
}
/**
*
* @param modifier
*/
export function getEntityTypeId(modifier) {
return modifier.entityTypeId;
}
/**
*
* @param modifier
*/
export function getEntityKey(modifier) {
return `${getEntityId(modifier)}-${getEntityTypeId(modifier)}`;
}
/**
*
* @param modifier
*/
export function isGranted(modifier) {
return modifier.isGranted;
}
/**
*
* @param modifier
*/
export function getDataOrigin(modifier) {
return modifier.dataOrigin;
}
/**
*
* @param modifier
*/
export function getDataOriginType(modifier) {
const dataOrigin = getDataOrigin(modifier);
return dataOrigin.type;
}
/**
*
* @param modifier
*/
export function getBonusTypes(modifier) {
var _a;
return (_a = modifier.bonusTypes) !== null && _a !== void 0 ? _a : [];
}
/**
*
* @param modifier
*/
export function getId(modifier) {
return modifier.id;
}
/**
*
* @param modifier
*/
export function requiresAttunement(modifier) {
return modifier.requiresAttunement;
}
/**
*
* @param modifier
*/
export function getAtHigherLevels(modifier) {
return modifier.atHigherLevels;
}
/**
*
* @param modifier
*/
export function getCount(modifier) {
return modifier.count;
}
/**
*
* @param modifier
*/
export function getDie(modifier) {
return modifier.die;
}
/**
*
* @param modifier
*/
export function getDurationUnit(modifier) {
return modifier.durationUnit;
}
/**
*
* @param modifier
*/
export function getUsePrimaryStat(modifier) {
return modifier.usePrimaryStat;
}
/**
*
* @param modifier
*/
export function getValueTotal(modifier) {
var _a;
return (_a = modifier.valueTotal) !== null && _a !== void 0 ? _a : 0;
}
/**
*
* @param modifier
*/
export function isAvailableToMulticlass(modifier) {
return modifier.availableToMulticlass;
}
@@ -0,0 +1,326 @@
export var ModifierBonusTypeEnum;
(function (ModifierBonusTypeEnum) {
ModifierBonusTypeEnum[ModifierBonusTypeEnum["PROFICIENCY_BONUS"] = 1] = "PROFICIENCY_BONUS";
ModifierBonusTypeEnum[ModifierBonusTypeEnum["ATTUNED_ITEM_COUNT"] = 2] = "ATTUNED_ITEM_COUNT";
ModifierBonusTypeEnum[ModifierBonusTypeEnum["SPELL_LEVEL"] = 3] = "SPELL_LEVEL";
})(ModifierBonusTypeEnum || (ModifierBonusTypeEnum = {}));
export var ModifierTypeEnum;
(function (ModifierTypeEnum) {
ModifierTypeEnum["SET_BASE"] = "set-base";
ModifierTypeEnum["BONUS"] = "bonus";
ModifierTypeEnum["SET"] = "set";
ModifierTypeEnum["STACKING_BONUS"] = "stacking-bonus";
ModifierTypeEnum["RESISTANCE"] = "resistance";
ModifierTypeEnum["IMMUNITY"] = "immunity";
ModifierTypeEnum["VULNERABILITY"] = "vulnerability";
ModifierTypeEnum["HALF_PROFICIENCY"] = "half-proficiency";
ModifierTypeEnum["HALF_PROFICIENCY_ROUND_UP"] = "half-proficiency-round-up";
ModifierTypeEnum["PROFICIENCY"] = "proficiency";
ModifierTypeEnum["TWICE_PROFICIENCY"] = "twice-proficiency";
ModifierTypeEnum["EXPERTISE"] = "expertise";
ModifierTypeEnum["DAMAGE"] = "damage";
ModifierTypeEnum["ADVANTAGE"] = "advantage";
ModifierTypeEnum["DISADVANTAGE"] = "disadvantage";
ModifierTypeEnum["SENSE"] = "sense";
ModifierTypeEnum["LANGUAGE"] = "language";
ModifierTypeEnum["IGNORE"] = "ignore";
ModifierTypeEnum["SIZE"] = "size";
ModifierTypeEnum["SPEED_REDUCTION"] = "speed-reduction";
ModifierTypeEnum["CARRYING_CAPACITY"] = "carrying-capacity";
ModifierTypeEnum["NATURAL_WEAPON"] = "natural-weapon";
ModifierTypeEnum["ELDRITCH_BLAST"] = "eldritch-blast";
ModifierTypeEnum["REPLACE_DAMAGE_TYPE"] = "replace-damage-type";
ModifierTypeEnum["REPLACE_WEAPON_ABILITY"] = "replace-weapon-ability";
ModifierTypeEnum["WEAPON_PROPERTY"] = "weapon-property";
ModifierTypeEnum["IGNORE_WEAPON_PROPERTY"] = "ignore-weapon-property";
ModifierTypeEnum["MONK_WEAPON"] = "monk-weapon";
ModifierTypeEnum["KENSEI"] = "kensei";
ModifierTypeEnum["PROTECTION"] = "protection";
ModifierTypeEnum["STEALTH_DISADVANTAGE"] = "stealth-disadvantage";
ModifierTypeEnum["WEAPON_MASTERY"] = "weapon-mastery";
ModifierTypeEnum["ENABLE_FEATURE"] = "enable-feature";
})(ModifierTypeEnum || (ModifierTypeEnum = {}));
export var ModifierSubTypeEnum;
(function (ModifierSubTypeEnum) {
ModifierSubTypeEnum["ARMOR_CLASS"] = "armor-class";
ModifierSubTypeEnum["MAGIC"] = "magic";
ModifierSubTypeEnum["SPELL_SAVE_DC"] = "spell-save-dc";
ModifierSubTypeEnum["PROFICIENCY"] = "proficiency";
ModifierSubTypeEnum["PROFICIENCY_BONUS"] = "proficiency-bonus";
ModifierSubTypeEnum["ALL"] = "all";
ModifierSubTypeEnum["SELF"] = "self";
ModifierSubTypeEnum["REMOVE"] = "remove";
ModifierSubTypeEnum["DEATH"] = "death";
ModifierSubTypeEnum["ATTUNEMENT_SLOTS"] = "attunement-slots";
ModifierSubTypeEnum["INITIATIVE"] = "initiative";
ModifierSubTypeEnum["PASSIVE_PERCEPTION"] = "passive-perception";
ModifierSubTypeEnum["PASSIVE_INVESTIGATION"] = "passive-investigation";
ModifierSubTypeEnum["PASSIVE_INSIGHT"] = "passive-insight";
ModifierSubTypeEnum["AC_MAX_DEX_MODIFIER"] = "ac-max-dex-modifier";
ModifierSubTypeEnum["AC_MAX_DEX_ARMORED_MODIFIER"] = "ac-max-dex-armored-modifier";
ModifierSubTypeEnum["AC_MAX_DEX_UNARMORED_MODIFIER"] = "ac-max-dex-unarmored-modifier";
ModifierSubTypeEnum["SHIELD_AC_ON_DEX_SAVES"] = "shield-ac-on-dex-saves";
ModifierSubTypeEnum["OFFHAND_MODIFIER_RESTRICTIONS"] = "dual-wield-modifier-restrictions";
ModifierSubTypeEnum["OFFHAND_LIGHT_RESTRICTIONS"] = "dual-wield-light-restrictions";
ModifierSubTypeEnum["DUAL_WIELD_ARMOR_CLASS"] = "dual-wield-armor-class";
ModifierSubTypeEnum["EXTRA_ATTACKS"] = "extra-attacks";
ModifierSubTypeEnum["CANTRIP_DAMAGE"] = "cantrip-damage";
ModifierSubTypeEnum["WEAPON_ATTACKS"] = "weapon-attacks";
ModifierSubTypeEnum["MELEE_ATTACKS"] = "melee-attacks";
ModifierSubTypeEnum["RANGED_ATTACKS"] = "ranged-attacks";
ModifierSubTypeEnum["SPELL_ATTACKS"] = "spell-attacks";
ModifierSubTypeEnum["NATURAL_ATTACKS"] = "natural-attacks";
ModifierSubTypeEnum["MELEE_WEAPON_ATTACKS"] = "melee-weapon-attacks";
ModifierSubTypeEnum["RANGED_WEAPON_ATTACKS"] = "ranged-weapon-attacks";
ModifierSubTypeEnum["MELEE_SPELL_ATTACKS"] = "melee-spell-attacks";
ModifierSubTypeEnum["RANGED_SPELL_ATTACKS"] = "ranged-spell-attacks";
ModifierSubTypeEnum["MELEE_NATURAL_ATTACKS"] = "melee-natural-attacks";
ModifierSubTypeEnum["RANGED_NATURAL_ATTACKS"] = "ranged-natural-attacks";
ModifierSubTypeEnum["MELEE_UNARMED_ATTACKS"] = "melee-unarmed-attacks";
ModifierSubTypeEnum["RANGED_UNARMED_ATTACKS"] = "ranged-unarmed-attacks";
ModifierSubTypeEnum["UNARMED_ATTACKS"] = "unarmed-attacks";
ModifierSubTypeEnum["STRENGTH_ATTACKS"] = "strength-attacks";
ModifierSubTypeEnum["DEXTERITY_ATTACKS"] = "dexterity-attacks";
ModifierSubTypeEnum["ONE_HANDED_WEAPON_ATTACKS"] = "one-handed-weapon-attacks";
ModifierSubTypeEnum["TWO_HANDED_WEAPON_ATTACKS"] = "two-handed-weapon-attacks";
ModifierSubTypeEnum["ONE_HANDED_MELEE_ATTACKS"] = "one-handed-melee-attacks";
ModifierSubTypeEnum["TWO_HANDED_MELEE_ATTACKS"] = "two-handed-melee-attacks";
ModifierSubTypeEnum["ONE_HANDED_RANGED_ATTACKS"] = "one-handed-ranged-attacks";
ModifierSubTypeEnum["TWO_HANDED_RANGED_ATTACKS"] = "two-handed-ranged-attacks";
ModifierSubTypeEnum["THROWN_WEAPON_ATTACKS"] = "thrown-weapon-attacks";
ModifierSubTypeEnum["THROWN_MELEE_ATTACKS"] = "thrown-melee-attacks";
ModifierSubTypeEnum["THROWN_RANGED_ATTACKS"] = "thrown-ranged-attacks";
ModifierSubTypeEnum["UNARMORED_DEX_AC_BONUS"] = "unarmored-dex-ac-bonus";
ModifierSubTypeEnum["UNARMORED_ARMOR_CLASS"] = "unarmored-armor-class";
ModifierSubTypeEnum["ARMORED_ARMOR_CLASS"] = "armored-armor-class";
ModifierSubTypeEnum["UNARMORED_WHILE_ARMORED"] = "unarmored-while-armored";
ModifierSubTypeEnum["MINIMUM_BASE_ARMOR"] = "minimum-base-armor";
ModifierSubTypeEnum["UNARMED_DAMAGE_DIE"] = "unarmed-damage-die";
ModifierSubTypeEnum["HIT_POINTS"] = "hit-points";
ModifierSubTypeEnum["HIT_POINTS_PER_LEVEL"] = "hit-points-per-level";
ModifierSubTypeEnum["TEMPORARY_HIT_POINTS"] = "temporary-hit-points";
ModifierSubTypeEnum["GARGANTUAN"] = "gargantuan";
ModifierSubTypeEnum["HUGE"] = "huge";
ModifierSubTypeEnum["LARGE"] = "large";
ModifierSubTypeEnum["MEDIUM"] = "medium";
ModifierSubTypeEnum["SMALL"] = "small";
ModifierSubTypeEnum["TINY"] = "tiny";
ModifierSubTypeEnum["MULTIPLIER"] = "multiplier";
ModifierSubTypeEnum["STRENGTH_SCORE"] = "strength-score";
ModifierSubTypeEnum["DEXTERITY_SCORE"] = "dexterity-score";
ModifierSubTypeEnum["CONSTITUTION_SCORE"] = "constitution-score";
ModifierSubTypeEnum["INTELLIGENCE_SCORE"] = "intelligence-score";
ModifierSubTypeEnum["WISDOM_SCORE"] = "wisdom-score";
ModifierSubTypeEnum["CHARISMA_SCORE"] = "charisma-score";
ModifierSubTypeEnum["CHOOSE_AN_ABILITY_SCORE"] = "choose-an-ability-score";
ModifierSubTypeEnum["SPEED"] = "speed";
ModifierSubTypeEnum["SPEED_WALKING"] = "speed-walking";
ModifierSubTypeEnum["SPEED_FLYING"] = "speed-flying";
ModifierSubTypeEnum["SPEED_CLIMBING"] = "speed-climbing";
ModifierSubTypeEnum["SPEED_SWIMMING"] = "speed-swimming";
ModifierSubTypeEnum["SPEED_BURROWING"] = "speed-burrowing";
ModifierSubTypeEnum["INNATE_SPEED_WALKING"] = "innate-speed-walking";
ModifierSubTypeEnum["INNATE_SPEED_FLYING"] = "innate-speed-flying";
ModifierSubTypeEnum["INNATE_SPEED_CLIMBING"] = "innate-speed-climbing";
ModifierSubTypeEnum["INNATE_SPEED_SWIMMING"] = "innate-speed-swimming";
ModifierSubTypeEnum["INNATE_SPEED_BURROWING"] = "innate-speed-burrowing";
ModifierSubTypeEnum["UNARMORED_MOVEMENT"] = "unarmored-movement";
ModifierSubTypeEnum["SAVING_THROWS"] = "saving-throws";
ModifierSubTypeEnum["STRENGTH_SAVING_THROWS"] = "strength-saving-throws";
ModifierSubTypeEnum["DEXTERITY_SAVING_THROWS"] = "dexterity-saving-throws";
ModifierSubTypeEnum["CONSTITUTION_SAVING_THROWS"] = "constitution-saving-throws";
ModifierSubTypeEnum["INTELLIGENCE_SAVING_THROWS"] = "intelligence-saving-throws";
ModifierSubTypeEnum["WISDOM_SAVING_THROWS"] = "wisdom-saving-throws";
ModifierSubTypeEnum["CHARISMA_SAVING_THROWS"] = "charisma-saving-throws";
ModifierSubTypeEnum["DEATH_SAVING_THROWS"] = "death-saving-throws";
ModifierSubTypeEnum["ABILITY_SCORE_MAXIMUM"] = "ability-score-maximum";
ModifierSubTypeEnum["ABILITY_CHECKS"] = "ability-checks";
ModifierSubTypeEnum["STRENGTH_ABILITY_CHECKS"] = "strength-ability-checks";
ModifierSubTypeEnum["DEXTERITY_ABILITY_CHECKS"] = "dexterity-ability-checks";
ModifierSubTypeEnum["CONSTITUTION_ABILITY_CHECKS"] = "constitution-ability-checks";
ModifierSubTypeEnum["INTELLIGENCE_ABILITY_CHECKS"] = "intelligence-ability-checks";
ModifierSubTypeEnum["WISDOM_ABILITY_CHECKS"] = "wisdom-ability-checks";
ModifierSubTypeEnum["CHARISMA_ABILITY_CHECKS"] = "charisma-ability-checks";
ModifierSubTypeEnum["CRITICAL_HITS"] = "critical-hits";
ModifierSubTypeEnum["ACID"] = "acid";
ModifierSubTypeEnum["BLUDGEONING"] = "bludgeoning";
ModifierSubTypeEnum["COLD"] = "cold";
ModifierSubTypeEnum["FIRE"] = "fire";
ModifierSubTypeEnum["FORCE"] = "force";
ModifierSubTypeEnum["LIGHTNING"] = "lightning";
ModifierSubTypeEnum["NECROTIC"] = "necrotic";
ModifierSubTypeEnum["PIERCING"] = "piercing";
ModifierSubTypeEnum["POISON"] = "poison";
ModifierSubTypeEnum["PSYCHIC"] = "psychic";
ModifierSubTypeEnum["RADIANT"] = "radiant";
ModifierSubTypeEnum["SLASHING"] = "slashing";
ModifierSubTypeEnum["THUNDER"] = "thunder";
ModifierSubTypeEnum["BLUDGEONING_PIERCING_SLASHING_NONMAGIC"] = "bludgeoning--piercing--and-slashing-from-nonmagical-weapons";
ModifierSubTypeEnum["BLINDSIGHT"] = "blindsight";
ModifierSubTypeEnum["DARKVISION"] = "darkvision";
ModifierSubTypeEnum["TREMORSENSE"] = "tremorsense";
ModifierSubTypeEnum["TRUESIGHT"] = "truesight";
ModifierSubTypeEnum["NATURAL_WEAPON"] = "natural-weapon";
ModifierSubTypeEnum["UNARMED_STRIKE"] = "unarmed-strike";
ModifierSubTypeEnum["HEAVY_ARMOR_SPEED_REDUCTION"] = "heavy-armor-speed-reduction";
// Armor
ModifierSubTypeEnum["LIGHT_ARMOR"] = "light-armor";
ModifierSubTypeEnum["MEDIUM_ARMOR"] = "medium-armor";
ModifierSubTypeEnum["HEAVY_ARMOR"] = "heavy-armor";
ModifierSubTypeEnum["SHIELDS"] = "shields";
// light armor
ModifierSubTypeEnum["PADDED"] = "padded";
ModifierSubTypeEnum["LEATHER"] = "leather";
ModifierSubTypeEnum["STUDDED_LEATHER"] = "studded-leather";
ModifierSubTypeEnum["PRIDE_SILK_OUTFIT"] = "pride-silk-outfit";
ModifierSubTypeEnum["BARK_ARMOR"] = "bark-armor";
// medium armor
ModifierSubTypeEnum["HIDE"] = "hide";
ModifierSubTypeEnum["CHAIN_SHIRT"] = "chain-shirt";
ModifierSubTypeEnum["SCALE_MAIL"] = "scale-mail";
ModifierSubTypeEnum["BREASTPLATE"] = "breastplate";
ModifierSubTypeEnum["HALF_PLATE"] = "half-plate";
ModifierSubTypeEnum["SPIKED_ARMOR"] = "spiked-armor";
ModifierSubTypeEnum["SCUMWEED_ARMOR"] = "scumweed-armor";
// heavy armor
ModifierSubTypeEnum["RING_MAIL"] = "ring-mail";
ModifierSubTypeEnum["CHAIN_MAIL"] = "chain-mail";
ModifierSubTypeEnum["SPLINT"] = "splint";
ModifierSubTypeEnum["PLATE"] = "plate";
ModifierSubTypeEnum["POWERED_ARMOR"] = "powered-armor";
ModifierSubTypeEnum["DIVERS_ARMOR"] = "divers-armor";
// shields
ModifierSubTypeEnum["SHIELD"] = "shield";
ModifierSubTypeEnum["POT_LID"] = "pot-lid";
ModifierSubTypeEnum["PROPERTY_AMMUNITION"] = "ammunition";
ModifierSubTypeEnum["PROPERTY_FINESSE"] = "finesse";
ModifierSubTypeEnum["PROPERTY_HEAVY"] = "heavy";
ModifierSubTypeEnum["PROPERTY_LIGHT"] = "light";
ModifierSubTypeEnum["PROPERTY_LOADING"] = "loading";
ModifierSubTypeEnum["PROPERTY_RANGE"] = "range";
ModifierSubTypeEnum["PROPERTY_REACH"] = "reach";
ModifierSubTypeEnum["PROPERTY_SPECIAL"] = "special";
ModifierSubTypeEnum["PROPERTY_THROWN"] = "thrown";
ModifierSubTypeEnum["PROPERTY_TWO_HANDED"] = "two-handed";
ModifierSubTypeEnum["PROPERTY_VERSATILE"] = "versatile";
ModifierSubTypeEnum["MELEE_REACH"] = "melee-reach";
// edlritch blast
ModifierSubTypeEnum["BONUS_DAMAGE"] = "bonus-damage";
ModifierSubTypeEnum["BONUS_RANGE"] = "bonus-range";
ModifierSubTypeEnum["SPELL_ATTACK_RANGE_MULTIPLIER"] = "spell-attack-range-multiplier";
ModifierSubTypeEnum["ZERO_HP"] = "0-hp";
ModifierSubTypeEnum["MAGIC_ITEM_ATTACK_WITH_STRENGTH"] = "magic-item-attack-with-strength";
ModifierSubTypeEnum["MAGIC_ITEM_ATTACK_WITH_DEXTERITY"] = "magic-item-attack-with-dexterity";
ModifierSubTypeEnum["MAGIC_ITEM_ATTACK_WITH_CONSTITUTION"] = "magic-item-attack-with-constitution";
ModifierSubTypeEnum["MAGIC_ITEM_ATTACK_WITH_INTELLIGENCE"] = "magic-item-attack-with-intelligence";
ModifierSubTypeEnum["MAGIC_ITEM_ATTACK_WITH_WISDOM"] = "magic-item-attack-with-wisdom";
ModifierSubTypeEnum["MAGIC_ITEM_ATTACK_WITH_CHARISMA"] = "magic-item-attack-with-charisma";
// Spell Groups
ModifierSubTypeEnum["SPELL_GROUP_HEALING"] = "spell-group-healing";
// Warlock Feature
ModifierSubTypeEnum["ENABLE_PACT_WEAPON"] = "enable-pact-weapon";
ModifierSubTypeEnum["ENABLE_HEX_WEAPON"] = "enable-hex-weapon";
})(ModifierSubTypeEnum || (ModifierSubTypeEnum = {}));
export const SIZE_LIST = [
ModifierSubTypeEnum.GARGANTUAN,
ModifierSubTypeEnum.HUGE,
ModifierSubTypeEnum.LARGE,
ModifierSubTypeEnum.MEDIUM,
ModifierSubTypeEnum.SMALL,
ModifierSubTypeEnum.TINY,
];
export const DAMAGE_ADJUSTMENT_LIST = [
ModifierSubTypeEnum.ACID,
ModifierSubTypeEnum.BLUDGEONING,
ModifierSubTypeEnum.COLD,
ModifierSubTypeEnum.FIRE,
ModifierSubTypeEnum.FORCE,
ModifierSubTypeEnum.LIGHTNING,
ModifierSubTypeEnum.NECROTIC,
ModifierSubTypeEnum.PIERCING,
ModifierSubTypeEnum.POISON,
ModifierSubTypeEnum.PSYCHIC,
ModifierSubTypeEnum.RADIANT,
ModifierSubTypeEnum.SLASHING,
ModifierSubTypeEnum.THUNDER,
ModifierSubTypeEnum.BLUDGEONING_PIERCING_SLASHING_NONMAGIC,
];
export const LIGHT_ARMOR_LIST = [
ModifierSubTypeEnum.PADDED,
ModifierSubTypeEnum.LEATHER,
ModifierSubTypeEnum.STUDDED_LEATHER,
ModifierSubTypeEnum.PRIDE_SILK_OUTFIT,
ModifierSubTypeEnum.BARK_ARMOR,
];
export const MEDIUM_ARMOR_LIST = [
ModifierSubTypeEnum.HIDE,
ModifierSubTypeEnum.CHAIN_SHIRT,
ModifierSubTypeEnum.SCALE_MAIL,
ModifierSubTypeEnum.BREASTPLATE,
ModifierSubTypeEnum.HALF_PLATE,
ModifierSubTypeEnum.SPIKED_ARMOR,
ModifierSubTypeEnum.SCUMWEED_ARMOR,
];
export const HEAVY_ARMOR_LIST = [
ModifierSubTypeEnum.RING_MAIL,
ModifierSubTypeEnum.CHAIN_MAIL,
ModifierSubTypeEnum.SPLINT,
ModifierSubTypeEnum.PLATE,
ModifierSubTypeEnum.POWERED_ARMOR,
ModifierSubTypeEnum.DIVERS_ARMOR,
];
export const SHIELDS_LIST = [
ModifierSubTypeEnum.SHIELD,
ModifierSubTypeEnum.POT_LID,
];
export const ALL_ARMOR_LIST = [
...LIGHT_ARMOR_LIST,
...MEDIUM_ARMOR_LIST,
...HEAVY_ARMOR_LIST,
...SHIELDS_LIST,
];
export const PROPERTY_LIST = [
ModifierSubTypeEnum.PROPERTY_AMMUNITION,
ModifierSubTypeEnum.PROPERTY_FINESSE,
ModifierSubTypeEnum.PROPERTY_HEAVY,
ModifierSubTypeEnum.PROPERTY_LIGHT,
ModifierSubTypeEnum.PROPERTY_LOADING,
ModifierSubTypeEnum.PROPERTY_RANGE,
ModifierSubTypeEnum.PROPERTY_REACH,
// ModifierSubTypeEnum.PROPERTY_SPECIAL,
ModifierSubTypeEnum.PROPERTY_THROWN,
ModifierSubTypeEnum.PROPERTY_TWO_HANDED,
ModifierSubTypeEnum.PROPERTY_VERSATILE,
];
export const MAGIC_ITEM_ATTACK_WITH_STAT_LIST = [
ModifierSubTypeEnum.MAGIC_ITEM_ATTACK_WITH_STRENGTH,
ModifierSubTypeEnum.MAGIC_ITEM_ATTACK_WITH_DEXTERITY,
ModifierSubTypeEnum.MAGIC_ITEM_ATTACK_WITH_CONSTITUTION,
ModifierSubTypeEnum.MAGIC_ITEM_ATTACK_WITH_INTELLIGENCE,
ModifierSubTypeEnum.MAGIC_ITEM_ATTACK_WITH_WISDOM,
ModifierSubTypeEnum.MAGIC_ITEM_ATTACK_WITH_CHARISMA,
];
export const STAT_SAVING_THROW_LIST = [
ModifierSubTypeEnum.STRENGTH_SAVING_THROWS,
ModifierSubTypeEnum.DEXTERITY_SAVING_THROWS,
ModifierSubTypeEnum.CONSTITUTION_SAVING_THROWS,
ModifierSubTypeEnum.INTELLIGENCE_SAVING_THROWS,
ModifierSubTypeEnum.WISDOM_SAVING_THROWS,
ModifierSubTypeEnum.CHARISMA_SAVING_THROWS,
];
export const STAT_ABILITY_CHECK_LIST = [
ModifierSubTypeEnum.STRENGTH_ABILITY_CHECKS,
ModifierSubTypeEnum.DEXTERITY_ABILITY_CHECKS,
ModifierSubTypeEnum.CONSTITUTION_ABILITY_CHECKS,
ModifierSubTypeEnum.INTELLIGENCE_ABILITY_CHECKS,
ModifierSubTypeEnum.WISDOM_ABILITY_CHECKS,
ModifierSubTypeEnum.CHARISMA_ABILITY_CHECKS,
];
export const STAT_ABILITY_SCORE_LIST = [
ModifierSubTypeEnum.STRENGTH_SCORE,
ModifierSubTypeEnum.DEXTERITY_SCORE,
ModifierSubTypeEnum.CONSTITUTION_SCORE,
ModifierSubTypeEnum.INTELLIGENCE_SCORE,
ModifierSubTypeEnum.WISDOM_SCORE,
ModifierSubTypeEnum.CHARISMA_SCORE,
];
@@ -0,0 +1,246 @@
import { AbilityAccessors } from '../Ability';
import { AbilityStatEnum } from '../Core';
import { DiceAdjustmentRollTypeEnum } from '../Dice';
import { HelperUtils } from '../Helper';
import { getBonusTypes, getDataOrigin, getId, getRestriction, getStatId, getSubType, getValue, getValueTotal, } from './accessors';
import { STAT_ABILITY_CHECK_LIST, ModifierBonusTypeEnum, ModifierSubTypeEnum, STAT_SAVING_THROW_LIST, } from './constants';
/**
*
* @param modifier
* @param abilityLookup
* @param minimumValue
*/
export function deriveStatScaledModifierValue(modifier, abilityLookup, minimumValue = 0) {
const statId = getStatId(modifier);
if (abilityLookup === null || statId === null) {
return 0;
}
const stat = abilityLookup[statId];
if (!stat) {
return 0;
}
const statModifier = AbilityAccessors.getModifier(stat);
if (statModifier === null) {
return minimumValue;
}
return Math.max(statModifier, minimumValue);
}
/**
*
* @param modifier
* @param defaultValue
*/
export function deriveFixedModifierValue(modifier, defaultValue = 0) {
const value = getValue(modifier);
return value === null ? defaultValue : value;
}
/**
* @deprecated deriveValue
* @param modifier
* @param abilityLookup
* @param minimumValue
*/
export function getModifierValue(modifier, abilityLookup, minimumValue = 0) {
let value = 0;
if (abilityLookup !== null && getStatId(modifier) !== null) {
value += deriveStatScaledModifierValue(modifier, abilityLookup, minimumValue);
}
const fixedValue = deriveFixedModifierValue(modifier);
return value + (fixedValue === null ? 0 : fixedValue);
}
// TODO rename to sumModifierValues
// TODO go through uses of this and remove any places where I am summing scaled and fixed separately outside of this
// TODO go through uses and add stats to sum so stat scaling can be used automagically
/**
* @deprecated deriveTotalValue
* @param modifiers
* @param abilityLookup
* @param minimumValue
* @param initialValue
*/
export function sumModifiers(modifiers, abilityLookup = null, minimumValue = 0, initialValue = 0) {
return modifiers.reduce((acc, modifier) => (acc += getModifierValue(modifier, abilityLookup, minimumValue)), initialValue);
}
/**
*
* @param modifier
* @param modifierData
* @param minimumValue
* @param includeBonusTypes
* @param additionalBonusValueLookup - A lookup that maps an additional ModifierBonusTypeEnum to its bonus value. eg Disciple of Life
*/
export function deriveValue(modifier, modifierData, minimumValue = 0, includeBonusTypes = true, additionalBonusValueLookup = {}) {
let baseValue = 0;
if (getStatId(modifier) !== null) {
baseValue = deriveStatScaledModifierValue(modifier, modifierData.abilityLookup, minimumValue);
}
const fixedValue = deriveFixedModifierValue(modifier);
if (fixedValue !== null) {
baseValue += fixedValue;
}
let bonusValue = 0;
const modifierBonusTypes = getBonusTypes(modifier);
if (includeBonusTypes && modifierBonusTypes) {
if (modifierBonusTypes.includes(ModifierBonusTypeEnum.PROFICIENCY_BONUS)) {
bonusValue += modifierData.proficiencyBonus;
}
if (modifierBonusTypes.includes(ModifierBonusTypeEnum.ATTUNED_ITEM_COUNT)) {
bonusValue += modifierData.attunedItemCount;
}
if (modifierBonusTypes.includes(ModifierBonusTypeEnum.SPELL_LEVEL)) {
bonusValue += HelperUtils.lookupDataOrFallback(additionalBonusValueLookup, ModifierBonusTypeEnum.SPELL_LEVEL, 0);
}
}
return baseValue + bonusValue;
}
/**
*
* @param modifiers
* @param modifierData
* @param minimumValue
* @param initialValue
*/
export function deriveTotalValue(modifiers, modifierData, minimumValue = 0, initialValue = 0) {
return modifiers.reduce((acc, modifier) => (acc += deriveValue(modifier, modifierData, minimumValue)), initialValue);
}
/**
*
* @param modifiers
* @param modifierData
* @param minimumValue
* @param includeBonusTypes
* @param additionalBonusValueLookup
*/
export function deriveHighestValue(modifiers, modifierData, minimumValue = 0, includeBonusTypes = true, additionalBonusValueLookup = {}) {
if (!modifiers.length) {
return 0;
}
return Math.max(...modifiers.map((modifier) => deriveValue(modifier, modifierData, minimumValue, includeBonusTypes, additionalBonusValueLookup)));
}
/**
*
* @param modifiers
* @param modifierData
* @param fallback
*/
export function deriveHighestValueModifier(modifiers, modifierData, fallback = null) {
if (!modifiers.length) {
return fallback;
}
return HelperUtils.getLast(modifiers, (modifier) => deriveValue(modifier, modifierData));
}
/**
* @deprecated deriveHighestValue
* @param modifiers
* @param abilityLookup
*/
export function deriveHighestModifierValue(modifiers, abilityLookup = null) {
if (!modifiers.length) {
return 0;
}
return Math.max(...modifiers.map((modifier) => getModifierValue(modifier, abilityLookup)));
}
/**
*
* @param modifier
* @param type
*/
export function deriveDiceAdjustment(modifier, type) {
var _a;
return {
type,
rollType: deriveRollType(modifier),
statId: deriveStatId(modifier),
dataOrigin: getDataOrigin(modifier),
restriction: getRestriction(modifier),
uniqueKey: (_a = getId(modifier)) !== null && _a !== void 0 ? _a : HelperUtils.generateGuid(),
amount: getValueTotal(modifier),
};
}
/**
*
* @param modifier
*/
export function deriveRollType(modifier) {
const subType = getSubType(modifier);
if (subType === null) {
return DiceAdjustmentRollTypeEnum.NONE;
}
switch (subType) {
case ModifierSubTypeEnum.SAVING_THROWS:
return DiceAdjustmentRollTypeEnum.SAVE;
case ModifierSubTypeEnum.DEATH_SAVING_THROWS:
return DiceAdjustmentRollTypeEnum.DEATH_SAVE;
case ModifierSubTypeEnum.ABILITY_CHECKS:
return DiceAdjustmentRollTypeEnum.ABILITY_CHECK;
default:
//not implemented
}
if (STAT_SAVING_THROW_LIST.includes(subType)) {
return DiceAdjustmentRollTypeEnum.STAT_SAVE;
}
else if (STAT_ABILITY_CHECK_LIST.includes(subType)) {
return DiceAdjustmentRollTypeEnum.ABILITY_CHECK;
}
return DiceAdjustmentRollTypeEnum.NONE;
}
/**
*
* @param modifier
*/
export function deriveStatId(modifier) {
let statId = null;
switch (getSubType(modifier)) {
case ModifierSubTypeEnum.STRENGTH_SAVING_THROWS:
statId = AbilityStatEnum.STRENGTH;
break;
case ModifierSubTypeEnum.DEXTERITY_SAVING_THROWS:
statId = AbilityStatEnum.DEXTERITY;
break;
case ModifierSubTypeEnum.CONSTITUTION_SAVING_THROWS:
statId = AbilityStatEnum.CONSTITUTION;
break;
case ModifierSubTypeEnum.INTELLIGENCE_SAVING_THROWS:
statId = AbilityStatEnum.INTELLIGENCE;
break;
case ModifierSubTypeEnum.WISDOM_SAVING_THROWS:
statId = AbilityStatEnum.WISDOM;
break;
case ModifierSubTypeEnum.CHARISMA_SAVING_THROWS:
statId = AbilityStatEnum.CHARISMA;
break;
default:
// not implemented
}
return statId;
}
/**
*
* @param modifier
*/
export function deriveSavingThrowModifierAbilityName(modifier) {
let abilityName = '';
switch (getSubType(modifier)) {
case ModifierSubTypeEnum.STRENGTH_SAVING_THROWS:
abilityName = 'STR';
break;
case ModifierSubTypeEnum.DEXTERITY_SAVING_THROWS:
abilityName = 'DEX';
break;
case ModifierSubTypeEnum.CONSTITUTION_SAVING_THROWS:
abilityName = 'CON';
break;
case ModifierSubTypeEnum.INTELLIGENCE_SAVING_THROWS:
abilityName = 'INT';
break;
case ModifierSubTypeEnum.WISDOM_SAVING_THROWS:
abilityName = 'WIS';
break;
case ModifierSubTypeEnum.CHARISMA_SAVING_THROWS:
abilityName = 'CHA';
break;
default:
// not implemented
}
return abilityName;
}
@@ -0,0 +1,259 @@
import { groupBy, orderBy, uniqBy } from 'lodash';
import { AbilityDerivers } from '../Ability';
import * as CampaignAccessors from '../Campaign/accessors';
import { AbilityStatEnum } from '../Core';
import { DataOriginGenerators } from '../DataOrigin';
import { HelperUtils } from '../Helper';
import { ItemValidators } from '../Item';
import { RuleDataAccessors } from '../RuleData';
import { getComponentId, getComponentTypeId, getId, getRestriction, getSubType } from './accessors';
import { ModifierSubTypeEnum } from './constants';
import { deriveValue } from './derivers';
import { hack__updateDisadvantageModifiers } from './hacks';
import { isExpertiseModifier, isImmunityModifier, isKenseiWeaponModifier, isLanguageModifier, isProficiencyModifier, isResistanceModifier, isValidAdvantageSaveModifier, isValidBonusSaveModifier, isValidBonusStatScoreModifier, isValidDisadvantageSaveModifier, isVulnerabilityModifier, } from './validators';
/**
*
* @param modifier
*/
export function generateDataOriginKey(modifier) {
return DataOriginGenerators.generateDataOriginKey(getComponentId(modifier), getComponentTypeId(modifier));
}
/**
*
* @param modifiers
*/
export function generateModifierComponentLookup(modifiers) {
return groupBy(modifiers, (modifier) => generateDataOriginKey(modifier));
}
/**
*
* @param modifiers
* @param partyInfo
*/
export function generateItemModifierLookup(modifiers, partyInfo) {
const partyItemModifiers = partyInfo ? CampaignAccessors.getItemModifiers(partyInfo) : [];
return generateModifierComponentLookup(uniqBy([...partyItemModifiers, ...modifiers], (modifier) => getId(modifier)));
}
/**
*
* @param proficiencyBonus
* @param attunedItems
*/
export function generateModifierDataPreAbilities(proficiencyBonus, attunedItems) {
return {
abilityLookup: null,
proficiencyBonus,
attunedItemCount: attunedItems.length,
};
}
/**
*
* @param abilityLookup
* @param modifierDataPreAbilities
* @param attunedItems
*/
export function generateModifierData(abilityLookup, modifierDataPreAbilities, attunedItems) {
return Object.assign(Object.assign({}, modifierDataPreAbilities), { abilityLookup, attunedItemCount: attunedItems.length });
}
/**
*
* @param abilityLookup
*/
export function generateDexModifier(abilityLookup) {
return AbilityDerivers.deriveStatModifier(AbilityStatEnum.DEXTERITY, abilityLookup);
}
/**
*
* @param abilityLookup
*/
export function generateConModifier(abilityLookup) {
return AbilityDerivers.deriveStatModifier(AbilityStatEnum.CONSTITUTION, abilityLookup);
}
/**
*
* @param abilityLookup
*/
export function generateStrScore(abilityLookup) {
return AbilityDerivers.deriveStatScore(AbilityStatEnum.STRENGTH, abilityLookup);
}
/**
*
* @param modifiers
*/
export function generateUniqueProficiencyModifiers(modifiers) {
return uniqBy(modifiers, (modifier) => getSubType(modifier));
}
/**
*
* @param modifiers
* @param modifierData
* @param ruleData
*/
export function generateBonusSavingThrowModifiers(modifiers, modifierData, ruleData) {
let saveModifiers = modifiers.filter((modifier) => isValidBonusSaveModifier(modifier));
RuleDataAccessors.getStats(ruleData).forEach((statData) => {
saveModifiers = [
...saveModifiers,
...modifiers.filter((modifier) => isValidBonusSaveModifier(modifier, statData.id)),
];
});
const orderedSaveModifiers = orderBy(uniqBy(saveModifiers, 'id'), [(modifier) => getSubType(modifier) === ModifierSubTypeEnum.SAVING_THROWS, 'friendlySubtypeName'], ['desc']);
return orderedSaveModifiers.map((saveModifier) => {
const valueTotal = deriveValue(saveModifier, modifierData, 1);
return Object.assign(Object.assign({}, saveModifier), { valueTotal });
});
}
/**
*
* @param modifiers
* @param ruleData
*/
export function generateAdvantageSavingThrowModifiers(modifiers, ruleData) {
let saveModifiers = modifiers.filter((modifier) => isValidAdvantageSaveModifier(modifier));
RuleDataAccessors.getStats(ruleData).forEach((statData) => {
saveModifiers = [
...saveModifiers,
...modifiers.filter((modifier) => isValidAdvantageSaveModifier(modifier, statData.id)),
];
});
return uniqBy(saveModifiers, 'id');
}
/**
*
* @param modifiers
* @param equippedItems
* @param ruleData
*/
export function generateDisadvantageSavingThrowModifiers(modifiers, equippedItems, ruleData) {
let saveModifiers = modifiers.filter(isValidDisadvantageSaveModifier);
RuleDataAccessors.getStats(ruleData).forEach((statData) => {
saveModifiers = [
...saveModifiers,
...modifiers.filter((modifier) => isValidDisadvantageSaveModifier(modifier, statData.id)),
];
});
saveModifiers = hack__updateDisadvantageModifiers(saveModifiers, equippedItems.filter(ItemValidators.isNonProficientEquippedArmorItem));
return uniqBy(saveModifiers, 'id');
}
/**
*
* @param modifiers
* @param abilityId
*/
export function generateBonusStatScoreModifiers(modifiers, abilityId) {
return modifiers.filter((modifier) => isValidBonusStatScoreModifier(modifier, abilityId));
}
/**
*
* @param modifiers
*/
export function generateProficiencyModifiers(modifiers) {
return modifiers.filter(isProficiencyModifier);
}
/**
*
* @param modifiers
*/
export function generateExpertiseModifiers(modifiers) {
return modifiers.filter(isExpertiseModifier);
}
/**
*
* @param modifiers
*/
export function generateLanguageModifiers(modifiers) {
return modifiers.filter(isLanguageModifier);
}
/**
*
* @param modifiers
*/
export function generateKenseiModifiers(modifiers) {
return modifiers.filter(isKenseiWeaponModifier);
}
/**
*
* @param modifiers
*/
export function generateResistanceModifiers(modifiers) {
return modifiers.filter(isResistanceModifier);
}
/**
*
* @param modifiers
*/
export function generateImmunityModifiers(modifiers) {
return modifiers.filter(isImmunityModifier);
}
/**
*
* @param modifiers
*/
export function generateVulnerabilityModifiers(modifiers) {
return modifiers.filter(isVulnerabilityModifier);
}
/**
*
* @param modifiers
*/
export function generateRestrictedBonusSavingThrowModifiers(modifiers) {
return modifiers.filter(getRestriction);
}
/**
*
* @param id
* @param entityTypeId
* @param modifierLookup
* @param dataOriginType
* @param primary
* @param parent
* @param extraModifiers
*/
export function generateModifiers(id, entityTypeId, modifierLookup, dataOriginType, primary, parent = null, extraModifiers = []) {
const modifierContractFallback = [];
const sourceModifierContracts = HelperUtils.lookupDataOrFallback(modifierLookup, DataOriginGenerators.generateDataOriginKey(id, entityTypeId), modifierContractFallback);
const modifierContracts = [...extraModifiers, ...sourceModifierContracts];
let modifiers = [];
if (modifierContracts.length > 0) {
modifiers = modifierContracts.map((modifier) => generateModifier(modifier, dataOriginType, primary, parent));
}
return modifiers;
}
/**
*
* @param modifierContract
* @param dataOriginType
* @param primary
* @param parent
*/
export function generateModifier(modifierContract, dataOriginType, primary, parent = null) {
return Object.assign(Object.assign({}, modifierContract), { dataOrigin: DataOriginGenerators.generateDataOrigin(dataOriginType, primary, parent) });
}
/**
*
* @param equipmentModifiers
* @param featModifiers
* @param backgroundModifiers
*/
export function generateMiscModifiers(equipmentModifiers, featModifiers, backgroundModifiers) {
return [...equipmentModifiers, ...featModifiers, ...backgroundModifiers];
}
/**
*
* @param raceModifiers
* @param classModifiers
* @param featModifiers
* @param backgroundModifiers
* @param equipmentModifiers
* @param conditionModifiers
*/
export function generateValidGlobalModifiers(raceModifiers, classModifiers, featModifiers, backgroundModifiers, equipmentModifiers, conditionModifiers) {
return [
...raceModifiers,
...classModifiers,
...featModifiers,
...backgroundModifiers,
...equipmentModifiers,
...conditionModifiers,
];
}
@@ -0,0 +1,30 @@
import { DataOriginTypeEnum } from '../DataOrigin';
import { getSubType, getType } from './accessors';
import { ModifierSubTypeEnum, ModifierTypeEnum } from './constants';
import { generateModifier } from './generators';
import { simulateModifierContract } from './simulators';
// TODO remove for "Integrated Protection" hack fix
export function hack__isProficiencyLightArmor(modifier) {
return (getType(modifier) === ModifierTypeEnum.PROFICIENCY && getSubType(modifier) === ModifierSubTypeEnum.LIGHT_ARMOR);
}
export function hack__updateDisadvantageModifiers(disadvantageSaveModifiers, nonProficientArmorItems) {
nonProficientArmorItems.forEach((item) => {
disadvantageSaveModifiers.push(generateModifier(simulateModifierContract({
id: 'SIMULATED_DISADV_STR_SAVES_ARMOR_PROF',
friendlyTypeName: 'Disadvantage',
friendlySubtypeName: 'Strength Saving Throws',
type: ModifierTypeEnum.DISADVANTAGE,
subType: ModifierSubTypeEnum.STRENGTH_SAVING_THROWS,
restriction: 'when not proficient with armor worn',
}), DataOriginTypeEnum.ITEM, item));
disadvantageSaveModifiers.push(generateModifier(simulateModifierContract({
id: 'SIMULATED_DISADV_DEX_SAVES_ARMOR_PROF',
friendlyTypeName: 'Disadvantage',
friendlySubtypeName: 'Dexterity Saving Throws',
type: ModifierTypeEnum.DISADVANTAGE,
subType: ModifierSubTypeEnum.DEXTERITY_SAVING_THROWS,
restriction: 'when not proficient with armor worn',
}), DataOriginTypeEnum.ITEM, item));
});
return disadvantageSaveModifiers;
}
@@ -0,0 +1,13 @@
import * as ModifierAccessors from './accessors';
import * as ModifierConstants from './constants';
import * as ModifierDerivers from './derivers';
import * as ModifierGenerators from './generators';
import * as ModifierHacks from './hacks';
import * as ModifierSimulators from './simulators';
import * as ModifierTypings from './typings';
import * as ModifierUtils from './utils';
import * as ModifierValidators from './validators';
export * from './constants';
export * from './typings';
export { ModifierAccessors, ModifierDerivers, ModifierGenerators, ModifierHacks, ModifierSimulators, ModifierUtils, ModifierValidators, };
export default Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ModifierAccessors), ModifierConstants), ModifierDerivers), ModifierGenerators), ModifierHacks), ModifierSimulators), ModifierTypings), ModifierUtils), ModifierValidators);
@@ -0,0 +1,7 @@
/**
*
* @param modifierDefinitionProps
*/
export function simulateModifierContract(modifierDefinitionProps) {
return Object.assign({ availableToMulticlass: null, bonusTypes: null, componentId: -1, componentTypeId: -1, dice: null, duration: null, entityId: null, entityTypeId: null, fixedValue: null, friendlySubtypeName: null, friendlyTypeName: null, id: null, isGranted: true, modifierSubTypeId: -1, modifierTypeId: -1, requiresAttunement: false, restriction: null, statId: null, subType: null, type: null, value: null }, modifierDefinitionProps);
}
@@ -0,0 +1,26 @@
import { getBonusTypes } from './accessors';
/**
*
* @param modifiers
* @param modifierBonusType
*/
export function countModifierBonusTypes(modifiers, modifierBonusType) {
let count = 0;
for (let i = 0; i < modifiers.length; i++) {
const modifier = modifiers[i];
const modifierBonusTypes = getBonusTypes(modifier);
if (modifierBonusTypes && modifierBonusTypes.includes(modifierBonusType)) {
count += 1;
}
}
return count;
}
/**
*
* @param modifiers
* @param filter
* @param filterArgs
*/
export function filterModifiers(modifiers, filter, filterArgs = []) {
return modifiers.filter((modifier) => filter(modifier, ...filterArgs));
}
File diff suppressed because it is too large Load Diff