private void ComputeSpellDC(bool IsGnome, ref string formula, string name, int AbilityBonus, ref int Bonus, SpellData SD, ISpellStatBlock Spell) { int Bloodline = 0; int gnomeBonus = 0; int spellClassLevel = Spell.GetSpellLevelByClass(name, _monSBSearch.HasCurse("haunted"), _monSBSearch.HasFeat("Shade of the Uskwood"), _monSBSearch.HasArchetype("Razmiran priest")); if (SD.Domain) { spellClassLevel = SD.Level; } // if (spellClassLevel < 0 && SD.Domain) spellClassLevel = SD.Level; if (spellClassLevel < 0 && _monSBSearch.HasBloodline()) { Dictionary <string, int> bloodlineBonusSpells = CharacterClasses.GetBloodlineBonusSpells(); if (bloodlineBonusSpells.ContainsKey(Spell.name.ToLower())) { spellClassLevel = SD.Level; } } if (spellClassLevel < 0 && _monSBSearch.HasMystery()) { Dictionary <string, int> mysteryBonusSpells = CharacterClasses.GetMysteryBonusSpells(); if (mysteryBonusSpells.ContainsKey(Spell.name.ToLower())) { spellClassLevel = SD.Level; } } if (spellClassLevel < 0 && _monSBSearch.HasPatron()) { List <string> patronBonusSpells = CharacterClasses.GetPatronBonusSpells(); if (patronBonusSpells.Contains(Spell.name.ToLower())) { spellClassLevel = SD.Level; } } if (IsGnome && Spell.school.Contains("illusion")) { gnomeBonus = 1; } if (_monSBSearch.HasBloodline("arcane")) { int sorcererLevel = CharacterClasses.FindClassLevel("sorcerer"); if (sorcererLevel >= 15) { string schoolPower = _monSBSearch.GetSQ("school power"); schoolPower = schoolPower.Replace("spells)", string.Empty).Trim(); int Pos = schoolPower.LastIndexOf(" "); schoolPower = schoolPower.Substring(Pos).Trim(); if (Spell.school.Contains(schoolPower)) { Bloodline += 2; } } } if (_monSBSearch.HasBloodline("fey")) { if (Spell.subschool.Contains("compulsion")) { Bloodline += 2; } } if (_monSBSearch.HasBloodline("stormborn")) { if (Spell.descriptor.Contains("electricity") || Spell.descriptor.Contains("sonic")) { Bloodline += 1; } } if (_monSBSearch.HasBloodline("infernal")) { if (Spell.subschool.Contains("charm")) { Bloodline += 2; } } if (_monSBSearch.HasClassArchetype("winter witch")) { if (Spell.descriptor.Contains("cold")) { Bonus += 1; } } if (_monSBSearch.Race() == "kitsune" && Spell.school.Contains("enchantment")) { Bonus += 1; } if (_monSBSearch.HasSubType("sahkil") && (Spell.school.Contains("emotion") || Spell.school.Contains("fear"))) { Bonus += 2; } List <string> School; if (_monSBSearch.HasElementalSkillFocusFeat(out School)) { if (School.Contains(Spell.descriptor)) { Bonus++; } List <string> School2; if (_monSBSearch.HasGreaterElementalSkillFocusFeat(out School2)) { if (School2.Contains(Spell.descriptor)) { Bonus++; } } } int computedDC = 10 + spellClassLevel + AbilityBonus + Bonus + Bloodline + gnomeBonus; formula = "10 +" + spellClassLevel.ToString() + " spell class level +" + AbilityBonus.ToString() + " ability bonus"; if (Bloodline != 0) { formula += " +" + Bloodline.ToString() + " bloodline"; } if (gnomeBonus != 0) { formula += " +" + gnomeBonus.ToString() + " gnome magic"; } if (Bonus != 0) { formula += " +" + Bonus.ToString() + " skill/spell focus bonus"; } if (computedDC == SD.DC) { _messageXML.AddPass("Spell DC-" + SD.Name); } else { _messageXML.AddFail("Spell DC-" + SD.Name, computedDC.ToString(), SD.DC.ToString(), formula); } }
public void CheckACValue() { string CheckName = "AC Value"; int FlatFootedMod = 0; int DexBonus = 0; int DexUsed = _monSBSearch.GetAbilityMod(AbilityScores.AbilityScores.AbilityName.Dexterity); int DexMod = DexUsed; int Duelist = 0; int OnGoingMods = 0; string formula = string.Empty; if (CharacterClasses.HasClass("duelist")) //Canny Defense { int IntMod = _monSBSearch.GetAbilityMod(AbilityScores.AbilityScores.AbilityName.Intelligence); if (IntMod > 0) { int Mod = 0; int DuelistLevel = CharacterClasses.FindClassLevel("duelist"); if (IntMod >= DuelistLevel) { Mod = DuelistLevel; } else { Mod = IntMod; } Duelist = Mod; } } if (MaxDexMod > -1) //negative number means no penalty { if (MaxDexMod < DexMod) { DexUsed = MaxDexMod; formula += " MaxDex: was " + MaxDexMod.ToString() + " even though Dex mod is " + (DexMod).ToString(); // Duelist = 0; } } if (DexMod > 0) { DexBonus = DexUsed; } if (_monSBSearch.HasFeat("Uncanny Dodge")) { FlatFootedMod = DexUsed; } switch (Race) { case "kasatha": ACMods_Computed.Dodge += 2; break; case "Svirfneblin": ACMods_Computed.Dodge += 2; break; } if (_monSBSearch.HasSQ("void form")) { ACMods_Computed.Deflection += HD / 4; } if (_monSBSearch.HasSubType("clockwork")) { ACMods_Computed.Dodge += 2; } if (CharacterClasses.HasClass("sorcerer")) //Natural Armor Increase { if (_monSBSearch.HasBloodline("draconic")) { int sorLevel = CharacterClasses.FindClassLevel("sorcerer"); if (sorLevel >= 3) { ACMods_Computed.Natural += 1; } if (sorLevel >= 9) { ACMods_Computed.Natural += 1; } if (sorLevel >= 15) { ACMods_Computed.Natural += 2; } } } if (CharacterClasses.HasClass("oracle")) { if (_monSBSearch.HasMystery("ancestor") && _monSBSearch.HasSQ("spirit shield")) { int oracleLevel = CharacterClasses.FindClassLevel("oracle"); if (oracleLevel >= 1) { ACMods_Computed.Armor += 4; } if (oracleLevel >= 7) { ACMods_Computed.Armor += 2; } if (oracleLevel >= 11) { ACMods_Computed.Armor += 2; } if (oracleLevel >= 15) { ACMods_Computed.Armor += 2; } if (oracleLevel >= 19) { ACMods_Computed.Armor += 2; } } } if (CharacterClasses.HasClass("gunslinger")) //Nimble (Ex) { int gunslingerLevel = CharacterClasses.FindClassLevel("gunslinger"); if (gunslingerLevel >= 2) { ACMods_Computed.Dodge += 1; } if (gunslingerLevel >= 6) { ACMods_Computed.Dodge += 1; } if (gunslingerLevel >= 10) { ACMods_Computed.Dodge += 1; } if (gunslingerLevel >= 14) { ACMods_Computed.Dodge += 1; } if (gunslingerLevel >= 18) { ACMods_Computed.Dodge += 1; } } if (CharacterClasses.HasClass("swashbuckler")) //Nimble (Ex) { int swashbucklerLevel = CharacterClasses.FindClassLevel("swashbuckler"); if (swashbucklerLevel >= 3) { ACMods_Computed.Dodge += 1; } if (swashbucklerLevel >= 7) { ACMods_Computed.Dodge += 1; } if (swashbucklerLevel >= 11) { ACMods_Computed.Dodge += 1; } if (swashbucklerLevel >= 15) { ACMods_Computed.Dodge += 1; } if (swashbucklerLevel >= 19) { ACMods_Computed.Dodge += 1; } } if (CharacterClasses.HasClass("stalwart defender")) //AC Bonus (Ex) { int stalwartDefenderLevel = CharacterClasses.FindClassLevel("stalwart defender"); if (stalwartDefenderLevel >= 1) { ACMods_Computed.Dodge += 1; } if (stalwartDefenderLevel >= 4) { ACMods_Computed.Dodge += 1; } if (stalwartDefenderLevel >= 7) { ACMods_Computed.Dodge += 1; } if (stalwartDefenderLevel >= 10) { ACMods_Computed.Dodge += 1; } } if (CharacterClasses.HasClass("ranger") && _monSBSearch.HasArchetype("shapeshifter")) { if (_monSBSearch.HasSQ("form of the dragon")) { ACMods_Computed.Natural += 2; } } if (_monSBSearch.HasClassArchetype("staff magus")) //Quarterstaff Defense (Ex) { int magusLevel = CharacterClasses.FindClassLevel("magus"); //TO DO } if (_monSBSearch.HasFeat("Aldori Dueling Mastery")) { ACMods_Computed.Shield += 2; //Aldori Dueling Mastery } if (CharacterClasses.HasClass("prophet of kalistrade")) { int level = CharacterClasses.FindClassLevel("prophet of kalistrade"); //Auspicious Display --assumes the bling is present int mod = 1; if (level >= 4) { mod++; } if (level >= 7) { mod++; } if (level >= 10) { mod++; } ACMods_Computed.Dodge += mod; } //should be handled SBChecker.ParseACMods() //foreach (OnGoingStatBlockModifier mod in _onGoingMods) //{ // if (mod.ModType == OnGoingStatBlockModifier.StatBlockModifierTypes.AC) // { // OnGoingMods += mod.Modifier; // } //} if (_monSBSearch.HasTemplate("worm that walks")) { int WisMod = _monSBSearch.GetAbilityMod(AbilityScores.AbilityScores.AbilityName.Wisdom); if (WisMod < 2) { WisMod = 2; } ACMods_Computed.Insight += WisMod; } int OtherBonuses = ACMods_Computed.Enhancement + ACMods_Computed.Deflection + ACMods_Computed.Natural + ACMods_Computed.Dodge + ACMods_Computed.Wis + ACMods_Computed.Defending + ACMods_Computed.Insight + SizeMod + ACMods_Computed.Monk + Duelist + OnGoingMods; formula += " AC = 10 +" + ACMods_Computed.Armor.ToString() + " Armor +" + ACMods_Computed.Shield.ToString() + " Shield +" + DexUsed.ToString() + " Dex Used +" + OtherBonuses.ToString() + " Other Bonuses +" + ACMods_Computed.Rage + " Rage +" + ACMods_Computed.BloodRage + " Bloodrage"; if (OtherBonuses != 0) { formula += " Other Bonuses ="; if (ACMods_Computed.Enhancement != 0) { formula += " +" + ACMods_Computed.Enhancement.ToString() + " Enhancement"; } if (ACMods_Computed.Deflection != 0) { formula += " +" + ACMods_Computed.Deflection.ToString() + " Deflection"; } if (ACMods_Computed.Natural != 0) { formula += " +" + ACMods_Computed.Natural.ToString() + " Natural"; } if (ACMods_Computed.Dodge != 0) { formula += " +" + ACMods_Computed.Dodge.ToString() + " Dodge"; } if (ACMods_Computed.Wis != 0) { formula += " +" + ACMods_Computed.Wis.ToString() + " Wis"; } if (ACMods_Computed.Defending != 0) { formula += " +" + ACMods_Computed.Defending.ToString() + " defending"; } formula += Utility.GetStringValue(SizeMod) + " SizeMod"; if (ACMods_Computed.Monk != 0) { formula += " +" + ACMods_Computed.Monk.ToString() + " Monk"; } if (Duelist != 0) { formula += " +" + Duelist.ToString() + " Duelist"; } if (OnGoingMods != 0) { formula += " +" + OnGoingMods.ToString() + " OnGoingMods"; } if (ACMods_Computed.Insight != 0) { formula += " +" + ACMods_Computed.Insight.ToString() + " Insight"; } } int CompAC = 10 + ACMods_Computed.Armor + ACMods_Computed.Shield + DexUsed + OtherBonuses + ACMods_Computed.Rage + ACMods_Computed.BloodRage; int CompTouchAC = 10 + DexUsed + SizeMod + ACMods_Computed.Deflection + ACMods_Computed.Defending + DodgeBonus + ACMods_Computed.Rage + ACMods_Computed.BloodRage + ACMods_Computed.Wis + ACMods_Computed.Monk + Duelist + ACMods_Computed.Insight; int CompFlatFoootedAC = CompAC - DexBonus + FlatFootedMod - DodgeBonus - Duelist; int AC_SB = 0; int Touch_SB = 0; int Flatfooted_SB = 0; if (AC.Contains(CR)) //2nd AC block { int Pos5 = AC.IndexOf(CR); AC = AC.Substring(0, Pos5).Trim(); Pos5 = AC.IndexOf(")"); AC = AC.Substring(Pos5 + 1).Trim(); } List <string> ACList_SB = AC.Split(',').ToList(); if (ACList_SB[0].IndexOf("(") >= 0) { ACList_SB[0] = ACList_SB[0].Substring(0, ACList_SB[0].IndexOf("(")).Trim(); } try { AC_SB = Convert.ToInt32(ACList_SB[0]); } catch (Exception ex) { _messageXML.AddFail(CheckName, ex.Message); return; } string temp = ACList_SB[1].Replace("touch", string.Empty); try { Touch_SB = Convert.ToInt32(temp); } catch { _messageXML.AddFail(CheckName, "Issue parsing touch AC"); return; } temp = ACList_SB[2].Replace("flat-footed", string.Empty); try { Flatfooted_SB = Convert.ToInt32(temp); } catch { _messageXML.AddFail(CheckName, "Issue parsing flat-footed AC"); return; } if (CompAC == AC_SB && CompTouchAC == Touch_SB && CompFlatFoootedAC == Flatfooted_SB) { _messageXML.AddPass(CheckName, formula); return; } if (CompAC != AC_SB) { _messageXML.AddFail(CheckName, CompAC.ToString() + " " + ACMods_Computed.ToString(), AC_SB.ToString(), formula); } if (CompTouchAC != Touch_SB) { _messageXML.AddFail(CheckName + " Touch ", CompTouchAC.ToString() + " " + ACMods_Computed.ToString(), Touch_SB.ToString(), formula); } if (CompFlatFoootedAC != Flatfooted_SB) { _messageXML.AddFail(CheckName + " Flat-Footed ", CompFlatFoootedAC.ToString() + " " + ACMods_Computed.ToString(), Flatfooted_SB.ToString(), formula); } }