diff --git a/module/applications/levelup.mjs b/module/applications/levelup.mjs index 0b3a9bec..3094c5bb 100644 --- a/module/applications/levelup.mjs +++ b/module/applications/levelup.mjs @@ -507,7 +507,7 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) const traitsTagify = htmlElement.querySelector('.levelup-trait-increases'); if (traitsTagify) { - tagifyElement(traitsTagify, abilities, this.tagifyUpdate('trait').bind(this)); + tagifyElement(traitsTagify, this.levelup.unmarkedTraits, this.tagifyUpdate('trait').bind(this)); } const experienceIncreaseTagify = htmlElement.querySelector('.levelup-experience-increases'); diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 54a7a3e1..2bc3ca06 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -171,6 +171,13 @@ export default class DhCharacter extends BaseDataActor { } prepareBaseData() { + const currentLevel = this.levelData.level.current; + const currentTier = + currentLevel === 1 + ? null + : Object.values(game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.LevelTiers).tiers).find( + tier => currentLevel >= tier.levels.start && currentLevel <= tier.levels.end + ).tier; for (let levelKey in this.levelData.levelups) { const level = this.levelData.levelups[levelKey]; @@ -181,6 +188,7 @@ export default class DhCharacter extends BaseDataActor { case 'trait': selection.data.forEach(data => { this.traits[data].bonus += 1; + this.traits[data].tierMarked = selection.tier === currentTier; }); break; case 'hitPoint': diff --git a/module/data/item/class.mjs b/module/data/item/class.mjs index 0584f1db..335014b9 100644 --- a/module/data/item/class.mjs +++ b/module/data/item/class.mjs @@ -17,7 +17,6 @@ export default class DHClass extends BaseDataItem { return { ...super.defineSchema(), domains: new fields.ArrayField(new fields.StringField(), { max: 2 }), - classItems: new fields.ArrayField(new ForeignDocumentUUIDField({ type: 'Item' })), evasion: new fields.NumberField({ initial: 0, integer: true }), features: new fields.ArrayField(new ForeignDocumentUUIDField({ type: 'Item' })), diff --git a/module/data/levelup.mjs b/module/data/levelup.mjs index 45ec389f..a964d716 100644 --- a/module/data/levelup.mjs +++ b/module/data/levelup.mjs @@ -1,3 +1,4 @@ +import { abilities } from '../config/actorConfig.mjs'; import { chunkify } from '../helpers/utils.mjs'; import { LevelOptionType } from './levelTier.mjs'; @@ -129,6 +130,35 @@ export class DhLevelup extends foundry.abstract.DataModel { .every(this.#levelFinished.bind(this)); } + get unmarkedTraits() { + const possibleLevels = Object.values(this.tiers).reduce((acc, tier) => { + if (tier.belongingLevels.includes(this.currentLevel)) acc = tier.belongingLevels; + return acc; + }, []); + + return Object.keys(this.levels) + .filter(key => possibleLevels.some(x => x === Number(key))) + .reduce( + (acc, levelKey) => { + const level = this.levels[levelKey]; + Object.values(level.choices).forEach(choice => + Object.values(choice).forEach(checkbox => { + if ( + checkbox.type === 'trait' && + checkbox.data.length > 0 && + Number(levelKey) !== this.currentLevel + ) { + checkbox.data.forEach(data => delete acc[data]); + } + }) + ); + + return acc; + }, + { ...abilities } + ); + } + get classUpgradeChoices() { let subclasses = []; let multiclass = null; diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index d764210a..1c4435de 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -172,17 +172,17 @@ export const tagifyElement = (element, options, onChange, tagifyOptions = {}) => templates: { tag(tagData) { return ` - -
- ${tagData[this.settings.tagTextProp] || tagData.value} - ${tagData.src ? `` : ''} -
-
`; + contenteditable='false' + spellcheck='false' + tabIndex="${this.settings.a11y.focusableTags ? 0 : -1}" + class="${this.settings.classNames.tag} ${tagData.class ? tagData.class : ''}" + ${this.getAttributes(tagData)}> + +
+ ${tagData[this.settings.tagTextProp] || tagData.value} + ${tagData.src ? `` : ''} +
+ `; } } });