264 - Action Feature Swap (#265)

* Removed action fields on Adversary/Environment in favor of using Feature Items

* Added drag/drop for features onto adversary/environment settings

* Added Drag of features from Adversary/Environment settings to anywhere in Foundry

* Updated all item types except Class/Subclass

* Added for Class/Subclass

* Items now copy over their features to Character

* Corrected back to actions for right items

* Fixed adversary/environment features display

* PR Fixes
This commit is contained in:
WBHarry 2025-07-05 22:35:05 +02:00 committed by GitHub
parent eac58c1386
commit e9ad9c539a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
58 changed files with 1146 additions and 1114 deletions

View file

@ -43,7 +43,6 @@ export default class DhpAdversary extends BaseDataActor {
hitPoints: resourceField(),
stress: resourceField()
}),
actions: new fields.ArrayField(new ActionField()),
attack: new ActionField({
initial: {
name: 'Attack',
@ -86,4 +85,8 @@ export default class DhpAdversary extends BaseDataActor {
get attackBonus() {
return this.attack.roll.bonus;
}
get features() {
return this.parent.items.filter(x => x.type === 'feature');
}
}

View file

@ -97,7 +97,6 @@ export default class DhCharacter extends BaseDataActor {
value: new ForeignDocumentUUIDField({ type: 'Item', nullable: true }),
subclass: new ForeignDocumentUUIDField({ type: 'Item', nullable: true })
}),
actions: new fields.ArrayField(new ActionField()),
levelData: new fields.EmbeddedDataField(DhLevelData),
bonuses: new fields.SchemaField({
armorScore: new fields.NumberField({ integer: true, initial: 0 }),
@ -198,6 +197,68 @@ export default class DhCharacter extends BaseDataActor {
return this.parent.items.find(x => x.type === 'armor' && x.system.equipped);
}
get sheetLists() {
const ancestryFeatures = [],
communityFeatures = [],
classFeatures = [],
subclassFeatures = [],
companionFeatures = [],
features = [];
for (let item of this.parent.items) {
if (item.system.type === CONFIG.DH.ITEM.featureTypes.ancestry.id) {
ancestryFeatures.push(item);
} else if (item.system.type === CONFIG.DH.ITEM.featureTypes.community.id) {
communityFeatures.push(item);
} else if (item.system.type === CONFIG.DH.ITEM.featureTypes.class.id) {
classFeatures.push(item);
} else if (item.system.type === CONFIG.DH.ITEM.featureTypes.subclass.id) {
const subclassState = this.class.subclass.system.featureState;
const identifier = item.system.identifier;
if (
identifier === 'foundationFeature' ||
(identifier === 'specializationFeature' && subclassState >= 2) ||
(identifier === 'masterFeature' && subclassState >= 3)
) {
subclassFeatures.push(item);
}
} else if (item.system.type === CONFIG.DH.ITEM.featureTypes.companion.id) {
companionFeatures.push(item);
} else if (item.type === 'feature' && !item.system.type) {
features.push(item);
}
}
return {
ancestryFeatures: {
title: `${game.i18n.localize('TYPES.Item.ancestry')} - ${this.ancestry?.name}`,
type: 'ancestry',
values: ancestryFeatures
},
communityFeatures: {
title: `${game.i18n.localize('TYPES.Item.community')} - ${this.community?.name}`,
type: 'community',
values: communityFeatures
},
classFeatures: {
title: `${game.i18n.localize('TYPES.Item.class')} - ${this.class.value?.name}`,
type: 'class',
values: classFeatures
},
subclassFeatures: {
title: `${game.i18n.localize('TYPES.Item.subclass')} - ${this.class.subclass?.name}`,
type: 'subclass',
values: subclassFeatures
},
companionFeatures: {
title: game.i18n.localize('DAGGERHEART.Sheets.PC.CompanionFeatures'),
type: 'companion',
values: companionFeatures
},
features: { title: game.i18n.localize('DAGGERHEART.Sheets.PC.Features'), type: 'feature', values: features }
};
}
get primaryWeapon() {
return this.parent.items.find(x => x.type === 'weapon' && x.system.equipped && !x.system.secondary);
}

View file

@ -30,8 +30,11 @@ export default class DhEnvironment extends BaseDataActor {
adversaries: new ForeignDocumentUUIDArrayField({ type: 'Actor' })
})
),
actions: new fields.ArrayField(new ActionField()),
notes: new fields.HTMLField()
};
}
get features() {
return this.parent.items.filter(x => x.type === 'feature');
}
}