From 2c657770de7e32111207fa3d084cf25b47c3fa0a Mon Sep 17 00:00:00 2001 From: David Kruger Date: Wed, 25 Jun 2025 01:00:21 -0700 Subject: [PATCH] New source found from dndbeyond.com --- .../rules-engine/es/engine/Class/accessors.js | 7 +++++++ .../rules-engine/es/engine/Class/derivers.js | 3 +++ .../rules-engine/es/engine/Class/generators.js | 4 ++-- .../rules-engine/es/engine/Spell/derivers.js | 2 +- .../builder/components/InputField/InputField.tsx | 12 ++++++++++-- .../ClassesManage/ClassManager/ClassManager.tsx | 7 ++----- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ddb_main/packages/rules-engine/es/engine/Class/accessors.js b/ddb_main/packages/rules-engine/es/engine/Class/accessors.js index 011bcdc..39a6889 100644 --- a/ddb_main/packages/rules-engine/es/engine/Class/accessors.js +++ b/ddb_main/packages/rules-engine/es/engine/Class/accessors.js @@ -437,6 +437,13 @@ export function getUniqueClassFeatures(charClass) { export function getVisibileClassFeatures(charClass) { return charClass.visibleClassFeatures; } +/** + * + * @param charClass + */ +export function getHigherLevelClassFeatures(charClass) { + return charClass.higherLevelClassFeatures; +} /** * * @param charClass diff --git a/ddb_main/packages/rules-engine/es/engine/Class/derivers.js b/ddb_main/packages/rules-engine/es/engine/Class/derivers.js index dba8e22..7455fd5 100644 --- a/ddb_main/packages/rules-engine/es/engine/Class/derivers.js +++ b/ddb_main/packages/rules-engine/es/engine/Class/derivers.js @@ -145,11 +145,14 @@ export function deriveClassFeatureGroups(charClass, classFeatures, appContext) { } return acc; }, []); + const higherLevelFeatures = classFeatures.filter((feature) => ClassFeatureAccessors.getRequiredLevel(feature) > getLevel(charClass) && + (appContext === null || !ClassFeatureUtils.getHideInContext(feature, appContext))); return { activeFeatures, visibleFeatures, orderedFeatures, uniqueFeatures, + higherLevelFeatures, }; } /** diff --git a/ddb_main/packages/rules-engine/es/engine/Class/generators.js b/ddb_main/packages/rules-engine/es/engine/Class/generators.js index 666623e..459a962 100644 --- a/ddb_main/packages/rules-engine/es/engine/Class/generators.js +++ b/ddb_main/packages/rules-engine/es/engine/Class/generators.js @@ -62,11 +62,11 @@ export function generateBaseCharClass(charClass, optionalClassFeatures, allClass featureSpells.push(...OptionAccessors.getSpells(option)); }); }); - const { activeFeatures, visibleFeatures, orderedFeatures, uniqueFeatures } = deriveClassFeatureGroups(charClass, updatedFeatures, appContext); + const { activeFeatures, visibleFeatures, orderedFeatures, uniqueFeatures, higherLevelFeatures } = deriveClassFeatureGroups(charClass, updatedFeatures, appContext); // do any class features or modifiers enable hex, pact or dedicated weapons //TODO eventually should just be able to use modifiers here and not have to check class feature names const { enablesHexWeapon, enablesPactWeapon, enablesDedicatedWeapon } = deriveDedicatedHexAndPactWeaponEnabled(updatedFeatures, classModifiers); - return Object.assign(Object.assign({}, charClass), { activeId: deriveActiveId(charClass), spells: SpellGenerators.updateClassSpells(featureSpells, classSpells), modifiers: classModifiers, featureSpells, classFeatures: updatedFeatures, optionalClassFeatures, activeClassFeatures: activeFeatures, visibleClassFeatures: visibleFeatures, orderedClassFeatures: orderedFeatures, uniqueClassFeatures: uniqueFeatures, feats, + return Object.assign(Object.assign({}, charClass), { activeId: deriveActiveId(charClass), spells: SpellGenerators.updateClassSpells(featureSpells, classSpells), modifiers: classModifiers, featureSpells, classFeatures: updatedFeatures, optionalClassFeatures, activeClassFeatures: activeFeatures, visibleClassFeatures: visibleFeatures, orderedClassFeatures: orderedFeatures, uniqueClassFeatures: uniqueFeatures, higherLevelClassFeatures: higherLevelFeatures, feats, actions, enablesDedicatedWeapon, enablesHexWeapon, diff --git a/ddb_main/packages/rules-engine/es/engine/Spell/derivers.js b/ddb_main/packages/rules-engine/es/engine/Spell/derivers.js index ce8a25c..8f645e2 100644 --- a/ddb_main/packages/rules-engine/es/engine/Spell/derivers.js +++ b/ddb_main/packages/rules-engine/es/engine/Spell/derivers.js @@ -217,7 +217,7 @@ export function getCastLevelRange(spell, spellCasterInfo, ruleData) { ...spellCasterInfo.availableSpellLevels, ...spellCasterInfo.availablePactMagicLevels, ].filter((level) => level >= getLevel(spell)); - startLevel = Math.max(getLevel(spell), Math.min(...availableLevels)); + startLevel = Math.max(getLevel(spell), availableLevels.length > 0 ? Math.min(...availableLevels) : 0); endLevel = Math.max(getLevel(spell), ...availableLevels); if (limitedUse && getDataOriginType(spell) === DataOriginTypeEnum.CLASS_FEATURE) { const dataOrigin = getDataOrigin(spell); diff --git a/ddb_main/subApps/builder/components/InputField/InputField.tsx b/ddb_main/subApps/builder/components/InputField/InputField.tsx index 98d5bd9..fbc09d0 100644 --- a/ddb_main/subApps/builder/components/InputField/InputField.tsx +++ b/ddb_main/subApps/builder/components/InputField/InputField.tsx @@ -79,12 +79,20 @@ export const InputField: FC = ({ const intValue = parseInt(e.target.value); // If entered value is below the minimum, reset to minimum - if (!isNaN(intValue) && inputProps?.min && intValue < inputProps?.min) { + if ( + !isNaN(intValue) && + inputProps?.min !== undefined && + intValue < inputProps.min + ) { setValue(inputProps.min); } // If entered value is above the maximum and no initialValue exists, reset to maximum - if (!isNaN(intValue) && inputProps?.max && intValue > inputProps?.max) { + if ( + !isNaN(intValue) && + inputProps?.max !== undefined && + intValue > inputProps.max + ) { setValue(inputProps.max); } diff --git a/ddb_main/tools/js/CharacterBuilder/containers/pages/ClassesManage/ClassManager/ClassManager.tsx b/ddb_main/tools/js/CharacterBuilder/containers/pages/ClassesManage/ClassManager/ClassManager.tsx index fa58a1d..6e11f2c 100644 --- a/ddb_main/tools/js/CharacterBuilder/containers/pages/ClassesManage/ClassManager/ClassManager.tsx +++ b/ddb_main/tools/js/CharacterBuilder/containers/pages/ClassesManage/ClassManager/ClassManager.tsx @@ -257,11 +257,8 @@ export default class ClassManager extends React.PureComponent { visibleClassFeatures ).filter((feature) => ClassFeatureUtils.getRequiredLevel(feature) <= level); - const classFeatures = ClassUtils.getClassFeatures(charClass); - const orderedClassFeatures = - ClassUtils.deriveOrderedClassFeatures(classFeatures); - const atHigherLevelsClassFeatures = orderedClassFeatures.filter( - (feature) => ClassFeatureUtils.getRequiredLevel(feature) > level + const atHigherLevelsClassFeatures = ClassUtils.deriveOrderedClassFeatures( + ClassUtils.getHigherLevelClassFeatures(charClass) ); return (