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