public double Attack(StrikingDummy target, WeaponSkills weaponSkill) { var animationLocked = QueuedEffects.ContainsKey(Skills.StatusEffects.AnimationLocked); if (GcdDuration > 0 || animationLocked) { return(0); } var potency = WeaponLibrary.WeaponPotencies(weaponSkill, LastSkills); var damage = FormulaLibrary.WeaponSkills(potency, Weapon.WeaponDamage, GetDexterity(), Det, CalculateMultiplier(target, DamageType.Slashing)); if (StatusEffects.ContainsKey(Skills.StatusEffects.Duality)) { damage *= 2; StatusEffects.Remove(Skills.StatusEffects.Duality); } else { damage = (damage * CalculateCritChance() * FormulaLibrary.CritDmg(Crt)) + (damage * (1 - CalculateCritChance())); } WeaponLibrary.QueueEffect(this, target, weaponSkill); var gcdMultiplier = StatusEffects.ContainsKey(Skills.StatusEffects.Huton) ? 0.85 : 1.00; GcdDuration = (int)TimeSpan.FromSeconds(FormulaLibrary.Gcd(Sks, gcdMultiplier)).TotalMilliseconds; LastSkills.Push(weaponSkill); return(damage); }
public bool UseBuffSpell(StrikingDummy target, Spells spell, bool verbose = false) { if (GcdDuration <= 0) { throw new Exception($"Warning! Using off-gcd ability { spell } when GCD is available! Remaining cooldown on { spell }: { Cooldowns[spell]}"); } if (Cooldowns.ContainsKey(spell) || QueuedEffects.ContainsKey(Skills.StatusEffects.AnimationLocked)) { return(false); } SpellLibrary.QueueEffect(this, spell, target, verbose); Cooldowns.Add(spell, SpellLibrary.SpellCooldowns(spell)); return(true); }
public double UseDamageSpell(StrikingDummy target, Spells spell, bool verbose = false) { if (GcdDuration <= 0 && spell != Spells.PrePullSuiton) { var remainingCd = Cooldowns.ContainsKey(spell) ? Cooldowns[spell] : 0; throw new Exception($"Warning! Using off-gcd ability { spell } when GCD is available! Remaining cooldown on { spell }: { remainingCd }"); } if (Cooldowns.ContainsKey(spell) || QueuedEffects.ContainsKey(Skills.StatusEffects.AnimationLocked)) { return(0); } if (spell == Spells.FumaShuriken || spell == Spells.Raiton || spell == Spells.Suiton) { if (Cooldowns.ContainsKey(Spells.FumaShuriken) || Cooldowns.ContainsKey(Spells.Raiton) || Cooldowns.ContainsKey(Spells.Suiton)) { return(0); } } if (spell == Spells.TrickAttack) { if (!StatusEffects.ContainsKey(Skills.StatusEffects.Suiton)) { throw new Exception($"Warning! Cannot use TA without Suiton active!"); } if (verbose) { Console.WriteLine("Suiton removed after TA cast!"); } StatusEffects.Remove(Skills.StatusEffects.Suiton); } var potency = SpellLibrary.SpellPotencies(spell); var multiplier = CalculateMultiplier(target, SpellLibrary.SpellDamageType(spell)); var damage = FormulaLibrary.WeaponSkills(potency, Weapon.WeaponDamage, GetDexterity(), Det, multiplier); var guaranteeCrit = false; if (spell == Spells.FumaShuriken || spell == Spells.Raiton || spell == Spells.Suiton) { if (StatusEffects.ContainsKey(Skills.StatusEffects.Kassatsu)) { guaranteeCrit = true; StatusEffects.Remove(Skills.StatusEffects.Kassatsu); } } if (guaranteeCrit) { damage *= FormulaLibrary.CritDmg(Crt); } else { damage = (damage * CalculateCritChance() * FormulaLibrary.CritDmg(Crt)) + (damage * (1 - CalculateCritChance())); } SpellLibrary.QueueEffect(this, spell, target, verbose); if (spell == Spells.FumaShuriken) { Cooldowns.Add(spell, 500 + SpellLibrary.SpellCooldowns(spell)); } else if (spell == Spells.Raiton) { Cooldowns.Add(spell, 1000 + SpellLibrary.SpellCooldowns(spell)); } else if (spell == Spells.Suiton) { Cooldowns.Add(spell, 1500 + SpellLibrary.SpellCooldowns(spell)); } else if (spell == Spells.PrePullSuiton) { Cooldowns.Add(Spells.Suiton, SpellLibrary.SpellCooldowns(Spells.Suiton)); } else { Cooldowns.Add(spell, SpellLibrary.SpellCooldowns(spell)); } return(damage); }