static bool Prefix(Demoralize __instance)
        {
            var tr     = Harmony12.Traverse.Create(__instance);
            var target = tr.Property("Target").GetValue <TargetWrapper>();

            MechanicsContext.Data data             = ElementsContext.GetData <MechanicsContext.Data>();
            MechanicsContext      mechanicsContext = (data != null) ? data.Context : null;
            UnitEntityData        unitEntityData   = (mechanicsContext != null) ? mechanicsContext.MaybeCaster : null;

            if (unitEntityData == null || !target.IsUnit)
            {
                UberDebug.LogError(__instance, "Unable to apply buff: no context found", Array.Empty <object>());
                return(false);
            }
            int num = 10 + target.Unit.Descriptor.Progression.CharacterLevel + target.Unit.Stats.Wisdom.Bonus;

            ModifiableValue.Modifier modifier = null;
            try
            {
                if (__instance.DazzlingDisplay && unitEntityData.Descriptor.State.Features.SwordlordWeaponProwess)
                {
                    int num2 = 0;
                    foreach (var feature in unitEntityData.Descriptor.Progression.Features)
                    {
                        var  param = feature.Param;
                        bool flag;
                        if (param == null)
                        {
                            flag = false;
                        }
                        else
                        {
                            WeaponCategory?weaponCategory  = param.WeaponCategory;
                            WeaponCategory weaponCategory2 = WeaponCategory.DuelingSword;
                            flag = (weaponCategory.GetValueOrDefault() == weaponCategory2 & weaponCategory != null);
                        }
                        if (flag)
                        {
                            num2++;
                        }
                    }
                    modifier = unitEntityData.Stats.CheckIntimidate.AddModifier(num2, null, ModifierDescriptor.None);
                }
                var ruleSkillCheck        = new RuleSkillCheck(unitEntityData, StatType.CheckIntimidate, num);
                var demoralize_bonus_part = mechanicsContext.MaybeCaster.Get <UnitPartDemoralizeBonus>();
                if (demoralize_bonus_part != null)
                {
                    ruleSkillCheck.Bonus.AddModifier(demoralize_bonus_part.getBonus(), null, ModifierDescriptor.UntypedStackable);
                }

                ruleSkillCheck = mechanicsContext.TriggerRule <RuleSkillCheck>(ruleSkillCheck);
                if (ruleSkillCheck.IsPassed)
                {
                    int num3 = 1 + (ruleSkillCheck.RollResult - num) / 5 + (unitEntityData.Descriptor.State.Features.FrighteningThug ? 1 : 0);
                    if (unitEntityData.Descriptor.State.Features.FrighteningThug && num3 >= 4)
                    {
                        target.Unit.Descriptor.AddBuff(__instance.GreaterBuff, mechanicsContext, new TimeSpan?(1.Rounds().Seconds));
                    }
                    Buff buff = target.Unit.Descriptor.AddBuff(__instance.Buff, mechanicsContext, new TimeSpan?(num3.Rounds().Seconds));
                    if (unitEntityData.Descriptor.HasFact(__instance.ShatterConfidenceFeature) && buff != null)
                    {
                        Buff fact = target.Unit.Descriptor.AddBuff(__instance.ShatterConfidenceBuff, mechanicsContext, new TimeSpan?(num3.Rounds().Seconds));
                        buff.StoreFact(fact);
                    }

                    unitEntityData.Get <UnitPartActionOnDemoralize>()?.runActions(mechanicsContext, target.Unit, num, ruleSkillCheck.RollResult);
                    var scoped_actions = (mechanicsContext?.SourceAbility?.GetComponents <ScopedDemoralizeActions>()).EmptyIfNull();
                    foreach (var s in scoped_actions)
                    {
                        s.actions.Run();
                    }
                }
            }
            finally
            {
                if (modifier != null)
                {
                    modifier.Remove();
                }
            }
            return(false);
        }
 public override void OnTurnOff()
 {
     m_Modifier?.Remove();
     m_Modifier = null;
 }
 public override void OnTurnOff()
 {
     this.m_Modifier?.Remove();
     this.m_Modifier = (ModifiableValue.Modifier)null;
 }