public Entity BuildEntity(Entity e, params object[] args)
        {
            int tier = 1;
            if (spawned > 2)
                tier = 2;
            if (spawned > 5)
                tier = 3;

            #region Sprite

            string spriteKey = "";
            int type = spawned;

            spriteKey = bosses[type].SpriteKey;

            #endregion Sprite

            #region Body

            Body bitch = e.AddComponent<Body>(new Body(_World, e));
            FixtureFactory.AttachEllipse(ConvertUnits.ToSimUnits(_SpriteSheet[spriteKey][0].Width / 2), ConvertUnits.ToSimUnits(_SpriteSheet[spriteKey][0].Height / 2), 20, 1f, bitch);
            Sprite s = e.AddComponent<Sprite>(new Sprite(_SpriteSheet, spriteKey, bitch, 1f, Color.White, spriteKey != "bigredblobboss" ? 0.5f + (float)type / 10000f : 0.55f));
            bitch.BodyType = GameLibrary.Dependencies.Physics.Dynamics.BodyType.Dynamic;
            bitch.CollisionCategories = GameLibrary.Dependencies.Physics.Dynamics.Category.Cat2;
            bitch.CollidesWith = GameLibrary.Dependencies.Physics.Dynamics.Category.Cat1 | GameLibrary.Dependencies.Physics.Dynamics.Category.Cat3 | GameLibrary.Dependencies.Physics.Dynamics.Category.Cat6;
            bitch.OnCollision += LambdaComplex.BossCollision();
            ++bitch.Mass;

            Vector2 pos = new Vector2(0, -1);
            pos.Normalize();
            pos *= ScreenHelper.Viewport.Height / 1.5f;
            pos = ConvertUnits.ToSimUnits(pos);
            bitch.Position = pos;
            bitch.SleepingAllowed = false;

            #endregion Body

            #region Animation

            Animation a = null;
            if (s.Source.Count() > 1)
            {
                a = new Animation(AnimationType.None, 10);
                e.AddComponent<Animation>(a);
            }

            #endregion Animation

            #region AI/Health

            e.AddComponent<HealthRender>(new HealthRender());

            if (spriteKey == "flamer")
                e.AddComponent<AI>(new AI((args[0] as Body),
                    AI.CreateFlamer(e, 0.5f, bitch, s, _World), "Base"));

            else if (spriteKey == "bigredblobboss")
                e.AddComponent<AI>(new AI(null,
                    AI.CreateWarMachine(e, 0.5f, bitch, 10f, 0.7f, s, _World)));

            else if (spriteKey == "killerhead")
                e.AddComponent<AI>(new AI(null,
                    AI.CreateKiller(e, 0.5f, 20f, _World)));

            else if (spriteKey == "greenbossship")
                e.AddComponent<AI>(new AI(null,
                    AI.CreateBigGreen(e, 0.5f, 10f, 2f, 0.05f, 3.5f, s, _World)));

            else
                e.AddComponent<AI>(new AI((args[0] as Body),
                    AI.CreateFollow(e, 1, false), "Base", false));

            int points = 0;
            int health = 0;

            switch (tier)
            {
                case 1:
                    points = 300;
                    health = 150;
                    break;

                case 2:
                    points = 500;
                    health = 175;
                    break;

                case 3:
                    points = 1000;
                    health = 200;
                    break;
            }

            Health h = new Health(health);
            h.OnDeath += LambdaComplex.BossDeath(type, _World, e, s, tier, points, bosses[type].BossName);

            if (type == 1)
            {
                h.OnDeath +=
                    ex =>
                        {
                               Console.WriteLine("DEad");
                        };
            }

            if (a != null)
            {
                h.OnDamage +=
                    ent =>
                    {
                        if (h.IsAlive && a.Type == AnimationType.None)
                        {
                            e.RemoveComponent<Sprite>(s);

                            double healthFraction = (h.CurrentHealth / h.MaxHealth);

                            int frame = 0;
                            int frames = s.Source.Length;

                            frame = (int)(frames - (frames * healthFraction));

                            if (frame != s.FrameIndex)
                            {
                                int splodeSound = rbitch.Next(1, 5);
                                SoundManager.Play("Explosion" + splodeSound.ToString());
                                Vector2 poss = e.GetComponent<ITransform>().Position;
                                _World.CreateEntityGroup("BigExplosion", "Explosions", poss, 15, e, e.GetComponent<IVelocity>().LinearVelocity);
                            }
                            s.FrameIndex = frame;

                            e.AddComponent<Sprite>(s);
                        }
                    };
            }

            if (spriteKey.Equals("flamer"))
            {
                h.OnDamage +=
                    ent =>
                    {
                        //Fire flame from random spot

                        int range = s.CurrentRectangle.Width / 2;
                        float posx = rbitch.Next(-range, range);
                        Vector2 pos1 = bitch.Position + ConvertUnits.ToSimUnits(new Vector2(posx, 0));

                        float x = posx / range;

                        float y = 1;

                        Vector2 velocity = new Vector2(x, y);
                        velocity.Normalize();
                        velocity *= 7;

                        _World.CreateEntity("Fire", pos1, velocity).Refresh();
                    };
            }

            e.AddComponent<Health>(h);

            #endregion AI/Health

            e.Tag = "Boss" + spawned.ToString();
            e.Group = "Enemies";

            ++spawned;

            #region Special Cases

            if (spriteKey == "smasher")
            {
                _World.CreateEntity("SmasherBall", e).Refresh();
            }

            if (spriteKey == "brain")
            {
                Vector2 offset = new Vector2(2, 0);
                Vector2 position = bitch.Position + offset;
                _World.CreateEntity("Cannon", position, e).Refresh();
                position = bitch.Position - offset;
                _World.CreateEntity("Cannon", position, e).Refresh();
            }

            if (spriteKey == "massivebluemissile")
            {
                _World.enemySpawnSystem.ThugSprite = "bluemissile";
                _World.enemySpawnSystem.SpawnRate = 0;
                _World.enemySpawnSystem.ThugSpawnRate = 3;
            }

            if (spriteKey == "killerhead")
            {
                List<Entity> children = new List<Entity>();
                Vector2 offset = new Vector2(2.85f, -0.6f);
                Vector2 position = bitch.Position + offset;
                Entity x;
                x = _World.CreateEntity("KillerGun", position, e, "killerrightgun", offset, e);
                x.Refresh();
                children.Add(x);
                offset.X = -3.15f;
                position = bitch.Position + offset;
                x = _World.CreateEntity("KillerGun", position, e, "killerleftgun", offset);
                x.Refresh();
                children.Add(x);
                e.AddComponent<Children>(new Children(children));
            }

            if (spriteKey == "eye")
            {
                _World.enemySpawnSystem.MookSprite = "eyeshot";
                _World.enemySpawnSystem.SpawnRate = 0;
                _World.enemySpawnSystem.MookSpawnRate = 2;
            }

            if (spriteKey == "clawbossthing")
            {
                _World.enemySpawnSystem.MookSprite = "8prongbrownthingwithfangs";
                _World.enemySpawnSystem.ThugSprite = "minibrownclawboss";
                _World.enemySpawnSystem.SpawnRate = 0;
                _World.enemySpawnSystem.MookSpawnRate = 2;
                _World.enemySpawnSystem.ThugSpawnRate = 2;
            }

            if (spriteKey == "flamer")
            {
                _World.enemySpawnSystem.SpawnRate = 0;
            }

            #endregion Special Cases

            return e;
        }
        public Entity BuildEntity(Entity e, params object[] args)
        {
            e.Group = "Base";
            e.Tag = "Base";

            #region Body

            Body Body = e.AddComponent<Body>(new Body(world, e));
            {
                FixtureFactory.AttachEllipse(//Add a basic bounding box (rectangle status)
                    ConvertUnits.ToSimUnits(spriteSheet.Animations["base"][0].Width / 2f),
                    ConvertUnits.ToSimUnits(spriteSheet.Animations["base"][0].Height / 2f),
                    15,
                    1,
                    Body);
                Body.Position = ConvertUnits.ToSimUnits(new Vector2(0, 0));
                Body.BodyType = GameLibrary.Dependencies.Physics.Dynamics.BodyType.Static;
                Body.CollisionCategories = GameLibrary.Dependencies.Physics.Dynamics.Category.Cat6 | GameLibrary.Dependencies.Physics.Dynamics.Category.Cat16;
                Body.CollidesWith = GameLibrary.Dependencies.Physics.Dynamics.Category.Cat2 | GameLibrary.Dependencies.Physics.Dynamics.Category.Cat4 | GameLibrary.Dependencies.Physics.Dynamics.Category.Cat5 | GameLibrary.Dependencies.Physics.Dynamics.Category.Cat16;

                Body.SleepingAllowed = false;
            }

            #endregion Body

            #region Sprite

            Sprite Sprite = e.AddComponent<Sprite>(
                new Sprite(spriteSheet, "base",
                    Body, 1, Color.White, 0.1f));

            #endregion Sprite

            e.AddComponent<Score>(new Score());

            int health = 40;
            #if DEBUG
            health = 1000000;
            #endif
            Health h = new Health(health);
            h.OnDeath += LambdaComplex.BigEnemyDeath(e, world as SpaceWorld, 0);

            h.OnDamage +=
                ent =>
                {
                    SoundManager.SetVibration(0.25f, 0.15f);

                    e.RemoveComponent<Sprite>(Sprite);

                    double healthFraction = (h.CurrentHealth / h.MaxHealth);

                    if (healthFraction >= 0.33 && Sprite.FrameIndex == 2)
                    {
                        Sprite.FrameIndex = 1;
                    }
                    else if (healthFraction < 0.33 && Sprite.FrameIndex == 1)
                    {
                        Sprite.FrameIndex = 2;
                        SoundManager.SetVibration(0.3f, 0.3f);
                    }

                    else if (healthFraction >= 0.66 && Sprite.FrameIndex == 1)
                    {
                        Sprite.FrameIndex = 0;
                    }
                    else if (healthFraction < 0.66 && Sprite.FrameIndex == 0)
                    {
                        Sprite.FrameIndex = 1;
                        SoundManager.SetVibration(0.3f, 0.3f);
                    }

                    e.AddComponent<Sprite>(Sprite);
                };

            e.AddComponent<Health>(h);

            e.AddComponent<HealthRender>(new HealthRender());

            return e;
        }
        /// <summary>
        /// Builds a player based on the specific index
        /// </summary>
        /// <param name="e"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public Entity BuildEntity(Entity e, params object[] args)
        {
            PlayerIndex index = (PlayerIndex)args[0];
            e.Group = "Players";
            string tag = "Player" + ((int)index + 1);
            e.Tag = "P" + ((int)index + 1);

            try
            {
                int playerIndex = int.Parse(e.Tag.Replace("P", "")) - 1;
            }
            catch
            {
                throw new FormatException("Yeah f**k you" + e.Tag);
            }

            #region Body

            //Set up initial body
            Body Body = e.AddComponent<Body>(new Body(world, e));
            FixtureFactory.AttachEllipse( //Add a basic bounding box (rectangle status)
                ConvertUnits.ToSimUnits(spriteSheet.Animations[tag][0].Width / 2f),
                ConvertUnits.ToSimUnits(spriteSheet.Animations[tag][0].Height / 2f),
                6,
                1,

                Body);

            if (locations.Values.Count == 0)
                SetStartingLocations();

            //Set the position
            Body.Position = locations[index];
            Body.BodyType = BodyType.Dynamic;
            Body.SleepingAllowed = false;
            Body.FixedRotation = true;
            Body.RotateTo(Body.Position);
            Body.Mass = 2;

            Body.CollisionCategories = Category.Cat1 | Category.Cat12;

            #endregion Body

            #region Sprite

            Sprite Sprite = e.AddComponent<Sprite>(
                new Sprite(spriteSheet, tag,
                    Body, 1, Color.White, 0.5f));

            #endregion Sprite

            #region Animation

            if (Sprite.Source.Length > 1)
                e.AddComponent<Animation>(new Animation(AnimationType.Bounce, 10));

            #endregion Animation

            #region Health

            Health h = new Health(1);

            h.OnDeath += LambdaComplex.SmallEnemyDeath(e, world as SpaceWorld, 0);
            h.OnDeath +=
                ent =>
                {
                    SoundManager.SetVibration(index, 0.4f, 0.5f);
                };
            e.AddComponent<Health>(h);

            #endregion Health

            #region Inventory

            uint yellow = 0;
            #if DEBUG
            yellow = 1000;
            #endif
            Inventory inventory = e.AddComponent<Inventory>(new Inventory(50, 50, 50, yellow, InvType.Player, ""));
            inventory.CurrentGun = inventory.WHITE;

            #endregion Inventory

            #region AI
            //Create AI if it's an artificial player.
            if (args.Length >= 2 && (bool)args[1])
            {
                AI ai = e.AddComponent<AI>(new AI(null,
                    (target) =>
                    {

                        bool returnCode = false;
                        AI eai = e.GetComponent<AI>();
                        if (target == null)
                        {
                            #region Movement
                            //When there is no target focus on building structures around the base on random sides and possibly preparing mines.
                            //If AI cannot afford to build, then commence swarm code (move around base randomly awaiting a target.
                            Body.LinearVelocity = Vector2.Zero;

                            Vector2 Omega = Vector2.Zero - Body.Position;

                            Body.ApplyLinearImpulse(new Vector2(Omega.Y, -Omega.X) * 2);

                            Body.RotateTo(Vector2.Zero - Body.Position);
                            Body.Rotation += (float)Math.PI;

                            if (Vector2.Distance(Vector2.Zero, Body.Position) > ConvertUnits.ToSimUnits(200))
                                Body.ApplyLinearImpulse((Vector2.Zero - Body.Position)*0.5f);
                            else
                                if (inventory.YELLOW >= 25 && r.Next(100) > 95)
                                {
                                    world.CreateEntity("Turret", ConvertUnits.ToDisplayUnits(Body.Position), e).Refresh();
                                    inventory.YELLOW -= 25;
                                    SoundManager.Play("Construction");
                                }

                            #endregion

                            returnCode = true;
                        }
                        else
                        {
                            #region Movement

                            Body.LinearVelocity = Vector2.Zero;

                            if (Vector2.Distance(Body.Position, target.Position) > 3)
                                Body.ApplyLinearImpulse(new Vector2((float)Math.Cos(Body.Rotation), (float)Math.Sin(Body.Rotation)) * 10);
                            else
                            {
                                //V = OMEGA x R
                                Vector2 R = Body.Position - target.Position;
                                Vector2 Omega = target.Position - Body.Position;

                                Body.ApplyLinearImpulse(new Vector2(Omega.Y, -Omega.X) * 3);
                            }

                            #endregion

                            #region Shooting
                            //TRUE AI CODE OCCURS HERE
                            //Begin to seek an attack
                            Gun g = inventory.CurrentGun;
                            g.BulletsToFire = true;

                            /* Aiming *\
                                * X = v*t + x_o therefore
                                *  let X_aim = v_tar*t + x_tar
                                *            = v_bul*t + x_bul
                                *  therefore
                                *      0 = v_tar*t + x_tar - (v_bul*t + x_bul) =>
                                *  therefore
                                *      x_bul - x_tar = t(v_tar - v_bul)
                                *  so that
                                *      t = (x_bul - x_tar)/(v_tar - v_bul)
                                *  therefore X = (v_tar)*(x_bul - x_tar)/(v_tar - v_bul) + x_tar
                                */

                            //Vector2 zero = target.LinearVelocity*time - inv.CurrentGun.BulletVelocity*time + target.Position - Body.Position;
                            Vector2 time = (Body.Position - target.Position) /
                                (target.LinearVelocity - inventory.CurrentGun.BulletVelocity);

                            Vector2 XFinal = (target.LinearVelocity) * time + target.Position;
                            Body.RotateTo(XFinal - Body.Position);
                            #endregion
                        }

                        return returnCode;
                    }, "Enemies", ConvertUnits.ToSimUnits(450f)));
            }
            #endregion

            return e;
        }