Ejemplo n.º 1
0
        public void OnEventAboutToTrigger(RuleCalculateBaseCMB evt)
        {
            var old_size = this.Owner.State.Size;
            var new_size = old_size.Shift(bonus);

            if (old_size == new_size)
            {
                return;
            }

            evt.AddBonus(new_size.GetModifiers().CMDAndCMD - old_size.GetModifiers().CMDAndCMD + new_size.GetModifiers().AttackAndAC - old_size.GetModifiers().AttackAndAC, this.Fact);
        }
Ejemplo n.º 2
0
 public void OnEventDidTrigger(RuleCalculateBaseCMB evt)
 {
 }
        static bool Prefix(RuleCalculateBaseCMB __instance)
        {
            if (__instance.ReplaceBAB.HasValue)
            {
                // if bab is replaced it is not an attack (very likely a spell or some other ability)
                return(true);
            }

            var attack   = Rulebook.CurrentContext.AllEvents.LastOfType <RuleAttackWithWeapon>();
            var maneuver = Rulebook.CurrentContext.AllEvents.LastOfType <RuleCombatManeuver>();

            if (maneuver == null || !maneuverAsAttack(maneuver.Type, __instance.Initiator))
            {
                return(true);
            }

            var weapon  = __instance.Initiator.Body?.PrimaryHand?.MaybeWeapon;
            var penalty = 0;

            if (attack != null)
            {
                weapon = attack.Weapon;
                if (attack.AttackRoll != null && attack.AttackRoll.IsTriggererd)
                {
                    //if maneuver is after attack - it is a free attempt that is using iterative attack bonus
                    penalty = attack.AttackBonusPenalty;
                }
            }
            else if (__instance.Initiator.Ensure <UnitPartUseWeaponForCombatManeuver>().active())
            {
                var forced_weapon = __instance.Initiator.Ensure <UnitPartUseWeaponForCombatManeuver>().forcedWeapon();
                if (forced_weapon != null)
                {
                    weapon = forced_weapon;
                }
                penalty = __instance.Initiator.Ensure <UnitPartUseWeaponForCombatManeuver>().forcedPenalty();
            }
            else
            {
                return(true);
            }

            if (weapon == null || !weapon.Blueprint.IsMelee)
            {
                //no maneuvers without weapon or ranged weapon
                return(true);
            }
            // in order to properly get attack bonus we normally need to trigger RuleCalculateAttackBonus
            // the problem is that a lot of abilities add additional attack bonuses in OnEventAboutToTrigger( RuleAttackRoll),
            // and thus might happen after we trigger this combat maneuver
            // so instead we trigger a complete RuleAttackRoll to correctly get the bonus
            // as an unfortunate side effect it might trigger something that should not be triggered (like limited use rerolls), so it is not ideal
            // so we make a trick - we patch RuleAttackRoll to always trigger RuleCalculateAttackBonus and than call a fake RuleAttackRoll with auto hit
            // which does not make a roll

            var attack_roll = new RuleAttackRoll(maneuver.Initiator, maneuver.Target, weapon, penalty);

            attack_roll.IgnoreConcealment = true;
            attack_roll.AutoHit           = true;
            attack_roll.SuspendCombatLog  = true;

            var AttackBonus = Rulebook.Trigger <RuleAttackRoll>(attack_roll).AttackBonus;

            var ResultSizeBonus = __instance.Initiator.Descriptor.State.Size.GetModifiers().CMDAndCMD + __instance.Initiator.Descriptor.State.Size.GetModifiers().AttackAndAC;
            var ResultMiscBonus = (int)__instance.Initiator.Stats.AdditionalCMB;

            /*Main.logger.Log("Attack Detected: " + AttackBonus.ToString());
             * Main.logger.Log("Misc: " + ResultMiscBonus.ToString());
             * Main.logger.Log("Size: " + ResultSizeBonus.ToString());
             * Main.logger.Log("Additional Bonus: " + __instance.AdditionalBonus.ToString());*/

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

            tr.Property("Result").SetValue(AttackBonus + ResultSizeBonus + ResultMiscBonus + __instance.AdditionalBonus);
            return(false);
        }