public float getCritChance(Being enemy) { return(((getStat(StatType.Agility) * .5f) / level - (enemy.getStat(StatType.Agility) * .1f) / enemy.level) / 100f); }
public float attackCompute(Being enemy) { float toHit = .95f, damage = 0; //TODO calculate ths, prob from agility; toHit = Math.Max(.05f, Math.Min(.95f, toHit)); if ((toHit > (float)Game.instance.rand.NextDouble() * .1f) && !enemy.isDead && (enemy.geom.CollisionCategories & geom.CollisionCategories) != CollisionCategory.None && isInRange(enemy)) { if (currAnimation.stunDuration > 0) { enemy.stunDuration = Math.Max(currAnimation.stunDuration, enemy.stunDuration); enemy.changeAnimation("idle"); } damage = getDamage() * currAnimation.dmgMultiplier; damage -= enemy.getStat(StatType.DamageReduction); damage /= enemy.getDefense(); //Check crit if (getCritChance(enemy) >= Game.instance.rand.NextDouble()) { damage *= 2; } int xpAdded = Game.instance.xpManager.getKillXPPerLevel(enemy.level); if (damage > 0) { float lifeSteal = getLifeSteal(); if (lifeSteal > 0f) { CurrentHealth += damage * lifeSteal; combatText.add(enemy.guid, "+" + (int)damage, CombatTextType.HealthAdded); } enemy.CurrentHealth -= damage; if (Game.instance.network != null && Game.instance.network.isServer()) { Game.instance.network.sendBeingCurrentHP(enemy.guid, enemy.CurrentHealth); } if (enemy.CurrentHealth <= 0) { enemy.combatText.add(enemy.guid, xpAdded.ToString() + " XP", CombatTextType.XPAdded); } else { enemy.combatText.add(enemy.guid, "-" + (int)damage, CombatTextType.HealthTaken); } } if (enemy.CurrentHealth <= 0 && isPlayer && Game.instance.network != null) { if (!Game.instance.network.isClient()) { foreach (Being being in Game.instance.players.Values) { being.giveXP(xpAdded); } } if (Game.instance.network.isServer()) { Game.instance.network.sendAddXP(xpAdded); } } if (getStat(StatType.Knockback) > 0) { enemy.move(new Vector2(getFacingMultiplier() * getStat(StatType.Knockback), 0)); } } return(damage); }