diff --git a/module/data/pc.mjs b/module/data/pc.mjs index 6ee408fd..77530ab0 100644 --- a/module/data/pc.mjs +++ b/module/data/pc.mjs @@ -6,7 +6,8 @@ const fields = foundry.data.fields; const attributeField = () => new fields.SchemaField({ bonus: new fields.NumberField({ initial: 0, integer: true }), - base: new fields.NumberField({ initial: 0, integer: true }) + base: new fields.NumberField({ initial: 0, integer: true }), + tierMarked: new fields.BooleanField({ required: true, initial: false }) }); const resourceField = max => diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 50e95aee..9a6bedd6 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -33,6 +33,12 @@ export default class DhpActor extends Actor { if (newLevel > this.system.levelData.level.current) { await this.update({ 'system.levelData.level.changed': newLevel }); } else { + const levelTiers = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.LevelTiers); + const passedLevelTiers = Object.values(levelTiers.tiers) + .filter(x => newLevel <= x.levels.end) + .map(x => x.levels.start); + const firstPassedLevelTier = passedLevelTiers.length > 0 ? Math.min(...passedLevelTiers) : null; + const changes = this.getLevelChangedFeatures( newLevel, this.system.levelData.level.changed, @@ -46,7 +52,16 @@ export default class DhpActor extends Actor { } var traitsUpdate = changes.traits.reduce((acc, trait) => { - acc[`${trait}.bonus`] = this.system.traits[trait].bonus - 1; + const currentTrait = this.system.traits[trait.data]; + acc[trait.data] = { + bonus: currentTrait.bonus - 1, + tierMarked: trait.first + ? !firstPassedLevelTier || trait.level <= firstPassedLevelTier + ? true + : false + : currentTrait.tierMarked + }; + return acc; }, {}); @@ -144,7 +159,18 @@ export default class DhpActor extends Actor { ...(selections.domainCard?.flatMap(x => x.data.map(data => ({ ...x, data: data }))) ?? []) ] ); - changedFeatures.traits.push(...(selections.trait ? selections.trait.flatMap(x => x.data) : [])); + changedFeatures.traits.push( + ...(selections.trait + ? selections.trait.flatMap(x => + x.data.map(data => ({ + level: x.level, + data: data, + first: level === startLevel, + last: level === endLevel + })) + ) + : []) + ); changedFeatures.experiences = Object.keys(achievements?.experiences ? achievements.experiences : {}).reduce( (acc, key) => { acc[key] = achievements.experiences[key]; @@ -162,6 +188,12 @@ export default class DhpActor extends Actor { } async levelUp(levelupData) { + const levelTiers = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.LevelTiers); + const passedLevelTiers = Object.values(levelTiers.tiers) + .filter(x => this.system.levelData.level.changed >= x.levels.start) + .map(x => x.levels.start); + const lastPassedLevelTier = passedLevelTiers.length > 0 ? Math.max(...passedLevelTiers) : null; + const changes = this.getLevelChangedFeatures( this.system.levelData.level.current, this.system.levelData.level.changed, @@ -191,7 +223,15 @@ export default class DhpActor extends Actor { } var traitsUpdate = changes.traits.reduce((acc, trait) => { - acc[`${trait}.bonus`] = this.system.traits[trait].bonus + 1; + const currentTrait = this.system.traits[trait.data]; + acc[`${trait.data}`] = { + bonus: currentTrait.bonus + 1, + tierMarked: trait.last + ? !lastPassedLevelTier || trait.level >= lastPassedLevelTier + ? true + : false + : currentTrait.tierMarked + }; return acc; }, {});