Exemplo n.º 1
0
 public float getCritChance(Being enemy)
 {
     return(((getStat(StatType.Agility) * .5f) / level - (enemy.getStat(StatType.Agility) * .1f) / enemy.level) / 100f);
 }
Exemplo n.º 2
0
        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);
        }