private static DataGenerator ParseYamlFile(YamlStream yaml)
        {
            var generator = new DataGenerator {DataGeneratorEntries = new List<WeightedChoiceEntry>()};
            //See YamlToNodePArser.cs to get a better idea of how handle yamldontnet

            try
            {
                var mapping = (YamlSequenceNode)yaml.Documents[0].RootNode;

                foreach (YamlSequenceNode node in mapping)
                {
                    var generatorEntry = new WeightedChoiceEntry {WeightedStrings = new Dictionary<string, int>()};

                    foreach (YamlSequenceNode subnode in node)
                    {
                        var subnodeData = subnode.Children;

                        var text = subnodeData[0].ToString();

                        //Parsing into an int can be tricky and users are likely to put in something that won't parse so we need more sanity checks here
                        var weight = 1;
                        if(!int.TryParse( subnodeData[1].ToString(), out weight))
                        {
                            Console.WriteLine("Could not parse int from subnode: {0} defaulting to 1", subnode);
                        }

                        generatorEntry.TotalWeight += weight;
                        generatorEntry.WeightedStrings.Add(text,weight);
                    }

                    generator.DataGeneratorEntries.Add(generatorEntry);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error parsing: {0}", _curFileName);
                Console.WriteLine(e);
                return null;
            }

            return generator;
        }
Example #2
0
        private static FractalNode ParseYamlFile(YamlStream yaml)
        {
            var node = new FractalNode();

            try
            {
                var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;

                //the mapping is index with yamlscalars and not strings
                //So we need to build a new yamlscalarnode for every named entry
                //Before checking them and adding them ot the node.

                var titleScalar = new YamlScalarNode("Title");
                if (mapping.Children.Keys.Contains(titleScalar))
                    node.Title = mapping.Children[titleScalar].ToString();

                var nameScalar = new YamlScalarNode("Name");
                if (mapping.Children.Keys.Contains(nameScalar))
                    node.Name = mapping.Children[nameScalar].ToString();

                var textScalar = new YamlScalarNode("Text");
                if (mapping.Children.Keys.Contains(textScalar))
                    node.Text = mapping.Children[textScalar].ToString();

                var sideTitleScalar = new YamlScalarNode("SidebarTitle");
                if (mapping.Children.Keys.Contains(sideTitleScalar))
                    node.SidebarTitle = mapping.Children[sideTitleScalar].ToString();

                var sideTextScalar = new YamlScalarNode("SidebarText");
                if (mapping.Children.Keys.Contains(sideTextScalar))
                    node.SidebarText = mapping.Children[sideTextScalar].ToString();

                var sideUrlScalar = new YamlScalarNode("SidebarURL");
                if (mapping.Children.Keys.Contains(sideUrlScalar))
                    node.SidebarUrl = mapping.Children[sideUrlScalar].ToString();

                //Check for a nodes node, if it exists iterate over all its children
                var nodesScalar = new YamlScalarNode("Nodes");
                if (mapping.Children.Keys.Contains(nodesScalar))
                {
                    var subnodes = (YamlSequenceNode) mapping.Children[nodesScalar];

                    foreach (YamlMappingNode subnode in subnodes)
                    {
                        var nodeWeighted = new FractalNodeWeighted();

                        //check for a type entry, and if it exists add it, Type is the one mandatory entry
                        var typeScalar = new YamlScalarNode("Type");
                        if(subnode.Children.Keys.Contains(typeScalar))
                        {
                            nodeWeighted.Type = subnode.Children[typeScalar].ToString();
                        }
                        else
                        {
                            break; //if there is no Type this entry isn't meaningful
                        }

                        //Parsing into an int can be tricky and users are likely to put in something that won't parse so we need more sanity checks here
                        var chanceScalar = new YamlScalarNode("PercentageChance");
                        if (subnode.Children.Keys.Contains(chanceScalar))
                        {
                            var amount = 1;

                            if (!int.TryParse(subnode.Children[chanceScalar].ToString(), out amount))
                            {
                                Console.WriteLine("Could not parse int from subnode: {0} defaulting to 1", subnode);
                            }

                            if( amount > 0 && amount <= 100)
                            {
                                nodeWeighted.PercentageChance = amount;
                            }
                            else
                            {
                                nodeWeighted.PercentageChance = 100;
                            }

                        }
                        else
                        {
                            nodeWeighted.PercentageChance = 100;
                        }

                        //need to do things a bit more complex because minimum may not exceed maximum
                        var maxScalar = new YamlScalarNode("MaxAmount");
                        if (subnode.Children.Keys.Contains(maxScalar))
                        {
                            var amount = 1;

                            if (!int.TryParse(subnode.Children[maxScalar].ToString(), out amount))
                            {
                                Console.WriteLine("Could not parse int from subnode: {0} defaulting to 1", subnode);
                            }

                            nodeWeighted.MaxAmount = amount;
                        }
                        else
                        {
                            nodeWeighted.MaxAmount = 1;
                        }

                        var minScalar = new YamlScalarNode("MinAmount");
                        if (subnode.Children.Keys.Contains(minScalar))
                        {
                            var amount = 1;

                            if (!int.TryParse(subnode.Children[minScalar].ToString(), out amount))
                            {
                                Console.WriteLine("Could not parse int from subnode: {0} defaulting to 1", subnode);
                            }

                            nodeWeighted.MinAmount = (amount > nodeWeighted.MaxAmount) ? nodeWeighted.MaxAmount : amount;
                        }
                        else
                        {
                            nodeWeighted.MinAmount = 1;
                        }

                        if(node.Nodes == null)
                        {
                            node.Nodes = new List<FractalNodeWeighted>();
                        }

                        node.Nodes.Add(nodeWeighted);
                    }
                }

                var choiceNodesScalar = new YamlScalarNode("ChoiceNodes");
                if(mapping.Children.Keys.Contains(choiceNodesScalar))
                {
                    var choiceNodes = (YamlSequenceNode) mapping.Children[choiceNodesScalar];
                    node.ChoiceNodes = new List<WeightedChoiceEntry>();

                    foreach (YamlSequenceNode choiceNode in choiceNodes)
                    {
                        var entry = new WeightedChoiceEntry {WeightedStrings = new Dictionary<string, int>()};

                        foreach (YamlSequenceNode subnode in choiceNode)
                        {
                            var subnodeData = subnode.Children;

                            var text = subnodeData[0].ToString();
                            var weight = 1;

                            if (!int.TryParse(subnodeData[1].ToString(), out weight))
                            {
                                Console.WriteLine("Could not parse int from subnode: {0} defaulting to 1", subnode);
                            }

                            entry.TotalWeight += weight;
                            entry.WeightedStrings.Add(text,weight);
                        }

                        node.ChoiceNodes.Add(entry);
                    }

                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error parsing: {0}", _curFileName);
                Console.WriteLine(e);
                return null;
            }

            return node;
        }