public GameplayScreen(LevelConfig config)
 {
     this.config = config;
 }
        /// <summary>
        /// Loads the configuration for the given level.
        /// </summary>
        /// <param name="levelNumber">Which level to load</param>
        /// <returns>The requested level config</returns>
        public LevelConfig LoadLevelConfig(int levelNumber, LevelType type)
        {
            Dictionary<NodeType, string> nodeTextures = new Dictionary<NodeType, string>();
            doc = new XmlDocument();
            int[,] mapLayout;
            List<string[]> waypointLayout;
            LevelConfig config;
            string fileLocation = rootConfigLocation + "Levels.xml";
            string baseNodeName = String.Empty;

            switch (type)
            {
                case LevelType.Bonus:
                    baseNodeName = String.Format("levels/bonus/level[@number='{0}']", levelNumber);
                    break;
                case LevelType.Custom:
                    baseNodeName = String.Format("levels/custom/level[@number='{0}']", levelNumber);
                    break;
                default:
                    baseNodeName = String.Format("levels/story/level[@number='{0}']", levelNumber);
                    break;
            }

            doc.Load(fileLocation);
            XmlNode baseNode = doc.SelectSingleNode(baseNodeName);

            // Parse the map layout
            string[] rows = baseNode.SelectSingleNode("map").InnerText.Split(';');

            int mapHeight = rows.Length;
            int mapWidth = rows[0].Split(',').Length;
            mapLayout = new int[mapWidth, mapHeight];

            for (int i = 0; i < rows.Length; i++)
            {
                string[] nodes = rows[i].Split(',');

                for (int j = 0; j < nodes.Length; j++)
                {
                    mapLayout[i, j] = Convert.ToInt32(nodes[j]);
                }
            }

            // Load Waypoints
            waypointLayout = GetWaypoints(baseNode.SelectSingleNode("waypoints").InnerText.Split(';'));

            // Load wallet starting amount
            int startingWallet = Convert.ToInt32(baseNode.SelectSingleNode("wallet_start_amount").InnerText);

            // Load Textures
            nodeTextures.Add(NodeType.Buildable, baseNode.SelectSingleNode("buildable_texture").InnerText);
            nodeTextures.Add(NodeType.NonBuildable, baseNode.SelectSingleNode("nonbuildable_texture").InnerText);
            nodeTextures.Add(NodeType.Path, baseNode.SelectSingleNode("path_texture").InnerText);

            config = new LevelConfig( mapLayout
                                    , waypointLayout
                                    , startingWallet
                                    , nodeTextures
                                    );

            return config;
        }
        /// <summary>
        /// Saves a level configuration
        /// </summary>
        /// <param name="levelNumber">Which level is being saved</param>
        /// <param name="config">The level's configuration</param>
        /// <param name="type">What type of level is being saved</param>
        public void SaveLevelConfig(int levelNumber, LevelConfig config, LevelType type)
        {
            bool isNodeCreated = false;
            int nodeIndex = levelNumber;
            string currentNodeName = String.Format("level[@number='{0}']", levelNumber);
            string baseNodeName;
            string fileLocation = rootConfigLocation + "Levels.xml";
            doc = new XmlDocument();
            XmlNode baseNode, prevNode = null;

            //Create our new node
            XmlNode newNode = ConfigureNode(levelNumber, config);
            doc.Load(fileLocation);

            switch (type)
            {
                case LevelType.Bonus:
                    baseNodeName = String.Format("levels/bonus/level[@number='{0}']", levelNumber);
                    break;
                case LevelType.Custom:
                    baseNodeName = String.Format("levels/custom/level[@number='{0}']", levelNumber);
                    break;
                default:
                    baseNodeName = String.Format("levels/story/level[@number='{0}']", levelNumber);
                    break;
            }

            baseNode = doc.SelectSingleNode(baseNodeName);

            // Check if any levels exist
            if (baseNode.SelectNodes("level").Count == 0)
            {
                // No levels have been created yet so we don't care about order
                baseNode.AppendChild(newNode);
                doc.Save(fileLocation);
                return;
            }

            // Check if this level already exists
            if (baseNode.SelectSingleNode(currentNodeName) != null)
            {
                // Delete the original
                baseNode.RemoveChild(doc.SelectSingleNode(currentNodeName));
            }

            while (!isNodeCreated)
            {
                nodeIndex--;

                currentNodeName = String.Format("level[@number='{0}]'", nodeIndex);
                prevNode = baseNode.SelectSingleNode(currentNodeName);

                if (prevNode != null)
                {
                    baseNode.InsertAfter(newNode, prevNode);
                    isNodeCreated = true;
                }
            }

            doc.Save(fileLocation);
        }
        /// <summary>
        /// Prepares a new level node to be saved
        /// </summary>
        /// <param name="levelNumber">What level is this</param>
        /// <param name="config"></param>
        /// <returns></returns>
        private XmlNode ConfigureNode(int levelNumber, LevelConfig config)
        {
            // TODO: Fix this
            List<XmlNode> nodes = new List<XmlNode>();
            string buildableIds = String.Empty;
            string pathIds = String.Empty;
            XmlNode subNode, walletNode;

            // Initialize the new level XmlNode
            XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "level", null);
            XmlAttribute att = doc.CreateAttribute("number");
            att.Value = levelNumber.ToString();
            newNode.Attributes.Append(att);

            subNode = doc.CreateNode(XmlNodeType.Element, "buildable_texture", null);
            subNode.InnerText = config.NodeTextures[NodeType.Buildable];
            newNode.AppendChild(subNode);

            subNode = doc.CreateNode(XmlNodeType.Element, "nonbuildable_texture", null);
            subNode.InnerText = config.NodeTextures[NodeType.NonBuildable];
            newNode.AppendChild(subNode);

            subNode = doc.CreateNode(XmlNodeType.Element, "path_texture", null);
            subNode.InnerText = config.NodeTextures[NodeType.Path];
            newNode.AppendChild(subNode);

            walletNode = doc.CreateNode(XmlNodeType.Element, "wallet_start_amount", null);
            walletNode.InnerText = config.WalletStartAmount.ToString();
            newNode.AppendChild(walletNode);

            return newNode;
        }
Пример #5
0
        /// <summary>
        /// Primary constructor for Level
        /// </summary>
        /// <param name="service">ServiceProvider for the main game</param>
        /// <param name="config"></param>
        /// <param name="screenWidth"></param>
        /// <param name="screenHeight"></param>
        public Level(ContentManager content, LevelConfig config)
        {
            this.contentManager = content;

            this.config = config;

            InitLevel();

            player = new Player(playerTexture, map.GetPlayerPosition().Center, config.WalletStartAmount);
        }