diff --git a/lang/en.json b/lang/en.json index 2c255975..d9717793 100755 --- a/lang/en.json +++ b/lang/en.json @@ -162,6 +162,8 @@ }, "faith": "Faith", "levelUp": "You can level up", + "maxEvasionBonus": "Max Evasion Increase", + "maxHPBonus": "Max HP Increase", "pronouns": "Pronouns", "story": { "backgroundTitle": "Background", @@ -2244,6 +2246,8 @@ "openItemWorld": "Open Item World", "openActorWorld": "Open Actor World", "sendToChat": "Send to Chat", + "maxEvasionClassBound": "Your Evasion base is set on your class. This is the increase ontop of that.", + "maxHPClassBound": "Your max HP base is set on your class. This is the increase ontop of that.", "moreOptions": "More Options", "equip": "Equip", "unequip": "Unequip", @@ -2253,7 +2257,8 @@ "rangeAndTarget": "Range & Target", "dragApplyEffect": "Drag effect to apply it to an actor", "appliedEvenIfSuccessful": "Applied even if save succeeded", - "diceIsRerolled": "The dice has been rerolled (x{times})" + "diceIsRerolled": "The dice has been rerolled (x{times})", + "openSheetSettings": "Open Settings" } } } diff --git a/module/applications/sheets-configs/character-settings.mjs b/module/applications/sheets-configs/character-settings.mjs index 75c4e6b9..20a09cfc 100644 --- a/module/applications/sheets-configs/character-settings.mjs +++ b/module/applications/sheets-configs/character-settings.mjs @@ -73,18 +73,23 @@ export default class DHCharacterSettings extends DHBaseActorSettings { const experience = this.actor.system.experiences[target.dataset.experience]; const updates = {}; - const relinkData = Object.keys(this.actor.system.levelData.levelups).reduce((acc, key) => { + const relinkAchievementData = []; + const relinkSelectionData = []; + Object.keys(this.actor.system.levelData.levelups).forEach(key => { const level = this.actor.system.levelData.levelups[key]; + + const achievementIncludesExp = level.achievements.experiences[target.dataset.experience]; + if (achievementIncludesExp) + relinkAchievementData.push({ levelKey: key, experience: target.dataset.experience }); + const selectionIndex = level.selections.findIndex( x => x.optionKey === 'experience' && x.data[0] === target.dataset.experience ); if (selectionIndex !== -1) - acc.push({ levelKey: key, selectionIndex, experience: target.dataset.experience }); + relinkSelectionData.push({ levelKey: key, selectionIndex, experience: target.dataset.experience }); + }); - return acc; - }, []); - - if (relinkData.length > 0) { + if (relinkAchievementData.length > 0 || relinkSelectionData.length > 0) { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { title: game.i18n.localize('DAGGERHEART.ACTORS.Character.experienceDataRemoveConfirmation.title') @@ -92,8 +97,15 @@ export default class DHCharacterSettings extends DHBaseActorSettings { content: game.i18n.localize('DAGGERHEART.ACTORS.Character.experienceDataRemoveConfirmation.text') }); if (!confirmed) return; + } - relinkData.forEach(data => { + if (relinkAchievementData.length > 0) { + relinkAchievementData.forEach(data => { + updates[`system.levelData.levelups.${data.levelKey}.achievements.experiences.-=${data.experience}`] = + null; + }); + } else if (relinkSelectionData.length > 0) { + relinkSelectionData.forEach(data => { updates[`system.levelData.levelups.${data.levelKey}.selections`] = this.actor.system.levelData.levelups[ data.levelKey ].selections.reduce((acc, selection, index) => { diff --git a/module/applications/sheets-configs/companion-settings.mjs b/module/applications/sheets-configs/companion-settings.mjs index fed70c56..6791c4c7 100644 --- a/module/applications/sheets-configs/companion-settings.mjs +++ b/module/applications/sheets-configs/companion-settings.mjs @@ -10,6 +10,8 @@ export default class DHCompanionSettings extends DHBaseActorSettings { classes: ['companion-settings'], position: { width: 455, height: 'auto' }, actions: { + addExperience: DHCompanionSettings.#addExperience, + removeExperience: DHCompanionSettings.#removeExperience, levelUp: DHCompanionSettings.#levelUp } }; @@ -88,6 +90,38 @@ export default class DHCompanionSettings extends DHBaseActorSettings { if (!value) await this.actor.updateLevel(1); } + /** + * Adds a new experience entry to the actor. + * @type {ApplicationClickAction} + */ + static async #addExperience() { + const newExperience = { + name: 'Experience', + modifier: 0 + }; + await this.actor.update({ [`system.experiences.${foundry.utils.randomID()}`]: newExperience }); + } + + /** + * Removes an experience entry from the actor. + * @type {ApplicationClickAction} + */ + static async #removeExperience(_, target) { + const experience = this.actor.system.experiences[target.dataset.experience]; + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { + type: game.i18n.localize(`DAGGERHEART.GENERAL.Experience.single`), + name: experience.name + }) + }, + content: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.text', { name: experience.name }) + }); + if (!confirmed) return; + + await this.actor.update({ [`system.experiences.-=${target.dataset.experience}`]: null }); + } + /** * Opens the companion level-up dialog for the associated actor. * @type {ApplicationClickAction} diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 0c554855..bf901398 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -24,7 +24,12 @@ export default class DhCharacter extends BaseDataActor { return { ...super.defineSchema(), resources: new fields.SchemaField({ - hitPoints: resourceField(0, 'DAGGERHEART.GENERAL.HitPoints.plural', true), + hitPoints: resourceField( + 0, + 'DAGGERHEART.GENERAL.HitPoints.plural', + true, + 'DAGGERHEART.ACTORS.Character.maxHPBonus' + ), stress: resourceField(6, 'DAGGERHEART.GENERAL.stress', true), hope: resourceField(6, 'DAGGERHEART.GENERAL.hope') }), @@ -505,7 +510,7 @@ export default class DhCharacter extends BaseDataActor { } prepareBaseData() { - this.evasion = this.class.value?.system?.evasion ?? 0; + this.evasion += this.class.value?.system?.evasion ?? 0; const currentLevel = this.levelData.level.current; const currentTier = diff --git a/module/data/fields/actorField.mjs b/module/data/fields/actorField.mjs index 743adb91..b4c7f9b9 100644 --- a/module/data/fields/actorField.mjs +++ b/module/data/fields/actorField.mjs @@ -6,13 +6,14 @@ const attributeField = label => tierMarked: new fields.BooleanField({ initial: false }) }); -const resourceField = (max = 0, label, reverse = false) => +const resourceField = (max = 0, label, reverse = false, maxLabel) => new fields.SchemaField({ value: new fields.NumberField({ initial: 0, min: 0, integer: true, label }), max: new fields.NumberField({ initial: max, integer: true, - label: game.i18n.format('DAGGERHEART.GENERAL.maxWithThing', { thing: game.i18n.localize(label) }) + label: + maxLabel ?? game.i18n.format('DAGGERHEART.GENERAL.maxWithThing', { thing: game.i18n.localize(label) }) }), isReversed: new fields.BooleanField({ initial: reverse }) }); diff --git a/styles/less/dialog/character-creation/selections-container.less b/styles/less/dialog/character-creation/selections-container.less index 0c13fae9..103418ed 100644 --- a/styles/less/dialog/character-creation/selections-container.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -263,24 +263,35 @@ gap: 8px; .experience-container { - position: relative; display: flex; - align-items: center; + flex-direction: column; + gap: 5px; - .experience-description { - border-color: light-dark(@dark-blue, @golden); - padding-right: 24px; - } - - .experience-value { - position: absolute; - right: 0; - width: 22px; - border-left: 1px solid light-dark(@dark-blue, @golden); - height: 100%; + .experience-inner-container { + position: relative; display: flex; align-items: center; - justify-content: center; + + .experience-description { + border-color: light-dark(@dark-blue, @golden); + padding-right: 24px; + } + + .experience-value { + position: absolute; + right: 0; + width: 22px; + border-left: 1px solid light-dark(@dark-blue, @golden); + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + } + + textarea { + width: 100%; + resize: none; } } } diff --git a/styles/less/sheets/actors/character/header.less b/styles/less/sheets/actors/character/header.less index f9511207..060fa59f 100644 --- a/styles/less/sheets/actors/character/header.less +++ b/styles/less/sheets/actors/character/header.less @@ -196,6 +196,7 @@ .character-downtime-container { display: flex; + align-items: center; gap: 2px; button { diff --git a/styles/less/sheets/actors/character/sheet.less b/styles/less/sheets/actors/character/sheet.less index 60fc6835..421b102f 100644 --- a/styles/less/sheets/actors/character/sheet.less +++ b/styles/less/sheets/actors/character/sheet.less @@ -18,6 +18,7 @@ } .character-header-sheet { + position: relative; grid-row: 1; grid-column: 2; } diff --git a/templates/characterCreation/setupTabs/experience.hbs b/templates/characterCreation/setupTabs/experience.hbs index 46c5b754..f8369edd 100644 --- a/templates/characterCreation/setupTabs/experience.hbs +++ b/templates/characterCreation/setupTabs/experience.hbs @@ -9,8 +9,12 @@
{{#each experience.values as |experience id|}}
- -
{{numberFormat this.value sign=true}}
+
+ +
{{numberFormat this.value sign=true}}
+
+ +
{{/each}}
diff --git a/templates/sheets-settings/character-settings/details.hbs b/templates/sheets-settings/character-settings/details.hbs index b6bf53dc..569e8b12 100644 --- a/templates/sheets-settings/character-settings/details.hbs +++ b/templates/sheets-settings/character-settings/details.hbs @@ -8,7 +8,7 @@
- {{#each document.system.traits as | trait key |}} + {{#each document._source.system.traits as | trait key |}}
{{localize (concat "DAGGERHEART.CONFIG.Traits." key ".name" )}}
@@ -22,13 +22,18 @@ {{localize 'DAGGERHEART.GENERAL.basics'}}
- {{formGroup systemFields.resources.fields.hitPoints.fields.value value=document.system.resources.hitPoints.value localize=true}} - {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document.system.resources.hitPoints.max localize=true}} + {{formGroup systemFields.resources.fields.hitPoints.fields.value value=document._source.system.resources.hitPoints.value localize=true}} + + {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document._source.system.resources.hitPoints.max localize=true}} + - {{formGroup systemFields.resources.fields.stress.fields.value value=document.system.resources.stress.value localize=true}} - {{formGroup systemFields.resources.fields.stress.fields.max value=document.system.resources.stress.max localize=true}} + {{formGroup systemFields.resources.fields.stress.fields.value value=document._source.system.resources.stress.value localize=true}} + {{formGroup systemFields.resources.fields.stress.fields.max value=document._source.system.resources.stress.max localize=true}} - {{formGroup systemFields.proficiency value=document.proficiency localize=true}} + {{formGroup systemFields.proficiency value=document._source.system.proficiency localize=true}} + + {{formGroup systemFields.evasion value=document._source.system.evasion label="DAGGERHEART.ACTORS.Character.maxEvasionBonus" localize=true}} +
\ No newline at end of file diff --git a/templates/sheets-settings/character-settings/experiences.hbs b/templates/sheets-settings/character-settings/experiences.hbs index 07d3a7bf..9aebc2c3 100644 --- a/templates/sheets-settings/character-settings/experiences.hbs +++ b/templates/sheets-settings/character-settings/experiences.hbs @@ -10,7 +10,7 @@
{{localize tabs.experiences.label}}
    - {{#each document.system.experiences as |experience key|}} + {{#each document._source.system.experiences as |experience key|}}
  • diff --git a/templates/sheets-settings/companion-settings/attack.hbs b/templates/sheets-settings/companion-settings/attack.hbs index 359536b6..bebe40b3 100644 --- a/templates/sheets-settings/companion-settings/attack.hbs +++ b/templates/sheets-settings/companion-settings/attack.hbs @@ -18,4 +18,5 @@ {{/if}} {{/if}}
+ {{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack."}} \ No newline at end of file diff --git a/templates/sheets-settings/companion-settings/experiences.hbs b/templates/sheets-settings/companion-settings/experiences.hbs index a484c25b..9aebc2c3 100644 --- a/templates/sheets-settings/companion-settings/experiences.hbs +++ b/templates/sheets-settings/companion-settings/experiences.hbs @@ -3,16 +3,24 @@ data-tab='{{tabs.experiences.id}}' data-group='{{tabs.experiences.group}}' > + +
{{localize tabs.experiences.label}}
    - {{#each document.system.experiences as |experience key|}} + {{#each document._source.system.experiences as |experience key|}}
  • - - +
    + + + {{#unless @root.levelupAuto}}{{/unless}} +
    + +
  • {{/each}}
- \ No newline at end of file diff --git a/templates/sheets/actors/adversary/header.hbs b/templates/sheets/actors/adversary/header.hbs index a7cfa3a6..7adc1583 100644 --- a/templates/sheets/actors/adversary/header.hbs +++ b/templates/sheets/actors/adversary/header.hbs @@ -36,7 +36,7 @@
{{> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}} -
diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs index c7e8fd2e..57a86d34 100644 --- a/templates/sheets/actors/character/header.hbs +++ b/templates/sheets/actors/character/header.hbs @@ -12,7 +12,6 @@

- {{#if (or document.system.needsCharacterSetup document.system.levelData.canLevelUp)}}
{{> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}} -