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,174 @@
|
||||
import { orderBy } from 'lodash';
|
||||
import { HelperUtils } from '../Helper';
|
||||
import { InfusionAccessors } from '../Infusion';
|
||||
import { RuleDataUtils } from '../RuleData';
|
||||
import { getEnvironmentTags, getFlags, getGroupInfo, getInfusion, getMovements, getSavingThrows, getStats, getSubTypeTags, getSwarmInfo, getTags, getTypeId, getTypeTag, isSwarm, } from './accessors';
|
||||
import { CreatureGroupFlagEnum } from './constants';
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
* @param ruleData
|
||||
* @param includeMultiParenthesis
|
||||
*/
|
||||
export function getTypeName(creature, ruleData, includeMultiParenthesis = true) {
|
||||
const groupInfo = getGroupInfo(creature);
|
||||
const typeId = getTypeId(creature);
|
||||
let prefix = '';
|
||||
let typeName = RuleDataUtils.getMonsterTypeName(typeId, ruleData);
|
||||
if (!typeName) {
|
||||
typeName = '';
|
||||
}
|
||||
if (isSwarm(creature)) {
|
||||
const swarmInfo = getSwarmInfo(creature);
|
||||
if (swarmInfo) {
|
||||
const sizeInfo = RuleDataUtils.getCreatureSizeInfo(swarmInfo.sizeId, ruleData);
|
||||
typeName = RuleDataUtils.getMonsterTypeName(swarmInfo.typeId, ruleData, undefined, true);
|
||||
if (!typeName) {
|
||||
typeName = '';
|
||||
}
|
||||
if (sizeInfo) {
|
||||
prefix = `swarm of ${sizeInfo.name} `;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (groupInfo && groupInfo.monsterTypes !== null && groupInfo.monsterTypes.length) {
|
||||
if (groupInfo.monsterTypes.includes(typeId)) {
|
||||
typeName = RuleDataUtils.getMonsterTypeName(typeId, ruleData, undefined, isSwarm(creature));
|
||||
if (!typeName) {
|
||||
typeName = '';
|
||||
}
|
||||
}
|
||||
else {
|
||||
let displayName = '';
|
||||
groupInfo.monsterTypes.forEach((monsterTypeId, idx) => {
|
||||
const parts = [];
|
||||
if (idx !== 0) {
|
||||
parts.push(', ');
|
||||
}
|
||||
if (groupInfo && groupInfo.monsterTypes !== null && idx === groupInfo.monsterTypes.length - 1) {
|
||||
parts.push('or ');
|
||||
}
|
||||
const monsterTypeName = RuleDataUtils.getMonsterTypeName(monsterTypeId, ruleData, undefined, isSwarm(creature));
|
||||
if (monsterTypeName) {
|
||||
parts.push(monsterTypeName);
|
||||
}
|
||||
displayName += parts.join('');
|
||||
});
|
||||
if (includeMultiParenthesis) {
|
||||
typeName = `(${displayName})`;
|
||||
}
|
||||
else {
|
||||
typeName = displayName;
|
||||
}
|
||||
}
|
||||
}
|
||||
return `${prefix}${typeName}`.trim();
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
*/
|
||||
export function getHighestMovementInfo(creature) {
|
||||
return HelperUtils.getLast(getMovements(creature), 'speed');
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
*/
|
||||
export function getSearchTags(creature) {
|
||||
const tags = [...getEnvironmentTags(creature), ...getTags(creature), ...getSubTypeTags(creature)];
|
||||
const typeTag = getTypeTag(creature);
|
||||
if (typeTag) {
|
||||
tags.push(typeTag);
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
* @param flag
|
||||
*/
|
||||
export function hasGroupFlag(creature, flag) {
|
||||
return getFlags(creature).includes(flag);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
* @param stat
|
||||
*/
|
||||
export function shouldReplaceWithOwnerStat(creature, stat) {
|
||||
var _a, _b;
|
||||
const groupInfo = getGroupInfo(creature);
|
||||
return (_b = (_a = groupInfo === null || groupInfo === void 0 ? void 0 : groupInfo.ownerStats) === null || _a === void 0 ? void 0 : _a.includes(stat)) !== null && _b !== void 0 ? _b : false;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
* @param inventoryLookup
|
||||
*/
|
||||
export function getInfusionItem(creature, inventoryLookup) {
|
||||
const infusion = getInfusion(creature);
|
||||
if (infusion) {
|
||||
return HelperUtils.lookupDataOrFallback(inventoryLookup, InfusionAccessors.getInventoryMappingId(infusion));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
* @param statId
|
||||
*/
|
||||
export function getStatInfo(creature, statId) {
|
||||
return HelperUtils.lookupDataOrFallback(creature.statLookup, statId);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
* @param skillId
|
||||
*/
|
||||
export function getSkill(creature, skillId) {
|
||||
return HelperUtils.lookupDataOrFallback(creature.skillLookup, skillId);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param flagKey
|
||||
* @param creature
|
||||
*/
|
||||
export function hasFlag(flagKey, creature) {
|
||||
const groupInfo = getGroupInfo(creature);
|
||||
if (groupInfo !== null) {
|
||||
return Boolean(HelperUtils.lookupDataOrFallback(groupInfo.flagInfoLookup, flagKey));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
*/
|
||||
export function canUseLairActions(creature) {
|
||||
return !hasFlag(CreatureGroupFlagEnum.CANNOT_USE_LAIR_ACTIONS, creature);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param creature
|
||||
*/
|
||||
export function canUseLegendaryActions(creature) {
|
||||
return !hasFlag(CreatureGroupFlagEnum.CANNOT_USE_LEGENDARY_ACTIONS, creature);
|
||||
}
|
||||
export function getAbilities(creature) {
|
||||
const stats = getStats(creature);
|
||||
const savingThrows = getSavingThrows(creature);
|
||||
const abilities = stats.map((stat) => {
|
||||
var _a, _b;
|
||||
const { id, modifier, score, statKey } = stat;
|
||||
const saveModifier = (_b = (_a = savingThrows.find((save) => save.statId === id)) === null || _a === void 0 ? void 0 : _a.modifier) !== null && _b !== void 0 ? _b : modifier;
|
||||
return {
|
||||
id,
|
||||
modifier: modifier !== null && modifier !== void 0 ? modifier : 0,
|
||||
score: score !== null && score !== void 0 ? score : 0,
|
||||
statKey: statKey !== null && statKey !== void 0 ? statKey : '',
|
||||
saveModifier: saveModifier !== null && saveModifier !== void 0 ? saveModifier : 0,
|
||||
};
|
||||
});
|
||||
return orderBy(abilities, 'id');
|
||||
}
|
||||
Reference in New Issue
Block a user