diff --git a/module/data/activeEffect/_module.mjs b/module/data/activeEffect/_module.mjs index 1a50088a..7394d04b 100644 --- a/module/data/activeEffect/_module.mjs +++ b/module/data/activeEffect/_module.mjs @@ -1,5 +1,6 @@ import BaseEffect from './baseEffect.mjs'; import BeastformEffect from './beastformEffect.mjs'; +import CompanionEffect from './companionEffect.mjs'; import HordeEffect from './hordeEffect.mjs'; export { BaseEffect, BeastformEffect, HordeEffect }; @@ -7,5 +8,6 @@ export { BaseEffect, BeastformEffect, HordeEffect }; export const config = { base: BaseEffect, beastform: BeastformEffect, + companion: CompanionEffect, horde: HordeEffect }; diff --git a/module/data/activeEffect/companionEffect.mjs b/module/data/activeEffect/companionEffect.mjs new file mode 100644 index 00000000..8683f692 --- /dev/null +++ b/module/data/activeEffect/companionEffect.mjs @@ -0,0 +1,11 @@ +import BaseEffect from './baseEffect.mjs'; + +export default class CompanionEffect extends BaseEffect { + static defineSchema() { + const fields = foundry.data.fields; + + return { + ...BaseEffect.defineSchema() + }; + } +} diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 5bce5c55..8f5c02f6 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -453,8 +453,7 @@ export default class DhCharacter extends BaseDataActor { if ( item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || - (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && - subclassState >= 2) || + (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && subclassState >= 2) || (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) ) { return true; @@ -573,6 +572,16 @@ export default class DhCharacter extends BaseDataActor { } } + allApplicableEffects(baseEffects) { + if (!this.companion) return baseEffects; + + const effects = [ + ...Array.from(baseEffects), + ...Array.from(this.companion.getBaseApplicableEffects()).filter(x => x.type === 'companion') + ]; + return effects; + } + prepareBaseData() { this.evasion += this.class.value?.system?.evasion ?? 0; diff --git a/module/data/actor/companion.mjs b/module/data/actor/companion.mjs index fa1965bd..21fba4ec 100644 --- a/module/data/actor/companion.mjs +++ b/module/data/actor/companion.mjs @@ -108,11 +108,21 @@ export default class DhCompanion extends BaseDataActor { get proficiency() { return this.partner?.system?.proficiency ?? 1; } - + isItemValid() { return false; } + allApplicableEffects(baseEffects) { + if (!this.partner) return baseEffects; + + const effects = [ + ...Array.from(baseEffects), + ...Array.from(this.partner.getBaseApplicableEffects()).filter(x => x.type === 'companion') + ]; + return effects; + } + prepareBaseData() { this.attack.roll.bonus = this.partner?.system?.spellcastModifier ?? 0; diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 06b60447..c8210c39 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -71,6 +71,25 @@ export default class DhpActor extends Actor { return doc; } + getBaseApplicableEffects() { + const effects = [...this.effects]; + if (CONFIG.ActiveEffect.legacyTransferral) return; + + for (const item of this.items) { + for (const effect of item.effects) { + if (effect.transfer) effects.push(effect); + } + } + + return effects; + } + + allApplicableEffects() { + const effects = this.getBaseApplicableEffects(); + + return this.system.allApplicableEffects?.(effects) ?? effects; + } + /**@inheritdoc */ async _preCreate(data, options, user) { if ((await super._preCreate(data, options, user)) === false) return false; diff --git a/system.json b/system.json index ef2c2432..29337dcc 100644 --- a/system.json +++ b/system.json @@ -263,6 +263,7 @@ }, "ActiveEffect": { "beastform": {}, + "companion": {}, "horde": {} }, "Combat": {