diff --git a/lang/en.json b/lang/en.json index bf2f0fc3..65bd866f 100755 --- a/lang/en.json +++ b/lang/en.json @@ -1549,7 +1549,9 @@ "foreground": "Foreground", "background": "Background", "outline": "Outline", - "edge": "Edge" + "edge": "Edge", + "texture": "Texture", + "colorset": "Colorset" } }, "variantRules": { diff --git a/module/applications/settings/appearanceSettings.mjs b/module/applications/settings/appearanceSettings.mjs index 78f067c7..a03bef9a 100644 --- a/module/applications/settings/appearanceSettings.mjs +++ b/module/applications/settings/appearanceSettings.mjs @@ -36,10 +36,37 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App } }; + /** @inheritdoc */ + static TABS = { + diceSoNice: { + tabs: [ + { id: 'hope', label: 'DAGGERHEART.GENERAL.hope' }, + { id: 'fear', label: 'DAGGERHEART.GENERAL.fear' }, + { id: 'advantage', label: 'DAGGERHEART.GENERAL.Advantage.full' }, + { id: 'disadvantage', label: 'DAGGERHEART.GENERAL.Advantage.full' } + ], + initial: 'hope' + } + }; + + changeTab(tab, group, options) { + super.changeTab(tab, group, options); + + this.render(); + } + async _prepareContext(_options) { const context = await super._prepareContext(_options); context.settingFields = this.settings; + context.diceSoNiceTextures = game.dice3d?.exports?.TEXTURELIST ?? {}; + context.diceSoNiceColorsets = game.dice3d?.exports?.COLORSETS ?? {}; + context.diceTab = { + key: this.tabGroups.diceSoNice, + source: this.settings._source.diceSoNice[this.tabGroups.diceSoNice], + fields: this.settings.schema.fields.diceSoNice.fields[this.tabGroups.diceSoNice].fields + }; + return context; } @@ -65,4 +92,13 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App this.close(); } + + _getTabs(tabs) { + for (const v of Object.values(tabs)) { + v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; + v.cssClass = v.active ? 'active' : ''; + } + + return tabs; + } } diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 4fe4b5e3..9d5f6a45 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -517,9 +517,10 @@ export default class CharacterSheet extends DHBaseActorSheet { const item = getDocFromElement(event.currentTarget); if (!item) return; - const max = item.system.resource.max ? itemAbleRollParse(item.system.resource.max, this.document, item) : null; + const max = event.currentTarget.max ? Number(event.currentTarget.max) : null; const value = max ? Math.min(Number(event.currentTarget.value), max) : event.currentTarget.value; await item.update({ 'system.resource.value': value }); + this.render(); } async updateItemQuantity(event) { @@ -527,6 +528,7 @@ export default class CharacterSheet extends DHBaseActorSheet { if (!item) return; await item.update({ 'system.quantity': event.currentTarget.value }); + this.render(); } async updateArmorMarks(event) { diff --git a/module/data/fields/actorField.mjs b/module/data/fields/actorField.mjs index 0b1113fb..5fde9394 100644 --- a/module/data/fields/actorField.mjs +++ b/module/data/fields/actorField.mjs @@ -8,7 +8,7 @@ const attributeField = label => const resourceField = (max = 0, label, reverse = false) => new fields.SchemaField({ - value: new fields.NumberField({ initial: 0, integer: true, label }), + value: new fields.NumberField({ initial: 0, min: 0, integer: true, label }), max: new fields.NumberField({ initial: max, integer: true }), isReversed: new fields.BooleanField({ initial: reverse }) }); diff --git a/module/data/settings/Appearance.mjs b/module/data/settings/Appearance.mjs index d8b4c687..81865f10 100644 --- a/module/data/settings/Appearance.mjs +++ b/module/data/settings/Appearance.mjs @@ -20,25 +20,33 @@ export default class DhAppearance extends foundry.abstract.DataModel { foreground: new fields.ColorField({ required: true, initial: '#ffffff' }), background: new fields.ColorField({ required: true, initial: '#ffe760' }), outline: new fields.ColorField({ required: true, initial: '#000000' }), - edge: new fields.ColorField({ required: true, initial: '#ffffff' }) + edge: new fields.ColorField({ required: true, initial: '#ffffff' }), + texture: new fields.StringField({ initial: 'bloodmoon' }), + colorset: new fields.StringField({ initial: 'inspired' }) }), fear: new fields.SchemaField({ foreground: new fields.ColorField({ required: true, initial: '#000000' }), background: new fields.ColorField({ required: true, initial: '#0032b1' }), outline: new fields.ColorField({ required: true, initial: '#ffffff' }), - edge: new fields.ColorField({ required: true, initial: '#000000' }) + edge: new fields.ColorField({ required: true, initial: '#000000' }), + texture: new fields.StringField({ initial: 'bloodmoon' }), + colorset: new fields.StringField({ initial: 'inspired' }) }), advantage: new fields.SchemaField({ foreground: new fields.ColorField({ required: true, initial: '#ffffff' }), background: new fields.ColorField({ required: true, initial: '#008000' }), outline: new fields.ColorField({ required: true, initial: '#000000' }), - edge: new fields.ColorField({ required: true, initial: '#ffffff' }) + edge: new fields.ColorField({ required: true, initial: '#ffffff' }), + texture: new fields.StringField({ initial: 'bloodmoon' }), + colorset: new fields.StringField({ initial: 'inspired' }) }), disadvantage: new fields.SchemaField({ foreground: new fields.ColorField({ required: true, initial: '#000000' }), background: new fields.ColorField({ required: true, initial: '#b30000' }), outline: new fields.ColorField({ required: true, initial: '#ffffff' }), - edge: new fields.ColorField({ required: true, initial: '#000000' }) + edge: new fields.ColorField({ required: true, initial: '#000000' }), + texture: new fields.StringField({ initial: 'bloodmoon' }), + colorset: new fields.StringField({ initial: 'inspired' }) }) }), showGenericStatusEffects: new fields.BooleanField({ diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 2fa34b63..67a5e0b3 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -568,13 +568,7 @@ export default class DhpActor extends Actor { } convertDamageToThreshold(damage) { - return damage >= this.system.damageThresholds.severe - ? 3 - : damage >= this.system.damageThresholds.major - ? 2 - : damage >= this.system.damageThresholds.minor - ? 1 - : 0; + return damage >= this.system.damageThresholds.severe ? 3 : damage >= this.system.damageThresholds.major ? 2 : 1; } convertStressDamageToHP(resources) { diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 9e769d2e..751b2c38 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -48,8 +48,8 @@ export default class RegisterHandlebarsHelpers { static rollParsed(value, actor, item, numerical) { const isNumerical = typeof numerical === 'boolean' ? numerical : false; - const result = itemAbleRollParse(value, actor, item); - return isNumerical && !result ? 0 : result; + const result = itemAbleRollParse(value, actor.getRollData(), item); + return isNumerical ? (!result ? 0 : Number(result)) : result; } static setVar(name, value, context) { diff --git a/styles/less/dialog/damage-reduction/damage-reduction-container.less b/styles/less/dialog/damage-reduction/damage-reduction-container.less index 25ca5ff9..7dab4f5d 100644 --- a/styles/less/dialog/damage-reduction/damage-reduction-container.less +++ b/styles/less/dialog/damage-reduction/damage-reduction-container.less @@ -46,10 +46,6 @@ display: flex; gap: 2px; - &:not(:last-child) { - margin-right: 8px; - } - .mark-container { cursor: pointer; border: 1px solid light-dark(@dark-blue, @golden); @@ -62,6 +58,10 @@ justify-content: center; opacity: 0.4; + &:not(:last-child) { + margin-right: 8px; + } + &.selected { opacity: 1; } diff --git a/templates/settings/appearance-settings.hbs b/templates/settings/appearance-settings.hbs index f297a28f..c31ac4b2 100644 --- a/templates/settings/appearance-settings.hbs +++ b/templates/settings/appearance-settings.hbs @@ -14,30 +14,56 @@