private void HandleHDBlocks(List <string> HDBlocks)
 {
     StatBlockInfo.HDBlockInfo tempHDInfo = new StatBlockInfo.HDBlockInfo();
     foreach (string oneBlock in HDBlocks)
     {
         tempHDInfo.ParseHDBlock(oneBlock);
         bool HDTypeFound = false;
         StatBlockInfo.HDBlockInfo HoldHD2 = new StatBlockInfo.HDBlockInfo();
         foreach (StatBlockInfo.HDBlockInfo tempBlock in _hitDiceBlockInfo)
         {
             if (tempBlock.HDType == tempHDInfo.HDType)  //combine like HD types, i.e. 3d10+7d10 -> 10d10
             {
                 HoldHD2 = tempBlock;
                 tempHDInfo.Multiplier += tempBlock.Multiplier;
                 tempHDInfo.Modifier   += tempBlock.Modifier;
                 HDTypeFound            = true;
                 break;
             }
         }
         if (HDTypeFound)
         {
             _hitDiceBlockInfo.Remove(HoldHD2);
         }
         _hitDiceBlockInfo.Add(tempHDInfo);
     }
 }
        public int HDValue()
        {
            StatBlockInfo.HDBlockInfo racialHDInfo = new StatBlockInfo.HDBlockInfo();
            string hold = HD;

            hold = Utility.RemoveParentheses(hold);
            int Pos  = hold.IndexOf(";");
            int Pos2 = hold.IndexOf("HD");

            if (Pos < Pos2)
            {
                Pos = hold.IndexOf(";", Pos2);
            }
            int value = 0;

            if (Pos >= 0 && hold.Contains("HD"))
            {
                hold = hold.Substring(0, Pos);
                hold = hold.Replace("HD", string.Empty).Trim();
                return(Convert.ToInt32(hold));
            }
            List <string> HDBlocks = hold.Split('+').ToList();

            foreach (string block in HDBlocks)
            {
                if (block.Contains("d") && !block.Contains(";"))
                {
                    racialHDInfo.ParseHDBlock(block);
                    value += racialHDInfo.Multiplier;
                }
            }

            return(value);
        }
 public static void ChangeHD(MonsterStatBlock MonSB, StatBlockInfo.HitDiceCategories NewHDCategory)
 {
     if (!MonSB.DontUseRacialHD)
     {
         StatBlockInfo.HDBlockInfo tempHDInfo = new StatBlockInfo.HDBlockInfo();
         tempHDInfo.ParseHDBlock(MonSB.HD);
         tempHDInfo.HDType   = NewHDCategory;
         tempHDInfo.Modifier = 0;
         MonSB.HD            = tempHDInfo.ToString();
     }
 }
        public override MonsterStatBlock ApplyTemplate(MonsterStatBlock MonSB)
        {
            if (!MonSB.DontUseRacialHD)
            {
                TemplateCommon.ChangeHD(MonSB, StatBlockInfo.HitDiceCategories.d8);

                StatBlockInfo.HDBlockInfo tempHDInfo = new StatBlockInfo.HDBlockInfo();
                tempHDInfo.ParseHDBlock(MonSB.HD);
                //tempHDInfo.HDType = StatBlockInfo.HitDiceCategories.d8; //keeps HD, change to d8
                //tempHDInfo.Modifier = 0;
                //MonSB.HD = tempHDInfo.ToString();
                CreatureTypeFoundation CreatureType = CreatureTypeDetailsWrapper.GetRaceDetailClass("undead");
                int fort = StatBlockInfo.ParseSaveBonues(tempHDInfo.Multiplier, CreatureType.FortSaveType);
                CreatureTypeMaster CreatureTypeMaster = new CreatureTypeMaster();
                CreatureTypeMaster.CreatureTypeInstance = CreatureType;
                fort      += StatBlockInfo.GetAbilityModifier(MonSB.GetAbilityScoreValue(CreatureTypeMaster.CreatureTypeInstance.FortMod()));
                MonSB.Fort = fort.ToString();
                int refValue = StatBlockInfo.ParseSaveBonues(tempHDInfo.Multiplier, CreatureType.RefSaveType);
                refValue += StatBlockInfo.GetAbilityModifier(MonSB.GetAbilityScoreValue(StatBlockInfo.DEX));
                MonSB.Ref = refValue.ToString();
                int will = StatBlockInfo.ParseSaveBonues(tempHDInfo.Multiplier, CreatureType.WillSaveType);
                will      += StatBlockInfo.GetAbilityModifier(MonSB.GetAbilityScoreValue(StatBlockInfo.WIS));
                MonSB.Will = will.ToString();
            }


            MonSB.AC_Mods = StatBlockInfo.ChangeAC_Mod(MonSB.AC_Mods, "natural", 6, true);

            MonSB.Feats = StatBlockInfo.AddFeat(MonSB.Feats, "AlertnessB");
            MonSB.Feats = StatBlockInfo.AddFeat(MonSB.Feats, "Combat ReflexesB");
            MonSB.Feats = StatBlockInfo.AddFeat(MonSB.Feats, "DodgeB");
            MonSB.Feats = StatBlockInfo.AddFeat(MonSB.Feats, "Improved InitiativeB");
            MonSB.Feats = StatBlockInfo.AddFeat(MonSB.Feats, "Lightning ReflexesB");
            MonSB.Feats = StatBlockInfo.AddFeat(MonSB.Feats, "ToughnessB");

            MonSB.RacialMods = StatBlockInfo.AddRacialMod(MonSB.RacialMods, "+8 Bluff");
            MonSB.RacialMods = StatBlockInfo.AddRacialMod(MonSB.RacialMods, "+8 Perception");
            MonSB.RacialMods = StatBlockInfo.AddRacialMod(MonSB.RacialMods, "+8 Sense Motive");
            MonSB.RacialMods = StatBlockInfo.AddRacialMod(MonSB.RacialMods, "+8 Stealth");

            TemplateCommon.AddDR(MonSB, "magic and silver", 10);

            TemplateCommon.AddResistance(MonSB, "cold ", 10);
            TemplateCommon.AddResistance(MonSB, "electricity ", 10);

            return(MonSB);
        }
        public int RaceWill()
        {
            switch (BaseRaceType)
            {
            case RaceType.Race:
                return(0);

            case RaceType.StatBlock:
            case RaceType.BestiaryStatBlock:
                // if (IsHumanoid) return 0; // determined by class
                if (!UseRacialHD)
                {
                    return(0);                  // determined by class
                }
                if (_useTemplateValues)
                {
                    int modWill = StatBlockInfo.GetAbilityModifier(GetAbilityScore(StatBlockInfo.WIS));
                    return(Convert.ToInt32(Race_SB.Will) - modWill);
                }
                else
                {
                    if (WillOverride == StatBlockInfo.SaveBonusType.None)
                    {
                        StatBlockInfo.HDBlockInfo racialHDInfo = new StatBlockInfo.HDBlockInfo();
                        racialHDInfo.ParseHDBlock(RacialHD());
                        return(CreatureTypeMaster.GetWillSaveValue(racialHDInfo.Multiplier));
                    }
                    else
                    {
                        return(StatBlockInfo.ParseSaveBonues(RacialHDValue(), WillOverride));
                    }
                }

            case RaceType.None:
                return(0);
            }
            return(-1);
        }
Beispiel #6
0
        public override MonsterStatBlock ApplyTemplate(MonsterStatBlock MonSB)
        {
            TemplateCommon.ChangeHD(MonSB, StatBlockInfo.HitDiceCategories.d8);

            StatBlockInfo.HDBlockInfo tempHDInfo = new StatBlockInfo.HDBlockInfo();
            tempHDInfo.ParseHDBlock(MonSB.HD);
            double HD   = Convert.ToInt32(tempHDInfo.Multiplier);
            double temp = HD / 3;

            MonSB.BaseAtk = "+" + Math.Floor(temp).ToString();

            temp       = HD / 3; //Fort
            MonSB.Fort = "+" + Math.Floor(temp).ToString();

            temp      = HD / 3; ///Ref
            MonSB.Ref = "+" + Math.Floor(temp).ToString();

            temp       = HD / 2; ///Will
            MonSB.Will = "+" + (Math.Floor(temp) + 2).ToString();

            TemplateCommon.AddResistance(MonSB, "slashing ", 5);

            return(MonSB);
        }
        public override MonsterStatBlock ApplyTemplate(MonsterStatBlock MonSB)
        {
            StatBlockInfo.HDBlockInfo tempHDInfo = new StatBlockInfo.HDBlockInfo();
            tempHDInfo.ParseHDBlock(MonSB.HD);
            tempHDInfo.HDType   = StatBlockInfo.HitDiceCategories.d8; //keeps HD, change to d8
            tempHDInfo.Modifier = 0;
            MonSB.HD            = tempHDInfo.ToString();

            double HD   = Convert.ToInt32(tempHDInfo.Multiplier);
            double temp = (HD * 3) / 4;

            MonSB.BaseAtk = "+" + Math.Floor(temp).ToString();

            temp       = HD / 3; //Fort
            MonSB.Fort = "+" + Math.Floor(temp).ToString();

            temp      = HD / 3; ///Ref
            MonSB.Ref = "+" + Math.Floor(temp).ToString();

            temp       = HD / 2; ///Will
            MonSB.Will = "+" + (Math.Floor(temp) + 2).ToString();

            switch (StatBlockInfo.GetSizeEnum(MonSB.Size))
            {
            case StatBlockInfo.SizeCategories.Tiny:
                temp = 0;
                break;

            case StatBlockInfo.SizeCategories.Small:
                temp = 1;
                break;

            case StatBlockInfo.SizeCategories.Medium:
            case StatBlockInfo.SizeCategories.Large:
                temp = 2;
                break;

            case StatBlockInfo.SizeCategories.Huge:
                temp = 3;
                break;

            case StatBlockInfo.SizeCategories.Gargantuan:
                temp = 6;
                break;

            case StatBlockInfo.SizeCategories.Colossal:
                temp = 10;
                break;

            default:
                temp = 0;
                break;
            }


            MonSB.AC_Mods = StatBlockInfo.ChangeAC_Mod(MonSB.AC_Mods, "natural", Convert.ToInt32(temp), false);

            TemplateCommon.AddDR(MonSB, "bludgeoning", 5);

            return(MonSB);
        }
        public static MonsterStatBlock AppyBaseZombieTemplate(MonsterStatBlock MonSB)
        {
            StatBlockInfo.HDBlockInfo tempHDInfo = new StatBlockInfo.HDBlockInfo();
            tempHDInfo.ParseHDBlock(MonSB.HD);
            tempHDInfo.HDType   = StatBlockInfo.HitDiceCategories.d8; //keeps HD, change to d8
            tempHDInfo.Modifier = 0;
            MonSB.HD            = tempHDInfo.ToString();

            double HD   = Convert.ToInt32(tempHDInfo.Multiplier);
            double temp = (HD * 3) / 4;

            MonSB.BaseAtk = "+" + Math.Floor(temp).ToString();

            temp       = HD / 3; //Fort
            MonSB.Fort = "+" + Math.Floor(temp).ToString();

            temp      = HD / 3; ///Ref
            MonSB.Ref = "+" + Math.Floor(temp).ToString();

            temp       = HD / 2; ///Will
            MonSB.Will = "+" + (Math.Floor(temp) + 2).ToString();

            switch (StatBlockInfo.GetSizeEnum(MonSB.Size))
            {
            case StatBlockInfo.SizeCategories.Tiny:
                temp = 0;
                break;

            case StatBlockInfo.SizeCategories.Small:
                temp = 1;
                break;

            case StatBlockInfo.SizeCategories.Medium:
                temp = 2;
                break;

            case StatBlockInfo.SizeCategories.Large:
                temp = 3;
                break;

            case StatBlockInfo.SizeCategories.Huge:
                temp = 4;
                break;

            case StatBlockInfo.SizeCategories.Gargantuan:
                temp = 7;
                break;

            case StatBlockInfo.SizeCategories.Colossal:
                temp = 11;
                break;

            default:
                temp = 0;
                break;
            }

            TemplateCommon.ChangeHD(MonSB, StatBlockInfo.HitDiceCategories.d8);

            TemplateCommon.AddDR(MonSB, "slashing", 5);

            MonSB.AC_Mods = StatBlockInfo.ChangeAC_Mod(MonSB.AC_Mods, "natural", Convert.ToInt32(temp), false);

            MonSB.Skills = string.Empty;
            MonSB.Feats  = "ToughnessB";

            return(MonSB);
        }
        public IHitDiceCheckerOutput CheckHDValue()
        {
            HitDiceCheckerOutput output = new HitDiceCheckerOutput();

            try
            {
                string CheckName = "HD";
                string holdHD    = _sbCheckerBaseInput.MonsterSB.HD;
                holdHD = holdHD.Replace(PathfinderConstants.PAREN_LEFT, string.Empty).Replace(PathfinderConstants.PAREN_RIGHT, string.Empty).Replace(" plus ", "+");
                int Pos = holdHD.IndexOf("temporary");
                if (Pos != -1)
                {
                    Pos    = holdHD.LastIndexOf("+", Pos);
                    holdHD = holdHD.Substring(0, Pos).Trim();
                }

                Pos = holdHD.LastIndexOf("+");
                int Pos2 = holdHD.LastIndexOf("d");
                output.HDModifier = _sbCheckerBaseInput.MonsterSB.HDMod();
                string racialHD = _sbCheckerBaseInput.CharacterClasses.HasClass("animal companion") || _sbCheckerBaseInput.CharacterClasses.HasClass("eidolon")
                         ? string.Empty : _sbCheckerBaseInput.Race_Base.RacialHD();
                racialHD = HandleAnimatedObject(racialHD);

                if (Pos >= 0 && Pos2 < Pos)
                {
                    //string temp = holdHD.Substring(Pos);

                    //  _hdModifier = Convert.ToInt32(temp);
                    // holdHD = holdHD.Replace(temp, string.Empty).Trim();
                    holdHD = holdHD.Substring(0, Pos);
                }


                List <string> hitDiceBlocks = FindHDBlocks(holdHD);

                StatBlockInfo.HDBlockInfo racialHDInfo = new StatBlockInfo.HDBlockInfo();
                int  Count = 0;
                bool Found = false;
                bool Pass  = true;

                HandleHDBlocks(hitDiceBlocks);

                if (racialHD.Length > 0)
                {
                    racialHDInfo.ParseHDBlock(racialHD);
                }

                output.TotalHd = 0;
                foreach (StatBlockInfo.HDBlockInfo tempBlock in _hitDiceBlockInfo)
                {
                    output.TotalHd += tempBlock.Multiplier;
                    if (racialHD.Length > 0 && tempBlock.HDType != racialHDInfo.HDType && tempBlock.Multiplier != racialHDInfo.Multiplier)
                    {
                        output.TotalHdNonRacial += tempBlock.Multiplier;
                    }
                }


                List <string>             foundClassesList     = new List <string>();
                StatBlockInfo.HDBlockInfo tempHDInfo           = new StatBlockInfo.HDBlockInfo();
                List <ClassWrapper>       tempCharacterClasses = new List <ClassWrapper>(_sbCheckerBaseInput.CharacterClasses.Classes);
                HandleHdInfos(ref tempHDInfo, ref Count, ref Found, foundClassesList, tempCharacterClasses);

                tempHDInfo = HandleMythic(tempHDInfo, foundClassesList, tempCharacterClasses);

                int hdMultiplier = 0;
                if (racialHD.Length > 0)
                {
                    foreach (StatBlockInfo.HDBlockInfo tempBlock in _hitDiceBlockInfo)
                    {
                        hdMultiplier = tempBlock.Multiplier;
                        if (racialHDInfo.HDType == tempBlock.HDType)
                        {
                            hdMultiplier -= racialHDInfo.Multiplier;
                        }
                        if (hdMultiplier != 0)
                        {
                            _sbCheckerBaseInput.MessageXML.AddFail(CheckName, "Wrong HD for " + tempBlock.HDType.ToString());
                            Pass = false;
                        }
                    }
                }

                if (foundClassesList.Count != _sbCheckerBaseInput.CharacterClasses.Classes.Count)
                {
                    string hold = string.Empty;
                    foreach (ClassWrapper wrapper in tempCharacterClasses)
                    {
                        hold += wrapper.Name + ",";
                    }
                    hold = hold.Substring(0, hold.Length - 1);
                    _sbCheckerBaseInput.MessageXML.AddFail(CheckName, "Missing HD for Classes " + hold);
                    Pass = false;
                }


                if (Pass)
                {
                    _sbCheckerBaseInput.MessageXML.AddPass(CheckName);
                }
            }
            catch (Exception ex)
            {
                _sbCheckerBaseInput.MessageXML.AddFail("CheckHDValue", ex.Message);
            }

            return(output);
        }
 public int RacialHDValue()
 {
     StatBlockInfo.HDBlockInfo racialHDInfo = new StatBlockInfo.HDBlockInfo();
     racialHDInfo.ParseHDBlock(RacialHD());
     return(racialHDInfo.Multiplier);
 }
Beispiel #11
0
        public void CheckMeleeWeaponDamage(Weapon weapon, string weaponsDamage, bool TwoWeaponFighting, bool BiteAttack, int weaponCount, int weaponIndex,
                                           string Size, AbilityScores.AbilityScores _abilityScores, MonSBSearch _monSBSearch, StatBlockMessageWrapper _messageXML, int FighterLevel, int ACDefendingMod, bool MagicWeapon, bool GreaterMagicWeapon, IndividualStatBlock_Combat _indvSB)
        {
            string formula           = string.Empty;
            bool   hasSizeDifference = false;


            StatBlockInfo.SizeCategories MonSize    = StatBlockInfo.GetSizeEnum(Size);
            StatBlockInfo.SizeCategories WeaponSize = weapon.WeaponSize;
            if (MonSize != WeaponSize)
            {
                hasSizeDifference = true;
            }

            if (_monSBSearch.HasSQ("undersized weapons"))
            {
                MonSize = StatBlockInfo.ReduceSize(MonSize);
            }

            StatBlockInfo.HDBlockInfo  damageComputed = new StatBlockInfo.HDBlockInfo();
            ShieldSpecialAbilitiesEnum shieldSA       = weapon.ShieldSpecialAbilities.ShieldSpecialAbilityValues;

            bool ShieldBashBoost = false;

            if ((shieldSA & ShieldSpecialAbilitiesEnum.Bashing) == ShieldSpecialAbilitiesEnum.Bashing)
            {
                ShieldBashBoost = true;
                MonSize         = StatBlockInfo.IncreaseSize(MonSize);
                MonSize         = StatBlockInfo.IncreaseSize(MonSize);
            }

            bool   HasNewWeaponDamge = false;
            Weapon weaponDamage      = null;

            if (weapon.search_name.ToLower() == "halfling sling staff")
            {
                weaponDamage      = _weaponBusiness.GetWeaponByName("club");
                HasNewWeaponDamge = true;
            }


            weaponsDamage = weaponsDamage.Replace(PathfinderConstants.PAREN_LEFT, string.Empty).Replace(PathfinderConstants.PAREN_RIGHT, string.Empty)
                            .Replace("nonlethal", string.Empty);
            int    Pos = weaponsDamage.IndexOf("/");
            string weaponCrit;

            if (Pos >= 0)
            {
                weaponCrit    = weaponsDamage.Substring(Pos + 1);
                weaponsDamage = weaponsDamage.Substring(0, Pos);
            }
            StatBlockInfo.HDBlockInfo damageSB = new StatBlockInfo.HDBlockInfo();
            if (weaponsDamage.Contains("|"))
            {
                Pos           = weaponsDamage.IndexOf("|");
                weaponsDamage = weaponsDamage.Substring(0, Pos);
            }
            damageSB.ParseHDBlock(weaponsDamage.Trim());

            if (weapon.@double)
            {
                //for double weapons assume the damage in the string is one of the ends
                if (weapon.damage_medium.Contains(damageSB.HDType.ToString()))
                {
                    weapon.damage_medium = damageSB.Multiplier.ToString() + damageSB.HDType.ToString();
                }

                if (weapon.damage_small.Contains(damageSB.HDType.ToString()))
                {
                    weapon.damage_small = damageSB.Multiplier.ToString() + damageSB.HDType.ToString();
                }
            }

            if (MonSize == StatBlockInfo.SizeCategories.Medium && !ShieldBashBoost && !hasSizeDifference)
            {
                if (HasNewWeaponDamge)
                {
                    damageComputed.ParseHDBlock(weapon.damage_medium);
                }
                else
                {
                    damageComputed.ParseHDBlock(weapon.damage_medium);
                }
            }
            else if (MonSize == StatBlockInfo.SizeCategories.Small && !ShieldBashBoost && !hasSizeDifference)
            {
                if (HasNewWeaponDamge)
                {
                    damageComputed.ParseHDBlock(weapon.damage_small);
                }
                else
                {
                    damageComputed.ParseHDBlock(weapon.damage_small);
                }
            }
            else if (!hasSizeDifference)
            {
                if (HasNewWeaponDamge)
                {
                    damageComputed.ParseHDBlock(StatBlockInfo.ChangeWeaponDamageSize(weaponDamage.damage_medium, MonSize));
                }
                else
                {
                    damageComputed.ParseHDBlock(StatBlockInfo.ChangeWeaponDamageSize(weapon.damage_medium, MonSize));
                }
            }
            else
            {
                //hasSizeDifference = true
                if (MonSize == StatBlockInfo.SizeCategories.Small)
                {
                    damageComputed.ParseHDBlock(weapon.damage_small);
                }
                else
                {
                    StatBlockInfo.SizeCategories tempSize = StatBlockInfo.SizeCategories.Medium;
                    if (WeaponSize == tempSize)
                    {
                        tempSize = MonSize;
                    }
                    damageComputed.ParseHDBlock(StatBlockInfo.ChangeWeaponDamageSize(weapon.damage_medium, tempSize));
                }
            }

            double StrBonus;
            bool   OneHandedAsTwo;
            string ModUsed = ComputeStrBonus(weapon, TwoWeaponFighting, BiteAttack, weaponCount, weaponIndex, _monSBSearch, _abilityScores, out StrBonus, out OneHandedAsTwo);

            formula += " +" + StrBonus.ToString() + PathfinderConstants.SPACE + ModUsed + " Bonus Used";
            damageComputed.Modifier += Convert.ToInt32(StrBonus);

            if (weapon.WeaponSpecialMaterial == WeaponSpecialMaterials.AlchemicalSilver && (weapon.slashing || weapon.piercing))
            {
                damageComputed.Modifier--;
                formula += " -1 Alchemical Silver";
            }

            if (_monSBSearch.HasSQ("hulking changeling"))
            {
                damageComputed.Modifier++;
                formula += " +1 hulking changeling";
            }

            string hold2 = weapon.NamedWeapon ?  weapon.BaseWeaponName :  weapon.search_name;

            if (_monSBSearch.HasSpecialAttackGeneral("weapon training"))
            {
                damageComputed.Modifier += _monSBSearch.GetWeaponsTrainingModifier(hold2, ref formula);
            }

            damageComputed.Modifier += PoleArmTraingMods(weapon, _monSBSearch, FighterLevel, ref formula);

            bool ignoreEnhancement = false;

            if (weapon.name.ToLower() == "unarmed strike")
            {
                damageComputed.Modifier += _monSBSearch.GetOnGoingStatBlockModValue(OnGoingStatBlockModifier.StatBlockModifierTypes.NaturalDamage,
                                                                                    OnGoingStatBlockModifier.StatBlockModifierSubTypes.None, ref formula);
            }
            else
            {
                WeaponCommon weaponCommon = new WeaponCommon(_sbCheckerBaseInput, _equipmentData, _naturalWeaponBusiness);
                weaponCommon.GetOnGoingDamageMods(MagicWeapon, GreaterMagicWeapon, _indvSB, ref formula, ref damageComputed, ref ignoreEnhancement);
            }

            if ((weapon.WeaponSpecialAbilities.WeaponSpecialAbilitiesValue & WeaponSpecialAbilitiesEnum.Furious) == WeaponSpecialAbilitiesEnum.Furious)
            {
                damageComputed.Modifier += 2;
                formula += " +1 furious";
            }

            string hold = weapon.NamedWeapon ?  weapon.BaseWeaponName.ToLower() :  weapon.search_name.ToLower();

            if (hold.Contains("aldori"))
            {
                hold = hold.Replace("aldori", "Aldori");
            }

            if (_sbCheckerBaseInput.CharacterClasses.HasClass("aldori swordlord"))
            {
                if (hold.Contains("dueling sword"))
                {
                    int tenpMod = _monSBSearch.GetAbilityMod(AbilityScores.AbilityScores.AbilityName.Dexterity);
                    formula += " +" + tenpMod.ToString() + " Deft Strike";
                    damageComputed.Modifier += tenpMod;
                }
            }

            if (_monSBSearch.HasFeat("Weapon Specialization (" + hold + PathfinderConstants.PAREN_RIGHT))
            {
                formula += " +2 Weapon Specialization";
                damageComputed.Modifier += 2;
            }

            if (_monSBSearch.HasFeat("Greater Weapon Specialization (" + hold + PathfinderConstants.PAREN_RIGHT))
            {
                formula += " +2 Greater Weapon Specialization";
                damageComputed.Modifier += 2;
            }

            if (_monSBSearch.HasTemplate("graveknight"))
            {
                damageComputed.Modifier += 2;
                formula += " +2 Sacrilegious Aura";
            }

            if (_monSBSearch.HasFeat("Shield Master") && weapon.name.Contains("shield"))
            {
                formula += " +" + weapon.EnhancementBonus + " Shield Master";
                damageComputed.Modifier += weapon.EnhancementBonus;
            }

            //no enchantment bonus for shield bash
            if (weapon.EnhancementBonus > 0 && ACDefendingMod == 0 && !weapon.name.Contains("shield") && !ignoreEnhancement)
            {
                formula += " +" + weapon.EnhancementBonus.ToString() + " Enhancement Bonus";
                damageComputed.Modifier += weapon.EnhancementBonus;
            }

            if (weapon.Broken)
            {
                formula += " -2 Broken";
                damageComputed.Modifier -= 2;
            }

            if (damageSB.Equals(damageComputed))
            {
                _messageXML.AddPass("Melee Attack Damage-" + weapon.Weapon_FullName(), formula);
            }
            else
            {
                int temp5 = damageComputed.Modifier - 1;

                if (OneHandedAsTwo && damageSB.Modifier == temp5 && !_monSBSearch.HasShield()) // not all SB use two handed weapons; not error, their choice
                {
                    _messageXML.AddInfo(weapon.Weapon_FullName() + " could be used two-handed for extra damage");
                    _messageXML.AddPass("Melee Attack Damage-" + weapon.Weapon_FullName());
                }
                else
                {
                    _messageXML.AddFail("Melee Attack Damage-" + weapon.Weapon_FullName(), damageComputed.ToString(), damageSB.ToString(), formula);
                    if (OneHandedAsTwo)
                    {
                        _messageXML.AddFail("Melee Attack Damage-", "Weapon could be used As Two-Handed?");
                    }
                }
            }
            string tempWeaponCrit = weapon.critical.Replace("/×2", string.Empty);

            tempWeaponCrit = tempWeaponCrit.Replace((char)(8211), char.Parse("-"));
            //if (tempWeaponCrit == weaponCrit)
            //{
            //    _messageXML.AddPass("Melee Attack Critical- " + weapon.Weapon_FullName());
            //}
            //else
            //{
            //    _messageXML.AddFail("Melee Attack Critical- " + weapon.Weapon_FullName(), weapon.critical, weaponCrit);

            //}
        }
Beispiel #12
0
        public void CheckRangedWeaponDamage(Weapon weapon, string weaponsDamage, string size, AbilityScores.AbilityScores _abilityScores,
                                            MonSBSearch _monSBSearch, StatBlockMessageWrapper _messageXML, bool MagicWeapon, bool GreaterMagicWeapon, IndividualStatBlock_Combat _indvSB)
        {
            string formula = string.Empty;

            StatBlockInfo.SizeCategories MonSize = StatBlockInfo.GetSizeEnum(size);

            if (_monSBSearch.HasSQ("undersized weapons"))
            {
                MonSize = StatBlockInfo.ReduceSize(MonSize);
            }

            StatBlockInfo.HDBlockInfo damageComputed = new StatBlockInfo.HDBlockInfo();
            if (weapon.name == "Sling" && _monSBSearch.HasGear("stones"))
            {
                damageComputed.ParseHDBlock(weapon.damage_small);
            }
            else if (MonSize == StatBlockInfo.SizeCategories.Medium)
            {
                damageComputed.ParseHDBlock(weapon.damage_medium);
            }
            else if (MonSize == StatBlockInfo.SizeCategories.Small)
            {
                damageComputed.ParseHDBlock(weapon.damage_small);
            }
            else
            {
                damageComputed.ParseHDBlock(StatBlockInfo.ChangeWeaponDamageSize(weapon.damage_medium, MonSize));
            }

            if (!weaponsDamage.Contains("entangle"))
            {
                ComputeRangeMod(weapon, _abilityScores, _monSBSearch, _messageXML, ref formula, ref damageComputed);
            }

            if (_monSBSearch.HasSpecialAttackGeneral("weapon training"))
            {
                damageComputed.Modifier += _monSBSearch.GetWeaponsTrainingModifier(weapon.search_name, ref formula);
            }

            if (_monSBSearch.HasClassArchetype("crossbowman"))
            {
                int fighterLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("fighter");
                if (fighterLevel >= 3)
                {
                    int dexBonus = _abilityScores.DexMod / 2;
                    if (dexBonus <= 0)
                    {
                        dexBonus = 1;
                    }
                    damageComputed.Modifier += dexBonus;
                    formula += " +" + dexBonus.ToString() + " crossbowman deadshot";
                }

                if (fighterLevel >= 5)
                {
                    int tempBonus = 1;
                    if (fighterLevel >= 9)
                    {
                        tempBonus++;
                    }
                    if (fighterLevel >= 13)
                    {
                        tempBonus++;
                    }
                    if (fighterLevel >= 17)
                    {
                        tempBonus++;
                    }
                    damageComputed.Modifier += tempBonus;
                    formula += " +" + tempBonus.ToString() + " crossbowman crossbow expert";
                }
            }

            if (_monSBSearch.HasClassArchetype("archer"))
            {
                int fighterLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("fighter");

                if (fighterLevel >= 5)
                {
                    int tempBonus = 1;
                    if (fighterLevel >= 9)
                    {
                        tempBonus++;
                    }
                    if (fighterLevel >= 13)
                    {
                        tempBonus++;
                    }
                    if (fighterLevel >= 17)
                    {
                        tempBonus++;
                    }
                    damageComputed.Modifier += tempBonus;
                    formula += " +" + tempBonus.ToString() + " Expert Archer";
                }
            }

            string hold = weapon.NamedWeapon ? weapon.BaseWeaponName.ToLower() : weapon.search_name.ToLower();

            if (_monSBSearch.HasFeat("Weapon Specialization (" + hold + PathfinderConstants.PAREN_RIGHT))
            {
                formula += " +2 Weapon Specialization";
                damageComputed.Modifier += 2;
            }

            if (_monSBSearch.HasFeat("Greater Weapon Specialization (" + hold + PathfinderConstants.PAREN_RIGHT))
            {
                formula += " +2 Greater Weapon Specialization";
                damageComputed.Modifier += 2;
            }

            if (weapon.WeaponSpecialMaterial == WeaponSpecialMaterials.AlchemicalSilver && (weapon.slashing || weapon.piercing))
            {
                damageComputed.Modifier--;
                formula += " -1 Alchemical Silver";
            }

            if (weapon.EnhancementBonus > 0)
            {
                damageComputed.Modifier += weapon.EnhancementBonus;
                formula += " +" + weapon.EnhancementBonus.ToString() + " Enhancement Bonus";
            }

            if (_abilityScores.StrMod != 0 && Utility.IsThrownWeapon(weapon.search_name.ToLower()))
            {
                int MeleeModUsed = _abilityScores.StrMod;

                if (_monSBSearch.HasDefensiveAbility("incorporeal"))
                {
                    MeleeModUsed = _abilityScores.DexMod;
                }
                formula += " +" + MeleeModUsed.ToString() + " Str Bonus Used- Thrown";
                damageComputed.Modifier += Convert.ToInt32(MeleeModUsed);
            }

            if (weapon.name.Contains("bow") && !weapon.name.ToLower().Contains("composite") && !weapon.name.ToLower().Contains("cross") && _abilityScores.StrMod < 0)
            {
                damageComputed.Modifier += _abilityScores.StrMod;
            }

            bool         ignoreEnhancement = false;
            WeaponCommon weaponCommon      = new WeaponCommon(_sbCheckerBaseInput, _equipmentData, _naturalWeaponBusiness);

            weaponCommon.GetOnGoingDamageMods(MagicWeapon, GreaterMagicWeapon, _indvSB, ref formula, ref damageComputed, ref ignoreEnhancement);

            weaponsDamage = weaponsDamage.Replace(PathfinderConstants.PAREN_LEFT, string.Empty).Replace(PathfinderConstants.PAREN_RIGHT, string.Empty)
                            .Replace("nonlethal", string.Empty);
            int    Pos = weaponsDamage.IndexOf("/");
            string weaponCrit;

            if (Pos >= 0)
            {
                weaponCrit    = weaponsDamage.Substring(Pos + 1);
                weaponsDamage = weaponsDamage.Substring(0, Pos);
            }
            StatBlockInfo.HDBlockInfo damageSB = new StatBlockInfo.HDBlockInfo();
            damageSB.ParseHDBlock(weaponsDamage.Trim());

            if (weapon.name == "rock" && _monSBSearch.HasSpecialAttackGeneral("rock throwing"))
            {
                if (damageComputed.Modifier != (_abilityScores.StrMod * 1.5))
                {
                    _messageXML.AddFail("Ranged Attack Damage- Rock ", (_abilityScores.StrMod * 1.5).ToString(), damageComputed.Modifier.ToString());
                }
            }


            if (weapon.name == "bomb" && _sbCheckerBaseInput.CharacterClasses.HasClass("alchemist"))
            {
                damageComputed        = new StatBlockInfo.HDBlockInfo();
                damageComputed.HDType = StatBlockInfo.HitDiceCategories.d6;
                int alchemistLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("alchemist");
                damageComputed.Multiplier = ((alchemistLevel - 1) / 2) + 1;
                damageComputed.Modifier   = _abilityScores.IntMod;

                formula = "+" + _abilityScores.IntMod.ToString() + " Int mod";
            }

            if (damageSB.Equals(damageComputed))
            {
                _messageXML.AddPass("Ranged Attack Damage " + weapon.Weapon_FullName(), formula);
            }
            else
            {
                _messageXML.AddFail("Ranged Attack Damage " + weapon.Weapon_FullName(), damageComputed.ToString(), damageSB.ToString(), formula);
            }

            //string tempWeaponCrit = weapon.critical.Replace("/×2", string.Empty);
            //tempWeaponCrit = tempWeaponCrit.Replace((char)(8211), Char.Parse("-"));
            //if (tempWeaponCrit == weaponCrit)
            //{
            //    _messageXML.AddPass("Ranged Attack Critical- " + weapon.Weapon_FullName());
            //}
            //else
            //{
            //    _messageXML.AddFail("Ranged Attack Critical- " + weapon.Weapon_FullName(), weapon.critical, weaponCrit);

            //}
        }