internal static void DetectAllCollisions(List <IEntity> entities, IMario player, IMario ghostPlayer) { var items = entities.Where(t => t is IItem).ToList(); var marios = new List <IMario> { player }; if (ghostPlayer != null) { marios.Add(ghostPlayer); } var blocks = entities.Where(t => t is IBlock).ToList(); var projectiles = entities.Where(t => t is IProjectile).ToList(); var enemies = entities.Where(t => t is IEnemy).ToList(); for (int i = 0; i < projectiles.Count; i++) { IProjectile projectileRef = (IProjectile)projectiles[i]; ISprite projectileSprite = projectileRef.Sprite; for (int i2 = 0; i2 < enemies.Count; i2++) { IEnemy enemyRef = (IEnemy)enemies[i2]; if (CheckForObject1CollidesTop(projectileRef, enemyRef)) { projectileRef.CollideWithEnemy(Side.Bottom, enemyRef); enemyRef.CollideWithProjectile(Side.Top, projectileRef); } else if (CheckForObject1CollidesBottom(projectileRef, enemyRef)) { projectileRef.CollideWithEnemy(Side.Top, enemyRef); enemyRef.CollideWithProjectile(Side.Bottom, projectileRef); } else if (CheckForObject1CollidesLeft(projectileRef, enemyRef)) { projectileRef.CollideWithEnemy(Side.Right, enemyRef); enemyRef.CollideWithProjectile(Side.Left, projectileRef); } else if (CheckForObject1CollidesRight(projectileRef, enemyRef)) { projectileRef.CollideWithEnemy(Side.Left, enemyRef); enemyRef.CollideWithProjectile(Side.Right, projectileRef); } } for (int i2 = 0; i2 < blocks.Count; i2++) { IBlock blockRef = (IBlock)blocks[i2]; if (CheckForObject1CollidesTop(projectileRef, blockRef)) { projectileRef.CollideWithBlock(Side.Bottom, blockRef); blockRef.CollideWithProjectile(Side.Top, projectileRef); } else if (CheckForObject1CollidesBottom(projectileRef, blockRef)) { projectileRef.CollideWithBlock(Side.Top, blockRef); blockRef.CollideWithProjectile(Side.Bottom, projectileRef); } else if (CheckForObject1CollidesLeft(projectileRef, blockRef)) { projectileRef.CollideWithBlock(Side.Right, blockRef); blockRef.CollideWithProjectile(Side.Left, projectileRef); } else if (CheckForObject1CollidesRight(projectileRef, blockRef)) { projectileRef.CollideWithBlock(Side.Left, blockRef); blockRef.CollideWithProjectile(Side.Right, projectileRef); } } } for (int i = 0; i < items.Count; i++) { IItem itemRef = (IItem)items[i]; for (int i2 = 0; i2 < marios.Count; i2++) { IMario marioRef = (IMario)marios[i2]; if (CheckForObject1CollidesTop(itemRef, marioRef)) { itemRef.CollideWithMario(Side.Bottom, marioRef); marioRef.CollideWithItem(Side.Top, itemRef); } else if (CheckForObject1CollidesBottom(itemRef, marioRef)) { itemRef.CollideWithMario(Side.Top, marioRef); marioRef.CollideWithItem(Side.Bottom, itemRef); } else if (CheckForObject1CollidesLeft(itemRef, marioRef)) { itemRef.CollideWithMario(Side.Right, marioRef); marioRef.CollideWithItem(Side.Left, itemRef); } else if (CheckForObject1CollidesRight(itemRef, marioRef)) { itemRef.CollideWithMario(Side.Left, marioRef); marioRef.CollideWithItem(Side.Right, itemRef); } } for (int i2 = 0; i2 < blocks.Count; i2++) { IBlock blockRef = (IBlock)blocks[i2]; if (CheckForObject1CollidesTop(itemRef, blockRef)) { itemRef.CollideWithBlock(Side.Bottom, blockRef); blockRef.CollideWithItem(Side.Top, itemRef); } else if (CheckForObject1CollidesBottom(itemRef, blockRef)) { itemRef.CollideWithBlock(Side.Top, blockRef); blockRef.CollideWithItem(Side.Bottom, itemRef); } else if (CheckForObject1CollidesLeft(itemRef, blockRef)) { itemRef.CollideWithBlock(Side.Right, blockRef); blockRef.CollideWithItem(Side.Left, itemRef); } else if (CheckForObject1CollidesRight(itemRef, blockRef)) { itemRef.CollideWithBlock(Side.Left, blockRef); blockRef.CollideWithItem(Side.Right, itemRef); } } } for (int i = 0; i < blocks.Count; i++) { IBlock blockRef = (IBlock)blocks[i]; ISprite blockSprite = blockRef.Sprite; for (int i2 = 0; i2 < marios.Count; i2++) { IMario marioRef = (IMario)marios[i2]; if (CheckForObject1CollidesTop(blockRef, marioRef)) { blockRef.CollideWithMario(Side.Bottom, marioRef); marioRef.CollideWithBlock(Side.Top, blockRef); } else if (CheckForObject1CollidesBottom(blockRef, marioRef)) { blockRef.CollideWithMario(Side.Top, marioRef); marioRef.CollideWithBlock(Side.Bottom, blockRef); } else if (CheckForObject1CollidesLeft(blockRef, marioRef)) { blockRef.CollideWithMario(Side.Right, marioRef); marioRef.CollideWithBlock(Side.Left, blockRef); } else if (CheckForObject1CollidesRight(blockRef, marioRef)) { blockRef.CollideWithMario(Side.Left, marioRef); marioRef.CollideWithBlock(Side.Right, blockRef); } } for (int i2 = 0; i2 < enemies.Count; i2++) { IEnemy enemyRef = (IEnemy)enemies[i2]; if (CheckForObject1CollidesTop(blockRef, enemyRef)) { blockRef.CollideWithEnemy(Side.Bottom, enemyRef); enemyRef.CollideWithBlock(Side.Top, blockRef); } else if (CheckForObject1CollidesBottom(blockRef, enemyRef)) { blockRef.CollideWithEnemy(Side.Top, enemyRef); enemyRef.CollideWithBlock(Side.Bottom, blockRef); } else if (CheckForObject1CollidesLeft(blockRef, enemyRef)) { blockRef.CollideWithEnemy(Side.Right, enemyRef); enemyRef.CollideWithBlock(Side.Left, blockRef); } else if (CheckForObject1CollidesRight(blockRef, enemyRef)) { blockRef.CollideWithEnemy(Side.Left, enemyRef); enemyRef.CollideWithBlock(Side.Right, blockRef); } } } for (int i = 0; i < enemies.Count; i++) { IEnemy enemyRef = (IEnemy)enemies[i]; for (int i2 = 0; i2 < enemies.Count; i2++) { IEnemy secondEnemyRef = (IEnemy)enemies[i2]; if (CheckForObject1CollidesTop(secondEnemyRef, enemyRef)) { secondEnemyRef.CollideWithEnemy(Side.Bottom, enemyRef); enemyRef.CollideWithEnemy(Side.Top, secondEnemyRef); } else if (CheckForObject1CollidesBottom(secondEnemyRef, enemyRef)) { secondEnemyRef.CollideWithEnemy(Side.Top, enemyRef); enemyRef.CollideWithEnemy(Side.Bottom, secondEnemyRef); } else if (CheckForObject1CollidesLeft(secondEnemyRef, enemyRef)) { secondEnemyRef.CollideWithEnemy(Side.Right, enemyRef); enemyRef.CollideWithEnemy(Side.Left, secondEnemyRef); } else if (CheckForObject1CollidesRight(secondEnemyRef, enemyRef)) { secondEnemyRef.CollideWithEnemy(Side.Left, enemyRef); enemyRef.CollideWithEnemy(Side.Right, secondEnemyRef); } } for (int i2 = 0; i2 < marios.Count; i2++) { IMario marioRef = (IMario)marios[i2]; if (CheckForObject1CollidesTop(enemyRef, marioRef)) { enemyRef.CollideWithMario(Side.Bottom, marioRef); marioRef.CollideWithEnemy(Side.Top, enemyRef); } else if (CheckForObject1CollidesBottom(enemyRef, marioRef)) { enemyRef.CollideWithMario(Side.Top, marioRef); marioRef.CollideWithEnemy(Side.Bottom, enemyRef); } else if (CheckForObject1CollidesLeft(enemyRef, marioRef)) { enemyRef.CollideWithMario(Side.Right, marioRef); marioRef.CollideWithEnemy(Side.Left, enemyRef); } else if (CheckForObject1CollidesRight(enemyRef, marioRef)) { enemyRef.CollideWithMario(Side.Left, marioRef); marioRef.CollideWithEnemy(Side.Right, enemyRef); } } } }