diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 944d373b..04a93d7a 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -471,6 +471,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel } if (source.damage && source.damage.resources === undefined) { + source.damage.main = null; source.damage.resources = {}; for (const [partKey, part] of Object.entries(source.damage.parts)) { if (partKey === 'hitPoints') { @@ -484,6 +485,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel source.damage.resources[partKey] = part; } } + + delete source.damage.parts; } } } diff --git a/module/data/chat-message/actorRoll.mjs b/module/data/chat-message/actorRoll.mjs index 0b5d2678..2d578a0f 100644 --- a/module/data/chat-message/actorRoll.mjs +++ b/module/data/chat-message/actorRoll.mjs @@ -188,19 +188,28 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { } static migrateData(source) { - if (source.hasDamage && !source.damage.types) { - source.damage = { - types: Object.keys(source.damage).reduce((acc, key) => { - const damageData = source.damage[key]; - const oldRoll = damageData.parts[0]?.roll; - acc[key] = oldRoll ? { - ...oldRoll, - options: { - ...oldRoll.options, - damageTypes: damageData.parts[0].damageTypes ?? [] - } - } : null; + if (source.hasDamage && !source.damage.resources === undefined) { + const getRoll = key => { + const damageData = source.damage[key]; + const oldRoll = damageData.parts[0]?.roll; + return oldRoll ? { + ...oldRoll, + options: { + ...oldRoll.options, + damageTypes: damageData.parts[0].damageTypes ?? [] + } + } : null; + }; + source.damage = { + main: source.damage.hitPoints ? getRoll('hitPoints') : null, + resources: Object.keys(source.damage).reduce((acc, key) => { + if (key === 'hitPoints') return acc; + + const roll = getRoll(key); + if (!roll) return acc; + + acc[key] = roll; return acc; }, {}) }; diff --git a/module/data/chat-message/chatDamageData.mjs b/module/data/chat-message/chatDamageData.mjs index 0de9ea9e..bf61c892 100644 --- a/module/data/chat-message/chatDamageData.mjs +++ b/module/data/chat-message/chatDamageData.mjs @@ -11,7 +11,7 @@ export class ChatDamageData extends foundry.abstract.DataModel { const fields = foundry.data.fields; return { - damage: new fields.JSONField({validate: ChatDamageData.#validateRoll}), + main: new fields.JSONField({ nullable: true, validate: ChatDamageData.#validateRoll}), resources: new fields.TypedObjectField(new fields.JSONField({validate: ChatDamageData.#validateRoll})) }; } @@ -21,8 +21,10 @@ export class ChatDamageData extends foundry.abstract.DataModel { } static #validateRoll(rollJSON) { - const roll = JSON.parse(rollJSON); - if (!roll.evaluated) throw new Error('Roll objects added to ChatMessage documents must be evaluated'); + if (rollJSON) { + const roll = JSON.parse(rollJSON); + if (!roll.evaluated) throw new Error('Roll objects added to ChatMessage documents must be evaluated'); + } } _prepareRolls() { diff --git a/module/data/fields/action/damageField.mjs b/module/data/fields/action/damageField.mjs index 72933c60..87f50e4b 100644 --- a/module/data/fields/action/damageField.mjs +++ b/module/data/fields/action/damageField.mjs @@ -13,7 +13,7 @@ export default class DamageField extends fields.SchemaField { /** @inheritDoc */ constructor(options, context = {}) { const damageFields = { - main: new fields.EmbeddedDataField(DHDamageData), + main: new fields.EmbeddedDataField(DHDamageData, { nullable: true }), resources: new IterableTypedObjectField(DHResourceData) }; super(damageFields, options, context);