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,72 @@
export function getId(extra) {
return extra.id;
}
export function getMappingId(extra) {
return extra.mappingId;
}
export function getMappingEntityTypeId(extra) {
return extra.entityTypeId;
}
export function getUniqueKey(extra) {
return `${getMappingId(extra)}-${getMappingEntityTypeId(extra)}`;
}
export function getName(extra) {
return extra.name;
}
export function getSizeId(extra) {
return extra.sizeId;
}
export function getSizeInfo(extra) {
return extra.sizeInfo;
}
export function getType(extra) {
return extra.type;
}
export function getSearchTags(extra) {
return extra.searchTags;
}
export function getEnvironments(extra) {
return extra.environments;
}
export function getTags(extra) {
return extra.tags;
}
export function getMovementNames(extra) {
return extra.movementNames;
}
export function getMovementInfo(extra) {
return extra.movementInfo;
}
export function getAvatarUrl(extra) {
return extra.avatarUrl;
}
export function getArmorClassInfo(extra) {
return extra.armorClassInfo;
}
export function getHitPointInfo(extra) {
return extra.hitPointInfo;
}
export function getNoteComponents(extra) {
return extra.noteComponents;
}
export function getExtraType(extra) {
return extra.extraType;
}
export function getFilterTypes(extra) {
return extra.filterTypes;
}
export function getGroupId(extra) {
return extra.groupId;
}
export function isCustomized(extra) {
return extra.isCustomized;
}
export function getSources(extra) {
return extra.sources;
}
export function getMetaText(extra) {
return extra.metaText;
}
export function isHomebrew(extra) {
return extra.isHomebrew;
}
@@ -0,0 +1,11 @@
export var ExtraTypeEnum;
(function (ExtraTypeEnum) {
ExtraTypeEnum["VEHICLE"] = "Vehicle";
ExtraTypeEnum["CREATURE"] = "Creature";
})(ExtraTypeEnum || (ExtraTypeEnum = {}));
//This is "hacking" vehicles into the creature group system giving the vehicle group an id value of -1
export const HACK_VEHICLE_GROUP_ID = -1;
export var ExtraGroupTypeEnum;
(function (ExtraGroupTypeEnum) {
ExtraGroupTypeEnum["VEHICLE"] = "vehicle";
})(ExtraGroupTypeEnum || (ExtraGroupTypeEnum = {}));
@@ -0,0 +1,154 @@
import sortBy from 'lodash/sortBy';
import { CreatureAccessors, CreatureUtils } from '../Creature';
import { RuleDataUtils } from '../RuleData';
import { VehicleAccessors, VehicleConfigurationKeyEnum, VehicleUtils } from '../Vehicle';
import { VehicleComponentAccessors } from '../VehicleComponent';
/**
*
* @param creature
*/
export function deriveCreatureArmorClassInfo(creature) {
return {
value: CreatureAccessors.getArmorClass(creature),
showTooltip: false,
};
}
/**
*
* @param creature
*/
export function deriveCreatureHitPointInfo(creature) {
return {
data: CreatureAccessors.getHitPointInfo(creature),
showTooltip: false,
};
}
/**
*
* @param creature
* @param ruleData
*/
export function deriveCreatureMovementInfo(creature, ruleData) {
let highestMovementInfo = CreatureUtils.getHighestMovementInfo(creature);
let data = null;
let label = null;
if (highestMovementInfo) {
data = highestMovementInfo;
label = RuleDataUtils.getMovementDescription(highestMovementInfo.movementId, ruleData);
}
return {
data,
label,
showTooltip: false,
};
}
/**
*
* @param vehicle
*/
export function deriveVehiclePrimaryArmorClassInfo(vehicle) {
const allComponents = VehicleAccessors.getAllComponentsData(vehicle);
const primaryComponent = VehicleAccessors.getPrimaryComponent(vehicle);
let value = null;
let showTooltip = true;
if (primaryComponent) {
showTooltip = allComponents.length !== 1;
const armorClassInfo = VehicleComponentAccessors.getArmorClassInfo(primaryComponent);
value = armorClassInfo.base;
if (armorClassInfo.moving !== null) {
value = armorClassInfo.moving;
showTooltip = armorClassInfo.moving !== armorClassInfo.base;
}
}
return {
value,
showTooltip,
};
}
/**
*
* @param vehicle
*/
export function deriveVehiclePrimaryHitPointInfo(vehicle) {
const allComponents = VehicleAccessors.getAllComponentsData(vehicle);
let showTooltip = false;
if (VehicleUtils.getConfigurationValue(VehicleConfigurationKeyEnum.ENABLE_COMPONENT_HIT_POINTS, vehicle)) {
let count = 0;
allComponents.forEach((component) => {
if (count > 1) {
return;
}
const hitPointInfo = VehicleComponentAccessors.getHitPointInfo(component);
if (hitPointInfo !== null) {
count += 1;
}
});
showTooltip = count > 1;
}
const primaryComponent = VehicleAccessors.getPrimaryComponent(vehicle);
return {
data: VehicleComponentAccessors.getHitPointInfo(primaryComponent),
showTooltip,
};
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveVehicleMovementInfo(vehicle, ruleData) {
let allSpeeds = [];
VehicleAccessors.getAllComponentsData(vehicle).forEach((component) => {
const speedInfos = VehicleComponentAccessors.getSpeedInfos(component);
if (speedInfos.length > 0) {
allSpeeds.push(...speedInfos);
}
});
let allModes = [];
allSpeeds.forEach((speedInfo) => {
if (speedInfo.modes !== null) {
speedInfo.modes.forEach((mode) => {
allModes.push(Object.assign(Object.assign({}, mode), { type: speedInfo.type }));
});
}
});
let highestMovementInfo = sortBy(allModes, [
(mode) => !mode.restrictionsText,
(mode) => !mode.description,
(mode) => mode.value,
]).pop();
let showTooltip = true;
let data = null;
let label = null;
if (highestMovementInfo) {
if (allModes.length === 1 && !highestMovementInfo.restrictionsText && !highestMovementInfo.description) {
showTooltip = false;
}
data = {
movementId: highestMovementInfo.type,
speed: highestMovementInfo.value,
notes: '',
};
label = highestMovementInfo.type
? RuleDataUtils.getVehicleMovementName(highestMovementInfo.type, ruleData)
: null;
}
return {
data,
label,
showTooltip,
};
}
/**
*
* @param creature
* @param ruleData
*/
export function deriveCreatureFilterTypes(creature, ruleData) {
let filterTypes = [];
const name = RuleDataUtils.getMonsterTypeName(CreatureAccessors.getTypeId(creature), ruleData);
if (name) {
filterTypes.push(name);
}
return filterTypes;
}
@@ -0,0 +1,160 @@
import { groupBy, orderBy } from 'lodash';
import { CreatureAccessors, CreatureNotes, CreatureUtils } from '../Creature';
import { RuleDataUtils } from '../RuleData';
import { VehicleAccessors, VehicleNotes } from '../Vehicle';
import { getGroupId } from './accessors';
import { ExtraGroupTypeEnum, ExtraTypeEnum } from './constants';
import { deriveCreatureArmorClassInfo, deriveCreatureFilterTypes, deriveCreatureHitPointInfo, deriveCreatureMovementInfo, deriveVehicleMovementInfo, deriveVehiclePrimaryArmorClassInfo, deriveVehiclePrimaryHitPointInfo, } from './derivers';
/**
*
* @param creatures
* @param vehicles
* @param ruleData
*/
export function generateExtras(creatures, vehicles, ruleData) {
let creatureExtras = creatures.map((creature) => generateCreatureExtra(creature, ruleData));
let vehicleExtras = vehicles.map((vehicle) => generateVehicleExtra(vehicle, ruleData));
return [...creatureExtras, ...vehicleExtras];
}
/**
*
* @param creature
* @param ruleData
*/
export function generateCreatureExtra(creature, ruleData) {
return {
extraType: ExtraTypeEnum.CREATURE,
key: CreatureAccessors.getUniqueKey(creature),
entityTypeId: CreatureAccessors.getEntityTypeId(creature),
avatarUrl: CreatureAccessors.getAvatarUrl(creature),
name: CreatureAccessors.getName(creature),
armorClassInfo: deriveCreatureArmorClassInfo(creature),
movementNames: CreatureAccessors.getMovementNames(creature),
movementInfo: deriveCreatureMovementInfo(creature, ruleData),
isActive: CreatureAccessors.isActive(creature),
isCustomized: CreatureAccessors.isCustomized(creature),
isHomebrew: CreatureAccessors.isHomebrew(creature),
sizeId: CreatureAccessors.getSizeId(creature),
sizeInfo: RuleDataUtils.getCreatureSizeInfo(CreatureAccessors.getSizeId(creature), ruleData),
type: CreatureUtils.getTypeName(creature, ruleData),
hitPointInfo: deriveCreatureHitPointInfo(creature),
noteComponents: CreatureNotes.getNoteComponents(creature, ruleData),
searchTags: CreatureUtils.getSearchTags(creature),
tags: CreatureAccessors.getTags(creature),
mappingId: CreatureAccessors.getMappingId(creature),
id: CreatureAccessors.getId(creature),
groupId: CreatureAccessors.getGroupId(creature),
environments: CreatureAccessors.getEnvironments(creature),
filterTypes: deriveCreatureFilterTypes(creature, ruleData),
sources: CreatureAccessors.getSources(creature),
metaText: generateCreatureMeta(creature, ruleData),
};
}
/**
*
* @param vehicle
* @param ruleData
*/
export function generateVehicleExtra(vehicle, ruleData) {
return {
extraType: ExtraTypeEnum.VEHICLE,
key: VehicleAccessors.getUniqueKey(vehicle),
entityTypeId: -1,
avatarUrl: VehicleAccessors.getAvatarUrl(vehicle),
name: VehicleAccessors.getName(vehicle),
armorClassInfo: deriveVehiclePrimaryArmorClassInfo(vehicle),
movementNames: VehicleAccessors.getMovementNames(vehicle),
movementInfo: deriveVehicleMovementInfo(vehicle, ruleData),
isActive: null,
isCustomized: false,
isHomebrew: false,
sizeId: VehicleAccessors.getSizeId(vehicle),
sizeInfo: VehicleAccessors.getSizeInfo(vehicle),
type: VehicleAccessors.getTypeName(vehicle),
hitPointInfo: deriveVehiclePrimaryHitPointInfo(vehicle),
noteComponents: VehicleNotes.getNoteComponents(vehicle, ruleData),
searchTags: VehicleAccessors.getSearchTags(vehicle),
tags: [],
mappingId: VehicleAccessors.getMappingId(vehicle),
id: VehicleAccessors.getId(vehicle),
groupId: ExtraGroupTypeEnum.VEHICLE,
environments: [],
filterTypes: VehicleAccessors.getMovementNames(vehicle).map((name) => `Vehicle - ${name}`),
sources: VehicleAccessors.getSources(vehicle),
metaText: generateVehicleMeta(vehicle, ruleData),
};
}
/**
*
* @param creature
* @param ruleData
*/
export function generateCreatureMeta(creature, ruleData) {
let metaItems = [];
const sizeInfo = RuleDataUtils.getCreatureSizeInfo(CreatureAccessors.getSizeId(creature), ruleData);
let size = '';
if (sizeInfo && sizeInfo.name !== null) {
size = sizeInfo.name;
}
let type = CreatureUtils.getTypeName(creature, ruleData);
let extraTextChunks = [];
let subTypes = CreatureAccessors.getSubTypes(creature);
subTypes.forEach((monsterInfo) => {
if (monsterInfo.name !== null) {
extraTextChunks.push(monsterInfo.name);
}
});
let extraText = extraTextChunks.join(', ');
metaItems.push(`${size} ${type}${extraText ? ` (${extraText})` : ''}`.trim());
let envTags = CreatureAccessors.getEnvironmentTags(creature);
metaItems.push(envTags.join(', '));
return metaItems.filter((metaItem) => metaItem);
}
/**
*
* @param vehicle
* @param ruleData
*/
export function generateVehicleMeta(vehicle, ruleData) {
let metaText = [];
const sizeInfo = VehicleAccessors.getSizeInfo(vehicle);
let size = '';
if (sizeInfo && sizeInfo.name !== null) {
size = sizeInfo.name;
}
let type = VehicleAccessors.getType(vehicle);
let typeName = type === null ? '' : RuleDataUtils.getObjectTypeName(type, ruleData);
typeName = typeName ? typeName.toLowerCase() : '';
let primaryText = `${size} ${typeName}`.trim();
let movementTypesText = VehicleAccessors.getMovementNames(vehicle).join(', ');
metaText.push(`${primaryText}${movementTypesText ? ` (${movementTypesText})` : ''}`.trim());
return metaText;
}
export function generateGroups(extras) {
return groupBy(extras, (extra) => getGroupId(extra));
}
export function generateCurrentExtraGroupInfos(extras, ruleData) {
let groups = generateGroups(extras);
let groupIds = Object.keys(groups);
let groupInfos = [];
groupIds.forEach((groupId) => {
let groupInfo = null;
if (groupId === ExtraGroupTypeEnum.VEHICLE) {
groupInfo = {
isPrimary: false,
name: 'Vehicle',
id: groupId,
};
}
else {
const creatureGroupInfo = RuleDataUtils.getCreatureGroupInfo(parseInt(groupId), ruleData);
if (creatureGroupInfo) {
groupInfo = creatureGroupInfo;
}
}
if (groupInfo) {
groupInfos.push(groupInfo);
}
});
return orderBy(groupInfos, [(extraGroup) => extraGroup.isPrimary, (extraGroup) => extraGroup.name], ['desc']);
}
@@ -0,0 +1,10 @@
import * as ExtraAccessors from './accessors';
import * as ExtraConstants from './constants';
import * as ExtraDerivers from './derivers';
import * as ExtraGenerators from './generators';
import * as ExtraTypings from './typings';
import * as ExtraUtils from './utils';
export * from './typings';
export * from './constants';
export { ExtraAccessors, ExtraDerivers, ExtraGenerators, ExtraUtils };
export default Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ExtraAccessors), ExtraConstants), ExtraDerivers), ExtraGenerators), ExtraTypings), ExtraUtils);
@@ -0,0 +1,19 @@
import { HelperUtils } from '../Helper';
import { getExtraType, getMappingId } from './accessors';
import { ExtraTypeEnum } from './constants';
export function getTypedExtra(extra, lookup, defaultValue = null) {
const mappingId = getMappingId(extra);
return HelperUtils.lookupDataOrFallback(lookup, mappingId, defaultValue);
}
export function isCreature(extra) {
return getExtraType(extra) === ExtraTypeEnum.CREATURE;
}
export function isVehicle(extra) {
return getExtraType(extra) === ExtraTypeEnum.VEHICLE;
}
export function getCreatureExtras(extras) {
return extras.filter(isCreature);
}
export function getVehicleExtras(extras) {
return extras.filter(isVehicle);
}