private void openFileButton_Click(object sender, EventArgs e) { OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Title = "Select Save File to Open"; fileDialog.Filter = "RWM files|*.rwm"; fileDialog.InitialDirectory = Settings.Default.lastUsedPath; if (fileDialog.ShowDialog() == DialogResult.OK) { Settings.Default.lastUsedPath = Path.GetDirectoryName(fileDialog.FileName); Settings.Default.Save(); handler = new XmlHandler(fileDialog.FileName); if (backupCheck.Checked == false) { handler.ToggleBackup(); } nodeMap = handler.Populate(); colonistListBox.DataSource = nodeMap.pawnNodeList; colonistListBox.DisplayMember = "fullName"; DefDumper.DumpBackstories(); PopulateBackstories(); if (!toggleOnce) { ToggleControls(); toggleOnce = true; } } if (!Settings.Default.rimworldDirSet) { FolderBrowserDialog folderSelector = new FolderBrowserDialog(); folderSelector.Description = "Please find the path to your rimworld directory. This is important for thoughtDefs and traitDefs to function."; if (folderSelector.ShowDialog() == DialogResult.OK) { Settings.Default.rimworldDir = folderSelector.SelectedPath; Settings.Default.rimworldDirSet = true; Settings.Default.Save(); } } if (Settings.Default.rimworldDirSet) { PopulateAvailableThoughts(); } }
//intialize document, Populate PawnNodeMaps return list of maps public NodeMap Populate() { saveFile = new XmlDocument(); saveFile.Load(filePath); //rebuild from scratch NodeMap nodeMap = new NodeMap(); //Populate Colony nodes XmlNode colonyName = saveFile.SelectSingleNode("map/colonyInfo/colonyName"); if (colonyName.InnerText != null) { nodeMap.colonyName = colonyName; } //Populate research nodes XmlNodeList researchNames = saveFile.SelectNodes("map/researchManager/progress/keys"); XmlNodeList researchValues = saveFile.SelectNodes("map/researchManager/progress/values"); SortedList <string, XmlNode> researchNodes = new SortedList <string, XmlNode>(); for (int i = 0; i < researchNames.Count; i++) { string name = researchNames.Item(i).InnerText; XmlNode value = researchValues.Item(i); researchNodes.Add(name, value); } nodeMap.researchNodes = researchNodes; //Get pawns by finding pawns with "Colonist" kindDef //was use "Colony" faction before but different languages save the innerText of this node in their language XmlNodeList pawnFactionNodes = saveFile.SelectNodes(Globals.XMLFINDPAWN); List <XmlNode> pawns = new List <XmlNode>(); foreach (XmlNode pawnFactionNode in pawnFactionNodes) { pawns.Add(pawnFactionNode.ParentNode); } List <NodeMap.PawnNode> pawnNodeList = new List <NodeMap.PawnNode>(); //populate colonist nodes foreach (XmlNode pawnNode in pawns) { //new pawn node object NodeMap.PawnNode workingPawnNode = new NodeMap.PawnNode(); workingPawnNode.pawn = pawnNode; //get name nodes XmlNode storyNode = pawnNode.SelectSingleNode("story"); workingPawnNode.nameFirst = storyNode.SelectSingleNode("name.first"); workingPawnNode.nameLast = storyNode.SelectSingleNode("name.last"); workingPawnNode.nameNick = storyNode.SelectSingleNode("name.nick"); workingPawnNode.childhood = storyNode.SelectSingleNode("childhood"); workingPawnNode.adulthood = storyNode.SelectSingleNode("adulthood"); //Concatenate full name workingPawnNode.InitNames(); //get pawn health node workingPawnNode.pawnHealth = pawnNode.SelectSingleNode("healthTracker/pawnHealth"); //loop for skills XmlNodeList skillNodes = pawnNode.SelectNodes("skills/skills/li"); SortedList <string, XmlNode> skillNodesList = new SortedList <string, XmlNode>(); SortedList <String, XmlNode> passionNodesList = new SortedList <string, XmlNode>(); foreach (XmlNode skillNode in skillNodes) { string skillName = skillNode.SelectSingleNode("def").InnerText; XmlNode skillLevel = skillNode.SelectSingleNode("level"); //Fix for NRE's due to non-existing node for 0 values if (skillLevel == null) { XmlElement nreFix = saveFile.CreateElement("level"); nreFix.InnerText = "0"; skillNode.AppendChild(nreFix); skillLevel = skillNode.SelectSingleNode("level"); } //add Skill to list skillNodesList.Add(skillName, skillLevel); //While we're already at the skill grab the passion node XmlNode passionNode = skillNode.SelectSingleNode("passion"); passionNodesList.Add(skillName, passionNode); } //End Skill loop //After loop add lists to pawn workingPawnNode.skillNodes = skillNodesList; workingPawnNode.passionNodes = passionNodesList; //Start Thought Loop SortedList <string, XmlNode> thoughtNodeList = new SortedList <string, XmlNode>(); XmlNodeList topLevelThoughts = pawnNode.SelectNodes("psychology/thoughts/thoughts/li"); Dictionary <string, int> thoughtDupes = new Dictionary <string, int>(); foreach (XmlNode thoughtNode in topLevelThoughts) { string name = thoughtNode.SelectSingleNode("def").InnerText + ":" + thoughtNode.SelectSingleNode("age").InnerText; if (!thoughtDupes.ContainsKey(name)) { thoughtDupes.Add(name, 1); } else { name = name + ":" + thoughtDupes[name]; thoughtDupes[thoughtNode.SelectSingleNode("def").InnerText + ":" + thoughtNode.SelectSingleNode("age").InnerText]++; } thoughtNodeList.Add(name, thoughtNode); } //add thoughts to pawn workingPawnNode.thoughtNodes = thoughtNodeList; //add this pawn to master list as we're done with it pawnNodeList.Add(workingPawnNode); } //Add pawn list to nodeMap nodeMap.pawnNodeList = pawnNodeList; return(nodeMap); }