Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dnd5e.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ Hooks.once("init", function() {
// Hook up system data types
Object.assign(CONFIG.ActiveEffect.changeTypes, DND5E.activeEffectChangeTypes);
Object.assign(CONFIG.ActiveEffect.dataModels, dataModels.activeEffect.config);
Object.assign(CONFIG.ActiveEffect.phases, dataModels.activeEffect.phases);
CONFIG.Actor.dataModels = dataModels.actor.config;
CONFIG.ChatMessage.dataModels = dataModels.chatMessage.config;
CONFIG.Item.dataModels = dataModels.item.config;
Expand Down
6 changes: 6 additions & 0 deletions lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2755,6 +2755,12 @@
},
"Label": "Available Effects",
"New": "New Effect",
"PHASES": {
"postAbilities": {
"label": "Post Abilities",
"hint": "Immediately after ability data has been prepared"
}
},
"Replacement": {
"NoChange": "No Change",
"Origin": "Origin",
Expand Down
7 changes: 7 additions & 0 deletions module/data/active-effect/_module.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,10 @@ export const config = {
condition: ConditionData,
enchantment: EnchantmentData
};

export const phases = {
postAbilities: {
label: "DND5E.EFFECT.PHASES.postAbilities.label",
hint: "DND5E.EFFECT.PHASES.postAbilities.hint"
}
};
12 changes: 12 additions & 0 deletions module/data/active-effect/base.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ export default class BaseEffectData extends ActiveEffectDataModel {
};
}

/* -------------------------------------------- */
/* Data Preparation */
/* -------------------------------------------- */

/** @inheritDoc */
prepareBaseData() {
super.prepareBaseData();
for ( const change of this.changes ) {
if ( change.value.includes?.("@item.uses.value") ) change.phase = "postAbilities";
}
}

/* -------------------------------------------- */
/* Properties */
/* -------------------------------------------- */
Expand Down
2 changes: 2 additions & 0 deletions module/data/actor/templates/common.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ export default class CommonTemplate extends ActorDataModel.mixin(CurrencyTemplat

CommonTemplate.shimAbilityData(abl, id);
}

this.parent.applyActiveEffects("postAbilities");
}

/* -------------------------------------------- */
Expand Down
2 changes: 1 addition & 1 deletion module/data/item/consumable.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ export default class ConsumableData extends ItemDataModel.mixin(

/** @inheritDoc */
prepareFinalData() {
this.prepareFinalActivityData(this.parent.getRollData({ deterministic: true }));
this.prepareFinalActivityData();
this.prepareFinalEquippableData();
}

Expand Down
2 changes: 1 addition & 1 deletion module/data/item/equipment.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ export default class EquipmentData extends ItemDataModel.mixin(

/** @inheritDoc */
prepareFinalData() {
this.prepareFinalActivityData(this.parent.getRollData({ deterministic: true }));
this.prepareFinalActivityData();
this.prepareFinalEquippableData();
}

Expand Down
2 changes: 1 addition & 1 deletion module/data/item/facility.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ export default class FacilityData extends ItemDataModel.mixin(ActivitiesTemplate

/** @inheritDoc */
prepareFinalData() {
this.prepareFinalActivityData(this.parent.getRollData({ deterministic: true }));
this.prepareFinalActivityData();
}

/* -------------------------------------------- */
Expand Down
2 changes: 1 addition & 1 deletion module/data/item/feat.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ export default class FeatData extends ItemDataModel.mixin(

/** @inheritDoc */
prepareFinalData() {
this.prepareFinalActivityData(this.parent.getRollData({ deterministic: true }));
this.prepareFinalActivityData();
}

/* -------------------------------------------- */
Expand Down
2 changes: 1 addition & 1 deletion module/data/item/spell.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ export default class SpellData extends ItemDataModel.mixin(ActivitiesTemplate, I
prepareFinalData() {
const rollData = this.parent.getRollData({ deterministic: true });
const labels = this.parent.labels ??= {};
this.prepareFinalActivityData(rollData);
this.prepareFinalActivityData();
ActivationField.prepareData.call(this, rollData, labels);
DurationField.prepareData.call(this, rollData, labels);
RangeField.prepareData.call(this, rollData, labels);
Expand Down
12 changes: 10 additions & 2 deletions module/data/item/templates/activities.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,20 @@ export default class ActivitiesTemplate extends SystemDataModel {
/* -------------------------------------------- */

/**
* Prepare final data for the activities & uses.
* Prepare final uses data.
* @param {ItemRollData} rollData
*/
prepareFinalActivityData(rollData) {
prepareUsesData(rollData=this.parent.getRollData({ deterministic: true })) {
const labels = this.parent.labels;
UsesField.prepareData.call(this, rollData, labels);
}

/* -------------------------------------------- */

/**
* Prepare final data for the activities.
*/
prepareFinalActivityData() {
for ( const activity of this.activities ) activity.prepareFinalData();
}

Expand Down
2 changes: 1 addition & 1 deletion module/data/item/tool.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ export default class ToolData extends ItemDataModel.mixin(

/** @inheritDoc */
prepareFinalData() {
this.prepareFinalActivityData(this.parent.getRollData({ deterministic: true }));
this.prepareFinalActivityData();
this.prepareFinalEquippableData();
}

Expand Down
2 changes: 1 addition & 1 deletion module/data/item/weapon.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ export default class WeaponData extends ItemDataModel.mixin(

/** @inheritDoc */
prepareFinalData() {
this.prepareFinalActivityData(this.parent.getRollData({ deterministic: true }));
this.prepareFinalActivityData();
this.prepareFinalEquippableData();

const labels = this.parent.labels ??= {};
Expand Down
5 changes: 5 additions & 0 deletions module/documents/actor/actor.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,11 @@ export default class Actor5e extends SystemDocumentMixin(Actor) {
}
}

// Prepare item uses, if present
if ( phase === "postAbilities" ) {
this.items.forEach(item => item.system?.prepareUsesData?.())
}

// Prepare final attributes & spellcasting so that they can be used/modified in "final" phase
if ( phase === "final" ) {
this.items.forEach(item => item.prepareFinalAttributes());
Expand Down