diff --git a/lang/en.json b/lang/en.json index 84fdaf18..32ea2227 100755 --- a/lang/en.json +++ b/lang/en.json @@ -188,7 +188,8 @@ "manualMulticlassSubclass": { "title": "Multiclass Subclass", "text": "Do you want to add this subclass as your multiclass subclass?" - } + }, + "cannotRemoveCoreExperience": "You are using Levelup Auto. You cannot remove an experience given to you by the rule progression." }, "Companion": { "FIELDS": { @@ -2115,6 +2116,10 @@ "resourceScrollTexts": { "label": "Show Resource Change Scrolltexts", "hint": "When a character is damaged, uses armor etc, a scrolling text will briefly appear by the token to signify this." + }, + "playerCanEditSheet": { + "label": "Players Can Manually Edit Character Settings", + "hint": "Players are allowed to access the manual Character Settings and change their statistics beyond the rules." } } }, diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index cdc80bef..649c7768 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -20,8 +20,8 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl class: this.character.system.class?.value ?? {}, subclass: this.character.system.class?.subclass ?? {}, experiences: { - [foundry.utils.randomID()]: { name: '', value: 2 }, - [foundry.utils.randomID()]: { name: '', value: 2 } + [foundry.utils.randomID()]: { name: '', value: 2, core: true }, + [foundry.utils.randomID()]: { name: '', value: 2, core: true } }, domainCards: { [foundry.utils.randomID()]: {}, @@ -588,12 +588,21 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl this.setup.class.system.inventory.take.filter(x => x) ); - await this.character.update({ - system: { - traits: this.setup.traits, - experiences: this.setup.experiences - } - }); + await this.character.update( + { + system: { + traits: this.setup.traits, + experiences: { + ...this.setup.experiences, + ...Object.keys(this.character.system.experiences).reduce((acc, key) => { + acc[`-=${key}`] = null; + return acc; + }, {}) + } + } + }, + { overwrite: true } + ); this.close(); } diff --git a/module/applications/levelup/characterLevelup.mjs b/module/applications/levelup/characterLevelup.mjs index 1ce2bceb..de28f241 100644 --- a/module/applications/levelup/characterLevelup.mjs +++ b/module/applications/levelup/characterLevelup.mjs @@ -289,7 +289,7 @@ export default class DhCharacterLevelUp extends LevelUpBase { const experience = Object.keys(this.actor.system.experiences).find( x => x === data ); - return this.actor.system.experiences[experience]?.description ?? ''; + return this.actor.system.experiences[experience]?.name ?? ''; }); advancement[choiceKey].push({ data: data, value: checkbox.value }); break; diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 457d949d..07046831 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -178,6 +178,13 @@ export default class CharacterSheet extends DHBaseActorSheet { async _preparePartContext(partId, context, options) { context = await super._preparePartContext(partId, context, options); switch (partId) { + case 'header': + const { playerCanEditSheet, levelupAuto } = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.Automation + ); + context.showSettings = game.user.isGM || !levelupAuto || (levelupAuto && playerCanEditSheet); + break; case 'loadout': await this._prepareLoadoutContext(context, options); break; @@ -188,6 +195,7 @@ export default class CharacterSheet extends DHBaseActorSheet { await this._prepareBiographyContext(context, options); break; } + return context; } diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 1c803eb4..b664929c 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -175,7 +175,6 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { const newValue = (action.uses.value ?? 0) + (increase ? 1 : -1); await action.update({ 'uses.value': Math.min(Math.max(newValue, 0), action.uses.max ?? 0) }); - this.render(); } /* -------------------------------------------- */ diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 613f82da..d4544d2c 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -68,7 +68,8 @@ export default class DhCharacter extends BaseDataActor { new fields.SchemaField({ name: new fields.StringField(), value: new fields.NumberField({ integer: true, initial: 0 }), - description: new fields.StringField() + description: new fields.StringField(), + core: new fields.BooleanField({ initial: false }) }) ), gold: new fields.SchemaField({ @@ -573,7 +574,10 @@ export default class DhCharacter extends BaseDataActor { case 'experience': selection.data.forEach(id => { const experience = this.experiences[id]; - if (experience) experience.value += selection.value; + if (experience) { + experience.value += selection.value; + experience.leveledUp = true; + } }); break; } @@ -620,6 +624,23 @@ export default class DhCharacter extends BaseDataActor { }; } + async _preUpdate(changes, options, userId) { + const allowed = await super._preUpdate(changes, options, userId); + if (allowed === false) return; + + /* The first two experiences are always marked as core */ + if (changes.system?.experiences && Object.keys(this.experiences).length < 2) { + const experiences = new Set(Object.keys(this.experiences)); + const changeExperiences = new Set(Object.keys(changes.system.experiences)); + const newExperiences = Array.from(changeExperiences.difference(experiences)); + + for (var i = 0; i < Math.min(newExperiences.length, 2 - experiences.size); i++) { + const experience = newExperiences[i]; + changes.system.experiences[experience].core = true; + } + } + } + async _preDelete() { if (this.companion) { this.companion.updateLevel(1); diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index d2842148..facaec17 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -45,6 +45,11 @@ export default class DhAutomation extends foundry.abstract.DataModel { required: true, initial: true, label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label' + }), + playerCanEditSheet: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.playerCanEditSheet.label' }) }; } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index ce9ffc89..910ec4f1 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -202,7 +202,8 @@ export default class DhpActor extends Actor { await this.update({ [`system.experiences.${experienceKey}`]: { name: experience.name, - value: experience.modifier + value: experience.modifier, + core: true } }); @@ -210,7 +211,8 @@ export default class DhpActor extends Actor { await this.system.companion.update({ [`system.experiences.${experienceKey}`]: { name: '', - value: experience.modifier + value: experience.modifier, + core: true } }); } @@ -559,8 +561,8 @@ export default class DhpActor extends Actor { updates.forEach( u => - (u.value = - u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value) + (u.value = + u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value) ); await this.modifyResource(updates); @@ -606,9 +608,9 @@ export default class DhpActor extends Actor { updates.forEach( u => - (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) - ? u.value * -1 - : u.value) + (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) + ? u.value * -1 + : u.value) ); await this.modifyResource(updates); diff --git a/styles/less/dialog/level-up/selections-container.less b/styles/less/dialog/level-up/selections-container.less index da5d5273..a13c9ff3 100644 --- a/styles/less/dialog/level-up/selections-container.less +++ b/styles/less/dialog/level-up/selections-container.less @@ -143,7 +143,8 @@ padding: 0 12px; } - .levelup-trait-increases { + .levelup-trait-increases, + .levelup-experience-increases { width: 100%; } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index f99646b7..7f8cdd94 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -495,7 +495,6 @@ border-radius: 6px; button { - padding: 6px 6px 6px 10px; border-radius: 3px 0px 0px 3px; color: light-dark(@dark-blue, @dark-blue); white-space: nowrap; @@ -506,7 +505,7 @@ color: light-dark(@dark-blue, @golden); } - &:last-child { + &:not(:first-child) { padding: 6px; background: light-dark(@dark-blue-10, @golden-secondary); border-radius: 0px 3px 3px 0px; diff --git a/styles/less/sheets-settings/adversary-settings/experiences.less b/styles/less/sheets-settings/adversary-settings/experiences.less index dab261a6..da5e750d 100644 --- a/styles/less/sheets-settings/adversary-settings/experiences.less +++ b/styles/less/sheets-settings/adversary-settings/experiences.less @@ -26,12 +26,19 @@ align-items: center; gap: 5px; - &.no-controls { - grid-template-columns: 3fr 1fr; - } + span { + display: flex; + justify-content: center; - a { - text-align: center; + a { + text-align: center; + + &.disabled { + i { + opacity: 0.4; + } + } + } } } diff --git a/system.json b/system.json index 470c7ff2..b6472122 100644 --- a/system.json +++ b/system.json @@ -5,7 +5,7 @@ "version": "0.0.1", "compatibility": { "minimum": "13", - "verified": "13.346", + "verified": "13.347", "maximum": "13" }, "authors": [ diff --git a/templates/settings/automation-settings.hbs b/templates/settings/automation-settings.hbs index 0d193869..9e9da6bb 100644 --- a/templates/settings/automation-settings.hbs +++ b/templates/settings/automation-settings.hbs @@ -12,6 +12,7 @@ {{formGroup settingFields.schema.fields.hordeDamage value=settingFields._source.hordeDamage localize=true}} {{formGroup settingFields.schema.fields.effects.fields.rangeDependent value=settingFields._source.effects.rangeDependent localize=true}} {{formGroup settingFields.schema.fields.levelupAuto value=settingFields._source.levelupAuto localize=true}} + {{formGroup settingFields.schema.fields.playerCanEditSheet value=settingFields._source.playerCanEditSheet localize=true}} {{formGroup settingFields.schema.fields.damageReductionRulesDefault value=settingFields._source.damageReductionRulesDefault localize=true}} {{formGroup settingFields.schema.fields.resourceScrollTexts value=settingFields._source.resourceScrollTexts localize=true}} diff --git a/templates/sheets-settings/character-settings/experiences.hbs b/templates/sheets-settings/character-settings/experiences.hbs index ef31c1cd..9d4aefe4 100644 --- a/templates/sheets-settings/character-settings/experiences.hbs +++ b/templates/sheets-settings/character-settings/experiences.hbs @@ -12,10 +12,15 @@