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); }
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); }
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); }