/// <summary>
        /// Adds a bot to the control
        /// </summary>
        /// <param name="bot">the instance of Bot to add</param>
        public void AddBot(Bot bot)
        {
            string[] items = new string[10];
            char[] modelSkinSeperator = new char[] { '/' };

            //foreach (Bot b in bots)
            //{
                string[] modelAndSkin = bot.ModelAndSkin.Split(modelSkinSeperator);
                items[0] = bot.Name;

                // if two substrings dont result from the split operation,
                // falling back to the original string is probably the best bet.
                if (modelAndSkin.Length == 2)
                {
                    items[1] = modelAndSkin[0];
                    items[2] = modelAndSkin[1];
                }
                else
                {
                    items[1] = bot.ModelAndSkin;
                    items[2] = bot.ModelAndSkin;
                }

                items[3] = bot.FiringAccuracy.ToString();
                items[4] = bot.Aggressiveness.ToString();
                items[5] = bot.CombatSkills.ToString();
                items[6] = bot.FavouredWeapon.ToString();
                items[7] = bot.IsQuadFreak.ToString();
                items[8] = bot.IsCamper.ToString();
                items[9] = bot.Ping.ToString();

                ListViewItem lvi = new ListViewItem(items);
                this.Items.Add(lvi);
        }
 public void PopulateListView(Bot[] bots)
 {
     foreach (Bot b in bots)
     {
         specificBotsListView.AddBot(b);
     }
 }
        /// <summary>
        /// Use CheckedBots() to easily retrieve instances of any bots that are checked within
        /// the control. 
        /// </summary>
        /// <returns>If 1 or more bots are checked, an Array of type Bot will be returned
        /// containing instances of all bots checked within the control. If not bots are checked
        /// an empty array will be returned.</returns>
        public Bot[] CheckedBots()
        {
            List<Bot> botList = new List<Bot>();

            foreach (ListViewItem item in this.CheckedItems)
            {
                StringBuilder modelAndSkin = new StringBuilder(
                    item.SubItems[1].Text + "/" + item.SubItems[2].Text
                    );

                uint accuracy = uint.Parse(item.SubItems[3].Text);
                uint aggressiveness = uint.Parse(item.SubItems[4].Text);
                uint combat = uint.Parse(item.SubItems[5].Text);

                FavouriteWeapon weapon = (FavouriteWeapon) Enum.Parse(typeof(FavouriteWeapon),
                    item.SubItems[6].Text, true);

                bool quadFreak = Boolean.Parse(item.SubItems[7].Text);
                bool camper = Boolean.Parse(item.SubItems[8].Text);
                uint averagePing = uint.Parse(item.SubItems[9].Text);

                Bot checkedBot = new Bot(
                    item.SubItems[0].Text,  // Name
                    modelAndSkin.ToString(),
                    accuracy,
                    aggressiveness,
                    combat,  // combat skill
                    weapon,                 // favourite weapon
                    quadFreak,
                    camper,
                    averagePing
                    );

                botList.Add(checkedBot);
            }

            return botList.ToArray();
        }
        /// <summary>
        /// Parses the bot file, storing bots and bot team data in the appropriate structures.
        /// </summary>
        /// <param name="path">Absolute path to the bot configuration file</param>
        /// <returns>Array containing the bots stored in the bot file</returns>
        public BotFileOutput ParseFile(string path)
        {
            // This code is rough but it does the trick. It could do with some stress
            // testing.

            bool insideBotSection = false;
            bool insideTeamSection = false;

            try
            {
                using (StreamReader sr = new StreamReader(path))
                {
                    //string line;

                    while ((line = sr.ReadLine()) != null)
                    {
                        line.Trim();

                        if (line.Length > 0)
                        {
                            if (line[0] != '#') // # are comments
                            {
                                startPosition = 0;

                                if (line[0] == '[')
                                {
                                    int start = line.IndexOf("[");
                                    int finish = line.IndexOf("]");

                                    string subString = line.Substring(start + 1, finish - 1);
                                    subString = subString.ToLower();

                                    // determine which section the file pointer is currently
                                    // entering. Kinda redundant - it's probably better
                                    // to just go ahead and parse the especified section, instead
                                    // of waiting for the next iteration of the loop. But whatever.
                                    if (subString == "bots")
                                    {
                                        insideBotSection = true;
                                        insideTeamSection = false;
                                    }
                                    else if (subString == "teams")
                                    {
                                        insideTeamSection = true;
                                        insideBotSection = false;
                                    }
                                    else
                                    {
                                        insideBotSection = false;
                                        insideTeamSection = false;
                                    }
                                }

                                else if (insideBotSection)
                                {

                                    //StringBuilder sb = new StringBuilder();
                                    Bot parsedBot = new Bot("", "", 0, 0, 0, FavouriteWeapon.BFG,
                                        false, false, 0);

                                    parsedBot.Name = RetrieveNextString();
                                    parsedBot.ModelAndSkin = RetrieveNextString();
                                    parsedBot.FiringAccuracy = (uint)RetrieveNextInteger(0);
                                    parsedBot.Aggressiveness = (uint)RetrieveNextInteger(0);
                                    parsedBot.CombatSkills = (uint)RetrieveNextInteger(0);
                                    parsedBot.FavouredWeapon = (FavouriteWeapon)RetrieveNextInteger(0);
                                    parsedBot.IsQuadFreak = Convert.ToBoolean(RetrieveNextInteger(0));
                                    parsedBot.IsCamper = Convert.ToBoolean(RetrieveNextInteger(0));
                                    parsedBot.Ping = (uint)RetrieveNextInteger(0);

                                    bots.Add(parsedBot);
                                }
                                else if (insideTeamSection)
                                {
                                    Team parsedTeam = new Team("", "", "", null);

                                    parsedTeam.Name = RetrieveNextString();
                                    parsedTeam.Abbreviation = RetrieveNextString();
                                    parsedTeam.SkinAndModel = RetrieveNextString();
                                    parsedTeam.Members = RetrieveStringCollection();

                                    teams.Add(parsedTeam);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                //MessageBox.Show(e.Message + e.StackTrace);
                StringBuilder sb = new StringBuilder();
                sb.Append(e.Message + Environment.NewLine);
                sb.Append(e.StackTrace + Environment.NewLine);

                throw new Exception(sb.ToString());

            }

            BotFileOutput output = new BotFileOutput(bots, teams);

            return output;
        }