//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(); }
//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(); }