diff --git a/lang/en.json b/lang/en.json index 08700161..7ecc4a42 100755 --- a/lang/en.json +++ b/lang/en.json @@ -773,7 +773,9 @@ "levelAchievements": "Level Achievements", "levelAdvancements": "Level Advancements", "proficiencyIncrease": "Proficiency Increased: {proficiency}", - "statisticIncreases": "Statistic Increases", + "hpIncrease": "Hit Points Increased: {hitPoints}", + "stressIncrease": "Stress Increased: {stress}", + "evasionIncrease": "Evasion Increased: {evasion}", "damageThresholdMajorIncrease": "Major: {threshold}", "damageThresholdSevereIncrease": "Severe: {threshold}", "newExperiences": "New Experiences", @@ -782,7 +784,8 @@ "subclass": "Subclass", "multiclass": "Multiclass", "traits": "Increased Traits", - "experienceIncreases": "Experience Increases" + "experienceIncreases": "Experience Increases", + "damageThresholds": "Damage Thresholds" }, "notifications": { "info": { diff --git a/module/applications/levelup.mjs b/module/applications/levelup.mjs index 82ca528b..f9783696 100644 --- a/module/applications/levelup.mjs +++ b/module/applications/levelup.mjs @@ -200,27 +200,126 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) case 'summary': const actorArmor = this.actor.system.armor; const { current: currentLevel, changed: changedLevel } = this.actor.system.levelData.level; - context.levelAchievements = { - statisticIncreases: { - proficiency: { - old: this.actor.system.proficiency, - new: this.actor.system.proficiency + this.levelup.allInitialAchievements.proficiency + const achievementCards = []; + for (var card of Object.values(this.levelup.domainCards)) { + if (card.uuid) { + const itemCard = await foundry.utils.fromUuid(card.uuid); + achievementCards.push(itemCard); + } + } + + context.achievements = { + proficiency: { + old: this.actor.system.proficiency, + new: + this.actor.system.proficiency + + Object.values(this.levelup.allInitialAchievements).reduce( + (acc, x) => acc + x.proficiency, + 0 + ) + }, + damageThresholds: { + major: { + old: this.actor.system.damageThresholds.major, + new: this.actor.system.damageThresholds.major + changedLevel - currentLevel }, - damageThresholds: { - major: { - old: this.actor.system.damageThresholds.major, - new: this.actor.system.damageThresholds.major + changedLevel - currentLevel - }, - severe: { - old: this.actor.system.damageThresholds.severe, - new: - this.actor.system.damageThresholds.severe + - (actorArmor ? changedLevel - currentLevel : (changedLevel - currentLevel) * 2) - }, - unarmored: !actorArmor - } + severe: { + old: this.actor.system.damageThresholds.severe, + new: + this.actor.system.damageThresholds.severe + + (actorArmor ? changedLevel - currentLevel : (changedLevel - currentLevel) * 2) + }, + unarmored: !actorArmor + }, + domainCards: { + values: achievementCards, + shown: achievementCards.length > 0 + }, + experiences: { + values: Object.values(this.levelup.allInitialAchievements).flatMap(achievements => { + return Object.values(achievements.newExperiences).reduce((acc, experience) => { + if (experience.name) acc.push(experience); + + return acc; + }, []); + }) } }; + context.achievements.proficiency.shown = + context.achievements.proficiency.new > context.achievements.proficiency.old; + context.achievements.experiences.shown = context.achievements.experiences.values.length > 0; + + const advancementChoices = this.levelup.selectionData.reduce((acc, data) => { + const advancementChoice = { + ...data, + path: `tiers.${data.tier}.levels.${data.level}.optionSelections.${data.optionKey}.${data.checkboxNr}.data` + }; + if (acc[data.type]) acc[data.type].push(advancementChoice); + else acc[data.type] = [advancementChoice]; + + return acc; + }, {}); + + const advancementCards = []; + const cardChoices = advancementChoices.domainCard ?? []; + for (var card of cardChoices) { + if (card.data.length > 0) { + for (var data of card.data) { + const itemCard = await foundry.utils.fromUuid(data); + advancementCards.push(itemCard); + } + } + } + + context.advancements = { + statistics: { + proficiency: { + old: context.achievements.proficiency.new, + new: + context.achievements.proficiency.new + + Object.values(advancementChoices.proficiency ?? {}).reduce((acc, x) => acc + x.value, 0) + }, + hitPoints: { + old: this.actor.system.resources.health.max, + new: + this.actor.system.resources.health.max + + Object.values(advancementChoices.hitPoint ?? {}).reduce((acc, x) => acc + x.value, 0) + }, + stress: { + old: this.actor.system.resources.stress.max, + new: + this.actor.system.resources.stress.max + + Object.values(advancementChoices.stress ?? {}).reduce((acc, x) => acc + x.value, 0) + }, + evasion: { + old: this.actor.system.evasion.value, + new: + this.actor.system.evasion.value + + Object.values(advancementChoices.evasion ?? {}).reduce((acc, x) => acc + x.value, 0) + } + }, + traits: Object.values(advancementChoices.trait ?? {}).flatMap(x => + x.data.map(data => game.i18n.localize(abilities[data].label)) + ), + domainCards: advancementCards, + experiences: Object.values(advancementChoices.experience ?? {}).flatMap(x => + x.data.map(data => ({ name: data, modifier: x.value })) + ) + }; + + context.advancements.statistics.proficiency.shown = + context.advancements.statistics.proficiency.new > context.advancements.statistics.proficiency.old; + context.advancements.statistics.hitPoints.shown = + context.advancements.statistics.hitPoints.new > context.advancements.statistics.hitPoints.old; + context.advancements.statistics.stress.shown = + context.advancements.statistics.stress.new > context.advancements.statistics.stress.old; + context.advancements.statistics.evasion.shown = + context.advancements.statistics.evasion.new > context.advancements.statistics.evasion.old; + context.advancements.statistics.shown = + context.advancements.statistics.proficiency.shown || + context.advancements.statistics.hitPoints.shown || + context.advancements.statistics.stress.shown || + context.advancements.statistics.evasion.shown; break; } diff --git a/module/data/levelup.mjs b/module/data/levelup.mjs index b4f9ecab..64c4157c 100644 --- a/module/data/levelup.mjs +++ b/module/data/levelup.mjs @@ -223,6 +223,66 @@ export class DhLevelup extends foundry.abstract.DataModel { return acc; }, {}); } + + /* Data to render all options from */ + get tierCheckboxGroups() { + const multiclassSelected = Object.values(this.tiers).some(tier => + Object.values(tier.levels).some(level => { + return Object.keys(level.optionSelections).some(option => + Object.values(level.optionSelections[option]).some(x => option === 'multiclass' && x.selected) + ); + }) + ); + return Object.keys(this.tiers).map(tierKey => { + const tier = this.tiers[tierKey]; + const subclassSelected = Object.values(tier.levels).some(level => { + return Object.keys(level.optionSelections).some(option => + Object.values(level.optionSelections[option]).some(x => option === 'subclass' && x.selected) + ); + }); + + return { + tierActive: tier.active, + tierName: tier.name, + groups: Object.keys(tier.options).map(optionKey => { + const option = tier.options[optionKey]; + const checkboxes = [...Array(option.checkboxSelections).keys()].flatMap(checkboxNr => { + const levelId = Object.keys(tier.levels).find(levelKey => { + const optionSelect = tier.levels[levelKey].optionSelections; + return Object.keys(optionSelect) + .filter(key => key === optionKey) + .some(optionKey => optionSelect[optionKey][checkboxNr]?.selected); + }); + + const selected = Boolean(levelId); + const disabled = !levelId + ? false + : tier.levels[levelId].optionSelections[optionKey][checkboxNr]?.locked; + const multiclassDisabled = + !selected && optionKey === 'multiclass' && (multiclassSelected || subclassSelected); + return [...Array(option.minCost)].map(_ => ({ + ...option, + tier: tierKey, + level: levelId, + selected: selected, + optionKey: optionKey, + checkboxNr: checkboxNr, + disabled: disabled || multiclassDisabled, + cost: option.minCost + })); + }); + + return { + label: game.i18n.localize(option.label), + checkboxGroups: chunkify(checkboxes, option.minCost, chunkedBoxes => ({ + multi: option.minCost > 1, + checkboxes: chunkedBoxes + })) + }; + }) + }; + }); + } } class DhLevelupTier extends foundry.abstract.DataModel { @@ -304,40 +364,6 @@ class DhLevelupTier extends foundry.abstract.DataModel { total: allSelections.total }; } - - /* Data to render all options in a Tier from */ - get tierCheckboxGroups() { - return Object.keys(this.options).map(optionKey => { - const option = this.options[optionKey]; - const checkboxes = [...Array(option.checkboxSelections).keys()].flatMap(checkboxNr => { - const levelId = Object.keys(this.levels).find(levelKey => { - const optionSelect = this.levels[levelKey].optionSelections; - return Object.keys(optionSelect) - .filter(key => key === optionKey) - .some(optionKey => optionSelect[optionKey][checkboxNr]?.selected); - }); - - return [...Array(option.minCost)].map(_ => ({ - ...option, - tier: this.tier, - level: levelId, - selected: Boolean(levelId), - optionKey: optionKey, - checkboxNr: checkboxNr, - disabled: !levelId ? false : this.levels[levelId].optionSelections[optionKey][checkboxNr]?.locked, - cost: option.minCost - })); - }); - - return { - label: game.i18n.localize(option.label), - checkboxGroups: chunkify(checkboxes, option.minCost, chunkedBoxes => ({ - multi: option.minCost > 1, - checkboxes: chunkedBoxes - })) - }; - }); - } } class DhLevelupTierOption extends foundry.abstract.DataModel { diff --git a/styles/daggerheart.css b/styles/daggerheart.css index 5ee85b31..0c123587 100755 --- a/styles/daggerheart.css +++ b/styles/daggerheart.css @@ -2866,15 +2866,20 @@ div.daggerheart.views.multiclass { position: relative; right: 2px; } -.daggerheart.levelup .levelup-summary-container .level-achievements-container { +.daggerheart.levelup .levelup-summary-container .level-achievements-container, +.daggerheart.levelup .levelup-summary-container .level-advancements-container { display: flex; flex-direction: column; gap: 8px; } .daggerheart.levelup .levelup-summary-container .level-achievements-container h2, +.daggerheart.levelup .levelup-summary-container .level-advancements-container h2, .daggerheart.levelup .levelup-summary-container .level-achievements-container h3, +.daggerheart.levelup .levelup-summary-container .level-advancements-container h3, .daggerheart.levelup .levelup-summary-container .level-achievements-container h4, -.daggerheart.levelup .levelup-summary-container .level-achievements-container h5 { +.daggerheart.levelup .levelup-summary-container .level-advancements-container h4, +.daggerheart.levelup .levelup-summary-container .level-achievements-container h5, +.daggerheart.levelup .levelup-summary-container .level-advancements-container h5 { margin: 0; color: var(--color-text-secondary); } @@ -2884,6 +2889,16 @@ div.daggerheart.views.multiclass { gap: 4px; font-size: 20px; } +.daggerheart.levelup .levelup-summary-container .summary-selection-container { + display: flex; + gap: 8px; +} +.daggerheart.levelup .levelup-summary-container .summary-selection-container .summary-selection { + border: 2px solid; + border-radius: 6px; + padding: 0 4px; + font-size: 18px; +} .daggerheart.levelup .levelup-footer { display: flex; } @@ -2998,7 +3013,7 @@ div.daggerheart.views.multiclass { #resources .window-content #resource-fear.isGM i:hover { font-size: var(--font-size-20); } -#resources button[data-action="close"] { +#resources button[data-action='close'] { display: none; } #resources:not(:hover):not(.minimized) { diff --git a/styles/levelup.less b/styles/levelup.less index 622a979c..64a57d7b 100644 --- a/styles/levelup.less +++ b/styles/levelup.less @@ -185,7 +185,8 @@ } .levelup-summary-container { - .level-achievements-container { + .level-achievements-container, + .level-advancements-container { display: flex; flex-direction: column; gap: 8px; @@ -205,6 +206,18 @@ gap: 4px; font-size: 20px; } + + .summary-selection-container { + display: flex; + gap: 8px; + + .summary-selection { + border: 2px solid; + border-radius: 6px; + padding: 0 4px; + font-size: 18px; + } + } } .levelup-footer { diff --git a/templates/views/levelup/tabs/advancements.hbs b/templates/views/levelup/tabs/advancements.hbs index 77c01afb..022ebac1 100644 --- a/templates/views/levelup/tabs/advancements.hbs +++ b/templates/views/levelup/tabs/advancements.hbs @@ -5,11 +5,11 @@ >