public override ICalculationOptionBase DeserializeDataObject(string xml) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(CalculationOptionsTankadin)); System.IO.StringReader reader = new System.IO.StringReader(xml); CalculationOptionsTankadin calcOpts = serializer.Deserialize(reader) as CalculationOptionsTankadin; return(calcOpts); }
private void nubAtkSpeed_ValueChanged(object sender, EventArgs e) { if (!_loadingCalculationOptions) { CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; calcOpts.AttackSpeed = (float)nubAtkSpeed.Value; Character.OnItemsChanged(); } }
private void nubAttackers_ValueChanged(object sender, EventArgs e) { if (!_loadingCalculationOptions) { CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; calcOpts.NumberAttackers = (int)nubAttackers.Value; Character.OnItemsChanged(); } }
private void cmbTargetLevel_SelectedIndexChanged(object sender, EventArgs e) { if (!_loadingCalculationOptions) { CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; calcOpts.TargetLevel = int.Parse(cmbTargetLevel.SelectedItem.ToString()); Character.OnItemsChanged(); } }
private void trackBarMitigationScale_Scroll(object sender, EventArgs e) { if (!_loadingCalculationOptions) { CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; calcOpts.MitigationScale = trackBarMitigationScale.Value; labelMitigationScale.Text = trackBarMitigationScale.Value.ToString(); Character.OnItemsChanged(); } }
private void trackBarTargetArmor_Scroll(object sender, EventArgs e) { if (!_loadingCalculationOptions) { CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; calcOpts.TargetArmor = trackBarTargetArmor.Value; labelTargetArmor.Text = trackBarTargetArmor.Value.ToString(); Character.OnItemsChanged(); } }
private void trackBarBossAttackValue_Scroll(object sender, EventArgs e) { if (!_loadingCalculationOptions) { CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; calcOpts.AverageHit = trackBarBossAttackValue.Value; labelBossAttackValue.Text = trackBarBossAttackValue.Value.ToString(); Character.OnItemsChanged(); } }
protected override void LoadCalculationOptions() { _loadingCalculationOptions = true; if (Character.CalculationOptions == null) { Character.CalculationOptions = new CalculationOptionsTankadin(); } CalculationOptionsTankadin calcOpts = Character.CalculationOptions as CalculationOptionsTankadin; cmbTargetLevel.SelectedIndex = calcOpts.TargetLevel - 70; nubAtkSpeed.Value = (decimal)calcOpts.AttackSpeed; nubAttackers.Value = (decimal)calcOpts.NumberAttackers; trackBarBossAttackValue.Value = calcOpts.AverageHit; trackBarMitigationScale.Value = calcOpts.MitigationScale; trackBarTargetArmor.Value = calcOpts.TargetArmor; trackBarThreatScale.Value = calcOpts.ThreatScale; labelBossAttackValue.Text = calcOpts.AverageHit.ToString(); labelMitigationScale.Text = calcOpts.MitigationScale.ToString(); labelTargetArmor.Text = calcOpts.TargetArmor.ToString(); labelThreatScale.Text = calcOpts.ThreatScale.ToString(); _loadingCalculationOptions = false; }
public override CharacterCalculationsBase GetCharacterCalculations(Character character, Item additionalItem) { CalculationOptionsTankadin calcOpts = character.CalculationOptions as CalculationOptionsTankadin; //_cachedCharacter = character; int targetLevel = calcOpts.TargetLevel; Stats stats = GetCharacterStats(character, additionalItem); Talents talents = new Talents(); float targetDefense = targetLevel * 5; CharacterCalculationsTankadin calculatedStats = new CharacterCalculationsTankadin(); calculatedStats.BasicStats = stats; calculatedStats.TargetLevel = targetLevel; //Avoidance calculations calculatedStats.Defense = 350 + (float)Math.Floor(stats.DefenseRating / (123f / 52f)) + talents.Anticipation; calculatedStats.Miss = 5 + (calculatedStats.Defense - targetDefense) * .04f + stats.Miss; calculatedStats.Parry = 5 + (calculatedStats.Defense - targetDefense) * .04f + stats.ParryRating / 23.6538461538462f + talents.Deflection; calculatedStats.Dodge = (calculatedStats.Defense - targetDefense) * .04f + stats.Agility / 25f + (stats.DodgeRating / (984f / 52f)); calculatedStats.Avoidance = calculatedStats.Dodge + calculatedStats.Miss + calculatedStats.Parry; calculatedStats.Block = 5 + (calculatedStats.Defense - targetDefense) * .04f + stats.BlockRating / 7.884614944458f; calculatedStats.BlockValue = stats.BlockValue * talents.ShieldSpecializaiton; calculatedStats.CrushAvoidance = calculatedStats.Avoidance + calculatedStats.Block + 30; calculatedStats.CritAvoidance = (calculatedStats.Defense - targetDefense) * .04f + stats.Resilience / 39.423f; calculatedStats.Mitigation = Math.Min(75f, (stats.Armor / (stats.Armor - 22167.5f + (467.5f * targetLevel))) * 100f); float reduction = (1f - (calculatedStats.Mitigation * .01f)) * .96f; float attacks = calcOpts.NumberAttackers / calcOpts.AttackSpeed * 10; //Apply armor and multipliers for each attack type... float miss = Math.Min(0.01f * attacks * calculatedStats.Avoidance, attacks); float block = Math.Min(Math.Min(8, attacks * (.3f + 0.01f * calculatedStats.Block)), attacks - miss); if (block > 8) { block += Math.Min((attacks - block) * .01f * calculatedStats.Block, attacks - miss - block); } float crit = Math.Min(0.01f * Math.Max(5 - calculatedStats.CritAvoidance, 0) * attacks, attacks - miss - block); float crush = Math.Min((targetLevel == 73 ? .15f : 0f) * attacks, attacks - miss - block - crit); float hit = attacks - miss - block - crit - crush; float modifier = talents.OneHandSpec * (1 + (.6f * talents.ImpRF)); calculatedStats.HolyShieldTPS = modifier * Math.Min(block, 8f) * 1.2f * 1.35f * (155 + .05f * stats.SpellDamageRating) / 10f; crit *= calcOpts.AverageHit * reduction * 2f; crush *= calcOpts.AverageHit * reduction * 1.5f; hit *= calcOpts.AverageHit * reduction; block *= calcOpts.AverageHit * reduction * Math.Max(1f - (calculatedStats.BlockValue / calcOpts.AverageHit / reduction), 0); calculatedStats.DamageTaken = (hit + crush + crit + block) / (attacks * calcOpts.AverageHit) * 100; calculatedStats.TotalMitigation = 100f - calculatedStats.DamageTaken; calculatedStats.SurvivalPoints = stats.Health / reduction; calculatedStats.MitigationPoints = calcOpts.MitigationScale * (1f * (1f / (calculatedStats.DamageTaken / 100f))); float ws = character.MainHand == null ? 0 : character.MainHand.Speed; float wd = character.MainHand == null ? 0 : ((character.MainHand.MinDamage + character.MainHand.MaxDamage) / 2f); calculatedStats.SoRTPS = ws == 0 ? 0 : ((0.85f * (2610.43f * ws / 100f) + 0.03f * wd - 1f + (0.108f * ws * stats.SpellDamageRating * ws)) / ws) * modifier; calculatedStats.ConsecrateTPS = calcOpts.NumberAttackers * (512 + .9524f * stats.SpellDamageRating) / 8f * modifier; calculatedStats.JoRTPS = (218f + stats.SpellDamageRating * .7143f) / 9f * modifier; calculatedStats.OverallTPS = calculatedStats.SoRTPS + calculatedStats.JoRTPS + calculatedStats.HolyShieldTPS + calculatedStats.ConsecrateTPS + calculatedStats.MiscTPS; calculatedStats.ThreatPoints = calculatedStats.OverallTPS * calcOpts.ThreatScale; calculatedStats.OverallPoints = calculatedStats.MitigationPoints + calculatedStats.SurvivalPoints + calculatedStats.ThreatPoints; return(calculatedStats); }