/// <summary> /// Sets correctly oriented animation and returns number of frames in animation /// </summary> /// <returns>returns number of frames in animation</returns> private static void setAnimation(OurSprite attacker) { switch (attacker.Orientation) { case Orientations.Down: if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(15); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(20); } else { attacker.SetAnimation(0 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Down_Right: attacker.Hflip = false; if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(16); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(21); } else { attacker.SetAnimation(1 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Down_Left: attacker.Hflip = true; if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(16); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(21); } else { attacker.SetAnimation(1 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Right: attacker.Hflip = false; if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(17); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(22); } else { attacker.SetAnimation(2 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Left: attacker.Hflip = true; if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(17); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(22); } else { attacker.SetAnimation(2 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Up_Right: attacker.Hflip = false; if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(18); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(23); } else { attacker.SetAnimation(3 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Up_Left: attacker.Hflip = true; if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(18); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(23); } else { attacker.SetAnimation(3 + 5 * attacker.State.GetHashCode()); } break; case Orientations.Up: if (attacker is Frostbyte.Characters.Mage && (attacker as Frostbyte.Characters.Mage).attackTier == 1) { attacker.SetAnimation(19); } else if (attacker is Frostbyte.Characters.Mage && ((attacker as Frostbyte.Characters.Mage).attackTier == 2 || (attacker as Frostbyte.Characters.Mage).attackTier == 3)) { attacker.SetAnimation(24); } else { attacker.SetAnimation(4 + 5 * attacker.State.GetHashCode()); } break; } }
/// <summary> /// Performs Poison Vomit attack for Worm /// </summary> /// <param name="_target">The target for the projectile to attack</param> /// <param name="_attacker">The sprite initiating the attack</param> /// <param name="_baseDamage">The amount of damage to inflict before constant multiplier for weakness</param> /// <param name="_attackFrame">The frame that the attack begins on</param> /// <returns>Returns true when finished</returns> public static IEnumerable<bool> WormVomit(OurSprite attacker, int animation, int baseDamage, int attackFrame, Element elem = Element.Earth) { #region Variables Level l = This.Game.CurrentLevel; Vector2 initialDirection = attacker.Direction; attacker.State = SpriteState.Attacking; attacker.SetAnimation(animation); int FrameCount = attacker.FrameCount(); TimeSpan attackStartTime = This.gameTime.TotalGameTime; Effect particleEffect = l.GetEffect("ParticleSystem"); Texture2D poison = l.GetTexture("poison"); ParticleEmitter particleEmitter = new ParticleEmitter(10000, particleEffect, poison); particleEmitter.ZOrder = attacker.ZOrder - 1; particleEmitter.effectTechnique = "FadeAtXPercent"; particleEmitter.fadeStartPercent = .98f; particleEmitter.blendState = BlendState.Additive; (particleEmitter.collisionObjects.First() as Collision_BoundingCircle).Radius = 105; (particleEmitter.collisionObjects.First() as Collision_BoundingCircle).createDrawPoints(); #endregion Variables attacker.isAttackAnimDone = false; attacker.Rewind(); while (attacker.Frame < FrameCount && attacker.Frame != attackFrame) { attacker.State = SpriteState.Attacking; attacker.SetAnimation(animation); FrameCount = attacker.FrameCount(); yield return false; } particleEmitter.GroundPos = attacker.GroundPos + new Vector2(7, -30); #region Generate Lightning Strike and Ground Spread and Deal Damage if (This.Game.AudioManager.PlaySoundEffect("Effects/Lightning_Strike")) { yield return false; } for (int i = 0; i < 100; i++) { //Deal Damage if (5 - i % 15 == 0 && Collision.CollisionData.Count > 0) { List<Tuple<CollisionObject, WorldObject, CollisionObject>> collidedWith; Collision.CollisionData.TryGetValue(particleEmitter, out collidedWith); if (collidedWith != null) { foreach (Tuple<CollisionObject, WorldObject, CollisionObject> detectedCollision in collidedWith) { if (((detectedCollision.Item2 is Enemy) && (attacker is Player)) || ((detectedCollision.Item2 is Player) && (attacker is Enemy))) { Damage(attacker, (detectedCollision.Item2 as OurSprite), baseDamage); } } } } yield return false; } #endregion Generate Lightning Strike and Ground Spread and Deal Damage while (particleEmitter.ActiveParticleCount > 0) { yield return false; } particleEmitter.Remove(); l.RemoveSprite(particleEmitter); attacker.particleEmitters.Remove(particleEmitter); attacker.isAttackAnimDone = true; yield return true; }