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,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);
|
||||
}
|
||||
Reference in New Issue
Block a user