Beispiel #1
0
        public void RemovePowerup(string genericPowerupName, bool automaticallyStoreInInventory = true)
        {
            Powerup powerup = Powerups[genericPowerupName];

            Inventory.UnequipPowerup(playerIndex, powerup.Active, powerup);
            if (automaticallyStoreInInventory)
            {
                Inventory.StorePowerup(powerup);
            }
            Powerups.Remove(genericPowerupName);
            powerup.OnRemovedFromHero();
            if (powerup is IReversible)
            {
                History.UnRegisterReversible((IReversible)powerup);
            }
        }
Beispiel #2
0
        public void createAndRemoveLevels()
        {
            List <Point> levelsWithHeroes = new List <Point>();

            foreach (Hero hero in heroes)
            {
                levelsWithHeroes.Add(new Point(hero.levelX, hero.levelY));
            }
            List <Point> levelsToHave   = new List <Point>();
            List <Point> levelsToRemove = new List <Point>();

            foreach (Hero hero in heroes)
            {
                int prevHeroLevelX = hero.prevLevelX;
                int prevHeroLevelY = hero.prevLevelY;
                int curHeroLevelX  = hero.levelX;
                int curHeroLevelY  = hero.levelY;

                if (curHeroLevelX < prevHeroLevelX) // hero transitioned left
                {
                    int indexX = curHeroLevelX + 2;
                    int indexY = curHeroLevelY;
                    if (indexX < MAX_LEVELS)
                    {
                        for (int i = -1; i <= 1; i++)
                        {
                            if (indexY + i < MAX_LEVELS && indexY + i >= 0)
                            {
                                levelsToRemove.Add(new Point(indexX, indexY + i));
                            }
                        }
                    }
                }
                else if (curHeroLevelX > prevHeroLevelX) // hero transitioned right
                {
                    int indexX = curHeroLevelX - 2;
                    int indexY = curHeroLevelY;
                    if (indexX >= 0)
                    {
                        for (int i = -1; i <= 1; i++)
                        {
                            if (indexY + i < MAX_LEVELS && indexY + i >= 0)
                            {
                                levelsToRemove.Add(new Point(indexX, indexY + i));
                            }
                        }
                    }
                }
                else if (curHeroLevelY < prevHeroLevelY) // hero transitioned up
                {
                    int indexX = curHeroLevelX;
                    int indexY = curHeroLevelY + 2;
                    if (indexY < MAX_LEVELS)
                    {
                        for (int i = -1; i <= 1; i++)
                        {
                            if (indexX + i < MAX_LEVELS && indexX + i >= 0)
                            {
                                levelsToRemove.Add(new Point(indexX + i, indexY));
                            }
                        }
                    }
                }
                else if (curHeroLevelY > prevHeroLevelY) // hero transitioned down
                {
                    int indexX = curHeroLevelX;
                    int indexY = curHeroLevelY - 2;
                    if (indexY >= 0)
                    {
                        for (int i = -1; i <= 1; i++)
                        {
                            if (indexX + i < MAX_LEVELS && indexX + i >= 0)
                            {
                                levelsToRemove.Add(new Point(indexX + i, indexY));
                            }
                        }
                    }
                }

                List <Level> surroundingLevels = new List <Level>();
                for (int xi = -1; xi <= 1; xi++)
                {
                    for (int yi = -1; yi <= 1; yi++)
                    {
                        int x = curHeroLevelX + xi;
                        int y = curHeroLevelY + yi;
                        if (x < 0 || y < 0 || x >= MAX_LEVELS || y >= MAX_LEVELS)
                        {
                            continue;
                        }
                        levelsToHave.Add(new Point(x, y));
                        surroundingLevels.Add(levels[x, y]);
                        //clear all registered levels in History
                        if (!levelsWithHeroes.Contains(new Point(x, y)) && History.IsRegistered(levels[x, y]))
                        {
                            History.UnRegisterReversible(levels[x, y]);
                        }
                    }
                }
                LevelsSurroundingHero[hero] = surroundingLevels;
            }
            foreach (Point p in levelsToRemove)
            {
                if (!levelsToHave.Contains(p))
                {
                    removeLevel(p.X, p.Y);
                }
            }
            List <Point> levelsToUpdateBorderWallColors = new List <Point>();

            foreach (Point p in levelsToHave)
            {
                if (levels[p.X, p.Y] == null)
                {
                    createRandomLevelAt(p.X, p.Y);
                    foreach (Point newP in new Point[] { p, new Point(p.X + 1, p.Y), new Point(p.X, p.Y + 1), new Point(p.X + 1, p.Y + 1) })
                    {
                        if (!levelsToUpdateBorderWallColors.Contains(newP))
                        {
                            levelsToUpdateBorderWallColors.Add(newP);
                        }
                    }
                }
            }
            foreach (Point p in levelsToUpdateBorderWallColors)
            {
                if (p.X > 0 && p.Y > 0 && levels[p.X, p.Y] != null)
                {
                    if (levels[p.X - 1, p.Y] != null)
                    {
                        levels[p.X, p.Y].updateLeftBorderColors();
                    }
                    if (levels[p.X, p.Y - 1] != null)
                    {
                        levels[p.X, p.Y].updateTopBorderColors();
                    }
                    if (levels[p.X - 1, p.Y] != null && levels[p.X, p.Y - 1] != null && levels[p.X - 1, p.Y - 1] != null)
                    {
                        levels[p.X, p.Y].updateCornerBorderColors();
                    }
                }
            }
            foreach (Hero hero in heroes)
            {
                if (!History.IsRegistered(levels[hero.levelX, hero.levelY]))
                {
                    History.RegisterReversible(levels[hero.levelX, hero.levelY]);
                }
            }
        }