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); }
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"); } }
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); }