From 0b82c12ae79f2951900e2477d5c044a263fcb063 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 10 Mar 2025 22:58:57 -0400 Subject: [PATCH 1/2] Fix runelord from prompting for arcane thesis --- src/module/item/base/document.ts | 16 +++++++++++++++- .../rule-element/choice-set/rule-element.ts | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/module/item/base/document.ts b/src/module/item/base/document.ts index f1bcd19e642..aff61e98c9b 100644 --- a/src/module/item/base/document.ts +++ b/src/module/item/base/document.ts @@ -650,9 +650,23 @@ class ItemPF2e extends Item for (const item of [...items]) { // Pre-load this item's self: roll options for predication by preCreate rule elements item.prepareActorData?.(); + const rules = item.prepareRuleElements({ suppressWarnings: true }); + + // Mark suppressed feats as suppressed during preCreate. + // This must happen *after* rules are fetched, as suppressing kills the rules + // Our only goal is to prevent choice sets, which are not salvageable + const sourceId = item.sourceId; + if (sourceId && item.isOfType("feat")) { + const suppressed = + items.some( + (i) => i.isOfType("feat") && i.system.subfeatures.suppressedFeatures.includes(sourceId), + ) || actor.itemTypes.feat.some((f) => f.system.subfeatures.suppressedFeatures.includes(sourceId)); + if (suppressed) { + item.suppressed = true; + } + } const itemSource = item._source; - const rules = item.prepareRuleElements({ suppressWarnings: true }); for (const rule of rules) { const ruleSource = itemSource.system.rules[rules.indexOf(rule)] as RuleElementSource; await rule.preCreate?.({ diff --git a/src/module/rules/rule-element/choice-set/rule-element.ts b/src/module/rules/rule-element/choice-set/rule-element.ts index e2794c4da4c..dfe67096760 100644 --- a/src/module/rules/rule-element/choice-set/rule-element.ts +++ b/src/module/rules/rule-element/choice-set/rule-element.ts @@ -165,6 +165,9 @@ class ChoiceSetRuleElement extends RuleElementPF2e { return; } + // If this choice set is on a suppressed item, skip + if (this.item.isOfType("feat") && this.item.suppressed) return; + const rollOptions = new Set([this.actor.getRollOptions(), this.item.getRollOptions("parent")].flat()); const predicate = this.resolveInjectedProperties(this.predicate); if (!predicate.test(rollOptions)) return; From 92fccf6b77964955ac4461516c3a98190c8dc728 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Tue, 11 Mar 2025 16:18:28 -0400 Subject: [PATCH 2/2] Update src/module/item/base/document.ts Co-authored-by: Shark that walks like a man <106829671+stwlam@users.noreply.github.com> --- src/module/item/base/document.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/module/item/base/document.ts b/src/module/item/base/document.ts index aff61e98c9b..be7ec4ccbbd 100644 --- a/src/module/item/base/document.ts +++ b/src/module/item/base/document.ts @@ -657,13 +657,10 @@ class ItemPF2e extends Item // Our only goal is to prevent choice sets, which are not salvageable const sourceId = item.sourceId; if (sourceId && item.isOfType("feat")) { - const suppressed = + item.suppressed ||= items.some( (i) => i.isOfType("feat") && i.system.subfeatures.suppressedFeatures.includes(sourceId), ) || actor.itemTypes.feat.some((f) => f.system.subfeatures.suppressedFeatures.includes(sourceId)); - if (suppressed) { - item.suppressed = true; - } } const itemSource = item._source;