Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
 public static DialogResult Show(string text, string caption = null, MessageBoxButtons buttons = MessageBoxButtons.OK,
                                 MessageBoxIcon icon         = MessageBoxIcon.None, MessageBoxDefaultButton defButton = MessageBoxDefaultButton.Button1,
                                 MessageBoxOptions options   = 0)
 {
     using (ThreadSafeForm <ScrollableMessageBox> frmMessageBox
                = ThreadSafeForm <ScrollableMessageBox> .Get(() => new ScrollableMessageBox(text, caption, buttons, icon, defButton, options)))
         return(frmMessageBox.ShowDialog());
 }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
        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);
                }
            }
        }