From 787f1ee7bfa8a744921548c0414eff8089088067 Mon Sep 17 00:00:00 2001 From: Chris Seieroe Date: Sat, 3 Feb 2024 12:10:10 -0800 Subject: [PATCH] dnd5e 3.0 updates (#54) * Switch to appliedEffects * Use appliedEffects when finding sources * change manifest to require dnd5e 3.0 * Update CHANGELOG.md * Use new stealthDisadvantage property * Update CHANGELOG.md * Use name instead of label on effect * Update CHANGELOG.md * Fix message tests switch to appliedEffects and remove disabled/suspended tests since the code doesn't check that anymore * Fix tests for stealth disadvantage from armor --- CHANGELOG.md | 7 +++ module.json | 15 ++++- src/messages.js | 3 +- src/reminders.js | 2 +- src/sources.js | 7 +-- test/messages.test.js | 132 +---------------------------------------- test/reminders.test.js | 8 +-- 7 files changed, 32 insertions(+), 142 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6440ca2..b6cb94e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 3.3.0 + +- bug fix: 3.0.0 compatibility for Messages and Souces from effects on items +- bug fix: 3.0.0 compatibility with new stealthDisadvantage property +- bug fix: use `name` instead of `label` on effect to remove deprecation warning +- feature: now requires dnd5e 3.0.0 and thus, Foundry 11 + # 3.2.1 - bug fix: tweak how messages are added to the dialog to remove a conflict with another module that also changes that dialog diff --git a/module.json b/module.json index d6211aa..cc888b3 100644 --- a/module.json +++ b/module.json @@ -5,11 +5,22 @@ "authors": [{ "name": "kaelad", "discord": "kaelad#1693" }], "version": "0.1", "compatibility": { - "minimum": "10", + "minimum": "11", "verified": "11" }, "relationships": { - "systems": [{ "id": "dnd5e" }, { "id": "sw5e" }] + "systems": [ + { + "id": "dnd5e", + "compatibility": { + "minimum": "3.0.0", + "verified": "3.0.0" + } + }, + { + "id": "sw5e" + } + ] }, "esmodules": ["src/module.js", "src/settings.js"], "styles": ["css/adv-reminder.css"], diff --git a/src/messages.js b/src/messages.js index aca98af..4c143df 100644 --- a/src/messages.js +++ b/src/messages.js @@ -12,8 +12,7 @@ class BaseMessage { _getActiveEffectKeys(actor) { return actor - ? actor.effects - .filter((effect) => !effect.isSuppressed && !effect.disabled) + ? actor.appliedEffects .flatMap((effect) => effect.changes) .sort((a, b) => a.priority - b.priority) : []; diff --git a/src/reminders.js b/src/reminders.js index 8d13ee1..c0c2f06 100644 --- a/src/reminders.js +++ b/src/reminders.js @@ -213,7 +213,7 @@ export class SkillReminder extends AbilityCheckReminder { _armorStealthDisadvantage() { if (this.skillId === "ste") { const item = this.items.find( - (item) => item.type === "equipment" && item.system?.equipped && item.system?.stealth + (item) => item.type === "equipment" && item.system.equipped && item.system.properties.has("stealthDisadvantage") ); debug("equiped item that imposes stealth disadvantage", item?.name); return item?.name; diff --git a/src/sources.js b/src/sources.js index 7ccfeee..9c0eca5 100644 --- a/src/sources.js +++ b/src/sources.js @@ -13,12 +13,11 @@ const SourceMixin = (superclass) => _getFlags(actor) { if (!actor) return {}; - const asArray = actor.effects - .filter((effect) => !effect.isSuppressed && !effect.disabled) + const asArray = actor.appliedEffects .flatMap((effect) => // make an object with the effect's label and change's key effect.changes.map((change) => ({ - label: effect.label, + name: effect.name, key: change.key, })) ) @@ -26,7 +25,7 @@ const SourceMixin = (superclass) => asArray.forEach((change) => (change.key = change.key.substring(15))); return asArray.reduce((accum, curr) => { if (!accum[curr.key]) accum[curr.key] = []; - accum[curr.key].push(curr.label); + accum[curr.key].push(curr.name); return accum; }, {}); } diff --git a/test/messages.test.js b/test/messages.test.js index 700a30c..5395246 100644 --- a/test/messages.test.js +++ b/test/messages.test.js @@ -23,7 +23,7 @@ globalThis.setProperty = (object, key, value) => { }; function createActorWithEffects(...keyValuePairs) { - const effects = keyValuePairs.map(createEffect); + const appliedEffects = keyValuePairs.map(createEffect); return { system: { skills: { @@ -83,14 +83,13 @@ function createActorWithEffects(...keyValuePairs) { }, }, }, - effects, + appliedEffects, getRollData: () => ({}), }; } function createEffect([key, value]) { return { - isSuppressed: false, changes: [ { key, @@ -98,8 +97,7 @@ function createEffect([key, value]) { mode: 0, priority: "0", }, - ], - disabled: false, + ] }; } @@ -122,28 +120,6 @@ describe("AttackMessage no legit active effects", () => { expect(options.dialogOptions).toBeUndefined(); }); - - test("attack with a suppressed active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].isSuppressed = true; - const item = createItem("mwak", "str"); - const options = {}; - - new AttackMessage(actor, undefined, item).addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); - - test("attack with a disabled active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].disabled = true; - const item = createItem("mwak", "str"); - const options = {}; - - new AttackMessage(actor, undefined, item).addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); }); describe("AttackMessage message flags", () => { @@ -343,26 +319,6 @@ describe("AbilityCheckMessage no legit active effects", () => { expect(options.dialogOptions).toBeUndefined(); }); - - test("ability check with a suppressed active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].isSuppressed = true; - const options = {}; - - new AbilityCheckMessage(actor, "int").addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); - - test("ability check with a disabled active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].disabled = true; - const options = {}; - - new AbilityCheckMessage(actor, "int").addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); }); describe("AbilityCheckMessage message flags", () => { @@ -451,26 +407,6 @@ describe("AbilitySaveMessage no legit active effects", () => { expect(options.dialogOptions).toBeUndefined(); }); - - test("saving throw with a suppressed active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].isSuppressed = true; - const options = {}; - - new AbilitySaveMessage(actor, "int").addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); - - test("saving throw with a disabled active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].disabled = true; - const options = {}; - - new AbilitySaveMessage(actor, "int").addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); }); describe("AbilitySaveMessage message flags", () => { @@ -559,26 +495,6 @@ describe("SkillMessage no legit active effects", () => { expect(options.dialogOptions).toBeUndefined(); }); - - test("skill check with a suppressed active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].isSuppressed = true; - const options = {}; - - new SkillMessage(actor, "ath").addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); - - test("skill check with a disabled active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].disabled = true; - const options = {}; - - new SkillMessage(actor, "ath").addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); }); describe("SkillMessage message flags", () => { @@ -707,26 +623,6 @@ describe("DeathSaveMessage no legit active effects", () => { expect(options.dialogOptions).toBeUndefined(); }); - - test("death save with a suppressed active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].isSuppressed = true; - const options = {}; - - new DeathSaveMessage(actor).addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); - - test("death save with a disabled active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].disabled = true; - const options = {}; - - new DeathSaveMessage(actor).addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); }); describe("DeathSaveMessage message flags", () => { @@ -804,28 +700,6 @@ describe("DamageMessage no legit active effects", () => { expect(options.dialogOptions).toBeUndefined(); }); - - test("damage with a suppressed active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].isSuppressed = true; - const item = createItem("mwak", "str"); - const options = {}; - - new DamageMessage(actor, undefined, item).addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); - - test("damage with a disabled active effect should not add a message", () => { - const actor = createActorWithEffects(["flags.adv-reminder.message.all", "some message"]); - actor.effects[0].disabled = true; - const item = createItem("mwak", "str"); - const options = {}; - - new DamageMessage(actor, undefined, item).addMessage(options); - - expect(options.dialogOptions).toBeUndefined(); - }); }); describe("DamageMessage message flags", () => { diff --git a/test/reminders.test.js b/test/reminders.test.js index 3497bbe..11b9c0c 100644 --- a/test/reminders.test.js +++ b/test/reminders.test.js @@ -669,7 +669,7 @@ describe("SkillReminder no legit active effects", () => { type: "spell", system: { equipped: true, - stealth: true, + properties: new Set(["stealthDisadvantage"]), }, }, ]; @@ -690,7 +690,7 @@ describe("SkillReminder no legit active effects", () => { type: "equipment", system: { equipped: false, - stealth: true, + properties: new Set(["stealthDisadvantage"]), }, }, ]; @@ -891,7 +891,7 @@ describe("SkillReminder disadvantage flags", () => { type: "equipment", system: { equipped: true, - stealth: true, + properties: new Set(["stealthDisadvantage"]), }, }, ]; @@ -912,7 +912,7 @@ describe("SkillReminder disadvantage flags", () => { type: "equipment", system: { equipped: true, - stealth: true, + properties: new Set(["stealthDisadvantage"]), }, }, ];