2025-05-28 15:36:51 -07:00

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));
}