static void Postfix(RuleCalculateCMD __instance)
        {
            //add attacker dependent ac bonuses/penalties
            var rule_ac  = new RuleCalculateAC(__instance.Initiator, __instance.Target, AttackType.Touch);
            var ac       = Rulebook.Trigger <RuleCalculateAC>(rule_ac).TargetAC;
            int delta_ac = ac - (__instance.IsTargetFlatFooted ? __instance.Target.Stats.AC.FlatFootedTouch : __instance.Target.Stats.AC.Touch);

            var tr = Harmony12.Traverse.Create(__instance);

            tr.Property("Result").SetValue(__instance.Result + delta_ac);
        }
Beispiel #2
0
        static bool Prefix(RuleCalculateAC __instance, RulebookEventContext context)
        {
            Cover cover = Rulebook.Trigger(new RuleCheckSoftCover(__instance.Initiator, __instance.Target, __instance.AttackType)).Result;

            if (cover == Cover.Full)
            {
                __instance.AddBonus(4, SoftCoverFact);
            }
            else if (cover == Cover.Partial)
            {
                __instance.AddBonus(2, SoftCoverPartialFact);
            }
            return(true);
        }
Beispiel #3
0
        static bool Prefix(RuleCalculateAC __instance, RulebookEventContext context)
        {
            var current_cover = __instance.Target.hasCoverFrom(__instance.Initiator, __instance.AttackType);

            //Main.logger.Log(current_cover.ToString() + " "  + __instance.AttackType.ToString());
            if (current_cover.isFull())
            {
                __instance.AddBonus(Cover.cover_ac_bonus, Cover.soft_cover_fact);
            }
            else if (current_cover.isPartial())
            {
                __instance.AddBonus(Cover.partial_cover_ac_bonus, Cover.partial_soft_cover_fact);
            }

            return(true);
        }
        static bool Prefix(RuleCalculateAC __instance, RulebookEventContext context)
        {
            if (__instance.AttackType == Kingmaker.RuleSystem.AttackType.Melee || __instance.AttackType == Kingmaker.RuleSystem.AttackType.Touch)
            {
                var  state = __instance.Target.Descriptor.State;
                bool target_unable_to_fly = !state.CanMove || __instance.IsTargetFlatFooted;

                bool target_fly   = __instance.Target.Ensure <UnitPartFlying>().isFlying() && !target_unable_to_fly;
                bool attacker_fly = __instance.Initiator.Ensure <UnitPartFlying>().isFlying() && __instance.Initiator.Descriptor.State.CanMove;

                if (target_fly && !attacker_fly)
                {
                    __instance.AddBonus(FixFlying.fly_ac_bonus, FixFlying.flying_fact);
                }
            }
            return(true);
        }
 static bool Prefix(BackToBack __instance, RuleCalculateAC evt)
 {
     if (!evt.Target.isFlankedByAttacker(evt.Initiator))
     {
         return(false);
     }
     foreach (UnitEntityData unitEntityData in GameHelper.GetTargetsAround(__instance.Owner.Unit.Position, (float)__instance.Radius, true, false))
     {
         if ((unitEntityData.Descriptor.HasFact(__instance.BackToBackFact) ||
              (bool)__instance.Owner.State.Features.SoloTactics) && unitEntityData != __instance.Owner.Unit && !unitEntityData.IsEnemy(__instance.Owner.Unit))
         {
             evt.AddBonus(2, __instance.Fact);
             break;
         }
     }
     return(false);
 }
 static void Postfix(BackToBack __instance, RuleCalculateAC evt)
 {
     UnitCombatState_get_IsFlanked_Patch.PopFlankingParametersIfTypeMatches(typeof(BackToBack_OnEventAboutToTrigger_Patch));
 }
 static bool Prefix(BackToBack __instance, RuleCalculateAC evt)
 {
     UnitCombatState_get_IsFlanked_Patch.PushFlankingParameters(new FlankingParameters(typeof(BackToBack_OnEventAboutToTrigger_Patch), evt.Initiator));
     return(true);
 }