mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-04-21 23:13:39 +02:00
103 lines
4.3 KiB
JavaScript
103 lines
4.3 KiB
JavaScript
import { resourceField } from '../fields/actorField.mjs';
|
|
import BaseDataActor from './base.mjs';
|
|
|
|
export default class DhCreature extends BaseDataActor {
|
|
/**@inheritdoc */
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields;
|
|
|
|
return {
|
|
...super.defineSchema(),
|
|
resources: new fields.SchemaField({
|
|
...Object.values(CONFIG.DH.RESOURCE[this.metadata.type].all).reduce(
|
|
(acc, resource) => {
|
|
if (resource.max !== undefined) {
|
|
acc[resource.id] = resourceField(
|
|
resource.max,
|
|
resource.initial,
|
|
resource.label,
|
|
resource.maxLabel
|
|
);
|
|
} else {
|
|
acc[resource.id] = new fields.SchemaField(
|
|
{
|
|
value: new fields.NumberField({
|
|
initial: resource.initial,
|
|
min: resource.min,
|
|
integer: true,
|
|
label: resource.label
|
|
}),
|
|
isReversed: new fields.BooleanField({ initial: resource.reverse })
|
|
},
|
|
{ label: resource.label }
|
|
);
|
|
}
|
|
|
|
return acc;
|
|
},
|
|
{}
|
|
)
|
|
}),
|
|
advantageSources: new fields.ArrayField(new fields.StringField(), {
|
|
label: 'DAGGERHEART.ACTORS.Character.advantageSources.label',
|
|
hint: 'DAGGERHEART.ACTORS.Character.advantageSources.hint'
|
|
}),
|
|
disadvantageSources: new fields.ArrayField(new fields.StringField(), {
|
|
label: 'DAGGERHEART.ACTORS.Character.disadvantageSources.label',
|
|
hint: 'DAGGERHEART.ACTORS.Character.disadvantageSources.hint'
|
|
})
|
|
};
|
|
}
|
|
|
|
get isAutoVulnerableActive() {
|
|
const vulnerableAppliedByOther = this.parent.effects.some(
|
|
x => x.statuses.has('vulnerable') && !x.flags.daggerheart?.autoApplyFlagId
|
|
);
|
|
return !vulnerableAppliedByOther;
|
|
}
|
|
|
|
prepareDerivedData() {
|
|
super.prepareDerivedData();
|
|
const resources = CONFIG.DH.RESOURCE[this.metadata.type].all;
|
|
if (resources) {
|
|
for (const [key, value] of Object.entries(this.resources)) {
|
|
value.label = resources[key]?.label;
|
|
value.isReversed = resources[key]?.reverse;
|
|
}
|
|
}
|
|
}
|
|
|
|
async _preUpdate(changes, options, userId) {
|
|
const allowed = await super._preUpdate(changes, options, userId);
|
|
if (allowed === false) return;
|
|
|
|
const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
|
|
if (
|
|
automationSettings.vulnerableAutomation &&
|
|
this.parent.type !== 'companion' &&
|
|
changes.system?.resources?.stress?.value
|
|
) {
|
|
const { name, description, img, autoApplyFlagId } = CONFIG.DH.GENERAL.conditions().vulnerable;
|
|
const autoEffects = this.parent.effects.filter(
|
|
x => x.flags.daggerheart?.autoApplyFlagId === autoApplyFlagId
|
|
);
|
|
if (changes.system.resources.stress.value >= this.resources.stress.max) {
|
|
if (!autoEffects.length)
|
|
this.parent.createEmbeddedDocuments('ActiveEffect', [
|
|
{
|
|
name: game.i18n.localize(name),
|
|
description: game.i18n.localize(description),
|
|
img: img,
|
|
statuses: ['vulnerable'],
|
|
flags: { daggerheart: { autoApplyFlagId } }
|
|
}
|
|
]);
|
|
} else if (this.resources.stress.value >= this.resources.stress.max) {
|
|
this.parent.deleteEmbeddedDocuments(
|
|
'ActiveEffect',
|
|
autoEffects.map(x => x.id)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|