public void OnEventAboutToTrigger(RuleCalculateAbilityParams evt)
            {
                var spell = (this.Fact as Feature)?.Param.Blueprint as BlueprintAbility;

                if (SpellDuplicates.isDuplicate(spell, evt.Spell) || SpellDuplicates.isDuplicate(spell, evt.Spell?.Parent))
                {
                    evt.AddBonusCasterLevel(bonus);
                }
            }
            public void OnEventAboutToTrigger(RuleCalculateAbilityParams evt)
            {
                var spell = (this.Fact as Feature)?.Param.Blueprint as BlueprintAbility;

                if (SpellDuplicates.isDuplicate(spell, evt.Spell) || SpellDuplicates.isDuplicate(spell, evt.Spell?.Parent))
                {
                    evt.AddBonusDC(dc_bonus.Calculate(this.Fact.MaybeContext));
                    evt.AddBonusConcentration(concentration_bonus.Calculate(this.Fact.MaybeContext));
                }
            }
        static bool Prefix(SpellSpecializationParametrized __instance, RuleCalculateAbilityParams evt)
        {
            var spell = (__instance.Fact as Feature)?.Param.Blueprint as BlueprintAbility;

            if (SpellDuplicates.isDuplicate(spell, evt.Spell) || SpellDuplicates.isDuplicate(spell, evt.Spell?.Parent))
            {
                evt.AddBonusCasterLevel(2);
            }

            return(false);
        }
            public override void OnEventAboutToTrigger(RuleCalculateAbilityParams evt)
            {
                int bonus = this.Value.Calculate(this.Context);

                foreach (var s in Spells)
                {
                    if (SpellDuplicates.isDuplicate(s, evt.Spell))
                    {
                        evt.AddBonusDC(bonus);
                        return;
                    }
                }
            }
            public override void OnEventAboutToTrigger(RuleSpellResistanceCheck evt)
            {
                int bonus = this.Value.Calculate(this.Context);

                foreach (var s in Spells)
                {
                    if (SpellDuplicates.isDuplicate(s, evt.Ability))
                    {
                        evt.AdditionalSpellPenetration += bonus;
                        return;
                    }
                }
            }
            public override void OnEventAboutToTrigger(RuleSavingThrow evt)
            {
                BlueprintAbility sourceAbility = evt.Reason.Context?.SourceAbility;

                int bonus = this.Value.Calculate(this.Context);

                foreach (var s in Spells)
                {
                    if (SpellDuplicates.isDuplicate(s, evt.Reason.Context?.SourceAbility))
                    {
                        evt.AddTemporaryModifier(evt.Initiator.Stats.SaveWill.AddModifier(bonus, (GameLogicComponent)this, this.ModifierDescriptor));
                        evt.AddTemporaryModifier(evt.Initiator.Stats.SaveReflex.AddModifier(bonus, (GameLogicComponent)this, this.ModifierDescriptor));
                        evt.AddTemporaryModifier(evt.Initiator.Stats.SaveFortitude.AddModifier(bonus, (GameLogicComponent)this, this.ModifierDescriptor));
                        return;
                    }
                }
            }