示例#1
0
        public bool isInRange(Being target)
        {
            Vector2 dimensions = new Vector2((currAnimation.aoe ? 2 : 1) * getRange(),
                                             controller.getFrameDimensions(getCurrentFrame()).Y + getStat(StatType.Range));
            Vector2 positionOffset = currAnimation.aoe ? Vector2.Zero :
                                     new Vector2(getFacingMultiplier() * controller.getFrameDimensions(getCurrentFrame()).X / 2, 0);
            Geom collisionGeom = GeomFactory.Instance.CreateRectangleGeom(Game.instance.physicsSimulator,
                                                                          body, dimensions.X, dimensions.Y, positionOffset, 0);

            collisionGeom.CollisionCategories = geom.CollisionCategories;
            collisionGeom.CollidesWith        = geom.CollidesWith;
            bool inRange = target.geom.Collide(collisionGeom);

            Game.instance.physicsSimulator.Remove(collisionGeom);
            return(inRange);
        }
示例#2
0
        public override void update(GameTime gameTime)
        {
            base.update(gameTime);
            //figure out if anyone is alive
            bool someoneAlive = false;

            foreach (Being player in Game.instance.players.Values)
            {
                if (player.CurrentHealth > 0f)
                {
                    someoneAlive = true;
                }
            }
            //and target that random alive person
            while (someoneAlive && (targetPlayer == Guid.Empty || Game.instance.players[targetPlayer].isDead))
            {
                targetPlayer = Game.instance.players.Values.ElementAt(Game.instance.rand.Next(Game.instance.players.Count)).guid;
            }
            if (targetPlayer == Guid.Empty)
            {
                return;
            }
            Being targetBeing = Game.instance.players[targetPlayer];

            if (targetBeing.getDepth() != getDepth())
            {
                lane(targetBeing.getDepth() < getDepth());
            }
            if (isTouchingGeom(false) != null &&
                body.LinearVelocity.X < .01f &&
                getPos().Y + 10 < targetBeing.getPos().Y)
            {
                jump();
            }
            if (Math.Abs(targetBeing.getPos().X - getPos().X) >
                targetBeing.controller.frames[0].Width / 3 + controller.frames[0].Width / 3)
            {
                move(new Vector2((targetBeing.getPos().X < getPos().X ? -1 : 1) * Game.FORCE_AMOUNT, 0));
            }
            if (Environment.TickCount - timeOfLastAttack > getAttackWaitTime() &&
                Vector2.Distance(targetBeing.getPos(), getPos()) < getRange())
            {
                timeOfLastAttack = Environment.TickCount;
                attack("attack1");
            }
        }
示例#3
0
 public float getCritChance(Being enemy)
 {
     return(((getStat(StatType.Agility) * .5f) / level - (enemy.getStat(StatType.Agility) * .1f) / enemy.level) / 100f);
 }
示例#4
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);
        }