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:
@@ -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
Reference in New Issue
Block a user