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

345 lines
13 KiB
JavaScript

import { BackgroundAccessors } from '../Background';
import { ClassAccessors } from '../Class';
import { ClassFeatureAccessors } from '../ClassFeature';
import { ConditionAccessors } from '../Condition';
import { DataOriginTypeEnum, DataOriginUtils } from '../DataOrigin';
import { FeatAccessors } from '../Feat';
import { ItemAccessors } from '../Item';
import { RaceAccessors } from '../Race';
import { RacialTraitAccessors } from '../RacialTrait';
import { VehicleAccessors } from '../Vehicle';
import { validateIsRestrictedEntityDefinition } from './validators';
/**
*
* @param dataOrigin
* @param defaultValue
* @param tryParent
*/
export function getDataOriginName(dataOrigin, defaultValue = '', tryParent = false) {
var _a;
let extraDisplay = null;
switch (dataOrigin.type) {
case DataOriginTypeEnum.RACE:
if (tryParent) {
extraDisplay = RaceAccessors.getFullName(dataOrigin.parent);
}
if (extraDisplay === null) {
extraDisplay = RacialTraitAccessors.getName(dataOrigin.primary);
}
break;
case DataOriginTypeEnum.CLASS:
extraDisplay = ClassAccessors.getName(dataOrigin.primary);
break;
case DataOriginTypeEnum.CLASS_FEATURE:
if (tryParent) {
extraDisplay = ClassAccessors.getName(dataOrigin.parent);
}
if (extraDisplay === null) {
extraDisplay = ClassFeatureAccessors.getName(dataOrigin.primary);
}
break;
case DataOriginTypeEnum.FEAT:
extraDisplay = FeatAccessors.getName(dataOrigin.primary);
break;
case DataOriginTypeEnum.BACKGROUND:
extraDisplay = BackgroundAccessors.getName(dataOrigin.primary);
break;
case DataOriginTypeEnum.ITEM:
extraDisplay = ItemAccessors.getDefinitionName(dataOrigin.primary);
break;
case DataOriginTypeEnum.CUSTOM:
extraDisplay = dataOrigin.primary === null ? null : dataOrigin.primary;
break;
case DataOriginTypeEnum.FEAT_LIST:
if (tryParent && dataOrigin.parent !== null) {
if (dataOrigin.parentType === DataOriginTypeEnum.BACKGROUND) {
extraDisplay = ((_a = dataOrigin.parent.definition) === null || _a === void 0 ? void 0 : _a.name) || null;
}
else if (dataOrigin.parentType === DataOriginTypeEnum.CLASS_FEATURE) {
extraDisplay = ClassFeatureAccessors.getName(dataOrigin.primary);
}
}
if (extraDisplay === null && dataOrigin.primary !== null) {
extraDisplay = dataOrigin.primary.name;
}
break;
default:
//not implemented
}
return extraDisplay === null ? defaultValue : extraDisplay;
}
/**
* Gets the id as a string of the primary origin if possible.
* @param dataOrigin the data origin object from an entity
* @returns id of the primary origin object as a string, or null
*/
export function tryGetPrimaryId(dataOrigin) {
// The data origin system is risky business because it is all `any` typed.
// The logic about the types is based on `getDataOriginName` above.
try {
let id;
switch (dataOrigin.type) {
case DataOriginTypeEnum.RACE:
id = RacialTraitAccessors.getId(dataOrigin.primary);
break;
case DataOriginTypeEnum.CLASS:
id = ClassAccessors.getId(dataOrigin.primary);
break;
case DataOriginTypeEnum.CLASS_FEATURE:
id = ClassFeatureAccessors.getId(dataOrigin.primary);
break;
case DataOriginTypeEnum.FEAT:
id = FeatAccessors.getId(dataOrigin.primary);
break;
case DataOriginTypeEnum.BACKGROUND:
id = BackgroundAccessors.getId(dataOrigin.primary);
break;
case DataOriginTypeEnum.ITEM:
id = ItemAccessors.getId(dataOrigin.primary);
break;
case DataOriginTypeEnum.FEAT_LIST:
if (dataOrigin.primary !== null) {
id = dataOrigin.primary.id;
}
break;
}
return id ? `${id}` : null;
}
catch (e) {
console.log(e);
return null;
}
}
/**
* Gets the id as a string of parent origin if possible.
* Note that most entity types don't have a parent origin.
* @param dataOrigin the data origin object from an entity
* @returns id of the parent origin object as a string, or null
*/
export function tryGetParentId(dataOrigin) {
var _a;
// See comment above about the typings.
try {
let id;
switch (dataOrigin.type) {
case DataOriginTypeEnum.RACE:
id = RaceAccessors.getDefinitionKey(dataOrigin.parent);
break;
case DataOriginTypeEnum.CLASS_FEATURE:
id = ClassAccessors.getId(dataOrigin.parent);
break;
case DataOriginTypeEnum.FEAT_LIST:
if (dataOrigin.parentType === DataOriginTypeEnum.BACKGROUND && dataOrigin.parent !== null) {
id = (_a = dataOrigin.parent.definition) === null || _a === void 0 ? void 0 : _a.id;
}
else if (dataOrigin.parentType === DataOriginTypeEnum.CLASS_FEATURE && dataOrigin.parent !== null) {
id = ClassFeatureAccessors.getId(dataOrigin.parent);
}
break;
}
return id ? `${id}` : null;
}
catch (e) {
console.log(e);
return null;
}
}
/**
*
* @param ref
* @param refData
* @param defaultValue
* @param tryParent
*/
export function getDataOriginRefName(ref, refData, defaultValue, tryParent = false) {
var _a;
let extraDisplay = null;
switch (ref.type) {
case DataOriginTypeEnum.RACE: {
if (tryParent) {
const parent = DataOriginUtils.getRefParent(ref, refData);
if (parent !== null) {
extraDisplay = RaceAccessors.getFullName(parent);
}
}
if (extraDisplay === null) {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
extraDisplay = RacialTraitAccessors.getName(primary);
}
}
break;
}
case DataOriginTypeEnum.CLASS: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary) {
extraDisplay = ClassAccessors.getName(primary);
}
break;
}
case DataOriginTypeEnum.CLASS_FEATURE: {
if (tryParent) {
const parent = DataOriginUtils.getRefParent(ref, refData);
if (parent !== null) {
extraDisplay = ClassAccessors.getName(parent);
}
}
if (extraDisplay === null) {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
extraDisplay = ClassFeatureAccessors.getName(primary);
}
}
break;
}
case DataOriginTypeEnum.FEAT: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
extraDisplay = FeatAccessors.getName(primary);
}
break;
}
case DataOriginTypeEnum.BACKGROUND: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
extraDisplay = BackgroundAccessors.getName(primary);
}
break;
}
case DataOriginTypeEnum.ITEM: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
extraDisplay = ItemAccessors.getName(primary);
}
break;
}
case DataOriginTypeEnum.CUSTOM: {
extraDisplay = 'Custom';
break;
}
case DataOriginTypeEnum.UNKNOWN: {
extraDisplay = defaultValue !== null && defaultValue !== void 0 ? defaultValue : 'No Origin';
break;
}
default:
//not implemented
}
return (_a = extraDisplay !== null && extraDisplay !== void 0 ? extraDisplay : defaultValue) !== null && _a !== void 0 ? _a : '';
}
/**
*
* @param dataOrigin
* @param fallback
*/
export function getPrimaryDescription(dataOrigin, fallback = '') {
let description = fallback;
if (!dataOrigin) {
return description;
}
switch (dataOrigin.type) {
case DataOriginTypeEnum.RACE:
description = RacialTraitAccessors.getDescription(dataOrigin.primary);
break;
case DataOriginTypeEnum.FEAT:
const featDescription = FeatAccessors.getDescription(dataOrigin.primary);
description = featDescription === null ? '' : featDescription;
break;
case DataOriginTypeEnum.CLASS_FEATURE:
const classFeatureDescription = ClassFeatureAccessors.getDescription(dataOrigin.primary);
description = classFeatureDescription === null ? '' : classFeatureDescription;
break;
default:
if (dataOrigin.primary && dataOrigin.primary.definition && dataOrigin.primary.definition.description) {
description = dataOrigin.primary.definition.description;
}
}
return description === null ? '' : description;
}
/**
*
* @param ref
* @param refData
* @param fallback
*/
export function getDataOriginRefPrimaryDescription(ref, refData, fallback = '') {
let description = null;
switch (ref.type) {
case DataOriginTypeEnum.RACE: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = RacialTraitAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.FEAT: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = FeatAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.CLASS: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary) {
description = ClassAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.CLASS_FEATURE: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = ClassFeatureAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.BACKGROUND: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = BackgroundAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.ITEM: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = ItemAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.VEHICLE: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = VehicleAccessors.getDescription(primary);
}
break;
}
case DataOriginTypeEnum.CONDITION: {
const primary = DataOriginUtils.getRefPrimary(ref, refData);
if (primary !== null) {
description = ConditionAccessors.getDescription(primary);
}
break;
}
default:
// not implemented
}
return description !== null && description !== void 0 ? description : fallback;
}
/**
*
* @param entities
* @param entityRestrictionData
*/
export function filterNonRestrictedEntities(entities, entityRestrictionData) {
return entities.filter((entity) => entity.definition !== null &&
!validateIsRestrictedEntityDefinition(entity.definition, entityRestrictionData));
}
/**
*
* @param entityDefinitions
* @param entityRestrictionData
*/
export function filterNonRestrictedEntityDefinitions(entityDefinitions, entityRestrictionData) {
return entityDefinitions.filter((definition) => !validateIsRestrictedEntityDefinition(definition, entityRestrictionData));
}