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

303 lines
9.3 KiB
JavaScript

import { sortBy } from 'lodash';
import { TypeScriptUtils } from '../../utils';
import { AbilityUtils } from '../Ability';
import { AccessTypeEnum } from '../Access';
import { ProficiencyLevelEnum } from '../Core';
import { DefinitionUtils } from '../Definition';
import { DefinitionPoolUtils } from '../DefinitionPool';
import { HelperUtils } from '../Helper';
import { RuleDataAccessors, RuleDataUtils } from '../RuleData';
import { VehicleComponentAccessors } from '../VehicleComponent';
import { getAllComponentsData, getConditionImmunities, getCreatureCapacity, getDamageImmunities, getDefinitionActions, getDefinitionKey, getDefinitionStats, getDescription, getLength, getType, getWeight, getWidth, } from './accessors';
import { VehicleComponentGroupTypeEnum, VehicleConfigurationDisplayTypeEnum, VehicleConfigurationKeyEnum, VehicleConfigurationSizeTypeEnum, } from './constants';
import { generateVehicleAction } from './generators';
import { getConfigurationValue } from './utils';
/**
*
* @param vehicleDefinition
* @param ruleData
*/
export function deriveStats(vehicleDefinition, ruleData) {
if (vehicleDefinition.stats === null) {
return [];
}
return vehicleDefinition.stats.map((stat) => {
const score = stat.value;
return {
id: stat.id,
score,
statKey: stat.name,
modifier: score === null ? null : AbilityUtils.getStatScoreModifier(score, ruleData),
};
});
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveAbilities(vehicle, ruleData) {
const stats = getDefinitionStats(vehicle);
return stats.map((stat) => {
const score = stat.value;
const name = stat.name ? stat.name : '';
const statScoreModifier = score === null ? null : AbilityUtils.getStatScoreModifier(score, ruleData);
return {
label: name,
id: stat.id,
entityTypeId: -1,
name,
statKey: name,
totalScore: score,
score,
maxStatScore: RuleDataAccessors.getMaxStatScore(ruleData),
isMaxed: !!score && score >= RuleDataAccessors.getMaxStatScore(ruleData),
modifier: statScoreModifier,
baseScore: score,
racialBonus: 0,
classBonuses: 0,
miscBonus: 0,
setScore: 0,
stackingBonus: 0,
otherBonus: 0,
overrideScore: null,
proficiency: false,
proficiencyLevel: ProficiencyLevelEnum.NONE,
isSaveProficiencyModified: false,
isSaveModifierModified: false,
save: statScoreModifier ? statScoreModifier : 0,
saveBonuses: 0,
isSaveOverridden: false,
allStatBonusSuppliers: [],
statSetScoreSuppliers: [],
statMaxBonusSuppliers: [],
stackingBonusSuppliers: [],
};
});
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveCreatureCapacityDescriptions(vehicle, ruleData) {
const creatureCapacityInfos = getCreatureCapacity(vehicle);
const descriptions = creatureCapacityInfos.map((capacity) => {
var _a;
let sizeName = '';
if (capacity.sizeId !== null) {
const sizeInfo = RuleDataUtils.getCreatureSizeInfo(capacity.sizeId, ruleData);
if (sizeInfo && sizeInfo.name) {
sizeName = sizeInfo.name;
}
}
const isSpelljammer = getConfigurationValue(VehicleConfigurationKeyEnum.DISPLAY_TYPE, vehicle) ===
VehicleConfigurationDisplayTypeEnum.SPELLJAMMER;
const needsParens = isSpelljammer && capacity.type !== null;
return `${capacity.capacity} ${sizeName} ${needsParens ? '(' : ''}${(_a = capacity.type) !== null && _a !== void 0 ? _a : ''}${needsParens ? ')' : ''}`.trim();
});
return descriptions;
}
/**
*
* @param abilityLookup
*/
export function deriveModifierData(abilityLookup) {
return {
proficiencyBonus: 0,
abilityLookup,
attunedItemCount: 0,
};
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveDamageImmunities(vehicle, ruleData) {
return getDamageImmunities(vehicle)
.map((damageImmunityId) => RuleDataUtils.getDamageType(damageImmunityId, ruleData))
.filter(TypeScriptUtils.isNotNullOrUndefined);
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveConditionImmunities(vehicle, ruleData) {
return getConditionImmunities(vehicle)
.map((conditionId) => RuleDataUtils.getCondition(conditionId, ruleData))
.filter(TypeScriptUtils.isNotNullOrUndefined);
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveSizeId(vehicle, ruleData) {
const sizeType = getConfigurationValue(VehicleConfigurationKeyEnum.SIZE_TYPE, vehicle);
let ranges = [];
let value = null;
switch (sizeType) {
case VehicleConfigurationSizeTypeEnum.WEIGHT:
ranges = sortBy(RuleDataAccessors.getVehicleWeightRanges(ruleData), (range) => range.minSize);
value = getWeight(vehicle);
break;
case VehicleConfigurationSizeTypeEnum.DIMENSION:
ranges = sortBy(RuleDataAccessors.getVehicleDimensionRanges(ruleData), (range) => range.minSize);
const dimensions = [];
const width = getWidth(vehicle);
if (width !== null) {
dimensions.push(width);
}
const length = getLength(vehicle);
if (length !== null) {
dimensions.push(length);
}
value = dimensions.length > 0 ? Math.max(...dimensions) : null;
break;
default:
// not implemented
}
let sizeId = null;
if (value !== null && ranges.length > 0) {
const compareValue = value;
ranges.forEach((range) => {
if (compareValue >= range.minSize) {
sizeId = range.sizeId;
}
});
}
return sizeId;
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveSizeInfo(vehicle, ruleData) {
const sizeId = deriveSizeId(vehicle, ruleData);
if (sizeId === null) {
return null;
}
return RuleDataUtils.getCreatureSizeInfo(sizeId, ruleData);
}
/**
*
* @param vehicle
*/
export function deriveNotes(vehicle) {
const description = getDescription(vehicle);
if (!description) {
return description;
}
return null;
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveObjectTypeInfo(vehicle, ruleData) {
const type = getType(vehicle);
if (type === null) {
return null;
}
return RuleDataUtils.getObjectTypeInfo(type, ruleData);
}
/**
*
* @param vehicle
*/
export function deriveMovementKeys(vehicle) {
const movementKeys = [];
getAllComponentsData(vehicle).forEach((component) => {
VehicleComponentAccessors.getSpeedInfos(component).forEach((speed) => {
if (speed.type && !movementKeys.includes(speed.type)) {
movementKeys.push(speed.type);
}
});
});
return movementKeys;
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveMovementNames(vehicle, ruleData) {
return deriveMovementKeys(vehicle)
.map((typeKey) => RuleDataUtils.getVehicleMovementName(typeKey, ruleData))
.filter(TypeScriptUtils.isNotNullOrUndefined);
}
/**
*
* @param vehicle
*/
export function deriveDefinitionId(vehicle) {
const definitionKey = getDefinitionKey(vehicle);
if (!definitionKey) {
return null;
}
return DefinitionUtils.getDefinitionKeyId(definitionKey);
}
/**
*
* @param vehicle
* @param definitionPool
*/
export function deriveAccessType(vehicle, definitionPool) {
let accessType = AccessTypeEnum.NO_ACCESS;
const definitionKey = getDefinitionKey(vehicle);
if (definitionKey !== null) {
accessType = DefinitionPoolUtils.getDefinitionAccessType(definitionKey, definitionPool);
}
return accessType;
}
/**
*
* @param configurationLookup
* @param configurationKey
* @param defaultValue
*/
export function deriveConfigurationValueLookupValue(configurationLookup, configurationKey, defaultValue) {
const configurationInfo = HelperUtils.lookupDataOrFallback(configurationLookup, configurationKey);
if (configurationInfo !== null) {
return configurationInfo.value;
}
return defaultValue;
}
/**
*
* @param components
*/
export function deriveComponentListsByGroupType(components) {
const componentTypes = [];
const actionStationsTypes = [];
components.forEach((component) => {
const groupType = VehicleComponentAccessors.getGroupType(component);
switch (groupType) {
case VehicleComponentGroupTypeEnum.COMPONENT:
componentTypes.push(component);
break;
case VehicleComponentGroupTypeEnum.ACTION_STATION:
actionStationsTypes.push(component);
break;
default:
// not implemented
}
});
return {
components: componentTypes,
actionStations: actionStationsTypes,
};
}
/**
*
* @param vehicle
* @param ruleData
*/
export function deriveActions(vehicle, ruleData) {
return getDefinitionActions(vehicle).map((actionContract) => generateVehicleAction(vehicle, actionContract, ruleData));
}