Ejemplo n.º 1
0
        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.");
        }
Ejemplo n.º 2
0
        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);
        }