コード例 #1
0
        //Loads Tag data from confignode file for a given save or for all saves if "<all_saves>" is given
        //If a save does not have a craft.tags file it copies the default.tags file into the save.
        //Will also instanciate an instance of Tags if one does not already exist.
        public static void load(string save_name)
        {
            if (Tags.instance == null)
            {
                new Tags();
            }
            List <string> save_dirs = new List <string> {
                save_name
            };

            Tags.instance.data.Clear();
            if (save_name == CMBrowser.all_saves_ref)
            {
                save_dirs = CraftData.save_names;
            }

            foreach (string save_dir in save_dirs)
            {
                CraftManager.log("loading tags for " + save_dir);
                if (!File.Exists(tag_file_path(save_dir)))
                {
                    FileInfo default_tags = new FileInfo(Paths.joined(CraftManager.ksp_root, "GameData", "CraftManager", "default.tags"));
                    //TODO handle case where default.tags file is not present.
                    default_tags.CopyTo(tag_file_path(save_dir));
                }
                ConfigNode raw_data  = ConfigNode.Load(tag_file_path(save_dir));
                ConfigNode tag_nodes = raw_data.GetNode("TAGS");

                foreach (ConfigNode tag_node in tag_nodes.nodes)
                {
                    string tag_name = tag_node.GetValue("tag_name");

                    Tag tag = Tags.find_or_create_by(tag_name, save_dir, false);
                    if (tag_node.HasNode("RULE"))
                    {
                        ConfigNode rule_node  = tag_node.GetNode("RULE");
                        bool       rule_added = tag.set_rule(rule_node.GetValue("attribute"), rule_node.GetValue("comparator"), rule_node.GetValue("value"));
                        if (!rule_added)
                        {
                            CraftManager.log("failed to load rule for tag: " + tag_name);
                        }
                    }
                    else
                    {
                        string[] craft = tag_node.GetValues("craft");
                        foreach (string craft_ref in craft)
                        {
                            tag.craft.AddUnique(craft_ref);
                        }
                    }
                }
            }
            Tags.update_lists();
        }
コード例 #2
0
        //Saves Tag data to config node craft.tags file.
        public static void save()
        {
            //First group the tags by the save which they belong to
            Dictionary <string, List <Tag> > tags_by_save = new Dictionary <string, List <Tag> >();

            foreach (Tag tag in Tags.instance.data)
            {
                if (!tags_by_save.ContainsKey(tag.save_dir))
                {
                    tags_by_save.Add(tag.save_dir, new List <Tag>());
                }
                tags_by_save[tag.save_dir].Add(tag);
            }

            //Then for each group of tags create ConfigNode of data and save to file in coresponding save
            foreach (KeyValuePair <string, List <Tag> > pair in tags_by_save)
            {
                ConfigNode nodes     = new ConfigNode();
                ConfigNode tag_nodes = new ConfigNode();
                List <Tag> tags      = pair.Value;
                string     save_dir  = pair.Key;
                foreach (Tag tag in tags)
                {
                    ConfigNode node = new ConfigNode();
                    node.AddValue("tag_name", tag.name);
                    if (tag.rule_based)
                    {
                        ConfigNode rule_node = new ConfigNode();
                        rule_node.AddValue("attribute", tag.rule_attribute);
                        rule_node.AddValue("comparator", tag.rule_comparitor);
                        rule_node.AddValue("value", tag.rule_value);
                        node.AddNode("RULE", rule_node);
                    }
                    else
                    {
                        foreach (string craft_ref in tag.craft)
                        {
                            node.AddValue("craft", craft_ref);
                        }
                    }
                    tag_nodes.AddNode("TAG", node);
                }
                nodes.AddNode("TAGS", tag_nodes);
                nodes.Save(tag_file_path(save_dir));
            }
            Tags.update_lists();
        }