diff --git a/lang/en.json b/lang/en.json
index f7d49a04..5fc2cef9 100755
--- a/lang/en.json
+++ b/lang/en.json
@@ -1891,7 +1891,7 @@
"armor": {
"newArmorEffect": "Armor Effect",
"FIELDS": {
- "armorInteraction": {
+ "interaction": {
"label": "Armor Interaction",
"hint": "Does the character wearing armor suppress this effect?"
}
diff --git a/module/applications/dialogs/damageReductionDialog.mjs b/module/applications/dialogs/damageReductionDialog.mjs
index 5e858e4b..50225528 100644
--- a/module/applications/dialogs/damageReductionDialog.mjs
+++ b/module/applications/dialogs/damageReductionDialog.mjs
@@ -27,11 +27,11 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
true
);
const armor = orderedArmorEffects.reduce((acc, effect) => {
- const { value, max } = effect.system.armorData;
+ const { current, max } = effect.system.armorData;
acc.push({
effect: effect,
marks: [...Array(max).keys()].reduce((acc, _, index) => {
- const spent = index < value;
+ const spent = index < current;
acc[foundry.utils.randomID()] = { selected: false, disabled: spent, spent };
return acc;
}, {})
diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs
index e4a18831..9f970e1d 100644
--- a/module/applications/sheets-configs/activeEffectConfig.mjs
+++ b/module/applications/sheets-configs/activeEffectConfig.mjs
@@ -154,6 +154,10 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
htmlElement
.querySelector('.armor-change-checkbox')
?.addEventListener('change', this.armorChangeToggle.bind(this));
+
+ htmlElement
+ .querySelector('.armor-damage-thresholds-checkbox')
+ ?.addEventListener('change', this.armorDamageThresholdToggle.bind(this));
}
async _prepareContext(options) {
@@ -190,23 +194,14 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
}));
break;
case 'changes':
- const fields = this.document.system.schema.fields.changes.element.fields;
-
const singleTypes = ['armor'];
- const { base, ...typedChanges } = context.source.changes.reduce((acc, change, index) => {
- const type = CONFIG.DH.GENERAL.baseActiveEffectModes[change.type] ? 'base' : change.type;
- if (singleTypes.includes(type)) {
- acc[type] = { ...change, index };
- } else {
- if (!acc[type]) acc[type] = [];
- acc[type].push({ ...change, index });
+ const typedChanges = context.source.changes.reduce((acc, change, index) => {
+ if (singleTypes.includes(change.type)) {
+ acc[change.type] = { ...change, index };
}
-
return acc;
}, {});
- partContext.changes = await Promise.all(
- foundry.utils.deepClone(base ?? []).map(c => this._prepareChangeContext(c, fields))
- );
+ partContext.changes = partContext.changes.filter(c => !!c);
partContext.typedChanges = typedChanges;
break;
}
@@ -238,29 +233,51 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
return this.submit({ updateData: { system: { changes } } });
}
- _prepareChangeContext(change, fields) {
+ armorDamageThresholdToggle(event) {
+ const submitData = this._processFormData(null, this.form, new FormDataExtended(this.form));
+ const changes = Object.values(submitData.system?.changes ?? {});
+ const index = Number(event.target.dataset.index);
+ if (event.target.checked) {
+ changes[index].value.damageThresholds = { major: 0, severe: 0 };
+ } else {
+ changes[index].value.damageThresholds = null;
+ }
+
+ return this.submit({ updateData: { system: { changes } } });
+ }
+
+ /** @inheritdoc */
+ _renderChange(context) {
+ const { change, index, defaultPriority } = context;
+ if (!(change.type in CONFIG.DH.GENERAL.baseActiveEffectModes)) return null;
+
+ const changeTypesSchema = this.document.system.schema.fields.changes.element.types;
+ const fields = context.fields ?? (changeTypesSchema[change.type] ?? changeTypesSchema.add).fields;
if (typeof change.value !== 'string') change.value = JSON.stringify(change.value);
- const defaultPriority = game.system.api.documents.DhActiveEffect.CHANGE_TYPES[change.type]?.defaultPriority;
Object.assign(
change,
['key', 'type', 'value', 'priority'].reduce((paths, fieldName) => {
- paths[`${fieldName}Path`] = `system.changes.${change.index}.${fieldName}`;
+ paths[`${fieldName}Path`] = `system.changes.${index}.${fieldName}`;
return paths;
}, {})
);
return (
game.system.api.documents.DhActiveEffect.CHANGE_TYPES[change.type].render?.(
change,
- change.index,
+ index,
defaultPriority
) ??
foundry.applications.handlebars.renderTemplate(
'systems/daggerheart/templates/sheets/activeEffect/change.hbs',
{
change,
- index: change.index,
+ index,
defaultPriority,
- fields
+ fields,
+ types: Object.keys(CONFIG.DH.GENERAL.baseActiveEffectModes).reduce((r, key) => {
+ r[key] = CONFIG.DH.GENERAL.baseActiveEffectModes[key].label;
+ return r;
+ }, {})
}
)
);
diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs
index bddbca62..bfcc13a2 100644
--- a/module/applications/sheets/actors/character.mjs
+++ b/module/applications/sheets/actors/character.mjs
@@ -1003,16 +1003,16 @@ export default class CharacterSheet extends DHBaseActorSheet {
const effect = await foundry.utils.fromUuid(event.target.dataset.uuid);
const armorChange = effect.system.armorChange;
if (!armorChange) return;
- const value = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0);
+ const current = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0);
const newChanges = effect.system.changes.map(change => ({
...change,
- value: change.type === 'armor' ? value : change.value
+ value: change.type === 'armor' ? { ...change.value, current } : change.value
}));
- event.target.value = value;
+ event.target.value = current;
const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress');
- progressBar.value = value;
+ progressBar.value = current;
await effect.update({ 'system.changes': newChanges });
}
@@ -1023,27 +1023,22 @@ export default class CharacterSheet extends DHBaseActorSheet {
const armorChange = effect.system.armorChange;
if (!armorChange) return;
- const { value } = effect.system.armorData;
+ const { current } = effect.system.armorData;
const inputValue = Number.parseInt(target.dataset.value);
- const decreasing = value >= inputValue;
- const newValue = decreasing ? inputValue - 1 : inputValue;
+ const decreasing = current >= inputValue;
+ const newCurrent = decreasing ? inputValue - 1 : inputValue;
const newChanges = effect.system.changes.map(change => ({
...change,
- value: change.type === 'armor' ? newValue : change.value
+ value: change.type === 'armor' ? { ...change.value, current: newCurrent } : change.value
}));
const container = target.closest('.slot-bar');
for (const armorSlot of container.querySelectorAll('.armor-slot i')) {
- const index = Number.parseInt(armorSlot.dataset.index);
- if (decreasing && index >= newValue) {
- armorSlot.classList.remove('fa-shield');
- armorSlot.classList.add('fa-shield-halved');
- } else if (!decreasing && index < newValue) {
- armorSlot.classList.add('fa-shield');
- armorSlot.classList.remove('fa-shield-halved');
- }
+ const marked = !decreasing && Number.parseInt(armorSlot.dataset.index) < newCurrent;
+ armorSlot.classList.toggle('fa-shield', marked);
+ armorSlot.classList.toggle('fa-shield-halved', !marked);
}
await effect.update({ 'system.changes': newChanges });
diff --git a/module/applications/sheets/items/armor.mjs b/module/applications/sheets/items/armor.mjs
index 93325405..46d03ede 100644
--- a/module/applications/sheets/items/armor.mjs
+++ b/module/applications/sheets/items/armor.mjs
@@ -51,8 +51,8 @@ export default class ArmorSheet extends ItemAttachmentSheet(DHBaseItemSheet) {
context.armorScore = this.document.system.armorData.max;
break;
case 'effects':
- context.effects.actives = context.effects.actives.filter(x => x.type !== 'armor');
- context.effects.inactives = context.effects.actives.filter(x => x.type !== 'armor');
+ context.effects.actives = context.effects.actives.filter(x => !x.system.armorData);
+ context.effects.inactives = context.effects.inactives.filter(x => !x.system.armorData);
break;
}
@@ -64,7 +64,7 @@ export default class ArmorSheet extends ItemAttachmentSheet(DHBaseItemSheet) {
const armorEffect = this.document.system.armorEffect;
if (Number.isNaN(value) || !armorEffect) return;
- await armorEffect.system.armorChange.typeData.updateArmorMax(value);
+ await armorEffect.system.armorChange.updateArmorMax(value);
this.render();
}
diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs
index fc87b353..81ddb4ad 100644
--- a/module/data/activeEffect/baseEffect.mjs
+++ b/module/data/activeEffect/baseEffect.mjs
@@ -12,29 +12,41 @@
* "Anything that uses another data model value as its value": +1 - Effects that increase traits have to be calculated first at Base priority. (EX: Raise evasion by half your agility)
*/
+import { getScrollTextData } from '../../helpers/utils.mjs';
import { changeTypes } from './_module.mjs';
export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
+ const baseChanges = Object.keys(CONFIG.DH.GENERAL.baseActiveEffectModes).reduce((r, type) => {
+ r[type] = new fields.SchemaField({
+ key: new fields.StringField({ required: true }),
+ type: new fields.StringField({
+ required: true,
+ choices: [type],
+ initial: type,
+ validate: BaseEffect.#validateType
+ }),
+ value: new fields.AnyField({
+ required: true,
+ nullable: true,
+ serializable: true,
+ initial: ''
+ }),
+ phase: new fields.StringField({ required: true, blank: false, initial: 'initial' }),
+ priority: new fields.NumberField()
+ });
+ return r;
+ }, {});
+
return {
...super.defineSchema(),
changes: new fields.ArrayField(
- new fields.SchemaField({
- key: new fields.StringField({ required: true }),
- type: new fields.StringField({
- required: true,
- blank: false,
- choices: CONFIG.DH.GENERAL.activeEffectModes,
- initial: CONFIG.DH.GENERAL.activeEffectModes.add.id,
- validate: BaseEffect.#validateType
- }),
- value: new fields.AnyField({ required: true, nullable: true, serializable: true, initial: '' }),
- phase: new fields.StringField({ required: true, blank: false, initial: 'initial' }),
- priority: new fields.NumberField(),
- typeData: new fields.TypedSchemaField(changeTypes, { nullable: true, initial: null })
- })
+ new fields.TypedSchemaField(
+ { ...changeTypes, ...baseChanges },
+ { initial: baseChanges.add.getInitialValue() }
+ )
),
duration: new fields.SchemaField({
type: new fields.StringField({
@@ -89,6 +101,12 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
return true;
}
+ get isSuppressed() {
+ for (const change of this.changes) {
+ if (change.isSuppressed) return true;
+ }
+ }
+
get armorChange() {
return this.changes.find(x => x.type === CONFIG.DH.GENERAL.activeEffectModes.armor.id);
}
@@ -97,7 +115,7 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
const armorChange = this.armorChange;
if (!armorChange) return null;
- return armorChange.typeData.getArmorData(armorChange);
+ return armorChange.getArmorData();
}
static getDefaultObject() {
@@ -119,4 +137,31 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
}
};
}
+
+ async _preUpdate(changed, options, userId) {
+ const allowed = await super._preUpdate(changed, options, userId);
+ if (allowed === false) return false;
+
+ const autoSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
+ if (
+ autoSettings.resourceScrollTexts &&
+ this.parent.actor?.type === 'character' &&
+ this.parent.actor.system.resources.armor
+ ) {
+ const newArmorTotal = (changed.system?.changes ?? []).reduce((acc, change) => {
+ if (change.type === 'armor') acc += change.value.current;
+ return acc;
+ }, 0);
+
+ const armorData = getScrollTextData(this.parent.actor, { value: newArmorTotal }, 'armor');
+ options.scrollingTextData = [armorData];
+ }
+ }
+
+ _onUpdate(changed, options, userId) {
+ super._onUpdate(changed, options, userId);
+
+ if (this.parent.actor && options.scrollingTextData)
+ this.parent.actor.queueScrollText(options.scrollingTextData);
+ }
}
diff --git a/module/data/activeEffect/changeTypes/armor.mjs b/module/data/activeEffect/changeTypes/armor.mjs
index 5f6047fd..f400d41b 100644
--- a/module/data/activeEffect/changeTypes/armor.mjs
+++ b/module/data/activeEffect/changeTypes/armor.mjs
@@ -2,39 +2,56 @@ import { itemAbleRollParse } from '../../../helpers/utils.mjs';
const fields = foundry.data.fields;
-export default class Armor extends foundry.abstract.DataModel {
+export default class ArmorChange extends foundry.abstract.DataModel {
static defineSchema() {
return {
- type: new fields.StringField({ required: true, initial: 'armor', blank: false }),
- max: new fields.StringField({
- required: true,
- nullable: false,
- initial: '1',
- label: 'DAGGERHEART.GENERAL.max'
- }),
- armorInteraction: new fields.StringField({
- required: true,
- choices: CONFIG.DH.GENERAL.activeEffectArmorInteraction,
- initial: CONFIG.DH.GENERAL.activeEffectArmorInteraction.none.id,
- label: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.armorInteraction.label',
- hint: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.armorInteraction.hint'
+ type: new fields.StringField({ required: true, choices: ['armor'], initial: 'armor' }),
+ priority: new fields.NumberField(),
+ phase: new fields.StringField({ required: true, blank: false, initial: 'initial' }),
+ value: new fields.SchemaField({
+ current: new fields.NumberField({ integer: true, min: 0, initial: 0 }),
+ max: new fields.StringField({
+ required: true,
+ nullable: false,
+ initial: '1',
+ label: 'DAGGERHEART.GENERAL.max'
+ }),
+ damageThresholds: new fields.SchemaField(
+ {
+ major: new fields.StringField({
+ initial: '0',
+ label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold'
+ }),
+ severe: new fields.StringField({
+ initial: '0',
+ label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold'
+ })
+ },
+ { nullable: true, initial: null }
+ ),
+ interaction: new fields.StringField({
+ required: true,
+ choices: CONFIG.DH.GENERAL.activeEffectArmorInteraction,
+ initial: CONFIG.DH.GENERAL.activeEffectArmorInteraction.none.id,
+ label: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.label',
+ hint: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.hint'
+ })
})
};
}
static changeEffect = {
label: 'Armor',
- defaultPriortiy: 20,
+ defaultPriority: 20,
handler: (actor, change, _options, _field, replacementData) => {
- const parsedMax = itemAbleRollParse(change.typeData.max, actor, change.effect.parent);
-
+ const parsedMax = itemAbleRollParse(change.value.max, actor, change.effect.parent);
game.system.api.documents.DhActiveEffect.applyChange(
actor,
{
...change,
key: 'system.armorScore.value',
type: CONFIG.DH.GENERAL.activeEffectModes.add.id,
- value: change.value
+ value: change.value.current
},
replacementData
);
@@ -48,13 +65,52 @@ export default class Armor extends foundry.abstract.DataModel {
},
replacementData
);
+
+ if (change.value.damageThresholds) {
+ const getThresholdValue = value => {
+ const parsed = itemAbleRollParse(value, actor, change.effect.parent);
+ const roll = new Roll(parsed).evaluateSync();
+ return roll ? (roll.isDeterministic ? roll.total : null) : null;
+ };
+ const major = getThresholdValue(change.value.damageThresholds.major);
+ const severe = getThresholdValue(change.value.damageThresholds.severe);
+
+ if (major) {
+ game.system.api.documents.DhActiveEffect.applyChange(
+ actor,
+ {
+ ...change,
+ key: 'system.damageThresholds.major',
+ type: CONFIG.DH.GENERAL.activeEffectModes.override.id,
+ priority: 50,
+ value: major
+ },
+ replacementData
+ );
+ }
+
+ if (severe) {
+ game.system.api.documents.DhActiveEffect.applyChange(
+ actor,
+ {
+ ...change,
+ key: 'system.damageThresholds.severe',
+ type: CONFIG.DH.GENERAL.activeEffectModes.override.id,
+ priority: 50,
+ value: severe
+ },
+ replacementData
+ );
+ }
+ }
+
return {};
},
render: null
};
get isSuppressed() {
- switch (this.armorInteraction) {
+ switch (this.value.interaction) {
case CONFIG.DH.GENERAL.activeEffectArmorInteraction.active.id:
return !this.parent.parent?.actor.system.armor;
case CONFIG.DH.GENERAL.activeEffectArmorInteraction.inactive.id:
@@ -64,15 +120,12 @@ export default class Armor extends foundry.abstract.DataModel {
}
}
- static getInitialValue(locked) {
+ static getInitialValue() {
return {
- key: 'Armor',
type: CONFIG.DH.GENERAL.activeEffectModes.armor.id,
- value: 0,
- typeData: {
- type: 'armor',
- max: 0,
- locked
+ value: {
+ current: 0,
+ max: 0
},
phase: 'initial',
priority: 20
@@ -84,22 +137,22 @@ export default class Armor extends foundry.abstract.DataModel {
name: game.i18n.localize('DAGGERHEART.EFFECTS.ChangeTypes.armor.newArmorEffect'),
img: 'icons/equipment/chest/breastplate-helmet-metal.webp',
system: {
- changes: [Armor.getInitialValue(true)]
+ changes: [ArmorChange.getInitialValue()]
}
};
}
/* Helpers */
- getArmorData(parentChange) {
+ getArmorData() {
const actor = this.parent.parent?.actor?.type === 'character' ? this.parent.parent.actor : null;
- const maxParse = actor ? itemAbleRollParse(this.max, actor, this.parent.parent.parent) : null;
+ const maxParse = actor ? itemAbleRollParse(this.value.max, actor, this.parent.parent.parent) : null;
const maxRoll = maxParse ? new Roll(maxParse).evaluateSync() : null;
const maxEvaluated = maxRoll ? (maxRoll.isDeterministic ? maxRoll.total : null) : null;
return {
- value: parentChange.value,
- max: maxEvaluated ?? this.max
+ current: this.value.current,
+ max: maxEvaluated ?? this.value.max
};
}
@@ -107,8 +160,14 @@ export default class Armor extends foundry.abstract.DataModel {
const newChanges = [
...this.parent.changes.map(change => ({
...change,
- value: change.type === 'armor' ? Math.min(change.value, newMax) : change.value,
- typeData: change.type === 'armor' ? { ...change.typeData, max: newMax } : change.typeData
+ value:
+ change.type === 'armor'
+ ? {
+ ...change.value,
+ current: Math.min(change.value.current, newMax),
+ max: newMax
+ }
+ : change.value
}))
];
await this.parent.parent.update({ 'system.changes': newChanges });
diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs
index e69c4dc1..b8846a75 100644
--- a/module/data/actor/character.mjs
+++ b/module/data/actor/character.mjs
@@ -42,15 +42,15 @@ export default class DhCharacter extends DhCreature {
}),
evasion: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.evasion' }),
damageThresholds: new fields.SchemaField({
- severe: new fields.NumberField({
- integer: true,
- initial: 0,
- label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold'
- }),
major: new fields.NumberField({
integer: true,
initial: 0,
label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold'
+ }),
+ severe: new fields.NumberField({
+ integer: true,
+ initial: 0,
+ label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold'
})
}),
experiences: new fields.TypedObjectField(
@@ -479,14 +479,14 @@ export default class DhCharacter extends DhCreature {
for (const armorEffect of orderedEffects) {
let usedArmorChange = 0;
if (clear) {
- usedArmorChange -= armorEffect.system.armorChange.value;
+ usedArmorChange -= armorEffect.system.armorChange.value.current;
} else {
if (increasing) {
- const remainingArmor = armorEffect.system.armorData.max - armorEffect.system.armorData.value;
+ const remainingArmor = armorEffect.system.armorData.max - armorEffect.system.armorData.current;
usedArmorChange = Math.min(remainingChange, remainingArmor);
remainingChange -= usedArmorChange;
} else {
- const changeChange = Math.min(armorEffect.system.armorData.value, remainingChange);
+ const changeChange = Math.min(armorEffect.system.armorData.current, remainingChange);
usedArmorChange -= changeChange;
remainingChange -= changeChange;
}
@@ -503,7 +503,10 @@ export default class DhCharacter extends DhCreature {
...change,
value:
change.type === 'armor'
- ? armorEffect.system.armorChange.value + usedArmorChange
+ ? {
+ ...change.value,
+ current: armorEffect.system.armorChange.value.current + usedArmorChange
+ }
: change.value
}))
});
@@ -519,11 +522,12 @@ export default class DhCharacter extends DhCreature {
async updateArmorEffectValue({ uuid, value }) {
const effect = await foundry.utils.fromUuid(uuid);
+ const effectValue = effect.system.armorChange.value;
await effect.update({
'system.changes': [
{
...effect.system.armorChange,
- value: effect.system.armorChange.value + value
+ value: { ...effectValue, current: effectValue.current + value }
}
]
});
diff --git a/module/data/item/armor.mjs b/module/data/item/armor.mjs
index ba70e4b9..18d20e2e 100644
--- a/module/data/item/armor.mjs
+++ b/module/data/item/armor.mjs
@@ -28,9 +28,6 @@ export default class DHArmor extends AttachableItem {
actionIds: new fields.ArrayField(new fields.StringField({ required: true }))
})
),
- marks: new fields.SchemaField({
- value: new fields.NumberField({ initial: 0, integer: true })
- }),
baseThresholds: new fields.SchemaField({
major: new fields.NumberField({ integer: true, initial: 0 }),
severe: new fields.NumberField({ integer: true, initial: 0 })
diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs
index 5a16927a..25986afe 100644
--- a/module/data/item/base.mjs
+++ b/module/data/item/base.mjs
@@ -220,14 +220,6 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
addLinkedItemsDiff(changed.system?.features, this.features, options);
- const autoSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
- const armorChanged =
- changed.system?.marks?.value !== undefined && changed.system.marks.value !== this.marks.value;
- if (armorChanged && autoSettings.resourceScrollTexts && this.parent.parent?.type === 'character') {
- const armorData = getScrollTextData(this.parent.parent, changed.system.marks, 'armor');
- options.scrollingTextData = [armorData];
- }
-
if (changed.system?.actions) {
const triggersToRemove = Object.keys(changed.system.actions).reduce((acc, key) => {
const action = changed.system.actions[key];
diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs
index 043d7f33..07c68518 100644
--- a/module/documents/activeEffect.mjs
+++ b/module/documents/activeEffect.mjs
@@ -1,5 +1,5 @@
import { itemAbleRollParse } from '../helpers/utils.mjs';
-import { RefreshType, socketEvent } from '../systemRegistration/socket.mjs';
+import { RefreshType } from '../systemRegistration/socket.mjs';
export default class DhActiveEffect extends foundry.documents.ActiveEffect {
/* -------------------------------------------- */
@@ -155,11 +155,6 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect {
/* Methods */
/* -------------------------------------------- */
- /**@inheritdoc */
- static applyChange(actor, change, options) {
- super.applyChange(actor, change, options);
- }
-
/**@inheritdoc*/
static applyChangeField(model, change, field) {
change.value = Number.isNumeric(change.value)
@@ -168,7 +163,7 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect {
super.applyChangeField(model, change, field);
}
- _applyChangeUnguided(actor, change, changes, options) {
+ static _applyChangeUnguided(actor, change, changes, options) {
change.value = DhActiveEffect.getChangeValue(actor, change, change.effect);
super._applyChangeUnguided(actor, change, changes, options);
}
diff --git a/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json b/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json
index e328325d..cad6012e 100644
--- a/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json
+++ b/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json
@@ -94,15 +94,12 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "1",
- "armorInteraction": "active"
+ "interaction": "active"
}
}
]
diff --git a/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json b/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json
index 69d1a2b2..098f5f4c 100644
--- a/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json
+++ b/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json
@@ -21,20 +21,21 @@
"flags": {},
"effects": [
{
- "name": "Bare Bones Armor",
+ "name": "Bare Bones",
"type": "base",
"system": {
"changes": [
{
- "value": 0,
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "3 + @system.traits.strength.value",
- "armorInteraction": "inactive"
+ "interaction": "inactive",
+ "damageThresholds": {
+ "major": "9 + (@tier - 1) * 5 + max(0, (@tier -2) * 2 )",
+ "severe": "19 + (@tier - 1) * 5 + max(0, (@tier -2) * 2 )"
+ }
}
}
]
@@ -62,57 +63,6 @@
"compendiumSource": null
},
"_key": "!items.effects!l5D9kq901JDESaXw.FCsgz7Tdsw6QUzBs"
- },
- {
- "name": "Bare Bones",
- "type": "base",
- "system": {
- "changes": [
- {
- "key": "system.damageThresholds.major",
- "type": "add",
- "value": "9 + (@tier - 1) * 5 + max(0, (@tier -2) * 2 )",
- "priority": null,
- "phase": "initial"
- },
- {
- "key": "system.damageThresholds.severe",
- "type": "add",
- "value": "19 + (@tier - 1) * 5 + max(0, (@tier -2) * 2 )",
- "priority": null,
- "phase": "initial"
- }
- ],
- "rangeDependence": {
- "enabled": false,
- "type": "withinRange",
- "target": "hostile",
- "range": "melee"
- }
- },
- "_id": "8flPpWNoBeuFPFTK",
- "img": "icons/magic/control/buff-strength-muscle-damage-orange.webp",
- "disabled": false,
- "start": null,
- "duration": {
- "value": null,
- "units": "seconds",
- "expiry": null,
- "expired": false
- },
- "description": "
You use the following as your base damage thresholds:
Tier 1: 9/19
Tier 2: 11/24
Tier 3: 13/31
Tier 4: 15/38
",
- "origin": null,
- "tint": "#ffffff",
- "transfer": true,
- "statuses": [],
- "showIcon": 1,
- "folder": null,
- "sort": 0,
- "flags": {},
- "_stats": {
- "compendiumSource": null
- },
- "_key": "!items.effects!l5D9kq901JDESaXw.8flPpWNoBeuFPFTK"
}
],
"ownership": {
diff --git a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json
index 7852356b..fa247c89 100644
--- a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json
+++ b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json
@@ -263,13 +263,10 @@
},
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "1"
}
}
diff --git a/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json b/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json
index 870ff246..61c7ace8 100644
--- a/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json
+++ b/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json
@@ -95,13 +95,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "1"
}
}
diff --git a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json b/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json
index 1be3d76b..1a06285b 100644
--- a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json
+++ b/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json b/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json
index 60cc3da9..93b9d5b2 100644
--- a/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json
+++ b/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json
@@ -76,13 +76,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json b/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json
index c8bf64d5..be6c5070 100644
--- a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json
+++ b/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json b/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json
index 6597bea0..ca5fd9f1 100644
--- a/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json
+++ b/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json
@@ -33,13 +33,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json b/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json
index a5ac42ba..2844e96c 100644
--- a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json
+++ b/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json b/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json
index 12f9441c..d51ec961 100644
--- a/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json
+++ b/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json b/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json
index e1e8be0a..07b9150a 100644
--- a/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json
+++ b/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json b/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json
index e4a50d08..c4b2da7b 100644
--- a/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json
+++ b/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json b/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json
index d7a9e182..8d660958 100644
--- a/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json
+++ b/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json
@@ -70,13 +70,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json b/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json
index 91a58fcf..5f7137c5 100644
--- a/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json
+++ b/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json
@@ -96,13 +96,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "7"
}
}
diff --git a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json
index c217a626..da664058 100644
--- a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json
+++ b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json
@@ -72,13 +72,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json b/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json
index dfdefdcb..ea9c1d02 100644
--- a/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json
+++ b/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json
@@ -94,13 +94,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json b/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json
index 4a3bcdc9..7d96f091 100644
--- a/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json
+++ b/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json b/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json
index 4427c082..95b015cf 100644
--- a/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json
+++ b/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json
@@ -76,13 +76,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json b/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json
index a0bdf8d6..03ed23d8 100644
--- a/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json
+++ b/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "3"
}
}
diff --git a/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json b/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json
index 2bfc3ff6..7f024816 100644
--- a/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json
+++ b/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json
@@ -87,13 +87,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json b/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json
index 79c52596..26422d2c 100644
--- a/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json
+++ b/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json b/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json
index bbbd6183..6627bc15 100644
--- a/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json
+++ b/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json
@@ -76,13 +76,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json b/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json
index 6c32e3ca..b1ea88ff 100644
--- a/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json
+++ b/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json b/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json
index 26092645..5d7f9b93 100644
--- a/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json
+++ b/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json
@@ -33,13 +33,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json b/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json
index 756fccdc..5c87565f 100644
--- a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json
+++ b/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json
@@ -83,13 +83,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json b/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json
index 601cf23c..b6c9cb8b 100644
--- a/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json
+++ b/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json
@@ -33,13 +33,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "3"
}
}
diff --git a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json b/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json
index 867c2420..0e97ae17 100644
--- a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json
+++ b/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "7"
}
}
diff --git a/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json b/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json
index 2fb8c064..e9da0a8d 100644
--- a/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json
+++ b/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json
@@ -76,13 +76,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "7"
}
}
diff --git a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json b/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json
index 8ab2894d..5d82c736 100644
--- a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json
+++ b/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json b/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json
index 44c29bfb..c0890465 100644
--- a/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json
+++ b/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json
@@ -33,13 +33,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json b/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json
index db0c20d1..7ad68c23 100644
--- a/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json
+++ b/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json
@@ -71,13 +71,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json b/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json
index 55cc6eb8..5c853e44 100644
--- a/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json
+++ b/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json
@@ -63,13 +63,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json b/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json
index 2ca27f45..e3b813fb 100644
--- a/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json
+++ b/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json
@@ -70,13 +70,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json b/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json
index 54f6322e..c6a1c055 100644
--- a/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json
+++ b/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json
@@ -70,13 +70,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "4"
}
}
diff --git a/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json b/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json
index f40df5c7..3505176b 100644
--- a/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json
+++ b/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json
@@ -101,13 +101,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "8"
}
}
diff --git a/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json b/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json
index 8f15ae28..68b26346 100644
--- a/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json
+++ b/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json
@@ -76,13 +76,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json b/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json
index eb89421d..5114b1e2 100644
--- a/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json
+++ b/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json
@@ -63,13 +63,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "5"
}
}
diff --git a/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json b/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json
index 6e5f24bc..2388e647 100644
--- a/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json
+++ b/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json
@@ -63,13 +63,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "6"
}
}
diff --git a/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json b/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json
index 85321808..54800642 100644
--- a/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json
+++ b/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json
@@ -118,13 +118,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier"
}
}
diff --git a/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json b/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json
index 568e7ebc..a88749a8 100644
--- a/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json
+++ b/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json
@@ -156,13 +156,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier + 1"
}
}
diff --git a/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json b/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json
index 322682d9..65868950 100644
--- a/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json
+++ b/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json
@@ -118,13 +118,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier"
}
}
diff --git a/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json b/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json
index 70647216..64555dfa 100644
--- a/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json
+++ b/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json
@@ -156,13 +156,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier + 1"
}
}
diff --git a/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json b/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json
index 1adda37c..11994d3e 100644
--- a/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json
+++ b/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json
@@ -118,13 +118,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier"
}
}
diff --git a/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json b/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json
index 7e0d5374..85134d21 100644
--- a/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json
+++ b/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json
@@ -118,13 +118,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier"
}
}
diff --git a/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json b/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json
index 945678e5..772e9ca9 100644
--- a/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json
+++ b/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json
@@ -156,13 +156,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier + 1"
}
}
diff --git a/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json b/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json
index 987892b2..55e92f01 100644
--- a/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json
+++ b/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json
@@ -118,13 +118,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier"
}
}
diff --git a/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json b/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json
index fed95455..39c18b08 100644
--- a/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json
+++ b/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json
@@ -160,13 +160,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "1"
}
}
diff --git a/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json b/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json
index 5cf27983..e584b63c 100644
--- a/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json
+++ b/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json
@@ -156,13 +156,10 @@
"system": {
"changes": [
{
- "key": "Armor",
"type": "armor",
"phase": "initial",
"priority": 20,
- "value": 0,
- "typeData": {
- "type": "armor",
+ "value": {
"max": "ITEM.@system.tier + 1"
}
}
diff --git a/styles/less/sheets/activeEffects/activeEffects.less b/styles/less/sheets/activeEffects/activeEffects.less
index 077369cf..3f6526cb 100644
--- a/styles/less/sheets/activeEffects/activeEffects.less
+++ b/styles/less/sheets/activeEffects/activeEffects.less
@@ -50,7 +50,50 @@
header,
ol {
- grid-template-columns: 6rem 6rem 12rem 4rem;
+ grid-template-columns: 5rem 7rem 12rem 4rem;
+ }
+
+ .damage-thresholds-container {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+
+ .damage-threshold-title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+
+ &::before,
+ &::after {
+ content: '';
+ flex: 1;
+ height: 2px;
+ }
+
+ &::before {
+ background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, light-dark(@dark-blue, @golden) 100%);
+ }
+
+ &::after {
+ background: linear-gradient(90deg, light-dark(@dark-blue, @golden) 0%, rgba(0, 0, 0, 0) 100%);
+ }
+
+ span {
+ font-size: var(--font-size-18);
+ }
+ }
+
+ .form-group {
+ flex-direction: column;
+ gap: 0;
+
+ label {
+ color: inherit;
+ line-height: 16px;
+ }
+ }
}
}
}
diff --git a/templates/sheets/activeEffect/armor/details.hbs b/templates/sheets/activeEffect/armor/details.hbs
deleted file mode 100644
index 2b16560e..00000000
--- a/templates/sheets/activeEffect/armor/details.hbs
+++ /dev/null
@@ -1,20 +0,0 @@
-
\ No newline at end of file
diff --git a/templates/sheets/activeEffect/armor/footer.hbs b/templates/sheets/activeEffect/armor/footer.hbs
deleted file mode 100644
index 761189ff..00000000
--- a/templates/sheets/activeEffect/armor/footer.hbs
+++ /dev/null
@@ -1,3 +0,0 @@
-
\ No newline at end of file
diff --git a/templates/sheets/activeEffect/armor/settings.hbs b/templates/sheets/activeEffect/armor/settings.hbs
deleted file mode 100644
index 12ca2154..00000000
--- a/templates/sheets/activeEffect/armor/settings.hbs
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- {{localize "Armor"}}
-
- {{#each source.system.changes as |change index|}}
- {{formGroup @root.systemFields.changes.element.fields.value name=(concat 'system.changes.' index '.value') value=change.value localize=true}}
- {{formGroup @root.systemFields.changes.element.fields.max name=(concat 'system.changes.' index '.max') value=change.max localize=true}}
- {{/each}}
-
-
-
-
- {{localize "DAGGERHEART.GENERAL.general"}}
-
- {{formGroup @root.systemFields.armorInteraction name="system.armorInteraction" value=source.system.armorInteraction localize=true}}
-
-
\ No newline at end of file
diff --git a/templates/sheets/activeEffect/change.hbs b/templates/sheets/activeEffect/change.hbs
index 30f643b8..d7d396e4 100644
--- a/templates/sheets/activeEffect/change.hbs
+++ b/templates/sheets/activeEffect/change.hbs
@@ -3,7 +3,9 @@
- {{formInput fields.type name=change.typePath value=change.type localize=true}}
+
+ {{selectOptions types selected=change.type localize=true}}
+
{{formInput fields.value name=change.valuePath value=change.value elementType="input"}}
diff --git a/templates/sheets/activeEffect/changes.hbs b/templates/sheets/activeEffect/changes.hbs
index a699e951..47a48382 100644
--- a/templates/sheets/activeEffect/changes.hbs
+++ b/templates/sheets/activeEffect/changes.hbs
@@ -17,15 +17,7 @@
{{localize "DAGGERHEART.GENERAL.armor"}}
{{#if typedChanges.armor}}
-
- {{localize "EFFECT.FIELDS.changes.element.value.label"}}
- {{localize "DAGGERHEART.GENERAL.max"}}
- {{localize "DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.armorInteraction.label"}}
- {{localize "EFFECT.FIELDS.changes.element.priority.label"}}
-
-
- {{> "systems/daggerheart/templates/sheets/activeEffect/typeChanges/armorChange.hbs" typedChanges.armor fields=@root.systemFields.changes.element.fields}}
-
+ {{> "systems/daggerheart/templates/sheets/activeEffect/typeChanges/armorChange.hbs" typedChanges.armor fields=@root.systemFields.changes.element.types.armor.fields}}
{{/if}}
diff --git a/templates/sheets/activeEffect/typeChanges/armorChange.hbs b/templates/sheets/activeEffect/typeChanges/armorChange.hbs
index 6a04aba2..662a1294 100644
--- a/templates/sheets/activeEffect/typeChanges/armorChange.hbs
+++ b/templates/sheets/activeEffect/typeChanges/armorChange.hbs
@@ -1,10 +1,28 @@
-
-
-
-
-
- {{formInput fields.value name=(concat "system.changes." index ".value") value=value elementType="input" data-dtype="Number"}}
- {{formInput fields.typeData.types.armor.fields.max name=(concat "system.changes." index ".typeData.max") value=typeData.max data-dtype="Number"}}
- {{formInput fields.typeData.types.armor.fields.armorInteraction name=(concat "system.changes." index ".typeData.armorInteraction") value=typeData.armorInteraction localize=true}}
- {{formInput fields.priority name=(concat "system.changes." index ".priority") value=priority}}
-
\ No newline at end of file
+
+ {{localize "EFFECT.FIELDS.changes.element.value.label"}}
+ {{localize "DAGGERHEART.GENERAL.max"}}
+ {{localize "DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.label"}}
+ {{localize "EFFECT.FIELDS.changes.element.priority.label"}}
+
+
+
+
+
+ {{formInput fields.value.fields.current name=(concat "system.changes." index ".value.current") value=value.current data-dtype="Number"}}
+ {{formInput fields.value.fields.max name=(concat "system.changes." index ".value.max") value=value.max data-dtype="Number"}}
+ {{formInput fields.value.fields.interaction name=(concat "system.changes." index ".value.interaction") value=value.interaction localize=true}}
+ {{formInput fields.priority name=(concat "system.changes." index ".priority") value=priority}}
+
+
+
+
+ {{localize "DAGGERHEART.GENERAL.DamageThresholds.title"}}
+
+
+ {{#if value.damageThresholds}}
+
+ {{formGroup fields.value.fields.damageThresholds.fields.major name=(concat "system.changes." index ".value.damageThresholds.major") value=value.damageThresholds.major localize=true }}
+ {{formGroup fields.value.fields.damageThresholds.fields.severe name=(concat "system.changes." index ".value.damageThresholds.severe") value=value.damageThresholds.severe localize=true }}
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/templates/sheets/items/armor/header.hbs b/templates/sheets/items/armor/header.hbs
index d4306131..6d3bc0fb 100644
--- a/templates/sheets/items/armor/header.hbs
+++ b/templates/sheets/items/armor/header.hbs
@@ -9,7 +9,7 @@
{{localize "DAGGERHEART.ITEMS.Armor.baseScore"}}:
- {{source.system.baseScore}}
+ {{source.system.armorData.max}}
-
{{localize "DAGGERHEART.ITEMS.Armor.baseThresholds.base"}}:
{{source.system.baseThresholds.major}}
diff --git a/templates/ui/tooltip/armorManagement.hbs b/templates/ui/tooltip/armorManagement.hbs
index 20dab7d2..55d702b1 100644
--- a/templates/ui/tooltip/armorManagement.hbs
+++ b/templates/ui/tooltip/armorManagement.hbs
@@ -7,7 +7,7 @@