New source found from dndbeyond.com
This commit is contained in:
@@ -450,3 +450,6 @@ export function getFeatListContracts(contract) {
|
||||
var _a, _b;
|
||||
return (_b = (_a = contract === null || contract === void 0 ? void 0 : contract.definition) === null || _a === void 0 ? void 0 : _a.grantedFeats) !== null && _b !== void 0 ? _b : [];
|
||||
}
|
||||
export function getFeatLists(background) {
|
||||
return background.featLists;
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ export function getDataOriginRefName(ref, refData, defaultValue, tryParent = fal
|
||||
break;
|
||||
}
|
||||
case DataOriginTypeEnum.UNKNOWN: {
|
||||
extraDisplay = defaultValue !== null && defaultValue !== void 0 ? defaultValue : 'No Origin';
|
||||
extraDisplay = defaultValue !== null && defaultValue !== void 0 ? defaultValue : 'Unknown Origin';
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
@@ -281,3 +281,7 @@ export function getDefinitionRepeatableParentId(feat) {
|
||||
export function getRepeatableParentId(feat) {
|
||||
return getDefinitionRepeatableParentId(feat);
|
||||
}
|
||||
export function getSpellListIds(feat) {
|
||||
var _a, _b;
|
||||
return (_b = (_a = getDefinition(feat)) === null || _a === void 0 ? void 0 : _a.spellListIds) !== null && _b !== void 0 ? _b : [];
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ import { ModifierGenerators } from '../Modifier';
|
||||
import { OptionAccessors, OptionGenerators } from '../Option';
|
||||
import { RaceAccessors } from '../Race';
|
||||
import { SpellGenerators } from '../Spell';
|
||||
import { getComponentId, getComponentTypeId, getCreatureRules, getEntityTypeId, getId, getModifiers, getOptions, getUniqueKey, } from './accessors';
|
||||
import { getComponentId, getComponentTypeId, getCreatureRules, getEntityTypeId, getId, getModifiers, getOptions, getSpellListIds, getUniqueKey, } from './accessors';
|
||||
/**
|
||||
*
|
||||
* @param feat
|
||||
@@ -342,3 +342,20 @@ export function generateDataOriginPairedFeats(feats) {
|
||||
}
|
||||
return lookup;
|
||||
}
|
||||
/**
|
||||
* Generates a list of spell list IDs from the feats.
|
||||
* This is used to determine which spell lists are available globally.
|
||||
*
|
||||
* @param feats - Array of Feat objects
|
||||
* @returns Array of spell list IDs
|
||||
*/
|
||||
export function generateGlobalFeatsSpellListIds(feats) {
|
||||
const spellListIds = [];
|
||||
feats.forEach((feat) => {
|
||||
const spellListIdsForFeat = getSpellListIds(feat);
|
||||
if (spellListIdsForFeat.length > 0) {
|
||||
spellListIds.push(...spellListIdsForFeat);
|
||||
}
|
||||
});
|
||||
return spellListIds;
|
||||
}
|
||||
|
||||
@@ -79,6 +79,13 @@ export function getDescription(prerequisiteGrouping) {
|
||||
export function getSubType(prerequisite) {
|
||||
return prerequisite.subType;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param prerequisite
|
||||
*/
|
||||
export function getShouldExclude(prerequisite) {
|
||||
return prerequisite.shouldExclude;
|
||||
}
|
||||
/**
|
||||
* @param prerequisite
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { AbilityAccessors } from '../Ability';
|
||||
import { FormatUtils } from '../Format';
|
||||
import { getEntityId, getFriendlySubtypeName, getPrerequisites, getSubType, getType, getValue } from './accessors';
|
||||
import { getEntityId, getFriendlySubtypeName, getPrerequisites, getSubType, getType, getValue, getShouldExclude, } from './accessors';
|
||||
import { PrerequisiteSubTypeEnum, PrerequisiteTypeEnum } from './constants';
|
||||
import { validatePrerequisite } from './validators';
|
||||
/**
|
||||
@@ -13,19 +13,19 @@ export function getPrerequisiteFailure(prerequisite, prerequisiteData) {
|
||||
case PrerequisiteTypeEnum.ABILITY_SCORE:
|
||||
return getPrerequisiteFailureAbilityScore(prerequisite, prerequisiteData);
|
||||
case PrerequisiteTypeEnum.PROFICIENCY:
|
||||
return getPrerequisiteFailureProficiency(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureProficiency(prerequisite);
|
||||
case PrerequisiteTypeEnum.SPECIES:
|
||||
return getPrerequisiteFailureRace(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureRace(prerequisite);
|
||||
case PrerequisiteTypeEnum.SIZE:
|
||||
return getPrerequisiteFailureSize(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureSize(prerequisite);
|
||||
case PrerequisiteTypeEnum.SPECIES_OPTION:
|
||||
return getPrerequisiteFailureSubrace(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureSubrace(prerequisite);
|
||||
case PrerequisiteTypeEnum.LEVEL:
|
||||
return getPrerequisiteFailureLevel(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureLevel(prerequisite);
|
||||
case PrerequisiteTypeEnum.CLASS:
|
||||
return getPrerequisiteFailureClass(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureClass(prerequisite);
|
||||
case PrerequisiteTypeEnum.FEAT:
|
||||
return getPrerequisiteFailureFeat(prerequisite, prerequisiteData);
|
||||
return getPrerequisiteFailureFeat(prerequisite);
|
||||
case PrerequisiteTypeEnum.CLASS_FEATURE:
|
||||
return getPrerequisiteFailureClassFeature(prerequisite);
|
||||
case PrerequisiteTypeEnum.CUSTOM_VALUE:
|
||||
@@ -39,7 +39,7 @@ export function getPrerequisiteFailure(prerequisite, prerequisiteData) {
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureLevel(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureLevel(prerequisite) {
|
||||
let requiredDescription = '';
|
||||
switch (getSubType(prerequisite)) {
|
||||
case PrerequisiteSubTypeEnum.CHARACTER_LEVEL:
|
||||
@@ -56,6 +56,7 @@ export function getPrerequisiteFailureLevel(prerequisite, prerequisiteData) {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -81,6 +82,7 @@ export function getPrerequisiteFailureAbilityScore(prerequisite, prerequisiteDat
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: `${getFriendlySubtypeName(prerequisite)} ${getValue(prerequisite)}+`,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -88,13 +90,14 @@ export function getPrerequisiteFailureAbilityScore(prerequisite, prerequisiteDat
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureProficiency(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureProficiency(prerequisite) {
|
||||
return {
|
||||
type: PrerequisiteTypeEnum.PROFICIENCY,
|
||||
data: {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: `${getFriendlySubtypeName(prerequisite)} Proficiency`,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -102,13 +105,14 @@ export function getPrerequisiteFailureProficiency(prerequisite, prerequisiteData
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureRace(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureRace(prerequisite) {
|
||||
return {
|
||||
type: PrerequisiteTypeEnum.SPECIES,
|
||||
data: {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: getFriendlySubtypeName(prerequisite),
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -116,13 +120,14 @@ export function getPrerequisiteFailureRace(prerequisite, prerequisiteData) {
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureSubrace(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureSubrace(prerequisite) {
|
||||
return {
|
||||
type: PrerequisiteTypeEnum.SPECIES_OPTION,
|
||||
data: {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: getFriendlySubtypeName(prerequisite),
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -130,13 +135,14 @@ export function getPrerequisiteFailureSubrace(prerequisite, prerequisiteData) {
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureSize(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureSize(prerequisite) {
|
||||
return {
|
||||
type: PrerequisiteTypeEnum.SIZE,
|
||||
data: {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: `${getFriendlySubtypeName(prerequisite)} Size`,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -144,13 +150,14 @@ export function getPrerequisiteFailureSize(prerequisite, prerequisiteData) {
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureClass(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureClass(prerequisite) {
|
||||
return {
|
||||
type: PrerequisiteTypeEnum.CLASS,
|
||||
data: {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: `${getFriendlySubtypeName(prerequisite)}`,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
export const getPrerequisiteFailureClassFeature = (prerequisite) => ({
|
||||
@@ -159,19 +166,21 @@ export const getPrerequisiteFailureClassFeature = (prerequisite) => ({
|
||||
requiredChoice: prerequisite.friendlySubTypeName,
|
||||
requiredDescription: prerequisite.friendlySubTypeName,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
});
|
||||
/**
|
||||
*
|
||||
* @param prerequisite
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function getPrerequisiteFailureFeat(prerequisite, prerequisiteData) {
|
||||
export function getPrerequisiteFailureFeat(prerequisite) {
|
||||
return {
|
||||
type: PrerequisiteTypeEnum.FEAT,
|
||||
data: {
|
||||
requiredChoice: getFriendlySubtypeName(prerequisite),
|
||||
requiredDescription: `${getFriendlySubtypeName(prerequisite)}`,
|
||||
},
|
||||
shouldExclude: !!getShouldExclude(prerequisite),
|
||||
};
|
||||
}
|
||||
/**
|
||||
@@ -198,14 +207,3 @@ export function getPrerequisiteGroupingFailures(prerequisiteGrouping, prerequisi
|
||||
}
|
||||
return groupingFailures.filter((group) => group.length);
|
||||
}
|
||||
/**
|
||||
* Get all prerequisites of a specific type
|
||||
* @param type
|
||||
* @param prereqGroups
|
||||
*/
|
||||
export function getPrereqsByType(type, prereqGroups) {
|
||||
return prereqGroups.reduce((acc, prereq) => {
|
||||
const featMappings = getPrerequisites(prereq).filter((mapping) => getType(mapping) === type);
|
||||
return acc.concat(featMappings);
|
||||
}, []);
|
||||
}
|
||||
|
||||
@@ -2,9 +2,8 @@ import { AbilityAccessors } from '../Ability';
|
||||
import { ClassAccessors } from '../Class';
|
||||
import { HelperUtils } from '../Helper';
|
||||
import { RaceAccessors } from '../Race';
|
||||
import { getEntityId, getEntityKey, getEntityTypeId, getPrerequisites, getSubType, getType, getValue, } from './accessors';
|
||||
import { getEntityId, getEntityKey, getEntityTypeId, getPrerequisites, getShouldExclude, getSubType, getType, getValue, } from './accessors';
|
||||
import { PrerequisiteSubTypeEnum, PrerequisiteTypeEnum } from './constants';
|
||||
import { getPrereqsByType } from './utils';
|
||||
/**
|
||||
*
|
||||
* @param prerequisiteGrouping
|
||||
@@ -63,9 +62,12 @@ export function validatePrerequisite(prerequisite, prerequisiteData) {
|
||||
return true;
|
||||
}
|
||||
export function validatePrerequisiteClassFeature(prerequisite, prerequisiteData) {
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
if (!prerequisite.entityId)
|
||||
return true;
|
||||
return Object.prototype.hasOwnProperty.call(prerequisiteData.classFeatureLookup, prerequisite.entityId);
|
||||
// check if class feature exists in the class feature lookup
|
||||
const hasClassFeature = Object.prototype.hasOwnProperty.call(prerequisiteData.classFeatureLookup, prerequisite.entityId);
|
||||
return shouldExclude ? !hasClassFeature : hasClassFeature;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@@ -73,10 +75,13 @@ export function validatePrerequisiteClassFeature(prerequisite, prerequisiteData)
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function validatePrerequisiteLevel(prerequisite, prerequisiteData) {
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
switch (getSubType(prerequisite)) {
|
||||
case PrerequisiteSubTypeEnum.CHARACTER_LEVEL:
|
||||
const value = getValue(prerequisite);
|
||||
return prerequisiteData.characterLevel >= (value ? value : 0);
|
||||
// check if the character level is greater than or equal to the value
|
||||
const characterLevelBeatsValue = prerequisiteData.characterLevel >= (value || 0);
|
||||
return shouldExclude ? !characterLevelBeatsValue : characterLevelBeatsValue;
|
||||
default:
|
||||
// not implemented
|
||||
}
|
||||
@@ -101,6 +106,12 @@ export function validatePrerequisiteAbilityScore(prerequisite, prerequisiteData)
|
||||
if (value === null) {
|
||||
return true;
|
||||
}
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
// if shouldExclude is true, we want to check if the ability score is less than the value
|
||||
if (shouldExclude) {
|
||||
return abilityScore < value;
|
||||
}
|
||||
// if shouldExclude is false, we want to check if the ability score is greater than or equal to the value
|
||||
return abilityScore >= value;
|
||||
}
|
||||
/**
|
||||
@@ -109,7 +120,10 @@ export function validatePrerequisiteAbilityScore(prerequisite, prerequisiteData)
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function validatePrerequisiteProficiency(prerequisite, prerequisiteData) {
|
||||
return prerequisiteData.proficiencyLookup.hasOwnProperty(getEntityKey(prerequisite));
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
//check if the proficiency exists in the proficiency lookup
|
||||
const hasProficiency = prerequisiteData.proficiencyLookup.hasOwnProperty(getEntityKey(prerequisite));
|
||||
return shouldExclude ? !hasProficiency : hasProficiency;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@@ -120,10 +134,11 @@ export function validatePrerequisiteRace(prerequisite, prerequisiteData) {
|
||||
if (!prerequisiteData.race) {
|
||||
return true;
|
||||
}
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
// check if race is a base race
|
||||
if (RaceAccessors.getBaseRaceId(prerequisiteData.race) === getEntityId(prerequisite) &&
|
||||
RaceAccessors.getBaseRaceTypeId(prerequisiteData.race) === getEntityTypeId(prerequisite)) {
|
||||
return true;
|
||||
return !shouldExclude;
|
||||
}
|
||||
// check if race is specific race
|
||||
return validatePrerequisiteEntityRace(prerequisite, prerequisiteData);
|
||||
@@ -149,8 +164,11 @@ function validatePrerequisiteEntityRace(prerequisite, prerequisiteData) {
|
||||
if (!prerequisiteData.race) {
|
||||
return true;
|
||||
}
|
||||
return (RaceAccessors.getEntityRaceId(prerequisiteData.race) === getEntityId(prerequisite) &&
|
||||
RaceAccessors.getEntityRaceTypeId(prerequisiteData.race) === getEntityTypeId(prerequisite));
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
// check if the race type and id match the prerequisite
|
||||
const isMatch = RaceAccessors.getEntityRaceId(prerequisiteData.race) === getEntityId(prerequisite) &&
|
||||
RaceAccessors.getEntityRaceTypeId(prerequisiteData.race) === getEntityTypeId(prerequisite);
|
||||
return shouldExclude ? !isMatch : isMatch;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@@ -165,7 +183,10 @@ export function validatePrerequisiteSize(prerequisite, prerequisiteData) {
|
||||
if (!sizeInfo) {
|
||||
return true;
|
||||
}
|
||||
return sizeInfo.id === getEntityId(prerequisite) && sizeInfo.entityTypeId === getEntityTypeId(prerequisite);
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
// check if size matches the prerequisite size
|
||||
const isMatch = sizeInfo.id === getEntityId(prerequisite) && sizeInfo.entityTypeId === getEntityTypeId(prerequisite);
|
||||
return shouldExclude ? !isMatch : isMatch;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@@ -177,24 +198,10 @@ export function validatePrerequisiteClass(prerequisite, prerequisiteData) {
|
||||
if (entityId === null) {
|
||||
return true;
|
||||
}
|
||||
return Object.values(prerequisiteData.baseClassLookup).some((charClass) => ClassAccessors.getId(charClass) === entityId);
|
||||
}
|
||||
/**
|
||||
* @param prerequisiteGrouping
|
||||
* @param prerequisiteData
|
||||
*/
|
||||
export function validatePrerequisiteGroupingFeat(prerequisiteGrouping, prerequisiteData) {
|
||||
if (prerequisiteGrouping === null) {
|
||||
return true;
|
||||
}
|
||||
const mappings = getPrereqsByType(PrerequisiteTypeEnum.FEAT, prerequisiteGrouping);
|
||||
let isValid = true;
|
||||
mappings.forEach((prerequisite) => {
|
||||
if (!validatePrerequisiteFeat(prerequisite, prerequisiteData)) {
|
||||
isValid = false;
|
||||
}
|
||||
});
|
||||
return isValid;
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
// check if class exists in the base class lookup
|
||||
const hasClass = Object.values(prerequisiteData.baseClassLookup).some((charClass) => ClassAccessors.getId(charClass) === entityId);
|
||||
return shouldExclude ? !hasClass : hasClass;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@@ -206,5 +213,8 @@ export function validatePrerequisiteFeat(prerequisite, prerequisiteData) {
|
||||
if (entityId === null) {
|
||||
return true;
|
||||
}
|
||||
return !!HelperUtils.lookupDataOrFallback(prerequisiteData.featLookup, entityId);
|
||||
const shouldExclude = getShouldExclude(prerequisite);
|
||||
// check if feat exists in the feat lookup
|
||||
const hasFeat = !!HelperUtils.lookupDataOrFallback(prerequisiteData.featLookup, entityId);
|
||||
return shouldExclude ? !hasFeat : hasFeat;
|
||||
}
|
||||
|
||||
@@ -638,7 +638,7 @@ export function generateActiveCharacterSpells(spells, inventoryInfusionLookup, c
|
||||
* @param optionalClassFeatures
|
||||
* @param definitionPool
|
||||
*/
|
||||
export function generateSpellListDataOriginLookup(race, classes, background, optionalOrigins, optionalClassFeatures, definitionPool) {
|
||||
export function generateSpellListDataOriginLookup(race, classes, background, optionalOrigins, optionalClassFeatures, definitionPool, feats) {
|
||||
let lookup = {};
|
||||
if (race !== null) {
|
||||
RaceAccessors.getDefinitionRacialTraits(race).forEach((feature) => {
|
||||
@@ -662,6 +662,12 @@ export function generateSpellListDataOriginLookup(race, classes, background, opt
|
||||
});
|
||||
});
|
||||
});
|
||||
feats.forEach((feat) => {
|
||||
const uniqueKey = FeatAccessors.getUniqueKey(feat);
|
||||
FeatAccessors.getSpellListIds(feat).forEach((spellListId) => {
|
||||
lookup[spellListId] = DataOriginGenerators.generateDataOriginRef(DataOriginTypeEnum.FEAT, uniqueKey);
|
||||
});
|
||||
});
|
||||
optionalOrigins.forEach((optionalOrigin) => {
|
||||
const definitionKey = OptionalOriginAccessors.getDefinitionKey(optionalOrigin);
|
||||
if (!definitionKey) {
|
||||
@@ -697,6 +703,6 @@ export function generateSpellListDataOriginLookup(race, classes, background, opt
|
||||
* @param raceSpellListIds
|
||||
* @param backgroundSpellListIds
|
||||
*/
|
||||
export function generateGlobalSpellListIds(raceSpellListIds, backgroundSpellListIds) {
|
||||
return [...raceSpellListIds, ...backgroundSpellListIds];
|
||||
export function generateGlobalSpellListIds(raceSpellListIds, backgroundSpellListIds, featSpellListIds) {
|
||||
return [...raceSpellListIds, ...backgroundSpellListIds, ...featSpellListIds];
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import sortBy from 'lodash/sortBy';
|
||||
import { characterActions } from "../actions";
|
||||
import { ChoiceUtils } from "../engine/Choice";
|
||||
import { DisplayConfigurationTypeEnum } from "../engine/Core";
|
||||
@@ -70,10 +71,54 @@ export class FeatManager extends BaseManager {
|
||||
// user-facing categories from technical-only tags.
|
||||
this.getCategories = () => FeatAccessors.getCategories(this.feat);
|
||||
//Utils
|
||||
//Gets all the prereq Failures for this feat - returns an array of arrays, where each inner array is a grouping of failures
|
||||
this.getPrerequisiteFailures = () => {
|
||||
const prerequisiteData = rulesEngineSelectors.getPrerequisiteData(this.state);
|
||||
return PrerequisiteUtils.getPrerequisiteGroupingFailures(this.getPrerequisites(), prerequisiteData);
|
||||
};
|
||||
// Creates a string that summarizes the prerequisite failures for this feat
|
||||
this.getPrerequisiteFailuresText = () => {
|
||||
//get all the prerequisite failures, sorted so that if every group failure is a missing prereq, they come first
|
||||
const failures = sortBy(this.getPrerequisiteFailures(), (failureGroup) => failureGroup.every((f) => !f.shouldExclude) ? 0 : 1);
|
||||
// Create an intro string for the summary
|
||||
let intro = '';
|
||||
// Check if all failures are either missing or prohibited
|
||||
const hasOnlyMissingFailures = failures.every((failureGroup) => failureGroup.every((f) => !f.shouldExclude));
|
||||
const hasOnlyProhibitedFailures = failures.every((failureGroup) => failureGroup.every((f) => f.shouldExclude));
|
||||
// Determine the intro text based on the type of failures
|
||||
if (hasOnlyMissingFailures) {
|
||||
intro = 'Missing: ';
|
||||
}
|
||||
else if (hasOnlyProhibitedFailures) {
|
||||
intro = 'Prohibits: ';
|
||||
}
|
||||
else {
|
||||
intro = 'Requires: ';
|
||||
}
|
||||
// Each failure is sorted so that prohibited failures come last, and then combined into a single string
|
||||
const combinedStrings = failures
|
||||
.map((failure) => sortBy(failure, (f) => (f.shouldExclude ? 1 : 0))
|
||||
.map((failureAnd) => {
|
||||
if (failureAnd.shouldExclude && !hasOnlyProhibitedFailures && !hasOnlyMissingFailures) {
|
||||
return `Prohibits ${failureAnd.data.requiredDescription}`;
|
||||
}
|
||||
return `${failureAnd.data.requiredDescription}`;
|
||||
})
|
||||
.reduce((acc, desc, idx) => {
|
||||
let connector = '';
|
||||
if (idx < failure.length - 2) {
|
||||
connector = ', ';
|
||||
}
|
||||
else if (idx < failure.length - 1) {
|
||||
connector = ' and ';
|
||||
}
|
||||
acc += `${desc}${connector}`;
|
||||
return acc;
|
||||
}, ''))
|
||||
.join(' or ');
|
||||
// return the intro text followed by the combined strings
|
||||
return `${intro}${combinedStrings}`;
|
||||
};
|
||||
this.getRepeatableGroupId = () => FeatUtils.getRepeatableGroupId(this.feat);
|
||||
this.isRepeatableFeatParent = () => this.isRepeatable() && this.getRepeatableParentId() === null;
|
||||
this.getDefinitionKey = () => {
|
||||
|
||||
@@ -144,7 +144,7 @@ function* filter(action) {
|
||||
*
|
||||
* @param action
|
||||
*/
|
||||
function* executePostAction(action) {
|
||||
export function* executePostAction(action) {
|
||||
if (isPostAction(action.meta)) {
|
||||
for (let i = 0; i < action.meta.postAction.type.length; i++) {
|
||||
yield put({
|
||||
@@ -184,7 +184,7 @@ function* executeSyncTransactionDeactivate(action, transactionInitiatorId) {
|
||||
*
|
||||
* @param action
|
||||
*/
|
||||
function* executeApi(action) {
|
||||
export function* executeApi(action) {
|
||||
let apiLookup = {
|
||||
// ACTION
|
||||
[types.ACTION_USE_SET]: apiShared.putCharacterActionLimitedUse,
|
||||
@@ -392,7 +392,7 @@ function* executeApi(action) {
|
||||
yield call(apiRequest, apiPayload);
|
||||
}
|
||||
}
|
||||
function* executeHandler(action) {
|
||||
export function* executeHandler(action) {
|
||||
let handlerLookup = {
|
||||
//ACTION
|
||||
[types.ACTION_CUSTOMIZATIONS_DELETE]: sagaHandlers.handleActionCustomizationsDelete,
|
||||
|
||||
@@ -97,7 +97,7 @@ function* filter(action) {
|
||||
*
|
||||
* @param action
|
||||
*/
|
||||
function* executePostAction(action) {
|
||||
export function* executePostAction(action) {
|
||||
if (isPostAction(action.meta)) {
|
||||
for (let i = 0; i < action.meta.postAction.type.length; i++) {
|
||||
yield put({
|
||||
@@ -137,7 +137,7 @@ function* executeSyncTransactionDeactivate(action, transactionInitiatorId) {
|
||||
*
|
||||
* @param action
|
||||
*/
|
||||
function* executeApi(action) {
|
||||
export function* executeApi(action) {
|
||||
let apiLookup = {
|
||||
//KNOWN_INFUSION
|
||||
[types.KNOWN_INFUSION_MAPPING_SET]: apiShared.putCharacterKnownInfusion,
|
||||
@@ -207,7 +207,7 @@ function* executeApi(action) {
|
||||
yield call(apiRequest, apiPayload);
|
||||
}
|
||||
}
|
||||
function* executeHandler(action) {
|
||||
export function* executeHandler(action) {
|
||||
let handlerLookup = {
|
||||
//KNOWN_INFUSION
|
||||
[types.KNOWN_INFUSION_MAPPING_CREATE]: sagaHandlers.handleKnownInfusionCreate,
|
||||
|
||||
@@ -68,6 +68,7 @@ export const getSpellListDataOriginLookup = createSelector([
|
||||
characterSelectors.getOptionalOrigins,
|
||||
characterSelectors.getOptionalClassFeatures,
|
||||
serviceDataSelectors.getDefinitionPool,
|
||||
characterSelectors.getFeats,
|
||||
], SpellGenerators.generateSpellListDataOriginLookup);
|
||||
/**
|
||||
* @returns {Record<string, Array<ActionContract>>}
|
||||
@@ -400,7 +401,11 @@ export const getGlobalBackgroundSpellListIds = createSelector([getBackgroundInfo
|
||||
/**
|
||||
* @returns {Array<number>}
|
||||
*/
|
||||
export const getGlobalSpellListIds = createSelector([getGlobalRaceSpellListIds, getGlobalBackgroundSpellListIds], SpellGenerators.generateGlobalSpellListIds);
|
||||
export const getGlobalFeatsSpellListIds = createSelector([getFeats], FeatGenerators.generateGlobalFeatsSpellListIds);
|
||||
/**
|
||||
* @returns {Array<number>}
|
||||
*/
|
||||
export const getGlobalSpellListIds = createSelector([getGlobalRaceSpellListIds, getGlobalBackgroundSpellListIds, getGlobalFeatsSpellListIds], SpellGenerators.generateGlobalSpellListIds);
|
||||
/**
|
||||
* @returns {DecorationInfo}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user