public static IEnumerable<bool> RammingAttack(Sprite target, Enemy attacker, int baseDamage, TimeSpan duration, Element elem = Element.None) { FrostbyteLevel l = This.Game.CurrentLevel as FrostbyteLevel; attacker.State = SpriteState.Attacking; attacker.isAttackAnimDone = false; List<Sprite> targets = new List<Sprite>(); targets.Add(target); int dmgcount = 0; attacker.Personality.Status = EnemyStatus.Wander; while (true) { attacker.previousFootPos = attacker.GroundPos; if (attacker.ram(targets, duration, float.PositiveInfinity, 20)) { break; } attacker.checkBackgroundCollisions(); if (dmgcount++ % 10 == 0 && Collision.CollisionData.Count > 0) { List<Tuple<CollisionObject, WorldObject, CollisionObject>> collidedWith; Collision.CollisionData.TryGetValue(attacker, out collidedWith); if (collidedWith != null) { foreach (Tuple<CollisionObject, WorldObject, CollisionObject> detectedCollision in collidedWith) { if (detectedCollision.Item2 is Player && attacker is Enemy) { Damage(attacker, (detectedCollision.Item2 as OurSprite), baseDamage); } } } } yield return false; } attacker.isAttackAnimDone = true; yield return true; }