public XmlNodeList Condition_Check(XmlNodeList option_XmlList, out bool input_Available, out bool roll_Available) { input_Available = false; roll_Available = false; XmlNodeList option_ReturnList = option_XmlList; for (int i = 0; i < option_ReturnList.Count; i++) { XmlNode option_SingleNode = option_ReturnList[i]; if (option_SingleNode.SelectSingleNode("Conditions") != null) { bool option_Validate = false; string[] option_Conditions = option_SingleNode.SelectSingleNode("Conditions"). InnerText.Split(splitCharacters, StringSplitOptions.RemoveEmptyEntries); foreach (string condition in option_Conditions) { //solve string pCondition = GetProperty(condition.Trim()); pCondition = link_InfoCheck.Invoke(pCondition); // check list if condition is valid this time if (option_Validate) { option_Validate = StringCalculator.Compare(pCondition); } //Removes invalid option and breaks condition checking if (!option_Validate) { option_ReturnList[i].ParentNode.RemoveChild(option_ReturnList[i]); break; } } } // checks if Roll and Input are in the option if (option_SingleNode.SelectSingleNode("Input") != null) { input_Available = true; } if (option_SingleNode.SelectSingleNode("Roll") != null) { roll_Available = true; } } return(option_ReturnList); }
public XmlNodeList Roll_Solve(XmlNodeList option_XmlList, out string Result_Info) { Result_Info = ""; // Set + index info; if single: set = N int diceRoll = -1; int returnIndex = -1; XmlNodeList option_ReturnList = option_XmlList; for (int k = 0; k < option_XmlList.Count; k++) { XmlNode option_SingleNode = option_XmlList[k]; XmlNodeList option_Roll = option_SingleNode.SelectSingleNode("Roll").ChildNodes; string[] Roll_Set = null; int set_Index = -1; #region Multiple-Rollset if (option_Roll[0].Name == "SetCondition") { // Check which set is to be loaded string[] set_Conditions = option_Roll[0].InnerText.Trim().Split(splitCharacters, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < set_Conditions.Count(); i++) { //solve string pCondition = GetProperty(set_Conditions[i].Trim()); pCondition = link_InfoCheck(pCondition); bool Valid = StringCalculator.Compare(pCondition); // returns first valid set if (Valid) { set_Index = i + 1; break; } } // if any set is valid; solve conditions if (set_Index != -1) { // check if set_Index points to a pre-set if (option_Roll[set_Index].Name.Contains("S_")) { string p_Name = option_Roll[set_Index].Name; string raw_Set = BranchPresets.SelectSingleNode("/Game/Roll/" + p_Name).InnerText.Replace(" ", ""); Roll_Set = raw_Set.Split(splitCharacters, StringSplitOptions.RemoveEmptyEntries); } else { string raw_Set = option_Roll[set_Index].InnerText.Replace(" ", ""); Roll_Set = raw_Set.Split(splitCharacters, StringSplitOptions.RemoveEmptyEntries); } bool firstTime = true; string rString = ""; // Check conditions in Roll_Set for (int j = 0; j < Roll_Set.Count(); j++) { string condition = Roll_Set[j].Trim(); // solve condition while (condition.Contains("D(")) { int first = condition.IndexOf("D(") + 2; int length = condition.IndexOf(")", first) - first; int eyeMax = int.Parse(condition.Substring(first, length)); diceRoll = dice.Next(1, eyeMax + 1); condition = condition.Replace("D(" + eyeMax + ")", diceRoll + ""); } condition = GetProperty(condition); if (StringCalculator.Compare(condition)) { if (firstTime) { firstTime = false; rString += option_Roll[set_Index].Name; } rString += ("-" + j); } } // if any result is valid stop foreach if (rString != "") { Result_Info = rString; returnIndex = k; break; } } } #endregion #region Single-Rollset else { bool firstTime = true; string rString = ""; for (int j = 0; j < option_Roll.Count; j++) { string condition = option_Roll[j].InnerText.Trim(); // solve condition if (condition.Contains("Dice")) { condition = condition.Replace("Dice", diceRoll + ""); } condition = GetProperty(condition); if (StringCalculator.Compare(condition)) { if (firstTime) { firstTime = false; rString += "N"; } rString += ("-" + j); } } // if any result is valid stop foreach if (rString != "") { Result_Info = rString; returnIndex = k; break; } } #endregion } // remove unuses/false options for (int i = 0; i < option_ReturnList.Count; i++) { if (i != returnIndex) { option_ReturnList[i].ParentNode.RemoveChild(option_ReturnList[i]); } } return(option_ReturnList); }