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 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); }