public static void RenderShopKeeperMenu(ShopKeeper shopKeeper, Hero hero)
        {
            Console.BackgroundColor = ConsoleColor.Black;
            ConsoleRenderer.Clear();
            int startingTop  = (Console.BufferHeight / 2) - 2;
            int startingLeft = 47;

            Console.SetCursorPosition(startingLeft, startingTop);

            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("The ShopKeeper {0} offers these items:", shopKeeper.Name);
            Console.CursorLeft = startingLeft;

            for (int i = 0; i < shopKeeper.Items.Length; i++)
            {
                if (shopKeeper.Items[i] != null)
                {
                    if (hero.Gold >= shopKeeper.Items[i].Value)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkGreen;
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                    }
                    Console.WriteLine("{0}. {1} - {2} Price: {3}", i + 1, shopKeeper.Items[i].Name, shopKeeper.Items[i].Description, shopKeeper.Items[i].Value);
                    Console.CursorLeft = startingLeft;
                }
            }

            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Esc: Exit.");
        }
        private void SetPositionables(Board board)
        {
            board.FreeFloorsPos = new List <Position>(board.FloorsPos);

            foreach (var boardPositionable in this.BoardPositionables)
            {
                for (int i = 0; i < boardPositionable.MaxItemCount; i++)
                {
                    int check = BoardFactory.rand.Next(0, 100);

                    if (check < boardPositionable.ItemChance)
                    {
                        int randomFloor = BoardFactory.rand.Next(0, board.FloorsPos.Count); //freefloors
                        switch (boardPositionable.Name)
                        {
                        case "Gold": AddPositionableToBoard(new Gold(board.FloorsPos[randomFloor]), board, randomFloor); break;

                        case "HealthPotion": AddPositionableToBoard(new HealthPotion(board.FloorsPos[randomFloor]), board, randomFloor); break;

                        case "ManaPotion": AddPositionableToBoard(new ManaPotion(board.FloorsPos[randomFloor]), board, randomFloor); break;

                        case "RogueArmorStrong": AddPositionableToBoard(new RogueArmor(board.FloorsPos[randomFloor], 150, 5), board, randomFloor); break;

                        case "RogueArmorWeak": AddPositionableToBoard(new RogueArmor(board.FloorsPos[randomFloor], 70, 2), board, randomFloor); break;

                        case "WizardArmorStrong": AddPositionableToBoard(new WizardArmor(board.FloorsPos[randomFloor], 150, 5), board, randomFloor); break;

                        case "WizardArmorWeak": AddPositionableToBoard(new WizardArmor(board.FloorsPos[randomFloor], 70, 2), board, randomFloor); break;

                        case "RogueWeaponStrong": AddPositionableToBoard(new RogueWeapon(board.FloorsPos[randomFloor], 100, 5), board, randomFloor); break;

                        case "RogueWeaponWeak": AddPositionableToBoard(new RogueWeapon(board.FloorsPos[randomFloor], 50, 2), board, randomFloor); break;

                        case "WizardWeaponStrong": AddPositionableToBoard(new WizardWeapon(board.FloorsPos[randomFloor], 100, 5), board, randomFloor); break;

                        case "WizardWeaponWeak": AddPositionableToBoard(new WizardWeapon(board.FloorsPos[randomFloor], 50, 2), board, randomFloor); break;

                        case "Trinket": AddPositionableToBoard(new Trinket(board.FloorsPos[randomFloor]), board, randomFloor);
                            break;

                        case "ShopKeeper": AddPositionableToBoard(ShopKeeper.GetShopKeeper(board.FloorsPos[randomFloor]), board, randomFloor);
                            break;

                        default:
                            break;
                        }
                    }
                }
            }
        }
        public static ShopKeeper GetShopKeeper(Position position)
        {
            const string ShopKeeperName   = "Tayn Eeon";
            const int    ShopKeeperHealth = 1024;
            const int    ShopKeeperDamage = 1024;
            const int    ShopKeeperXP     = 1024;

            ShopKeeper shopKeeper = new ShopKeeper(ShopKeeperName, position, ShopKeeperHealth)
            {
                Damage = ShopKeeperDamage, XPGain = ShopKeeperXP
            };

            for (int i = 0; i < shopKeeper.items.Length; i++)
            {
                int randomItem      = ShopKeeper.rand.Next(0, 5);
                int randomItemLevel = ShopKeeper.rand.Next(1, 6);
                int itemValue       = randomItemLevel * 1000;

                switch (randomItem)
                {
                case 0:
                    shopKeeper.items[i] = new RogueArmor(new Position(), itemValue, randomItemLevel);
                    break;

                case 1:
                    shopKeeper.items[i] = new WizardArmor(new Position(), itemValue, randomItemLevel);
                    break;

                case 2:
                    shopKeeper.items[i] = new RogueWeapon(new Position(), itemValue, randomItemLevel);
                    break;

                case 3:
                    shopKeeper.items[i] = new WizardWeapon(new Position(), itemValue, randomItemLevel);
                    break;

                case 4:
                    shopKeeper.items[i] = new Trinket(new Position());
                    break;

                default:
                    throw new ArgumentException("Invalid random item.");
                }
            }

            return(shopKeeper);
        }
        private int PlayBoard(Board board, List <Board> boards, Hero hero, int boardLevel, List <Monster> monsters)
        {
            bool itemSteppedByHero        = true;
            bool itemSteppedByMonster     = false;
            bool stairsSteppedOnByHero    = true;
            bool stairsSteppedOnByMonster = false;
            bool isNextToCharacter        = false;
            int  itemDescriptionLength    = 0;
            int  itemNameLength           = 0;

            foreach (var monster in monsters)
            {
                monster.Death += (sender, args) =>
                {
                    Monster mnstr = sender as Monster;
                    hero.Level.AddXP(mnstr.XPGain);
                };
            }

            ConsoleRenderer.RenderAllItems(board.PositionableObjects);
            while (hero.IsAlive)
            {
                Position desiredPos = input.SetMovement(board, hero.Position);
                ConsoleRenderer.RenderMove(board, hero, desiredPos);
                if (hero.Position == board.EntryStairPos && boardLevel > 0)
                {
                    if (boardLevel == boards.Count)
                    {
                        boards.Add(board);
                    }
                    else if (true)
                    {
                        boards[boardLevel] = board;
                    }
                    return(-1);
                }
                if (hero.Position == board.ExitStairPos)
                {
                    if (boardLevel == boards.Count)
                    {
                        boards.Add(board);
                    }
                    else if (true)
                    {
                        boards[boardLevel] = board;
                    }
                    return(1);
                }
                if (stairsSteppedOnByHero)
                {
                    ConsoleRenderer.RenderStairs(board);
                    stairsSteppedOnByHero = false;
                }
                if (hero.Position == board.EntryStairPos || hero.Position == board.ExitStairPos)
                {
                    stairsSteppedOnByHero = true;
                }
                if (itemSteppedByHero)
                {
                    ConsoleRenderer.RenderAllItems(board.PositionableObjects);
                    ConsoleRenderer.RemoveDescription(itemNameLength, itemDescriptionLength);
                    itemSteppedByHero = false;
                }
                if (isNextToCharacter)
                {
                    ConsoleRenderer.RenderAllItems(board.PositionableObjects);
                    ConsoleRenderer.RemoveDescription(itemNameLength, itemDescriptionLength);
                    itemSteppedByHero = false;
                }
                // GameEngine is alias to ConsoleRenderer.Engine just check the usings
                ConsoleRenderer.RenderStats(hero, boardLevel);
                //Always render the hero at the end so he can be on top on all the items and monsters !
                ConsoleRenderer.RenderCharacter(hero);
                foreach (var monster in monsters)
                {
                    if (hero.Position.Distance(monster.Position) < 1.5)
                    {
                        hero.TakeDamage(monster.Damage);
                    }
                    else if (hero.Position.Distance(monster.Position) < 5.5 && hero.Position.Distance(monster.Position) >= 1.5)
                    {
                        Position newPos = monster.NextMovingPosition(board, hero.Position);
                        if (MonsterMovement.IsValidMovement(board, newPos))
                        {
                            ConsoleRenderer.RenderMove(board, monster, newPos);
                            if (stairsSteppedOnByMonster)
                            {
                                ConsoleRenderer.RenderStairs(board);
                                stairsSteppedOnByMonster = false;
                            }
                            if (itemSteppedByMonster)
                            {
                                ConsoleRenderer.RenderAllItems(board.PositionableObjects);
                                itemSteppedByMonster = false;
                            }
                        }

                        if (monster.Position == board.EntryStairPos || monster.Position == board.ExitStairPos)
                        {
                            stairsSteppedOnByMonster = true;
                        }
                        foreach (var positionable in board.PositionableObjects)
                        {
                            if (monster.Position == positionable.Position)
                            {
                                if (positionable is Item)
                                {
                                    itemSteppedByMonster = true;
                                }
                            }
                        }

                        ConsoleRenderer.RenderCharacter(monster);
                    }

                    if (desiredPos == monster.Position)
                    {
                        monster.TakeDamage(hero.Weapon);
                    }
                }

                if (monsters.Any(mnstr => mnstr.IsAlive == false))
                {
                    var deadMonsters = monsters.Where(mnstr => mnstr.IsAlive == false).ToArray();
                    foreach (var monster in deadMonsters)
                    {
                        monsters.Remove(monster);
                        board.PositionableObjects.Remove(monster);
                        board.FreeFloorsPos.Add(monster.Position);
                        ConsoleRenderer.RenderObjectRemoval(monster.Position);
                    }
                }

                foreach (var positionable in board.PositionableObjects)
                {
                    if (positionable is Character)
                    {
                        if (hero.Position.Distance(positionable.Position) < 1.5)
                        {
                            ConsoleRenderer.RenderCharacterDescription(positionable as Character);
                            isNextToCharacter = true;
                        }

                        if (positionable is ShopKeeper && desiredPos == positionable.Position)
                        {
                            ShopKeeper shopKeeper = positionable as ShopKeeper;

                            do
                            {
                                ConsoleRenderer.RenderShopKeeperMenu(shopKeeper, hero);
                                ShopKeeperOptions option = input.ShopKeeperInteraction();
                                if (option == ShopKeeperOptions.Escape)
                                {
                                    break;
                                }
                                else if (option == ShopKeeperOptions.InvalidOption)
                                {
                                    ConsoleRenderer.Clear();
                                }
                                else
                                {
                                    int index = (int)option;

                                    if (shopKeeper.Items[index] != null && hero.Gold >= shopKeeper.Items[index].Value)
                                    {
                                        hero.Buy(shopKeeper.Items[index]);
                                        shopKeeper.Items[index] = null;
                                        break;
                                    }
                                }
                            } while (true);
                            ConsoleRenderer.Clear();
                            ConsoleRenderer.RenderPlayingScreen(hero, board, boardLevel);
                            ConsoleRenderer.RenderAllItems(board.PositionableObjects);
                        }
                    }


                    if (hero.Position == positionable.Position)
                    {
                        if (positionable is Item)
                        {
                            Item item = positionable as Item;
                            ConsoleRenderer.RenderItemDescription(item);
                            itemDescriptionLength = item.Description.Length;
                            itemNameLength        = item.Name.Length;
                            itemSteppedByHero     = true;
                            this.steppedOnItem    = (char)item.Icon;
                            this.itemColor        = item.ItemColor.ToConsoleColor();
                            hero.TakeItem(item, board);
                            break;
                        }

                        //tell me what shall i implement for the wizard armor ...please "ArmorSpell" WTF ?! :D
                        //if(item is WizardArmor && gandalf is Wizard && gandalf.Level.CurrentLevel>=item.NeededLvl)
                        //{
                        //	gandalf.TakeWizardArmor(item);
                        //	items.Remove(item);
                        //	this.steppedOnItem = ' ';
                        //	this.itemColor = ConsoleColor.White;
                        //	break;
                        //}
                    }



                    /*
                     * Implement later :
                     *
                     * if weapon
                     * if armor
                     *
                     */
                }
            }
            return(0);
        }