static bool Prefix(Spellbook __instance, int spellLevel, ref int __result)
        {
            if (__instance.Blueprint.GetComponent <NoSpellsPerDaySacaling>() == null)
            {
                return(true);
            }

            ModifiableValueAttributeStat stat = __instance.Owner.Stats.GetStat(__instance.Blueprint.CastingAttribute) as ModifiableValueAttributeStat;

            if (stat == null || stat.ModifiedValue < 10 + spellLevel)
            {
                __result = 0;
                return(false);
            }

            int?count = __instance.Blueprint.SpellsPerDay.GetCount(__instance.CasterLevel, spellLevel);

            if (!count.HasValue)
            {
                __result = 0;
            }
            else
            {
                __result = count.Value;
            }
            return(false);
        }
示例#2
0
        public override void OnTurnOn()
        {
            ModifiableValue value = base.Owner.Stats.GetStat(StatTypeToReplaceBastStatFor);

            if (value.GetType() == typeof(ModifiableValueSkill))
            {
                if (_oldStatType == null)
                {
                    _oldStatType = ((ModifiableValueSkill)value).BaseStat.Type;
                }

                ModifiableValueAttributeStat oldStat = base.Owner.Stats.GetStat <ModifiableValueAttributeStat>((StatType)_oldStatType);
                ModifiableValueAttributeStat newStat = base.Owner.Stats.GetStat <ModifiableValueAttributeStat>(NewBaseStatType);

                if (newStat.Bonus < oldStat.Bonus && only_if_greater)
                {
                    return;
                }

                Traverse traverse = Traverse.Create(value);
                traverse.Field("BaseStat").SetValue(newStat);
                newStat.AddDependentValue(value);
                oldStat.RemoveDependentValue(value);
                value.UpdateValue();
            }
        }
        static bool Prefix(RulePartySkillCheck __instance, bool isTrigger, ref int ___m_D20, ref int ___m_StatValue, StatType ___m_StatType, int ___m_DifficultyClass)
        {
            ___m_StatValue = int.MinValue;
            var tr = Harmony12.Traverse.Create(__instance);

            tr.Property("Roller").SetValue(null);
            RuleSkillCheck selected_evt = null;

            foreach (UnitEntityData unitEntityData in Game.Instance.Player.Party)
            {
                if (unitEntityData.Descriptor.State.CanAct)
                {
                    ModifiableValue stat = unitEntityData.Stats.GetStat(___m_StatType);
                    ModifiableValueAttributeStat valueAttributeStat = stat as ModifiableValueAttributeStat;
                    int            num = valueAttributeStat != null ? valueAttributeStat.Bonus : stat.ModifiedValue;
                    RuleSkillCheck evt = new RuleSkillCheck(unitEntityData, ___m_StatType, ___m_DifficultyClass)
                    {
                        Voice         = __instance.Voice,
                        EnsureSuccess = __instance.EnsureSuccess
                    };

                    if (isTrigger)
                    {
                        evt.Silent = true;;
                        Rulebook.Trigger <RuleSkillCheck>(evt);
                        num += (int)evt.Bonus;
                    }

                    if (___m_StatValue < num)
                    {
                        ___m_StatValue = num;
                        tr.Property("Roller").SetValue(unitEntityData);
                        selected_evt = evt;
                    }
                }
            }
            if (__instance.Roller == null)
            {
                UberDebug.Log("Roller is null, in the party skillcheck", (object[])Array.Empty <object>());
            }
            else
            {
                if (!isTrigger)
                {
                    selected_evt.Calculate();
                }
                else
                {
                    selected_evt.Silent = false;
                    EventBus.RaiseEvent <IRollSkillCheckHandler>((Action <IRollSkillCheckHandler>)(h => h.HandleOnRuleSkillCheck(selected_evt)));
                    //Game.Instance?.UI?.BattleLogManager?.HandleUnitSkillCheckRolled(selected_evt);
                }
                ___m_D20 = selected_evt.D20;
            }
            return(false);
        }
        public override void OnEventAboutToTrigger(RuleCalculateWeaponStats evt)
        {
            ModifiableValueAttributeStat stat = evt.Initiator.Descriptor.Stats.GetStat(this.Stat) as ModifiableValueAttributeStat;
            ModifiableValueAttributeStat valueAttributeStat = !evt.DamageBonusStat.HasValue ? (ModifiableValueAttributeStat)null : evt.Initiator.Descriptor.Stats.GetStat(evt.DamageBonusStat.Value) as ModifiableValueAttributeStat;

            if (stat.Type != valueAttributeStat.Type && (stat == null || valueAttributeStat != null && stat.Bonus <= valueAttributeStat.Bonus || evt.Weapon.Blueprint.Type.Category != this.Category))
            {
                return;
            }
            float bonusDmg = Multiplier * stat.Bonus;

            evt.AddBonusDamage((int)bonusDmg);
        }
 public override void OnEventAboutToTrigger(RuleCalculateAttackBonusWithoutTarget evt)
 {
     if (AdvancedWeaponTraining.WieldsWeaponFromFighterGroup(base.Owner, WeaponTraining) && !evt.Weapon.Blueprint.Category.HasSubCategory(WeaponSubCategory.Finessable))
     {
         ModifiableValueAttributeStat stat1 = this.Owner.Stats.GetStat(evt.AttackBonusStat) as ModifiableValueAttributeStat;
         ModifiableValueAttributeStat stat2 = this.Owner.Stats.GetStat(StatType.Dexterity) as ModifiableValueAttributeStat;
         bool flag = stat2 != null && stat1 != null && stat2.Bonus >= stat1.Bonus;
         if (!flag)
         {
             return;
         }
         evt.AttackBonusStat = StatType.Dexterity;
     }
 }
 public override void OnEventAboutToTrigger(RuleCalculateWeaponStats evt)
 {
     if (AdvancedWeaponTraining.WieldsWeaponFromFighterGroup(this.Owner, WeaponFighterGroupFeature) && (
             evt.Weapon.Blueprint.Category.HasSubCategory(WeaponSubCategory.Finessable) ||
             base.Owner.Progression.Features.GetRank(FightersFinesseFeature) > 0))
     {
         ModifiableValueAttributeStat stat1 = this.Owner.Stats.GetStat(evt.Weapon.Blueprint.AttackBonusStat) as ModifiableValueAttributeStat;
         ModifiableValueAttributeStat stat2 = this.Owner.Stats.GetStat(StatType.Dexterity) as ModifiableValueAttributeStat;
         bool flag = stat2 != null && stat1 != null && stat2.Bonus >= stat1.Bonus;
         if (!flag)
         {
             return;
         }
         int value = base.Owner.Progression.Features.GetRank(WeaponFighterGroupFeature);
         evt.AddBonusDamage(value);
     }
 }
        static public int getArcanistMemorizeSlotCnt(int spellLevel, Spellbook spellBook)
        {
            BlueprintSpellbook           spellBookBlueprint = spellBook.Blueprint;
            ModifiableValueAttributeStat castingStat        = spellBook.Owner.Stats.GetStat <ModifiableValueAttributeStat>(spellBookBlueprint.CastingAttribute);

            if (castingStat == null)
            {
                return(0);
            }
            if (castingStat < 10 + spellLevel)
            {
                return(0);
            }
            if (spellLevel < 0 || spellLevel > spellBook.MaxSpellLevel)
            {
                return(0);
            }
            return(spellBookBlueprint.SpellsKnown.GetCount(spellBook.CasterLevel + 20, spellLevel).Value);
        }
示例#8
0
        public override void OnEventAboutToTrigger(RuleCalculateAttackBonusWithoutTarget evt)
        {
            var weapon_training = this.Owner.Get <UnitPartWeaponTraining>();

            if (weapon_training == null)
            {
                return;
            }

            if (weapon_training.GetWeaponRank(evt.Weapon) <= 0)
            {
                return;
            }

            ModifiableValueAttributeStat stat1 = this.Owner.Stats.GetStat(evt.AttackBonusStat) as ModifiableValueAttributeStat;
            ModifiableValueAttributeStat stat2 = this.Owner.Stats.GetStat(this.repalcement_stat) as ModifiableValueAttributeStat;
            bool flag = stat2 != null && stat1 != null && stat2.Bonus > stat1.Bonus;

            if (!flag)
            {
                return;
            }
            evt.AttackBonusStat = this.repalcement_stat;
        }
示例#9
0
        public override void OnEventAboutToTrigger(RuleCalculateWeaponStats evt)
        {
            var weapon = evt.Weapon;

            if (weapon == null)
            {
                return;
            }

            if (!evt.DamageBonusStat.HasValue || evt.DamageBonusStat != StatType.Strength)
            {
                return;
            }

            if (weapon.Blueprint.Category == WeaponCategory.DuelingSword && this.Owner.Progression.Features.HasFact(deft_grace))
            {
                return;
            }

            if (weapon.Blueprint.Category == WeaponCategory.Scimitar && this.Owner.Progression.Features.HasFact(NewFeats.dervish_dance))
            {
                return;
            }

            if (!evt.Weapon.Blueprint.Category.HasSubCategory(WeaponSubCategory.Finessable) && !this.Owner.HasFact(AdvancedFighterOptions.fighters_finesse))
            {
                return;
            }

            if (AdvancedFighterOptions.category_finesse_training_map.ContainsKey(evt.Weapon.Blueprint.Category) &&
                this.Owner.HasFact(AdvancedFighterOptions.category_finesse_training_map[evt.Weapon.Blueprint.Category]))
            {
                return;
            }

            var has_free_secondary_hand = HoldingItemsMechanics.Helpers.hasFreeHandOrBuckler(evt.Initiator.Body?.SecondaryHand);

            if (this.Owner.Progression.Features.Enumerable.Where <Kingmaker.UnitLogic.Feature>(p => p.Blueprint == slashing_grace).Any(p => p.Param == weapon.Blueprint.Category) &&
                has_free_secondary_hand)
            {
                return;
            }

            if (this.Owner.Progression.Features.Enumerable.Where <Kingmaker.UnitLogic.Feature>(p => p.Blueprint == fencing_grace).Any(p => p.Param == weapon.Blueprint.Category) &&
                has_free_secondary_hand)
            {
                return;
            }

            if (weapon.EnchantmentsCollection != null && weapon.EnchantmentsCollection.HasFact(agile))
            {
                return;
            }

            ModifiableValueAttributeStat stat1 = this.Owner.Stats.GetStat(evt.Weapon.Blueprint.AttackBonusStat) as ModifiableValueAttributeStat;
            ModifiableValueAttributeStat stat2 = this.Owner.Stats.GetStat(StatType.Dexterity) as ModifiableValueAttributeStat;

            if (stat2 <= stat1)
            {
                return;
            }

            var training_part = this.Owner.Get <UnitPartWeaponTraining>();

            if (training_part == null)
            {
                return;
            }

            int value = training_part.GetWeaponRank(evt.Weapon);

            evt.AddBonusDamage(value);
        }
示例#10
0
        public void OnEventAboutToTrigger(RuleCalculateWeaponStats evt)
        {
            var weapon = evt.Weapon;

            if (weapon == null)
            {
                return;
            }

            if (weapon.Blueprint.Category != this.Param)
            {
                return;
            }

            if (weapon.Blueprint.Category == WeaponCategory.DuelingSword && this.Owner.Progression.Features.HasFact(deft_grace))
            {
                return;
            }

            if (weapon.Blueprint.Category == WeaponCategory.Scimitar && this.Owner.Progression.Features.HasFact(NewFeats.dervish_dance))
            {
                return;
            }


            if ((weapon.Blueprint.Category == WeaponCategory.Bite || weapon.Blueprint.Category == WeaponCategory.Claw) && this.Owner.Progression.Features.HasFact(leopard_frace))
            {
                return;
            }

            if (!evt.DamageBonusStat.HasValue || evt.DamageBonusStat != StatType.Strength)
            {
                return;
            }

            /*if (!evt.Weapon.Blueprint.Category.HasSubCategory(WeaponSubCategory.Finessable) && !this.Owner.HasFact(AdvancedFighterOptions.fighters_finesse))
             * {
             *  return;
             * }*/

            if (AdvancedFighterOptions.category_finesse_training_map.ContainsKey(evt.Weapon.Blueprint.Category) &&
                this.Owner.HasFact(AdvancedFighterOptions.category_finesse_training_map[evt.Weapon.Blueprint.Category]))
            {
                return;
            }

            if (this.Owner.Progression.Features.Enumerable.Where <Kingmaker.UnitLogic.Feature>(p => p.Blueprint == slashing_grace).Any(p => p.Param == weapon.Blueprint.Category))
            {
                return;
            }

            if (this.Owner.Progression.Features.Enumerable.Where <Kingmaker.UnitLogic.Feature>(p => p.Blueprint == fencing_grace).Any(p => p.Param == weapon.Blueprint.Category))
            {
                return;
            }

            if (weapon.EnchantmentsCollection != null && weapon.EnchantmentsCollection.HasFact(agile))
            {
                return;
            }

            ModifiableValueAttributeStat stat1 = this.Owner.Stats.GetStat(evt.Weapon.Blueprint.AttackBonusStat) as ModifiableValueAttributeStat;
            ModifiableValueAttributeStat stat2 = this.Owner.Stats.GetStat(StatType.Dexterity) as ModifiableValueAttributeStat;

            if (stat2 <= stat1)
            {
                return;
            }


            evt.AddBonusDamage(value.Calculate(this.Fact.MaybeContext));
        }