private async void btnKnowledge_Click(object sender, EventArgs e) { if (_objCharacter.Created) { string strSelectedSkill; string strDescription = await LanguageManager.GetStringAsync("Label_Options_NewKnowledgeSkill"); using (ThreadSafeForm <SelectItem> form = await ThreadSafeForm <SelectItem> .GetAsync(() => new SelectItem { Description = strDescription })) { form.MyForm.SetDropdownItemsMode(_objCharacter.SkillsSection.MyDefaultKnowledgeSkills); if (await form.ShowDialogSafeAsync(_objCharacter) != DialogResult.OK) { return; } strSelectedSkill = form.MyForm.SelectedItem; } KnowledgeSkill skill = new KnowledgeSkill(_objCharacter) { WritableName = strSelectedSkill }; if (_objCharacter.SkillsSection.HasAvailableNativeLanguageSlots && (skill.IsLanguage || string.IsNullOrEmpty(skill.Type))) { DialogResult eDialogResult = Program.ShowMessageBox(this, string.Format(GlobalSettings.CultureInfo, await LanguageManager.GetStringAsync("Message_NewNativeLanguageSkill"), 1 + await ImprovementManager.ValueOfAsync( _objCharacter, Improvement.ImprovementType.NativeLanguageLimit), skill.WritableName), await LanguageManager.GetStringAsync("Tip_Skill_NativeLanguage"), MessageBoxButtons.YesNoCancel); switch (eDialogResult) { case DialogResult.Cancel: return; case DialogResult.Yes: { if (!skill.IsLanguage) { skill.Type = "Language"; } skill.IsNativeLanguage = true; break; } } } await _objCharacter.SkillsSection.KnowledgeSkills.AddAsync(skill); } else { await _objCharacter.SkillsSection.KnowledgeSkills.AddAsync(new KnowledgeSkill(_objCharacter)); } }
private async void cmdAddLimitModifier_Click(object sender, EventArgs e) { using (ThreadSafeForm <SelectLimitModifier> frmPickLimitModifier = await ThreadSafeForm <SelectLimitModifier> .GetAsync(() => new SelectLimitModifier(null, "Physical", "Mental", "Social"))) { if (await frmPickLimitModifier.ShowDialogSafeAsync(_objCharacter) == DialogResult.Cancel) { return; } // Create the new limit modifier. LimitModifier objLimitModifier = new LimitModifier(_objCharacter); objLimitModifier.Create(frmPickLimitModifier.MyForm.SelectedName, frmPickLimitModifier.MyForm.SelectedBonus, frmPickLimitModifier.MyForm.SelectedLimitType, frmPickLimitModifier.MyForm.SelectedCondition, true); if (objLimitModifier.InternalId.IsEmptyGuid()) { return; } await _objCharacter.LimitModifiers.AddAsync(objLimitModifier); } MakeDirtyWithCharacterUpdate?.Invoke(this, EventArgs.Empty); }
private async void btnExotic_Click(object sender, EventArgs e) { ExoticSkill objSkill; using (ThreadSafeForm <SelectExoticSkill> frmPickExoticSkill = await ThreadSafeForm <SelectExoticSkill> .GetAsync(() => new SelectExoticSkill(_objCharacter))) { if (await frmPickExoticSkill.ShowDialogSafeAsync(_objCharacter) != DialogResult.OK) { return; } objSkill = _objCharacter.SkillsSection.AddExoticSkill(frmPickExoticSkill.MyForm.SelectedExoticSkill, frmPickExoticSkill.MyForm.SelectedExoticSkillSpecialisation); } // Karma check needs to come after the skill is created to make sure bonus-based modifiers (e.g. JoAT) get applied properly (since they can potentially trigger off of the specific exotic skill target) if (_objCharacter.Created && objSkill.UpgradeKarmaCost > _objCharacter.Karma) { Program.ShowMessageBox(await LanguageManager.GetStringAsync("Message_NotEnoughKarma")); await _objCharacter.SkillsSection.Skills.RemoveAsync(objSkill); return; } objSkill.Upgrade(); }
/// <summary> /// Allows the user to input notes that should be linked to the selected object. /// TODO: Should be linked back to CharacterShared in some way or moved into a more generic helper class. /// </summary> /// <param name="objNotes"></param> /// <param name="treNode"></param> private async ValueTask WriteNotes(IHasNotes objNotes, TreeNode treNode) { using (ThreadSafeForm <EditNotes> frmItemNotes = await ThreadSafeForm <EditNotes> .GetAsync(() => new EditNotes(objNotes.Notes, objNotes.NotesColor))) { if (await frmItemNotes.ShowDialogSafeAsync(_objCharacter) != DialogResult.OK) { return; } objNotes.Notes = frmItemNotes.MyForm.Notes; objNotes.NotesColor = frmItemNotes.MyForm.NotesColor; } TreeView objTreeView = treNode.TreeView; if (objTreeView != null) { await objTreeView.DoThreadSafeAsync(() => { treNode.ForeColor = objNotes.PreferredColor; treNode.ToolTipText = objNotes.Notes.WordWrap(); }); } else { treNode.ForeColor = objNotes.PreferredColor; treNode.ToolTipText = objNotes.Notes.WordWrap(); } MakeDirty?.Invoke(this, EventArgs.Empty); }
private async void cmdAddPower_Click(object sender, EventArgs e) { // Open the Cyberware XML file and locate the selected piece. XmlDocument objXmlDocument = await _objCharacter.LoadDataAsync("powers.xml"); bool blnAddAgain; do { using (ThreadSafeForm <SelectPower> frmPickPower = await ThreadSafeForm <SelectPower> .GetAsync(() => new SelectPower(_objCharacter))) { // Make sure the dialogue window was not canceled. if (await frmPickPower.ShowDialogSafeAsync(_objCharacter) == DialogResult.Cancel) { break; } blnAddAgain = frmPickPower.MyForm.AddAgain; Power objPower = new Power(_objCharacter); XmlNode objXmlPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[id = " + frmPickPower.MyForm.SelectedPower.CleanXPath() + ']'); if (objPower.Create(objXmlPower)) { await _objCharacter.Powers.AddAsync(objPower); } } }while (blnAddAgain); }
private async void btnAddSpec_Click(object sender, EventArgs e) { int price = _objSkill.CharacterObject.Settings.KarmaKnowledgeSpecialization; decimal decExtraSpecCost = 0; int intTotalBaseRating = _objSkill.TotalBaseRating; decimal decSpecCostMultiplier = 1.0m; foreach (Improvement objLoopImprovement in _objSkill.CharacterObject.Improvements) { if (objLoopImprovement.Minimum <= intTotalBaseRating && (string.IsNullOrEmpty(objLoopImprovement.Condition) || (objLoopImprovement.Condition == "career") == _objSkill.CharacterObject.Created || (objLoopImprovement.Condition == "create") != _objSkill.CharacterObject.Created) && objLoopImprovement.Enabled && objLoopImprovement.ImprovedName == _objSkill.SkillCategory) { switch (objLoopImprovement.ImproveType) { case Improvement.ImprovementType.SkillCategorySpecializationKarmaCost: decExtraSpecCost += objLoopImprovement.Value; break; case Improvement.ImprovementType.SkillCategorySpecializationKarmaCostMultiplier: decSpecCostMultiplier *= objLoopImprovement.Value / 100.0m; break; } } } if (decSpecCostMultiplier != 1.0m) { price = (price * decSpecCostMultiplier + decExtraSpecCost).StandardRound(); } else { price += decExtraSpecCost.StandardRound(); //Spec } string confirmstring = string.Format(GlobalSettings.CultureInfo, await LanguageManager.GetStringAsync("Message_ConfirmKarmaExpenseSkillSpecialization"), price); if (!CommonFunctions.ConfirmKarmaExpense(confirmstring)) { return; } using (ThreadSafeForm <SelectSpec> selectForm = await ThreadSafeForm <SelectSpec> .GetAsync(() => new SelectSpec(_objSkill) { Mode = "Knowledge" })) { if (await selectForm.ShowDialogSafeAsync(_objSkill.CharacterObject) != DialogResult.OK) { return; } _objSkill.AddSpecialization(selectForm.MyForm.SelectedItem); } }
/// <summary> /// Edit and update a Limit Modifier. /// </summary> protected async ValueTask UpdateLimitModifier() { TreeNode objSelectedNode = await treLimit.DoThreadSafeFuncAsync(x => x.SelectedNode); if (objSelectedNode == null || objSelectedNode.Level <= 0) { return; } string strGuid = (objSelectedNode.Tag as IHasInternalId)?.InternalId ?? string.Empty; if (string.IsNullOrEmpty(strGuid) || strGuid.IsEmptyGuid()) { return; } LimitModifier objLimitModifier = _objCharacter.LimitModifiers.FindById(strGuid); //If the LimitModifier couldn't be found (Ie it comes from an Improvement or the user hasn't properly selected a treenode, fail out early. if (objLimitModifier == null) { Program.ShowMessageBox(await LanguageManager.GetStringAsync("Warning_NoLimitFound")); return; } using (ThreadSafeForm <SelectLimitModifier> frmPickLimitModifier = await ThreadSafeForm <SelectLimitModifier> .GetAsync(() => new SelectLimitModifier(objLimitModifier, "Physical", "Mental", "Social"))) { if (await frmPickLimitModifier.ShowDialogSafeAsync(_objCharacter) == DialogResult.Cancel) { return; } //Remove the old LimitModifier to ensure we don't double up. await _objCharacter.LimitModifiers.RemoveAsync(objLimitModifier); // Create the new limit modifier. objLimitModifier = new LimitModifier(_objCharacter, strGuid); objLimitModifier.Create(frmPickLimitModifier.MyForm.SelectedName, frmPickLimitModifier.MyForm.SelectedBonus, frmPickLimitModifier.MyForm.SelectedLimitType, frmPickLimitModifier.MyForm.SelectedCondition, true); await _objCharacter.LimitModifiers.AddAsync(objLimitModifier); } MakeDirtyWithCharacterUpdate?.Invoke(this, EventArgs.Empty); }
private async void tssLimitModifierNotes_Click(object sender, EventArgs e) { object objSelectedNodeTag = await treLimit.DoThreadSafeFuncAsync(x => x.SelectedNode?.Tag); if (objSelectedNodeTag == null) { return; } if (objSelectedNodeTag is IHasNotes objNotes) { await WriteNotes(objNotes, await treLimit.DoThreadSafeFuncAsync(x => x.SelectedNode)); } else { // the limit modifier has a source foreach (Improvement objImprovement in _objCharacter.Improvements) { if (objImprovement.ImproveType != Improvement.ImprovementType.LimitModifier || objImprovement.SourceName != objSelectedNodeTag.ToString()) { continue; } using (ThreadSafeForm <EditNotes> frmItemNotes = await ThreadSafeForm <EditNotes> .GetAsync(() => new EditNotes(objImprovement.Notes, objImprovement.NotesColor))) { if (await frmItemNotes.ShowDialogSafeAsync(_objCharacter) != DialogResult.OK) { continue; } objImprovement.Notes = frmItemNotes.MyForm.Notes; } await treLimit.DoThreadSafeAsync(x => { x.SelectedNode.ForeColor = objImprovement.PreferredColor; x.SelectedNode.ToolTipText = objImprovement.Notes.WordWrap(); }); MakeDirty?.Invoke(this, EventArgs.Empty); } } }