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 `` : ''}
-