public frmCareer(Character objCharacter) { _objCharacter = objCharacter; _objOptions = _objCharacter.Options; _objFunctions = new CommonFunctions(_objCharacter); _objFunctions.ContextMenuArmor = cmsArmor; _objFunctions.ContextMenuArmorMod = cmsArmorMod; _objFunctions.ContextMenuCyberware = cmsCyberware; _objFunctions.ContextMenuGear = cmsGear; _objFunctions.ContextMenuVehicle = cmsVehicle; _objFunctions.ContextMenuVehicleMod = cmsVehicle; _objFunctions.ContextMenuWeapon = cmsWeapon; _objFunctions.ContextMenuWeaponAccessory = cmsWeaponAccessoryGear; _objFunctions.ContextMenuWeaponMod = cmsWeaponMod; _objImprovementManager = new ImprovementManager(_objCharacter); _objController = new MainController(_objCharacter); InitializeComponent(); // Add EventHandlers for the MAG and RES enabled events and tab enabled events. _objCharacter.MAGEnabledChanged += objCharacter_MAGEnabledChanged; _objCharacter.RESEnabledChanged += objCharacter_RESEnabledChanged; _objCharacter.AdeptTabEnabledChanged += objCharacter_AdeptTabEnabledChanged; _objCharacter.MagicianTabEnabledChanged += objCharacter_MagicianTabEnabledChanged; _objCharacter.TechnomancerTabEnabledChanged += objCharacter_TechnomancerTabEnabledChanged; _objCharacter.CritterTabEnabledChanged += objCharacter_CritterTabEnabledChanged; _objCharacter.BlackMarketEnabledChanged += objCharacter_BlackMarketChanged; _objCharacter.SensitiveSystemChanged += objCharacter_SensitiveSystemChanged; _objCharacter.UneducatedChanged += objCharacter_UneducatedChanged; _objCharacter.UncouthChanged += objCharacter_UncouthChanged; _objCharacter.InfirmChanged += objCharacter_InfirmChanged; GlobalOptions.Instance.MRUChanged += PopulateMRU; LanguageManager.Instance.Load(this); // Update the text in the Menus so they can be merged with frmMain properly. foreach (ToolStripMenuItem objItem in mnuCreateMenu.Items.OfType<ToolStripMenuItem>()) { if (objItem.Tag != null) { objItem.Text = LanguageManager.Instance.GetString(objItem.Tag.ToString()); } } _lvwKarmaColumnSorter = new ListViewColumnSorter(); _lvwKarmaColumnSorter.SortColumn = 0; _lvwKarmaColumnSorter.Order = SortOrder.Descending; lstKarma.ListViewItemSorter = _lvwKarmaColumnSorter; _lvwNuyenColumnSorter = new ListViewColumnSorter(); _lvwNuyenColumnSorter.SortColumn = 0; _lvwNuyenColumnSorter.Order = SortOrder.Descending; lstNuyen.ListViewItemSorter = _lvwNuyenColumnSorter; SetTooltips(); MoveControls(); }
public frmCreate(Character objCharacter) { _objCharacter = objCharacter; _objOptions = _objCharacter.Options; _objFunctions = new CommonFunctions(_objCharacter); _objImprovementManager = new ImprovementManager(_objCharacter); _objController = new MainController(_objCharacter); InitializeComponent(); // Add EventHandlers for the various events MAG, RES, Qualities, etc. _objCharacter.MAGEnabledChanged += objCharacter_MAGEnabledChanged; _objCharacter.RESEnabledChanged += objCharacter_RESEnabledChanged; _objCharacter.AdeptTabEnabledChanged += objCharacter_AdeptTabEnabledChanged; _objCharacter.MagicianTabEnabledChanged += objCharacter_MagicianTabEnabledChanged; _objCharacter.TechnomancerTabEnabledChanged += objCharacter_TechnomancerTabEnabledChanged; _objCharacter.InitiationTabEnabledChanged += objCharacter_InitiationTabEnabledChanged; _objCharacter.CritterTabEnabledChanged += objCharacter_CritterTabEnabledChanged; _objCharacter.BlackMarketEnabledChanged += objCharacter_BlackMarketDiscountChanged; _objCharacter.SkillsSection.UneducatedChanged += objCharacter_UneducatedChanged; _objCharacter.SkillsSection.UncouthChanged += objCharacter_UncouthChanged; _objCharacter.FriendsInHighPlacesChanged += objCharacter_FriendsInHighPlacesChanged; _objCharacter.SkillsSection.SchoolOfHardKnocksChanged += objCharacter_SchoolOfHardKnocksChanged; _objCharacter.ExConChanged += objCharacter_ExConChanged; _objCharacter.TrustFundChanged += objCharacter_TrustFundChanged; _objCharacter.SkillsSection.TechSchoolChanged += objCharacter_TechSchoolChanged; _objCharacter.RestrictedGearChanged += objCharacter_RestrictedGearChanged; _objCharacter.OverclockerChanged += objCharacter_OverclockerChanged; _objCharacter.MadeManChanged += objCharacter_MadeManChanged; _objCharacter.SkillsSection.LinguistChanged += objCharacter_LinguistChanged; _objCharacter.LightningReflexesChanged += objCharacter_LightningReflexesChanged; _objCharacter.FameChanged += objCharacter_FameChanged; _objCharacter.BornRichChanged += objCharacter_BornRichChanged; _objCharacter.ErasedChanged += objCharacter_ErasedChanged; tabSkillUc.ChildPropertyChanged += SkillPropertyChanged; GlobalOptions.Instance.MRUChanged += PopulateMRU; LanguageManager.Instance.Load(GlobalOptions.Instance.Language, this); // Update the text in the Menus so they can be merged with frmMain properly. foreach (ToolStripMenuItem objItem in mnuCreateMenu.Items.OfType<ToolStripMenuItem>()) { if (objItem.Tag != null) { objItem.Text = LanguageManager.Instance.GetString(objItem.Tag.ToString()); } } SetTooltips(); MoveControls(); }
public frmCareer(Character objCharacter) { _objCharacter = objCharacter; _objOptions = _objCharacter.Options; _objFunctions = new CommonFunctions(_objCharacter); _objImprovementManager = new ImprovementManager(_objCharacter); _objController = new MainController(_objCharacter); InitializeComponent(); // Add EventHandlers for the MAG and RES enabled events and tab enabled events. _objCharacter.MAGEnabledChanged += objCharacter_MAGEnabledChanged; _objCharacter.RESEnabledChanged += objCharacter_RESEnabledChanged; _objCharacter.AdeptTabEnabledChanged += objCharacter_AdeptTabEnabledChanged; _objCharacter.MagicianTabEnabledChanged += objCharacter_MagicianTabEnabledChanged; _objCharacter.TechnomancerTabEnabledChanged += objCharacter_TechnomancerTabEnabledChanged; _objCharacter.CritterTabEnabledChanged += objCharacter_CritterTabEnabledChanged; _objCharacter.SkillsSection.UneducatedChanged += objCharacter_UneducatedChanged; _objCharacter.SkillsSection.UncouthChanged += objCharacter_UncouthChanged; _objCharacter.FameChanged += objCharacter_FameChanged; tabSkillsUc.ChildPropertyChanged += SkillPropertyChanged; GlobalOptions.Instance.MRUChanged += PopulateMRU; LanguageManager.Instance.Load(GlobalOptions.Instance.Language, this); // Update the text in the Menus so they can be merged with frmMain properly. foreach (ToolStripMenuItem objItem in mnuCreateMenu.Items.OfType<ToolStripMenuItem>()) { if (objItem.Tag != null) { objItem.Text = LanguageManager.Instance.GetString(objItem.Tag.ToString()); } } _lvwKarmaColumnSorter = new ListViewColumnSorter(); _lvwKarmaColumnSorter.SortColumn = 0; _lvwKarmaColumnSorter.Order = SortOrder.Descending; lstKarma.ListViewItemSorter = _lvwKarmaColumnSorter; _lvwNuyenColumnSorter = new ListViewColumnSorter(); _lvwNuyenColumnSorter.SortColumn = 0; _lvwNuyenColumnSorter.Order = SortOrder.Descending; lstNuyen.ListViewItemSorter = _lvwNuyenColumnSorter; SetTooltips(); MoveControls(); }
public frmCreate(Character objCharacter) { _objCharacter = objCharacter; _objOptions = _objCharacter.Options; _objFunctions = new CommonFunctions(_objCharacter); _objImprovementManager = new ImprovementManager(_objCharacter); _objController = new MainController(_objCharacter); InitializeComponent(); // Add EventHandlers for the MAG and RES enabled events and tab enabled events. _objCharacter.MAGEnabledChanged += objCharacter_MAGEnabledChanged; _objCharacter.RESEnabledChanged += objCharacter_RESEnabledChanged; _objCharacter.AdeptTabEnabledChanged += objCharacter_AdeptTabEnabledChanged; _objCharacter.MagicianTabEnabledChanged += objCharacter_MagicianTabEnabledChanged; _objCharacter.TechnomancerTabEnabledChanged += objCharacter_TechnomancerTabEnabledChanged; _objCharacter.InitiationTabEnabledChanged += objCharacter_InitiationTabEnabledChanged; _objCharacter.CritterTabEnabledChanged += objCharacter_CritterTabEnabledChanged; _objCharacter.BlackMarketEnabledChanged += objCharacter_BlackMarketChanged; _objCharacter.UneducatedChanged += objCharacter_UneducatedChanged; _objCharacter.UncouthChanged += objCharacter_UncouthChanged; _objCharacter.InfirmChanged += objCharacter_InfirmChanged; GlobalOptions.Instance.MRUChanged += PopulateMRU; LanguageManager.Instance.Load(GlobalOptions.Instance.Language, this); // Update the text in the Menus so they can be merged with frmMain properly. foreach (ToolStripMenuItem objItem in mnuCreateMenu.Items.OfType<ToolStripMenuItem>()) { if (objItem.Tag != null) { objItem.Text = LanguageManager.Instance.GetString(objItem.Tag.ToString()); } } SetTooltips(); MoveControls(); }
/// <summary> /// Character. /// </summary> public Character() { _attBOD._objCharacter = this; _attAGI._objCharacter = this; _attREA._objCharacter = this; _attSTR._objCharacter = this; _attCHA._objCharacter = this; _attINT._objCharacter = this; _attLOG._objCharacter = this; _attWIL._objCharacter = this; _attINI._objCharacter = this; _attEDG._objCharacter = this; _attMAG._objCharacter = this; _attRES._objCharacter = this; _attESS._objCharacter = this; _objImprovementManager = new ImprovementManager(this); }
/// <summary> /// Recursive method to delete a piece of Gear and its Improvements from the character. /// </summary> /// <param name="objGear">Gear to delete.</param> /// <param name="treWeapons">TreeView that holds the list of Weapons.</param> /// <param name="objImprovementManager">Improvement Manager the character is using.</param> public void DeleteGear(Gear objGear, TreeView treWeapons, ImprovementManager objImprovementManager) { // Remove any children the Gear may have. foreach (Gear objChild in objGear.Children) DeleteGear(objChild, treWeapons, objImprovementManager); // Remove the Gear Weapon created by the Gear if applicable. if (objGear.WeaponID != Guid.Empty.ToString()) { // Remove the Weapon from the TreeView. TreeNode objRemoveNode = new TreeNode(); foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes) { if (objWeaponNode.Tag.ToString() == objGear.WeaponID) objRemoveNode = objWeaponNode; } treWeapons.Nodes.Remove(objRemoveNode); // Remove the Weapon from the Character. Weapon objRemoveWeapon = new Weapon(_objCharacter); foreach (Weapon objWeapon in _objCharacter.Weapons) { if (objWeapon.InternalId == objGear.WeaponID) objRemoveWeapon = objWeapon; } _objCharacter.Weapons.Remove(objRemoveWeapon); } objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Gear, objGear.InternalId); // If a Focus is being removed, make sure the actual Focus is being removed from the character as well. if (objGear.Category == "Foci" || objGear.Category == "Metamagic Foci") { List<Focus> lstRemoveFoci = new List<Focus>(); foreach (Focus objFocus in _objCharacter.Foci) { if (objFocus.GearId == objGear.InternalId) lstRemoveFoci.Add(objFocus); } foreach (Focus objFocus in lstRemoveFoci) _objCharacter.Foci.Remove(objFocus); } // If a Stacked Focus is being removed, make sure the Stacked Foci and its bonuses are being removed. if (objGear.Category == "Stacked Focus") { foreach (StackedFocus objStack in _objCharacter.StackedFoci) { if (objStack.GearId == objGear.InternalId) { objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.StackedFocus, objStack.InternalId); _objCharacter.StackedFoci.Remove(objStack); break; } } } }
/// Create a Skill Limit Modifier from an XmlNode and return the TreeNodes for it. /// <param name="objXmlAdvantageNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> public void Create(XmlNode objXmlLimitModifierNode, Character objCharacter, TreeNode objNode) { _strName = objXmlLimitModifierNode["name"].InnerText; if (objXmlLimitModifierNode["bonus"] != null) { ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.MartialArtAdvantage, _guiID.ToString(), objXmlLimitModifierNode["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } } objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); }
/// Create a Metamagic from an XmlNode and return the TreeNodes for it. /// <param name="objXmlMetamagicNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="objSource">Source of the Improvement.</param> public void Create(XmlNode objXmlMetamagicNode, Character objCharacter, TreeNode objNode, Improvement.ImprovementSource objSource) { _strName = objXmlMetamagicNode["name"].InnerText; _strSource = objXmlMetamagicNode["source"].InnerText; _strPage = objXmlMetamagicNode["page"].InnerText; _objImprovementSource = objSource; try { _intGrade = Convert.ToInt32(objXmlMetamagicNode["grade"].InnerText); } catch { } if (objXmlMetamagicNode.InnerXml.Contains("<bonus>")) { _nodBonus = objXmlMetamagicNode["bonus"]; int intRating = 1; if (_objCharacter.SubmersionGrade > 0) intRating = _objCharacter.SubmersionGrade; else intRating = _objCharacter.InitiateGrade; ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); if (!objImprovementManager.CreateImprovements(objSource, _guiID.ToString(), _nodBonus, true, intRating, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") _strName += " (" + objImprovementManager.SelectedValue + ")"; } LanguageManager.Instance.Load(GlobalOptions.Instance.Language, null); if (_objCharacter.SubmersionGrade > 0) objNode.Text = LanguageManager.Instance.GetString("Label_Echo") + " " + DisplayName; else objNode.Text = LanguageManager.Instance.GetString("Label_Metamagic") + " " + DisplayName; objNode.Tag = _guiID.ToString(); }
/// <summary> /// Create a Quality from an XmlNode and return the TreeNodes for it. /// </summary> /// <param name="objXmlQuality">XmlNode to create the object from.</param> /// <param name="objCharacter">Character object the Quality will be added to.</param> /// <param name="objQualitySource">Source of the Quality.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="objWeapons">List of Weapons that should be added to the Character.</param> /// <param name="objWeaponNodes">List of TreeNodes to represent the Weapons added.</param> /// <param name="strForceValue">Force a value to be selected for the Quality.</param> public virtual void Create(XmlNode objXmlQuality, Character objCharacter, QualitySource objQualitySource, TreeNode objNode, List<Weapon> objWeapons, List<TreeNode> objWeaponNodes, string strForceValue = "") { _strName = objXmlQuality["name"].InnerText; if (objXmlQuality["metagenetic"] != null) { _strMetagenetic = objXmlQuality["metagenetic"].InnerText; } // Check for a Variable Cost. if (objXmlQuality["karma"].InnerText.StartsWith("Variable")) { int intMin = 0; int intMax = 0; string strCost = objXmlQuality["karma"].InnerText.Replace("Variable(", string.Empty).Replace(")", string.Empty); if (strCost.Contains("-")) { string[] strValues = strCost.Split('-'); intMin = Convert.ToInt32(strValues[0]); intMax = Convert.ToInt32(strValues[1]); } else intMin = Convert.ToInt32(strCost.Replace("+", string.Empty)); if (intMin != 0 || intMax != 0) { frmSelectNumber frmPickNumber = new frmSelectNumber(); if (intMax == 0) intMax = 1000000; frmPickNumber.Minimum = intMin; frmPickNumber.Maximum = intMax; frmPickNumber.Description = LanguageManager.Instance.GetString("String_SelectVariableCost").Replace("{0}", DisplayNameShort); frmPickNumber.AllowCancel = false; frmPickNumber.ShowDialog(); _intBP = frmPickNumber.SelectedValue; } } else { _intBP = Convert.ToInt32(objXmlQuality["karma"].InnerText); } if (objXmlQuality["lp"] != null) { _intLP = Convert.ToInt32(objXmlQuality["lp"].InnerText); } _objQualityType = ConvertToQualityType(objXmlQuality["category"].InnerText); _objQualitySource = objQualitySource; if (objXmlQuality["print"] != null) { if (objXmlQuality["print"].InnerText == "no") _blnPrint = false; } if (objXmlQuality["implemented"] != null) { if (objXmlQuality["implemented"].InnerText == "False") _blnImplemented = false; } if (objXmlQuality["contributetolimit"] != null) { if (objXmlQuality["contributetolimit"].InnerText == "no") _blnContributeToLimit = false; } _strSource = objXmlQuality["source"].InnerText; _strPage = objXmlQuality["page"].InnerText; if (objXmlQuality["mutant"] != null) _strMutant = "yes"; if (_objQualityType == QualityType.LifeModule) { objXmlQuality.TryGetField("stage", out _stage); } if(objXmlQuality["id"] != null) _qualiyGuid = Guid.Parse(objXmlQuality["id"].InnerText); if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("qualities.xml"); XmlNode objQualityNode = objXmlDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + _strName + "\"]"); if (objQualityNode != null) { if (objQualityNode["translate"] != null) _strAltName = objQualityNode["translate"].InnerText; if (objQualityNode["altpage"] != null) _strAltPage = objQualityNode["altpage"].InnerText; } } // Add Weapons if applicable. if (objXmlQuality.InnerXml.Contains("<addweapon>")) { XmlDocument objXmlWeaponDocument = XmlManager.Instance.Load("weapons.xml"); // More than one Weapon can be added, so loop through all occurrences. foreach (XmlNode objXmlAddWeapon in objXmlQuality.SelectNodes("addweapon")) { XmlNode objXmlWeapon = objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + objXmlAddWeapon.InnerText + "\" and starts-with(category, \"Quality\")]"); TreeNode objGearWeaponNode = new TreeNode(); Weapon objGearWeapon = new Weapon(objCharacter); objGearWeapon.Create(objXmlWeapon, objCharacter, objGearWeaponNode, null, null, null); objGearWeaponNode.ForeColor = SystemColors.GrayText; objWeaponNodes.Add(objGearWeaponNode); objWeapons.Add(objGearWeapon); _guiWeaponID = Guid.Parse(objGearWeapon.InternalId); } } if (objXmlQuality.InnerXml.Contains("<naturalweapons>")) { foreach (XmlNode objXmlNaturalWeapon in objXmlQuality["naturalweapons"].SelectNodes("naturalweapon")) { TreeNode objGearWeaponNode = new TreeNode(); Weapon objWeapon = new Weapon(_objCharacter); objWeapon.Name = objXmlNaturalWeapon["name"].InnerText; objWeapon.Category = LanguageManager.Instance.GetString("Tab_Critter"); objWeapon.WeaponType = "Melee"; objWeapon.Reach = Convert.ToInt32(objXmlNaturalWeapon["reach"].InnerText); objWeapon.Damage = objXmlNaturalWeapon["damage"].InnerText; ; objWeapon.AP = objXmlNaturalWeapon["ap"].InnerText; ; objWeapon.Mode = "0"; objWeapon.RC = "0"; objWeapon.Concealability = 0; objWeapon.Avail = "0"; objWeapon.Cost = 0; objWeapon.UseSkill = objXmlNaturalWeapon["useskill"].InnerText; objWeapon.Source = objXmlNaturalWeapon["source"].InnerText; objWeapon.Page = objXmlNaturalWeapon["page"].InnerText; objGearWeaponNode.ForeColor = SystemColors.GrayText; objGearWeaponNode.Text = objWeapon.Name; objGearWeaponNode.Tag = objWeapon.InternalId; objWeaponNodes.Add(objGearWeaponNode); _objCharacter.Weapons.Add(objWeapon); } } // If the item grants a bonus, pass the information to the Improvement Manager. if (objXmlQuality.InnerXml.Contains("<bonus>")) { ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); objImprovementManager.ForcedValue = strForceValue; if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Quality, _guiID.ToString(), objXmlQuality["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; objNode.Text += " (" + objImprovementManager.SelectedValue + ")"; } } // Metatype Qualities appear as grey text to show that they cannot be removed. if (objQualitySource == QualitySource.Metatype || objQualitySource == QualitySource.MetatypeRemovable) objNode.ForeColor = SystemColors.GrayText; objNode.Text = DisplayName; objNode.Tag = InternalId; }
/// <summary> /// Create a Quality from an XmlNode and return the TreeNodes for it. /// </summary> /// <param name="objXmlQuality">XmlNode to create the object from.</param> /// <param name="objCharacter">Character object the Quality will be added to.</param> /// <param name="objQualitySource">Source of the Quality.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="objWeapons">List of Weapons that should be added to the Character.</param> /// <param name="objWeaponNodes">List of TreeNodes to represent the Weapons added.</param> /// <param name="strForceValue">Force a value to be selected for the Quality.</param> public void Create(XmlNode objXmlQuality, Character objCharacter, QualitySource objQualitySource, TreeNode objNode, List<Weapon> objWeapons, List<TreeNode> objWeaponNodes, string strForceValue = "") { _strName = objXmlQuality["name"].InnerText; _intBP = Convert.ToInt32(objXmlQuality["karma"].InnerText); _objQualityType = ConvertToQualityType(objXmlQuality["category"].InnerText); _objQualitySource = objQualitySource; if (objXmlQuality["print"] != null) { if (objXmlQuality["print"].InnerText == "no") _blnPrint = false; } if (objXmlQuality["contributetolimit"] != null) { if (objXmlQuality["contributetolimit"].InnerText == "no") _blnContributeToLimit = false; } _strSource = objXmlQuality["source"].InnerText; _strPage = objXmlQuality["page"].InnerText; if (objXmlQuality["mutant"] != null) _strMutant = "yes"; if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("qualities.xml"); XmlNode objQualityNode = objXmlDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + _strName + "\"]"); if (objQualityNode != null) { if (objQualityNode["translate"] != null) _strAltName = objQualityNode["translate"].InnerText; if (objQualityNode["altpage"] != null) _strAltPage = objQualityNode["altpage"].InnerText; } } // Add Weapons if applicable. if (objXmlQuality.InnerXml.Contains("<addweapon>")) { XmlDocument objXmlWeaponDocument = XmlManager.Instance.Load("weapons.xml"); // More than one Weapon can be added, so loop through all occurrences. foreach (XmlNode objXmlAddWeapon in objXmlQuality.SelectNodes("addweapon")) { XmlNode objXmlWeapon = objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + objXmlAddWeapon.InnerText + "\" and starts-with(category, \"Quality\")]"); TreeNode objGearWeaponNode = new TreeNode(); Weapon objGearWeapon = new Weapon(objCharacter); objGearWeapon.Create(objXmlWeapon, objCharacter, objGearWeaponNode, null, null, null); objGearWeaponNode.ForeColor = SystemColors.GrayText; objWeaponNodes.Add(objGearWeaponNode); objWeapons.Add(objGearWeapon); _guiWeaponID = Guid.Parse(objGearWeapon.InternalId); } } // If the item grants a bonus, pass the information to the Improvement Manager. if (objXmlQuality.InnerXml.Contains("<bonus>")) { ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); objImprovementManager.ForcedValue = strForceValue; if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Quality, _guiID.ToString(), objXmlQuality["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; objNode.Text += " (" + objImprovementManager.SelectedValue + ")"; } } // Metatype Qualities appear as grey text to show that they cannot be removed. if (objQualitySource == QualitySource.Metatype || objQualitySource == QualitySource.MetatypeRemovable) objNode.ForeColor = SystemColors.GrayText; objNode.Text = DisplayName; objNode.Tag = InternalId; }
/// <summary> /// A Metatype has been selected, so fill in all of the necessary Character information. /// </summary> void MetatypeSelected() { if (lstMetatypes.Text != "") { ImprovementManager objImprovementManager = new ImprovementManager(_objCharacter); XmlDocument objXmlDocument = XmlManager.Instance.Load(_strXmlFile); XmlNode objXmlMetatype = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + lstMetatypes.SelectedValue + "\"]"); XmlNode objXmlMetavariant = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + lstMetatypes.SelectedValue + "\"]/metavariants/metavariant[name = \"" + cboMetavariant.SelectedValue + "\"]"); int intForce = 0; if (nudForce.Visible) intForce = Convert.ToInt32(nudForce.Value); // Set Metatype information. if (cboMetavariant.SelectedValue.ToString() != "None") { _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetavariant["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["bodaug"].InnerText, intForce, 0)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetavariant["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["agiaug"].InnerText, intForce, 0)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetavariant["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["reaaug"].InnerText, intForce, 0)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetavariant["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["straug"].InnerText, intForce, 0)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetavariant["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["chaaug"].InnerText, intForce, 0)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetavariant["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["intaug"].InnerText, intForce, 0)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetavariant["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["logaug"].InnerText, intForce, 0)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetavariant["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["wilaug"].InnerText, intForce, 0)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetavariant["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetavariant["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["magaug"].InnerText, intForce, 0)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetavariant["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["resaug"].InnerText, intForce, 0)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetavariant["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["edgaug"].InnerText, intForce, 0)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetavariant["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["essaug"].InnerText, intForce, 0)); } else if (_strXmlFile != "critters.xml" || lstMetatypes.SelectedValue.ToString() == "Ally Spirit") { _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodaug"].InnerText, intForce, 0)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agiaug"].InnerText, intForce, 0)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reaaug"].InnerText, intForce, 0)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["straug"].InnerText, intForce, 0)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chaaug"].InnerText, intForce, 0)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intaug"].InnerText, intForce, 0)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logaug"].InnerText, intForce, 0)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilaug"].InnerText, intForce, 0)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magaug"].InnerText, intForce, 0)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resaug"].InnerText, intForce, 0)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgaug"].InnerText, intForce, 0)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } else { int intMinModifier = -3; if (cboCategory.SelectedValue.ToString() == "Mutant Critters") intMinModifier = 0; _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } // If we're working with a Critter, set the Attributes to their default values. if (_strXmlFile == "critters.xml") { _objCharacter.BOD.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0)); _objCharacter.AGI.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0)); _objCharacter.REA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0)); _objCharacter.STR.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0)); _objCharacter.CHA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0)); _objCharacter.INT.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0)); _objCharacter.LOG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0)); _objCharacter.WIL.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0)); _objCharacter.MAG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0)); _objCharacter.RES.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0)); _objCharacter.EDG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0)); _objCharacter.ESS.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0)); } // Sprites can never have Physical Attributes or WIL. if (lstMetatypes.SelectedValue.ToString().EndsWith("Sprite")) { _objCharacter.BOD.AssignLimits("0", "0", "0"); _objCharacter.AGI.AssignLimits("0", "0", "0"); _objCharacter.REA.AssignLimits("0", "0", "0"); _objCharacter.STR.AssignLimits("0", "0", "0"); _objCharacter.WIL.AssignLimits("0", "0", "0"); _objCharacter.INI.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); _objCharacter.INI.MetatypeMaximum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); } // If this is a Shapeshifter, a Metavariant must be selected. Default to Human if None is selected. if (cboCategory.SelectedValue.ToString() == "Shapeshifter" && cboMetavariant.SelectedValue.ToString() == "None") cboMetavariant.SelectedValue = "Human"; _objCharacter.Metatype = lstMetatypes.SelectedValue.ToString(); _objCharacter.MetatypeCategory = cboCategory.SelectedValue.ToString(); if (cboMetavariant.SelectedValue.ToString() == "None") { _objCharacter.Metavariant = ""; _objCharacter.MetatypeBP = Convert.ToInt32(lblBP.Text); } else { _objCharacter.Metavariant = cboMetavariant.SelectedValue.ToString(); _objCharacter.MetatypeBP = Convert.ToInt32(lblMetavariantBP.Text); } if (objXmlMetatype["movement"] != null) _objCharacter.Movement = objXmlMetatype["movement"].InnerText; // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Instance.Load("qualities.xml"); if (cboMetavariant.SelectedValue.ToString() == "None") { // Determine if the Metatype has any bonuses. if (objXmlMetatype.InnerXml.Contains("bonus")) objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metatype, lstMetatypes.SelectedValue.ToString(), objXmlMetatype.SelectSingleNode("bonus"), false, 1, lstMetatypes.SelectedValue.ToString()); // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } } // If a Metavariant has been selected, locate it in the file. if (cboMetavariant.SelectedValue.ToString() != "None") { // Determine if the Metavariant has any bonuses. if (objXmlMetavariant.InnerXml.Contains("bonus")) { objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metavariant, cboMetavariant.SelectedValue.ToString(), objXmlMetavariant.SelectSingleNode("bonus"), false, 1, cboMetavariant.SelectedValue.ToString()); } // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetavariant.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } foreach (XmlNode objXmlQualityItem in objXmlMetavariant.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } } // Run through the character's Attributes one more time and make sure their value matches their minimum value. if (_strXmlFile == "metatypes.xml") { _objCharacter.BOD.Value = _objCharacter.BOD.TotalMinimum; _objCharacter.AGI.Value = _objCharacter.AGI.TotalMinimum; _objCharacter.REA.Value = _objCharacter.REA.TotalMinimum; _objCharacter.STR.Value = _objCharacter.STR.TotalMinimum; _objCharacter.CHA.Value = _objCharacter.CHA.TotalMinimum; _objCharacter.INT.Value = _objCharacter.INT.TotalMinimum; _objCharacter.LOG.Value = _objCharacter.LOG.TotalMinimum; _objCharacter.WIL.Value = _objCharacter.WIL.TotalMinimum; } // Add any Critter Powers the Metatype/Critter should have. XmlNode objXmlCritter = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _objCharacter.Metatype + "\"]"); objXmlDocument = XmlManager.Instance.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); string strForcedValue = ""; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); if (objXmlPower.Attributes["select"] != null) strForcedValue = objXmlPower.Attributes["select"].InnerText; objPower.Create(objXmlCritterPower, _objCharacter, objNode, intRating, strForcedValue); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Add any Critter Powers the Metavariant should have. if (cboMetavariant.SelectedValue.ToString() != "None") { foreach (XmlNode objXmlPower in objXmlMetavariant.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); string strForcedValue = ""; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); if (objXmlPower.Attributes["select"] != null) strForcedValue = objXmlPower.Attributes["select"].InnerText; objPower.Create(objXmlCritterPower, _objCharacter, objNode, intRating, strForcedValue); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } } // If this is a Blood Spirit, add their free Critter Powers. if (chkBloodSpirit.Checked) { XmlNode objXmlCritterPower; TreeNode objNode; CritterPower objPower; bool blnAddPower = true; // Energy Drain. foreach (CritterPower objFindPower in _objCharacter.CritterPowers) { if (objFindPower.Name == "Energy Drain") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Energy Drain\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Fear. blnAddPower = true; foreach (CritterPower objFindPower in _objCharacter.CritterPowers) { if (objFindPower.Name == "Fear") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Fear\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Natural Weapon. objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Natural Weapon\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, "DV " + intForce.ToString() + "P, AP 0"); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); // Evanescence. blnAddPower = true; foreach (CritterPower objFindPower in _objCharacter.CritterPowers) { if (objFindPower.Name == "Evanescence") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Evanescence\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } } // Remove the Critter's Materialization Power if they have it. Add the Possession or Inhabitation Power if the Possession-based Tradition checkbox is checked. if (chkPossessionBased.Checked) { foreach (CritterPower objCritterPower in _objCharacter.CritterPowers) { if (objCritterPower.Name == "Materialization") { _objCharacter.CritterPowers.Remove(objCritterPower); break; } } // Add the selected Power. XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + cboPossessionMethod.SelectedValue.ToString() + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Set the Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/skill")) { if (objXmlSkill.InnerText.Contains("Exotic")) { Skill objExotic = new Skill(_objCharacter); objExotic.ExoticSkill = true; objExotic.Attribute = "AGI"; if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objExotic.Specializations.Add(objSpec); } if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)) > 6) objExotic.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objExotic.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objExotic.Name = objXmlSkill.InnerText; _objCharacter.Skills.Add(objExotic); } else { foreach (Skill objSkill in _objCharacter.Skills) { if (objSkill.Name == objXmlSkill.InnerText) { if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objSkill.Specializations.Add(objSpec); } if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)) > 6) objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); break; } } } } // Set the Skill Group Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/group")) { foreach (SkillGroup objSkill in _objCharacter.SkillGroups) { if (objSkill.Name == objXmlSkill.InnerText) { objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); break; } } } // Set the Knowledge Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/knowledge")) { Skill objKnowledge = new Skill(_objCharacter); objKnowledge.Name = objXmlSkill.InnerText; objKnowledge.KnowledgeSkill = true; if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objKnowledge.Specializations.Add(objSpec); } objKnowledge.SkillCategory = objXmlSkill.Attributes["category"].InnerText; if (Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText) > 6) objKnowledge.RatingMaximum = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); objKnowledge.Rating = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); _objCharacter.Skills.Add(objKnowledge); } // If this is a Critter with a Force (which dictates their Skill Rating/Maximum Skill Rating), set their Skill Rating Maximums. if (intForce > 0) { int intMaxRating = intForce; // Determine the highest Skill Rating the Critter has. foreach (Skill objSkill in _objCharacter.Skills) { if (objSkill.RatingMaximum > intMaxRating) intMaxRating = objSkill.RatingMaximum; } // Now that we know the upper limit, set all of the Skill Rating Maximums to match. foreach (Skill objSkill in _objCharacter.Skills) objSkill.RatingMaximum = intMaxRating; foreach (SkillGroup objGroup in _objCharacter.SkillGroups) objGroup.RatingMaximum = intMaxRating; // Set the MaxSkillRating for the character so it can be used later when they add new Knowledge Skills or Exotic Skills. _objCharacter.MaxSkillRating = intMaxRating; } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Instance.Load("complexforms.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { string strForceValue = ""; if (objXmlComplexForm.Attributes["select"] != null) strForceValue = objXmlComplexForm.Attributes["select"].InnerText; XmlNode objXmlProgram = objXmlProgramDocument.SelectSingleNode("/chummer/complexforms/complexform[name = \"" + objXmlComplexForm.InnerText + "\"]"); TreeNode objNode = new TreeNode(); ComplexForm objProgram = new ComplexForm(_objCharacter); objProgram.Create(objXmlProgram, _objCharacter, objNode, strForceValue); _objCharacter.ComplexForms.Add(objProgram); } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlCritter.SelectNodes("gears/gear")) { int intRating = 0; if (objXmlGear.Attributes["rating"] != null) intRating = Convert.ToInt32(ExpressionToString(objXmlGear.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); string strForceValue = ""; if (objXmlGear.Attributes["select"] != null) strForceValue = objXmlGear.Attributes["select"].InnerText; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear.InnerText + "\"]"); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); objGear.Create(objXmlGearItem, _objCharacter, objNode, intRating, lstWeapons, lstWeaponNodes, strForceValue); objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; _objCharacter.Gear.Add(objGear); } // If this is a Mutant Critter, count up the number of Skill points they start with. if (_objCharacter.MetatypeCategory == "Mutant Critters") { foreach (Skill objSkill in _objCharacter.Skills) _objCharacter.MutantCritterBaseSkills += objSkill.Rating; } if (cboMetavariant.Text != "None") { int x = 0; int.TryParse(lblMetavariantBP.Text, out x); //_objCharacter.BuildKarma = _objCharacter.BuildKarma - x; } else { int x = 0; int.TryParse(lblBP.Text, out x); //_objCharacter.BuildKarma = _objCharacter.BuildKarma - x; } this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show(LanguageManager.Instance.GetString("Message_Metatype_SelectMetatype"), LanguageManager.Instance.GetString("MessageTitle_Metatype_SelectMetatype"), MessageBoxButtons.OK, MessageBoxIcon.Information); } _objCharacter.Movement = (_objCharacter.AGI.TotalValue * 2).ToString() + "/" + (_objCharacter.AGI.TotalValue * 4).ToString(); }
void TestMetatype(string strFile) { XmlDocument objXmlDocument = XmlManager.Instance.Load(strFile); pgbProgress.Minimum = 0; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlDocument.SelectNodes("/chummer/metatypes/metatype").Count; foreach (XmlNode objXmlMetatype in objXmlDocument.SelectNodes("/chummer/metatypes/metatype")) { pgbProgress.Value++; Application.DoEvents(); objXmlDocument = XmlManager.Instance.Load(strFile); Character _objCharacter = new Character(); ImprovementManager objImprovementManager = new ImprovementManager(_objCharacter); try { int intForce = 0; if (objXmlMetatype["forcecreature"] != null) intForce = 1; // Set Metatype information. if (strFile != "critters.xml" || objXmlMetatype["name"].InnerText == "Ally Spirit") { _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodaug"].InnerText, intForce, 0)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agiaug"].InnerText, intForce, 0)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reaaug"].InnerText, intForce, 0)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["straug"].InnerText, intForce, 0)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chaaug"].InnerText, intForce, 0)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intaug"].InnerText, intForce, 0)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logaug"].InnerText, intForce, 0)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilaug"].InnerText, intForce, 0)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magaug"].InnerText, intForce, 0)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resaug"].InnerText, intForce, 0)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgaug"].InnerText, intForce, 0)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } else { int intMinModifier = -3; if (objXmlMetatype["category"].InnerText == "Mutant Critters") intMinModifier = 0; _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } // If we're working with a Critter, set the Attributes to their default values. if (strFile == "critters.xml") { _objCharacter.BOD.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0)); _objCharacter.AGI.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0)); _objCharacter.REA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0)); _objCharacter.STR.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0)); _objCharacter.CHA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0)); _objCharacter.INT.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0)); _objCharacter.LOG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0)); _objCharacter.WIL.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0)); _objCharacter.MAG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0)); _objCharacter.RES.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0)); _objCharacter.EDG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0)); _objCharacter.ESS.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0)); } // Sprites can never have Physical Attributes or WIL. if (objXmlMetatype["name"].InnerText.EndsWith("Sprite")) { _objCharacter.BOD.AssignLimits("0", "0", "0"); _objCharacter.AGI.AssignLimits("0", "0", "0"); _objCharacter.REA.AssignLimits("0", "0", "0"); _objCharacter.STR.AssignLimits("0", "0", "0"); _objCharacter.WIL.AssignLimits("0", "0", "0"); _objCharacter.INI.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); _objCharacter.INI.MetatypeMaximum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); } _objCharacter.Metatype = objXmlMetatype["name"].InnerText; _objCharacter.MetatypeCategory = objXmlMetatype["category"].InnerText; _objCharacter.Metavariant = ""; _objCharacter.MetatypeBP = 400; if (objXmlMetatype["movement"] != null) _objCharacter.Movement = objXmlMetatype["movement"].InnerText; // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Instance.Load("qualities.xml"); // Determine if the Metatype has any bonuses. if (objXmlMetatype.InnerXml.Contains("bonus")) objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metatype, objXmlMetatype["name"].InnerText, objXmlMetatype.SelectSingleNode("bonus"), false, 1, objXmlMetatype["name"].InnerText); // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); _objCharacter.Qualities.Add(objQuality); } foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); _objCharacter.Qualities.Add(objQuality); } // Run through the character's Attributes one more time and make sure their value matches their minimum value. if (strFile == "metatypes.xml") { _objCharacter.BOD.Value = _objCharacter.BOD.TotalMinimum; _objCharacter.AGI.Value = _objCharacter.AGI.TotalMinimum; _objCharacter.REA.Value = _objCharacter.REA.TotalMinimum; _objCharacter.STR.Value = _objCharacter.STR.TotalMinimum; _objCharacter.CHA.Value = _objCharacter.CHA.TotalMinimum; _objCharacter.INT.Value = _objCharacter.INT.TotalMinimum; _objCharacter.LOG.Value = _objCharacter.LOG.TotalMinimum; _objCharacter.WIL.Value = _objCharacter.WIL.TotalMinimum; } // Add any Critter Powers the Metatype/Critter should have. XmlNode objXmlCritter = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _objCharacter.Metatype + "\"]"); objXmlDocument = XmlManager.Instance.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); string strForcedValue = ""; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); if (objXmlPower.Attributes["select"] != null) strForcedValue = objXmlPower.Attributes["select"].InnerText; objPower.Create(objXmlCritterPower, _objCharacter, objNode, intRating, strForcedValue); _objCharacter.CritterPowers.Add(objPower); } // Set the Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/skill")) { if (objXmlSkill.InnerText.Contains("Exotic")) { Skill objExotic = new Skill(_objCharacter); objExotic.ExoticSkill = true; objExotic.Attribute = "AGI"; if (objXmlSkill.Attributes["spec"] != null) objExotic.Specialization = objXmlSkill.Attributes["spec"].InnerText; if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)) > 6) objExotic.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); objExotic.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); objExotic.Name = objXmlSkill.InnerText; _objCharacter.Skills.Add(objExotic); } else { foreach (Skill objSkill in _objCharacter.Skills) { if (objSkill.Name == objXmlSkill.InnerText) { if (objXmlSkill.Attributes["spec"] != null) objSkill.Specialization = objXmlSkill.Attributes["spec"].InnerText; if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)) > 6) objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); break; } } } } // Set the Skill Group Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/group")) { foreach (SkillGroup objSkill in _objCharacter.SkillGroups) { if (objSkill.Name == objXmlSkill.InnerText) { objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); break; } } } // Set the Knowledge Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/knowledge")) { Skill objKnowledge = new Skill(_objCharacter); objKnowledge.Name = objXmlSkill.InnerText; objKnowledge.KnowledgeSkill = true; if (objXmlSkill.Attributes["spec"] != null) objKnowledge.Specialization = objXmlSkill.Attributes["spec"].InnerText; objKnowledge.SkillCategory = objXmlSkill.Attributes["category"].InnerText; if (Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText) > 6) objKnowledge.RatingMaximum = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); objKnowledge.Rating = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); _objCharacter.Skills.Add(objKnowledge); } // If this is a Critter with a Force (which dictates their Skill Rating/Maximum Skill Rating), set their Skill Rating Maximums. if (intForce > 0) { int intMaxRating = intForce; // Determine the highest Skill Rating the Critter has. foreach (Skill objSkill in _objCharacter.Skills) { if (objSkill.RatingMaximum > intMaxRating) intMaxRating = objSkill.RatingMaximum; } // Now that we know the upper limit, set all of the Skill Rating Maximums to match. foreach (Skill objSkill in _objCharacter.Skills) objSkill.RatingMaximum = intMaxRating; foreach (SkillGroup objGroup in _objCharacter.SkillGroups) objGroup.RatingMaximum = intMaxRating; // Set the MaxSkillRating for the character so it can be used later when they add new Knowledge Skills or Exotic Skills. _objCharacter.MaxSkillRating = intMaxRating; } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Instance.Load("programs.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { int intRating = 0; if (objXmlComplexForm.Attributes["rating"] != null) intRating = Convert.ToInt32(ExpressionToString(objXmlComplexForm.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); string strForceValue = ""; if (objXmlComplexForm.Attributes["select"] != null) strForceValue = objXmlComplexForm.Attributes["select"].InnerText; XmlNode objXmlProgram = objXmlProgramDocument.SelectSingleNode("/chummer/programs/program[name = \"" + objXmlComplexForm.InnerText + "\"]"); TreeNode objNode = new TreeNode(); TechProgram objProgram = new TechProgram(_objCharacter); objProgram.Create(objXmlProgram, _objCharacter, objNode, strForceValue); objProgram.Rating = intRating; _objCharacter.TechPrograms.Add(objProgram); // Add the Program Option if applicable. if (objXmlComplexForm.Attributes["option"] != null) { int intOptRating = 0; if (objXmlComplexForm.Attributes["optionrating"] != null) intOptRating = Convert.ToInt32(ExpressionToString(objXmlComplexForm.Attributes["optionrating"].InnerText, Convert.ToInt32(intForce), 0)); string strOptForceValue = ""; if (objXmlComplexForm.Attributes["optionselect"] != null) strOptForceValue = objXmlComplexForm.Attributes["optionselect"].InnerText; XmlNode objXmlOption = objXmlProgramDocument.SelectSingleNode("/chummer/options/option[name = \"" + objXmlComplexForm.Attributes["option"].InnerText + "\"]"); TreeNode objNodeOpt = new TreeNode(); TechProgramOption objOption = new TechProgramOption(_objCharacter); objOption.Create(objXmlOption, _objCharacter, objNodeOpt, strOptForceValue); objOption.Rating = intOptRating; objProgram.Options.Add(objOption); } } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlCritter.SelectNodes("gears/gear")) { int intRating = 0; if (objXmlGear.Attributes["rating"] != null) intRating = Convert.ToInt32(ExpressionToString(objXmlGear.Attributes["rating"].InnerText, Convert.ToInt32(intForce), 0)); string strForceValue = ""; if (objXmlGear.Attributes["select"] != null) strForceValue = objXmlGear.Attributes["select"].InnerText; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear.InnerText + "\"]"); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); objGear.Create(objXmlGearItem, _objCharacter, objNode, intRating, lstWeapons, lstWeaponNodes, strForceValue); objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; _objCharacter.Gear.Add(objGear); } // If this is a Mutant Critter, count up the number of Skill points they start with. if (_objCharacter.MetatypeCategory == "Mutant Critters") { foreach (Skill objSkill in _objCharacter.Skills) _objCharacter.MutantCritterBaseSkills += objSkill.Rating; } } catch { txtOutput.Text += _objCharacter.Metatype + " general failure\n"; } } }
/// <summary> /// A Metatype has been selected, so fill in all of the necessary Character information. /// </summary> void MetatypeSelected() { if (cboTalents.SelectedIndex == -1) { MessageBox.Show(LanguageManager.Instance.GetString("Message_Metatype_SelectTalent"), LanguageManager.Instance.GetString("MessageTitle_Metatype_SelectTalent"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if ((cboSkill1.SelectedIndex == -1 && cboSkill1.Visible) || (cboSkill2.SelectedIndex == -1 && cboSkill2.Visible)) { MessageBox.Show(LanguageManager.Instance.GetString("Message_Metatype_SelectSkill"), LanguageManager.Instance.GetString("MessageTitle_Metatype_SelectSkill"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (cboSkill1.Visible && cboSkill2.Visible && cboSkill1.SelectedValue.ToString() == cboSkill2.SelectedValue.ToString()) { MessageBox.Show(LanguageManager.Instance.GetString("Message_Metatype_Duplicate"), LanguageManager.Instance.GetString("MessageTitle_Metatype_Duplicate"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (lstMetatypes.Text != "") { ImprovementManager objImprovementManager = new ImprovementManager(_objCharacter); XmlDocument objXmlDocument = XmlManager.Instance.Load(_strXmlFile); XmlNode objXmlMetatype = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + lstMetatypes.SelectedValue + "\"]"); XmlNode objXmlMetavariant = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + lstMetatypes.SelectedValue + "\"]/metavariants/metavariant[name = \"" + cboMetavariant.SelectedValue + "\"]"); int intForce = 0; if (nudForce.Visible) intForce = Convert.ToInt32(nudForce.Value); // Set Metatype information. if (cboMetavariant.SelectedValue.ToString() != "None") { _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetavariant["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["bodaug"].InnerText, intForce, 0)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetavariant["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["agiaug"].InnerText, intForce, 0)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetavariant["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["reaaug"].InnerText, intForce, 0)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetavariant["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["straug"].InnerText, intForce, 0)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetavariant["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["chaaug"].InnerText, intForce, 0)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetavariant["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["intaug"].InnerText, intForce, 0)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetavariant["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["logaug"].InnerText, intForce, 0)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetavariant["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["wilaug"].InnerText, intForce, 0)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetavariant["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetavariant["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["magaug"].InnerText, intForce, 0)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetavariant["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["resaug"].InnerText, intForce, 0)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetavariant["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["edgaug"].InnerText, intForce, 0)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetavariant["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetavariant["essaug"].InnerText, intForce, 0)); _objCharacter.MetatypeBP = Convert.ToInt32(lblMetavariantBP.Text); } else if (_strXmlFile != "critters.xml" || lstMetatypes.SelectedValue.ToString() == "Ally Spirit") { _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodaug"].InnerText, intForce, 0)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agiaug"].InnerText, intForce, 0)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reaaug"].InnerText, intForce, 0)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["straug"].InnerText, intForce, 0)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chaaug"].InnerText, intForce, 0)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intaug"].InnerText, intForce, 0)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logaug"].InnerText, intForce, 0)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilaug"].InnerText, intForce, 0)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magaug"].InnerText, intForce, 0)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resaug"].InnerText, intForce, 0)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgaug"].InnerText, intForce, 0)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } else { int intMinModifier = -3; if (cboCategory.SelectedValue.ToString() == "Mutant Critters") intMinModifier = 0; _objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3)); _objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3)); _objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3)); _objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3)); _objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3)); _objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3)); _objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3)); _objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3)); _objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); _objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3)); _objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3)); _objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3)); _objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } // If we're working with a Critter, set the Attributes to their default values. if (_strXmlFile == "critters.xml") { _objCharacter.BOD.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0)); _objCharacter.AGI.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0)); _objCharacter.REA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0)); _objCharacter.STR.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0)); _objCharacter.CHA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0)); _objCharacter.INT.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0)); _objCharacter.LOG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0)); _objCharacter.WIL.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0)); _objCharacter.MAG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0)); _objCharacter.RES.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0)); _objCharacter.EDG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0)); _objCharacter.ESS.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0)); } // Sprites can never have Physical Attributes or WIL. if (lstMetatypes.SelectedValue.ToString().EndsWith("Sprite")) { _objCharacter.BOD.AssignLimits("0", "0", "0"); _objCharacter.AGI.AssignLimits("0", "0", "0"); _objCharacter.REA.AssignLimits("0", "0", "0"); _objCharacter.STR.AssignLimits("0", "0", "0"); _objCharacter.WIL.AssignLimits("0", "0", "0"); _objCharacter.INI.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); _objCharacter.INI.MetatypeMaximum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); } // If this is a Shapeshifter, a Metavariant must be selected. Default to Human if None is selected. if (cboCategory.SelectedValue.ToString() == "Shapeshifter" && cboMetavariant.SelectedValue.ToString() == "None") cboMetavariant.SelectedValue = "Human"; _objCharacter.Metatype = lstMetatypes.SelectedValue.ToString(); _objCharacter.MetatypeCategory = cboCategory.SelectedValue.ToString(); if (cboMetavariant.SelectedValue.ToString() == "None") { _objCharacter.Metavariant = ""; } else { _objCharacter.Metavariant = cboMetavariant.SelectedValue.ToString(); } if (objXmlMetatype["movement"] != null) // TODO: Replace with Walk/Run _objCharacter.Movement = objXmlMetatype["movement"].InnerText; // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Instance.Load("qualities.xml"); if (cboMetavariant.SelectedValue.ToString() == "None") { // Determine if the Metatype has any bonuses. if (objXmlMetatype.InnerXml.Contains("bonus")) objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metatype, lstMetatypes.SelectedValue.ToString(), objXmlMetatype.SelectSingleNode("bonus"), false, 1, lstMetatypes.SelectedValue.ToString()); // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } } // If a Metavariant has been selected, locate it in the file. if (cboMetavariant.SelectedValue.ToString() != "None") { // Determine if the Metavariant has any bonuses. if (objXmlMetavariant.InnerXml.Contains("bonus")) objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metavariant, cboMetavariant.SelectedValue.ToString(), objXmlMetavariant.SelectSingleNode("bonus"), false, 1, cboMetavariant.SelectedValue.ToString()); // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetavariant.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); objQuality.ContributeToLimit = false; string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } foreach (XmlNode objXmlQualityItem in objXmlMetavariant.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objQuality.ContributeToLimit = false; _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } } // Run through the character's Attributes one more time and make sure their value matches their minimum value. if (_strXmlFile == "metatypes.xml") { _objCharacter.BOD.Value = _objCharacter.BOD.TotalMinimum; _objCharacter.AGI.Value = _objCharacter.AGI.TotalMinimum; _objCharacter.REA.Value = _objCharacter.REA.TotalMinimum; _objCharacter.STR.Value = _objCharacter.STR.TotalMinimum; _objCharacter.CHA.Value = _objCharacter.CHA.TotalMinimum; _objCharacter.INT.Value = _objCharacter.INT.TotalMinimum; _objCharacter.LOG.Value = _objCharacter.LOG.TotalMinimum; _objCharacter.WIL.Value = _objCharacter.WIL.TotalMinimum; _objCharacter.BOD.Base = _objCharacter.BOD.TotalMinimum; _objCharacter.AGI.Base = _objCharacter.AGI.TotalMinimum; _objCharacter.REA.Base = _objCharacter.REA.TotalMinimum; _objCharacter.STR.Base = _objCharacter.STR.TotalMinimum; _objCharacter.CHA.Base = _objCharacter.CHA.TotalMinimum; _objCharacter.INT.Base = _objCharacter.INT.TotalMinimum; _objCharacter.LOG.Base = _objCharacter.LOG.TotalMinimum; _objCharacter.WIL.Base = _objCharacter.WIL.TotalMinimum; _objCharacter.BOD.Karma = 0; _objCharacter.AGI.Karma = 0; _objCharacter.REA.Karma = 0; _objCharacter.STR.Karma = 0; _objCharacter.CHA.Karma = 0; _objCharacter.INT.Karma = 0; _objCharacter.LOG.Karma = 0; _objCharacter.WIL.Karma = 0; _objCharacter.EDG.Karma = 0; _objCharacter.MAG.Karma = 0; _objCharacter.RES.Karma = 0; } // Add any Critter Powers the Metatype/Critter should have. XmlNode objXmlCritter = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _objCharacter.Metatype + "\"]"); objXmlDocument = XmlManager.Instance.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); string strForcedValue = ""; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); if (objXmlPower.Attributes["select"] != null) strForcedValue = objXmlPower.Attributes["select"].InnerText; objPower.Create(objXmlCritterPower, _objCharacter, objNode, intRating, strForcedValue); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Add any Critter Powers the Metavariant should have. if (cboMetavariant.SelectedValue.ToString() != "None") { foreach (XmlNode objXmlPower in objXmlMetavariant.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); string strForcedValue = ""; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); if (objXmlPower.Attributes["select"] != null) strForcedValue = objXmlPower.Attributes["select"].InnerText; objPower.Create(objXmlCritterPower, _objCharacter, objNode, intRating, strForcedValue); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } } // If this is a Blood Spirit, add their free Critter Powers. if (chkBloodSpirit.Checked) { XmlNode objXmlCritterPower; TreeNode objNode; CritterPower objPower; bool blnAddPower = true; // Energy Drain. foreach (CritterPower objFindPower in _objCharacter.CritterPowers) { if (objFindPower.Name == "Energy Drain") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Energy Drain\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Fear. blnAddPower = true; foreach (CritterPower objFindPower in _objCharacter.CritterPowers) { if (objFindPower.Name == "Fear") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Fear\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Natural Weapon. objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Natural Weapon\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, "DV " + intForce.ToString() + "P, AP 0"); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); // Evanescence. blnAddPower = true; foreach (CritterPower objFindPower in _objCharacter.CritterPowers) { if (objFindPower.Name == "Evanescence") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Evanescence\"]"); objNode = new TreeNode(); objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } } // Remove the Critter's Materialization Power if they have it. Add the Possession or Inhabitation Power if the Possession-based Tradition checkbox is checked. if (chkPossessionBased.Checked) { foreach (CritterPower objCritterPower in _objCharacter.CritterPowers) { if (objCritterPower.Name == "Materialization") { _objCharacter.CritterPowers.Remove(objCritterPower); break; } } // Add the selected Power. XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + cboPossessionMethod.SelectedValue.ToString() + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(_objCharacter); objPower.Create(objXmlCritterPower, _objCharacter, objNode, 0, ""); objPower.CountTowardsLimit = false; _objCharacter.CritterPowers.Add(objPower); } // Set the Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/skill")) { if (objXmlSkill.InnerText.Contains("Exotic")) { Skill objExotic = new Skill(_objCharacter); objExotic.ExoticSkill = true; objExotic.Attribute = "AGI"; if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objExotic.Specializations.Add(objSpec); } if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)) > 6) objExotic.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objExotic.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objExotic.Name = objXmlSkill.InnerText; _objCharacter.Skills.Add(objExotic); } else { foreach (Skill objSkill in _objCharacter.Skills) { if (objSkill.Name == objXmlSkill.InnerText) { if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objSkill.Specializations.Add(objSpec); } if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)) > 6) objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); break; } } } } // Set the Skill Group Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/group")) { foreach (SkillGroup objSkill in _objCharacter.SkillGroups) { if (objSkill.Name == objXmlSkill.InnerText) { objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); break; } } } // Set the Knowledge Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/knowledge")) { Skill objKnowledge = new Skill(_objCharacter); objKnowledge.Name = objXmlSkill.InnerText; objKnowledge.KnowledgeSkill = true; if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objKnowledge.Specializations.Add(objSpec); } objKnowledge.SkillCategory = objXmlSkill.Attributes["category"].InnerText; if (Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText) > 6) objKnowledge.RatingMaximum = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); objKnowledge.Rating = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); _objCharacter.Skills.Add(objKnowledge); } // If this is a Critter with a Force (which dictates their Skill Rating/Maximum Skill Rating), set their Skill Rating Maximums. if (intForce > 0) { int intMaxRating = intForce; // Determine the highest Skill Rating the Critter has. foreach (Skill objSkill in _objCharacter.Skills) { if (objSkill.RatingMaximum > intMaxRating) intMaxRating = objSkill.RatingMaximum; } // Now that we know the upper limit, set all of the Skill Rating Maximums to match. foreach (Skill objSkill in _objCharacter.Skills) objSkill.RatingMaximum = intMaxRating; foreach (SkillGroup objGroup in _objCharacter.SkillGroups) objGroup.RatingMaximum = intMaxRating; // Set the MaxSkillRating for the character so it can be used later when they add new Knowledge Skills or Exotic Skills. _objCharacter.MaxSkillRating = intMaxRating; } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Instance.Load("complexforms.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { string strForceValue = ""; if (objXmlComplexForm.Attributes["select"] != null) strForceValue = objXmlComplexForm.Attributes["select"].InnerText; XmlNode objXmlProgram = objXmlProgramDocument.SelectSingleNode("/chummer/complexforms/complexform[name = \"" + objXmlComplexForm.InnerText + "\"]"); TreeNode objNode = new TreeNode(); ComplexForm objProgram = new ComplexForm(_objCharacter); objProgram.Create(objXmlProgram, _objCharacter, objNode, strForceValue); _objCharacter.ComplexForms.Add(objProgram); } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlCritter.SelectNodes("gears/gear")) { int intRating = 0; if (objXmlGear.Attributes["rating"] != null) intRating = Convert.ToInt32(ExpressionToString(objXmlGear.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); string strForceValue = ""; if (objXmlGear.Attributes["select"] != null) strForceValue = objXmlGear.Attributes["select"].InnerText; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear.InnerText + "\"]"); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); objGear.Create(objXmlGearItem, _objCharacter, objNode, intRating, lstWeapons, lstWeaponNodes, strForceValue); objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; _objCharacter.Gear.Add(objGear); } // If this is a Mutant Critter, count up the number of Skill points they start with. if (_objCharacter.MetatypeCategory == "Mutant Critters") { foreach (Skill objSkill in _objCharacter.Skills) _objCharacter.MutantCritterBaseSkills += objSkill.Rating; } // begin priority based character settings // Load the Priority information. XmlDocument objXmlDocumentPriority = XmlManager.Instance.Load(_strPrioritiesXmlFile); // Set the character priority selections _objCharacter.MetatypePriority = cboHeritage.Text.ToString(); _objCharacter.AttributesPriority = cboAttributes.Text.ToString(); _objCharacter.SpecialPriority = cboTalent.Text.ToString(); _objCharacter.SkillsPriority = cboSkills.Text.ToString(); _objCharacter.ResourcesPriority = cboResources.Text.ToString(); // Set starting nuyen XmlNodeList objXmResourceList = objXmlDocumentPriority.SelectNodes("/chummer/priorities/priority[category = \"Resources\" and gameplayoption = \"" + _objCharacter.GameplayOption + "\" and value = \"" + cboResources.SelectedValue + "\"]"); if (objXmResourceList.Count > 0) { _objCharacter.Nuyen = Convert.ToInt32(objXmResourceList[0]["resources"].InnerText.ToString()); _objCharacter.StartingNuyen = _objCharacter.Nuyen; } // Set starting positive qualities foreach (XmlNode objXmlQualityItem in objXmlDocumentPriority.SelectNodes("/chummer/priorities/priority[category = \"Talent\" and value = \"" + cboTalent.SelectedValue + "\"]/talents/talent[value = \"" + cboTalents.SelectedValue + "\"]/qualities/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(_objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, _objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); _objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); } // Set starting magic XmlNodeList objXmlTalentList = objXmlDocumentPriority.SelectNodes("/chummer/priorities/priority[category = \"Talent\" and value = \"" + cboTalent.SelectedValue + "\"]/talents/talent[value = \"" + cboTalents.SelectedValue + "\"]"); if (objXmlTalentList[0]["magic"] != null) { _objCharacter.MAG.Value = Convert.ToInt32(objXmlTalentList[0]["magic"].InnerText); _objCharacter.MAG.MetatypeMinimum = Convert.ToInt32(objXmlTalentList[0]["magic"].InnerText); if (_objCharacter.MAG.Value > 0) _objCharacter.MAGEnabled = true; if (objXmlTalentList[0]["spells"] != null) { _objCharacter.SpellLimit = Convert.ToInt32(objXmlTalentList[0]["spells"].InnerText); } else { _objCharacter.SpellLimit = 0; } } if (objXmlTalentList[0]["maxmagic"] != null) _objCharacter.MAG.MetatypeMaximum = Convert.ToInt32(objXmlTalentList[0]["magic"].InnerText); // Set starting resonance objXmlTalentList = objXmlDocumentPriority.SelectNodes("/chummer/priorities/priority[category = \"Talent\" and value = \"" + cboTalent.SelectedValue + "\"]/talents/talent[value = \"" + cboTalents.SelectedValue + "\"]"); if (objXmlTalentList[0]["resonance"] != null) { _objCharacter.RES.Value = Convert.ToInt32(objXmlTalentList[0]["resonance"].InnerText); _objCharacter.RES.MetatypeMinimum = Convert.ToInt32(objXmlTalentList[0]["resonance"].InnerText); _objCharacter.RESEnabled = true; _objCharacter.CFPLimit = Convert.ToInt32(objXmlTalentList[0]["cfp"].InnerText); } if (objXmlTalentList[0]["maxresonance"] != null) _objCharacter.RES.MetatypeMaximum = Convert.ToInt32(objXmlTalentList[0]["resonance"].InnerText); // Set starting talent tabs switch (cboTalents.SelectedValue.ToString()) { case "Magician": _objCharacter.MagicianEnabled = true; break; case "Aspected Magician": _objCharacter.MagicianEnabled = true; break; case "Adept": _objCharacter.AdeptEnabled = true; break; case "Mystic Adept": _objCharacter.MagicianEnabled = true; _objCharacter.AdeptEnabled = true; break; case "Technomancer": _objCharacter.TechnomancerEnabled = true; break; default: break; } // Set Free Skills/Skill Groups int intFreeLevels = 0; bool blnGroup = (cboTalents.SelectedValue.ToString() == "Aspected Magician"); if (cboTalent.SelectedValue.ToString() == "A") intFreeLevels = 5; else if (cboTalent.SelectedValue.ToString() == "B") intFreeLevels = 4; else if (cboTalent.SelectedValue.ToString() == "C") intFreeLevels = 2; foreach (Skill objSkill in _objCharacter.Skills) { if (cboSkill1.Visible && objSkill.Name == cboSkill1.Text && !blnGroup) { objSkill.FreeLevels = intFreeLevels; if (objSkill.Rating < intFreeLevels) objSkill.Rating = intFreeLevels; _objCharacter.PriorityBonusSkill1 = cboSkill1.Text.ToString(); } else if (cboSkill2.Visible && objSkill.Name == cboSkill2.Text && !blnGroup) { objSkill.FreeLevels = intFreeLevels; if (objSkill.Rating < intFreeLevels) objSkill.Rating = intFreeLevels; _objCharacter.PriorityBonusSkill2 = cboSkill2.Text.ToString(); } else { objSkill.FreeLevels = 0; if (blnGroup) { // if this skill is a magical skill not belonging to the selected group, reduce the skill maximum to 0 if (objSkill.SkillGroup == "Conjuring" || objSkill.SkillGroup == "Enchanting" || objSkill.SkillGroup == "Sorcery") { if (objSkill.SkillGroup != cboSkill1.SelectedValue.ToString()) objSkill.RatingMaximum = 0; else { if (_objCharacter.IgnoreRules) objSkill.RatingMaximum = 12; else objSkill.RatingMaximum = 6; } _objCharacter.PriorityBonusSkillGroup = cboSkill1.Text.ToString(); } } } } foreach (SkillGroup objSkillGroup in _objCharacter.SkillGroups) { if (cboSkill1.Visible && objSkillGroup.Name == cboSkill1.Text && blnGroup) { objSkillGroup.FreeLevels = intFreeLevels; if (objSkillGroup.Base < intFreeLevels) objSkillGroup.Base = intFreeLevels; _objCharacter.PriorityBonusSkillGroup = cboSkill1.Text.ToString(); } else objSkillGroup.FreeLevels = 0; if (blnGroup) { // if this skill is a magical skill not belonging to the selected group, reduce the skill maximum to 0 if (objSkillGroup.Name == "Conjuring" || objSkillGroup.Name == "Enchanting" || objSkillGroup.Name == "Sorcery") { if (objSkillGroup.Name != cboSkill1.SelectedValue.ToString()) objSkillGroup.RatingMaximum = 0; else { if (_objCharacter.IgnoreRules) objSkillGroup.RatingMaximum = 12; else objSkillGroup.RatingMaximum = 6; } } } } // Ignore Rules if (_objCharacter.IgnoreRules) { foreach (Skill objSkill in _objCharacter.Skills) { objSkill.RatingMaximum = 99; } foreach (SkillGroup objSkillGroup in _objCharacter.SkillGroups) { objSkillGroup.RatingMaximum = 99; } } // Set Special Attributes _objCharacter.Special = Convert.ToInt32(lblSpecial.Text); _objCharacter.TotalSpecial = Convert.ToInt32(lblSpecial.Text); // Set Attributes XmlNodeList objXmlPriorityList = objXmlDocumentPriority.SelectNodes("/chummer/priorities/priority[category = \"Attributes\" and value = \"" + cboAttributes.SelectedValue + "\"]"); if (objXmlPriorityList[0]["attributes"] != null) { _objCharacter.Attributes = Convert.ToInt32(objXmlPriorityList[0]["attributes"].InnerText); _objCharacter.TotalAttributes = _objCharacter.Attributes; } // Set Skills and Skill Groups objXmlPriorityList = objXmlDocumentPriority.SelectNodes("/chummer/priorities/priority[category = \"Skills\" and value = \"" + cboSkills.SelectedValue + "\"]"); if (objXmlPriorityList[0]["skills"] != null) { _objCharacter.SkillPoints = Convert.ToInt32(objXmlPriorityList[0]["skills"].InnerText); _objCharacter.SkillPointsMaximum = _objCharacter.SkillPoints; _objCharacter.SkillGroupPoints = Convert.ToInt32(objXmlPriorityList[0]["skillgroups"].InnerText); _objCharacter.SkillGroupPointsMaximum = _objCharacter.SkillGroupPoints; } // Load the Priority information. XmlNode objXmlGameplayOption = objXmlDocumentPriority.SelectSingleNode("/chummer/gameplayoptions/gameplayoption[name = \"" + _objCharacter.GameplayOption + "\"]"); string strKarma = objXmlGameplayOption["karma"].InnerText; string strNuyen = objXmlGameplayOption["maxnuyen"].InnerText; string strContactMultiplier = objXmlGameplayOption["contactmultiplier"].InnerText; _objCharacter.MaxKarma = Convert.ToInt32(strKarma); _objCharacter.MaxNuyen = Convert.ToInt32(strNuyen); _objCharacter.ContactMultiplier = Convert.ToInt32(strContactMultiplier); // Set free contact points _objCharacter.ContactPoints = _objCharacter.CHA.Value * _objCharacter.ContactMultiplier; // Set starting karma _objCharacter.BuildKarma = _objCharacter.MaxKarma; // Set starting movement rate _objCharacter.Movement = (_objCharacter.AGI.TotalValue * 2).ToString() + "/" + (_objCharacter.AGI.TotalValue * 4).ToString(); this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show(LanguageManager.Instance.GetString("Message_Metatype_SelectMetatype"), LanguageManager.Instance.GetString("MessageTitle_Metatype_SelectMetatype"), MessageBoxButtons.OK, MessageBoxIcon.Information); } }
/// <summary> /// Calculate the LP value for the selected items. /// </summary> private int CalculateValues(bool blnIncludePercentage = true) { if (_blnSkipRefresh) return 0; int intNuyen = 0; decimal decBaseCost = 0; decimal decCost = 0; // Get the base cost of the lifestyle XmlNode objXmlAspect = _objXmlDocument.SelectSingleNode("/chummer/lifestyles/lifestyle[name = \"" + cboLifestyle.SelectedValue + "\"]"); decBaseCost += Convert.ToDecimal(objXmlAspect["cost"].InnerText); _objLifestyle.Dice = Convert.ToInt32(objXmlAspect["dice"].InnerText); _objLifestyle.Multiplier = Convert.ToInt32(objXmlAspect["multiplier"].InnerText); // Add the flat costs from qualities foreach (TreeNode objNode in treQualities.Nodes) { if (objNode.Checked) { XmlNode objXmlQuality = _objXmlDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + GetQualityName(objNode.Tag.ToString()) + "\"]"); if (objXmlQuality["cost"] != null && objXmlQuality["cost"].InnerText != "") decCost += Convert.ToDecimal(objXmlQuality["cost"].InnerText); } } decimal decMod = 0; if (blnIncludePercentage) { // Add the modifiers from qualities foreach (TreeNode objNode in treQualities.Nodes) { if (objNode.Checked) { objXmlAspect = _objXmlDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + GetQualityName(objNode.Tag.ToString()) + "\"]"); if (objXmlAspect["multiplier"] != null) decMod += (Convert.ToDecimal(objXmlAspect["multiplier"].InnerText) / 100); } } // Check for modifiers in the improvements ImprovementManager objImprovementManager = new ImprovementManager(_objCharacter); decimal decModifier = Convert.ToDecimal(objImprovementManager.ValueOf(Improvement.ImprovementType.LifestyleCost), GlobalOptions.Instance.CultureInfo); decMod += Convert.ToDecimal(decModifier / 100, GlobalOptions.Instance.CultureInfo); } intNuyen = Convert.ToInt32(decBaseCost + (decBaseCost * decMod)); intNuyen += Convert.ToInt32(decCost); lblCost.Text = String.Format("{0:###,###,##0¥}", intNuyen); if (nudPercentage.Value != 100) { decimal decDiscount = 0; decDiscount = decBaseCost + (decBaseCost * decMod); decDiscount += decCost; decDiscount = decDiscount * (nudPercentage.Value /100); lblCost.Text += String.Format(" (" + "{0:###,###,##0¥}" +")", Convert.ToInt32(decDiscount)); } return intNuyen; }
private void cmdOK_Click(object sender, EventArgs e) { // Make sure that each Priority has only been selected once. bool blnValid = true; if (cboPriorityMetatype.SelectedValue == cboPriorityAttributes.SelectedValue) blnValid = false; if (cboPriorityMetatype.SelectedValue == cboPrioritySpecial.SelectedValue) blnValid = false; if (cboPriorityMetatype.SelectedValue == cboPrioritySkills.SelectedValue) blnValid = false; if (cboPriorityMetatype.SelectedValue == cboPriorityNuyen.SelectedValue) blnValid = false; if (cboPriorityAttributes.SelectedValue == cboPrioritySpecial.SelectedValue) blnValid = false; if (cboPriorityAttributes.SelectedValue == cboPrioritySkills.SelectedValue) blnValid = false; if (cboPriorityAttributes.SelectedValue == cboPriorityNuyen.SelectedValue) blnValid = false; if (cboPrioritySpecial.SelectedValue == cboPrioritySkills.SelectedValue) blnValid = false; if (cboPrioritySpecial.SelectedValue == cboPriorityNuyen.SelectedValue) blnValid = false; if (cboPrioritySkills.SelectedValue == cboPriorityNuyen.SelectedValue) blnValid = false; if (!blnValid) { MessageBox.Show(LanguageManager.Instance.GetString("Message_Priorities_UniquePriorities"), LanguageManager.Instance.GetString("MessageTitle_Priorities_UniquePriorities"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { // Determine the number of Special Attribute points that come from the selected Metatype. XmlNode objXmlMetatypesNode = _objXmlDocument.SelectSingleNode("/chummer/priorities/metatypes/metatype[priority = \"" + cboPriorityMetatype.SelectedValue.ToString() + "\"]"); XmlNode objXmlMetatypeNode = objXmlMetatypesNode.SelectSingleNode("metatypes/metatype[id = \"" + cboMetatype.SelectedValue.ToString() + "\"]"); int intSpecialAttributePoints = Convert.ToInt32(objXmlMetatypeNode["points"].InnerText); // Determine the number of Attribute Points selected. XmlNode objXmlAttributeNode = _objXmlDocument.SelectSingleNode("/chummer/priorities/attributes/attribute[priority = \"" + cboPriorityAttributes.SelectedValue.ToString() + "\"]"); int intAttributePoints = Convert.ToInt32(objXmlAttributeNode["points"].InnerText); // Determine if the character gets anything from their Special Priority. if (cboSpecial.SelectedValue != null) { if (cboSpecial.SelectedValue.ToString() != string.Empty) { XmlNode objXmlSpecialNode = _objXmlDocument.SelectSingleNode("/chummer/priorities/specials/special[priority = \"" + cboPrioritySpecial.SelectedValue.ToString() + "\"]/" + cboSpecial.SelectedValue.ToString()); if (objXmlSpecialNode["bonus"] != null) { ImprovementManager objImprovementManager = new ImprovementManager(_objCharacter); objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Priority, "Priority", objXmlSpecialNode["bonus"]); } } } // Determine the number of Skill Points selected. // Determine the amount of Nuyen selected. XmlNode objXmlNuyenNode = _objXmlDocument.SelectSingleNode("/chummer/priorities/resources/resource[priority = \"" + cboPriorityNuyen.SelectedValue.ToString() + "\"]"); int intNuyen = Convert.ToInt32(objXmlNuyenNode["nuyen"].InnerText); // Load the Metatype and set the character build information. _objCharacter.LoadMetatype(Guid.Parse(cboMetatype.SelectedValue.ToString())); _objCharacter.SpecialAttributePoints = intSpecialAttributePoints; _objCharacter.AttributePoints = intAttributePoints; _objCharacter.Nuyen = intNuyen; this.DialogResult = DialogResult.OK; } }
private void SkillControl_Load(object sender, EventArgs e) { //Find character ourselves instead... if (_objCharacter == null && _objSkill != null) _objCharacter = _objSkill.CharacterObject; if (_objSkill.CharacterObject.BuildMethod == CharacterBuildMethod.Karma || _objSkill.CharacterObject.BuildMethod == CharacterBuildMethod.LifeModule) { if (_objSkill.CharacterObject.BuildMethod == CharacterBuildMethod.Karma) { nudSkill.Visible = false; } else { nudSkill.Enabled = false; } chkKarma.Checked = true; chkKarma.Enabled = false; if (_objSkill.KnowledgeSkill) { if ((!_objSkill.CharacterObject.Options.FreeKarmaKnowledge) && _objSkill.CharacterObject.BuildMethod != CharacterBuildMethod.LifeModule) { nudKarma.Minimum = 1; } chkKarma.Checked = false; chkKarma.Enabled = true; } } _blnSkipRefresh = true; if (_objSkill.KnowledgeSkill) { cboSkillName.Text = _objSkill.Name; if (!_objSkill.CharacterObject.Created && _objSkill.CharacterObject.Options.FreeKarmaKnowledge == true) { nudSkill.Visible = true; nudSkill.Enabled = true; } type = true; if (_objSkill.Fold.Count != 0) { cmdExpand.Visible = true; type = false; } } if (_objSkill.CharacterObject.Created) { string strTooltip = ""; int intNewRating = _objSkill.Rating + 1; int intKarmaCost = 0; chkKarma.Visible = false; if (_objSkill.Rating < _objSkill.RatingMaximum) { if (KnowledgeSkill == false) { if (_objSkill.Rating == 0) intKarmaCost = _objSkill.CharacterObject.Options.KarmaNewActiveSkill; else { intKarmaCost = (_objSkill.Rating + 1) * _objSkill.CharacterObject.Options.KarmaImproveActiveSkill; } } else { if (_objSkill.Rating == 0) intKarmaCost = _objSkill.CharacterObject.Options.KarmaNewKnowledgeSkill; else if (_objSkill.Rating >= 3) { //Street Knowledge Skills > Rank 2 gain a 1 karma discount with the School of Hard Knocks quality. if (_objSkill.CharacterObject.SchoolOfHardKnocks && _objSkill.SkillCategory == "Street") { intKarmaCost = ((_objSkill.Rating + 1) * _objSkill.CharacterObject.Options.KarmaImproveKnowledgeSkill) - 1; } //Academic Knowledge Skills > Rank 2 gain a 1 karma discount with the College Education quality. else if (_objSkill.CharacterObject.CollegeEducation && _objSkill.SkillCategory == "Academic") { intKarmaCost = ((_objSkill.Rating + 1) * _objSkill.CharacterObject.Options.KarmaImproveKnowledgeSkill) - 1; } //Professional Knowledge Skills > Rank 2 gain a 1 karma discount with the Tech School quality. else if (_objSkill.CharacterObject.TechSchool && _objSkill.SkillCategory == "Professional") { intKarmaCost = ((_objSkill.Rating + 1) * _objSkill.CharacterObject.Options.KarmaImproveKnowledgeSkill) - 1; } //Linguist Skills > Rank 2 gain a 1 karma discount with the Linguist quality. else if (_objSkill.CharacterObject.Linguist && _objSkill.SkillCategory == "Language") { intKarmaCost = ((_objSkill.Rating + 1) * _objSkill.CharacterObject.Options.KarmaImproveKnowledgeSkill) - 1; } } else intKarmaCost = (_objSkill.Rating + 1) * _objSkill.CharacterObject.Options.KarmaImproveKnowledgeSkill; } // Double the Karma cost if the character is Uneducated and is a Technical Active, Academic, or Professional Skill. if (_objSkill.CharacterObject.Uneducated && (SkillCategory == "Technical Active" || SkillCategory == "Academic" || SkillCategory == "Professional")) intKarmaCost *= 2; //Double the Karma cost if the character is Uncouth and is a Social Active Skill. if (_objSkill.CharacterObject.Uncouth && (SkillCategory == "Social Active")) { intKarmaCost *= 2; } strTooltip = LanguageManager.Instance.GetString("Tip_ImproveItem").Replace("{0}", intNewRating.ToString()).Replace("{1}", intKarmaCost.ToString()); tipTooltip.SetToolTip(cmdImproveSkill, strTooltip); } ImprovementManager objImprovementManager = new ImprovementManager(_objSkill.CharacterObject); if (objImprovementManager.ValueOf(Improvement.ImprovementType.AdeptLinguistics) > 0 && SkillCategory == "Language" && SkillRating == 0) strTooltip = LanguageManager.Instance.GetString("Tip_ImproveItem").Replace("{0}", "1").Replace("{1}", "0"); tipTooltip.SetToolTip(cmdImproveSkill, strTooltip); nudSkill.Visible = false; nudKarma.Visible = false; lblSkillRating.Visible = true; cmdImproveSkill.Visible = true; if (_objSkill.FreeLevels > 0) nudSkill.Minimum = _objSkill.FreeLevels; else nudSkill.Minimum = 0; // Show the Dice Rolling button if the option is enabled. if (_objSkill.CharacterObject.Options.AllowSkillDiceRolling) { cmdRoll.Visible = true; this.Width += 30; cboSpec.Left += 30; lblSpec.Left += 30; cmdChangeSpec.Left += 30; cboKnowledgeSkillCategory.Left += 30; cmdDelete.Left += 30; tipTooltip.SetToolTip(cmdRoll, LanguageManager.Instance.GetString("Tip_DiceRoller")); } if (!_objSkill.ExoticSkill) { cboSpec.Visible = false; lblSpec.Visible = true; lblSpec.Text = _objSkill.Specialization; cmdChangeSpec.Visible = true; cboSpec.Enabled = false; } else { cboSpec.Text = _objSkill.Specialization; } string strTip = LanguageManager.Instance.GetString("Tip_Skill_AddSpecialization").Replace("{0}", _objSkill.CharacterObject.Options.KarmaSpecialization.ToString()); tipTooltip.SetToolTip(cmdChangeSpec, strTip); } if (KnowledgeSkill) { this.Width = cmdExpand.Left + cmdExpand.Width; } else this.Width = cmdChangeSpec.Left + cmdChangeSpec.Width; if (!_objSkill.CharacterObject.Created && _objSkill.SkillGroupObject != null && _objSkill.SkillGroupObject.Broken) { if (!_objSkill.CharacterObject.Options.UsePointsOnBrokenGroups) nudSkill.Enabled = false; cmdBreakGroup.Visible = false; } this.Height = lblSpec.Height + 10; chkKarma.Checked = _objSkill.BuyWithKarma; lblAttribute.Text = _objSkill.DisplayAttribute; RefreshControl(); _blnSkipRefresh = false; }
/// <summary> /// Update the Modified Rating shown. /// </summary> public void RefreshControl() { bool blnSkillsoft = false; ImprovementManager objImprovementManager = new ImprovementManager(_objSkill.CharacterObject); int intRating = _objSkill.TotalRating; lblModifiedRating.Text = intRating.ToString(); int intSkillRating = _objSkill.Rating; foreach (Gear objGear in _objSkill.CharacterObject.Gear) { // Look for any Skillsoft that would conflict with the Skill's Rating. if (objGear.Equipped && objGear.Category == "Skillsofts" && (objGear.Extra == _objSkill.Name || objGear.Extra == _objSkill.Name + ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"))) { if (objGear.Rating > _objSkill.Rating) { // Use the Skillsoft's Rating or Skillwire Rating, whichever is lower. // If this is a Knowsoft or Linguasoft, it is not limited to the Skillwire Rating. if (objGear.Name == "Activesoft") intSkillRating = Math.Min(objGear.Rating, objImprovementManager.ValueOf(Improvement.ImprovementType.Skillwire)); else intSkillRating = objGear.Rating; blnSkillsoft = true; break; } } foreach (Gear objChild in objGear.Children) { if (objChild.Equipped && objChild.Category == "Skillsofts" && (objChild.Extra == _objSkill.Name || objChild.Extra == _objSkill.Name + ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"))) { if (objChild.Rating > _objSkill.Rating) { // Use the Skillsoft's Rating or Skillwire Rating, whichever is lower. // If this is a Knowsoft or Linguasoft, it is not limited to the Skillwire Rating. if (objChild.Name == "Activesoft") intSkillRating = Math.Min(objChild.Rating, objImprovementManager.ValueOf(Improvement.ImprovementType.Skillwire)); else intSkillRating = objChild.Rating; blnSkillsoft = true; break; } } } } if (_objSkill.FreeLevels > 0) { nudSkill.Minimum = _objSkill.FreeLevels; } else { nudSkill.Minimum = 0; } if (cboSpec.Text != "" && !_objSkill.ExoticSkill) { bool blnFound = false; if (this.SkillName == "Artisan") { // Look for the Inspired quality to see if we get a free specialization foreach (Quality objQuality in _objSkill.CharacterObject.Qualities) { if (objQuality.Name == "Inspired") blnFound = true; } } if (!blnFound) { lblModifiedRating.Text += " (" + (intRating + 2).ToString() + ")"; } else { lblModifiedRating.Text += " (" + (intRating + 3).ToString() + ")"; } } lblAttribute.Text = _objSkill.DisplayAttribute; // Build the Tooltip. string strTooltip = ""; if (blnSkillsoft) strTooltip += LanguageManager.Instance.GetString("Tip_Skill_SkillsoftRating") + " (" + intSkillRating.ToString() + ")"; else strTooltip += LanguageManager.Instance.GetString("Tip_Skill_SkillRating") + " (" + _objSkill.Rating.ToString() + ")"; if (_objSkill.Default && intSkillRating == 0) strTooltip += " - " + LanguageManager.Instance.GetString("Tip_Skill_Defaulting") + " (1)"; if ((!_objSkill.Default && intSkillRating > 0) || _objSkill.Default) { strTooltip += " + " + LanguageManager.Instance.GetString("String_Attribute" + _objSkill.Attribute + "Short") + " (" + _objSkill.AttributeModifiers.ToString() + ")"; } // Modifiers only apply when not Defaulting. if (intSkillRating > 0 || _objSkill.CharacterObject.Options.SkillDefaultingIncludesModifiers) { if (_objSkill.RatingModifiers != 0) { if (_objSkill.CharacterObject.Options.EnforceMaximumSkillRatingModifier) { int intModifier = _objSkill.RatingModifiers; if (intModifier > Convert.ToInt32(Math.Floor(Convert.ToDouble(intSkillRating, GlobalOptions.Instance.CultureInfo) * 0.5))) { int intMax = intModifier; intModifier = Convert.ToInt32(Math.Floor(Convert.ToDouble(intSkillRating, GlobalOptions.Instance.CultureInfo) * 0.5)); if (intModifier != 0) strTooltip += " + " + LanguageManager.Instance.GetString("Tip_Skill_RatingModifiers") + " (" + intModifier.ToString() + " " + LanguageManager.Instance.GetString("String_Of") + " " + intMax.ToString() + ")"; else strTooltip += " + " + LanguageManager.Instance.GetString("Tip_Skill_RatingModifiers") + " (0 " + LanguageManager.Instance.GetString("String_Of") + " " + intMax.ToString() + ")"; } else strTooltip += " + " + LanguageManager.Instance.GetString("Tip_Skill_RatingModifiers") + " (" + _objSkill.RatingModifiers.ToString() + ")"; } else strTooltip += " + " + LanguageManager.Instance.GetString("Tip_Skill_RatingModifiers") + " (" + _objSkill.RatingModifiers.ToString() + ")"; } // Dice Pool Modifiers. strTooltip += _objSkill.DicePoolModifiersTooltip; } if (_objSkill.SkillCategory == "Language" && _objSkill.KnowledgeSkill && intSkillRating == 0) { lblModifiedRating.Text = "N"; strTooltip = LanguageManager.Instance.GetString("Tip_Skill_NativeLanguage"); } // Condition Monitor Modifiers. if (objImprovementManager.ValueOf(Improvement.ImprovementType.ConditionMonitor) < 0) strTooltip += " + " + LanguageManager.Instance.GetString("Tip_Skill_Wounds") + " (" + objImprovementManager.ValueOf(Improvement.ImprovementType.ConditionMonitor).ToString() + ")"; tipTooltip.SetToolTip(lblModifiedRating, strTooltip); if (_objSkill.Rating > 0 && !_objSkill.KnowledgeSkill) { this.BackColor = SystemColors.ButtonHighlight; //lblSkillName.Font = new Font(lblSkillName.Font, FontStyle.Bold); lblModifiedRating.Font = new Font(lblModifiedRating.Font, FontStyle.Bold); } else { this.BackColor = SystemColors.Control; //lblSkillName.Font = new Font(lblSkillName.Font, FontStyle.Regular); lblModifiedRating.Font = new Font(lblModifiedRating.Font, FontStyle.Regular); } // Specializations should not be enabled for Active Skills in Create Mode if their Rating is 0. if (!_objSkill.KnowledgeSkill && !_objSkill.ExoticSkill && !_objSkill.CharacterObject.Created) { if (_objSkill.Rating > 0 && !_objSkill.IsGrouped) cboSpec.Enabled = true; else { cboSpec.Enabled = false; cboSpec.Text = ""; } } if (!_objSkill.KnowledgeSkill && !_objSkill.ExoticSkill && _objSkill.CharacterObject.Created) { if (_objSkill.Rating > 0) cmdChangeSpec.Enabled = true; else cmdChangeSpec.Enabled = false; } if (_objSkill.CharacterObject.Created) { lblSkillRating.Text = _objSkill.Rating.ToString(); // Enable or disable the Improve Skill button as necessary. if (_objSkill.Rating < _objSkill.RatingMaximum) cmdImproveSkill.Enabled = true; else cmdImproveSkill.Enabled = false; } if (KnowledgeSkill && _objCharacter != null && SkillRating < SkillRatingMaximum && !_objCharacter.Created) { List<Skill> joinList = objCharacter.Skills.FindAll(s => s.KnowledgeSkill && s.Name == _objSkill.Name && s != _objSkill); type = _objSkill.Fold.Count == 0; if (type) { if (joinList.Count > 0) { cmdExpand.Visible = true; } else { cmdExpand.Visible = false; } } else { cmdExpand.Visible = true; } //If 2 knowledgeskills have same name, offer to join them } }
public MainController(Character objCharacter) { _objCharacter = objCharacter; _objImprovementManager = new ImprovementManager(_objCharacter); _objFunctions = new CommonFunctions(_objCharacter); }
/// <summary> /// Create a LifestyleQuality from an XmlNode and return the TreeNodes for it. /// </summary> /// <param name="objXmlLifestyleQuality">XmlNode to create the object from.</param> /// <param name="objCharacter">Character object the LifestyleQuality will be added to.</param> /// <param name="objLifestyleQualitySource">Source of the LifestyleQuality.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="objWeapons">List of Weapons that should be added to the Character.</param> /// <param name="objWeaponNodes">List of TreeNodes to represent the Weapons added.</param> /// <param name="strForceValue">Force a value to be selected for the LifestyleQuality.</param> public void Create(XmlNode objXmlLifestyleQuality, Character objCharacter, QualitySource objLifestyleQualitySource, TreeNode objNode) { _strName = objXmlLifestyleQuality["name"].InnerText; _intLP = Convert.ToInt32(objXmlLifestyleQuality["lp"].InnerText); try { _intCost = Convert.ToInt32(objXmlLifestyleQuality["cost"].InnerText); } catch {} _objLifestyleQualityType = ConvertToLifestyleQualityType(objXmlLifestyleQuality["category"].InnerText); _objLifestyleQualitySource = objLifestyleQualitySource; if (objXmlLifestyleQuality["print"] != null) { if (objXmlLifestyleQuality["print"].InnerText == "no") _blnPrint = false; } if (objXmlLifestyleQuality["contributetolimit"] != null) { if (objXmlLifestyleQuality["contributetolimit"].InnerText == "no") _blnContributeToLimit = false; } _strSource = objXmlLifestyleQuality["source"].InnerText; _strPage = objXmlLifestyleQuality["page"].InnerText; if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("lifestyles.xml"); XmlNode objLifestyleQualityNode = objXmlDocument.SelectSingleNode("/chummer/qualities/LifestyleQuality[name = \"" + _strName + "\"]"); if (objLifestyleQualityNode != null) { if (objLifestyleQualityNode["translate"] != null) _strAltName = objLifestyleQualityNode["translate"].InnerText; if (objLifestyleQualityNode["altpage"] != null) _strAltPage = objLifestyleQualityNode["altpage"].InnerText; } } // If the item grants a bonus, pass the information to the Improvement Manager. if (objXmlLifestyleQuality.InnerXml.Contains("<bonus>")) { ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Quality, _guiID.ToString(), objXmlLifestyleQuality["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; objNode.Text += " (" + objImprovementManager.SelectedValue + ")"; } } objNode.Text = DisplayName; objNode.Tag = InternalId; }
/// Create a Metamagic from an XmlNode and return the TreeNodes for it. /// <param name="objXmlMetamagicNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="objSource">Source of the Improvement.</param> public void Create(XmlNode objXmlMetamagicNode, Character objCharacter, TreeNode objNode, Improvement.ImprovementSource objSource) { _strName = objXmlMetamagicNode["name"].InnerText; _strSource = objXmlMetamagicNode["source"].InnerText; _strPage = objXmlMetamagicNode["page"].InnerText; _objImprovementSource = objSource; if (objXmlMetamagicNode.InnerXml.Contains("<bonus>")) { _nodBonus = objXmlMetamagicNode["bonus"]; int intRating = 1; if (_objCharacter.SubmersionGrade > 0) intRating = _objCharacter.SubmersionGrade; else intRating = _objCharacter.InitiateGrade; ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); if (!objImprovementManager.CreateImprovements(objSource, _guiID.ToString(), _nodBonus, true, intRating, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") _strName += " (" + objImprovementManager.SelectedValue + ")"; } objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); }
/// Create a Spell from an XmlNode and return the TreeNodes for it. /// <param name="objXmlSpellNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="strForcedValue">Value to forcefully select for any ImprovementManager prompts.</param> /// <param name="blnLimited">Whether or not the Spell should be marked as Limited.</param> /// <param name="blnExtended">Whether or not the Spell should be marked as Extended.</param> public void Create(XmlNode objXmlSpellNode, Character objCharacter, TreeNode objNode, string strForcedValue = "", bool blnLimited = false, bool blnExtended = false, bool blnAlchemical = false, Improvement.ImprovementSource objSource = Improvement.ImprovementSource.Spell) { _strName = objXmlSpellNode["name"].InnerText; _strDescriptors = objXmlSpellNode["descriptor"].InnerText; _strCategory = objXmlSpellNode["category"].InnerText; _strType = objXmlSpellNode["type"].InnerText; _strRange = objXmlSpellNode["range"].InnerText; _strDamage = objXmlSpellNode["damage"].InnerText; _strDuration = objXmlSpellNode["duration"].InnerText; _strDV = objXmlSpellNode["dv"].InnerText; _blnLimited = blnLimited; _blnExtended = blnExtended; _blnAlchemical = blnAlchemical; _strSource = objXmlSpellNode["source"].InnerText; _strPage = objXmlSpellNode["page"].InnerText; _objImprovementSource = objSource; string strDV = _strDV; if (_blnLimited && _strDV.StartsWith("F")) { int intPos = 0; if (strDV.Contains("-")) { intPos = strDV.IndexOf("-") + 1; string strAfter = strDV.Substring(intPos, strDV.Length - intPos); strDV = strDV.Substring(0, intPos); int intAfter = Convert.ToInt32(strAfter); intAfter += 2; strDV += intAfter.ToString(); } else if (strDV.Contains("+")) { intPos = strDV.IndexOf("+"); string strAfter = strDV.Substring(intPos, strDV.Length - intPos); strDV = strDV.Substring(0, intPos); int intAfter = Convert.ToInt32(strAfter); intAfter -= 2; if (intAfter > 0) strDV += "+" + intAfter.ToString(); else if (intAfter < 0) strDV += intAfter.ToString(); } else { strDV += "-2"; } } _strDV = strDV; ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); objImprovementManager.ForcedValue = strForcedValue; if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("spells.xml"); XmlNode objSpellNode = objXmlDocument.SelectSingleNode("/chummer/spells/spell[name = \"" + _strName + "\"]"); if (objSpellNode != null) { if (objSpellNode["translate"] != null) _strAltName = objSpellNode["translate"].InnerText; if (objSpellNode["altpage"] != null) _strAltPage = objSpellNode["altpage"].InnerText; } objSpellNode = objXmlDocument.SelectSingleNode("/chummer/categories/category[. = \"" + _strCategory + "\"]"); if (objSpellNode != null) { if (objSpellNode.Attributes["translate"] != null) _strAltCategory = objSpellNode.Attributes["translate"].InnerText; } } if (objXmlSpellNode["bonus"] != null) { if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Spell, _guiID.ToString(), objXmlSpellNode["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; } } //TreeNode objNode = new TreeNode(); objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); //return objNode; }
/// Create a Spell from an XmlNode and return the TreeNodes for it. /// <param name="objXmlSpellNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="strForcedValue">Value to forcefully select for any ImprovementManager prompts.</param> /// <param name="blnLimited">Whether or not the Spell should be marked as Limited.</param> /// <param name="blnExtended">Whether or not the Spell should be marked as Extended.</param> public void Create(XmlNode objXmlSpellNode, Character objCharacter, TreeNode objNode, string strForcedValue = "", bool blnLimited = false, bool blnExtended = false) { _strName = objXmlSpellNode["name"].InnerText; _strDescriptors = objXmlSpellNode["descriptor"].InnerText; _strCategory = objXmlSpellNode["category"].InnerText; _strType = objXmlSpellNode["type"].InnerText; _strRange = objXmlSpellNode["range"].InnerText; _strDamage = objXmlSpellNode["damage"].InnerText; _strDuration = objXmlSpellNode["duration"].InnerText; _strDV = objXmlSpellNode["dv"].InnerText; _blnLimited = blnLimited; _blnExtended = blnExtended; _strSource = objXmlSpellNode["source"].InnerText; _strPage = objXmlSpellNode["page"].InnerText; ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); objImprovementManager.ForcedValue = strForcedValue; if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("spells.xml"); XmlNode objSpellNode = objXmlDocument.SelectSingleNode("/chummer/spells/spell[name = \"" + _strName + "\"]"); if (objSpellNode != null) { if (objSpellNode["translate"] != null) _strAltName = objSpellNode["translate"].InnerText; if (objSpellNode["altpage"] != null) _strAltPage = objSpellNode["altpage"].InnerText; } objSpellNode = objXmlDocument.SelectSingleNode("/chummer/categories/category[. = \"" + _strCategory + "\"]"); if (objSpellNode != null) { if (objSpellNode.Attributes["translate"] != null) _strAltCategory = objSpellNode.Attributes["translate"].InnerText; } } if (objXmlSpellNode["bonus"] != null) { if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Spell, _guiID.ToString(), objXmlSpellNode["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; } } //TreeNode objNode = new TreeNode(); objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); //return objNode; }
/// Create an Enhancement from an XmlNode and return the TreeNodes for it. /// <param name="objXmlEnhancementNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Enhancement is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="objSource">Source of the Improvement.</param> public void Create(XmlNode objXmlArtNode, Character objCharacter, TreeNode objNode, Improvement.ImprovementSource objSource) { _strName = objXmlArtNode["name"].InnerText; _strSource = objXmlArtNode["source"].InnerText; _strPage = objXmlArtNode["page"].InnerText; _objImprovementSource = objSource; try { _intGrade = Convert.ToInt32(objXmlArtNode["grade"].InnerText); } catch { } if (objXmlArtNode.InnerXml.Contains("<bonus>")) { _nodBonus = objXmlArtNode["bonus"]; ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); if (!objImprovementManager.CreateImprovements(objSource, _guiID.ToString(), _nodBonus, true, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") _strName += " (" + objImprovementManager.SelectedValue + ")"; } objNode.Text = LanguageManager.Instance.GetString("Label_Enhancement") + " " + DisplayName; objNode.Tag = _guiID.ToString(); }
/// Create a Complex Form from an XmlNode. /// <param name="objXmlOptionNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="strForcedValue">Value to forcefully select for any ImprovementManager prompts.</param> public void Create(XmlNode objXmlOptionNode, Character objCharacter, TreeNode objNode, string strForcedValue = "") { _strName = objXmlOptionNode["name"].InnerText; _strSource = objXmlOptionNode["source"].InnerText; _strPage = objXmlOptionNode["page"].InnerText; if (objXmlOptionNode["maxrating"].InnerText != "") _intMaxRating = Convert.ToInt32(objXmlOptionNode["maxrating"].InnerText); if (_intMaxRating > 0) _intRating = 1; if (objXmlOptionNode.InnerXml.Contains("<tags>")) { foreach (XmlNode objXmlTag in objXmlOptionNode.SelectNodes("tags/tag")) _lstTags.Add(objXmlTag.InnerText); } ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); objImprovementManager.ForcedValue = strForcedValue; if (objXmlOptionNode["bonus"] != null) { if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.ComplexForm, _guiID.ToString(), objXmlOptionNode["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; } } objNode.Text = DisplayName; if (_strExtra != "") objNode.Text += " (" + _strExtra + ")"; objNode.Tag = _guiID.ToString(); }
/// Create a Critter Power from an XmlNode and return the TreeNodes for it. /// <param name="objXmlPowerNode">XmlNode to create the object from.</param> /// <param name="objCharacter">Character the Gear is being added to.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="intRating">Selected Rating for the Gear.</param> /// <param name="strForcedValue">Value to forcefully select for any ImprovementManager prompts.</param> public void Create(XmlNode objXmlPowerNode, Character objCharacter, TreeNode objNode, int intRating = 0, string strForcedValue = "") { _strName = objXmlPowerNode["name"].InnerText; _strCategory = objXmlPowerNode["category"].InnerText; _strType = objXmlPowerNode["type"].InnerText; _strAction = objXmlPowerNode["action"].InnerText; _strRange = objXmlPowerNode["range"].InnerText; _strDuration = objXmlPowerNode["duration"].InnerText; _strSource = objXmlPowerNode["source"].InnerText; _strPage = objXmlPowerNode["page"].InnerText; _nodBonus = objXmlPowerNode["bonus"]; // Create the TreeNode for the new item. objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); if (intRating != 0) _strExtra = intRating.ToString(); // If the piece grants a bonus, pass the information to the Improvement Manager. if (objXmlPowerNode.InnerXml.Contains("<bonus>")) { ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); objImprovementManager.ForcedValue = strForcedValue; if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.CritterPower, _guiID.ToString(), _nodBonus, true, intRating, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; objNode.Text += " (" + objImprovementManager.SelectedValue + ")"; } } }
/// <summary> /// Accept the values on the Form and create the required XML data. /// </summary> private void AcceptForm() { // Make sure a value has been selected if necessary. if (txtSelect.Visible && txtSelect.Text == string.Empty) { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectItem"), LanguageManager.Instance.GetString("MessageTitle_SelectItem"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // Make sure a value has been provided for the name. if (txtName.Text == string.Empty) { MessageBox.Show(LanguageManager.Instance.GetString("Message_ImprovementName"), LanguageManager.Instance.GetString("MessageTitle_ImprovementName"), MessageBoxButtons.OK, MessageBoxIcon.Error); txtName.Focus(); return; } MemoryStream objStream = new MemoryStream(); XmlWriter objWriter = XmlWriter.Create(objStream); // Build the XML for the Improvement. XmlNode objFetchNode = _objDocument.SelectSingleNode("/chummer/improvements/improvement[id = \"" + cboImprovemetType.SelectedValue + "\"]"); objWriter.WriteStartDocument(); // <bonus> objWriter.WriteStartElement("bonus"); // <whatever element> objWriter.WriteStartElement(objFetchNode["internal"].InnerText); string strRating = ""; if (chkApplyToRating.Checked) strRating = "<applytorating>yes</applytorating>"; // Retrieve the XML data from the document and replace the values as necessary. string strXml = objFetchNode["xml"].InnerText; strXml = strXml.Replace("{val}", nudVal.Value.ToString()); strXml = strXml.Replace("{min}", nudMin.Value.ToString()); strXml = strXml.Replace("{max}", nudMax.Value.ToString()); strXml = strXml.Replace("{aug}", nudAug.Value.ToString()); strXml = strXml.Replace("{select}", txtSelect.Text); strXml = strXml.Replace("{applytorating}", strRating); objWriter.WriteRaw(strXml); // Write the rest of the document. // </whatever element> objWriter.WriteEndElement(); // </bonus> objWriter.WriteEndElement(); objWriter.WriteEndDocument(); objWriter.Flush(); objStream.Flush(); objStream.Position = 0; // Read it back in as an XmlDocument. StreamReader objReader = new StreamReader(objStream); XmlDocument objBonusXML = new XmlDocument(); string strXML = objReader.ReadToEnd(); objBonusXML.LoadXml(strXML); objWriter.Close(); objStream.Close(); // Pluck out the bonus information. XmlNode objNode = objBonusXML.SelectSingleNode("/bonus"); // Pass it to the Improvement Manager so that it can be added to the character. ImprovementManager objImprovementManager = new ImprovementManager(_objCharacter); string strGuid = Guid.NewGuid().ToString(); objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Custom, strGuid, objNode, false, 1, txtName.Text); // If an Improvement was passed in, remove it from the character. string strNotes = ""; int intOrder = 0; if (_objEditImprovement != null) { // Copy the notes over to the new item. strNotes = _objEditImprovement.Notes; intOrder = _objEditImprovement.SortOrder; objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Custom, _objEditImprovement.SourceName); } // Find the newly-created Improvement and attach its custom name. foreach (Improvement objImprovement in _objCharacter.Improvements) { if (objImprovement.SourceName == strGuid) { objImprovement.CustomName = txtName.Text; objImprovement.CustomId = cboImprovemetType.SelectedValue.ToString(); objImprovement.Custom = true; objImprovement.Notes = strNotes; objImprovement.SortOrder = intOrder; } } this.DialogResult = DialogResult.OK; }
/// <summary> /// Check if the Cyberware's requirements/restrictions are being met. /// </summary> /// <param name="objXmlCyberware">XmlNode of the Cyberware.</param> /// <param name="blnShowMessage">Whether or not a message should be shown if the requirements are not met.</param> private bool RequirementMet(XmlNode objXmlCyberware, bool blnShowMessage) { // Ignore the rules. if (_objCharacter.IgnoreRules) return true; if (objXmlCyberware.InnerXml.Contains("forbidden")) { bool blnRequirementForbidden = false; string strForbidden = ""; // Loop through the oneof requirements. XmlNodeList objXmlForbiddenList = objXmlCyberware.SelectNodes("forbidden/oneof"); foreach (XmlNode objXmlOneOf in objXmlForbiddenList) { XmlNodeList objXmlOneOfList = objXmlOneOf.ChildNodes; foreach (XmlNode objXmlForbidden in objXmlOneOfList) { if (objXmlForbidden.Name == "Cyberware") { // Run through all of the Cyberwares the character has and see if the current forbidden item exists. // If so, turn on the RequirementForbidden flag so it cannot be selected. foreach (Cyberware objCharacterCyberware in _objCharacter.Cyberware) { if (objCharacterCyberware.Name == objXmlForbidden.InnerText) { blnRequirementForbidden = true; strForbidden += "\n\t" + objCharacterCyberware.DisplayNameShort; } } } } } // The character is not allowed to take the Cyberware, so display a message and uncheck the item. if (blnRequirementForbidden) { if (blnShowMessage) MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectQuality_QualityRestriction") + strForbidden, LanguageManager.Instance.GetString("MessageTitle_SelectQuality_QualityRestriction"), MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } if (objXmlCyberware.InnerXml.Contains("required")) { string strRequirement = ""; bool blnRequirementMet = true; // Loop through the oneof requirements. XmlNodeList objXmlRequiredList = objXmlCyberware.SelectNodes("required/oneof"); foreach (XmlNode objXmlOneOf in objXmlRequiredList) { bool blnOneOfMet = false; string strThisRequirement = "\n" + LanguageManager.Instance.GetString("Message_SelectQuality_OneOf"); XmlNodeList objXmlOneOfList = objXmlOneOf.ChildNodes; foreach (XmlNode objXmlRequired in objXmlOneOfList) { if (objXmlRequired.Name == "quality") { XmlDocument _objQualityDocument = XmlManager.Instance.Load("qualities.xml"); // Run through all of the Qualities the character has and see if the current required item exists. // If so, turn on the RequirementMet flag so it can be selected. foreach (Quality objCharacterQuality in _objCharacter.Qualities) { if (objCharacterQuality.Name == objXmlRequired.InnerText) blnOneOfMet = true; } if (!blnOneOfMet) { XmlNode objNode = _objQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlRequired.InnerText + "\"]"); if (objNode["translate"] != null) strThisRequirement += "\n\t" + objNode["translate"].InnerText; else strThisRequirement += "\n\t" + objXmlRequired.InnerText; } } else if (objXmlRequired.Name == "metatype") { XmlDocument _objMetatypeDocument = XmlManager.Instance.Load("metatypes.xml"); // Check the Metatype requirement. if (objXmlRequired.InnerText == _objCharacter.Metatype) blnOneOfMet = true; else { XmlNode objNode = _objMetatypeDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + objXmlRequired.InnerText + "\"]"); if (objNode["translate"] != null) strThisRequirement += "\n\t" + objNode["translate"].InnerText; else strThisRequirement += "\n\t" + objXmlRequired.InnerText; } } else if (objXmlRequired.Name == "metatypecategory") { // Check the Metatype Category requirement. if (objXmlRequired.InnerText == _objCharacter.MetatypeCategory) blnOneOfMet = true; else { XmlNode objNode = _objMetatypeDocument.SelectSingleNode("/chummer/categories/category[. = \"" + objXmlRequired.InnerText + "\"]"); if (objNode.Attributes["translate"] != null) strThisRequirement += "\n\t" + objNode.Attributes["translate"].InnerText; else strThisRequirement = "\n\t" + objXmlRequired.InnerText; } } else if (objXmlRequired.Name == "metavariant") { // Check the Metavariant requirement. if (objXmlRequired.InnerText == _objCharacter.Metavariant) blnOneOfMet = true; else { XmlNode objNode = _objMetatypeDocument.SelectSingleNode("/chummer/metatypes/metatype/metavariants/metavariant[name = \"" + objXmlRequired.InnerText + "\"]"); if (objNode["translate"] != null) strThisRequirement += "\n\t" + objNode["translate"].InnerText; else strThisRequirement += "\n\t" + objXmlRequired.InnerText; } } else if (objXmlRequired.Name == "power") { // Run through all of the Powers the character has and see if the current required item exists. // If so, turn on the RequirementMet flag so it can be selected. if (_objCharacter.AdeptEnabled && _objCharacter.Powers != null) { foreach (Power objCharacterPower in _objCharacter.Powers) { //Check that the power matches the name and doesn't come from a bonus source like a focus. There's probably an edge case that this will break. if (objXmlRequired.InnerText == objCharacterPower.Name && objCharacterPower.BonusSource.Length == 0) { blnOneOfMet = true; } } if (!blnOneOfMet) { strThisRequirement += "\n\t" + objXmlRequired.InnerText; } } } else if (objXmlRequired.Name == "inherited") { strThisRequirement += "\n\t" + LanguageManager.Instance.GetString("Message_SelectQuality_Inherit"); } else if (objXmlRequired.Name == "careerkarma") { // Check Career Karma requirement. if (_objCharacter.CareerKarma >= Convert.ToInt32(objXmlRequired.InnerText)) blnOneOfMet = true; else strThisRequirement = "\n\t" + LanguageManager.Instance.GetString("Message_SelectQuality_RequireKarma").Replace("{0}", objXmlRequired.InnerText); } else if (objXmlRequired.Name == "ess") { // Check Essence requirement. if (objXmlRequired.InnerText.StartsWith("-")) { // Essence must be less than the value. if (_objCharacter.Essence < Convert.ToDecimal(objXmlRequired.InnerText.Replace("-", string.Empty), GlobalOptions.Instance.CultureInfo)) blnOneOfMet = true; } else { // Essence must be equal to or greater than the value. if (_objCharacter.Essence >= Convert.ToDecimal(objXmlRequired.InnerText, GlobalOptions.Instance.CultureInfo)) blnOneOfMet = true; } } else if (objXmlRequired.Name == "skill") { // Check if the character has the required Skill. foreach (Skill objSkill in _objCharacter.SkillsSection.Skills) { if (objSkill.Name == objXmlRequired["name"].InnerText) { if (objSkill.Rating >= Convert.ToInt32(objXmlRequired["val"].InnerText)) { blnOneOfMet = true; break; } } } } else if (objXmlRequired.Name == "attribute") { // Check to see if an Attribute meets a requirement. CharacterAttrib objAttribute = _objCharacter.GetAttribute(objXmlRequired["name"].InnerText); if (objXmlRequired["total"] != null) { // Make sure the Attribute's total value meets the requirement. if (objAttribute.TotalValue >= Convert.ToInt32(objXmlRequired["total"].InnerText)) blnOneOfMet = true; } } else if (objXmlRequired.Name == "attributetotal") { // Check if the character's Attributes add up to a particular total. string strAttributes = objXmlRequired["attributes"].InnerText; strAttributes = strAttributes.Replace("BOD", _objCharacter.GetAttribute("BOD").Value.ToString()); strAttributes = strAttributes.Replace("AGI", _objCharacter.GetAttribute("AGI").Value.ToString()); strAttributes = strAttributes.Replace("REA", _objCharacter.GetAttribute("REA").Value.ToString()); strAttributes = strAttributes.Replace("STR", _objCharacter.GetAttribute("STR").Value.ToString()); strAttributes = strAttributes.Replace("CHA", _objCharacter.GetAttribute("CHA").Value.ToString()); strAttributes = strAttributes.Replace("INT", _objCharacter.GetAttribute("INT").Value.ToString()); strAttributes = strAttributes.Replace("INT", _objCharacter.GetAttribute("LOG").Value.ToString()); strAttributes = strAttributes.Replace("WIL", _objCharacter.GetAttribute("WIL").Value.ToString()); strAttributes = strAttributes.Replace("MAG", _objCharacter.GetAttribute("MAG").Value.ToString()); strAttributes = strAttributes.Replace("RES", _objCharacter.GetAttribute("RES").Value.ToString()); strAttributes = strAttributes.Replace("EDG", _objCharacter.GetAttribute("EDG").Value.ToString()); XmlDocument objXmlDocument = new XmlDocument(); XPathNavigator nav = objXmlDocument.CreateNavigator(); XPathExpression xprAttributes = nav.Compile(strAttributes); if (Convert.ToInt32(nav.Evaluate(xprAttributes)) >= Convert.ToInt32(objXmlRequired["val"].InnerText)) blnOneOfMet = true; } else if (objXmlRequired.Name == "skillgrouptotal") { // Check if the total combined Ratings of Skill Groups adds up to a particular total. int intTotal = 0; string[] strGroups = objXmlRequired["skillgroups"].InnerText.Split('+'); for (int i = 0; i <= strGroups.Length - 1; i++) { foreach (SkillGroup objGroup in _objCharacter.SkillsSection.SkillGroups) { if (objGroup.Name == strGroups[i]) { intTotal += objGroup.Rating; break; } } } if (intTotal >= Convert.ToInt32(objXmlRequired["val"].InnerText)) blnOneOfMet = true; } else if (objXmlRequired.Name == "cyberwares") { // Check to see if the character has a number of the required Cyberware/Bioware items. int intTotal = 0; // Check Cyberware. foreach (XmlNode objXmlDocument in objXmlRequired.SelectNodes("cyberware")) { foreach (Cyberware objCyberware in _objCharacter.Cyberware) { bool blnFound = false; if (objCyberware.Name == objXmlCyberware.InnerText) { if (objXmlCyberware.Attributes["select"] == null) { intTotal++; blnFound = true; break; } else if (objXmlCyberware.Attributes["select"].InnerText == objCyberware.Location) { intTotal++; blnFound = true; break; } } if (!blnFound) { strThisRequirement += "\n\t" + objXmlCyberware.InnerText; } } } // Check Bioware. foreach (XmlNode objXmlBioware in objXmlRequired.SelectNodes("bioware")) { bool blnFound = false; foreach (Cyberware objCyberware in _objCharacter.Cyberware) { if (objCyberware.Name == objXmlBioware.InnerText) { intTotal++; blnFound = true; break; } } if (!blnFound) { strThisRequirement += "\n\t" + objXmlBioware.InnerText; } } // Check Cyberware name that contain a straing. foreach (XmlNode objXmlDocument in objXmlRequired.SelectNodes("cyberwarecontains")) { foreach (Cyberware objCyberware in _objCharacter.Cyberware) { if (objCyberware.Name.Contains(objXmlCyberware.InnerText)) { if (objXmlCyberware.Attributes["select"] == null) { intTotal++; break; } else if (objXmlCyberware.Attributes["select"].InnerText == objCyberware.Location) { intTotal++; break; } } } } // Check Bioware name that contain a straing. foreach (XmlNode objXmlDocument in objXmlRequired.SelectNodes("biowarecontains")) { foreach (Cyberware objCyberware in _objCharacter.Cyberware) { if (objCyberware.Name.Contains(objXmlCyberware.InnerText)) { if (objXmlCyberware.Attributes["select"] == null) { intTotal++; break; } else if (objXmlCyberware.Attributes["select"].InnerText == objCyberware.Location) { intTotal++; break; } } } } // Check for Cyberware Plugins. foreach (XmlNode objXmlDocument in objXmlRequired.SelectNodes("cyberwareplugin")) { foreach (Cyberware objCyberware in _objCharacter.Cyberware) { foreach (Cyberware objPlugin in objCyberware.Children) { if (objPlugin.Name == objXmlCyberware.InnerText) { intTotal++; break; } } } } // Check for Cyberware Categories. foreach (XmlNode objXmlDocument in objXmlRequired.SelectNodes("cyberwarecategory")) { foreach (Cyberware objCyberware in _objCharacter.Cyberware) { if (objCyberware.Category == objXmlCyberware.InnerText) intTotal++; } } if (intTotal >= Convert.ToInt32(objXmlRequired["count"].InnerText)) blnOneOfMet = true; } else if (objXmlRequired.Name == "streetcredvsnotoriety") { // Street Cred must be higher than Notoriety. if (_objCharacter.StreetCred >= _objCharacter.Notoriety) blnOneOfMet = true; } else if (objXmlRequired.Name == "damageresistance") { // Damage Resistance must be a particular value. ImprovementManager _objImprovementManager = new ImprovementManager(_objCharacter); if (_objCharacter.BOD.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.DamageResistance) >= Convert.ToInt32(objXmlRequired.InnerText)) blnOneOfMet = true; } } // Update the flag for requirements met. blnRequirementMet = blnRequirementMet && blnOneOfMet; strRequirement += strThisRequirement; } // The character has not met the requirements, so display a message and uncheck the item. if (!blnRequirementMet) { string strMessage = LanguageManager.Instance.GetString("Message_SelectQuality_QualityRequirement"); strMessage += strRequirement; if (blnShowMessage) MessageBox.Show(strMessage, LanguageManager.Instance.GetString("MessageTitle_SelectQuality_QualityRequirement"), MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } return true; }
/// <summary> /// Create a Critter, put them into Career Mode, link them, and open the newly-created Critter. /// </summary> /// <param name="strCritterName">Name of the Critter's Metatype.</param> /// <param name="intForce">Critter's Force.</param> private void CreateCritter(string strCritterName, int intForce) { // The Critter should use the same settings file as the character. Character objCharacter = new Character(); objCharacter.SettingsFile = _objSpirit.CharacterObject.SettingsFile; // Override the defaults for the setting. objCharacter.IgnoreRules = true; objCharacter.IsCritter = true; objCharacter.BuildMethod = CharacterBuildMethod.Karma; objCharacter.BuildPoints = 0; if (txtCritterName.Text != string.Empty) objCharacter.Name = txtCritterName.Text; // Make sure that Running Wild is one of the allowed source books since most of the Critter Powers come from this book. bool blnRunningWild = false; blnRunningWild = (objCharacter.Options.Books.Contains("RW")); if (!blnRunningWild) { MessageBox.Show(LanguageManager.Instance.GetString("Message_Main_RunningWild"), LanguageManager.Instance.GetString("MessageTitle_Main_RunningWild"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } // Ask the user to select a filename for the new character. string strForce = LanguageManager.Instance.GetString("String_Force"); if (_objSpirit.EntityType == SpiritType.Sprite) strForce = LanguageManager.Instance.GetString("String_Rating"); SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Chummer5 Files (*.chum5)|*.chum5|All Files (*.*)|*.*"; saveFileDialog.FileName = strCritterName + " (" + strForce + " " + _objSpirit.Force.ToString() + ").chum5"; if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { string strFileName = saveFileDialog.FileName; objCharacter.FileName = strFileName; } else return; // Code from frmMetatype. ImprovementManager objImprovementManager = new ImprovementManager(objCharacter); XmlDocument objXmlDocument = XmlManager.Instance.Load("critters.xml"); XmlNode objXmlMetatype = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + strCritterName + "\"]"); // If the Critter could not be found, show an error and get out of here. if (objXmlMetatype == null) { MessageBox.Show(LanguageManager.Instance.GetString("Message_UnknownCritterType").Replace("{0}", strCritterName), LanguageManager.Instance.GetString("MessageTitle_SelectCritterType"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // Set Metatype information. if (strCritterName == "Ally Spirit") { objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodaug"].InnerText, intForce, 0)); objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agiaug"].InnerText, intForce, 0)); objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reaaug"].InnerText, intForce, 0)); objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["straug"].InnerText, intForce, 0)); objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chaaug"].InnerText, intForce, 0)); objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intaug"].InnerText, intForce, 0)); objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logaug"].InnerText, intForce, 0)); objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilaug"].InnerText, intForce, 0)); objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magaug"].InnerText, intForce, 0)); objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resaug"].InnerText, intForce, 0)); objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgaug"].InnerText, intForce, 0)); objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } else { int intMinModifier = -3; if (objXmlMetatype["category"].InnerText == "Mutant Critters") intMinModifier = 0; objCharacter.BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3)); objCharacter.AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3)); objCharacter.REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3)); objCharacter.STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3)); objCharacter.CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3)); objCharacter.INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3)); objCharacter.LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3)); objCharacter.WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3)); objCharacter.INI.AssignLimits(ExpressionToString(objXmlMetatype["inimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["iniaug"].InnerText, intForce, 0)); objCharacter.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3)); objCharacter.RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3)); objCharacter.EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3)); objCharacter.ESS.AssignLimits(ExpressionToString(objXmlMetatype["essmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["essaug"].InnerText, intForce, 0)); } // If we're working with a Critter, set the Attributes to their default values. objCharacter.BOD.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0)); objCharacter.AGI.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0)); objCharacter.REA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0)); objCharacter.STR.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0)); objCharacter.CHA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0)); objCharacter.INT.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0)); objCharacter.LOG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0)); objCharacter.WIL.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0)); objCharacter.MAG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0)); objCharacter.RES.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0)); objCharacter.EDG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0)); objCharacter.ESS.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0)); // Sprites can never have Physical Attributes or WIL. if (objXmlMetatype["category"].InnerText.EndsWith("Sprite")) { objCharacter.BOD.AssignLimits("0", "0", "0"); objCharacter.AGI.AssignLimits("0", "0", "0"); objCharacter.REA.AssignLimits("0", "0", "0"); objCharacter.STR.AssignLimits("0", "0", "0"); objCharacter.WIL.AssignLimits("0", "0", "0"); objCharacter.INI.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); objCharacter.INI.MetatypeMaximum = Convert.ToInt32(ExpressionToString(objXmlMetatype["inimax"].InnerText, intForce, 0)); } objCharacter.Metatype = strCritterName; objCharacter.MetatypeCategory = objXmlMetatype["category"].InnerText; objCharacter.Metavariant = ""; objCharacter.MetatypeBP = 0; if (objXmlMetatype["movement"] != null) objCharacter.Movement = objXmlMetatype["movement"].InnerText; // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Instance.Load("qualities.xml"); // Determine if the Metatype has any bonuses. if (objXmlMetatype.InnerXml.Contains("bonus")) objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metatype, strCritterName, objXmlMetatype.SelectSingleNode("bonus"), false, 1, strCritterName); // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) objCharacter.Weapons.Add(objWeapon); } foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(objCharacter); string strForceValue = ""; if (objXmlQualityItem.Attributes["select"] != null) strForceValue = objXmlQualityItem.Attributes["select"].InnerText; QualitySource objSource = new QualitySource(); objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"] != null) objSource = QualitySource.MetatypeRemovable; objQuality.Create(objXmlQuality, objCharacter, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) objCharacter.Weapons.Add(objWeapon); } // Add any Critter Powers the Metatype/Critter should have. XmlNode objXmlCritter = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + objCharacter.Metatype + "\"]"); objXmlDocument = XmlManager.Instance.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(objCharacter); string strForcedValue = ""; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); if (objXmlPower.Attributes["select"] != null) strForcedValue = objXmlPower.Attributes["select"].InnerText; objPower.Create(objXmlCritterPower, objCharacter, objNode, intRating, strForcedValue); objCharacter.CritterPowers.Add(objPower); } // Set the Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/skill")) { if (objXmlSkill.InnerText.Contains("Exotic")) { Skill objExotic = new Skill(objCharacter); objExotic.ExoticSkill = true; objExotic.Attribute = "AGI"; if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objExotic.Specializations.Add(objSpec); } if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)) > 6) objExotic.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objExotic.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objExotic.Name = objXmlSkill.InnerText; objCharacter.Skills.Add(objExotic); } else { foreach (Skill objSkill in objCharacter.Skills) { if (objSkill.Name == objXmlSkill.InnerText) { if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objSkill.Specializations.Add(objSpec); } if (Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)) > 6) objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); break; } } } } // Set the Skill Group Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/group")) { foreach (SkillGroup objSkill in objCharacter.SkillGroups) { if (objSkill.Name == objXmlSkill.InnerText) { objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); break; } } } // Set the Knowledge Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/knowledge")) { Skill objKnowledge = new Skill(objCharacter); objKnowledge.Name = objXmlSkill.InnerText; objKnowledge.KnowledgeSkill = true; if (objXmlSkill.Attributes["spec"] != null) { SkillSpecialization objSpec = new SkillSpecialization(objXmlSkill.Attributes["spec"].InnerText); objKnowledge.Specializations.Add(objSpec); } objKnowledge.SkillCategory = objXmlSkill.Attributes["category"].InnerText; if (Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText) > 6) objKnowledge.RatingMaximum = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); objKnowledge.Rating = Convert.ToInt32(objXmlSkill.Attributes["rating"].InnerText); objCharacter.Skills.Add(objKnowledge); } // If this is a Critter with a Force (which dictates their Skill Rating/Maximum Skill Rating), set their Skill Rating Maximums. if (intForce > 0) { int intMaxRating = intForce; // Determine the highest Skill Rating the Critter has. foreach (Skill objSkill in objCharacter.Skills) { if (objSkill.RatingMaximum > intMaxRating) intMaxRating = objSkill.RatingMaximum; } // Now that we know the upper limit, set all of the Skill Rating Maximums to match. foreach (Skill objSkill in objCharacter.Skills) objSkill.RatingMaximum = intMaxRating; foreach (SkillGroup objGroup in objCharacter.SkillGroups) objGroup.RatingMaximum = intMaxRating; // Set the MaxSkillRating for the character so it can be used later when they add new Knowledge Skills or Exotic Skills. objCharacter.MaxSkillRating = intMaxRating; } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Instance.Load("complexforms.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { string strForceValue = ""; if (objXmlComplexForm.Attributes["select"] != null) strForceValue = objXmlComplexForm.Attributes["select"].InnerText; XmlNode objXmlProgram = objXmlProgramDocument.SelectSingleNode("/chummer/complexforms/complexform[name = \"" + objXmlComplexForm.InnerText + "\"]"); TreeNode objNode = new TreeNode(); ComplexForm objProgram = new ComplexForm(objCharacter); objProgram.Create(objXmlProgram, objCharacter, objNode, strForceValue); objCharacter.ComplexForms.Add(objProgram); } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlCritter.SelectNodes("gears/gear")) { int intRating = 0; if (objXmlGear.Attributes["rating"] != null) intRating = Convert.ToInt32(ExpressionToString(objXmlGear.Attributes["rating"].InnerText, Convert.ToInt32(nudForce.Value), 0)); string strForceValue = ""; if (objXmlGear.Attributes["select"] != null) strForceValue = objXmlGear.Attributes["select"].InnerText; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear.InnerText + "\"]"); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(objCharacter); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); objGear.Create(objXmlGearItem, objCharacter, objNode, intRating, lstWeapons, lstWeaponNodes, strForceValue); objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; objCharacter.Gear.Add(objGear); } // If this is a Mutant Critter, count up the number of Skill points they start with. if (objCharacter.MetatypeCategory == "Mutant Critters") { foreach (Skill objSkill in objCharacter.Skills) objCharacter.MutantCritterBaseSkills += objSkill.Rating; } // Add the Unarmed Attack Weapon to the character. try { objXmlDocument = XmlManager.Instance.Load("weapons.xml"); XmlNode objXmlWeapon = objXmlDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"Unarmed Attack\"]"); TreeNode objDummy = new TreeNode(); Weapon objWeapon = new Weapon(objCharacter); objWeapon.Create(objXmlWeapon, objCharacter, objDummy, null, null, null); objCharacter.Weapons.Add(objWeapon); } catch { } objCharacter.Alias = strCritterName; objCharacter.Created = true; objCharacter.Save(); string strOpenFile = objCharacter.FileName; objCharacter = null; // Link the newly-created Critter to the Spirit. _objSpirit.FileName = strOpenFile; if (_objSpirit.EntityType == SpiritType.Spirit) tipTooltip.SetToolTip(imgLink, LanguageManager.Instance.GetString("Tip_Spirit_OpenFile")); else tipTooltip.SetToolTip(imgLink, LanguageManager.Instance.GetString("Tip_Sprite_OpenFile")); FileNameChanged(this); GlobalOptions.Instance.MainForm.LoadCharacter(strOpenFile, true); }
private void frmCreate_FormClosing(object sender, FormClosingEventArgs e) { // If there are unsaved changes to the character, as the user if they would like to save their changes. if (_blnIsDirty) { string strCharacterName = _objCharacter.Alias; if (_objCharacter.Alias.Trim() == string.Empty) strCharacterName = LanguageManager.Instance.GetString("String_UnnamedCharacter"); DialogResult objResult = MessageBox.Show(LanguageManager.Instance.GetString("Message_UnsavedChanges").Replace("{0}", strCharacterName), LanguageManager.Instance.GetString("MessageTitle_UnsavedChanges"), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (objResult == DialogResult.Yes) { // Attempt to save the Character. If the user cancels the Save As dialogue that may open, cancel the closing event so that changes are not lost. bool blnResult = SaveCharacter(); if (!blnResult) e.Cancel = true; } else if (objResult == DialogResult.Cancel) { e.Cancel = true; } } // Reset the ToolStrip so the Save button is removed for the currently closing window. if (!e.Cancel) { if (!_blnSkipToolStripRevert) ToolStripManager.RevertMerge("toolStrip"); // Unsubscribe from events. _objCharacter.MAGEnabledChanged -= objCharacter_MAGEnabledChanged; _objCharacter.RESEnabledChanged -= objCharacter_RESEnabledChanged; _objCharacter.AdeptTabEnabledChanged -= objCharacter_AdeptTabEnabledChanged; _objCharacter.MagicianTabEnabledChanged -= objCharacter_MagicianTabEnabledChanged; _objCharacter.TechnomancerTabEnabledChanged -= objCharacter_TechnomancerTabEnabledChanged; _objCharacter.InitiationTabEnabledChanged -= objCharacter_InitiationTabEnabledChanged; _objCharacter.CritterTabEnabledChanged -= objCharacter_CritterTabEnabledChanged; _objCharacter.BlackMarketEnabledChanged -= objCharacter_BlackMarketChanged; _objCharacter.UneducatedChanged -= objCharacter_UneducatedChanged; _objCharacter.UncouthChanged -= objCharacter_UncouthChanged; _objCharacter.FriendsInHighPlacesChanged -= objCharacter_FriendsInHighPlacesChanged; _objCharacter.SchoolOfHardKnocksChanged -= objCharacter_SchoolOfHardKnocksChanged; GlobalOptions.Instance.MRUChanged -= PopulateMRU; treGear.ItemDrag -= treGear_ItemDrag; treGear.DragEnter -= treGear_DragEnter; treGear.DragDrop -= treGear_DragDrop; treLifestyles.ItemDrag -= treLifestyles_ItemDrag; treLifestyles.DragEnter -= treLifestyles_DragEnter; treLifestyles.DragDrop -= treLifestyles_DragDrop; treArmor.ItemDrag -= treArmor_ItemDrag; treArmor.DragEnter -= treArmor_DragEnter; treArmor.DragDrop -= treArmor_DragDrop; treWeapons.ItemDrag -= treWeapons_ItemDrag; treWeapons.DragEnter -= treWeapons_DragEnter; treWeapons.DragDrop -= treWeapons_DragDrop; treVehicles.ItemDrag -= treVehicles_ItemDrag; treVehicles.DragEnter -= treVehicles_DragEnter; treVehicles.DragDrop -= treVehicles_DragDrop; // Remove events from all UserControls. foreach (SkillControl objSkillControl in panSkillGroups.Controls.OfType<SkillControl>()) { objSkillControl.RatingChanged -= objActiveSkill_RatingChanged; objSkillControl.SpecializationChanged -= objSkill_SpecializationChanged; objSkillControl.BreakGroupClicked -= objSkill_BreakGroupClicked; objSkillControl.BuyWithKarmaChanged -= objActiveSkill_BuyWithKarmaChanged; } foreach (SkillGroupControl objGroupControl in panSkillGroups.Controls.OfType<SkillGroupControl>()) { objGroupControl.GroupRatingChanged -= objGroup_RatingChanged; } foreach (SkillControl objSkillControl in panKnowledgeSkills.Controls.OfType<SkillControl>()) { objSkillControl.RatingChanged -= objKnowledgeSkill_RatingChanged; objSkillControl.SpecializationChanged -= objSkill_SpecializationChanged; objSkillControl.DeleteSkill -= objKnowledgeSkill_DeleteSkill; objSkillControl.BreakGroupClicked -= objSkill_BreakGroupClicked; objSkillControl.BuyWithKarmaChanged -= objKnowledgeSkill_BuyWithKarmaChanged; } foreach (ContactControl objContactControl in panContacts.Controls.OfType<ContactControl>()) { objContactControl.ConnectionRatingChanged -= objContact_ConnectionRatingChanged; objContactControl.LoyaltyRatingChanged -= objContact_LoyaltyRatingChanged; objContactControl.DeleteContact -= objContact_DeleteContact; objContactControl.FileNameChanged -= objContact_FileNameChanged; objContactControl.FreeRatingChanged -= objContact_OtherCostChanged; } foreach (ContactControl objContactControl in panEnemies.Controls.OfType<ContactControl>()) { objContactControl.ConnectionRatingChanged -= objEnemy_ConnectionRatingChanged; objContactControl.LoyaltyRatingChanged -= objEnemy_LoyaltyRatingChanged; objContactControl.DeleteContact -= objEnemy_DeleteContact; objContactControl.FileNameChanged -= objEnemy_FileNameChanged; objContactControl.GroupStatusChanged -= objEnemy_GroupStatusChanged; objContactControl.FreeRatingChanged -= objEnemy_FreeStatusChanged; } foreach (PetControl objContactControl in panPets.Controls.OfType<PetControl>()) { objContactControl.DeleteContact -= objPet_DeleteContact; objContactControl.FileNameChanged -= objPet_FileNameChanged; } foreach (PowerControl objPowerControl in panPowers.Controls.OfType<PowerControl>()) { objPowerControl.PowerRatingChanged -= objPower_PowerRatingChanged; objPowerControl.DeletePower -= objPower_DeletePower; } foreach (SpiritControl objSpiritControl in panSpirits.Controls.OfType<SpiritControl>()) { objSpiritControl.ServicesOwedChanged -= objSpirit_ServicesOwedChanged; objSpiritControl.ForceChanged -= objSpirit_ForceChanged; objSpiritControl.BoundChanged -= objSpirit_BoundChanged; objSpiritControl.DeleteSpirit -= objSpirit_DeleteSpirit; objSpiritControl.FileNameChanged -= objSpirit_FileNameChanged; } foreach (SpiritControl objSpiritControl in panSprites.Controls.OfType<SpiritControl>()) { objSpiritControl.ServicesOwedChanged -= objSprite_ServicesOwedChanged; objSpiritControl.ForceChanged -= objSprite_ForceChanged; objSpiritControl.BoundChanged -= objSprite_BoundChanged; objSpiritControl.DeleteSpirit -= objSprite_DeleteSpirit; objSpiritControl.FileNameChanged -= objSprite_FileNameChanged; } // Trash the global variables and dispose of the Form. _objOptions = null; _objCharacter = null; _objImprovementManager = null; this.Dispose(true); } }
private void mnuSpecialPossessInanimate_Click(object sender, EventArgs e) { // Make sure the Spirit has been saved first. if (_blnIsDirty) { if (MessageBox.Show(LanguageManager.Instance.GetString("Message_PossessionSave"), LanguageManager.Instance.GetString("MessageTitle_Possession"), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) return; } // Prompt the user to select an inanimate Vessel. XmlDocument objVesselDoc = XmlManager.Instance.Load("vessels.xml"); XmlNodeList objXmlMetatypeList = objVesselDoc.SelectNodes("/chummer/metatypes/metatype"); List<ListItem> lstMetatype = new List<ListItem>(); foreach (XmlNode objXmlMetatype in objXmlMetatypeList) { ListItem objItem = new ListItem(); objItem.Value = objXmlMetatype["name"].InnerText; if (objXmlMetatype["translate"] != null) objItem.Name = objXmlMetatype["translate"].InnerText; else objItem.Name = objXmlMetatype["name"].InnerText; lstMetatype.Add(objItem); } frmSelectItem frmSelectVessel = new frmSelectItem(); frmSelectVessel.GeneralItems = lstMetatype; frmSelectVessel.ShowDialog(this); if (frmSelectVessel.DialogResult == DialogResult.Cancel) return; // Load the Spirit's save file into a new Merge character. Character objMerge = new Character(); objMerge.FileName = _objCharacter.FileName; objMerge.Load(); objMerge.Possessed = true; objMerge.Alias = frmSelectVessel.SelectedItem + " (" + LanguageManager.Instance.GetString("String_Possessed") + ")"; // Get the Node for the selected Vessel. XmlNode objSelected = objVesselDoc.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + frmSelectVessel.SelectedItem + "\"]"); // Get the Attribute Modifiers for the Vessel. int intBOD = Convert.ToInt32(objSelected["bodmin"].InnerText); int intAGI = Convert.ToInt32(objSelected["agimin"].InnerText); int intREA = Convert.ToInt32(objSelected["reamin"].InnerText); int intSTR = Convert.ToInt32(objSelected["strmin"].InnerText); // Add the Attribute modifiers, making sure that none of them go below 1. int intSetBOD = objMerge.MAG.TotalValue + intBOD; int intSetAGI = objMerge.MAG.TotalValue + intAGI; int intSetREA = objMerge.MAG.TotalValue + intREA; int intSetSTR = objMerge.MAG.TotalValue + intSTR; objMerge.BOD.MetatypeMinimum += intBOD; if (objMerge.BOD.MetatypeMinimum < 1) objMerge.BOD.MetatypeMinimum = 1; objMerge.BOD.MetatypeMaximum += intBOD; if (objMerge.BOD.MetatypeMaximum < 1) objMerge.BOD.MetatypeMaximum = 1; objMerge.BOD.Value = intSetBOD; if (objMerge.BOD.Value < 1) objMerge.BOD.Value = 1; objMerge.AGI.MetatypeMinimum += intAGI; if (objMerge.AGI.MetatypeMinimum < 1) objMerge.AGI.MetatypeMinimum = 1; objMerge.AGI.MetatypeMaximum += intAGI; if (objMerge.AGI.MetatypeMaximum < 1) objMerge.AGI.MetatypeMaximum = 1; objMerge.AGI.Value = intSetAGI; if (objMerge.AGI.Value < 1) objMerge.AGI.Value = 1; objMerge.REA.MetatypeMinimum += intREA; if (objMerge.REA.MetatypeMinimum < 1) objMerge.REA.MetatypeMinimum = 1; objMerge.REA.MetatypeMaximum += intREA; if (objMerge.REA.MetatypeMaximum < 1) objMerge.REA.MetatypeMaximum = 1; objMerge.REA.Value = intSetREA; if (objMerge.REA.Value < 1) objMerge.REA.Value = 1; objMerge.STR.MetatypeMinimum += intSTR; if (objMerge.STR.MetatypeMinimum < 1) objMerge.STR.MetatypeMinimum = 1; objMerge.STR.MetatypeMaximum += intSTR; if (objMerge.STR.MetatypeMaximum < 1) objMerge.STR.MetatypeMaximum = 1; objMerge.STR.Value = intSetSTR; if (objMerge.STR.Value < 1) objMerge.STR.Value = 1; // Update the Movement if the Vessel has one. if (objSelected["movement"] != null) objMerge.Movement = objSelected["movement"].InnerText; // Add any additional Critter Powers the Vessel grants. if (objSelected["powers"] != null) { XmlDocument objXmlPowerDoc = XmlManager.Instance.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objSelected.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlPowerDoc.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); CritterPower objPower = new CritterPower(objMerge); string strSelect = ""; int intRating = 0; if (objXmlPower.Attributes["select"] != null) strSelect = objXmlPower.Attributes["select"].InnerText; if (objXmlPower.Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); TreeNode objDummy = new TreeNode(); objPower.Create(objXmlCritterPower, objMerge, objDummy, intRating, strSelect); objMerge.CritterPowers.Add(objPower); } } // Give the Critter the Immunity to Normal Weapons Power if they don't already have it. bool blnHasImmunity = false; foreach (CritterPower objCritterPower in objMerge.CritterPowers) { if (objCritterPower.Name == "Immunity" && objCritterPower.Extra == "Normal Weapons") { blnHasImmunity = true; break; } } if (!blnHasImmunity) { XmlDocument objPowerDoc = new XmlDocument(); objPowerDoc = XmlManager.Instance.Load("critterpowers.xml"); XmlNode objPower = objPowerDoc.SelectSingleNode("/chummer/powers/power[name = \"Immunity\"]"); CritterPower objCritterPower = new CritterPower(objMerge); TreeNode objDummy = new TreeNode(); objCritterPower.Create(objPower, objMerge, objDummy, 0, "Normal Weapons"); objMerge.CritterPowers.Add(objCritterPower); } // Add any Improvements the Vessel grants. if (objSelected["bonus"] != null) { ImprovementManager objMergeManager = new ImprovementManager(objMerge); objMergeManager.CreateImprovements(Improvement.ImprovementSource.Metatype, frmSelectVessel.SelectedItem, objSelected["bonus"], false, 1, frmSelectVessel.SelectedItem); } // Now that everything is done, save the merged character and open them. SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Chummer5 Files (*.chum5)|*.chum5|All Files (*.*)|*.*"; string strShowFileName = ""; string[] strFile = _objCharacter.FileName.Split(Path.DirectorySeparatorChar); strShowFileName = strFile[strFile.Length - 1]; if (strShowFileName == "") strShowFileName = _objCharacter.Alias; strShowFileName = strShowFileName.Replace(".chum5", string.Empty); strShowFileName += " (" + LanguageManager.Instance.GetString("String_Possessed") + ")"; saveFileDialog.FileName = strShowFileName; if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { objMerge.FileName = saveFileDialog.FileName; objMerge.Save(); // Get the name of the file and destroy the references to the Vessel and the merged character. string strOpenFile = objMerge.FileName; objMerge = null; GlobalOptions.Instance.MainForm.LoadCharacter(strOpenFile); } else { // The save process was canceled, so drop everything. objMerge = null; } }