示例#1
0
        /// <summary>
        /// Build the list of Qualities.
        /// </summary>
        private void BuildQualityList()
        {
            if (_blnLoading)
            {
                return;
            }

            string        strCategory = cboCategory.SelectedValue?.ToString() ?? string.Empty;
            StringBuilder sbdFilter   = new StringBuilder('(' + _objCharacter.Options.BookXPath() + ')');

            if (!string.IsNullOrEmpty(strCategory) && strCategory != "Show All" && (GlobalOptions.SearchInCategoryOnly || txtSearch.TextLength == 0))
            {
                sbdFilter.Append(" and category = " + strCategory.CleanXPath());
            }
            else
            {
                StringBuilder objCategoryFilter = new StringBuilder();
                foreach (string strItem in _lstCategory.Select(x => x.Value))
                {
                    if (!string.IsNullOrEmpty(strItem))
                    {
                        objCategoryFilter.Append("category = " + strItem.CleanXPath() + " or ");
                    }
                }
                if (objCategoryFilter.Length > 0)
                {
                    objCategoryFilter.Length -= 4;
                    sbdFilter.Append(" and (" + objCategoryFilter + ')');
                }
            }
            if (chkMetagenic.Checked)
            {
                sbdFilter.Append(" and (metagenic = 'True' or required/oneof[contains(., 'Changeling')])");
            }
            else if (chkNotMetagenic.Checked)
            {
                sbdFilter.Append(" and not(metagenic = 'True') and not(required/oneof[contains(., 'Changeling')])");
            }
            if (nudValueBP.Value != 0)
            {
                if (_objCharacter.Created && !_objCharacter.Options.DontDoubleQualityPurchases && nudValueBP.Value > 0)
                {
                    sbdFilter.Append(" and ((doublecareer = 'False' and karma = " + nudValueBP.Value.ToString(GlobalOptions.InvariantCultureInfo)
                                     + ") or (not(doublecareer = 'False') and karma = " + (nudValueBP.Value / 2).ToString(GlobalOptions.InvariantCultureInfo) + "))");
                }
                else
                {
                    sbdFilter.Append(" and karma = " + nudValueBP.Value.ToString(GlobalOptions.InvariantCultureInfo));
                }
            }
            else
            {
                if (nudMinimumBP.Value != 0)
                {
                    if (_objCharacter.Created && !_objCharacter.Options.DontDoubleQualityPurchases)
                    {
                        sbdFilter.Append(" and (((doublecareer = 'False' or karma < 0) and karma >= " + nudMinimumBP.Value.ToString(GlobalOptions.InvariantCultureInfo)
                                         + ") or (not(doublecareer = 'False' or karma < 0) and karma >= " + (nudMinimumBP.Value / 2).ToString(GlobalOptions.InvariantCultureInfo) + "))");
                    }
                    else
                    {
                        sbdFilter.Append(" and karma >= " + nudMinimumBP.Value.ToString(GlobalOptions.InvariantCultureInfo));
                    }
                }

                if (nudMaximumBP.Value != 0)
                {
                    if (_objCharacter.Created && !_objCharacter.Options.DontDoubleQualityPurchases && nudMaximumBP.Value > 0)
                    {
                        sbdFilter.Append(" and (((doublecareer = 'False' or karma < 0) and karma <= " + nudMaximumBP.Value.ToString(GlobalOptions.InvariantCultureInfo)
                                         + ") or (not(doublecareer = 'False' or karma < 0) and karma <= " + (nudMaximumBP.Value / 2).ToString(GlobalOptions.InvariantCultureInfo) + "))");
                    }
                    else
                    {
                        sbdFilter.Append(" and karma <= " + nudMaximumBP.Value.ToString(GlobalOptions.InvariantCultureInfo));
                    }
                }
            }
            if (!string.IsNullOrEmpty(txtSearch.Text))
            {
                sbdFilter.Append(" and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text));
            }

            string          strCategoryLower = strCategory == "Show All" ? "*" : strCategory.ToLowerInvariant();
            List <ListItem> lstQuality       = new List <ListItem>();

            foreach (XPathNavigator objXmlQuality in _xmlBaseQualityDataNode.Select("qualities/quality[" + sbdFilter + "]"))
            {
                string strLoopName = objXmlQuality.SelectSingleNode("name")?.Value;
                if (string.IsNullOrEmpty(strLoopName))
                {
                    continue;
                }
                if (_xmlMetatypeQualityRestrictionNode != null && _xmlMetatypeQualityRestrictionNode.SelectSingleNode(strCategoryLower + "/quality[. = " + strLoopName.CleanXPath() + "]") == null)
                {
                    continue;
                }
                if (!chkLimitList.Checked || objXmlQuality.RequirementsMet(_objCharacter, string.Empty, string.Empty, IgnoreQuality))
                {
                    lstQuality.Add(new ListItem(objXmlQuality.SelectSingleNode("id")?.Value ?? string.Empty, objXmlQuality.SelectSingleNode("translate")?.Value ?? strLoopName));
                }
            }
            lstQuality.Sort(CompareListItems.CompareNames);

            string strOldSelectedQuality = lstQualities.SelectedValue?.ToString();

            _blnLoading = true;
            lstQualities.BeginUpdate();
            lstQualities.ValueMember   = nameof(ListItem.Value);
            lstQualities.DisplayMember = nameof(ListItem.Name);
            lstQualities.DataSource    = lstQuality;
            _blnLoading = false;
            if (string.IsNullOrEmpty(strOldSelectedQuality))
            {
                lstQualities.SelectedIndex = -1;
            }
            else
            {
                lstQualities.SelectedValue = strOldSelectedQuality;
            }
            lstQualities.EndUpdate();
        }
示例#2
0
        /// <summary>
        /// Build the list of Arts.
        /// </summary>
        private void BuildList()
        {
            if (_blnLoading)
            {
                return;
            }

            List <ListItem> lstArts = new List <ListItem>();

            foreach (XPathNavigator objXmlMetamagic in _objXmlDocument.Select(_strBaseXPath + '[' + _strXPathFilter + CommonFunctions.GenerateSearchXPath(txtSearch.Text) + ']'))
            {
                string strId = objXmlMetamagic.SelectSingleNode("id")?.Value;
                if (!string.IsNullOrEmpty(strId))
                {
                    if (!chkLimitList.Checked || objXmlMetamagic.RequirementsMet(_objCharacter))
                    {
                        lstArts.Add(new ListItem(objXmlMetamagic.SelectSingleNode("id")?.Value, objXmlMetamagic.SelectSingleNode("translate")?.Value ?? objXmlMetamagic.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown")));
                    }
                }
            }
            lstArts.Sort(CompareListItems.CompareNames);
            string strOldSelected = lstArt.SelectedValue?.ToString();

            _blnLoading = true;
            lstArt.BeginUpdate();
            lstArt.ValueMember   = "Value";
            lstArt.DisplayMember = "Name";
            lstArt.DataSource    = lstArts;
            _blnLoading          = false;
            if (!string.IsNullOrEmpty(strOldSelected))
            {
                lstArt.SelectedValue = strOldSelected;
            }
            else
            {
                lstArt.SelectedIndex = -1;
            }
            lstArt.EndUpdate();
        }
        /// <summary>
        /// Build the list of available weapon accessories.
        /// </summary>
        private void BuildAccessoryList()
        {
            List <ListItem> lstAccessories = new List <ListItem>();

            // Populate the Accessory list.
            StringBuilder strMount = new StringBuilder("contains(mount, \"Internal\") or contains(mount, \"None\") or mount = \"\"");

            foreach (string strAllowedMount in _lstAllowedMounts)
            {
                if (!string.IsNullOrEmpty(strAllowedMount))
                {
                    strMount.Append(" or contains(mount, \"" + strAllowedMount + "\")");
                }
            }
            strMount.Append(CommonFunctions.GenerateSearchXPath(txtSearch.Text));
            XPathNavigator xmlParentWeaponDataNode = _xmlBaseChummerNode.SelectSingleNode("weapons/weapon[id = \"" + _objParentWeapon.SourceID.ToString("D") + "\"]");

            foreach (XPathNavigator objXmlAccessory in _xmlBaseChummerNode.Select("accessories/accessory[(" + strMount + ") and (" + _objCharacter.Options.BookXPath() + ")]"))
            {
                string strId = objXmlAccessory.SelectSingleNode("id")?.Value;
                if (string.IsNullOrEmpty(strId))
                {
                    continue;
                }

                XPathNavigator xmlExtraMountNode = objXmlAccessory.SelectSingleNode("extramount");
                if (xmlExtraMountNode != null)
                {
                    if (_lstAllowedMounts.Count > 1)
                    {
                        foreach (string strItem in xmlExtraMountNode.Value.Split('/'))
                        {
                            if (!string.IsNullOrEmpty(strItem) && _lstAllowedMounts.All(strAllowedMount => strAllowedMount != strItem))
                            {
                                goto NextItem;
                            }
                        }
                    }
                }

                XPathNavigator xmlTestNode = objXmlAccessory.SelectSingleNode("forbidden/weapondetails");
                if (xmlTestNode != null)
                {
                    // Assumes topmost parent is an AND node
                    if (xmlParentWeaponDataNode.ProcessFilterOperationNode(xmlTestNode, false))
                    {
                        continue;
                    }
                }
                xmlTestNode = objXmlAccessory.SelectSingleNode("required/weapondetails");
                if (xmlTestNode != null)
                {
                    // Assumes topmost parent is an AND node
                    if (!xmlParentWeaponDataNode.ProcessFilterOperationNode(xmlTestNode, false))
                    {
                        continue;
                    }
                }

                xmlTestNode = objXmlAccessory.SelectSingleNode("forbidden/oneof");
                XPathNodeIterator objXmlForbiddenList = xmlTestNode?.Select("accessory");
                if (objXmlForbiddenList?.Count > 0)
                {
                    //Add to set for O(N log M) runtime instead of O(N * M)

                    HashSet <string> objForbiddenAccessory = new HashSet <string>();
                    foreach (XPathNavigator node in objXmlForbiddenList)
                    {
                        objForbiddenAccessory.Add(node.Value);
                    }

                    if (_objParentWeapon.WeaponAccessories.Any(objAccessory =>
                                                               objForbiddenAccessory.Contains(objAccessory.Name)))
                    {
                        continue;
                    }
                }

                xmlTestNode = objXmlAccessory.SelectSingleNode("required/oneof");
                if (xmlTestNode != null)
                {
                    XPathNodeIterator objXmlRequiredList = xmlTestNode.Select("accessory");
                    if (objXmlRequiredList.Count > 0)
                    {
                        //Add to set for O(N log M) runtime instead of O(N * M)

                        HashSet <string> objRequiredAccessory = new HashSet <string>();
                        foreach (XPathNavigator node in objXmlRequiredList)
                        {
                            objRequiredAccessory.Add(node.Value);
                        }

                        if (!_objParentWeapon.WeaponAccessories.Any(objAccessory =>
                                                                    objRequiredAccessory.Contains(objAccessory.Name)))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        continue;
                    }
                }

                decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m);
                if (_blnIsParentWeaponBlackMarketAllowed)
                {
                    decCostMultiplier *= 0.9m;
                }
                if ((!chkHideOverAvailLimit.Checked || SelectionShared.CheckAvailRestriction(objXmlAccessory, _objCharacter) &&
                     (chkFreeItem.Checked || !chkShowOnlyAffordItems.Checked ||
                      SelectionShared.CheckNuyenRestriction(objXmlAccessory, _objCharacter.Nuyen, decCostMultiplier))))
                {
                    lstAccessories.Add(new ListItem(strId, objXmlAccessory.SelectSingleNode("translate")?.Value ?? objXmlAccessory.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown", GlobalOptions.Language)));
                }
                NextItem :;
            }

            lstAccessories.Sort(CompareListItems.CompareNames);
            string strOldSelected = lstAccessory.SelectedValue?.ToString();

            _blnLoading = true;
            lstAccessory.BeginUpdate();
            lstAccessory.ValueMember   = "Value";
            lstAccessory.DisplayMember = "Name";
            lstAccessory.DataSource    = lstAccessories;
            _blnLoading = false;
            if (!string.IsNullOrEmpty(strOldSelected))
            {
                lstAccessory.SelectedValue = strOldSelected;
            }
            else
            {
                lstAccessory.SelectedIndex = -1;
            }
            lstAccessory.EndUpdate();
        }
示例#4
0
        /// <summary>
        /// Build the list of Metamagics.
        /// </summary>
        private void BuildMetamagicList()
        {
            string strFilter = _objCharacter.Options.BookXPath();

            // If the character has MAG enabled, filter the list based on Adept/Magician availability.
            if (_objCharacter.MAGEnabled)
            {
                bool blnIsMagician = _objCharacter.MagicianEnabled;
                if (blnIsMagician != _objCharacter.AdeptEnabled)
                {
                    if (blnIsMagician)
                    {
                        strFilter = "magician = 'True' and (" + strFilter + ')';
                    }
                    else
                    {
                        strFilter = "adept = 'True' and (" + strFilter + ')';
                    }
                }
            }

            strFilter += CommonFunctions.GenerateSearchXPath(txtSearch.Text);
            List <ListItem> lstMetamagics = new List <ListItem>();

            using (XmlNodeList objXmlMetamagicList = _objXmlDocument.SelectNodes(_strRootXPath + '[' + strFilter + ']'))
                if (objXmlMetamagicList?.Count > 0)
                {
                    foreach (XmlNode objXmlMetamagic in objXmlMetamagicList)
                    {
                        string strId = objXmlMetamagic["id"]?.InnerText;
                        if (!string.IsNullOrEmpty(strId))
                        {
                            if (_lstMetamagicLimits.Count > 0 && (_objMode == Mode.Metamagic && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic["name"]?.InnerText && (item.Value == -1 || item.Value == _objCharacter.InitiateGrade)) ||
                                                                  _objMode == Mode.Echo && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic["name"]?.InnerText && (item.Value == -1 || item.Value == _objCharacter.SubmersionGrade))))
                            {
                                continue;
                            }
                            if (!chkLimitList.Checked || objXmlMetamagic.CreateNavigator().RequirementsMet(_objCharacter))
                            {
                                lstMetamagics.Add(new ListItem(strId,
                                                               objXmlMetamagic["translate"]?.InnerText ?? objXmlMetamagic["name"]?.InnerText ??
                                                               LanguageManager.GetString("String_Unknown")));
                            }
                        }
                    }
                }
            lstMetamagics.Sort(CompareListItems.CompareNames);
            string strOldSelected = lstMetamagic.SelectedValue?.ToString();

            _blnLoading = true;
            lstMetamagic.BeginUpdate();
            lstMetamagic.ValueMember   = nameof(ListItem.Value);
            lstMetamagic.DisplayMember = nameof(ListItem.Name);
            lstMetamagic.DataSource    = lstMetamagics;
            _blnLoading = false;
            if (!string.IsNullOrEmpty(strOldSelected))
            {
                lstMetamagic.SelectedValue = strOldSelected;
            }
            else
            {
                lstMetamagic.SelectedIndex = -1;
            }
            lstMetamagic.EndUpdate();
        }
        /// <summary>
        /// Build the list of available weapon accessories.
        /// </summary>
        private void RefreshList()
        {
            List <ListItem> lstAccessories = new List <ListItem>();

            // Populate the Accessory list.
            StringBuilder sbdFilter = new StringBuilder("(" + _objCharacter.Options.BookXPath() + ") and (contains(mount, \"Internal\") or contains(mount, \"None\") or mount = \"\"");

            foreach (string strAllowedMount in _lstAllowedMounts.Where(strAllowedMount => !string.IsNullOrEmpty(strAllowedMount)))
            {
                sbdFilter.Append(" or contains(mount, " + strAllowedMount.CleanXPath() + ")");
            }
            sbdFilter.Append(')');
            if (!string.IsNullOrEmpty(txtSearch.Text))
            {
                sbdFilter.Append(" and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text));
            }
            int intOverLimit = 0;

            foreach (XPathNavigator objXmlAccessory in _xmlBaseChummerNode.Select("accessories/accessory[" + sbdFilter + "]"))
            {
                string strId = objXmlAccessory.SelectSingleNode("id")?.Value;
                if (string.IsNullOrEmpty(strId))
                {
                    continue;
                }
                if (!_objParentWeapon.CheckAccessoryRequirements(objXmlAccessory))
                {
                    continue;
                }

                decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m);
                if (_blnIsParentWeaponBlackMarketAllowed)
                {
                    decCostMultiplier *= 0.9m;
                }
                if ((!chkHideOverAvailLimit.Checked || objXmlAccessory.CheckAvailRestriction(_objCharacter) &&
                     (chkFreeItem.Checked || !chkShowOnlyAffordItems.Checked ||
                      objXmlAccessory.CheckNuyenRestriction(_objCharacter.Nuyen, decCostMultiplier))))
                {
                    lstAccessories.Add(new ListItem(strId,
                                                    objXmlAccessory.SelectSingleNode("translate")?.Value ??
                                                    objXmlAccessory.SelectSingleNode("name")?.Value ??
                                                    LanguageManager.GetString("String_Unknown")));
                }
                else
                {
                    ++intOverLimit;
                }
            }

            lstAccessories.Sort(CompareListItems.CompareNames);
            if (intOverLimit > 0)
            {
                // Add after sort so that it's always at the end
                lstAccessories.Add(new ListItem(string.Empty, string.Format(GlobalOptions.CultureInfo, LanguageManager.GetString("String_RestrictedItemsHidden"),
                                                                            intOverLimit)));
            }
            string strOldSelected = lstAccessory.SelectedValue?.ToString();

            _blnLoading = true;
            lstAccessory.BeginUpdate();
            lstAccessory.ValueMember   = nameof(ListItem.Value);
            lstAccessory.DisplayMember = nameof(ListItem.Name);
            lstAccessory.DataSource    = lstAccessories;
            _blnLoading = false;
            if (!string.IsNullOrEmpty(strOldSelected))
            {
                lstAccessory.SelectedValue = strOldSelected;
            }
            else
            {
                lstAccessory.SelectedIndex = -1;
            }
            lstAccessory.EndUpdate();
        }
        private void cboCategory_SelectedIndexChanged(object sender, EventArgs e)
        {
            trePowers.Nodes.Clear();

            string strCategory = cboCategory.SelectedValue?.ToString();

            List <string> lstPowerWhitelist = new List <string>();

            // If the Critter is only allowed certain Powers, display only those.
            XPathNavigator xmlOptionalPowers = _xmlMetatypeDataNode.SelectSingleNode("optionalpowers");

            if (xmlOptionalPowers != null)
            {
                foreach (XPathNavigator xmlNode in xmlOptionalPowers.Select("power"))
                {
                    lstPowerWhitelist.Add(xmlNode.Value);
                }

                // Determine if the Critter has a physical presence Power (Materialization, Possession, or Inhabitation).
                bool blnPhysicalPresence = _objCharacter.CritterPowers.Any(x => x.Name == "Materialization" || x.Name == "Possession" || x.Name == "Inhabitation");

                // Add any Critter Powers the Critter comes with that have been manually deleted so they can be re-added.
                foreach (XPathNavigator objXmlCritterPower in _xmlMetatypeDataNode.Select("powers/power"))
                {
                    bool blnAddPower = true;
                    // Make sure the Critter doesn't already have the Power.
                    foreach (CritterPower objCheckPower in _objCharacter.CritterPowers)
                    {
                        if (objCheckPower.Name == objXmlCritterPower.Value)
                        {
                            blnAddPower = false;
                            break;
                        }
                        if ((objCheckPower.Name == "Materialization" || objCheckPower.Name == "Possession" || objCheckPower.Name == "Inhabitation") && blnPhysicalPresence)
                        {
                            blnAddPower = false;
                            break;
                        }
                    }

                    if (blnAddPower)
                    {
                        lstPowerWhitelist.Add(objXmlCritterPower.Value);

                        // If Manifestation is one of the Powers, also include Inhabitation and Possess if they're not already in the list.
                        if (!blnPhysicalPresence)
                        {
                            if (objXmlCritterPower.Value == "Materialization")
                            {
                                bool blnFoundPossession   = false;
                                bool blnFoundInhabitation = false;
                                foreach (string strCheckPower in lstPowerWhitelist)
                                {
                                    if (strCheckPower == "Possession")
                                    {
                                        blnFoundPossession = true;
                                    }
                                    else if (strCheckPower == "Inhabitation")
                                    {
                                        blnFoundInhabitation = true;
                                    }
                                    if (blnFoundInhabitation && blnFoundPossession)
                                    {
                                        break;
                                    }
                                }
                                if (!blnFoundPossession)
                                {
                                    lstPowerWhitelist.Add("Possession");
                                }
                                if (!blnFoundInhabitation)
                                {
                                    lstPowerWhitelist.Add("Inhabitation");
                                }
                            }
                        }
                    }
                }
            }

            string strFilter = "(" + _objCharacter.Options.BookXPath() + ')';

            if (!string.IsNullOrEmpty(strCategory) && strCategory != "Show All")
            {
                strFilter += " and (contains(category,\"" + strCategory + "\"))";
            }
            else
            {
                bool          blnHasToxic       = false;
                StringBuilder objCategoryFilter = new StringBuilder();
                foreach (string strItem in _lstCategory.Select(x => x.Value))
                {
                    if (!string.IsNullOrEmpty(strItem))
                    {
                        objCategoryFilter.Append("(contains(category,\"" + strItem + "\")) or ");
                        if (strItem == "Toxic Critter Powers")
                        {
                            objCategoryFilter.Append("toxic = \"True\" or ");
                            blnHasToxic = true;
                        }
                    }
                }
                if (objCategoryFilter.Length > 0)
                {
                    strFilter += " and (" + objCategoryFilter.ToString().TrimEndOnce(" or ") + ')';
                }
                if (!blnHasToxic)
                {
                    strFilter += " and (not(toxic) or toxic != \"True\")";
                }
            }

            strFilter += CommonFunctions.GenerateSearchXPath(txtSearch.Text);
            foreach (XPathNavigator objXmlPower in _xmlBaseCritterPowerDataNode.Select("powers/power[" + strFilter + "]"))
            {
                string strPowerName = objXmlPower.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown");
                if (!lstPowerWhitelist.Contains(strPowerName) && lstPowerWhitelist.Count != 0)
                {
                    continue;
                }
                if (!objXmlPower.RequirementsMet(_objCharacter, string.Empty, string.Empty))
                {
                    continue;
                }
                TreeNode objNode = new TreeNode
                {
                    Tag  = objXmlPower.SelectSingleNode("id")?.Value ?? string.Empty,
                    Text = objXmlPower.SelectSingleNode("translate")?.Value ?? strPowerName
                };
                trePowers.Nodes.Add(objNode);
            }
            trePowers.Sort();
        }
示例#7
0
        /// <summary>
        /// Build the list of Metamagics.
        /// </summary>
        private void BuildMetamagicList()
        {
            string strFilter = '(' + _objCharacter.Options.BookXPath() + ')';

            // If the character has MAG enabled, filter the list based on Adept/Magician availability.
            if (_objCharacter.MAGEnabled)
            {
                bool blnIsMagician = _objCharacter.MagicianEnabled;
                if (blnIsMagician != _objCharacter.AdeptEnabled)
                {
                    if (blnIsMagician)
                    {
                        strFilter += "and magician = " + bool.TrueString.CleanXPath();
                    }
                    else
                    {
                        strFilter += "and adept = " + bool.TrueString.CleanXPath();
                    }
                }
            }
            if (!string.IsNullOrEmpty(txtSearch.Text))
            {
                strFilter += " and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text);
            }
            List <ListItem> lstMetamagics = new List <ListItem>();

            foreach (XPathNavigator objXmlMetamagic in _objXmlDocument.Select(_strRootXPath + '[' + strFilter + ']'))
            {
                string strId = objXmlMetamagic.SelectSingleNode("id")?.Value;
                if (!string.IsNullOrEmpty(strId))
                {
                    if (_lstMetamagicLimits.Count > 0 && (_objMode == Mode.Metamagic && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic.SelectSingleNode("name")?.Value&& (item.Value == -1 || item.Value == _objCharacter.InitiateGrade)) ||
                                                          _objMode == Mode.Echo && !_lstMetamagicLimits.Any(item => item.Key == objXmlMetamagic.SelectSingleNode("name")?.Value&& (item.Value == -1 || item.Value == _objCharacter.SubmersionGrade))))
                    {
                        continue;
                    }
                    if (!chkLimitList.Checked || objXmlMetamagic.CreateNavigator().RequirementsMet(_objCharacter))
                    {
                        lstMetamagics.Add(new ListItem(strId,
                                                       objXmlMetamagic.SelectSingleNode("translate")?.Value ?? objXmlMetamagic.SelectSingleNode("name")?.Value ??
                                                       LanguageManager.GetString("String_Unknown")));
                    }
                }
            }
            lstMetamagics.Sort(CompareListItems.CompareNames);
            string strOldSelected = lstMetamagic.SelectedValue?.ToString();

            _blnLoading = true;
            lstMetamagic.BeginUpdate();
            lstMetamagic.PopulateWithListItems(lstMetamagics);
            _blnLoading = false;
            if (!string.IsNullOrEmpty(strOldSelected))
            {
                lstMetamagic.SelectedValue = strOldSelected;
            }
            else
            {
                lstMetamagic.SelectedIndex = -1;
            }
            lstMetamagic.EndUpdate();
        }
示例#8
0
        /// <summary>
        /// Build the list of Metamagics.
        /// </summary>
        private async ValueTask BuildMetamagicList()
        {
            string strFilter = '(' + _objCharacter.Settings.BookXPath() + ')';

            // If the character has MAG enabled, filter the list based on Adept/Magician availability.
            if (_objCharacter.MAGEnabled)
            {
                bool blnIsMagician = _objCharacter.MagicianEnabled;
                if (blnIsMagician != _objCharacter.AdeptEnabled)
                {
                    if (blnIsMagician)
                    {
                        strFilter += "and magician = " + bool.TrueString.CleanXPath();
                    }
                    else
                    {
                        strFilter += "and adept = " + bool.TrueString.CleanXPath();
                    }
                }
            }

            if (_lstMetamagicLimits.Count > 0)
            {
                strFilter += " and (";
                using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool, out StringBuilder sbdFilter))
                {
                    foreach (string strMetamagic in _lstMetamagicLimits)
                    {
                        sbdFilter.Append("name = ").Append(strMetamagic.CleanXPath()).Append(" or ");
                    }
                    sbdFilter.Length -= 4;
                    strFilter        += sbdFilter.ToString() + ')';
                }
            }

            string strSearch = await txtSearch.DoThreadSafeFuncAsync(x => x.Text);

            if (!string.IsNullOrEmpty(strSearch))
            {
                strFilter += " and " + CommonFunctions.GenerateSearchXPath(strSearch);
            }
            using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool, out List <ListItem> lstMetamagics))
            {
                foreach (XPathNavigator objXmlMetamagic in
                         _objXmlDocument.Select(_strRootXPath + '[' + strFilter + ']'))
                {
                    string strId = (await objXmlMetamagic.SelectSingleNodeAndCacheExpressionAsync("id"))?.Value;
                    if (string.IsNullOrEmpty(strId))
                    {
                        continue;
                    }
                    if (!chkLimitList.Checked || objXmlMetamagic.CreateNavigator().RequirementsMet(_objCharacter))
                    {
                        lstMetamagics.Add(new ListItem(strId,
                                                       (await objXmlMetamagic.SelectSingleNodeAndCacheExpressionAsync("translate"))
                                                       ?.Value ?? (await objXmlMetamagic
                                                                   .SelectSingleNodeAndCacheExpressionAsync("name"))?.Value ??
                                                       await LanguageManager.GetStringAsync("String_Unknown")));
                    }
                }

                lstMetamagics.Sort(CompareListItems.CompareNames);
                string strOldSelected = await lstMetamagic.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

                _blnLoading = true;
                await lstMetamagic.PopulateWithListItemsAsync(lstMetamagics);

                _blnLoading = false;
                await lstMetamagic.DoThreadSafeAsync(x =>
                {
                    if (!string.IsNullOrEmpty(strOldSelected))
                    {
                        x.SelectedValue = strOldSelected;
                    }
                    else
                    {
                        x.SelectedIndex = -1;
                    }
                });
            }
        }
        /// <summary>
        /// Build the list of available weapon accessories.
        /// </summary>
        private async ValueTask RefreshList()
        {
            using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool, out List <ListItem> lstAccessories))
            {
                // Populate the Accessory list.
                string strFilter = string.Empty;
                using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool, out StringBuilder sbdFilter))
                {
                    sbdFilter.Append('(').Append(_objCharacter.Settings.BookXPath())
                    .Append(
                        ") and (contains(mount, \"Internal\") or contains(mount, \"None\") or mount = \"\"");
                    foreach (string strAllowedMount in _lstAllowedMounts.Where(
                                 strAllowedMount => !string.IsNullOrEmpty(strAllowedMount)))
                    {
                        sbdFilter.Append(" or contains(mount, ").Append(strAllowedMount.CleanXPath()).Append(')');
                    }

                    sbdFilter.Append(')');
                    string strSearch = await txtSearch.DoThreadSafeFuncAsync(x => x.Text);

                    if (!string.IsNullOrEmpty(strSearch))
                    {
                        sbdFilter.Append(" and ").Append(CommonFunctions.GenerateSearchXPath(strSearch));
                    }

                    if (sbdFilter.Length > 0)
                    {
                        strFilter = '[' + sbdFilter.ToString() + ']';
                    }
                }

                int  intOverLimit          = 0;
                bool blnHideOverAvailLimit = await chkHideOverAvailLimit.DoThreadSafeFuncAsync(x => x.Checked);

                bool blnShowOnlyAffordItems = await chkShowOnlyAffordItems.DoThreadSafeFuncAsync(x => x.Checked);

                bool blnFreeItem = await chkFreeItem.DoThreadSafeFuncAsync(x => x.Checked);

                decimal decBaseCostMultiplier = 1 + (await nudMarkup.DoThreadSafeFuncAsync(x => x.Value) / 100.0m);
                foreach (XPathNavigator objXmlAccessory in _xmlBaseChummerNode.Select(
                             "accessories/accessory" + strFilter))
                {
                    string strId = (await objXmlAccessory.SelectSingleNodeAndCacheExpressionAsync("id"))?.Value;
                    if (string.IsNullOrEmpty(strId))
                    {
                        continue;
                    }
                    if (!_objParentWeapon.CheckAccessoryRequirements(objXmlAccessory))
                    {
                        continue;
                    }

                    decimal decCostMultiplier = decBaseCostMultiplier;
                    if (_blnIsParentWeaponBlackMarketAllowed)
                    {
                        decCostMultiplier *= 0.9m;
                    }
                    if (!blnHideOverAvailLimit || objXmlAccessory.CheckAvailRestriction(_objCharacter) &&
                        (blnFreeItem || !blnShowOnlyAffordItems ||
                         objXmlAccessory.CheckNuyenRestriction(
                             _objCharacter.Nuyen, decCostMultiplier)))
                    {
                        lstAccessories.Add(new ListItem(
                                               strId,
                                               (await objXmlAccessory.SelectSingleNodeAndCacheExpressionAsync("translate"))?.Value
                                               ?? (await objXmlAccessory.SelectSingleNodeAndCacheExpressionAsync("name"))?.Value
                                               ?? await LanguageManager.GetStringAsync("String_Unknown")));
                    }
                    else
                    {
                        ++intOverLimit;
                    }
                }

                lstAccessories.Sort(CompareListItems.CompareNames);
                if (intOverLimit > 0)
                {
                    // Add after sort so that it's always at the end
                    lstAccessories.Add(new ListItem(string.Empty, string.Format(
                                                        GlobalSettings.CultureInfo,
                                                        await LanguageManager.GetStringAsync("String_RestrictedItemsHidden"),
                                                        intOverLimit)));
                }

                string strOldSelected = await lstAccessory.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

                _blnLoading = true;
                await lstAccessory.PopulateWithListItemsAsync(lstAccessories);

                _blnLoading = false;
                await lstAccessory.DoThreadSafeAsync(x =>
                {
                    if (!string.IsNullOrEmpty(strOldSelected))
                    {
                        x.SelectedValue = strOldSelected;
                    }
                    else
                    {
                        x.SelectedIndex = -1;
                    }
                });
            }
        }
示例#10
0
        private void BuildComplexFormList()
        {
            if (_blnLoading)
            {
                return;
            }

            string strFilter = '(' + _objCharacter.Options.BookXPath() + ')';

            if (!string.IsNullOrEmpty(txtSearch.Text))
            {
                strFilter += " and " + CommonFunctions.GenerateSearchXPath(txtSearch.Text);
            }
            // Populate the Complex Form list.
            List <ListItem> lstComplexFormItems = new List <ListItem>();

            foreach (XPathNavigator xmlComplexForm in _xmlBaseComplexFormsNode.Select("complexform[" + strFilter + ']'))
            {
                string strId = xmlComplexForm.SelectSingleNode("id")?.Value;
                if (string.IsNullOrEmpty(strId))
                {
                    continue;
                }

                if (!xmlComplexForm.RequirementsMet(_objCharacter))
                {
                    continue;
                }

                string strName = xmlComplexForm.SelectSingleNode("name")?.Value ?? LanguageManager.GetString("String_Unknown");
                // If this is a Sprite with Optional Complex Forms, see if this Complex Form is allowed.
                if (_xmlOptionalComplexFormNode?.SelectSingleNode("complexform") != null)
                {
                    if (_xmlOptionalComplexFormNode.SelectSingleNode("complexform[text() = \"" + strName + "\"]") == null)
                    {
                        continue;
                    }
                }

                lstComplexFormItems.Add(new ListItem(strId, xmlComplexForm.SelectSingleNode("translate")?.Value ?? strName));
            }

            lstComplexFormItems.Sort(CompareListItems.CompareNames);
            _blnLoading = true;
            string strOldSelected = lstComplexForms.SelectedValue?.ToString();

            lstComplexForms.BeginUpdate();
            lstComplexForms.ValueMember   = nameof(ListItem.Value);
            lstComplexForms.DisplayMember = nameof(ListItem.Name);
            lstComplexForms.DataSource    = lstComplexFormItems;
            _blnLoading = false;
            if (!string.IsNullOrEmpty(strOldSelected))
            {
                lstComplexForms.SelectedValue = strOldSelected;
            }
            else
            {
                lstComplexForms.SelectedIndex = -1;
            }
            lstComplexForms.EndUpdate();
        }