public void Update(FileParser p)
        {
            world         = new World();
            visualization = new Interface();
            levelGen      = new LevelGenerator();
            player        = new Player();
            parser        = p;
            messages      = new List <string>();
            Tuple <int, int>    playerPos;
            Tuple <int, int>    exitPos;
            List <Object>       currentTile;
            List <IDealsDamage> tileDmg;
            List <NPC>          tileNPC;
            List <IItem>        tileItems;
            List <IItem>        inventoryItems;
            int            level = 1;
            bool           quit  = false;
            bool           action;
            ConsoleKeyInfo option;
            HighScore      hS;
            short          itemNum, npcNum;

            if (keyBinds.Count == 0)
            {
                AddKeys();
            }
            messages.Add("Welcome to the game!");

            do
            {
                exitPos   = levelGen.GenerateLevel(world, player, level, parser);
                playerPos = new Tuple <int, int>(player.X, player.Y);

                do
                {
                    // Clear our command flags to update next
                    CommandFlag = Command.None;
                    action      = false;
                    tileItems   = new List <IItem>();
                    tileDmg     = new List <IDealsDamage>();
                    tileNPC     = new List <NPC>();

                    currentTile = world.WorldArray[player.X, player.Y].
                                  GetInfo().ToList();

                    foreach (IItem obj in currentTile.OfType <IItem>())
                    {
                        tileItems.Add(obj);
                    }

                    foreach (IDealsDamage obj in
                             currentTile.OfType <IDealsDamage>())
                    {
                        tileDmg.Add(obj);
                    }

                    foreach (IDealsDamage obj in tileDmg)
                    {
                        if (obj is Trap)
                        {
                            if (!(obj as Trap).FallenInto)
                            {
                                obj.OnDetectingPlayer(this);
                            }
                        }
                        if (obj is NPC)
                        {
                            tileNPC.Add(obj as NPC);
                            if (((obj as NPC).Hostile))
                            {
                                obj.OnDetectingPlayer(this);
                            }
                        }
                    }

                    inventoryItems = player.Inventory.GetInfo().ToList();

                    if (player.HP <= 0)
                    {
                        break;
                    }

                    visualization.ShowWorld(world, player, level);
                    visualization.ShowStats(world, player);
                    visualization.ShowLegend(world);
                    visualization.ShowMessages(world, messages);
                    visualization.ShowSurrounds
                        (world.GetSurroundingInfo(player));
                    visualization.ShowOptions(new
                                              List <ConsoleKey>(keyBinds.Keys));

                    messages.Clear();

                    // Update our input for everything else to use
                    option = Console.ReadKey();
                    if (keyBinds.TryGetValue(option.Key, out var command))
                    {
                        CommandFlag |= command;

                        switch (CommandFlag)
                        {
                        case Command.Quit:
                            string wantsQuit;
                            do
                            {
                                visualization.AskQuit();
                                wantsQuit = Console.ReadLine();
                            } while ((wantsQuit.ToUpper() != "Y") &&
                                     (wantsQuit.ToUpper() != "N"));
                            if (wantsQuit.ToUpper() == "Y")
                            {
                                quit = true;
                            }
                            break;

                        case Command.MoveNorth:
                            if (player.MoveNorth())
                            {
                                playerPos =
                                    world.UpdatePlayer(playerPos, player);
                                action = true;
                                messages.Add("You moved NORTH");
                            }
                            else
                            {
                                messages.Add("You tried to move NORTH." +
                                             " But you hit a wall instead");
                            }
                            break;

                        case Command.MoveSouth:
                            if (player.MoveSouth(world.X))
                            {
                                playerPos =
                                    world.UpdatePlayer(playerPos, player);
                                action = true;
                                messages.Add("You moved SOUTH");
                            }
                            else
                            {
                                messages.Add("You tried to move SOUTH." +
                                             "  But you hit a wall instead");
                            }
                            break;

                        case Command.MoveWest:
                            if (player.MoveWest())
                            {
                                playerPos =
                                    world.UpdatePlayer(playerPos, player);
                                action = true;
                                messages.Add("You moved WEST");
                            }
                            else
                            {
                                messages.Add("You tried to move WEST." +
                                             "  But you hit a wall instead");
                            }
                            break;

                        case Command.MoveEast:
                            if (player.MoveEast(world.Y))
                            {
                                playerPos =
                                    world.UpdatePlayer(playerPos, player);
                                action = true;
                                messages.Add("You moved EAST");
                            }
                            else
                            {
                                messages.Add("You tried to move EAST." +
                                             "  But you hit a wall instead");
                            }
                            break;

                        case Command.AttackNPC:
                            if ((tileNPC.Count > 0))
                            {
                                if (player.SelectedWeapon != null)
                                {
                                    do
                                    {
                                        visualization.ShowNPCsToAttack(
                                            tileNPC);
                                        short.TryParse(
                                            Console.ReadLine(),
                                            out npcNum);
                                    } while ((npcNum < 0) ||
                                             (npcNum > tileItems.Count));

                                    if (npcNum != tileItems.Count)
                                    {
                                        player.AttackNPC(this,
                                                         tileNPC[npcNum]);
                                        action = true;
                                    }
                                }
                                else
                                {
                                    messages.Add("You tried to attack an" +
                                                 " NPC but you don't have a " +
                                                 "weapon equipped");
                                }
                            }
                            else
                            {
                                messages.Add("You tried to attack an NPC" +
                                             " but there are no NPC in the " +
                                             "current tile");
                            }
                            break;

                        case Command.PickUpItem:
                            if (tileItems.Count > 0)
                            {
                                do
                                {
                                    visualization.ShowItems(tileItems,
                                                            "Pick Up");
                                    short.TryParse(
                                        Console.ReadLine(), out itemNum);
                                } while ((itemNum < 0) ||
                                         (itemNum > tileItems.Count));

                                if (itemNum != tileItems.Count)
                                {
                                    tileItems[itemNum].OnPickUp(this);
                                    action = true;
                                }
                            }
                            else
                            {
                                messages.Add("You tried to PICK UP an " +
                                             "item but there are no items " +
                                             "available to be picked up");
                            }
                            break;

                        case Command.UseItem:
                            if (inventoryItems.Count > 0)
                            {
                                do
                                {
                                    visualization.ShowItems(inventoryItems,
                                                            "Use");
                                    short.TryParse(
                                        Console.ReadLine(), out itemNum);
                                } while ((itemNum < 0) ||
                                         (itemNum > inventoryItems.Count));

                                if (itemNum != inventoryItems.Count)
                                {
                                    inventoryItems[itemNum].OnUse(this);
                                    action = true;
                                }
                            }
                            else
                            {
                                messages.Add("You tried to USE an " +
                                             "item but you currently don't have" +
                                             " any items in the inventory");
                            }
                            break;

                        case Command.DropItem:
                            if (inventoryItems.Count > 0)
                            {
                                do
                                {
                                    visualization.ShowItems(inventoryItems,
                                                            "Drop");
                                    short.TryParse(
                                        Console.ReadLine(), out itemNum);
                                } while ((itemNum < 0) ||
                                         (itemNum > inventoryItems.Count));

                                if (itemNum != inventoryItems.Count)
                                {
                                    inventoryItems[itemNum].OnDrop(this);
                                    action = true;
                                }
                            }
                            else
                            {
                                messages.Add("You tried to DROP an " +
                                             "item but you currently don't have" +
                                             " any items in the inventory");
                            }
                            break;

                        case Command.Information:
                            messages.Add("You sought more info in the " +
                                         "elder scrolls");
                            visualization.ShowInformation(parser);
                            Console.ReadKey();
                            break;
                        }

                        if (action)
                        {
                            player.LoseHP(1);
                        }
                    }
                    else
                    {
                        Console.WriteLine();
                        visualization.WrongOption(option.Key.ToString());
                        Console.ReadKey();
                    }
                } while ((!playerPos.Equals(exitPos)) && (!quit) &&
                         (player.HP > 0));

                if (!quit)
                {
                    level++;
                }
            } while ((player.HP > 0) && (!quit));

            if (!quit)
            {
                visualization.ShowWorld(world, player, level);
                visualization.ShowStats(world, player);
                visualization.ShowLegend(world);

                visualization.ShowDeath(level);
            }

            if (CheckHighScore(level))
            {
                visualization.Success(level);
                string name = Console.ReadLine();
                if (name.Length > 3)
                {
                    name = name.Substring(0, 3);
                }
                hS = new HighScore(name, level);
                parser.UpdateHighScores(hS);
            }
            else
            {
                visualization.Failure(level);
                Console.ReadKey();
            }
        }