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