/// <summary>
    /// Returns Dictionary of enemies from XML file
    ///
    /// Author: Cole Twitchell
    /// </summary>
    /// <returns>Dictionary of enemies</returns>
    public static Dictionary <string, Enemy> GetEnemiesFromXml()
    {
        if (enemies != null)
        {
            return(enemies);
        }

        Dictionary <string, Enemy> retDictionary = new Dictionary <string, Enemy>();

        XmlDocument doc       = new XmlDocument();
        TextAsset   textasset = (TextAsset)Resources.Load(ENEMIES_XML_FILEPATH, typeof(TextAsset));

        doc.LoadXml(textasset.text);

        foreach (XmlNode node in doc.SelectSingleNode("enemies").SelectNodes("enemy"))
        {
            string    id     = node.SelectSingleNode("id").InnerText;
            float     health = float.Parse(node.SelectSingleNode("health").InnerText);
            float     speed  = float.Parse(node.SelectSingleNode("speed").InnerText);
            int       value  = int.Parse(node.SelectSingleNode("value").InnerText);
            ColorType color  = (ColorType)ColorType.Parse(typeof(ColorType), node.SelectSingleNode("color").InnerText);

            Enemy e = (GameObject.Instantiate(Resources.Load("Prefabs/Enemies/" + id), LevelManager.PrefabHolderParent) as GameObject).GetComponent <Enemy>();
            e.Initialize(health, speed, value, color);

            retDictionary.Add(id, e);
        }

        enemies = retDictionary;

        return(retDictionary);
    }
    /// <summary>
    /// Returns Dictionary of Tower types from XML file
    ///
    /// Author: Cole Twitchell
    /// </summary>
    /// <returns>Dictionary of tower types</returns>
    public static Dictionary <string, Tower> GetTowersFromXml()
    {
        if (towers != null)
        {
            return(towers);
        }

        Dictionary <string, Tower> retDictionary = new Dictionary <string, Tower>();

        XmlDocument doc       = new XmlDocument();
        TextAsset   textasset = (TextAsset)Resources.Load(TOWERS_XML_FILEPATH, typeof(TextAsset));

        doc.LoadXml(textasset.text);

        Transform prefabHolder = GameObject.Find("PrefabHolder").transform;

        foreach (XmlNode node in doc.SelectSingleNode("towers").SelectNodes("proj-tower"))
        {
            string    name             = node.SelectSingleNode("name").InnerText;
            int       cost             = int.Parse(node.SelectSingleNode("cost").InnerText);
            int       upgradeCost      = int.Parse(node.SelectSingleNode("upgrade-cost").InnerText);
            float     upgradeCostScale = float.Parse(node.SelectSingleNode("upgrade-cost-scale").InnerText);
            int       maxLevel         = int.Parse(node.SelectSingleNode("max-level").InnerText);
            float     range            = float.Parse(node.SelectSingleNode("range").InnerText);
            ColorType color            = (ColorType)ColorType.Parse(typeof(ColorType), node.SelectSingleNode("color").InnerText);
            string    description      = node.SelectSingleNode("description").InnerText;

            // Projectile tower specific
            float projectileDamage = float.Parse(node.SelectSingleNode("proj-damage").InnerText);
            float projectileSpeed  = float.Parse(node.SelectSingleNode("proj-speed").InnerText);
            float attackRate       = float.Parse(node.SelectSingleNode("attack-rate").InnerText);

            ProjectileTower tower = (GameObject.Instantiate(Resources.Load("Prefabs/Towers/TowerPrefabs/" + name), LevelManager.PrefabHolderParent) as GameObject).GetComponent <ProjectileTower>();
            tower.Initialize(name, cost, upgradeCost, upgradeCostScale, maxLevel, range, color, description, attackRate, projectileSpeed, projectileDamage);

            retDictionary.Add(name, tower);
        }

        foreach (XmlNode node in doc.SelectSingleNode("towers").SelectNodes("aoe-tower"))
        {
            string    name             = node.SelectSingleNode("name").InnerText;
            int       cost             = int.Parse(node.SelectSingleNode("cost").InnerText);
            int       upgradeCost      = int.Parse(node.SelectSingleNode("upgrade-cost").InnerText);
            float     upgradeCostScale = float.Parse(node.SelectSingleNode("upgrade-cost-scale").InnerText);
            int       maxLevel         = int.Parse(node.SelectSingleNode("max-level").InnerText);
            float     range            = float.Parse(node.SelectSingleNode("range").InnerText);
            ColorType color            = (ColorType)ColorType.Parse(typeof(ColorType), node.SelectSingleNode("color").InnerText);
            string    description      = node.SelectSingleNode("description").InnerText;

            // Projectile tower specific
            float aoeDamage  = float.Parse(node.SelectSingleNode("aoe-damage").InnerText);
            float attackRate = float.Parse(node.SelectSingleNode("attack-rate").InnerText);

            AoETower tower = (GameObject.Instantiate(Resources.Load("Prefabs/Towers/TowerPrefabs/" + name), LevelManager.PrefabHolderParent) as GameObject).GetComponent <AoETower>();
            tower.Initialize(name, cost, upgradeCost, upgradeCostScale, maxLevel, range, color, description, attackRate, aoeDamage);

            retDictionary.Add(name, tower);
        }

        foreach (XmlNode node in doc.SelectSingleNode("towers").SelectNodes("dot-tower"))
        {
            string    name             = node.SelectSingleNode("name").InnerText;
            int       cost             = int.Parse(node.SelectSingleNode("cost").InnerText);
            int       upgradeCost      = int.Parse(node.SelectSingleNode("upgrade-cost").InnerText);
            float     upgradeCostScale = float.Parse(node.SelectSingleNode("upgrade-cost-scale").InnerText);
            int       maxLevel         = int.Parse(node.SelectSingleNode("max-level").InnerText);
            float     range            = float.Parse(node.SelectSingleNode("range").InnerText);
            ColorType color            = (ColorType)ColorType.Parse(typeof(ColorType), node.SelectSingleNode("color").InnerText);
            string    description      = node.SelectSingleNode("description").InnerText;

            // Projectile tower specific
            float doTDamage = float.Parse(node.SelectSingleNode("dot-damage").InnerText);

            DoTTower tower = (GameObject.Instantiate(Resources.Load("Prefabs/Towers/TowerPrefabs/" + name), LevelManager.PrefabHolderParent) as GameObject).GetComponent <DoTTower>();
            tower.Initialize(name, cost, upgradeCost, upgradeCostScale, maxLevel, range, color, description, doTDamage);

            retDictionary.Add(name, tower);
        }

        towers = retDictionary;

        return(retDictionary);
    }