``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
112 lines
3.6 KiB
JavaScript
112 lines
3.6 KiB
JavaScript
import { TypeScriptUtils } from '../../utils';
|
|
import { AbilityStatEnum } from '../Core';
|
|
import { HelperUtils } from '../Helper';
|
|
import { RuleDataUtils } from '../RuleData';
|
|
import { VehicleAccessors, VehicleUtils } from '../Vehicle';
|
|
import { VehicleConfigurationKeyEnum, VehicleGenerators } from '../Vehicle';
|
|
import { getArmorClass, getArmorClassDescription, getDefinitionActions, getDefinitionSpeeds, getHitPoints, getRemovedHitPoints, getTypes, } from './accessors';
|
|
import { ComponentAdjustmentEnum } from './constants';
|
|
/**
|
|
*
|
|
* @param component
|
|
* @param vehicle
|
|
*/
|
|
export function deriveArmorClassInfo(component, vehicle) {
|
|
const enableMotionlessArmorClass = VehicleUtils.getConfigurationValue(VehicleConfigurationKeyEnum.ENABLE_COMPONENT_ARMOR_CLASS_MOTIONLESS, vehicle);
|
|
const armorClass = getArmorClass(component);
|
|
let movingArmorClass = null;
|
|
if (enableMotionlessArmorClass && armorClass !== null) {
|
|
const dexScore = HelperUtils.lookupDataOrFallback(VehicleAccessors.getStatLookup(vehicle), AbilityStatEnum.DEXTERITY);
|
|
let dexModifier = 0;
|
|
if (dexScore !== null && dexScore.modifier !== null) {
|
|
dexModifier = dexScore.modifier;
|
|
}
|
|
movingArmorClass = armorClass + dexModifier;
|
|
}
|
|
return {
|
|
base: armorClass,
|
|
moving: movingArmorClass,
|
|
description: getArmorClassDescription(component),
|
|
};
|
|
}
|
|
/**
|
|
*
|
|
* @param component
|
|
* @param ruleData
|
|
*/
|
|
export function deriveTypeNames(component, ruleData) {
|
|
return getTypes(component)
|
|
.map((type) => {
|
|
if (type.type === null) {
|
|
return null;
|
|
}
|
|
return RuleDataUtils.getComponentTypeName(type.type, ruleData);
|
|
})
|
|
.filter(TypeScriptUtils.isNotNullOrUndefined);
|
|
}
|
|
/**
|
|
*
|
|
* @param component
|
|
* @param ruleData
|
|
*/
|
|
export function deriveSpeedInfos(component, ruleData) {
|
|
return getDefinitionSpeeds(component).map((speedInfo) => {
|
|
if (speedInfo.modes === null) {
|
|
return speedInfo;
|
|
}
|
|
const modes = speedInfo.modes.map((mode) => {
|
|
const movementInfo = mode.movementId === null ? null : RuleDataUtils.getMovementInfo(mode.movementId, ruleData);
|
|
return Object.assign(Object.assign({}, mode), { movementInfo });
|
|
});
|
|
return Object.assign(Object.assign({}, speedInfo), { modes });
|
|
});
|
|
}
|
|
/**
|
|
*
|
|
* @param component
|
|
*/
|
|
export function deriveHitPointInfo(component) {
|
|
const hitPoints = getHitPoints(component);
|
|
if (hitPoints === null) {
|
|
return null;
|
|
}
|
|
const removedHp = getRemovedHitPoints(component);
|
|
return {
|
|
baseHp: hitPoints,
|
|
bonusHp: null,
|
|
overrideHp: null,
|
|
remainingHp: hitPoints - removedHp,
|
|
removedHp,
|
|
tempHp: null,
|
|
totalHp: hitPoints,
|
|
};
|
|
}
|
|
/**
|
|
*
|
|
* @param component
|
|
*/
|
|
export function deriveHitPointSpeedAdjustments(component) {
|
|
const adjustments = [];
|
|
getTypes(component).forEach((type) => {
|
|
if (type.adjustments) {
|
|
type.adjustments.forEach((adjustment) => {
|
|
if (adjustment.type && adjustment.type === ComponentAdjustmentEnum.HIT_POINT_SPEED_ADJUSTMENT) {
|
|
if (adjustment.values) {
|
|
adjustments.push(...adjustment.values);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
return adjustments;
|
|
}
|
|
/**
|
|
*
|
|
* @param component
|
|
* @param ruleData
|
|
* @param vehicle
|
|
*/
|
|
export function deriveActions(component, ruleData, vehicle) {
|
|
return getDefinitionActions(component).map((actionContract) => VehicleGenerators.generateVehicleAction(vehicle, actionContract, ruleData));
|
|
}
|