Пример #1
0
        private async void treQualities_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strSource         = string.Empty;
            string strPage           = string.Empty;
            string strSourceIDString = treQualities.SelectedNode?.Tag.ToString();

            if (!string.IsNullOrEmpty(strSourceIDString))
            {
                XmlNode objXmlQuality = _objXmlDocument.SelectSingleNode("/chummer/qualities/quality[id = " + strSourceIDString.CleanXPath() + ']');
                if (objXmlQuality != null)
                {
                    strSource = objXmlQuality["source"]?.InnerText ?? string.Empty;
                    strPage   = objXmlQuality["altpage"]?.InnerText ?? objXmlQuality["page"]?.InnerText ?? string.Empty;
                }
            }

            if (!string.IsNullOrEmpty(strSource) && !string.IsNullOrEmpty(strPage))
            {
                SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                 GlobalSettings.CultureInfo, _objCharacter);

                lblSource.Text = objSource.ToString();
                await lblSource.SetToolTipAsync(objSource.LanguageBookTooltip);
            }
            else
            {
                lblSource.Text = string.Empty;
                await lblSource.SetToolTipAsync(string.Empty);
            }

            lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);
        }
Пример #2
0
        private async void lstMetamagic_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            string strSelectedId = lstMetamagic.SelectedValue?.ToString();

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                // Retireve the information for the selected piece of Cyberware.
                XPathNavigator objXmlMetamagic = _objXmlDocument.SelectSingleNode(_strRootXPath + "[id = " + strSelectedId.CleanXPath() + ']');

                if (objXmlMetamagic != null)
                {
                    string       strSource       = objXmlMetamagic.SelectSingleNode("source")?.Value;
                    string       strPage         = (await objXmlMetamagic.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? objXmlMetamagic.SelectSingleNode("page")?.Value;
                    SourceString objSourceString = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language, GlobalSettings.CultureInfo, _objCharacter);

                    await objSourceString.SetControlAsync(lblSource);

                    lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);
                    tlpRight.Visible       = true;
                }
                else
                {
                    tlpRight.Visible = false;
                }
            }
            else
            {
                tlpRight.Visible = false;
            }
        }
Пример #3
0
        private async void lstQualities_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            _blnLoading = true;

            XPathNavigator xmlQuality         = null;
            string         strSelectedQuality = lstQualities.SelectedValue?.ToString();

            if (!string.IsNullOrEmpty(strSelectedQuality))
            {
                xmlQuality = _xmlBaseQualityDataNode.SelectSingleNode("qualities/quality[id = " + strSelectedQuality.CleanXPath() + ']');
            }

            if (xmlQuality != null)
            {
                nudRating.ValueAsInt = nudRating.MinimumAsInt;
                int intMaxRating = int.MaxValue;
                if (xmlQuality.TryGetInt32FieldQuickly("limit", ref intMaxRating) && xmlQuality.SelectSingleNode("nolevels") == null)
                {
                    lblRatingNALabel.Visible = false;
                    nudRating.MaximumAsInt   = intMaxRating;
                    nudRating.Visible        = true;
                }
                else
                {
                    lblRatingNALabel.Visible = true;
                    nudRating.MaximumAsInt   = 1;
                    nudRating.ValueAsInt     = 1;
                    nudRating.Visible        = false;
                }

                await UpdateCostLabel(xmlQuality);

                string strSource = xmlQuality.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                string strPage = (await xmlQuality.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? xmlQuality.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                 GlobalSettings.CultureInfo, _objCharacter);

                lblSource.Text = objSource.ToString();
                await lblSource.SetToolTipAsync(objSource.LanguageBookTooltip);

                lblSourceLabel.Visible = lblSource.Visible = !string.IsNullOrEmpty(lblSource.Text);
                tlpRight.Visible       = true;
            }
            else
            {
                tlpRight.Visible = false;
            }

            _blnLoading = false;
        }
Пример #4
0
        private async void lstPowers_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            string strSelectedId = await lstPowers.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

            XPathNavigator objXmlPower = null;

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                objXmlPower = _xmlBasePowerDataNode.SelectSingleNode("powers/power[id = " + strSelectedId.CleanXPath() + ']');
            }

            if (objXmlPower != null)
            {
                string strSpace = await LanguageManager.GetStringAsync("String_Space");

                // Display the information for the selected Power.
                string strPowerPointsText = objXmlPower.SelectSingleNode("points")?.Value ?? string.Empty;
                if (objXmlPower.SelectSingleNode("levels")?.Value == bool.TrueString)
                {
                    strPowerPointsText += strSpace + '/' + strSpace + await LanguageManager.GetStringAsync("Label_Power_Level");
                }
                string strExtrPointCost = objXmlPower.SelectSingleNode("extrapointcost")?.Value;
                if (!string.IsNullOrEmpty(strExtrPointCost))
                {
                    strPowerPointsText = strExtrPointCost + strSpace + '+' + strSpace + strPowerPointsText;
                }
                await lblPowerPoints.DoThreadSafeAsync(x => x.Text = strPowerPointsText);

                string strSource = objXmlPower.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                string strPage = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? objXmlPower.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                 GlobalSettings.CultureInfo, _objCharacter);

                await objSource.SetControlAsync(lblSource);

                await lblPowerPointsLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strPowerPointsText));

                await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(objSource.ToString()));

                await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
            }
            else
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);
            }
        }
Пример #5
0
        private async void lstTechniques_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            string strSelectedId = await lstTechniques.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                XPathNavigator xmlTechnique = _xmlBaseChummerNode.SelectSingleNode("/chummer/techniques/technique[id = " + strSelectedId.CleanXPath() + ']');

                if (xmlTechnique != null)
                {
                    string strSource = xmlTechnique.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                    string strPage = (await xmlTechnique.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? xmlTechnique.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                    SourceString objSourceString = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language, GlobalSettings.CultureInfo, _objCharacter);

                    await objSourceString.SetControlAsync(lblSource);

                    string strSourceText = lblSource.ToString();
                    await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strSourceText));

                    await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
                }
                else
                {
                    await tlpRight.DoThreadSafeAsync(x => x.Visible = false);
                }
            }
            else
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);
            }
        }
Пример #6
0
        private async void lstArt_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            string strSelected = await lstArt.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

            if (string.IsNullOrEmpty(strSelected))
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);

                return;
            }

            // Retrieve the information for the selected art
            XPathNavigator objXmlMetamagic = _objXmlDocument.SelectSingleNode(_strBaseXPath + "[id = " + strSelected.CleanXPath() + ']');

            if (objXmlMetamagic == null)
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);

                return;
            }

            string strSource = objXmlMetamagic.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

            string strPage = (await objXmlMetamagic.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? objXmlMetamagic.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

            SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                             GlobalSettings.CultureInfo, _objCharacter);

            await objSource.SetControlAsync(lblSource);

            await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
        }
Пример #7
0
        /// <summary>
        /// Builds the list of Armors to render in the active tab.
        /// </summary>
        /// <param name="objXmlArmorList">XmlNodeList of Armors to render.</param>
        private async ValueTask BuildArmorList(XmlNodeList objXmlArmorList)
        {
            decimal decBaseMarkup         = 1 + (await nudMarkup.DoThreadSafeFuncAsync(x => x.Value) / 100.0m);
            bool    blnHideOverAvailLimit = await chkHideOverAvailLimit.DoThreadSafeFuncAsync(x => x.Checked);

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

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

            switch (await tabControl.DoThreadSafeFuncAsync(x => x.SelectedIndex))
            {
            case 1:
                DataTable tabArmor = new DataTable("armor");
                tabArmor.Columns.Add("ArmorGuid");
                tabArmor.Columns.Add("ArmorName");
                tabArmor.Columns.Add("Armor");
                tabArmor.Columns["Armor"].DataType = typeof(int);
                tabArmor.Columns.Add("Capacity");
                tabArmor.Columns["Capacity"].DataType = typeof(decimal);
                tabArmor.Columns.Add("Avail");
                tabArmor.Columns["Avail"].DataType = typeof(AvailabilityValue);
                tabArmor.Columns.Add("Special");
                tabArmor.Columns.Add("Source");
                tabArmor.Columns["Source"].DataType = typeof(SourceString);
                tabArmor.Columns.Add("Cost");
                tabArmor.Columns["Cost"].DataType = typeof(NuyenString);

                // Populate the Armor list.
                foreach (XmlNode objXmlArmor in objXmlArmorList)
                {
                    decimal decCostMultiplier = decBaseMarkup;
                    if (_setBlackMarketMaps.Contains(objXmlArmor["category"]?.InnerText))
                    {
                        decCostMultiplier *= 0.9m;
                    }
                    if (!blnHideOverAvailLimit ||
                        SelectionShared.CheckAvailRestriction(objXmlArmor, _objCharacter) && (blnFreeItem ||
                                                                                              !blnShowOnlyAffordItems ||
                                                                                              SelectionShared.CheckNuyenRestriction(
                                                                                                  objXmlArmor, _objCharacter.Nuyen, decCostMultiplier)))
                    {
                        using (Armor objArmor = new Armor(_objCharacter))
                        {
                            List <Weapon> lstWeapons = new List <Weapon>(1);
                            objArmor.Create(objXmlArmor, 0, lstWeapons, true, true, true);

                            string  strArmorGuid = objArmor.SourceIDString;
                            string  strArmorName = objArmor.CurrentDisplayName;
                            int     intArmor     = objArmor.TotalArmor;
                            decimal decCapacity
                                = Convert.ToDecimal(objArmor.CalculatedCapacity(GlobalSettings.InvariantCultureInfo), GlobalSettings.InvariantCultureInfo);
                            AvailabilityValue objAvail = objArmor.TotalAvailTuple();
                            using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool,
                                                                           out StringBuilder sbdAccessories))
                            {
                                foreach (ArmorMod objMod in objArmor.ArmorMods)
                                {
                                    sbdAccessories.AppendLine(objMod.CurrentDisplayName);
                                }

                                foreach (Gear objGear in objArmor.GearChildren)
                                {
                                    sbdAccessories.AppendLine(objGear.CurrentDisplayName);
                                }

                                if (sbdAccessories.Length > 0)
                                {
                                    sbdAccessories.Length -= Environment.NewLine.Length;
                                }
                                SourceString strSource = await SourceString.GetSourceStringAsync(
                                    objArmor.Source, await objArmor.DisplayPageAsync(GlobalSettings.Language),
                                    GlobalSettings.Language, GlobalSettings.CultureInfo, _objCharacter);

                                NuyenString strCost = new NuyenString(objArmor.DisplayCost(out decimal _, false));

                                tabArmor.Rows.Add(strArmorGuid, strArmorName, intArmor, decCapacity, objAvail,
                                                  sbdAccessories.ToString(), strSource, strCost);
                            }
                        }
                    }
                }

                DataSet set = new DataSet("armor");
                set.Tables.Add(tabArmor);

                dgvArmor.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dgvArmor.DataSource       = set;
                dgvArmor.DataMember       = "armor";
                break;

            default:
                using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool,
                                                                  out List <ListItem> lstArmors))
                {
                    int    intOverLimit = 0;
                    string strSpace     = await LanguageManager.GetStringAsync("String_Space");

                    foreach (XmlNode objXmlArmor in objXmlArmorList)
                    {
                        decimal decCostMultiplier = decBaseMarkup;
                        if (_setBlackMarketMaps.Contains(objXmlArmor["category"]?.InnerText))
                        {
                            decCostMultiplier *= 0.9m;
                        }
                        if ((!blnHideOverAvailLimit ||
                             SelectionShared.CheckAvailRestriction(objXmlArmor, _objCharacter)) &&
                            (blnFreeItem ||
                             !blnShowOnlyAffordItems ||
                             (SelectionShared.CheckNuyenRestriction(
                                  objXmlArmor, _objCharacter.Nuyen, decCostMultiplier))))
                        {
                            string strDisplayName = objXmlArmor["translate"]?.InnerText
                                                    ?? objXmlArmor["name"]?.InnerText;
                            if (!GlobalSettings.SearchInCategoryOnly && txtSearch.TextLength != 0)
                            {
                                string strCategory = objXmlArmor["category"]?.InnerText;
                                if (!string.IsNullOrEmpty(strCategory))
                                {
                                    ListItem objFoundItem
                                        = _lstCategory.Find(objFind => objFind.Value.ToString() == strCategory);
                                    if (!string.IsNullOrEmpty(objFoundItem.Name))
                                    {
                                        strDisplayName += strSpace + '[' + objFoundItem.Name + ']';
                                    }
                                }
                            }

                            lstArmors.Add(new ListItem(objXmlArmor["id"]?.InnerText, strDisplayName));
                        }
                        else
                        {
                            ++intOverLimit;
                        }
                    }

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

                    _blnLoading = true;
                    string strOldSelected = await lstArmor.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

                    await lstArmor.PopulateWithListItemsAsync(lstArmors);

                    _blnLoading = false;
                    if (!string.IsNullOrEmpty(strOldSelected))
                    {
                        await lstArmor.DoThreadSafeAsync(x => x.SelectedValue = strOldSelected);
                    }
                    else
                    {
                        await lstArmor.DoThreadSafeAsync(x => x.SelectedIndex = -1);
                    }
                    break;
                }
            }
        }
Пример #8
0
        private async void lstQualities_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            _blnLoading = true;

            try
            {
                XPathNavigator xmlQuality         = null;
                string         strSelectedQuality = await lstQualities.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

                if (!string.IsNullOrEmpty(strSelectedQuality))
                {
                    xmlQuality = _xmlBaseQualityDataNode.SelectSingleNode(
                        "qualities/quality[id = " + strSelectedQuality.CleanXPath() + ']');
                }

                if (xmlQuality != null)
                {
                    await nudRating.DoThreadSafeAsync(x => x.ValueAsInt = x.MinimumAsInt);

                    int intMaxRating = int.MaxValue;
                    if (xmlQuality.TryGetInt32FieldQuickly("limit", ref intMaxRating) &&
                        xmlQuality.SelectSingleNode("nolevels") == null)
                    {
                        await lblRatingNALabel.DoThreadSafeAsync(x => x.Visible = false);

                        await nudRating.DoThreadSafeAsync(x =>
                        {
                            x.MaximumAsInt = intMaxRating;
                            x.Visible      = true;
                        });
                    }
                    else
                    {
                        await lblRatingNALabel.DoThreadSafeAsync(x => x.Visible = true);

                        await nudRating.DoThreadSafeAsync(x =>
                        {
                            x.MaximumAsInt = 1;
                            x.ValueAsInt   = 1;
                            x.Visible      = false;
                        });
                    }

                    await UpdateCostLabel(xmlQuality);

                    string strSource = xmlQuality.SelectSingleNode("source")?.Value
                                       ?? await LanguageManager.GetStringAsync("String_Unknown");

                    string strPage = (await xmlQuality.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value
                                     ?? xmlQuality.SelectSingleNode("page")?.Value
                                     ?? await LanguageManager.GetStringAsync("String_Unknown");

                    SourceString objSource = await SourceString.GetSourceStringAsync(
                        strSource, strPage, GlobalSettings.Language,
                        GlobalSettings.CultureInfo, _objCharacter);

                    await objSource.SetControlAsync(lblSource);

                    await lblSourceLabel.DoThreadSafeAsync(
                        x => x.Visible = !string.IsNullOrEmpty(objSource.ToString()));

                    await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
                }
                else
                {
                    await tlpRight.DoThreadSafeAsync(x => x.Visible = false);
                }
            }
            finally
            {
                _blnLoading = false;
            }
        }
Пример #9
0
        private async ValueTask BuildVehicleList(XPathNodeIterator objXmlVehicleList)
        {
            await this.DoThreadSafeAsync(x => x.SuspendLayout());

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

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

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

                bool blnBlackMarketDiscount = await chkBlackMarketDiscount.DoThreadSafeFuncAsync(x => x.Checked);

                decimal decBaseCostMultiplier = 1.0m;
                if (await chkUsedVehicle.DoThreadSafeFuncAsync(x => x.Checked))
                {
                    decBaseCostMultiplier -= (await nudUsedVehicleDiscount.DoThreadSafeFuncAsync(x => x.Value) / 100.0m);
                }
                decBaseCostMultiplier *= 1 + (await nudMarkup.DoThreadSafeFuncAsync(x => x.Value) / 100.0m);
                bool blnHasSearch = await txtSearch.DoThreadSafeFuncAsync(x => x.TextLength != 0);

                if (await tabViews.DoThreadSafeFuncAsync(x => x.SelectedIndex) == 1)
                {
                    XmlDocument dummy = new XmlDocument {
                        XmlResolver = null
                    };
                    DataTable tabVehicles = new DataTable("vehicles");
                    tabVehicles.Columns.Add("VehicleGuid");
                    tabVehicles.Columns.Add("VehicleName");
                    tabVehicles.Columns.Add("Accel");
                    tabVehicles.Columns.Add("Armor");
                    tabVehicles.Columns.Add("Body");
                    tabVehicles.Columns.Add("Handling");
                    tabVehicles.Columns.Add("Pilot");
                    tabVehicles.Columns.Add("Sensor");
                    tabVehicles.Columns.Add("Speed");
                    tabVehicles.Columns.Add("Seats");
                    tabVehicles.Columns.Add("Gear");
                    tabVehicles.Columns.Add("Mods");
                    tabVehicles.Columns.Add("Weapons");
                    tabVehicles.Columns.Add("WeaponMounts");
                    tabVehicles.Columns.Add("Avail", typeof(AvailabilityValue));
                    tabVehicles.Columns.Add("Source", typeof(SourceString));
                    tabVehicles.Columns.Add("Cost", typeof(NuyenString));

                    foreach (XPathNavigator objXmlVehicle in objXmlVehicleList)
                    {
                        if (blnHideOverAvailLimit && !objXmlVehicle.CheckAvailRestriction(_objCharacter))
                        {
                            ++intOverLimit;
                            continue;
                        }

                        if (!blnFreeItem && blnShowOnlyAffordItems)
                        {
                            decimal decCostMultiplier = decBaseCostMultiplier;
                            if (blnBlackMarketDiscount &&
                                _setBlackMarketMaps.Contains((await objXmlVehicle
                                                              .SelectSingleNodeAndCacheExpressionAsync(
                                                                  "category"))
                                                             ?.Value))
                            {
                                decCostMultiplier *= 0.9m;
                            }
                            if (Vehicle.DoesDealerConnectionApply(_setDealerConnectionMaps,
                                                                  (await objXmlVehicle
                                                                   .SelectSingleNodeAndCacheExpressionAsync(
                                                                       "category"))
                                                                  ?.Value))
                            {
                                decCostMultiplier *= 0.9m;
                            }
                            if (!objXmlVehicle.CheckNuyenRestriction(_objCharacter.Nuyen, decCostMultiplier))
                            {
                                ++intOverLimit;
                                continue;
                            }
                        }

                        using (Vehicle objVehicle = new Vehicle(_objCharacter))
                        {
                            objVehicle.Create(objXmlVehicle.ToXmlNode(dummy), true, true, false, true);
                            string strID          = objVehicle.SourceIDString;
                            string strVehicleName = objVehicle.CurrentDisplayName;
                            string strAccel       = objVehicle.TotalAccel;
                            string strArmor       = objVehicle.TotalArmor.ToString(GlobalSettings.CultureInfo);
                            string strBody        = objVehicle.TotalBody.ToString(GlobalSettings.CultureInfo);
                            string strHandling    = objVehicle.TotalHandling;
                            string strPilot       = objVehicle.Pilot.ToString(GlobalSettings.CultureInfo);
                            string strSensor      = objVehicle.CalculatedSensor.ToString(GlobalSettings.CultureInfo);
                            string strSpeed       = objVehicle.TotalSpeed;
                            string strSeats       = objVehicle.TotalSeats.ToString(GlobalSettings.CultureInfo);
                            using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool,
                                                                           out StringBuilder sbdGear))
                            {
                                foreach (Gear objGear in objVehicle.GearChildren)
                                {
                                    sbdGear.AppendLine(objGear.CurrentDisplayName);
                                }

                                if (sbdGear.Length > 0)
                                {
                                    sbdGear.Length -= Environment.NewLine.Length;
                                }

                                using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool,
                                                                               out StringBuilder sbdMods))
                                {
                                    foreach (VehicleMod objMod in objVehicle.Mods)
                                    {
                                        sbdMods.AppendLine(objMod.CurrentDisplayName);
                                    }

                                    if (sbdMods.Length > 0)
                                    {
                                        sbdMods.Length -= Environment.NewLine.Length;
                                    }
                                    using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool,
                                                                                   out StringBuilder sbdWeapons))
                                    {
                                        if (sbdWeapons.Length > 0)
                                        {
                                            sbdWeapons.Length -= Environment.NewLine.Length;
                                        }
                                        foreach (Weapon objWeapon in objVehicle.Weapons)
                                        {
                                            sbdWeapons.AppendLine(objWeapon.CurrentDisplayName);
                                        }

                                        using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool,
                                                                                       out StringBuilder sbdWeaponMounts))
                                        {
                                            foreach (WeaponMount objWeaponMount in objVehicle.WeaponMounts)
                                            {
                                                sbdWeaponMounts.AppendLine(objWeaponMount.CurrentDisplayName);
                                            }

                                            if (sbdWeaponMounts.Length > 0)
                                            {
                                                sbdWeaponMounts.Length -= Environment.NewLine.Length;
                                            }

                                            AvailabilityValue objAvail  = objVehicle.TotalAvailTuple();
                                            SourceString      strSource = await SourceString.GetSourceStringAsync(
                                                objVehicle.Source,
                                                objVehicle.DisplayPage(GlobalSettings.Language),
                                                GlobalSettings.Language, GlobalSettings.CultureInfo,
                                                _objCharacter);

                                            NuyenString strCost =
                                                new NuyenString(
                                                    objVehicle.TotalCost.ToString(GlobalSettings.CultureInfo));

                                            tabVehicles.Rows.Add(strID, strVehicleName, strAccel, strArmor, strBody,
                                                                 strHandling, strPilot, strSensor, strSpeed, strSeats,
                                                                 sbdGear.ToString(), sbdMods.ToString(),
                                                                 sbdWeapons.ToString(), sbdWeaponMounts.ToString(),
                                                                 objAvail, strSource, strCost);
                                        }
                                    }
                                }
                            }
                        }
                    }

                    await dgvVehicles.DoThreadSafeAsync(x =>
                    {
                        x.Columns[0].Visible = false;
                        x.Columns[13].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                        x.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

                        DataSet set = new DataSet("vehicles");
                        set.Tables.Add(tabVehicles);
                        x.DataSource = set;
                        x.DataMember = "vehicles";
                    });
                }
                else
                {
                    string strSpace = await LanguageManager.GetStringAsync("String_Space");

                    using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool,
                                                                      out List <ListItem> lstVehicles))
                    {
                        foreach (XPathNavigator objXmlVehicle in objXmlVehicleList)
                        {
                            if (blnHideOverAvailLimit && !objXmlVehicle.CheckAvailRestriction(_objCharacter))
                            {
                                ++intOverLimit;
                                continue;
                            }

                            if (!blnFreeItem && blnShowOnlyAffordItems)
                            {
                                decimal decCostMultiplier = decBaseCostMultiplier;
                                if (blnBlackMarketDiscount &&
                                    _setBlackMarketMaps.Contains((await objXmlVehicle
                                                                  .SelectSingleNodeAndCacheExpressionAsync(
                                                                      "category"))
                                                                 ?.Value))
                                {
                                    decCostMultiplier *= 0.9m;
                                }
                                if (Vehicle.DoesDealerConnectionApply(_setDealerConnectionMaps,
                                                                      (await objXmlVehicle
                                                                       .SelectSingleNodeAndCacheExpressionAsync(
                                                                           "category"))
                                                                      ?.Value))
                                {
                                    decCostMultiplier *= 0.9m;
                                }
                                if (!objXmlVehicle.CheckNuyenRestriction(_objCharacter.Nuyen, decCostMultiplier))
                                {
                                    ++intOverLimit;
                                    continue;
                                }
                            }

                            string strDisplayname
                                = (await objXmlVehicle.SelectSingleNodeAndCacheExpressionAsync("translate"))?.Value
                                  ?? (await objXmlVehicle.SelectSingleNodeAndCacheExpressionAsync("name"))?.Value
                                  ?? await LanguageManager.GetStringAsync("String_Unknown");

                            if (!GlobalSettings.SearchInCategoryOnly && blnHasSearch)
                            {
                                string strCategory
                                    = (await objXmlVehicle.SelectSingleNodeAndCacheExpressionAsync("category"))?.Value;
                                if (!string.IsNullOrEmpty(strCategory))
                                {
                                    ListItem objFoundItem
                                        = _lstCategory.Find(objFind => objFind.Value.ToString() == strCategory);
                                    if (!string.IsNullOrEmpty(objFoundItem.Name))
                                    {
                                        strDisplayname += strSpace + '[' + objFoundItem.Name + ']';
                                    }
                                }
                            }

                            lstVehicles.Add(new ListItem(
                                                (await objXmlVehicle.SelectSingleNodeAndCacheExpressionAsync("id"))
                                                ?.Value ?? string.Empty,
                                                strDisplayname));
                        }

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

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

                        _blnLoading = true;
                        await lstVehicle.PopulateWithListItemsAsync(lstVehicles);

                        _blnLoading = false;
                        await lstVehicle.DoThreadSafeAsync(x =>
                        {
                            if (string.IsNullOrEmpty(strOldSelected))
                            {
                                x.SelectedIndex = -1;
                            }
                            else
                            {
                                x.SelectedValue = strOldSelected;
                            }
                        });
                    }
                }
            }
            finally
            {
                await this.DoThreadSafeAsync(x => x.ResumeLayout());
            }
        }
Пример #10
0
        /// <summary>
        /// Refresh the information for the selected Vehicle.
        /// </summary>
        private async ValueTask UpdateSelectedVehicle()
        {
            if (_blnLoading)
            {
                return;
            }

            string strSelectedId = await lstVehicle.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

            XPathNavigator objXmlVehicle = null;

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                // Retrieve the information for the selected Vehicle.
                objXmlVehicle = _xmlBaseVehicleDataNode.SelectSingleNode("vehicles/vehicle[id = " + strSelectedId.CleanXPath() + ']');
            }
            if (objXmlVehicle == null)
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);

                return;
            }

            await this.DoThreadSafeAsync(x => x.SuspendLayout());

            try
            {
                string strHandling = objXmlVehicle.SelectSingleNode("handling")?.Value;
                await lblVehicleHandling.DoThreadSafeAsync(x => x.Text = strHandling);

                string strAccel = objXmlVehicle.SelectSingleNode("accel")?.Value;
                await lblVehicleAccel.DoThreadSafeAsync(x => x.Text = strAccel);

                string strSpeed = objXmlVehicle.SelectSingleNode("speed")?.Value;
                await lblVehicleSpeed.DoThreadSafeAsync(x => x.Text = strSpeed);

                string strPilot = objXmlVehicle.SelectSingleNode("pilot")?.Value;
                await lblVehiclePilot.DoThreadSafeAsync(x => x.Text = strPilot);

                string strBody = objXmlVehicle.SelectSingleNode("body")?.Value;
                await lblVehicleBody.DoThreadSafeAsync(x => x.Text = strBody);

                string strArmor = objXmlVehicle.SelectSingleNode("armor")?.Value;
                await lblVehicleArmor.DoThreadSafeAsync(x => x.Text = strArmor);

                string strSeats = objXmlVehicle.SelectSingleNode("seats")?.Value;
                await lblVehicleSeats.DoThreadSafeAsync(x => x.Text = strSeats);

                string strSensor = objXmlVehicle.SelectSingleNode("sensor")?.Value;
                await lblVehicleSensor.DoThreadSafeAsync(x => x.Text = strSensor);

                await lblVehicleHandlingLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strHandling));

                await lblVehicleAccelLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strAccel));

                await lblVehicleSpeedLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strSpeed));

                await lblVehiclePilotLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strPilot));

                await lblVehicleBodyLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strBody));

                await lblVehicleArmorLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strArmor));

                await lblVehicleSeatsLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strSeats));

                await lblVehicleSensorLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strSensor));

                AvailabilityValue objTotalAvail
                    = new AvailabilityValue(0, objXmlVehicle.SelectSingleNode("avail")?.Value,
                                            await chkUsedVehicle.DoThreadSafeFuncAsync(x => x.Checked) ? -4 : 0);
                string strAvail = objTotalAvail.ToString();
                await lblVehicleAvail.DoThreadSafeAsync(x => x.Text = strAvail);

                await lblVehicleAvailLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strAvail));

                bool blnCanBlackMarketDiscount
                    = _setBlackMarketMaps.Contains(objXmlVehicle.SelectSingleNode("category")?.Value);
                await chkBlackMarketDiscount.DoThreadSafeAsync(x =>
                {
                    x.Enabled = blnCanBlackMarketDiscount;
                    if (!x.Checked)
                    {
                        x.Checked = GlobalSettings.AssumeBlackMarket && blnCanBlackMarketDiscount;
                    }
                    else if (!blnCanBlackMarketDiscount)
                    {
                        //Prevent chkBlackMarketDiscount from being checked if the category doesn't match.
                        x.Checked = false;
                    }
                });

                await UpdateSelectedVehicleCost();

                string strSource = objXmlVehicle.SelectSingleNode("source")?.Value
                                   ?? await LanguageManager.GetStringAsync("String_Unknown");

                string strPage = (await objXmlVehicle.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value
                                 ?? objXmlVehicle.SelectSingleNode("page")?.Value
                                 ?? await LanguageManager.GetStringAsync("String_Unknown");

                SourceString objSource = await SourceString.GetSourceStringAsync(
                    strSource, strPage, GlobalSettings.Language,
                    GlobalSettings.CultureInfo, _objCharacter);

                await objSource.SetControlAsync(lblSource);

                await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(objSource.ToString()));

                await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
            }
            finally
            {
                await this.DoThreadSafeAsync(x => x.ResumeLayout());
            }
        }
Пример #11
0
        /// <summary>
        /// Calculate the LP value for the selected items.
        /// </summary>
        private async ValueTask CalculateValues(bool blnIncludePercentage = true)
        {
            if (_blnSkipRefresh)
            {
                return;
            }

            decimal decBaseCost      = 0;
            decimal decCost          = 0;
            decimal decMod           = 0;
            string  strBaseLifestyle = string.Empty;
            // Get the base cost of the lifestyle
            string strSelectedId = cboLifestyle.SelectedValue?.ToString();

            if (strSelectedId != null)
            {
                XmlNode objXmlAspect = _objXmlDocument.SelectSingleNode("/chummer/lifestyles/lifestyle[id = " + strSelectedId.CleanXPath() + ']');

                if (objXmlAspect != null)
                {
                    objXmlAspect.TryGetStringFieldQuickly("name", ref strBaseLifestyle);
                    decimal decTemp = 0;
                    if (objXmlAspect.TryGetDecFieldQuickly("cost", ref decTemp))
                    {
                        decBaseCost += decTemp;
                    }
                    string strSource = objXmlAspect["source"]?.InnerText;
                    string strPage   = objXmlAspect["altpage"]?.InnerText ?? objXmlAspect["page"]?.InnerText;
                    if (!string.IsNullOrEmpty(strSource) && !string.IsNullOrEmpty(strPage))
                    {
                        SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                         GlobalSettings.CultureInfo, _objCharacter);

                        lblSource.Text = objSource.ToString();
                        await lblSource.SetToolTipAsync(objSource.LanguageBookTooltip);
                    }
                    else
                    {
                        lblSource.Text = await LanguageManager.GetStringAsync("String_Unknown");

                        await lblSource.SetToolTipAsync(await LanguageManager.GetStringAsync("String_Unknown"));
                    }

                    lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);

                    // Add the flat costs from qualities
                    foreach (TreeNode objNode in treQualities.Nodes)
                    {
                        if (objNode.Checked)
                        {
                            string strCost = _objXmlDocument.SelectSingleNode("/chummer/qualities/quality[id = " + objNode.Tag.ToString().CleanXPath() + "]/cost")?.InnerText;
                            if (!string.IsNullOrEmpty(strCost))
                            {
                                object objProcess = CommonFunctions.EvaluateInvariantXPath(strCost, out bool blnIsSuccess);
                                if (blnIsSuccess)
                                {
                                    decCost += Convert.ToDecimal(objProcess, GlobalSettings.InvariantCultureInfo);
                                }
                            }
                        }
                    }

                    decimal decBaseMultiplier = 0;
                    if (blnIncludePercentage)
                    {
                        // Add the modifiers from qualities
                        foreach (TreeNode objNode in treQualities.Nodes)
                        {
                            if (!objNode.Checked)
                            {
                                continue;
                            }
                            objXmlAspect = _objXmlDocument.SelectSingleNode("/chummer/qualities/quality[id = " + objNode.Tag.ToString().CleanXPath() + ']');
                            if (objXmlAspect == null)
                            {
                                continue;
                            }
                            if (objXmlAspect.TryGetDecFieldQuickly("multiplier", ref decTemp))
                            {
                                decMod += decTemp / 100.0m;
                            }
                            if (objXmlAspect.TryGetDecFieldQuickly("multiplierbaseonly", ref decTemp))
                            {
                                decBaseMultiplier += decTemp / 100.0m;
                            }
                        }

                        // Check for modifiers in the improvements
                        decMod += ImprovementManager.ValueOf(_objCharacter, Improvement.ImprovementType.LifestyleCost) / 100.0m;
                    }

                    decBaseCost += decBaseCost * decBaseMultiplier;
                    if (nudRoommates.Value > 0)
                    {
                        decBaseCost *= 1.0m + Math.Max(nudRoommates.Value / 10.0m, 0);
                    }
                }
            }

            decimal decNuyen = decBaseCost + decBaseCost * decMod + decCost;

            lblCost.Text = decNuyen.ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + '¥';
            if (nudPercentage.Value != 100 || nudRoommates.Value != 0 && !chkPrimaryTenant.Checked)
            {
                decimal decDiscount = decNuyen;
                decDiscount *= nudPercentage.Value / 100;
                if (nudRoommates.Value != 0)
                {
                    decDiscount /= nudRoommates.Value;
                }

                lblCost.Text += await LanguageManager.GetStringAsync("String_Space") + '(' + decDiscount.ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + "¥)";
            }

            lblCostLabel.Visible = !string.IsNullOrEmpty(lblCost.Text);

            // Characters with the Trust Fund Quality can have the lifestyle discounted.
            if (Lifestyle.StaticIsTrustFundEligible(_objCharacter, strBaseLifestyle))
            {
                chkTrustFund.Visible = true;
                chkTrustFund.Checked = _objSourceLifestyle?.TrustFund ?? !_objCharacter.Lifestyles.Any(x => x.TrustFund);
            }
            else
            {
                chkTrustFund.Checked = false;
                chkTrustFund.Visible = false;
            }
        }
Пример #12
0
        private async void trePowers_AfterSelect(object sender, TreeViewEventArgs e)
        {
            await lblPowerPoints.DoThreadSafeAsync(x => x.Visible = false);

            await lblPowerPointsLabel.DoThreadSafeAsync(x => x.Visible = false);

            string strSelectedPower = await trePowers.DoThreadSafeFuncAsync(x => x.SelectedNode.Tag?.ToString());

            if (!string.IsNullOrEmpty(strSelectedPower))
            {
                XPathNavigator objXmlPower = _xmlBaseCritterPowerDataNode.SelectSingleNode("powers/power[id = " + strSelectedPower.CleanXPath() + ']');
                if (objXmlPower != null)
                {
                    string strCategory = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("category"))?.Value
                                         ?? string.Empty;
                    await lblCritterPowerCategory.DoThreadSafeAsync(x => x.Text = strCategory);

                    string strType = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("type"))?.Value
                                     ?? string.Empty;
                    switch (strType)
                    {
                    case "M":
                        strType = await LanguageManager.GetStringAsync("String_SpellTypeMana");

                        break;

                    case "P":
                        strType = await LanguageManager.GetStringAsync("String_SpellTypePhysical");

                        break;
                    }
                    await lblCritterPowerType.DoThreadSafeAsync(x => x.Text = strType);

                    string strAction = objXmlPower.SelectSingleNode("action")?.Value ?? string.Empty;
                    switch (strAction)
                    {
                    case "Auto":
                        strAction = await LanguageManager.GetStringAsync("String_ActionAutomatic");

                        break;

                    case "Free":
                        strAction = await LanguageManager.GetStringAsync("String_ActionFree");

                        break;

                    case "Simple":
                        strAction = await LanguageManager.GetStringAsync("String_ActionSimple");

                        break;

                    case "Complex":
                        strAction = await LanguageManager.GetStringAsync("String_ActionComplex");

                        break;

                    case "Special":
                        strAction = await LanguageManager.GetStringAsync("String_SpellDurationSpecial");

                        break;
                    }
                    await lblCritterPowerAction.DoThreadSafeAsync(x => x.Text = strAction);

                    string strRange = objXmlPower.SelectSingleNode("range")?.Value ?? string.Empty;
                    if (!string.IsNullOrEmpty(strRange))
                    {
                        strRange = await strRange.CheapReplaceAsync("Self",
                                                                    () => LanguageManager.GetStringAsync("String_SpellRangeSelf"))
                                   .CheapReplaceAsync("Special",
                                                      () => LanguageManager.GetStringAsync("String_SpellDurationSpecial"))
                                   .CheapReplaceAsync("LOS", () => LanguageManager.GetStringAsync("String_SpellRangeLineOfSight"))
                                   .CheapReplaceAsync("LOI",
                                                      () => LanguageManager.GetStringAsync("String_SpellRangeLineOfInfluence"))
                                   .CheapReplaceAsync("Touch", () => LanguageManager.GetStringAsync("String_SpellRangeTouchLong"))
                                   .CheapReplaceAsync("T", () => LanguageManager.GetStringAsync("String_SpellRangeTouch"))
                                   .CheapReplaceAsync("(A)", async() => '(' + await LanguageManager.GetStringAsync("String_SpellRangeArea") + ')')
                                   .CheapReplaceAsync("MAG", () => LanguageManager.GetStringAsync("String_AttributeMAGShort"));
                    }
                    await lblCritterPowerRange.DoThreadSafeAsync(x => x.Text = strRange);

                    string strDuration = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("duration"))?.Value ?? string.Empty;
                    switch (strDuration)
                    {
                    case "Instant":
                        strDuration = await LanguageManager.GetStringAsync("String_SpellDurationInstantLong");

                        break;

                    case "Sustained":
                        strDuration = await LanguageManager.GetStringAsync("String_SpellDurationSustained");

                        break;

                    case "Always":
                        strDuration = await LanguageManager.GetStringAsync("String_SpellDurationAlways");

                        break;

                    case "Special":
                        strDuration = await LanguageManager.GetStringAsync("String_SpellDurationSpecial");

                        break;
                    }
                    await lblCritterPowerDuration.DoThreadSafeAsync(x => x.Text = strDuration);

                    string strSource = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("source"))?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                    string strPage = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("page"))?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                    SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                     GlobalSettings.CultureInfo, _objCharacter);

                    await objSource.SetControlAsync(lblCritterPowerSource);

                    bool blnVisible = await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("rating") != null;

                    await nudCritterPowerRating.DoThreadSafeAsync(x => x.Visible = blnVisible);

                    string strKarma = (await objXmlPower.SelectSingleNodeAndCacheExpressionAsync("karma"))?.Value
                                      ?? "0";
                    await lblKarma.DoThreadSafeAsync(x => x.Text = strKarma);

                    // If the character is a Free Spirit, populate the Power Points Cost as well.
                    if (_objCharacter.Metatype == "Free Spirit")
                    {
                        XPathNavigator xmlOptionalPowerCostNode = _xmlMetatypeDataNode.SelectSingleNode("optionalpowers/power[. = " + objXmlPower.SelectSingleNode("name")?.Value.CleanXPath() + "]/@cost");
                        if (xmlOptionalPowerCostNode != null)
                        {
                            await lblPowerPoints.DoThreadSafeAsync(x =>
                            {
                                x.Text    = xmlOptionalPowerCostNode.Value;
                                x.Visible = true;
                            });

                            await lblPowerPointsLabel.DoThreadSafeAsync(x => x.Visible = true);
                        }
                    }

                    await lblCritterPowerTypeLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strType));

                    await lblCritterPowerActionLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strAction));

                    await lblCritterPowerRangeLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strRange));

                    await lblCritterPowerDurationLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strDuration));

                    await lblCritterPowerSourceLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(objSource.ToString()));

                    await lblKarmaLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strKarma));

                    await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
                }
                else
                {
                    await tlpRight.DoThreadSafeAsync(x => x.Visible = false);
                }
            }
            else
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);
            }
        }
        private async ValueTask RefreshSelectedLifestyle()
        {
            if (_blnSkipRefresh)
            {
                return;
            }

            _objLifestyle.BaseLifestyle = await cboBaseLifestyle.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString()) ?? string.Empty;

            XPathNavigator xmlAspect = await _objLifestyle.GetNodeXPathAsync();

            if (xmlAspect != null)
            {
                string strSource = xmlAspect.SelectSingleNode("source")?.Value ?? string.Empty;
                string strPage   = (await xmlAspect.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? xmlAspect.SelectSingleNode("page")?.Value ?? string.Empty;
                if (!string.IsNullOrEmpty(strSource) && !string.IsNullOrEmpty(strPage))
                {
                    SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                     GlobalSettings.CultureInfo, _objCharacter);

                    await objSource.SetControlAsync(lblSource);

                    await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = true);
                }
                else
                {
                    await SourceString.Blank.SetControlAsync(lblSource);

                    await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = false);
                }
            }
            else
            {
                await SourceString.Blank.SetControlAsync(lblSource);

                await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = false);
            }

            // Characters with the Trust Fund Quality can have the lifestyle discounted.
            if (_objLifestyle.IsTrustFundEligible)
            {
                await chkTrustFund.DoThreadSafeAsync(x =>
                {
                    x.Visible = true;
                    x.Checked = _objLifestyle.TrustFund;
                });
            }
            else
            {
                await chkTrustFund.DoThreadSafeAsync(x =>
                {
                    x.Checked = false;
                    x.Visible = false;
                });
            }

            if (_objLifestyle.AllowBonusLP)
            {
                await lblBonusLP.DoThreadSafeAsync(x => x.Visible = true);

                await nudBonusLP.DoThreadSafeAsync(x => x.Visible = true);

                await chkBonusLPRandomize.DoThreadSafeAsync(x => x.Visible = true);

                if (await chkBonusLPRandomize.DoThreadSafeFuncAsync(x => x.Checked))
                {
                    int intValue = await GlobalSettings.RandomGenerator.NextD6ModuloBiasRemovedAsync();

                    await nudBonusLP.DoThreadSafeAsync(x =>
                    {
                        x.Enabled       = false;
                        _blnSkipRefresh = true;
                        x.Value         = intValue;
                        _blnSkipRefresh = false;
                    });
                }
                else
                {
                    await nudBonusLP.DoThreadSafeAsync(x => x.Enabled = true);
                }
            }
            else
            {
                await lblBonusLP.DoThreadSafeAsync(x => x.Visible = false);

                await nudBonusLP.DoThreadSafeAsync(x => x.Visible = false);

                await nudBonusLP.DoThreadSafeAsync(x => x.Value = 0);

                await chkBonusLPRandomize.DoThreadSafeAsync(x => x.Visible = false);
            }
        }
Пример #14
0
        private async void lstMentor_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnSkipRefresh)
            {
                return;
            }
            SuspendLayout();
            try
            {
                XPathNavigator objXmlMentor = null;
                if (lstMentor.SelectedIndex >= 0)
                {
                    string strSelectedId = lstMentor.SelectedValue?.ToString();
                    if (!string.IsNullOrEmpty(strSelectedId))
                    {
                        objXmlMentor =
                            _xmlBaseMentorSpiritDataNode.SelectSingleNode("mentors/mentor[id = " +
                                                                          strSelectedId.CleanXPath() + ']');
                    }
                }

                if (objXmlMentor != null)
                {
                    // If the Mentor offers a choice of bonuses, build the list and let the user select one.
                    XPathNavigator xmlChoices = await objXmlMentor.SelectSingleNodeAndCacheExpressionAsync("choices");

                    if (xmlChoices != null)
                    {
                        using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool, out List <ListItem> lstChoice1))
                            using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool,
                                                                              out List <ListItem> lstChoice2))
                            {
                                foreach (XPathNavigator objChoice in await xmlChoices.SelectAndCacheExpressionAsync("choice"))
                                {
                                    string strName = (await objChoice.SelectSingleNodeAndCacheExpressionAsync("name"))?.Value
                                                     ?? string.Empty;
                                    if ((_objCharacter.AdeptEnabled ||
                                         !strName.StartsWith("Adept:", StringComparison.Ordinal)) &&
                                        (_objCharacter.MagicianEnabled ||
                                         !strName.StartsWith("Magician:", StringComparison.Ordinal)))
                                    {
                                        if (objChoice.SelectSingleNode("@set")?.Value == "2")
                                        {
                                            lstChoice2.Add(new ListItem(strName,
                                                                        (await objChoice.SelectSingleNodeAndCacheExpressionAsync(
                                                                             "translate"))?.Value ?? strName));
                                        }
                                        else
                                        {
                                            lstChoice1.Add(new ListItem(strName,
                                                                        (await objChoice.SelectSingleNodeAndCacheExpressionAsync(
                                                                             "translate"))?.Value ?? strName));
                                        }
                                    }
                                }

                                //If there is only a single option, show it as a label.
                                //If there are more, show the drop down menu
                                if (lstChoice1.Count > 0)
                                {
                                    await cboChoice1.PopulateWithListItemsAsync(lstChoice1);
                                }
                                cboChoice1.Visible    = lstChoice1.Count > 1;
                                lblBonusText1.Visible = lstChoice1.Count == 1;
                                if (lstChoice1.Count == 1)
                                {
                                    lblBonusText1.Text = lstChoice1[0].Name;
                                }
                                if (lstChoice2.Count > 0)
                                {
                                    await cboChoice2.PopulateWithListItemsAsync(lstChoice2);
                                }
                                cboChoice2.Visible    = lstChoice2.Count > 1;
                                lblBonusText2.Visible = lstChoice2.Count == 1;
                                if (lstChoice2.Count == 1)
                                {
                                    lblBonusText2.Text = lstChoice2[0].Name;
                                }
                            }
                    }
                    else
                    {
                        cboChoice1.Visible    = false;
                        cboChoice2.Visible    = false;
                        lblBonusText1.Visible = false;
                        lblBonusText2.Visible = false;
                    }

                    lblChoice1.Visible = cboChoice1.Visible;
                    lblChoice2.Visible = cboChoice2.Visible;
                    lblBonus1.Visible  = lblBonusText1.Visible;
                    lblBonus2.Visible  = lblBonusText2.Visible;

                    // Get the information for the selected Mentor.
                    lblAdvantage.Text = objXmlMentor.SelectSingleNode("altadvantage")?.Value ??
                                        objXmlMentor.SelectSingleNode("advantage")?.Value ??
                                        await LanguageManager.GetStringAsync("String_Unknown");

                    lblAdvantageLabel.Visible = !string.IsNullOrEmpty(lblAdvantage.Text);
                    lblDisadvantage.Text      = objXmlMentor.SelectSingleNode("altdisadvantage")?.Value ??
                                                objXmlMentor.SelectSingleNode("disadvantage")?.Value ??
                                                await LanguageManager.GetStringAsync("String_Unknown");

                    lblDisadvantageLabel.Visible = !string.IsNullOrEmpty(lblDisadvantage.Text);

                    string strSource = objXmlMentor.SelectSingleNode("source")?.Value ??
                                       await LanguageManager.GetStringAsync("String_Unknown");

                    string strPage = (await objXmlMentor.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ??
                                     objXmlMentor.SelectSingleNode("page")?.Value ??
                                     await LanguageManager.GetStringAsync("String_Unknown");

                    SourceString objSourceString = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                           GlobalSettings.CultureInfo, _objCharacter);

                    await objSourceString.SetControlAsync(lblSource);

                    lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);
                    cmdOK.Enabled          = true;
                    tlpRight.Visible       = true;
                    tlpBottomRight.Visible = true;
                }
                else
                {
                    tlpRight.Visible       = false;
                    tlpBottomRight.Visible = false;
                    cmdOK.Enabled          = false;
                }
            }
            finally
            {
                ResumeLayout();
            }
        }
Пример #15
0
        private async Task LoadContent(CancellationToken token = default)
        {
            token.ThrowIfCancellationRequested();
            using (CustomActivity opLoadMasterindex = await Timekeeper.StartSyncronAsync("op_load_frm_masterindex", null,
                                                                                         CustomActivity.OperationType.RequestOperation, null))
            {
                bool blnOldIsFinishedLoading = IsFinishedLoading;
                try
                {
                    IsFinishedLoading = false;
                    await _dicCachedNotes.ClearAsync(token);

                    foreach (MasterIndexEntry objExistingEntry in _lstItems.Select(x => x.Value))
                    {
                        objExistingEntry.Dispose();
                    }
                    _lstItems.Clear();
                    _lstFileNamesWithItems.Clear();
                    string strSourceFilter;
                    using (new FetchSafelyFromPool <HashSet <string> >(Utils.StringHashSetPool,
                                                                       out HashSet <string> setValidCodes))
                    {
                        foreach (XPathNavigator xmlBookNode in await(await XmlManager.LoadXPathAsync(
                                                                         "books.xml", _objSelectedSetting.EnabledCustomDataDirectoryPaths, token: token))
                                 .SelectAndCacheExpressionAsync("/chummer/books/book/code"))
                        {
                            setValidCodes.Add(xmlBookNode.Value);
                        }

                        setValidCodes.IntersectWith(_objSelectedSetting.Books);

                        strSourceFilter = setValidCodes.Count > 0
                            ? '(' + string.Join(" or ", setValidCodes.Select(x => "source = " + x.CleanXPath())) + ')'
                            : "source";
                    }

                    using (_ = await Timekeeper.StartSyncronAsync("load_frm_masterindex_load_andpopulate_entries",
                                                                  opLoadMasterindex))
                    {
                        ConcurrentBag <ListItem> lstItemsForLoading = new ConcurrentBag <ListItem>();
                        using (_ = await Timekeeper.StartSyncronAsync("load_frm_masterindex_load_entries", opLoadMasterindex))
                        {
                            ConcurrentBag <ListItem> lstFileNamesWithItemsForLoading = new ConcurrentBag <ListItem>();
                            // Prevents locking the UI thread while still benefiting from static scheduling of Parallel.ForEach
                            await Task.WhenAll(_astrFileNames.Select(strFileName => Task.Run(async() =>
                            {
                                XPathNavigator xmlBaseNode
                                    = await XmlManager.LoadXPathAsync(strFileName,
                                                                      _objSelectedSetting
                                                                      .EnabledCustomDataDirectoryPaths,
                                                                      token: token);
                                xmlBaseNode = await xmlBaseNode.SelectSingleNodeAndCacheExpressionAsync("/chummer");
                                if (xmlBaseNode == null)
                                {
                                    return;
                                }
                                bool blnLoopFileNameHasItems = false;
                                foreach (XPathNavigator xmlItemNode in xmlBaseNode.Select(
                                             ".//*[page and " + strSourceFilter + ']'))
                                {
                                    blnLoopFileNameHasItems = true;
                                    string strName          = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("name"))
                                                              ?.Value;
                                    string strDisplayName
                                        = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("translate"))
                                          ?.Value
                                          ?? strName
                                          ?? (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("id"))?.Value
                                          ?? await LanguageManager.GetStringAsync("String_Unknown");
                                    string strSource
                                                   = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("source"))?.Value;
                                    string strPage = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("page"))
                                                     ?.Value;
                                    string strDisplayPage
                                        = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value
                                          ?? strPage;
                                    string strEnglishNameOnPage
                                        = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("nameonpage"))
                                          ?.Value
                                          ?? strName;
                                    string strTranslatedNameOnPage =
                                        (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("altnameonpage"))
                                        ?.Value
                                        ?? strDisplayName;
                                    string strNotes
                                        = (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("altnotes"))?.Value
                                          ?? (await xmlItemNode.SelectSingleNodeAndCacheExpressionAsync("notes"))
                                          ?.Value;
                                    MasterIndexEntry objEntry = new MasterIndexEntry(
                                        strDisplayName,
                                        strFileName,
                                        await SourceString.GetSourceStringAsync(
                                            strSource, strPage, GlobalSettings.DefaultLanguage,
                                            GlobalSettings.InvariantCultureInfo),
                                        await SourceString.GetSourceStringAsync(
                                            strSource, strDisplayPage, GlobalSettings.Language,
                                            GlobalSettings.CultureInfo),
                                        strEnglishNameOnPage,
                                        strTranslatedNameOnPage);
                                    lstItemsForLoading.Add(new ListItem(objEntry, strDisplayName));
                                    if (!string.IsNullOrEmpty(strNotes))
                                    {
                                        await _dicCachedNotes.TryAddAsync(objEntry, Task.FromResult(strNotes), token);
                                    }
                                }

                                if (blnLoopFileNameHasItems)
                                {
                                    lstFileNamesWithItemsForLoading.Add(new ListItem(strFileName, strFileName));
                                }
                            }, token)));

                            _lstFileNamesWithItems.AddRange(lstFileNamesWithItemsForLoading);
                        }

                        using (_ = await Timekeeper.StartSyncronAsync("load_frm_masterindex_populate_entries", opLoadMasterindex))
                        {
                            string strSpace = await LanguageManager.GetStringAsync("String_Space");

                            string strFormat = "{0}" + strSpace + "[{1}]";
                            Dictionary <string, List <ListItem> > dicHelper
                                = new Dictionary <string, List <ListItem> >(lstItemsForLoading.Count);
                            try
                            {
                                foreach (ListItem objItem in lstItemsForLoading)
                                {
                                    if (!(objItem.Value is MasterIndexEntry objEntry))
                                    {
                                        continue;
                                    }
                                    string strKey = objEntry.DisplayName.ToUpperInvariant();
                                    if (dicHelper.TryGetValue(strKey, out List <ListItem> lstExistingItems))
                                    {
                                        ListItem objExistingItem = lstExistingItems.Find(
                                            x => x.Value is MasterIndexEntry y &&
                                            objEntry.DisplaySource.Equals(y.DisplaySource));
                                        if (objExistingItem.Value is MasterIndexEntry objLoopEntry)
                                        {
                                            objLoopEntry.FileNames.UnionWith(objEntry.FileNames);
                                            objEntry.Dispose();
                                        }
                                        else
                                        {
                                            using (new FetchSafelyFromPool <List <ListItem> >(
                                                       Utils.ListItemListPool,
                                                       out List <ListItem> lstItemsNeedingNameChanges))
                                            {
                                                lstItemsNeedingNameChanges.AddRange(lstExistingItems.FindAll(
                                                                                        x => x.Value is MasterIndexEntry y &&
                                                                                        !objEntry.FileNames.IsSubsetOf(y.FileNames)));
                                                if (lstItemsNeedingNameChanges.Count == 0)
                                                {
                                                    _lstItems.Add(
                                                        objItem); // Not using AddRange because of potential memory issues
                                                    lstExistingItems.Add(objItem);
                                                }
                                                else
                                                {
                                                    ListItem objItemToAdd = new ListItem(
                                                        objItem.Value, string.Format(GlobalSettings.CultureInfo,
                                                                                     strFormat, objItem.Name,
                                                                                     string.Join(
                                                                                         ',' + strSpace, objEntry.FileNames)));
                                                    _lstItems.Add(
                                                        objItemToAdd); // Not using AddRange because of potential memory issues
                                                    lstExistingItems.Add(objItemToAdd);

                                                    foreach (ListItem objToRename in lstItemsNeedingNameChanges)
                                                    {
                                                        _lstItems.Remove(objToRename);
                                                        lstExistingItems.Remove(objToRename);

                                                        if (!(objToRename.Value is MasterIndexEntry objExistingEntry))
                                                        {
                                                            continue;
                                                        }
                                                        objItemToAdd = new ListItem(objToRename.Value, string.Format(
                                                                                        GlobalSettings.CultureInfo,
                                                                                        strFormat, objExistingEntry.DisplayName,
                                                                                        string.Join(
                                                                                            ',' + strSpace,
                                                                                            objExistingEntry.FileNames)));
                                                        _lstItems.Add(
                                                            objItemToAdd); // Not using AddRange because of potential memory issues
                                                        lstExistingItems.Add(objItemToAdd);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        _lstItems.Add(objItem); // Not using AddRange because of potential memory issues
                                        List <ListItem> lstHelperItems = Utils.ListItemListPool.Get();
                                        lstHelperItems.Add(objItem);
                                        dicHelper.Add(strKey, lstHelperItems);
                                    }
                                }
                            }
                            finally
                            {
                                foreach (List <ListItem> lstHelperItems in dicHelper.Values)
                                {
                                    Utils.ListItemListPool.Return(lstHelperItems);
                                }
                            }
                        }
                    }

                    using (_ = await Timekeeper.StartSyncronAsync("load_frm_masterindex_sort_entries", opLoadMasterindex))
                    {
                        _lstItems.Sort(CompareListItems.CompareNames);
                        _lstFileNamesWithItems.Sort(CompareListItems.CompareNames);
                    }

                    using (_ = await Timekeeper.StartSyncronAsync("load_frm_masterindex_populate_controls", opLoadMasterindex))
                    {
                        _lstFileNamesWithItems.Insert(
                            0, new ListItem(string.Empty, await LanguageManager.GetStringAsync("String_All")));

                        int intOldSelectedIndex = await cboFile.DoThreadSafeFuncAsync(x => x.SelectedIndex, token);

                        await cboFile.PopulateWithListItemsAsync(_lstFileNamesWithItems, token);

                        await cboFile.DoThreadSafeAsync(x =>
                        {
                            try
                            {
                                x.SelectedIndex = Math.Max(intOldSelectedIndex, 0);
                            }
                            // For some reason, some unit tests will fire this exception even when _lstFileNamesWithItems is explicitly checked for having enough items
                            catch (ArgumentOutOfRangeException)
                            {
                                x.SelectedIndex = -1;
                            }
                        }, token);

                        await lstItems.PopulateWithListItemsAsync(_lstItems, token);

                        await lstItems.DoThreadSafeAsync(x => x.SelectedIndex = -1, token);
                    }
                }
                finally
                {
                    _blnSkipRefresh   = false;
                    IsFinishedLoading = blnOldIsFinishedLoading;
                }
            }
        }
Пример #16
0
        /// <summary>
        /// Refresh the information for the selected Vehicle.
        /// </summary>
        private async ValueTask UpdateSelectedVehicle()
        {
            if (_blnLoading)
            {
                return;
            }

            string         strSelectedId = lstVehicle.SelectedValue?.ToString();
            XPathNavigator objXmlVehicle = null;

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                // Retrieve the information for the selected Vehicle.
                objXmlVehicle = _xmlBaseVehicleDataNode.SelectSingleNode("vehicles/vehicle[id = " + strSelectedId.CleanXPath() + ']');
            }
            if (objXmlVehicle == null)
            {
                tlpRight.Visible = false;
                return;
            }

            SuspendLayout();
            lblVehicleHandling.Text         = objXmlVehicle.SelectSingleNode("handling")?.Value;
            lblVehicleAccel.Text            = objXmlVehicle.SelectSingleNode("accel")?.Value;
            lblVehicleSpeed.Text            = objXmlVehicle.SelectSingleNode("speed")?.Value;
            lblVehiclePilot.Text            = objXmlVehicle.SelectSingleNode("pilot")?.Value;
            lblVehicleBody.Text             = objXmlVehicle.SelectSingleNode("body")?.Value;
            lblVehicleArmor.Text            = objXmlVehicle.SelectSingleNode("armor")?.Value;
            lblVehicleSeats.Text            = objXmlVehicle.SelectSingleNode("seats")?.Value;
            lblVehicleSensor.Text           = objXmlVehicle.SelectSingleNode("sensor")?.Value;
            lblVehicleHandlingLabel.Visible = !string.IsNullOrEmpty(lblVehicleHandling.Text);
            lblVehicleAccelLabel.Visible    = !string.IsNullOrEmpty(lblVehicleAccel.Text);
            lblVehicleSpeedLabel.Visible    = !string.IsNullOrEmpty(lblVehicleSpeed.Text);
            lblVehiclePilotLabel.Visible    = !string.IsNullOrEmpty(lblVehiclePilot.Text);
            lblVehicleBodyLabel.Visible     = !string.IsNullOrEmpty(lblVehicleBody.Text);
            lblVehicleArmorLabel.Visible    = !string.IsNullOrEmpty(lblVehicleArmor.Text);
            lblVehicleSeatsLabel.Visible    = !string.IsNullOrEmpty(lblVehicleSeats.Text);
            lblVehicleSensorLabel.Visible   = !string.IsNullOrEmpty(lblVehicleSensor.Text);
            AvailabilityValue objTotalAvail = new AvailabilityValue(0, objXmlVehicle.SelectSingleNode("avail")?.Value, chkUsedVehicle.Checked ? -4 : 0);

            lblVehicleAvail.Text         = objTotalAvail.ToString();
            lblVehicleAvailLabel.Visible = !string.IsNullOrEmpty(lblVehicleAvail.Text);

            bool blnCanBlackMarketDiscount = _setBlackMarketMaps.Contains(objXmlVehicle.SelectSingleNode("category")?.Value);

            chkBlackMarketDiscount.Enabled = blnCanBlackMarketDiscount;
            if (!chkBlackMarketDiscount.Checked)
            {
                chkBlackMarketDiscount.Checked = GlobalSettings.AssumeBlackMarket && blnCanBlackMarketDiscount;
            }
            else if (!blnCanBlackMarketDiscount)
            {
                //Prevent chkBlackMarketDiscount from being checked if the category doesn't match.
                chkBlackMarketDiscount.Checked = false;
            }

            UpdateSelectedVehicleCost();

            string strSource = objXmlVehicle.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

            string strPage = (await objXmlVehicle.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? objXmlVehicle.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

            SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                             GlobalSettings.CultureInfo, _objCharacter);

            lblSource.Text = objSource.ToString();
            await lblSource.SetToolTipAsync(objSource.LanguageBookTooltip);

            lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);
            tlpRight.Visible       = true;
            ResumeLayout();
        }
Пример #17
0
        private async void lstComplexForms_SelectedIndexChanged(object sender, EventArgs e)
        {
            string strSelectedComplexFormId = await lstComplexForms.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

            if (_blnLoading || string.IsNullOrEmpty(strSelectedComplexFormId))
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);

                return;
            }

            // Display the Complex Form information.
            XPathNavigator xmlComplexForm = _xmlBaseComplexFormsNode.SelectSingleNode("complexform[id = " + strSelectedComplexFormId.CleanXPath() + ']');

            if (xmlComplexForm == null)
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);

                return;
            }

            await this.DoThreadSafeAsync(x => x.SuspendLayout());

            try
            {
                string strDuration;
                switch (xmlComplexForm.SelectSingleNode("duration")?.Value)
                {
                case "P":
                    strDuration = await LanguageManager.GetStringAsync("String_SpellDurationPermanent");

                    break;

                case "S":
                    strDuration = await LanguageManager.GetStringAsync("String_SpellDurationSustained");

                    break;

                case "Special":
                    strDuration = await LanguageManager.GetStringAsync("String_SpellDurationSpecial");

                    break;

                default:
                    strDuration = await LanguageManager.GetStringAsync("String_SpellDurationInstant");

                    break;
                }

                await lblDuration.DoThreadSafeAsync(x => x.Text = strDuration);

                string strTarget;
                switch (xmlComplexForm.SelectSingleNode("target")?.Value)
                {
                case "Persona":
                    strTarget = await LanguageManager.GetStringAsync("String_ComplexFormTargetPersona");

                    break;

                case "Device":
                    strTarget = await LanguageManager.GetStringAsync("String_ComplexFormTargetDevice");

                    break;

                case "File":
                    strTarget = await LanguageManager.GetStringAsync("String_ComplexFormTargetFile");

                    break;

                case "Self":
                    strTarget = await LanguageManager.GetStringAsync("String_SpellRangeSelf");

                    break;

                case "Sprite":
                    strTarget = await LanguageManager.GetStringAsync("String_ComplexFormTargetSprite");

                    break;

                case "Host":
                    strTarget = await LanguageManager.GetStringAsync("String_ComplexFormTargetHost");

                    break;

                case "IC":
                    strTarget = await LanguageManager.GetStringAsync("String_ComplexFormTargetIC");

                    break;

                default:
                    strTarget = await LanguageManager.GetStringAsync("String_None");

                    break;
                }

                await lblTarget.DoThreadSafeAsync(x => x.Text = strTarget);

                string strFv = xmlComplexForm.SelectSingleNode("fv")?.Value.Replace('/', '÷').Replace('*', '×')
                               ?? string.Empty;
                if (!GlobalSettings.Language.Equals(GlobalSettings.DefaultLanguage, StringComparison.OrdinalIgnoreCase))
                {
                    strFv = await strFv
                            .CheapReplaceAsync(
                        "L", () => LanguageManager.GetStringAsync("String_ComplexFormLevel"))
                            .CheapReplaceAsync("Overflow damage",
                                               () => LanguageManager.GetStringAsync("String_SpellOverflowDamage"))
                            .CheapReplaceAsync("Damage Value",
                                               () => LanguageManager.GetStringAsync("String_SpellDamageValue"))
                            .CheapReplaceAsync(
                        "Toxin DV", () => LanguageManager.GetStringAsync("String_SpellToxinDV"))
                            .CheapReplaceAsync("Disease DV",
                                               () => LanguageManager.GetStringAsync("String_SpellDiseaseDV"))
                            .CheapReplaceAsync("Radiation Power",
                                               () => LanguageManager.GetStringAsync(
                                                   "String_SpellRadiationPower"));
                }

                await lblFV.DoThreadSafeAsync(x => x.Text = strFv);

                string strSource = xmlComplexForm.SelectSingleNode("source")?.Value ??
                                   await LanguageManager.GetStringAsync("String_Unknown");

                string strPage = (await xmlComplexForm.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ??
                                 xmlComplexForm.SelectSingleNode("page")?.Value ??
                                 await LanguageManager.GetStringAsync("String_Unknown");

                SourceString objSource = await SourceString.GetSourceStringAsync(
                    strSource, strPage, GlobalSettings.Language,
                    GlobalSettings.CultureInfo, _objCharacter);

                string strSourceText = objSource.ToString();
                await lblSource.DoThreadSafeAsync(x => x.Text = strSourceText);

                await lblSource.SetToolTipAsync(objSource.LanguageBookTooltip);

                await lblTargetLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strTarget));

                await lblDurationLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strDuration));

                await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strSourceText));

                await lblFVLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(strFv));

                await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
            }
            finally
            {
                await this.DoThreadSafeAsync(x => x.ResumeLayout());
            }
        }
Пример #18
0
        private async ValueTask UpdateGearInfo(bool blnUpdateMountComboBoxes = true)
        {
            if (_blnLoading)
            {
                return;
            }

            XPathNavigator xmlAccessory  = null;
            string         strSelectedId = lstAccessory.SelectedValue?.ToString();

            // Retrieve the information for the selected Accessory.
            if (!string.IsNullOrEmpty(strSelectedId))
            {
                xmlAccessory = _xmlBaseChummerNode.SelectSingleNode("accessories/accessory[id = " + strSelectedId.CleanXPath() + ']');
            }
            if (xmlAccessory == null)
            {
                tlpRight.Visible = false;
                return;
            }

            string strRC = xmlAccessory.SelectSingleNode("rc")?.Value;

            if (!string.IsNullOrEmpty(strRC))
            {
                lblRC.Visible      = true;
                lblRCLabel.Visible = true;
                lblRC.Text         = strRC;
            }
            else
            {
                lblRC.Visible      = false;
                lblRCLabel.Visible = false;
            }
            if (int.TryParse(xmlAccessory.SelectSingleNode("rating")?.Value, out int intMaxRating) && intMaxRating > 0)
            {
                nudRating.Maximum = intMaxRating;
                if (chkHideOverAvailLimit.Checked)
                {
                    while (nudRating.Maximum > nudRating.Minimum && !xmlAccessory.CheckAvailRestriction(_objCharacter, nudRating.MaximumAsInt))
                    {
                        --nudRating.Maximum;
                    }
                }
                if (chkShowOnlyAffordItems.Checked && !chkFreeItem.Checked)
                {
                    decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m);
                    if (_setBlackMarketMaps.Contains(xmlAccessory.SelectSingleNode("category")?.Value))
                    {
                        decCostMultiplier *= 0.9m;
                    }
                    while (nudRating.Maximum > nudRating.Minimum && !xmlAccessory.CheckNuyenRestriction(_objCharacter.Nuyen, decCostMultiplier, nudRating.MaximumAsInt))
                    {
                        --nudRating.Maximum;
                    }
                }
                nudRating.Enabled        = nudRating.Maximum != nudRating.Minimum;
                nudRating.Visible        = true;
                lblRatingLabel.Visible   = true;
                lblRatingNALabel.Visible = false;
            }
            else
            {
                lblRatingNALabel.Visible = true;
                nudRating.Enabled        = false;
                nudRating.Visible        = false;
                lblRatingLabel.Visible   = true;
            }

            if (blnUpdateMountComboBoxes)
            {
                string        strDataMounts = xmlAccessory.SelectSingleNode("mount")?.Value;
                List <string> strMounts     = new List <string>(1);
                if (!string.IsNullOrEmpty(strDataMounts))
                {
                    strMounts.AddRange(strDataMounts.SplitNoAlloc('/', StringSplitOptions.RemoveEmptyEntries));
                }

                strMounts.Add("None");

                List <string> strAllowed = new List <string>(_lstAllowedMounts)
                {
                    "None"
                };
                cboMount.Visible = true;
                cboMount.Items.Clear();
                foreach (string strCurrentMount in strMounts)
                {
                    if (!string.IsNullOrEmpty(strCurrentMount))
                    {
                        foreach (string strAllowedMount in strAllowed)
                        {
                            if (strCurrentMount == strAllowedMount)
                            {
                                cboMount.Items.Add(strCurrentMount);
                            }
                        }
                    }
                }

                cboMount.Enabled       = cboMount.Items.Count > 1;
                cboMount.SelectedIndex = 0;
                lblMountLabel.Visible  = true;

                List <string> strExtraMounts = new List <string>(1);
                string        strExtraMount  = xmlAccessory.SelectSingleNode("extramount")?.Value;
                if (!string.IsNullOrEmpty(strExtraMount))
                {
                    foreach (string strItem in strExtraMount.SplitNoAlloc('/', StringSplitOptions.RemoveEmptyEntries))
                    {
                        strExtraMounts.Add(strItem);
                    }
                }

                strExtraMounts.Add("None");

                cboExtraMount.Items.Clear();
                foreach (string strCurrentMount in strExtraMounts)
                {
                    if (!string.IsNullOrEmpty(strCurrentMount))
                    {
                        foreach (string strAllowedMount in strAllowed)
                        {
                            if (strCurrentMount == strAllowedMount)
                            {
                                cboExtraMount.Items.Add(strCurrentMount);
                            }
                        }
                    }
                }

                cboExtraMount.Enabled       = cboExtraMount.Items.Count > 1;
                cboExtraMount.SelectedIndex = 0;
                if (cboMount.SelectedItem.ToString() != "None" && cboExtraMount.SelectedItem.ToString() != "None" &&
                    cboMount.SelectedItem.ToString() == cboExtraMount.SelectedItem.ToString())
                {
                    ++cboExtraMount.SelectedIndex;
                }
                cboExtraMount.Visible      = cboExtraMount.Enabled && cboExtraMount.SelectedItem.ToString() != "None";
                lblExtraMountLabel.Visible = cboExtraMount.Visible;
            }

            // Avail.
            // If avail contains "F" or "R", remove it from the string so we can use the expression.
            lblAvail.Text         = new AvailabilityValue(Convert.ToInt32(nudRating.Value), xmlAccessory.SelectSingleNode("avail")?.Value).ToString();
            lblAvailLabel.Visible = !string.IsNullOrEmpty(lblAvail.Text);

            if (!chkFreeItem.Checked)
            {
                string strCost = "0";
                if (xmlAccessory.TryGetStringFieldQuickly("cost", ref strCost))
                {
                    strCost = (await strCost.CheapReplaceAsync("Weapon Cost",
                                                               () => _objParentWeapon.OwnCost.ToString(GlobalSettings.InvariantCultureInfo))
                               .CheapReplaceAsync("Weapon Total Cost",
                                                  () => _objParentWeapon.MultipliableCost(null)
                                                  .ToString(GlobalSettings.InvariantCultureInfo)))
                              .Replace("Rating", nudRating.Value.ToString(GlobalSettings.CultureInfo));
                }
                if (strCost.StartsWith("Variable(", StringComparison.Ordinal))
                {
                    decimal decMin;
                    decimal decMax = decimal.MaxValue;
                    strCost = strCost.TrimStartOnce("Variable(", true).TrimEndOnce(')');
                    if (strCost.Contains('-'))
                    {
                        string[] strValues = strCost.Split('-');
                        decimal.TryParse(strValues[0], NumberStyles.Any, GlobalSettings.InvariantCultureInfo, out decMin);
                        decimal.TryParse(strValues[1], NumberStyles.Any, GlobalSettings.InvariantCultureInfo, out decMax);
                    }
                    else
                    {
                        decimal.TryParse(strCost.FastEscape('+'), NumberStyles.Any, GlobalSettings.InvariantCultureInfo, out decMin);
                    }

                    if (decMax == decimal.MaxValue)
                    {
                        lblCost.Text = decMin.ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + "¥+";
                    }
                    else
                    {
                        string strSpace = await LanguageManager.GetStringAsync("String_Space");

                        lblCost.Text = decMin.ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + strSpace + '-'
                                       + strSpace + decMax.ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + '¥';
                    }

                    lblTest.Text = _objCharacter.AvailTest(decMax, lblAvail.Text);
                }
                else
                {
                    object  objProcess = CommonFunctions.EvaluateInvariantXPath(strCost, out bool blnIsSuccess);
                    decimal decCost    = blnIsSuccess ? Convert.ToDecimal(objProcess, GlobalSettings.InvariantCultureInfo) : 0;

                    // Apply any markup.
                    decCost *= 1 + (nudMarkup.Value / 100.0m);

                    if (chkBlackMarketDiscount.Checked)
                    {
                        decCost *= 0.9m;
                    }
                    decCost *= _objParentWeapon.AccessoryMultiplier;
                    if (!string.IsNullOrEmpty(_objParentWeapon.DoubledCostModificationSlots))
                    {
                        string[] astrParentDoubledCostModificationSlots = _objParentWeapon.DoubledCostModificationSlots.Split('/', StringSplitOptions.RemoveEmptyEntries);
                        if (astrParentDoubledCostModificationSlots.Contains(cboMount.SelectedItem?.ToString()) ||
                            astrParentDoubledCostModificationSlots.Contains(cboExtraMount.SelectedItem?.ToString()))
                        {
                            decCost *= 2;
                        }
                    }

                    lblCost.Text = decCost.ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + '¥';
                    lblTest.Text = _objCharacter.AvailTest(decCost, lblAvail.Text);
                }
            }
            else
            {
                lblCost.Text = (0.0m).ToString(_objCharacter.Settings.NuyenFormat, GlobalSettings.CultureInfo) + '¥';
                lblTest.Text = _objCharacter.AvailTest(0, lblAvail.Text);
            }

            lblRatingLabel.Text = xmlAccessory.SelectSingleNode("ratinglabel") != null
                ? string.Format(GlobalSettings.CultureInfo, await LanguageManager.GetStringAsync("Label_RatingFormat"),
                                await LanguageManager.GetStringAsync(xmlAccessory.SelectSingleNode("ratinglabel").Value))
                : await LanguageManager.GetStringAsync("Label_Rating");

            lblCostLabel.Visible = !string.IsNullOrEmpty(lblCost.Text);
            lblTestLabel.Visible = !string.IsNullOrEmpty(lblTest.Text);

            chkBlackMarketDiscount.Enabled = _blnIsParentWeaponBlackMarketAllowed;
            if (!chkBlackMarketDiscount.Checked)
            {
                chkBlackMarketDiscount.Checked = GlobalSettings.AssumeBlackMarket && _blnIsParentWeaponBlackMarketAllowed;
            }
            else if (!_blnIsParentWeaponBlackMarketAllowed)
            {
                //Prevent chkBlackMarketDiscount from being checked if the gear category doesn't match.
                chkBlackMarketDiscount.Checked = false;
            }

            string strSource = xmlAccessory.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

            string strPage = (await xmlAccessory.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? xmlAccessory.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

            SourceString objSourceString = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language, GlobalSettings.CultureInfo, _objCharacter);

            await objSourceString.SetControlAsync(lblSource);

            lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);
            tlpRight.Visible       = true;
        }
Пример #19
0
        private async void lstDrug_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }
            _blnLoading = true;
            XPathNavigator xmlDrug       = null;
            string         strSelectedId = await lstDrug.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                // Retrieve the information for the selected piece of Drug.
                xmlDrug = _xmlBaseDrugDataNode.SelectSingleNode(_strNodeXPath + "[id = " + strSelectedId.CleanXPath() + ']');
            }
            string strForceGrade;

            if (xmlDrug != null)
            {
                strForceGrade = xmlDrug.SelectSingleNode("forcegrade")?.Value;
                // If the piece has a Rating value, enable the Rating control, otherwise, disable it and set its value to 0.
                XPathNavigator xmlRatingNode = xmlDrug.SelectSingleNode("rating");
                if (xmlRatingNode != null)
                {
                    string strMinRating = xmlDrug.SelectSingleNode("minrating")?.Value;
                    int    intMinRating = 1;
                    // Not a simple integer, so we need to start mucking around with strings
                    if (!string.IsNullOrEmpty(strMinRating) && !int.TryParse(strMinRating, out intMinRating))
                    {
                        strMinRating = await strMinRating
                                       .CheapReplaceAsync("MaximumSTR",
                                                          () => (ParentVehicle != null
                                                                        ? Math.Max(1, ParentVehicle.TotalBody * 2)
                                                                        : _objCharacter.STR.TotalMaximum)
                                                          .ToString(GlobalSettings.InvariantCultureInfo))
                                       .CheapReplaceAsync("MaximumAGI",
                                                          () => (ParentVehicle != null
                                                                        ? Math.Max(1, ParentVehicle.Pilot * 2)
                                                                        : _objCharacter.AGI.TotalMaximum)
                                                          .ToString(GlobalSettings.InvariantCultureInfo))
                                       .CheapReplaceAsync("MinimumSTR",
                                                          () => (ParentVehicle?.TotalBody ?? 3).ToString(
                                                              GlobalSettings.InvariantCultureInfo))
                                       .CheapReplaceAsync("MinimumAGI",
                                                          () => (ParentVehicle?.Pilot ?? 3).ToString(
                                                              GlobalSettings.InvariantCultureInfo));

                        object objProcess = CommonFunctions.EvaluateInvariantXPath(strMinRating, out bool blnIsSuccess);
                        intMinRating = blnIsSuccess ? ((double)objProcess).StandardRound() : 1;
                    }
                    await nudRating.DoThreadSafeAsync(x => x.Minimum = intMinRating);

                    string strMaxRating = xmlRatingNode.Value;
                    int    intMaxRating = 0;
                    // Not a simple integer, so we need to start mucking around with strings
                    if (!string.IsNullOrEmpty(strMaxRating) && !int.TryParse(strMaxRating, out intMaxRating))
                    {
                        strMaxRating = await strMaxRating
                                       .CheapReplaceAsync("MaximumSTR",
                                                          () => (ParentVehicle != null
                                                                        ? Math.Max(1, ParentVehicle.TotalBody * 2)
                                                                        : _objCharacter.STR.TotalMaximum)
                                                          .ToString(GlobalSettings.InvariantCultureInfo))
                                       .CheapReplaceAsync("MaximumAGI",
                                                          () => (ParentVehicle != null
                                                                        ? Math.Max(1, ParentVehicle.Pilot * 2)
                                                                        : _objCharacter.AGI.TotalMaximum)
                                                          .ToString(GlobalSettings.InvariantCultureInfo))
                                       .CheapReplaceAsync("MinimumSTR",
                                                          () => (ParentVehicle?.TotalBody ?? 3).ToString(
                                                              GlobalSettings.InvariantCultureInfo))
                                       .CheapReplaceAsync("MinimumAGI",
                                                          () => (ParentVehicle?.Pilot ?? 3).ToString(
                                                              GlobalSettings.InvariantCultureInfo));

                        object objProcess = CommonFunctions.EvaluateInvariantXPath(strMaxRating, out bool blnIsSuccess);
                        intMaxRating = blnIsSuccess ? ((double)objProcess).StandardRound() : 1;
                    }
                    await nudRating.DoThreadSafeAsync(x => x.Maximum = intMaxRating);

                    if (await chkHideOverAvailLimit.DoThreadSafeFuncAsync(x => x.Checked))
                    {
                        int intAvailModifier = strForceGrade == "None" ? 0 : _intAvailModifier;
                        await nudRating.DoThreadSafeAsync(x =>
                        {
                            while (x.Maximum > intMinRating &&
                                   !xmlDrug.CheckAvailRestriction(_objCharacter, x.MaximumAsInt,
                                                                  intAvailModifier))
                            {
                                --x.Maximum;
                            }
                        });
                    }

                    if (await chkShowOnlyAffordItems.DoThreadSafeFuncAsync(x => x.Checked) && !await chkFree.DoThreadSafeFuncAsync(x => x.Checked))
                    {
                        decimal decCostMultiplier = 1 + nudMarkup.Value / 100.0m;
                        if (await chkBlackMarketDiscount.DoThreadSafeFuncAsync(x => x.Checked))
                        {
                            decCostMultiplier *= 0.9m;
                        }
                        await nudRating.DoThreadSafeAsync(x =>
                        {
                            while (x.Maximum > intMinRating &&
                                   !xmlDrug.CheckNuyenRestriction(_objCharacter.Nuyen, decCostMultiplier,
                                                                  x.MaximumAsInt))
                            {
                                --x.Maximum;
                            }
                        });
                    }

                    await nudRating.DoThreadSafeAsync(x =>
                    {
                        x.Value   = x.Minimum;
                        x.Enabled = x.Minimum != x.Maximum;
                        x.Visible = true;
                    });

                    await lblRatingNALabel.DoThreadSafeAsync(x => x.Visible = false);

                    await lblRatingLabel.DoThreadSafeAsync(x => x.Visible = true);
                }
                else
                {
                    await lblRatingLabel.DoThreadSafeAsync(x => x.Visible = true);

                    await lblRatingNALabel.DoThreadSafeAsync(x => x.Visible = true);

                    await nudRating.DoThreadSafeAsync(x =>
                    {
                        x.Minimum = 0;
                        x.Value   = 0;
                        x.Visible = false;
                    });
                }

                string strSource = xmlDrug.SelectSingleNode("source")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                string strPage = (await xmlDrug.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? xmlDrug.SelectSingleNode("page")?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                 GlobalSettings.CultureInfo, _objCharacter);

                await objSource.SetControlAsync(lblSource);

                await lblSourceLabel.DoThreadSafeAsync(x => x.Visible = !string.IsNullOrEmpty(objSource.ToString()));

                Grade objForcedGrade = null;
                if (!string.IsNullOrEmpty(strForceGrade))
                {
                    // Force the Drug to be a particular Grade.
                    await cboGrade.DoThreadSafeAsync(x =>
                    {
                        if (x.Enabled)
                        {
                            x.Enabled = false;
                        }
                    });

                    objForcedGrade = _lstGrades.Find(x => x.Name == strForceGrade);
                    strForceGrade  = objForcedGrade?.SourceId.ToString("D", GlobalSettings.InvariantCultureInfo);
                }
                else
                {
                    await cboGrade.DoThreadSafeAsync(x => x.Enabled = !_blnLockGrade);

                    if (_blnLockGrade)
                    {
                        strForceGrade  = _objForcedGrade?.SourceId.ToString("D", GlobalSettings.InvariantCultureInfo) ?? cboGrade.SelectedValue?.ToString();
                        objForcedGrade = _objForcedGrade ?? _lstGrades.Find(x => x.SourceId.ToString("D", GlobalSettings.InvariantCultureInfo) == strForceGrade);
                    }
                }

                bool blnCanBlackMarketDiscount = _setBlackMarketMaps.Contains(xmlDrug.SelectSingleNode("category")?.Value);
                await chkBlackMarketDiscount.DoThreadSafeAsync(x =>
                {
                    x.Enabled = blnCanBlackMarketDiscount;
                    if (!x.Checked)
                    {
                        x.Checked = GlobalSettings.AssumeBlackMarket && blnCanBlackMarketDiscount;
                    }
                    else if (!blnCanBlackMarketDiscount)
                    {
                        //Prevent chkBlackMarketDiscount from being checked if the category doesn't match.
                        x.Checked = false;
                    }
                });

                // We may need to rebuild the Grade list since Cultured Bioware is not allowed to select Standard (Second-Hand) as Grade and ForceGrades can change.
                await PopulateGrades(xmlDrug.SelectSingleNode("nosecondhand") != null || !await cboGrade.DoThreadSafeFuncAsync(x => x.Enabled) && objForcedGrade?.SecondHand != true, false, strForceGrade);

                /*
                 * string strNotes = xmlDrug.SelectSingleNode("altnotes")?.Value ?? xmlDrug.SelectSingleNode("notes")?.Value;
                 * if (!string.IsNullOrEmpty(strNotes))
                 * {
                 *  await lblDrugNotesLabel.DoThreadSafeAsync(x => x.Visible = true);
                 *  await lblDrugNotes.DoThreadSafeAsync(x =>
                 *  {
                 *      x.Text = strNotes;
                 *      x.Visible = true;
                 *  });
                 * }
                 * else
                 * {
                 *  await lblDrugNotes.DoThreadSafeAsync(x => x.Visible = false);
                 *  await lblDrugNotesLabel.DoThreadSafeAsync(x => x.Visible = false);
                 * }*/
                await tlpRight.DoThreadSafeAsync(x => x.Visible = true);
            }
            else
            {
                await tlpRight.DoThreadSafeAsync(x => x.Visible = false);

                await cboGrade.DoThreadSafeAsync(x => x.Enabled = !_blnLockGrade);

                strForceGrade = string.Empty;
                Grade objForcedGrade = null;
                if (_blnLockGrade)
                {
                    strForceGrade = _objForcedGrade?.SourceId.ToString("D", GlobalSettings.InvariantCultureInfo) ?? await cboGrade.DoThreadSafeFuncAsync(x => x.SelectedValue?.ToString());

                    objForcedGrade = _objForcedGrade ?? _lstGrades.Find(x => x.SourceId.ToString("D", GlobalSettings.InvariantCultureInfo) == strForceGrade);
                }
                await PopulateGrades(_blnLockGrade && objForcedGrade?.SecondHand != true, false, strForceGrade);

                await chkBlackMarketDiscount.DoThreadSafeAsync(x => x.Checked = false);
            }
            _blnLoading = false;
            await UpdateDrugInfo();
        }
Пример #20
0
        private async void lstMartialArts_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_blnLoading)
            {
                return;
            }

            string strSelectedId = lstMartialArts.SelectedValue?.ToString();

            if (!string.IsNullOrEmpty(strSelectedId))
            {
                // Populate the Martial Arts list.
                XPathNavigator objXmlArt = _xmlBaseMartialArtsNode.SelectSingleNode("martialart[id = " + strSelectedId.CleanXPath() + ']');

                if (objXmlArt != null)
                {
                    lblKarmaCost.Text         = (await objXmlArt.SelectSingleNodeAndCacheExpressionAsync("cost"))?.Value ?? 7.ToString(GlobalSettings.CultureInfo);
                    lblKarmaCostLabel.Visible = !string.IsNullOrEmpty(lblKarmaCost.Text);

                    using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool, out StringBuilder sbdTechniques))
                    {
                        foreach (XPathNavigator xmlMartialArtsTechnique in await objXmlArt.SelectAndCacheExpressionAsync(
                                     "techniques/technique"))
                        {
                            string strLoopTechniqueName
                                = (await xmlMartialArtsTechnique.SelectSingleNodeAndCacheExpressionAsync("name"))?.Value
                                  ?? string.Empty;
                            if (!string.IsNullOrEmpty(strLoopTechniqueName))
                            {
                                XPathNavigator xmlTechniqueNode
                                    = _xmlBaseMartialArtsTechniquesNode.SelectSingleNode(
                                          "technique[name = " + strLoopTechniqueName.CleanXPath() + " and ("
                                          + _objCharacter.Settings.BookXPath() + ")]");
                                if (xmlTechniqueNode != null)
                                {
                                    if (sbdTechniques.Length > 0)
                                    {
                                        sbdTechniques.AppendLine(',');
                                    }
                                    sbdTechniques.Append(
                                        !GlobalSettings.Language.Equals(GlobalSettings.DefaultLanguage,
                                                                        StringComparison.OrdinalIgnoreCase)
                                            ? (await xmlTechniqueNode.SelectSingleNodeAndCacheExpressionAsync("translate"))?.Value
                                        ?? strLoopTechniqueName
                                            : strLoopTechniqueName);
                                }
                            }
                        }

                        lblIncludedTechniques.Text = sbdTechniques.ToString();
                    }

                    gpbIncludedTechniques.Visible = !string.IsNullOrEmpty(lblIncludedTechniques.Text);

                    string strSource = (await objXmlArt.SelectSingleNodeAndCacheExpressionAsync("source"))?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                    string strPage = (await objXmlArt.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? (await objXmlArt.SelectSingleNodeAndCacheExpressionAsync("page"))?.Value ?? await LanguageManager.GetStringAsync("String_Unknown");

                    SourceString objSourceString = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language, GlobalSettings.CultureInfo, _objCharacter);

                    await objSourceString.SetControlAsync(lblSource);

                    lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);
                    tlpRight.Visible       = true;
                }
                else
                {
                    tlpRight.Visible = false;
                    gpbIncludedTechniques.Visible = false;
                }
            }
            else
            {
                tlpRight.Visible = false;
                gpbIncludedTechniques.Visible = false;
            }
        }
Пример #21
0
        private async ValueTask <bool> BuildWeaponList(XmlNodeList objNodeList, bool blnForCategories = false)
        {
            SuspendLayout();
            if (tabControl.SelectedIndex == 1 && !blnForCategories)
            {
                DataTable tabWeapons = new DataTable("weapons");
                tabWeapons.Columns.Add("WeaponGuid");
                tabWeapons.Columns.Add("WeaponName");
                tabWeapons.Columns.Add("Dice");
                tabWeapons.Columns.Add("Accuracy");
                tabWeapons.Columns.Add("Damage");
                tabWeapons.Columns.Add("AP");
                tabWeapons.Columns.Add("RC");
                tabWeapons.Columns.Add("Ammo");
                tabWeapons.Columns.Add("Mode");
                tabWeapons.Columns.Add("Reach");
                tabWeapons.Columns.Add("Concealability");
                tabWeapons.Columns.Add("Accessories");
                tabWeapons.Columns.Add("Avail");
                tabWeapons.Columns["Avail"].DataType = typeof(AvailabilityValue);
                tabWeapons.Columns.Add("Source");
                tabWeapons.Columns["Source"].DataType = typeof(SourceString);
                tabWeapons.Columns.Add("Cost");
                tabWeapons.Columns["Cost"].DataType = typeof(NuyenString);

                bool    blnAnyRanged            = false;
                bool    blnAnyMelee             = false;
                XmlNode xmlParentWeaponDataNode = ParentWeapon != null?_objXmlDocument.SelectSingleNode("/chummer/weapons/weapon[id = " + ParentWeapon.SourceIDString.CleanXPath() + ']') : null;

                foreach (XmlNode objXmlWeapon in objNodeList)
                {
                    if (!objXmlWeapon.CreateNavigator().RequirementsMet(_objCharacter, ParentWeapon))
                    {
                        continue;
                    }

                    XmlNode xmlTestNode = objXmlWeapon.SelectSingleNode("forbidden/weapondetails");
                    if (xmlTestNode != null && xmlParentWeaponDataNode.ProcessFilterOperationNode(xmlTestNode, false))
                    {
                        // Assumes topmost parent is an AND node
                        continue;
                    }
                    xmlTestNode = objXmlWeapon.SelectSingleNode("required/weapondetails");
                    if (xmlTestNode != null && !xmlParentWeaponDataNode.ProcessFilterOperationNode(xmlTestNode, false))
                    {
                        // Assumes topmost parent is an AND node
                        continue;
                    }
                    if (objXmlWeapon["cyberware"]?.InnerText == bool.TrueString)
                    {
                        continue;
                    }
                    string strTest = objXmlWeapon["mount"]?.InnerText;
                    if (!string.IsNullOrEmpty(strTest) && !Mounts.Contains(strTest))
                    {
                        continue;
                    }
                    strTest = objXmlWeapon["extramount"]?.InnerText;
                    if (!string.IsNullOrEmpty(strTest) && !Mounts.Contains(strTest))
                    {
                        continue;
                    }
                    if (chkHideOverAvailLimit.Checked && !SelectionShared.CheckAvailRestriction(objXmlWeapon, _objCharacter))
                    {
                        continue;
                    }
                    if (!chkFreeItem.Checked && chkShowOnlyAffordItems.Checked)
                    {
                        decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m);
                        if (_setBlackMarketMaps.Contains(objXmlWeapon["category"]?.InnerText))
                        {
                            decCostMultiplier *= 0.9m;
                        }
                        if (!SelectionShared.CheckNuyenRestriction(objXmlWeapon, _objCharacter.Nuyen, decCostMultiplier))
                        {
                            continue;
                        }
                    }

                    using (Weapon objWeapon = new Weapon(_objCharacter))
                    {
                        objWeapon.Create(objXmlWeapon, null, true, false, true);
                        objWeapon.Parent = ParentWeapon;
                        if (objWeapon.RangeType == "Ranged")
                        {
                            blnAnyRanged = true;
                        }
                        else
                        {
                            blnAnyMelee = true;
                        }
                        string strID         = objWeapon.SourceIDString;
                        string strWeaponName = objWeapon.CurrentDisplayName;
                        string strDice       = objWeapon.DicePool.ToString(GlobalSettings.CultureInfo);
                        string strAccuracy   = objWeapon.DisplayAccuracy;
                        string strDamage     = objWeapon.DisplayDamage;
                        string strAP         = objWeapon.DisplayTotalAP;
                        if (strAP == "-")
                        {
                            strAP = "0";
                        }
                        string strRC      = objWeapon.DisplayTotalRC;
                        string strAmmo    = objWeapon.DisplayAmmo;
                        string strMode    = objWeapon.DisplayMode;
                        string strReach   = objWeapon.TotalReach.ToString(GlobalSettings.CultureInfo);
                        string strConceal = objWeapon.DisplayConcealability;
                        using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool,
                                                                       out StringBuilder sbdAccessories))
                        {
                            foreach (WeaponAccessory objAccessory in objWeapon.WeaponAccessories)
                            {
                                sbdAccessories.AppendLine(objAccessory.CurrentDisplayName);
                            }

                            if (sbdAccessories.Length > 0)
                            {
                                sbdAccessories.Length -= Environment.NewLine.Length;
                            }
                            AvailabilityValue objAvail  = objWeapon.TotalAvailTuple();
                            SourceString      strSource = await SourceString.GetSourceStringAsync(objWeapon.Source,
                                                                                                  await objWeapon.DisplayPageAsync(GlobalSettings.Language),
                                                                                                  GlobalSettings.Language,
                                                                                                  GlobalSettings.CultureInfo,
                                                                                                  _objCharacter);

                            NuyenString strCost = new NuyenString(objWeapon.DisplayCost(out decimal _));

                            tabWeapons.Rows.Add(strID, strWeaponName, strDice, strAccuracy, strDamage, strAP, strRC,
                                                strAmmo, strMode, strReach, strConceal, sbdAccessories.ToString(),
                                                objAvail,
                                                strSource, strCost);
                        }
                    }
                }

                DataSet set = new DataSet("weapons");
                set.Tables.Add(tabWeapons);
                if (blnAnyRanged)
                {
                    dgvWeapons.Columns[6].Visible = true;
                    dgvWeapons.Columns[7].Visible = true;
                    dgvWeapons.Columns[8].Visible = true;
                }
                else
                {
                    dgvWeapons.Columns[6].Visible = false;
                    dgvWeapons.Columns[7].Visible = false;
                    dgvWeapons.Columns[8].Visible = false;
                }
                dgvWeapons.Columns[9].Visible = blnAnyMelee;
                dgvWeapons.Columns[0].Visible = false;
                dgvWeapons.Columns[13].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                dgvWeapons.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dgvWeapons.DataSource       = set;
                dgvWeapons.DataMember       = "weapons";
            }
            else
            {
                using (new FetchSafelyFromPool <List <ListItem> >(Utils.ListItemListPool,
                                                                  out List <ListItem> lstWeapons))
                {
                    int     intOverLimit            = 0;
                    XmlNode xmlParentWeaponDataNode = ParentWeapon != null
                        ? _objXmlDocument.SelectSingleNode("/chummer/weapons/weapon[id = "
                                                           + ParentWeapon.SourceIDString.CleanXPath() + ']')
                        : null;

                    foreach (XmlNode objXmlWeapon in objNodeList)
                    {
                        if (!objXmlWeapon.CreateNavigator().RequirementsMet(_objCharacter, ParentWeapon))
                        {
                            continue;
                        }

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

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

                        if (objXmlWeapon["cyberware"]?.InnerText == bool.TrueString)
                        {
                            continue;
                        }

                        string strMount = objXmlWeapon["mount"]?.InnerText;
                        if (!string.IsNullOrEmpty(strMount) && !Mounts.Contains(strMount))
                        {
                            continue;
                        }

                        string strExtraMount = objXmlWeapon["extramount"]?.InnerText;
                        if (!string.IsNullOrEmpty(strExtraMount) && !Mounts.Contains(strExtraMount))
                        {
                            continue;
                        }

                        if (blnForCategories)
                        {
                            return(true);
                        }
                        if (chkHideOverAvailLimit.Checked &&
                            !SelectionShared.CheckAvailRestriction(objXmlWeapon, _objCharacter))
                        {
                            ++intOverLimit;
                            continue;
                        }

                        if (!chkFreeItem.Checked && chkShowOnlyAffordItems.Checked)
                        {
                            decimal decCostMultiplier = 1 + (nudMarkup.Value / 100.0m);
                            if (_setBlackMarketMaps.Contains(objXmlWeapon["category"]?.InnerText))
                            {
                                decCostMultiplier *= 0.9m;
                            }
                            if (!string.IsNullOrEmpty(ParentWeapon?.DoubledCostModificationSlots) &&
                                (!string.IsNullOrEmpty(strMount) || !string.IsNullOrEmpty(strExtraMount)))
                            {
                                string[] astrParentDoubledCostModificationSlots
                                    = ParentWeapon.DoubledCostModificationSlots.Split(
                                          '/', StringSplitOptions.RemoveEmptyEntries);
                                if (astrParentDoubledCostModificationSlots.Contains(strMount) ||
                                    astrParentDoubledCostModificationSlots.Contains(strExtraMount))
                                {
                                    decCostMultiplier *= 2;
                                }
                            }

                            if (!SelectionShared.CheckNuyenRestriction(
                                    objXmlWeapon, _objCharacter.Nuyen, decCostMultiplier))
                            {
                                ++intOverLimit;
                                continue;
                            }
                        }

                        lstWeapons.Add(new ListItem(objXmlWeapon["id"]?.InnerText,
                                                    objXmlWeapon["translate"]?.InnerText
                                                    ?? objXmlWeapon["name"]?.InnerText));
                    }

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

                    string strOldSelected = lstWeapon.SelectedValue?.ToString();
                    _blnLoading = true;
                    await lstWeapon.PopulateWithListItemsAsync(lstWeapons);

                    _blnLoading = false;
                    if (!string.IsNullOrEmpty(strOldSelected))
                    {
                        lstWeapon.SelectedValue = strOldSelected;
                    }
                    else
                    {
                        lstWeapon.SelectedIndex = -1;
                    }
                }
            }
            ResumeLayout();
            return(true);
        }
Пример #22
0
        private async ValueTask RefreshSelectedLifestyle()
        {
            if (_blnSkipRefresh)
            {
                return;
            }

            string strBaseLifestyle = cboBaseLifestyle.SelectedValue?.ToString() ?? string.Empty;

            _objLifestyle.BaseLifestyle = strBaseLifestyle;
            XPathNavigator xmlAspect = await _objLifestyle.GetNodeXPathAsync();

            if (xmlAspect != null)
            {
                string strSource = xmlAspect.SelectSingleNode("source")?.Value ?? string.Empty;
                string strPage   = (await xmlAspect.SelectSingleNodeAndCacheExpressionAsync("altpage"))?.Value ?? xmlAspect.SelectSingleNode("page")?.Value ?? string.Empty;
                if (!string.IsNullOrEmpty(strSource) && !string.IsNullOrEmpty(strPage))
                {
                    SourceString objSource = await SourceString.GetSourceStringAsync(strSource, strPage, GlobalSettings.Language,
                                                                                     GlobalSettings.CultureInfo, _objCharacter);

                    lblSource.Text = objSource.ToString();
                    await lblSource.SetToolTipAsync(objSource.LanguageBookTooltip);
                }
                else
                {
                    lblSource.Text = string.Empty;
                    await lblSource.SetToolTipAsync(string.Empty);
                }
            }
            else
            {
                lblSource.Text = string.Empty;
                await lblSource.SetToolTipAsync(string.Empty);
            }

            lblSourceLabel.Visible = !string.IsNullOrEmpty(lblSource.Text);

            // Characters with the Trust Fund Quality can have the lifestyle discounted.
            if (_objLifestyle.IsTrustFundEligible)
            {
                chkTrustFund.Visible = true;
                chkTrustFund.Checked = _objLifestyle.TrustFund;
            }
            else
            {
                chkTrustFund.Checked = false;
                chkTrustFund.Visible = false;
            }

            if (_objLifestyle.AllowBonusLP)
            {
                lblBonusLP.Visible          = true;
                nudBonusLP.Visible          = true;
                chkBonusLPRandomize.Visible = true;

                if (chkBonusLPRandomize.Checked)
                {
                    nudBonusLP.Enabled = false;
                    _blnSkipRefresh    = true;
                    nudBonusLP.Value   = await GlobalSettings.RandomGenerator.NextD6ModuloBiasRemovedAsync();

                    _blnSkipRefresh = false;
                }
                else
                {
                    nudBonusLP.Enabled = true;
                }
            }
            else
            {
                lblBonusLP.Visible          = false;
                nudBonusLP.Visible          = false;
                nudBonusLP.Value            = 0;
                chkBonusLPRandomize.Visible = false;
            }
        }