public static void solve(CharacterCalculationsShadowPriest calculatedStats, CalculationOptionsShadowPriest calcOpts, BossOptions bossOpts) { Stats stats = calculatedStats.BasicStats; Character character = calculatedStats.LocalCharacter; PriestTalents talents = character.PriestTalents; Solver e; Rotation rot; float FightDuration = bossOpts.BerserkTimer; // WITHOUT PROCS e = new Solver(stats, new Stats { }, talents, calcOpts); rot = e.getPriorityRotation(); calculatedStats.DpsPoints = rot.DPS; calculatedStats.SurvivalPoints = stats.Stamina / FightDuration; //TODO: meaningful surv points calculatedStats.CombatStats = stats.Clone(); calculatedStats.DevouringPlauge = rot.DP; calculatedStats.MindBlast = rot.MB; calculatedStats.MindFlay = rot.MF; calculatedStats.MindSpike = rot.Spike; //calculatedStats.PowerWordShield = rot.shield; calculatedStats.ShadowFiend = rot.Fiend; calculatedStats.ShadowWordDeath = rot.SWD; calculatedStats.ShadowWordPain = rot.SWP; calculatedStats.VampiricTouch = rot.VT; calculatedStats.Rotation = rot.ToString(); calculatedStats.RotationDetails = rot.ToDetailedString(); }
public BurstCalculations(Stats stats, CalculationOptionsShadowPriest options, BossOptions boss, PriestTalents talents) { _stats = stats; _boss = boss; _talents = talents; _options = options; }
public static void solve(CharacterCalculationsShadowPriest calculatedStats, CalculationOptionsShadowPriest calcOpts, BossOptions bossOpts) { Stats stats = calculatedStats.BasicStats; Character character = calculatedStats.LocalCharacter; PriestTalents talents = character.PriestTalents; Solver e; Rotation rot; float FightDuration = bossOpts.BerserkTimer; // WITHOUT PROCS e = new Solver(stats, new Stats{}, talents, calcOpts); rot = e.getPriorityRotation(); calculatedStats.DpsPoints = rot.DPS; calculatedStats.SurvivalPoints = stats.Stamina / FightDuration; //TODO: meaningful surv points calculatedStats.CombatStats = stats.Clone(); calculatedStats.DevouringPlauge = rot.DP; calculatedStats.MindBlast = rot.MB; calculatedStats.MindFlay = rot.MF; calculatedStats.MindSpike = rot.Spike; //calculatedStats.PowerWordShield = rot.shield; calculatedStats.ShadowFiend = rot.Fiend; calculatedStats.ShadowWordDeath = rot.SWD; calculatedStats.ShadowWordPain = rot.SWP; calculatedStats.VampiricTouch = rot.VT; calculatedStats.Rotation = rot.ToString(); calculatedStats.RotationDetails = rot.ToDetailedString(); }
public BaseCharacterStatCalculations(Stats stats, CalculationOptionsShadowPriest options, BossOptions boss, PriestTalents talents) { _stats = stats; _target = boss; _talents = talents; _options = options; }
protected override void LoadCalculationOptions() { loading = true; if (Character.CalculationOptions == null) { Character.CalculationOptions = new CalculationOptionsShadowPriest(); } CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; cmbLength.Value = (decimal)calcOpts.FightDuration; cmbManaAmt.Text = calcOpts.ManaAmt.ToString(); cmbManaTime.Value = (decimal)calcOpts.ManaTime; cmbSpriest.Value = (decimal)calcOpts.Spriest; lsSpellPriopity.Items.Clear(); if (Character.Race != Character.CharacterRace.NightElf) { calcOpts.SpellPriority.Remove("Starshards"); } else if (!calcOpts.SpellPriority.Contains("Starshards")) { calcOpts.SpellPriority.Add("Starshards"); } if (Character.Race != Character.CharacterRace.Undead) { calcOpts.SpellPriority.Remove("Devouring Plague"); } else if (!calcOpts.SpellPriority.Contains("Devouring Plague")) { calcOpts.SpellPriority.Add("Devouring Plague"); } lsSpellPriopity.Items.AddRange(calcOpts.SpellPriority.ToArray()); loading = false; }
private void bChangePriority_Click(object sender, EventArgs e) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; SpellPriorityForm priority = new SpellPriorityForm(calcOpts.SpellPriority, lsSpellPriopity); priority.Show(); }
public override ICalculationOptionBase DeserializeDataObject(string xml) { XmlSerializer serializer = new XmlSerializer(typeof(CalculationOptionsShadowPriest)); StringReader reader = new StringReader(xml); CalculationOptionsShadowPriest calcOpts = serializer.Deserialize(reader) as CalculationOptionsShadowPriest; return(calcOpts); }
private void cbTargetLevel_SelectedIndexChanged(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.TargetLevel = cbTargetLevel.SelectedIndex; Character.OnCalculationsInvalidated(); } }
private void cbDrums_CheckedChanged(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.UseYourDrum = cbDrums.Checked; Character.OnItemsChanged(); } }
private void cmbManaAmt_SelectedIndexChanged(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.ManaPot = cmbManaAmt.SelectedIndex; Character.OnCalculationsInvalidated(); } }
private void cmbLength_ValueChanged(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.FightDuration = (float)cmbLength.Value; Character.OnItemsChanged(); } }
public Solver(Stats playerStats, TalentTree playerTalentTree, CalculationOptionsShadowPriest calculationOptions) { PlayerStats = playerStats; PlayerTalentTree = playerTalentTree; CalculationOptions = calculationOptions; SpellPriority = new List <Spell>(CalculationOptions.SpellPriority.Count); foreach (string spellname in calculationOptions.SpellPriority) { SpellPriority.Add(SpellFactory.CreateSpell(spellname, playerStats, playerTalentTree)); } HitChance = PlayerStats.SpellHitRating / 12.6f; ShadowHitChance = 83.0f + (PlayerStats.SpellHitRating + playerTalentTree.GetTalent("Shadow Focus").PointsInvested * 12.6f * 2.0f) / 12.6f; if (ShadowHitChance > 99.0f) { ShadowHitChance = 99.0f; } Trinkets = new List <Trinket>(); ShadowCritChance = PlayerStats.SpellCrit + playerTalentTree.GetTalent("Shadow Power").PointsInvested * 3; Sequence = new Dictionary <float, Spell>(); if (playerStats.SpellDamageFor15SecOnUse2Min > 0.0f) { Trinkets.Add(new Trinket() { Cooldown = 120.0f, DamageBonus = playerStats.SpellDamageFor15SecOnUse2Min, UpTime = 15.0f }); } if (playerStats.SpellDamageFor15SecOnUse90Sec > 0.0f) { Trinkets.Add(new Trinket() { Cooldown = 90.0f, DamageBonus = playerStats.SpellDamageFor15SecOnUse90Sec, UpTime = 15.0f }); } if (playerStats.SpellDamageFor20SecOnUse2Min > 0.0f) { Trinkets.Add(new Trinket() { Cooldown = 120.0f, DamageBonus = playerStats.SpellDamageFor20SecOnUse2Min, UpTime = 20.0f }); } if (playerStats.SpellHasteFor20SecOnUse2Min > 0.0f) { Trinkets.Add(new Trinket() { Cooldown = 120.0f, HasteBonus = playerStats.SpellHasteFor20SecOnUse2Min, UpTime = 20.0f }); } if (playerStats.SpellHasteFor20SecOnUse5Min > 0.0f) { Trinkets.Add(new Trinket() { Cooldown = 300.0f, HasteBonus = playerStats.SpellHasteFor20SecOnUse5Min, UpTime = 20.0f }); } }
private void cmbManaTime_ValueChanged(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.ManaTime = (float)cmbManaTime.Value; Character.OnItemsChanged(); } }
private void cbPtr_CheckedChanged(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.PTR = cbPtr.Checked; Character.OnCalculationsInvalidated(); } }
private void trkReplenishment_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.Replenishment = trkReplenishment.Value; lblReplenishment.Text = trkReplenishment.Value + "% effect from Replenishment."; Character.OnCalculationsInvalidated(); } }
private void trkMoveDuration_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.MoveDuration = trkMoveDuration.Value; lblMoveDuration.Text = trkMoveDuration.Value + " seconds of movement each time."; Character.OnCalculationsInvalidated(); } }
private void trackBar1_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.Survivability = trkSurvivability.Value; lblSurvivability.Text = trkSurvivability.Value + "% Focus on Survivability."; Character.OnCalculationsInvalidated(); } }
private void trkFSR_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.FSRRatio = trkFSR.Value; lblFSR.Text = trkFSR.Value + "% time spent in FSR"; Character.OnCalculationsInvalidated(); } }
private void trkFightLength_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.FightLength = trkFightLength.Value; lblFightLength.Text = trkFightLength.Value + " minute fight."; Character.OnCalculationsInvalidated(); } }
private void trkMoveFrequency_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.MoveFrequency = trkMoveFrequency.Value; lblMoveFrequency.Text = trkMoveFrequency.Value + " seconds between each need for Movement."; Character.OnCalculationsInvalidated(); } }
private void trkDelay_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.Delay = trkDelay.Value; lblDelay.Text = trkDelay.Value + "ms Game/Brain Latency"; Character.OnCalculationsInvalidated(); } }
private void trkJoW_Scroll(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.JoW = trkJoW.Value; lblJoW.Text = trkJoW.Value + "% effect from JoW."; Character.OnCalculationsInvalidated(); } }
/// <summary> /// Beware when updating: The spells from an earlier returned Rotation are references to the SpellBox from this Estimation. /// </summary> /// <param name="baseStats"></param> /// <param name="procStats"></param> /// <param name="talents"></param> /// <param name="calcOpts"></param> public void Update(Stats baseStats, Stats procStats, PriestTalents talents, CalculationOptionsShadowPriest calcOpts) { this.baseStats = baseStats; this.procStats = procStats; this.talents = talents; this.calcOpts = calcOpts; Stats addedStats = baseStats.Clone(); addedStats.Accumulate(procStats); CombatFactors combatFactors = new CombatFactors(talents, addedStats, Math.Max(calcOpts.NumberOfTargets - 1, 0), calcOpts.LatencyCast, calcOpts.LatencyGcd); spellbox.Update(combatFactors); }
protected override void LoadCalculationOptions() { loading = true; if (Character.CalculationOptions == null) { Character.CalculationOptions = new CalculationOptionsShadowPriest(); } CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; cbTargetLevel.SelectedIndex = calcOpts.TargetLevel; trkFightLength.Value = (int)calcOpts.FightLength; lblFightLength.Text = trkFightLength.Value + " minute fight."; trkFSR.Value = (int)calcOpts.FSRRatio; lblFSR.Text = trkFSR.Value + "% time spent in FSR"; trkDelay.Value = (int)calcOpts.Delay; lblDelay.Text = trkDelay.Value + "ms Game/Brain Latency"; trkShadowfiend.Value = (int)calcOpts.Shadowfiend; lblShadowfiend.Text = trkShadowfiend.Value + "% effect from Shadowfiend."; trkReplenishment.Value = (int)calcOpts.Replenishment; lblReplenishment.Text = trkReplenishment.Value + "% effect from Replenishment."; trkJoW.Value = (int)calcOpts.JoW; lblJoW.Text = trkJoW.Value + "% effect from JoW."; trkSurvivability.Value = (int)calcOpts.Survivability; lblSurvivability.Text = trkSurvivability.Value + "% Focus on Survivability."; trkMoveFrequency.Value = (int)calcOpts.MoveFrequency; lblMoveFrequency.Text = trkMoveFrequency.Value + " seconds between each need for movement."; trkMoveDuration.Value = (int)calcOpts.MoveDuration; lblMoveDuration.Text = trkMoveDuration.Value + " seconds of movement each time."; cbPtr.Checked = calcOpts.PTR; cmbManaAmt.SelectedIndex = calcOpts.ManaPot; if (calcOpts.SpellPriority == null) { calcOpts.SpellPriority = new List <string>(Spell.ShadowSpellList); } lsSpellPriopity.Items.Clear(); lsSpellPriopity.Items.AddRange(calcOpts.SpellPriority.ToArray()); loading = false; }
private void cmbManaAmt_TextUpdate(object sender, EventArgs e) { if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; try { calcOpts.ManaAmt = float.Parse(cmbManaAmt.Text); } catch { } Character.OnItemsChanged(); } }
public override CharacterCalculationsBase GetCharacterCalculations(Character character, Item additionalItem, bool referenceCalculation, bool significantChange, bool needsDisplayCalculations) { // First things first, we need to ensure that we aren't using bad data CharacterCalculationsShadowPriest calc = new CharacterCalculationsShadowPriest(); if (character == null) { return(calc); } var stats = GetCharacterStats(character, additionalItem); var results = new Dictionary <string, string>(); BaseCharacterStatCalculations baseCalculations = new BaseCharacterStatCalculations(stats, _calculationOptions, character.BossOptions, character.PriestTalents); baseCalculations.Calculate(results); stats.SpellPower += _calculationOptions.InnerFire ? 532 : 0; BurstCalculations burstCalculations = new BurstCalculations(stats, _calculationOptions, character.BossOptions, character.PriestTalents); burstCalculations.Calculate(results); calc.BurstPoints = burstCalculations.Points; foreach (KeyValuePair <string, string> keyValuePair in results) { calc.AddResult(keyValuePair.Key, keyValuePair.Value); } CalculationOptionsShadowPriest calcOpts = character.CalculationOptions as CalculationOptionsShadowPriest; if (calcOpts == null) { return(calc); } BossOptions bossOpts = character.BossOptions; calc.BasicStats = stats; calc.LocalCharacter = character; Solver.solve(calc, calcOpts, bossOpts); return(calc); }
public void LoadCalculationOptions() { _loadingCalculationOptions = true; if (Character.CalculationOptions == null) { Character.CalculationOptions = new CalculationOptionsShadowPriest(); } calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; // Model Specific Code if (calcOpts.SpellPriority == null) { calcOpts.SpellPriority = new List <string>(Spell.ShadowSpellList); } // _loadingCalculationOptions = false; }
private Stats GetBuffsStats(Character character, CalculationOptionsShadowPriest calcOpts) { List <Buff> removedBuffs = new List <Buff>(); List <Buff> addedBuffs = new List <Buff>(); Stats statsBuffs = GetBuffsStats(character.ActiveBuffs, character.SetBonusCount); foreach (Buff b in removedBuffs) { character.ActiveBuffsAdd(b); } foreach (Buff b in addedBuffs) { character.ActiveBuffs.Remove(b); } return(statsBuffs); }
private void cmbDrums_ValueChanged(object sender, EventArgs e) { if (cmbDrums.Value == 0) { cbDrums.Checked = false; cbDrums.Enabled = false; } else { cbDrums.Enabled = true; } if (!loading) { CalculationOptionsShadowPriest calcOpts = Character.CalculationOptions as CalculationOptionsShadowPriest; calcOpts.DrumsCount = (int)cmbDrums.Value; Character.OnItemsChanged(); } }
public CalculationOptionsPanelShadowPriest(CalculationOptionsShadowPriest calculationOptions) { _calculationOptions = calculationOptions; InitializeComponent(); // Set about text tbModuleNotes.Text = "Notes:\r\n" + "Shadow Priest Notes"; /* SpellBox spellBox = new SpellBox(); foreach (Spell s in spellBox.Spells) { lsSpellPriority.Items.Add(s.name); } */ }
public CalculationOptionsPanelShadowPriest(CalculationOptionsShadowPriest calculationOptions) { _calculationOptions = calculationOptions; InitializeComponent(); // Set about text tbModuleNotes.Text = "Notes:\r\n" + "Shadow Priest Notes"; /* * SpellBox spellBox = new SpellBox(); * * * foreach (Spell s in spellBox.Spells) * { * lsSpellPriority.Items.Add(s.name); * } */ }
public override CharacterCalculationsBase GetCharacterCalculations(Character character, Item additionalItem) { Stats stats = GetCharacterStats(character, additionalItem); Stats statsRace = GetRaceStats(character); CharacterCalculationsShadowPriest calculatedStats = new CharacterCalculationsShadowPriest(); CalculationOptionsShadowPriest calculationOptions = character.CalculationOptions as CalculationOptionsShadowPriest; calculatedStats.BasicStats = stats; calculatedStats.Talents = character.Talents; calculatedStats.CalculationOptions = calculationOptions; calculatedStats.BasicStats.Spirit = statsRace.Spirit + (calculatedStats.BasicStats.Spirit - statsRace.Spirit) * (1 + character.Talents.GetTalent("Spirit of Redemption").PointsInvested * 0.05f); calculatedStats.SpiritRegen = (float)Math.Floor(5 * 0.0093271 * calculatedStats.BasicStats.Spirit * Math.Sqrt(calculatedStats.BasicStats.Intellect)); calculatedStats.RegenInFSR = (float)Math.Floor((calculatedStats.BasicStats.Mp5 + character.Talents.GetTalent("Meditation").PointsInvested * 0.1f * calculatedStats.SpiritRegen * (1 + calculatedStats.BasicStats.SpellCombatManaRegeneration))); calculatedStats.RegenOutFSR = calculatedStats.BasicStats.Mp5 + calculatedStats.SpiritRegen; calculatedStats.BasicStats.SpellCrit = (float)Math.Round((calculatedStats.BasicStats.Intellect / 80) + (calculatedStats.BasicStats.SpellCritRating / 22.08) + 1.85, 2); calculatedStats.BasicStats.SpellDamageRating += calculatedStats.BasicStats.Spirit * character.Talents.GetTalent("Spiritual Guidance").PointsInvested * 0.05f; Solver solver = new Solver(stats, character.Talents, calculationOptions); solver.Calculate(); calculatedStats.DpsPoints = solver.OverallDps; //int hitcap = GetSpellHitCap(character.Talents); //calculatedStats.DpsPoints = calculatedStats.BasicStats.SpellDamageRating + calculatedStats.BasicStats.SpellShadowDamageRating // + (calculatedStats.BasicStats.SpellHasteRating) // + (calculatedStats.BasicStats.SpellCritRating / 5.57f) // + (calculatedStats.BasicStats.Spirit * 0.11f) // + (calculatedStats.BasicStats.Intellect * 0.055f) // - (calculatedStats.BasicStats.SpellHitRating < hitcap ? (hitcap - calculatedStats.BasicStats.SpellHitRating) * 1.364f: 0); calculatedStats.SurvivalPoints = calculatedStats.BasicStats.Stamina / 10; calculatedStats.OverallPoints = calculatedStats.DpsPoints + calculatedStats.SurvivalPoints; return(calculatedStats); }
/// <summary> /// Initializes a new instance of the <see cref="CalculationsShadowPriest"/> class. /// </summary> public CalculationsShadowPriest() { _calculationOptions = new CalculationOptionsShadowPriest(); }
private Stats GetBuffsStats(Character character, CalculationOptionsShadowPriest calcOpts) { List<Buff> removedBuffs = new List<Buff>(); List<Buff> addedBuffs = new List<Buff>(); Stats statsBuffs = GetBuffsStats(character.ActiveBuffs, character.SetBonusCount); foreach (Buff b in removedBuffs) { character.ActiveBuffsAdd(b); } foreach (Buff b in addedBuffs) { character.ActiveBuffs.Remove(b); } return statsBuffs; }