// checks public static bool CheckAttackLanded(this Creature attacker, Item weapon, Creature defender) { double attackersHitRate = (attacker.GetWeaponSkill(attacker.Body.MainHand) + (attacker.Stats.Attributes[Attribute.Dexterity] / 2.5) + (dice.Next(0, attacker.Stats.Attributes[Attribute.Luck]) / 10)) * (0.75 + 0.5 * attacker.Stats.Resources[Resource.SP] / attacker.Stats.Resources[Resource.MaxSP]); double defendersEvasion = ((defender.Stats.Attributes[Attribute.Agility] / 5) + (dice.Next(0, defender.Stats.Attributes[Attribute.Luck]) / 10)) * (0.75 + 0.5 * defender.Stats.Resources[Resource.SP] / defender.Stats.Resources[Resource.MaxSP]); double maxMissChance = 150; double chanceToMiss = maxMissChance - attackersHitRate; double chanceToDodge = attackersHitRate - (attackersHitRate - defendersEvasion); int diceRoll = Program.RNG.Next(0, (int)maxMissChance); if (diceRoll <= chanceToMiss) { Program.MsgConsole.WriteLine($"{attacker.Name}'s attack missed."); attacker.LvlWeaponSkill(weapon, 10); return(false); } diceRoll = dice.Next(0, (int)attackersHitRate + 2); if (diceRoll <= chanceToDodge) { Program.MsgConsole.WriteLine($"{defender.Name} evaded {attacker.Name}'s attack."); attacker.LvlWeaponSkill(weapon, 20); return(false); } attacker.LvlWeaponSkill(weapon, 40); return(true); }