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,140 @@
/**
*
* @param skill
*/
export function getDescription(skill) {
return skill.description;
}
/**
*
* @param skill
*/
export function getEntityTypeId(skill) {
return skill.entityTypeId;
}
/**
*
* @param skill
*/
export function getExpertise(skill) {
return skill.expertise;
}
/**
*
* @param skill
*/
export function getHalfProficiency(skill) {
return skill.halfProficiency;
}
/**
*
* @param skill
*/
export function getId(skill) {
return skill.id;
}
/**
*
* @param skill
*/
export function getIsOverridden(skill) {
return skill.isOverridden;
}
/**
*
* @param skill
*/
export function getModifier(skill) {
return skill.modifier;
}
/**
*
* @param skill
*/
export function getModifierBonuses(skill) {
return skill.modifierBonuses;
}
/**
*
* @param skill
*/
export function getName(skill) {
return skill.name;
}
/**
*
* @param skill
*/
export function getProficiency(skill) {
return skill.proficiency;
}
/**
*
* @param skill
*/
export function getProficiencyBonus(skill) {
return skill.proficiencyBonus;
}
/**
*
* @param skill
*/
export function getProficiencyLevel(skill) {
return skill.proficiencyLevel;
}
/**
*
* @param skill
*/
export function getStat(skill) {
return skill.stat;
}
/**
*
* @param skill
*/
export function getStatModifier(skill) {
return skill.statModifier;
}
/**
*
* @param skill
*/
export function isCustom(skill) {
return skill.isCustom;
}
/**
*
* @param skill
*/
export function getNotes(skill) {
return skill.notes;
}
/**
*
* @param skill
*/
export function getOriginalContract(skill) {
return skill.originalContract;
}
/**
*
* @param skill
*/
export function getAdvantageAdjustments(skill) {
return skill.advantageAdjustments;
}
/**
*
* @param skill
*/
export function getDisadvantageAdjustments(skill) {
return skill.disadvantageAdjustments;
}
/**
*
* @param skill
*/
export function getUsableDiceAdjustmentType(skill) {
return skill.usableDiceAdjustmentType;
}
@@ -0,0 +1,45 @@
import { AbilitySkillEnum, StealthCheckTypeEnum } from '../Core';
import { DataOriginGenerators, DataOriginTypeEnum } from '../DataOrigin';
import { DiceAdjustmentRollTypeEnum, DiceAdjustmentTypeEnum } from '../Dice';
import { ItemAccessors } from '../Item';
import { ModifierDerivers, ModifierValidators } from '../Modifier';
import { hack__updateDisadvantageAdjustments } from './hacks';
/**
*
* @param skill
* @param modifiers
*/
export function deriveAdvantageAdjustments(skill, modifiers) {
return modifiers
.filter((modifier) => ModifierValidators.isValidSkillAdvantageModifier(modifier, skill))
.map((modifier) => ModifierDerivers.deriveDiceAdjustment(modifier, DiceAdjustmentTypeEnum.ADVANTAGE));
}
/**
*
* @param skill
* @param modifiers
* @param equippedArmor
* @param nonProficientEquippedArmor
*/
export function deriveDisadvantageAdjustments(skill, modifiers, equippedArmor, nonProficientEquippedArmor) {
let skillDiceAdjustments = modifiers
.filter((modifier) => ModifierValidators.isValidSkillDisadvantageModifier(modifier, skill))
.map((modifier) => ModifierDerivers.deriveDiceAdjustment(modifier, DiceAdjustmentTypeEnum.DISADVANTAGE));
if (skill.id === AbilitySkillEnum.STEALTH) {
equippedArmor.forEach((item) => {
if (ItemAccessors.getStealthCheck(item) === StealthCheckTypeEnum.DISADVANTAGE) {
skillDiceAdjustments.push({
type: DiceAdjustmentTypeEnum.DISADVANTAGE,
rollType: DiceAdjustmentRollTypeEnum.ABILITY_CHECK,
dataOrigin: DataOriginGenerators.generateDataOrigin(DataOriginTypeEnum.ITEM, item),
restriction: 'with armor worn',
uniqueKey: [ItemAccessors.getUniqueKey(item), 'INNATE'].join('-'),
statId: null,
amount: null,
});
}
});
}
skillDiceAdjustments = hack__updateDisadvantageAdjustments(skill, skillDiceAdjustments, nonProficientEquippedArmor);
return skillDiceAdjustments;
}
@@ -0,0 +1,211 @@
import { keyBy } from 'lodash';
import { AbilityDerivers } from '../Ability';
import { CharacterDerivers } from '../Character';
import { ProficiencyLevelEnum, ProficiencyRoundingEnum } from '../Core';
import { DiceDerivers } from '../Dice';
import { ItemUtils, ItemValidators } from '../Item';
import { ModifierDerivers, ModifierValidators } from '../Modifier';
import { RuleDataAccessors } from '../RuleData';
import { AdjustmentTypeEnum, ValueHacks, ValueUtils } from '../Value';
import { getId } from './accessors';
import { deriveAdvantageAdjustments, deriveDisadvantageAdjustments } from './derivers';
/**
*
* @param proficiencies
* @param proficiencyBonus
* @param abilityLookup
* @param modifiers
* @param equippedItems
*/
export function generateCustomSkills(proficiencies, proficiencyBonus, abilityLookup, modifiers, equippedItems) {
const equippedArmor = equippedItems.filter(ItemUtils.isArmorContract);
const nonProficientEquippedArmor = equippedItems.filter(ItemValidators.isNonProficientEquippedArmorItem);
return proficiencies.map((skill) => generateCustomSkill(skill, proficiencyBonus, abilityLookup, modifiers, equippedArmor, nonProficientEquippedArmor));
}
/**
*
* @param customSkill
* @param proficiencyBonus
* @param abilityLookup
* @param modifiers
* @param equippedArmor
* @param nonProficientEquippedArmor
*/
export function generateCustomSkill(customSkill, proficiencyBonus, abilityLookup, modifiers, equippedArmor, nonProficientEquippedArmor) {
var _a, _b, _c;
let modifier = null;
let statModifier = 0;
let skillProficiencyBonus = 0;
const proficiencyLevel = customSkill.proficiencyLevel ? customSkill.proficiencyLevel : ProficiencyLevelEnum.NONE;
const name = customSkill.name ? customSkill.name : 'Unknown Custom Skill';
if (customSkill.statId) {
statModifier = AbilityDerivers.deriveStatModifier(customSkill.statId, abilityLookup);
if (statModifier !== null) {
skillProficiencyBonus = CharacterDerivers.deriveProficiencyBonusAmount(proficiencyLevel, proficiencyBonus);
}
}
let modifierBonuses = 0;
if (customSkill.override !== null) {
modifier = customSkill.override;
}
else if (statModifier !== null) {
const miscBonus = (_a = customSkill.miscBonus) !== null && _a !== void 0 ? _a : 0;
const magicBonus = (_b = customSkill.magicBonus) !== null && _b !== void 0 ? _b : 0;
modifierBonuses = miscBonus + magicBonus;
modifier = statModifier + skillProficiencyBonus + modifierBonuses;
}
const simulatedSkillContract = {
description: null,
entityTypeId: -1,
id: -1,
name: null,
stat: (_c = customSkill.statId) !== null && _c !== void 0 ? _c : -1,
};
const advantageAdjustments = deriveAdvantageAdjustments(simulatedSkillContract, modifiers);
const disadvantageAdjustments = deriveDisadvantageAdjustments(simulatedSkillContract, modifiers, equippedArmor, nonProficientEquippedArmor);
return {
description: customSkill.description,
entityTypeId: -1,
id: customSkill.id,
name,
stat: customSkill.statId,
isOverridden: customSkill.override !== null,
modifier,
modifierBonuses,
expertise: proficiencyLevel === ProficiencyLevelEnum.EXPERT,
halfProficiency: proficiencyLevel === ProficiencyLevelEnum.HALF,
proficiency: proficiencyLevel === ProficiencyLevelEnum.FULL,
proficiencyLevel,
proficiencyBonus: skillProficiencyBonus,
notes: customSkill.notes,
statModifier,
isCustom: true,
originalContract: customSkill,
advantageAdjustments,
disadvantageAdjustments,
usableDiceAdjustmentType: DiceDerivers.deriveUsableDiceAdjustmentType(advantageAdjustments, disadvantageAdjustments),
};
}
/**
*
* @param skill
* @param abilityLookup
* @param modifiers
* @param proficiencyBonus
* @param valueLookup
* @param equippedArmor
* @param nonProficientEquippedArmor
*/
export function generateSkill(skill, abilityLookup, modifiers, proficiencyBonus, valueLookup, equippedArmor, nonProficientEquippedArmor) {
let stat = skill.stat;
const statOverride = ValueUtils.getKeyValue(valueLookup, AdjustmentTypeEnum.SKILL_STAT_OVERRIDE, ValueHacks.hack__toString(skill.id), ValueHacks.hack__toString(skill.entityTypeId));
if (statOverride !== null) {
stat = statOverride;
}
const statModifier = AbilityDerivers.deriveStatModifier(stat, abilityLookup);
// This is done so that Modifier validators can check for correct stat ID
const overriddenSkill = Object.assign(Object.assign({}, skill), { stat });
let proficiencyLevel = ProficiencyLevelEnum.NONE;
let proficiencyRounding = ProficiencyRoundingEnum.DOWN;
let halfProficiency = false;
if (modifiers.filter((modifier) => ModifierValidators.isValidAbilitySkillHalfProficiencyModifier(modifier, overriddenSkill)).length) {
halfProficiency = true;
proficiencyLevel = ProficiencyLevelEnum.HALF;
}
if (modifiers.filter((modifier) => ModifierValidators.isValidAbilitySkillHalfProficiencyRoundUpModifier(modifier, overriddenSkill)).length) {
halfProficiency = true;
proficiencyRounding = ProficiencyRoundingEnum.UP;
proficiencyLevel = ProficiencyLevelEnum.HALF;
}
let proficiency = false;
if (modifiers.filter((modifier) => ModifierValidators.isValidAbilitySkillProficiencyModifier(modifier, overriddenSkill)).length) {
proficiency = true;
proficiencyLevel = ProficiencyLevelEnum.FULL;
}
let expertise = false;
if (modifiers.filter((modifier) => ModifierValidators.isValidAbilitySkillExpertiseModifier(modifier, overriddenSkill)).length) {
expertise = true;
proficiencyLevel = ProficiencyLevelEnum.EXPERT;
}
const levelOverride = ValueUtils.getKeyValue(valueLookup, AdjustmentTypeEnum.SKILL_PROFICIENCY_LEVEL, ValueHacks.hack__toString(overriddenSkill.id), ValueHacks.hack__toString(overriddenSkill.entityTypeId));
if (levelOverride !== null) {
// TODO need to fix this ugliness to be based on proficiency level (components and half round up need to be considered)
switch (levelOverride) {
case ProficiencyLevelEnum.EXPERT:
halfProficiency = false;
proficiencyRounding = ProficiencyRoundingEnum.DOWN;
proficiency = false;
expertise = true;
break;
case ProficiencyLevelEnum.FULL:
halfProficiency = false;
proficiencyRounding = ProficiencyRoundingEnum.DOWN;
proficiency = true;
expertise = false;
break;
case ProficiencyLevelEnum.HALF:
halfProficiency = true;
proficiencyRounding = ProficiencyRoundingEnum.DOWN;
proficiency = false;
expertise = false;
break;
case ProficiencyLevelEnum.NONE:
halfProficiency = false;
proficiencyRounding = ProficiencyRoundingEnum.DOWN;
proficiency = false;
expertise = false;
break;
default:
// not implemented
}
proficiencyLevel = levelOverride;
}
const overrideValue = ValueUtils.getKeyValue(valueLookup, AdjustmentTypeEnum.SKILL_OVERRIDE, ValueHacks.hack__toString(overriddenSkill.id), ValueHacks.hack__toString(overriddenSkill.entityTypeId));
let modifier = 0;
let modifierBonuses = 0;
let skillProficiencyBonus = 0;
const isOverridden = overrideValue !== null;
if (!isOverridden) {
const bonusAbilitySkillModifiers = modifiers.filter((modifier) => ModifierValidators.isValidAbilitySkillBonusModifier(modifier, overriddenSkill));
const bonusAbilitySkillModifierTotal = ModifierDerivers.sumModifiers(bonusAbilitySkillModifiers, abilityLookup);
const miscBonus = ValueUtils.getKeyValue(valueLookup, AdjustmentTypeEnum.SKILL_MISC_BONUS, ValueHacks.hack__toString(overriddenSkill.id), ValueHacks.hack__toString(overriddenSkill.entityTypeId), 0);
const magicBonus = ValueUtils.getKeyValue(valueLookup, AdjustmentTypeEnum.SKILL_MAGIC_BONUS, ValueHacks.hack__toString(overriddenSkill.id), ValueHacks.hack__toString(overriddenSkill.entityTypeId), 0);
modifierBonuses = miscBonus + magicBonus + bonusAbilitySkillModifierTotal;
skillProficiencyBonus = CharacterDerivers.deriveProficiencyBonusAmount(proficiencyLevel, proficiencyBonus, proficiencyRounding);
modifier = statModifier + skillProficiencyBonus + modifierBonuses;
}
else {
modifier = overrideValue;
}
const advantageAdjustments = deriveAdvantageAdjustments(overriddenSkill, modifiers);
const disadvantageAdjustments = deriveDisadvantageAdjustments(overriddenSkill, modifiers, equippedArmor, nonProficientEquippedArmor);
return Object.assign(Object.assign({}, overriddenSkill), { statModifier,
modifier,
modifierBonuses, proficiencyBonus: skillProficiencyBonus, proficiencyLevel,
proficiency,
halfProficiency,
expertise,
isOverridden, isCustom: false, notes: null, originalContract: null, advantageAdjustments,
disadvantageAdjustments, usableDiceAdjustmentType: DiceDerivers.deriveUsableDiceAdjustmentType(advantageAdjustments, disadvantageAdjustments) });
}
/**
*
* @param abilityLookup
* @param modifiers
* @param proficiencyBonus
* @param ruleData
* @param valueLookup
* @param equippedItems
*/
export function generateSkills(abilityLookup, modifiers, proficiencyBonus, ruleData, valueLookup, equippedItems) {
const equippedArmor = equippedItems.filter(ItemUtils.isArmorContract);
const nonProficientEquippedArmor = equippedItems.filter(ItemValidators.isNonProficientEquippedArmorItem);
return RuleDataAccessors.getAbilitySkills(ruleData).map((skill) => generateSkill(skill, abilityLookup, modifiers, proficiencyBonus, valueLookup, equippedArmor, nonProficientEquippedArmor));
}
/**
*
* @param skills
*/
export function generateSkillLookup(skills) {
return keyBy(skills, (skill) => getId(skill));
}
@@ -0,0 +1,32 @@
import { AbilityStatEnum } from '../Core';
import { DataOriginGenerators, DataOriginTypeEnum } from '../DataOrigin';
import { DiceAdjustmentRollTypeEnum, DiceAdjustmentTypeEnum } from '../Dice';
import { ItemAccessors } from '../Item';
/**
*
* @param skill
* @param skillDiceAdjustments
* @param nonProficientEquippedArmor
*/
export function hack__updateDisadvantageAdjustments(skill, skillDiceAdjustments, nonProficientEquippedArmor) {
const newDiceAdjustments = [];
switch (skill.stat) {
case AbilityStatEnum.STRENGTH:
case AbilityStatEnum.DEXTERITY:
nonProficientEquippedArmor.forEach((item) => {
newDiceAdjustments.push({
type: DiceAdjustmentTypeEnum.DISADVANTAGE,
rollType: DiceAdjustmentRollTypeEnum.ABILITY_CHECK,
dataOrigin: DataOriginGenerators.generateDataOrigin(DataOriginTypeEnum.ITEM, item),
restriction: 'when not proficient with armor worn',
uniqueKey: [ItemAccessors.getUniqueKey(item), 'NOT_PROFICIENT'].join('-'),
statId: null,
amount: null,
});
});
break;
default:
// not implemented;
}
return [...skillDiceAdjustments, ...newDiceAdjustments];
}
@@ -0,0 +1,8 @@
import * as SkillAccessors from './accessors';
import * as SkillDerivers from './derivers';
import * as SkillGenerators from './generators';
import * as SkillTypings from './typings';
import * as SkillValidators from './validators';
export * from './typings';
export { SkillAccessors, SkillDerivers, SkillGenerators, SkillValidators };
export default Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, SkillAccessors), SkillDerivers), SkillGenerators), SkillTypings), SkillValidators);
@@ -0,0 +1,23 @@
import { UsableDiceAdjustmentTypeEnum } from '../Dice';
import { getUsableDiceAdjustmentType } from './accessors';
/**
*
* @param skill
*/
export function isAdvantageUsableDiceAdjustmentType(skill) {
return getUsableDiceAdjustmentType(skill) === UsableDiceAdjustmentTypeEnum.ADVANTAGE;
}
/**
*
* @param skill
*/
export function isDisadvantageUsableDiceAdjustmentType(skill) {
return getUsableDiceAdjustmentType(skill) === UsableDiceAdjustmentTypeEnum.DISADVANTAGE;
}
/**
*
* @param skill
*/
export function isAdvantageDisadvantageUsableDiceAdjustmentType(skill) {
return getUsableDiceAdjustmentType(skill) === UsableDiceAdjustmentTypeEnum.ADVANTAGE_DISADVANTAGE;
}