public void CreateAllGearTest() { // Create a new Human character. Character objCharacter = new Character(); objCharacter.LoadMetatype(Guid.Parse("e28e7075-f635-4c02-937c-e4fc61c51602")); TreeNode objNode = new TreeNode(); ContextMenuStrip cmsGear = new ContextMenuStrip(); List <Weapon> lstWeapons = new List <Weapon>(); List <TreeNode> lstTreeNodes = new List <TreeNode>(); XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlNode in objXmlDocument.SelectNodes("/chummer/gears/gear")) { Gear objGear = new Gear(objCharacter); objGear.Create(objXmlNode, objCharacter, objNode, 1, lstWeapons, lstTreeNodes); } }
/// <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 { SettingsFile = _objSpirit.CharacterObject.SettingsFile, // Override the defaults for the setting. IgnoreRules = true, IsCritter = true, BuildMethod = CharacterBuildMethod.Karma, BuildPoints = 0 }; if (!string.IsNullOrEmpty(txtCritterName.Text)) { objCharacter.Name = txtCritterName.Text; } // Ask the user to select a filename for the new character. string strForce = LanguageManager.GetString("String_Force"); if (_objSpirit.EntityType == SpiritType.Sprite) { strForce = LanguageManager.GetString("String_Rating"); } SaveFileDialog saveFileDialog = new SaveFileDialog { Filter = "Chummer5 Files (*.chum5)|*.chum5|All Files (*.*)|*.*", FileName = strCritterName + " (" + strForce + " " + _objSpirit.Force.ToString() + ").chum5" }; if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { string strFileName = saveFileDialog.FileName; objCharacter.FileName = strFileName; } else { objCharacter.Dispose(); return; } Cursor = Cursors.WaitCursor; // Code from frmMetatype. XmlDocument objXmlDocument = XmlManager.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.GetString("Message_UnknownCritterType").Replace("{0}", strCritterName), LanguageManager.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.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; 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.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.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0)); objCharacter.AGI.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0)); objCharacter.REA.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0)); objCharacter.STR.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0)); objCharacter.CHA.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0)); objCharacter.INT.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0)); objCharacter.LOG.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0)); objCharacter.WIL.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0)); objCharacter.MAG.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0)); objCharacter.RES.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0)); objCharacter.EDG.MetatypeMinimum = Convert.ToInt32(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0)); objCharacter.ESS.MetatypeMinimum = 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.Metatype = strCritterName; objCharacter.MetatypeCategory = objXmlMetatype["category"].InnerText; objCharacter.Metavariant = string.Empty; objCharacter.MetatypeBP = 0; if (objXmlMetatype["movement"] != null) { objCharacter.Movement = objXmlMetatype["movement"].InnerText; } // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Load("qualities.xml"); // Determine if the Metatype has any bonuses. if (objXmlMetatype.InnerXml.Contains("bonus")) { ImprovementManager.CreateImprovements(objCharacter, 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 = string.Empty; if (objXmlQualityItem.Attributes["select"] != null) { strForceValue = objXmlQualityItem.Attributes["select"].InnerText; } QualitySource objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"]?.InnerText == bool.TrueString) { 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 = string.Empty; if (objXmlQualityItem.Attributes["select"] != null) { strForceValue = objXmlQualityItem.Attributes["select"].InnerText; } QualitySource objSource = QualitySource.Metatype; if (objXmlQualityItem.Attributes["removable"]?.InnerText == bool.TrueString) { 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.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 = string.Empty; 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, objNode, intRating, strForcedValue); objCharacter.CritterPowers.Add(objPower); } if (objXmlCritter["optionalpowers"] != null) { //For every 3 full points of Force a spirit has, it may gain one Optional Power. for (int i = intForce - 3; i >= 0; i -= 3) { XmlDocument objDummyDocument = new XmlDocument(); XmlNode bonusNode = objDummyDocument.CreateNode(XmlNodeType.Element, "bonus", null); objDummyDocument.AppendChild(bonusNode); XmlNode powerNode = objDummyDocument.ImportNode(objXmlMetatype["optionalpowers"].CloneNode(true), true); objDummyDocument.ImportNode(powerNode, true); bonusNode.AppendChild(powerNode); ImprovementManager.CreateImprovements(objCharacter, Improvement.ImprovementSource.Metatype, objCharacter.Metatype, bonusNode, false, 1, objCharacter.Metatype); } } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Load("complexforms.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { string strForceValue = string.Empty; 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, objNode, null, strForceValue); objCharacter.ComplexForms.Add(objProgram); } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.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, decimal.ToInt32(nudForce.Value), 0)); } string strForceValue = string.Empty; 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, objNode, intRating, lstWeapons, lstWeaponNodes, strForceValue); objGear.Cost = "0"; objCharacter.Gear.Add(objGear); } // Add the Unarmed Attack Weapon to the character. objXmlDocument = XmlManager.Load("weapons.xml"); XmlNode objXmlWeapon = objXmlDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"Unarmed Attack\"]"); if (objXmlWeapon != null) { Weapon objWeapon = new Weapon(objCharacter); objWeapon.Create(objXmlWeapon, null, null, null, objCharacter.Weapons); objWeapon.ParentID = Guid.NewGuid().ToString(); // Unarmed Attack can never be removed objCharacter.Weapons.Add(objWeapon); } objCharacter.Alias = strCritterName; objCharacter.Created = true; if (!objCharacter.Save()) { Cursor = Cursors.Default; objCharacter.Dispose(); return; } string strOpenFile = objCharacter.FileName; objCharacter.Dispose(); objCharacter = null; // Link the newly-created Critter to the Spirit. _objSpirit.FileName = strOpenFile; if (_objSpirit.EntityType == SpiritType.Spirit) { tipTooltip.SetToolTip(imgLink, LanguageManager.GetString("Tip_Spirit_OpenFile")); } else { tipTooltip.SetToolTip(imgLink, LanguageManager.GetString("Tip_Sprite_OpenFile")); } FileNameChanged(this); Character objOpenCharacter = Program.MainForm.LoadCharacter(strOpenFile); Cursor = Cursors.Default; Program.MainForm.OpenCharacter(objOpenCharacter); }
/// Create a Weapon Accessory from an XmlNode and return the TreeNodes for it. /// <param name="objXmlAccessory">XmlNode to create the object from.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="strMount">Mount slot that the Weapon Accessory will consume.</param> /// <param name="intRating">Rating of the Weapon Accessory.</param> public void Create(XmlNode objXmlAccessory, TreeNode objNode, Tuple <string, string> strMount, int intRating, ContextMenuStrip cmsAccessoryGear, bool blnSkipCost = false, bool blnCreateChildren = true) { objXmlAccessory.TryGetStringFieldQuickly("name", ref _strName); _strMount = strMount.Item1; _strExtraMount = strMount.Item2; _intRating = intRating; objXmlAccessory.TryGetStringFieldQuickly("avail", ref _strAvail); // Check for a Variable Cost. if (blnSkipCost) { _strCost = "0"; } else if (objXmlAccessory["cost"] != null) { if (objXmlAccessory["cost"].InnerText.StartsWith("Variable")) { int intMin = 0; int intMax = 0; string strCost = objXmlAccessory["cost"].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(); _strCost = frmPickNumber.SelectedValue.ToString(); } } else { _strCost = objXmlAccessory["cost"].InnerText; } } objXmlAccessory.TryGetStringFieldQuickly("source", ref _strSource); objXmlAccessory.TryGetStringFieldQuickly("page", ref _strPage); _nodAllowGear = objXmlAccessory["allowgear"]; objXmlAccessory.TryGetStringFieldQuickly("rc", ref _strRC); objXmlAccessory.TryGetBoolFieldQuickly("rcdeployable", ref _blnDeployable); objXmlAccessory.TryGetInt32FieldQuickly("rcgroup", ref _intRCGroup); objXmlAccessory.TryGetStringFieldQuickly("conceal", ref _strConceal); objXmlAccessory.TryGetInt32FieldQuickly("ammoslots", ref _intAmmoSlots); objXmlAccessory.TryGetStringFieldQuickly("ammoreplace", ref _strAmmoReplace); objXmlAccessory.TryGetInt32FieldQuickly("accuracy", ref _intAccuracy); objXmlAccessory.TryGetStringFieldQuickly("dicepool", ref _strDicePool); objXmlAccessory.TryGetStringFieldQuickly("damagetype", ref _strDamageType); objXmlAccessory.TryGetStringFieldQuickly("damage", ref _strDamage); objXmlAccessory.TryGetStringFieldQuickly("damagereplace", ref _strDamageReplace); objXmlAccessory.TryGetStringFieldQuickly("firemode", ref _strFireMode); objXmlAccessory.TryGetStringFieldQuickly("firemodereplace", ref _strFireModeReplace); objXmlAccessory.TryGetStringFieldQuickly("ap", ref _strAP); objXmlAccessory.TryGetStringFieldQuickly("apreplace", ref _strAPReplace); objXmlAccessory.TryGetStringFieldQuickly("addmode", ref _strAddMode); objXmlAccessory.TryGetInt32FieldQuickly("fullburst", ref _intFullBurst); objXmlAccessory.TryGetInt32FieldQuickly("suppressive", ref _intSuppressive); objXmlAccessory.TryGetInt32FieldQuickly("rangebonus", ref _intRangeBonus); objXmlAccessory.TryGetStringFieldQuickly("extra", ref _strExtra); objXmlAccessory.TryGetInt32FieldQuickly("ammobonus", ref _intAmmoBonus); objXmlAccessory.TryGetInt32FieldQuickly("accessorycostmultiplier", ref _intAccessoryCostMultiplier); // Add any Gear that comes with the Weapon Accessory. if (objXmlAccessory["gears"] != null && blnCreateChildren) { XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlAccessoryGear in objXmlAccessory.SelectNodes("gears/usegear")) { intRating = 0; string strForceValue = string.Empty; if (objXmlAccessoryGear.Attributes["rating"] != null) { intRating = Convert.ToInt32(objXmlAccessoryGear.Attributes["rating"].InnerText); } if (objXmlAccessoryGear.Attributes["select"] != null) { strForceValue = objXmlAccessoryGear.Attributes["select"].InnerText; } XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlAccessoryGear.InnerText + "\"]"); Gear objGear = new Gear(_objCharacter); TreeNode objGearNode = new TreeNode(); List <Weapon> lstWeapons = new List <Weapon>(); List <TreeNode> lstWeaponNodes = new List <TreeNode>(); objGear.Create(objXmlGear, _objCharacter, objGearNode, intRating, lstWeapons, lstWeaponNodes, strForceValue, false, false, !blnSkipCost); objGear.Cost = "0"; objGear.MaxRating = objGear.Rating; objGear.MinRating = objGear.Rating; objGear.IncludedInParent = true; _lstGear.Add(objGear); objGearNode.ContextMenuStrip = cmsAccessoryGear; objNode.Nodes.Add(objGearNode); objNode.Expand(); } } if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("weapons.xml"); XmlNode objAccessoryNode = objXmlDocument.SelectSingleNode("/chummer/accessories/accessory[name = \"" + _strName + "\"]"); if (objAccessoryNode != null) { if (objAccessoryNode["translate"] != null) { _strAltName = objAccessoryNode["translate"].InnerText; } if (objAccessoryNode["altpage"] != null) { _strAltPage = objAccessoryNode["altpage"].InnerText; } } } objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); }
private void tsWeaponAccessoryGearMenuAddAsPlugin_Click(object sender, EventArgs e) { // Locate the Vehicle Sensor Gear. bool blnFound = false; WeaponAccessory objFoundAccessory = new WeaponAccessory(_objCharacter); Gear objSensor = (Gear)_objFunctions.FindEquipment(treWeapons.SelectedNode.Tag.ToString(), _objCharacter.Weapons, typeof(Gear)); if (objSensor != null) blnFound = true; if (objSensor.Parent != null) objFoundAccessory = (WeaponAccessory)objSensor.Parent; // Make sure the Gear was found. if (!blnFound) { MessageBox.Show(LanguageManager.Instance.GetString("Message_ModifyVehicleGear"), LanguageManager.Instance.GetString("MessageTitle_SelectGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + objSensor.ExternalId + "\"]"); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter); //frmPickGear.ShowNegativeCapacityOnly = true; if (objXmlGear["addoncategory"] != null) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSensor.Category + ","; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; // Open the Gear XML file and locate the selected piece. objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + frmPickGear.SelectedGear + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlink": case "Commlink Upgrade": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; objNode.Text = objCommlink.DisplayName; objGear = objCommlink; break; case "Commlink Operating System": case "Commlink Operating System Upgrade": OperatingSystem objOperatingSystem = new OperatingSystem(_objCharacter); objOperatingSystem.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objOperatingSystem.Quantity = frmPickGear.SelectedQty; objNode.Text = objOperatingSystem.DisplayName; objGear = objOperatingSystem; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, true, true, frmPickGear.Aerodynamic); objNewGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objNewGear.DisplayName; objGear = objNewGear; break; } if (objGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objGear.Cost = (Convert.ToDouble(objGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objGear.Cost != "") objGear.Cost = "(" + objGear.Cost + ") * 0.1"; if (objGear.Cost3 != "") objGear.Cost3 = "(" + objGear.Cost3 + ") * 0.1"; if (objGear.Cost6 != "") objGear.Cost6 = "(" + objGear.Cost6 + ") * 0.1"; if (objGear.Cost10 != "") objGear.Cost10 = "(" + objGear.Cost10 + ") * 0.1"; if (objGear.Extra == "") objGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; } objNode.Text = objGear.DisplayName; objNode.ContextMenuStrip = cmsWeaponAccessoryGear; treWeapons.SelectedNode.Nodes.Add(objNode); treWeapons.SelectedNode.Expand(); objGear.Parent = objSensor; objSensor.Gears.Add(objGear); if (frmPickGear.AddAgain) tsWeaponAccessoryGearMenuAddAsPlugin_Click(sender, e); UpdateCharacterInfo(); RefreshSelectedWeapon(); }
private void tsWeaponAccessoryGearMenuAddAsPlugin_Click(object sender, EventArgs e) { // Locate the Vehicle Sensor Gear. bool blnFound = false; WeaponAccessory objFoundAccessory = new WeaponAccessory(_objCharacter); Gear objSensor = _objFunctions.FindWeaponGear(treWeapons.SelectedNode.Tag.ToString(), _objCharacter.Weapons, out objFoundAccessory); if (objSensor != null) blnFound = true; // Make sure the Gear was found. if (!blnFound) { MessageBox.Show(LanguageManager.Instance.GetString("Message_ModifyVehicleGear"), LanguageManager.Instance.GetString("MessageTitle_SelectGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSensor.Name + "\" and category = \"" + objSensor.Category + "\"]"); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, true); //frmPickGear.ShowNegativeCapacityOnly = true; if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSensor.Category + ","; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; // Open the Gear XML file and locate the selected piece. objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; objNode.Text = objCommlink.DisplayName; objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, true, true, frmPickGear.Aerodynamic); objNewGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objNewGear.DisplayName; objGear = objNewGear; break; } if (objGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objGear.Cost = (Convert.ToDouble(objGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objGear.Cost != "") objGear.Cost = "(" + objGear.Cost + ") * 0.1"; if (objGear.Cost3 != "") objGear.Cost3 = "(" + objGear.Cost3 + ") * 0.1"; if (objGear.Cost6 != "") objGear.Cost6 = "(" + objGear.Cost6 + ") * 0.1"; if (objGear.Cost10 != "") objGear.Cost10 = "(" + objGear.Cost10 + ") * 0.1"; if (objGear.Extra == "") objGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; } objNode.Text = objGear.DisplayName; int intCost = objGear.TotalCost; // Multiply the cost if applicable. if (objGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailRestricted")) && _objOptions.MultiplyRestrictedCost) intCost *= _objOptions.RestrictedCostMultiplier; if (objGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailForbidden")) && _objOptions.MultiplyForbiddenCost) intCost *= _objOptions.ForbiddenCostMultiplier; // Check the item's Cost and make sure the character can afford it. if (!frmPickGear.FreeCost) { if (intCost > _objCharacter.Nuyen) { _objFunctions.DeleteGear(objGear, treWeapons, _objImprovementManager); MessageBox.Show(LanguageManager.Instance.GetString("Message_NotEnoughNuyen"), LanguageManager.Instance.GetString("MessageTitle_NotEnoughNuyen"), MessageBoxButtons.OK, MessageBoxIcon.Information); if (frmPickGear.AddAgain) tsVehicleSensorAddAsPlugin_Click(sender, e); return; } else { // Create the Expense Log Entry. ExpenseLogEntry objExpense = new ExpenseLogEntry(); objExpense.Create(intCost * -1, LanguageManager.Instance.GetString("String_ExpensePurchaseWeaponGear") + " " + objGear.DisplayNameShort, ExpenseType.Nuyen, DateTime.Now); _objCharacter.ExpenseEntries.Add(objExpense); _objCharacter.Nuyen -= intCost; ExpenseUndo objUndo = new ExpenseUndo(); objUndo.CreateNuyen(NuyenExpenseType.AddWeaponGear, objGear.InternalId, frmPickGear.SelectedQty); objExpense.Undo = objUndo; } } objNode.ContextMenuStrip = cmsCyberwareGear; treWeapons.SelectedNode.Nodes.Add(objNode); treWeapons.SelectedNode.Expand(); objGear.Parent = objSensor; objSensor.Children.Add(objGear); if (frmPickGear.AddAgain) tsWeaponAccessoryGearMenuAddAsPlugin_Click(sender, e); UpdateCharacterInfo(); RefreshSelectedWeapon(); }
/// <summary> /// Select a piece of Gear to be added to the character. /// </summary> /// <param name="blnAmmoOnly">Whether or not only Ammunition should be shown in the window.</param> /// <param name="objStackGear">Whether or not the selected item should stack with a matching item on the character.</param> /// <param name="strForceItemValue">Force the user to select an item with the passed name..</param> private bool PickGear(bool blnAmmoOnly = false, Gear objStackGear = null, string strForceItemValue = "") { bool blnNullParent = false; Gear objSelectedGear = new Gear(_objCharacter); if (treGear.SelectedNode != null) objSelectedGear = _objFunctions.FindGear(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear); if (objSelectedGear == null) { objSelectedGear = new Gear(_objCharacter); blnNullParent = true; } ExpenseUndo objUndo = new ExpenseUndo(); // Open the Gear XML file and locate the selected Gear. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSelectedGear.Name + "\" and category = \"" + objSelectedGear.Category + "\"]"); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, true, objSelectedGear.ChildAvailModifier, objSelectedGear.ChildCostMultiplier); try { if (treGear.SelectedNode.Level > 0) { if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSelectedGear.Category + ","; // If the Gear has a Capacity with no brackets (meaning it grants Capacity), show only Subsystems (those that conume Capacity). if (!objSelectedGear.Capacity.Contains('[')) { frmPickGear.MaximumCapacity = objSelectedGear.CapacityRemaining; // Do not allow the user to add a new piece of Gear if its Capacity has been reached. if (_objOptions.EnforceCapacity && objSelectedGear.CapacityRemaining < 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_CapacityReached"), LanguageManager.Instance.GetString("MessageTitle_CapacityReached"), MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } if (objSelectedGear.Category == "Commlink") { Commlink objCommlink = (Commlink)objSelectedGear; frmPickGear.CommlinkResponse = objCommlink.DeviceRating; // If a Commlink has just been added, see if the character already has one. If not, make it the active Commlink. if (_objFunctions.FindCharacterCommlinks(_objCharacter.Gear).Count == 0) objCommlink.IsActive = true; } } } catch { } if (blnAmmoOnly) { frmPickGear.AllowedCategories = "Ammunition"; frmPickGear.SelectedGear = objSelectedGear.Name; } frmPickGear.ShowDialog(this); // Make sure the dialogue window was not canceled. if (frmPickGear.DialogResult == DialogResult.Cancel) return false; TreeNode objNode = new TreeNode(); // Open the Cyberware XML file and locate the selected piece. objXmlDocument = XmlManager.Instance.Load("gear.xml"); objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. Gear objNewGear = new Gear(_objCharacter); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; objNode.Text = objCommlink.DisplayName; objNewGear = objCommlink; break; default: string strForceValue = ""; if (blnAmmoOnly) { strForceValue = objSelectedGear.Extra; try { treGear.SelectedNode = treGear.SelectedNode.Parent; } catch { } } if (strForceItemValue != "") strForceValue = strForceItemValue; Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, strForceValue, frmPickGear.Hacked, frmPickGear.InherentProgram, true, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } objNewGear.Parent = objSelectedGear; if (blnNullParent) objNewGear.Parent = null; if (objNewGear.InternalId == Guid.Empty.ToString()) return false; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objNewGear.Cost != "") objNewGear.Cost = "(" + objNewGear.Cost + ") * 0.1"; if (objNewGear.Cost3 != "") objNewGear.Cost3 = "(" + objNewGear.Cost3 + ") * 0.1"; if (objNewGear.Cost6 != "") objNewGear.Cost6 = "(" + objNewGear.Cost6 + ") * 0.1"; if (objNewGear.Cost10 != "") objNewGear.Cost10 = "(" + objNewGear.Cost10 + ") * 0.1"; if (objNewGear.Extra == "") objNewGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objNewGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } int intCost = 0; if (objNewGear.Cost.Contains("Gear Cost")) { XPathNavigator nav = objXmlDocument.CreateNavigator(); string strCost = objNewGear.Cost.Replace("Gear Cost", objSelectedGear.CalculatedCost.ToString()); XPathExpression xprCost = nav.Compile(strCost); intCost = Convert.ToInt32(nav.Evaluate(xprCost).ToString()); } else { intCost = Convert.ToInt32(objNewGear.TotalCost); } bool blnMatchFound = false; Gear objStackWith = new Gear(_objCharacter); // See if the character already has the item on them if they chose to stack. if (frmPickGear.Stack) { if (objStackGear != null) { blnMatchFound = true; objStackWith = objStackGear; } else { foreach (Gear objCharacterGear in _objCharacter.Gear) { if (objCharacterGear.Name == objNewGear.Name && objCharacterGear.Category == objNewGear.Category && objCharacterGear.Rating == objNewGear.Rating && objCharacterGear.Extra == objNewGear.Extra) { blnMatchFound = true; objStackWith = objCharacterGear; break; } } } } if (blnMatchFound) { // If a match was found, we need to use the cost of a single item in the stack which can include plugins. foreach (Gear objPlugin in objStackWith.Children) intCost += (objPlugin.TotalCost * frmPickGear.SelectedQty); } if (!blnNullParent && !blnAmmoOnly) intCost *= objSelectedGear.Quantity; // Apply a markup if applicable. if (frmPickGear.Markup != 0) { double dblCost = Convert.ToDouble(intCost, GlobalOptions.Instance.CultureInfo); dblCost *= 1 + (Convert.ToDouble(frmPickGear.Markup, GlobalOptions.Instance.CultureInfo) / 100.0); intCost = Convert.ToInt32(dblCost); } // Multiply the cost if applicable. if (objNewGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailRestricted")) && _objOptions.MultiplyRestrictedCost) intCost *= _objOptions.RestrictedCostMultiplier; if (objNewGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailForbidden")) && _objOptions.MultiplyForbiddenCost) intCost *= _objOptions.ForbiddenCostMultiplier; // Do not allow the user to add a new piece of Cyberware if its Capacity has been reached. // This is wrapped in a try statement since the character may not have a piece of Gear selected and has clicked the Buy Additional Ammo button for a Weapon. try { if (!blnMatchFound && treGear.SelectedNode.Level > 0) { if (_objOptions.EnforceCapacity && objSelectedGear.CapacityRemaining - objNewGear.PluginCapacity < 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_CapacityReached"), LanguageManager.Instance.GetString("MessageTitle_CapacityReached"), MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } } catch { } // Check the item's Cost and make sure the character can afford it. if (!frmPickGear.FreeCost) { if (intCost > _objCharacter.Nuyen) { MessageBox.Show(LanguageManager.Instance.GetString("Message_NotEnoughNuyen"), LanguageManager.Instance.GetString("MessageTitle_NotEnoughNuyen"), MessageBoxButtons.OK, MessageBoxIcon.Information); // Remove any Improvements created by the Gear. _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Gear, objNewGear.InternalId); return frmPickGear.AddAgain; } else { // Create the Expense Log Entry. ExpenseLogEntry objExpense = new ExpenseLogEntry(); objExpense.Create(intCost * -1, LanguageManager.Instance.GetString("String_ExpensePurchaseGear") + " " + objNewGear.DisplayNameShort, ExpenseType.Nuyen, DateTime.Now); _objCharacter.ExpenseEntries.Add(objExpense); _objCharacter.Nuyen -= intCost; objUndo.CreateNuyen(NuyenExpenseType.AddGear, objNewGear.InternalId, objNewGear.Quantity); objExpense.Undo = objUndo; } } if (objNewGear.InternalId == Guid.Empty.ToString()) return false; if (blnMatchFound) { // A match was found, so increase the quantity instead. objStackWith.Quantity += objNewGear.Quantity; blnMatchFound = true; if (objUndo.ObjectId != "") objUndo.ObjectId = objStackWith.InternalId; foreach (TreeNode objGearNode in treGear.Nodes[0].Nodes) { if (objStackWith.InternalId == objGearNode.Tag.ToString()) { objGearNode.Text = objStackWith.DisplayName; treGear.SelectedNode = objGearNode; break; } } } // Add the Gear. if (!blnMatchFound) { // Create any Weapons that came with this Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } try { if (treGear.SelectedNode.Level > 0) { objNode.ContextMenuStrip = cmsGear; treGear.SelectedNode.Nodes.Add(objNode); treGear.SelectedNode.Expand(); objSelectedGear.Children.Add(objNewGear); } else { objNode.ContextMenuStrip = cmsGear; treGear.Nodes[0].Nodes.Add(objNode); treGear.Nodes[0].Expand(); _objCharacter.Gear.Add(objNewGear); } } catch { treGear.Nodes[0].Nodes.Add(objNode); treGear.Nodes[0].Expand(); _objCharacter.Gear.Add(objNewGear); } // Select the node that was just added. lblGearQty.Text = objNewGear.Quantity.ToString(); if (objNode.Level < 2) treGear.SelectedNode = objNode; } UpdateCharacterInfo(); RefreshSelectedGear(); if (frmPickGear.DialogResult != DialogResult.Cancel) { _blnIsDirty = true; UpdateWindowTitle(); } return frmPickGear.AddAgain; }
/// Create a Armor Modification from an XmlNode. /// <param name="objXmlArmorNode">XmlNode to create the object from.</param> /// <param name="intRating">Rating of the selected ArmorMod.</param> /// <param name="lstWeapons">List of Weapons that are created by the Armor.</param> /// <param name="objWeaponNodes">List of Weapon Nodes that are created by the Armor.</param> /// <param name="blnSkipCost">Whether or not creating the Armor should skip the Variable price dialogue (should only be used by frmSelectArmor).</param> public void Create(XmlNode objXmlArmorNode, int intRating, List <Weapon> lstWeapons, bool blnSkipCost = false, bool blnSkipSelectForms = false) { if (objXmlArmorNode.TryGetStringFieldQuickly("name", ref _strName)) { _objCachedMyXmlNode = null; } objXmlArmorNode.TryGetStringFieldQuickly("category", ref _strCategory); objXmlArmorNode.TryGetStringFieldQuickly("armorcapacity", ref _strArmorCapacity); objXmlArmorNode.TryGetStringFieldQuickly("gearcapacity", ref _strGearCapacity); _intRating = intRating; objXmlArmorNode.TryGetInt32FieldQuickly("armor", ref _intA); objXmlArmorNode.TryGetInt32FieldQuickly("maxrating", ref _intMaxRating); objXmlArmorNode.TryGetStringFieldQuickly("avail", ref _strAvail); objXmlArmorNode.TryGetStringFieldQuickly("source", ref _strSource); objXmlArmorNode.TryGetStringFieldQuickly("page", ref _strPage); objXmlArmorNode.TryGetStringFieldQuickly("notes", ref _strNotes); _nodBonus = objXmlArmorNode["bonus"]; _nodWirelessBonus = objXmlArmorNode["wirelessbonus"]; _blnWirelessOn = _nodWirelessBonus != null; // Check for a Variable Cost. if (blnSkipCost) { _strCost = "0"; } else if (objXmlArmorNode["cost"] != null) { XmlNode objXmlArmorCostNode = objXmlArmorNode["cost"]; if (objXmlArmorCostNode.InnerText.StartsWith("Variable(")) { decimal decMin = 0.0m; decimal decMax = decimal.MaxValue; string strCost = objXmlArmorNode["cost"].InnerText.TrimStart("Variable(", true).TrimEnd(')'); if (strCost.Contains('-')) { string[] strValues = strCost.Split('-'); decMin = Convert.ToDecimal(strValues[0], GlobalOptions.InvariantCultureInfo); decMax = Convert.ToDecimal(strValues[1], GlobalOptions.InvariantCultureInfo); } else { decMin = Convert.ToDecimal(strCost.FastEscape('+'), GlobalOptions.InvariantCultureInfo); } if (decMin != 0 || decMax != decimal.MaxValue) { string strNuyenFormat = _objCharacter.Options.NuyenFormat; int intDecimalPlaces = strNuyenFormat.IndexOf('.'); if (intDecimalPlaces == -1) { intDecimalPlaces = 0; } else { intDecimalPlaces = strNuyenFormat.Length - intDecimalPlaces - 1; } frmSelectNumber frmPickNumber = new frmSelectNumber(intDecimalPlaces); if (decMax > 1000000) { decMax = 1000000; } frmPickNumber.Minimum = decMin; frmPickNumber.Maximum = decMax; frmPickNumber.Description = LanguageManager.GetString("String_SelectVariableCost", GlobalOptions.Language).Replace("{0}", DisplayNameShort(GlobalOptions.Language)); frmPickNumber.AllowCancel = false; frmPickNumber.ShowDialog(); _strCost = frmPickNumber.SelectedValue.ToString(GlobalOptions.InvariantCultureInfo); } } else { _strCost = objXmlArmorCostNode.InnerText; } } if (objXmlArmorNode["bonus"] != null && !blnSkipCost && !blnSkipSelectForms) { if (!ImprovementManager.CreateImprovements(_objCharacter, Improvement.ImprovementSource.ArmorMod, _guiID.ToString(), objXmlArmorNode["bonus"], false, intRating, DisplayNameShort(GlobalOptions.Language))) { _guiID = Guid.Empty; return; } if (!string.IsNullOrEmpty(ImprovementManager.SelectedValue)) { _strExtra = ImprovementManager.SelectedValue; } } // Add any Gear that comes with the Armor. if (objXmlArmorNode["gears"] != null) { XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); foreach (XmlNode objXmlArmorGear in objXmlArmorNode.SelectNodes("gears/usegear")) { intRating = 0; string strForceValue = string.Empty; objXmlArmorGear.TryGetInt32FieldQuickly("rating", ref intRating); objXmlArmorGear.TryGetStringFieldQuickly("select", ref strForceValue); XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlArmorGear.InnerText + "\"]"); Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, intRating, lstWeapons, strForceValue, !blnSkipCost && !blnSkipSelectForms); objGear.Capacity = "[0]"; objGear.ArmorCapacity = "[0]"; objGear.Cost = "0"; objGear.MaxRating = objGear.Rating; objGear.MinRating = objGear.Rating; objGear.ParentID = InternalId; _lstGear.Add(objGear); } } // Add Weapons if applicable. if (objXmlArmorNode.InnerXml.Contains("<addweapon>")) { XmlDocument objXmlWeaponDocument = XmlManager.Load("weapons.xml"); // More than one Weapon can be added, so loop through all occurrences. foreach (XmlNode objXmlAddWeapon in objXmlArmorNode.SelectNodes("addweapon")) { string strLoopID = objXmlAddWeapon.InnerText; XmlNode objXmlWeapon = strLoopID.IsGuid() ? objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[id = \"" + strLoopID + "\"]") : objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + strLoopID + "\"]"); Weapon objGearWeapon = new Weapon(_objCharacter); objGearWeapon.Create(objXmlWeapon, lstWeapons, true, !blnSkipCost && !blnSkipSelectForms); objGearWeapon.ParentID = InternalId; lstWeapons.Add(objGearWeapon); _guiWeaponID = Guid.Parse(objGearWeapon.InternalId); } } }
/// <summary> /// Add a piece of Gear that was found in a PACKS Kit. /// </summary> /// <param name="objXmlGearDocument">XmlDocument that contains the Gear.</param> /// <param name="objXmlGear">XmlNode of the Gear to add.</param> /// <param name="objParent">TreeNode to attach the created items to.</param> /// <param name="objParentObject">Object to associate the newly-created items with.</param> /// <param name="cmsContextMenu">ContextMenuStrip to assign to the TreeNodes created.</param> /// <param name="blnCreateChildren">Whether or not the default plugins for the Gear should be created.</param> private void AddPACKSGear(XmlDocument objXmlGearDocument, XmlNode objXmlGear, TreeNode objParent, Object objParentObject, ContextMenuStrip cmsContextMenu, bool blnCreateChildren) { int intRating = 0; if (objXmlGear["rating"] != null) intRating = Convert.ToInt32(objXmlGear["rating"].InnerText); int intQty = 1; if (objXmlGear["qty"] != null) intQty = Convert.ToInt32(objXmlGear["qty"].InnerText); XmlNode objXmlGearNode; if (objXmlGear["category"] != null) objXmlGearNode = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear["name"].InnerText + "\" and category = \"" + objXmlGear["category"].InnerText + "\"]"); else objXmlGearNode = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear["name"].InnerText + "\"]"); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); string strForceValue = ""; if (objXmlGear["name"].Attributes["select"] != null) strForceValue = objXmlGear["name"].Attributes["select"].InnerText; Gear objNewGear = new Gear(_objCharacter); if (objXmlGearNode != null) { switch (objXmlGearNode["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGearNode, _objCharacter, objNode, intRating, true, blnCreateChildren); objCommlink.Quantity = intQty; objNewGear = objCommlink; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGearNode, _objCharacter, objNode, intRating, objWeapons, objWeaponNodes, strForceValue, false, false, true, blnCreateChildren); objGear.Quantity = intQty; objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } } if (objParentObject.GetType() == typeof(Character)) ((Character)objParentObject).Gear.Add(objNewGear); if (objParentObject.GetType() == typeof(Gear) || objParentObject.GetType() == typeof(Commlink) || objParentObject.GetType() == typeof(OperatingSystem)) { ((Gear)objParentObject).Children.Add(objNewGear); objNewGear.Parent = (Gear)objParentObject; } if (objParentObject.GetType() == typeof(Armor)) ((Armor)objParentObject).Gear.Add(objNewGear); if (objParentObject.GetType() == typeof(WeaponAccessory)) ((WeaponAccessory)objParentObject).Gear.Add(objNewGear); if (objParentObject.GetType() == typeof(Cyberware)) ((Cyberware)objParentObject).Gear.Add(objNewGear); // Look for child components. if (objXmlGear["gears"] != null) { foreach (XmlNode objXmlChild in objXmlGear.SelectNodes("gears/gear")) { AddPACKSGear(objXmlGearDocument, objXmlChild, objNode, objNewGear, cmsContextMenu, blnCreateChildren); } } objParent.Nodes.Add(objNode); objParent.Expand(); objNode.ContextMenuStrip = cmsContextMenu; objNode.Text = objNewGear.DisplayName; // Add any Weapons created by the Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } }
/// Create a Commlink from an XmlNode and return the TreeNodes for it. /// <param name="objXmlGear">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">Gear Rating.</param> /// <param name="blnAddImprovements">Whether or not Improvements should be added to the character.</param> /// <param name="blnCreateChildren">Whether or not child Gear should be created.</param> public void Create(XmlNode objXmlGear, Character objCharacter, TreeNode objNode, int intRating, bool blnAddImprovements = true, bool blnCreateChildren = true) { _strName = objXmlGear["name"].InnerText; _strCategory = objXmlGear["category"].InnerText; _strAvail = objXmlGear["avail"].InnerText; objXmlGear.TryGetField("cost", out _strCost); objXmlGear.TryGetField("cost3", out _strCost3, ""); objXmlGear.TryGetField("cost6", out _strCost6, ""); objXmlGear.TryGetField("cost10", out _strCost10, ""); objXmlGear.TryGetField("armorcapacity", out _strArmorCapacity); _nodBonus = objXmlGear["bonus"]; _intMaxRating = Convert.ToInt32(objXmlGear["rating"].InnerText); _intRating = intRating; _strSource = objXmlGear["source"].InnerText; _strPage = objXmlGear["page"].InnerText; _intDeviceRating = Convert.ToInt32(objXmlGear["devicerating"].InnerText); _intAttack = Convert.ToInt32(objXmlGear["attack"].InnerText); _intSleaze = Convert.ToInt32(objXmlGear["sleaze"].InnerText); _intDataProcessing = Convert.ToInt32(objXmlGear["dataprocessing"].InnerText); _intFirewall = Convert.ToInt32(objXmlGear["firewall"].InnerText); if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objGearNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + _strName + "\"]"); if (objGearNode != null) { if (objGearNode["translate"] != null) { _strAltName = objGearNode["translate"].InnerText; } if (objGearNode["altpage"] != null) { _strAltPage = objGearNode["altpage"].InnerText; } } if (_strAltName.StartsWith("Stacked Focus")) { _strAltName = _strAltName.Replace("Stacked Focus", LanguageManager.Instance.GetString("String_StackedFocus")); } objGearNode = objXmlDocument.SelectSingleNode("/chummer/categories/category[. = \"" + _strCategory + "\"]"); if (objGearNode != null) { if (objGearNode.Attributes["translate"] != null) { _strAltCategory = objGearNode.Attributes["translate"].InnerText; } } if (_strAltCategory.StartsWith("Stacked Focus")) { _strAltCategory = _strAltCategory.Replace("Stacked Focus", LanguageManager.Instance.GetString("String_StackedFocus")); } } string strSource = _guiID.ToString(); objNode.Text = DisplayNameShort; objNode.Tag = _guiID.ToString(); // If the item grants a bonus, pass the information to the Improvement Manager. if (objXmlGear["bonus"] != null) { ImprovementManager objImprovementManager; if (blnAddImprovements) { objImprovementManager = new ImprovementManager(objCharacter); } else { objImprovementManager = new ImprovementManager(null); } if (!objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Gear, strSource, objXmlGear["bonus"], false, 1, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (objImprovementManager.SelectedValue != "") { _strExtra = objImprovementManager.SelectedValue; objNode.Text += " (" + objImprovementManager.SelectedValue + ")"; } } // Check to see if there are any child elements. if (objXmlGear.InnerXml.Contains("<gears>") && blnCreateChildren) { // Create Gear using whatever information we're given. foreach (XmlNode objXmlChild in objXmlGear.SelectNodes("gears/gear")) { Gear objChild = new Gear(_objCharacter); TreeNode objChildNode = new TreeNode(); objChild.Name = objXmlChild["name"].InnerText; objChild.Category = objXmlChild["category"].InnerText; objChild.Avail = "0"; objChild.Cost = "0"; objChild.Source = _strSource; objChild.Page = _strPage; objChild.Parent = this; _objChildren.Add(objChild); objChildNode.Text = objChild.DisplayName; objChildNode.Tag = objChild.InternalId; objNode.Nodes.Add(objChildNode); objNode.Expand(); } XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); CreateChildren(objXmlGearDocument, objXmlGear, this, objNode, objCharacter, blnCreateChildren); } // Add the Copy Protection and Registration plugins to the Matrix program. This does not apply if Unwired is not enabled, Hacked is selected, or this is a Suite being added (individual programs will add it to themselves). if (blnCreateChildren) { if ((_strCategory == "Matrix Programs" || _strCategory == "Skillsofts" || _strCategory == "Autosofts" || _strCategory == "Autosofts, Agent" || _strCategory == "Autosofts, Drone") && objCharacter.Options.BookEnabled("UN") && !_strName.StartsWith("Suite:")) { XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); if (_objCharacter.Options.AutomaticCopyProtection) { Gear objPlugin1 = new Gear(_objCharacter); TreeNode objPlugin1Node = new TreeNode(); objPlugin1.Create(objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Copy Protection\"]"), objCharacter, objPlugin1Node, _intRating, null, null); if (_intRating == 0) { objPlugin1.Rating = 1; } objPlugin1.Avail = "0"; objPlugin1.Cost = "0"; objPlugin1.Cost3 = "0"; objPlugin1.Cost6 = "0"; objPlugin1.Cost10 = "0"; objPlugin1.Capacity = "[0]"; objPlugin1.Parent = this; _objChildren.Add(objPlugin1); objNode.Nodes.Add(objPlugin1Node); } if (_objCharacter.Options.AutomaticRegistration) { Gear objPlugin2 = new Gear(_objCharacter); TreeNode objPlugin2Node = new TreeNode(); objPlugin2.Create(objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Registration\"]"), objCharacter, objPlugin2Node, 0, null, null); objPlugin2.Avail = "0"; objPlugin2.Cost = "0"; objPlugin2.Cost3 = "0"; objPlugin2.Cost6 = "0"; objPlugin2.Cost10 = "0"; objPlugin2.Capacity = "[0]"; objPlugin2.Parent = this; _objChildren.Add(objPlugin2); objNode.Nodes.Add(objPlugin2Node); objNode.Expand(); } if ((objCharacter.Metatype == "A.I." || objCharacter.MetatypeCategory == "Technocritters" || objCharacter.MetatypeCategory == "Protosapients")) { Gear objPlugin3 = new Gear(_objCharacter); TreeNode objPlugin3Node = new TreeNode(); objPlugin3.Create(objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Ergonomic\"]"), objCharacter, objPlugin3Node, 0, null, null); objPlugin3.Avail = "0"; objPlugin3.Cost = "0"; objPlugin3.Cost3 = "0"; objPlugin3.Cost6 = "0"; objPlugin3.Cost10 = "0"; objPlugin3.Capacity = "[0]"; objPlugin3.Parent = this; _objChildren.Add(objPlugin3); objNode.Nodes.Add(objPlugin3Node); Gear objPlugin4 = new Gear(_objCharacter); TreeNode objPlugin4Node = new TreeNode(); objPlugin4.Create(objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Optimization\" and category = \"Program Options\"]"), objCharacter, objPlugin4Node, _intRating, null, null); if (_intRating == 0) { objPlugin4.Rating = 1; } objPlugin4.Avail = "0"; objPlugin4.Cost = "0"; objPlugin4.Cost3 = "0"; objPlugin4.Cost6 = "0"; objPlugin4.Cost10 = "0"; objPlugin4.Capacity = "[0]"; objPlugin4.Parent = this; _objChildren.Add(objPlugin4); objNode.Nodes.Add(objPlugin4Node); objNode.Expand(); } } } }
/// Create a Weapon Accessory from an XmlNode and return the TreeNodes for it. /// <param name="objXmlAccessory">XmlNode to create the object from.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="strMount">Mount slot that the Weapon Accessory will consume.</param> /// <param name="intRating">Rating of the Weapon Accessory.</param> public void Create(XmlNode objXmlAccessory, TreeNode objNode, string[] strMount, int intRating, ContextMenuStrip cmsAccessoryGear, bool blnSkipCost = false, bool blnCreateChildren = true) { _strName = objXmlAccessory["name"].InnerText; _strMount = strMount[0]; _strExtraMount = strMount[1]; _intRating = intRating; _strAvail = objXmlAccessory["avail"].InnerText; _strCost = objXmlAccessory["cost"].InnerText; _strSource = objXmlAccessory["source"].InnerText; _strPage = objXmlAccessory["page"].InnerText; _nodAllowGear = objXmlAccessory["allowgear"]; objXmlAccessory.TryGetField("rc", out _strRC, ""); objXmlAccessory.TryGetField("rcdeployable", out _blnDeployable); objXmlAccessory.TryGetField("rcgroup", out _intRCGroup); objXmlAccessory.TryGetField("conceal", out _strConceal, ""); objXmlAccessory.TryGetField("ammoslots", out _intAmmoSlots); objXmlAccessory.TryGetField("ammoreplace", out _strAmmoReplace, ""); objXmlAccessory.TryGetField("accuracy", out _intAccuracy); objXmlAccessory.TryGetField("dicepool", out _strDicePool, ""); objXmlAccessory.TryGetField("damagetype", out _strDamageType, ""); objXmlAccessory.TryGetField("damage", out _strDamage, ""); objXmlAccessory.TryGetField("damagereplace", out _strDamageReplace, ""); objXmlAccessory.TryGetField("firemode", out _strFireMode, ""); objXmlAccessory.TryGetField("firemodereplace", out _strFireModeReplace, ""); objXmlAccessory.TryGetField("ap", out _strAP, ""); objXmlAccessory.TryGetField("apreplace", out _strAPReplace, ""); objXmlAccessory.TryGetField("addmode", out _strAddMode, ""); objXmlAccessory.TryGetField("fullburst", out _intFullBurst); objXmlAccessory.TryGetField("suppressive", out _intSuppressive); objXmlAccessory.TryGetField("rangebonus", out _intRangeBonus); objXmlAccessory.TryGetField("extra", out _strExtra, ""); objXmlAccessory.TryGetField("ammobonus", out _intAmmoBonus); objXmlAccessory.TryGetField("accessorycostmultiplier", out _intAccessoryCostMultiplier); // Add any Gear that comes with the Weapon Accessory. if (objXmlAccessory["gears"] != null && blnCreateChildren) { XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlAccessoryGear in objXmlAccessory.SelectNodes("gears/usegear")) { intRating = 0; string strForceValue = ""; if (objXmlAccessoryGear.Attributes["rating"] != null) { intRating = Convert.ToInt32(objXmlAccessoryGear.Attributes["rating"].InnerText); } if (objXmlAccessoryGear.Attributes["select"] != null) { strForceValue = objXmlAccessoryGear.Attributes["select"].InnerText; } XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlAccessoryGear.InnerText + "\"]"); Gear objGear = new Gear(_objCharacter); TreeNode objGearNode = new TreeNode(); List <Weapon> lstWeapons = new List <Weapon>(); List <TreeNode> lstWeaponNodes = new List <TreeNode>(); objGear.Create(objXmlGear, _objCharacter, objGearNode, intRating, lstWeapons, lstWeaponNodes, strForceValue, false, false, !blnSkipCost); objGear.Cost = "0"; objGear.MaxRating = objGear.Rating; objGear.MinRating = objGear.Rating; objGear.IncludedInParent = true; _lstGear.Add(objGear); objGearNode.ContextMenuStrip = cmsAccessoryGear; objNode.Nodes.Add(objGearNode); objNode.Expand(); } } if (GlobalOptions.Instance.Language != "en-us") { XmlDocument objXmlDocument = XmlManager.Instance.Load("weapons.xml"); XmlNode objAccessoryNode = objXmlDocument.SelectSingleNode("/chummer/accessories/accessory[name = \"" + _strName + "\"]"); if (objAccessoryNode != null) { if (objAccessoryNode["translate"] != null) { _strAltName = objAccessoryNode["translate"].InnerText; } if (objAccessoryNode["altpage"] != null) { _strAltPage = objAccessoryNode["altpage"].InnerText; } } } objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); }
/// <summary> /// Update the Gear's information based on the Gear selected and current Rating. /// </summary> private void UpdateGearInfo() { if (lstGear.Text != "") { // Retireve the information for the selected piece of Cyberware. XmlNode objXmlGear; int intItemCost = 0; string strCategory = ""; objXmlGear = _objXmlDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + lstGear.SelectedValue + "\"]"); strCategory = cboCategory.SelectedValue.ToString(); TreeNode objTreeNode = new TreeNode(); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstTreeNodes = new List<TreeNode>(); Gear objGear = new Gear(_objCharacter); Commlink objCommlink = new Commlink(_objCharacter); OperatingSystem objOperatingSystem = new OperatingSystem(_objCharacter); if (objXmlGear["category"].InnerText == "Commlink" || objXmlGear["category"].InnerText == "Commlink Upgrade") { objCommlink.Create(objXmlGear, _objCharacter, objTreeNode, Convert.ToInt32(nudRating.Value), false, true); objGear = (Gear)objCommlink; } else if (objXmlGear["category"].InnerText == "Operating System" || objXmlGear["category"].InnerText == "Operating System Upgrade") { objOperatingSystem.Create(objXmlGear, _objCharacter, objTreeNode, Convert.ToInt32(nudRating.Value), false, true); objGear = (Gear)objCommlink; } else objGear.Create(objXmlGear, _objCharacter, objTreeNode, Convert.ToInt32(nudRating.Value), lstWeapons, lstTreeNodes, "", chkHacked.Checked, false, false, true, chkAerodynamic.Checked); if (_objCharacter.Metatype == "A.I." || _objCharacter.MetatypeCategory == "Technocritters" || _objCharacter.MetatypeCategory == "Protosapients") { if ((strCategory == "Matrix Programs" || strCategory == "Skillsofts" || strCategory == "Autosofts" || strCategory == "Autosofts, Agent" || strCategory == "Autosofts, Drone") && _objCharacter.Options.BookEnabled("UN") && !lstGear.SelectedValue.ToString().StartsWith("Suite:")) chkInherentProgram.Visible = true; else chkInherentProgram.Visible = false; chkInherentProgram.Enabled = !chkHacked.Checked; if (!chkInherentProgram.Enabled) chkInherentProgram.Checked = false; } else chkInherentProgram.Visible = false; if (objGear.GetType() == typeof(Commlink)) { lblGearResponse.Text = objCommlink.TotalResponse.ToString(); lblGearSignal.Text = objCommlink.TotalSignal.ToString(); lblGearSystem.Text = ""; lblGearFirewall.Text = ""; } else if (objGear.GetType() == typeof(OperatingSystem)) { lblGearResponse.Text = ""; lblGearSignal.Text = ""; lblGearSystem.Text = objOperatingSystem.System.ToString(); lblGearFirewall.Text = objOperatingSystem.Firewall.ToString(); } else { lblGearResponse.Text = ""; lblGearSignal.Text = ""; lblGearSystem.Text = ""; lblGearFirewall.Text = ""; } if (objXmlGear["category"].InnerText.EndsWith("Software") || objXmlGear["category"].InnerText.EndsWith("Programs") || objXmlGear["category"].InnerText == "Program Options" || objXmlGear["category"].InnerText.StartsWith("Autosofts") || objXmlGear["category"].InnerText.StartsWith("Skillsoft") || objXmlGear["category"].InnerText == "Program Packages" || objXmlGear["category"].InnerText == "Software Suites") chkHacked.Visible = true; else chkHacked.Visible = false; string strBook = _objCharacter.Options.LanguageBookShort(objGear.Source); string strPage = objGear.Page; lblSource.Text = strBook + " " + strPage; // Avail. lblAvail.Text = objGear.TotalAvail(); double dblMultiplier = Convert.ToDouble(nudGearQty.Value / nudGearQty.Increment, GlobalOptions.Instance.CultureInfo); if (chkDoItYourself.Checked) dblMultiplier *= 0.5; // Cost. if (objGear.Cost.StartsWith("Variable")) { int intMin = 0; int intMax = 0; string strCost = objGear.Cost.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 (intMax == 0) { intMax = 1000000; lblCost.Text = String.Format("{0:###,###,##0¥+}", intMin); } else lblCost.Text = String.Format("{0:###,###,##0}", intMin) + "-" + String.Format("{0:###,###,##0¥}", intMax); intItemCost = intMin; } else { double dblCost = Convert.ToDouble(objGear.TotalCost, GlobalOptions.Instance.CultureInfo); dblCost *= dblMultiplier; dblCost *= 1 + (Convert.ToDouble(nudMarkup.Value, GlobalOptions.Instance.CultureInfo) / 100.0); if (chkHacked.Checked) dblCost *= 0.1; intItemCost = Convert.ToInt32(dblCost); lblCost.Text = String.Format("{0:###,###,##0¥}", intItemCost); } if (chkFreeItem.Checked) { lblCost.Text = String.Format("{0:###,###,##0¥}", 0); intItemCost = 0; } // Update the Avail Test Label. lblTest.Text = _objCharacter.AvailTest(intItemCost * _intCostMultiplier, lblAvail.Text); // Capacity. lblCapacity.Text = objGear.CalculatedCapacity; // Rating. if (Convert.ToInt32(objXmlGear["rating"].InnerText) > 0) { nudRating.Maximum = Convert.ToInt32(objXmlGear["rating"].InnerText); try { nudRating.Minimum = Convert.ToInt32(objXmlGear["minrating"].InnerText); } catch { nudRating.Minimum = 1; } if (nudRating.Minimum == nudRating.Maximum) nudRating.Enabled = false; else nudRating.Enabled = true; } else { nudRating.Minimum = 0; nudRating.Maximum = 0; nudRating.Enabled = false; } tipTooltip.SetToolTip(lblSource, _objCharacter.Options.LanguageBookLong(objGear.Source) + " " + LanguageManager.Instance.GetString("String_Page") + " " + strPage); } }
/// <summary> /// Load the character's Metatype information from the XML file. /// </summary> /// <param name="guiMetatype">GUID of the Metatype to load.</param> /// <param name="strXmlFile">Name of the XML file to load from (default: metatypes.xml).</param> /// <param name="intForce">Force that the Spirit was summoned with (default: 0).</param> /// <param name="blnBloodSpirit">Whether or not this character is a Blood Spirit (default: false).</param> /// <param name="blnPossessionBased">Whether or not this Spirit uses a Possession-based tradition (default: false).</param> /// <param name="strPossessionMethod">Possession method the Spirit uses (default: empty).</param> public void LoadMetatype(Guid guiMetatype, string strXmlFile = "metatypes.xml", int intForce = 0, bool blnBloodSpirit = false, bool blnPossessionBased = false, string strPossessionMethod = "") { ImprovementManager objImprovementManager = new ImprovementManager(this); XmlDocument objXmlDocument = XmlManager.Instance.Load(strXmlFile); XmlNode objXmlMetatype = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[id = \"" + guiMetatype.ToString() + "\"]"); _guiMetatype = guiMetatype; // Set Metatype information. if (strXmlFile != "critters.xml") { BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["bodaug"].InnerText, intForce, 0)); AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agimax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["agiaug"].InnerText, intForce, 0)); REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["reaaug"].InnerText, intForce, 0)); STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["strmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["straug"].InnerText, intForce, 0)); CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chamax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["chaaug"].InnerText, intForce, 0)); INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["intaug"].InnerText, intForce, 0)); LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["logaug"].InnerText, intForce, 0)); WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["wilaug"].InnerText, intForce, 0)); MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magaug"].InnerText, intForce, 0)); RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["resaug"].InnerText, intForce, 0)); EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["edgaug"].InnerText, intForce, 0)); 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; BOD.AssignLimits(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 3)); AGI.AssignLimits(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 3)); REA.AssignLimits(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 3)); STR.AssignLimits(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 3)); CHA.AssignLimits(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 3)); INT.AssignLimits(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 3)); LOG.AssignLimits(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 3)); WIL.AssignLimits(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 3)); MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3)); RES.AssignLimits(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 3)); EDG.AssignLimits(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 3)); 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") { BOD.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["bodmin"].InnerText, intForce, 0)); AGI.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["agimin"].InnerText, intForce, 0)); REA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["reamin"].InnerText, intForce, 0)); STR.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["strmin"].InnerText, intForce, 0)); CHA.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["chamin"].InnerText, intForce, 0)); INT.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["intmin"].InnerText, intForce, 0)); LOG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["logmin"].InnerText, intForce, 0)); WIL.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["wilmin"].InnerText, intForce, 0)); MAG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0)); RES.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["resmin"].InnerText, intForce, 0)); EDG.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["edgmin"].InnerText, intForce, 0)); ESS.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["essmax"].InnerText, intForce, 0)); } // Sprites can never have Physical Attributes or WIL. if (objXmlMetatype["category"].InnerText.EndsWith("Sprite")) { BOD.AssignLimits("0", "0", "0"); AGI.AssignLimits("0", "0", "0"); REA.AssignLimits("0", "0", "0"); STR.AssignLimits("0", "0", "0"); WIL.AssignLimits("0", "0", "0"); } Metatype = objXmlMetatype["name"].InnerText; MetatypeCategory = objXmlMetatype["category"].InnerText; Metavariant = ""; MetatypeBP = 0; _intWalk = Convert.ToInt32(objXmlMetatype["walk"].InnerText); _intRun = Convert.ToInt32(objXmlMetatype["run"].InnerText); _intSprint = Convert.ToInt32(objXmlMetatype["sprint"].InnerText); // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Instance.Load("qualities.xml"); // Determine if the Metatype has any bonuses. if (objXmlMetatype["bonus"] != null) objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Metatype, Metatype, objXmlMetatype.SelectSingleNode("bonus"), false, 1, Metatype); // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[id = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(this); 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, this, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) Weapons.Add(objWeapon); } foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[id = \"" + objXmlQualityItem.InnerText + "\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(this); 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, this, objSource, objNode, objWeapons, objWeaponNodes, strForceValue); Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) 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") { BOD.Value = BOD.TotalMinimum; AGI.Value = AGI.TotalMinimum; REA.Value = REA.TotalMinimum; STR.Value = STR.TotalMinimum; CHA.Value = CHA.TotalMinimum; INT.Value = INT.TotalMinimum; LOG.Value = LOG.TotalMinimum; WIL.Value = WIL.TotalMinimum; } // Add any Critter Powers the Metatype/Critter should have. XmlNode objXmlCritter = objXmlDocument.SelectSingleNode("/chummer/metatypes/metatype[id = \"" + guiMetatype.ToString() + "\"]"); objXmlDocument = XmlManager.Instance.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[id = \"" + objXmlPower.InnerText + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(this); 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, this, objNode, intRating, strForcedValue); objPower.CountTowardsLimit = false; CritterPowers.Add(objPower); } // If this is a Blood Spirit, add their free Critter Powers. if (blnBloodSpirit) { XmlNode objXmlCritterPower; TreeNode objNode; CritterPower objPower; bool blnAddPower = true; // Energy Drain. foreach (CritterPower objFindPower in 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(this); objPower.Create(objXmlCritterPower, this, objNode, 0, ""); objPower.CountTowardsLimit = false; CritterPowers.Add(objPower); } // Fear. blnAddPower = true; foreach (CritterPower objFindPower in CritterPowers) { if (objFindPower.Name == "Fear") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Fear\"]"); objNode = new TreeNode(); objPower = new CritterPower(this); objPower.Create(objXmlCritterPower, this, objNode, 0, ""); objPower.CountTowardsLimit = false; CritterPowers.Add(objPower); } // Natural Weapon. objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Natural Weapon\"]"); objNode = new TreeNode(); objPower = new CritterPower(this); objPower.Create(objXmlCritterPower, this, objNode, 0, "DV " + intForce.ToString() + "P, AP 0"); objPower.CountTowardsLimit = false; CritterPowers.Add(objPower); // Evanescence. blnAddPower = true; foreach (CritterPower objFindPower in CritterPowers) { if (objFindPower.Name == "Evanescence") { blnAddPower = false; break; } } if (blnAddPower) { objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"Evanescence\"]"); objNode = new TreeNode(); objPower = new CritterPower(this); objPower.Create(objXmlCritterPower, this, objNode, 0, ""); objPower.CountTowardsLimit = false; 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 (blnPossessionBased) { foreach (CritterPower objCritterPower in CritterPowers) { if (objCritterPower.Name == "Materialization") { CritterPowers.Remove(objCritterPower); break; } } // Add the selected Power. XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + strPossessionMethod + "\"]"); TreeNode objNode = new TreeNode(); CritterPower objPower = new CritterPower(this); objPower.Create(objXmlCritterPower, this, objNode, 0, ""); objPower.CountTowardsLimit = false; 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(this); 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, intForce, 0)) > 6) objExotic.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, intForce, 0)); objExotic.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, intForce, 0)); objExotic.Name = objXmlSkill.InnerText; Skills.Add(objExotic); } else { foreach (Skill objSkill in 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, intForce, 0)) > 6) objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, intForce, 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, intForce, 0)); break; } } } } // Set the Skill Group Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/group")) { foreach (SkillGroup objSkill in SkillGroups) { if (objSkill.Name == objXmlSkill.InnerText) { objSkill.RatingMaximum = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, intForce, 0)); objSkill.Rating = Convert.ToInt32(ExpressionToString(objXmlSkill.Attributes["rating"].InnerText, intForce, 0)); break; } } } // Set the Knowledge Skill Ratings for the Critter. foreach (XmlNode objXmlSkill in objXmlCritter.SelectNodes("skills/knowledge")) { Skill objKnowledge = new Skill(this); 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); 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 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 Skills) objSkill.RatingMaximum = intMaxRating; foreach (SkillGroup objGroup in 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. 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, 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(this); objProgram.Create(objXmlProgram, this, objNode, strForceValue); objProgram.Rating = intRating; 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, 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(this); objOption.Create(objXmlOption, this, 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, intForce, 0)); string strForceValue = ""; if (objXmlGear.Attributes["select"] != null) strForceValue = objXmlGear.Attributes["select"].InnerText; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + objXmlGear.InnerText + "\"]"); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(this); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); objGear.Create(objXmlGearItem, this, objNode, intRating, lstWeapons, lstWeaponNodes, strForceValue); objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; Gear.Add(objGear); } // If this is a Mutant Critter, count up the number of Skill points they start with. if (MetatypeCategory == "Mutant Critters") { foreach (Skill objSkill in Skills) MutantCritterBaseSkills += objSkill.Rating; } }
/// <summary> /// Update the Gear's information based on the Gear selected and current Rating. /// </summary> private void UpdateGearInfo() { if (lstGear.Text != "") { // Retireve the information for the selected piece of Cyberware. XmlNode objXmlGear; int intItemCost = 0; string strCategory = ""; objXmlGear = _objXmlDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + lstGear.SelectedValue + "\"]"); strCategory = cboCategory.SelectedValue.ToString(); TreeNode objTreeNode = new TreeNode(); List <Weapon> lstWeapons = new List <Weapon>(); List <TreeNode> lstTreeNodes = new List <TreeNode>(); Gear objGear = new Gear(_objCharacter); Commlink objCommlink = new Commlink(_objCharacter); OperatingSystem objOperatingSystem = new OperatingSystem(_objCharacter); if (objXmlGear["category"].InnerText == "Commlink" || objXmlGear["category"].InnerText == "Commlink Upgrade") { objCommlink.Create(objXmlGear, _objCharacter, objTreeNode, Convert.ToInt32(nudRating.Value), false, true); objGear = (Gear)objCommlink; } else if (objXmlGear["category"].InnerText == "Operating System" || objXmlGear["category"].InnerText == "Operating System Upgrade") { objOperatingSystem.Create(objXmlGear, _objCharacter, objTreeNode, Convert.ToInt32(nudRating.Value), false, true); objGear = (Gear)objCommlink; } else { objGear.Create(objXmlGear, _objCharacter, objTreeNode, Convert.ToInt32(nudRating.Value), lstWeapons, lstTreeNodes, "", chkHacked.Checked, false, false, true, chkAerodynamic.Checked); } if (_objCharacter.Metatype == "A.I." || _objCharacter.MetatypeCategory == "Technocritters" || _objCharacter.MetatypeCategory == "Protosapients") { if ((strCategory == "Matrix Programs" || strCategory == "Skillsofts" || strCategory == "Autosofts" || strCategory == "Autosofts, Agent" || strCategory == "Autosofts, Drone") && _objCharacter.Options.BookEnabled("UN") && !lstGear.SelectedValue.ToString().StartsWith("Suite:")) { chkInherentProgram.Visible = true; } else { chkInherentProgram.Visible = false; } chkInherentProgram.Enabled = !chkHacked.Checked; if (!chkInherentProgram.Enabled) { chkInherentProgram.Checked = false; } } else { chkInherentProgram.Visible = false; } if (objGear.GetType() == typeof(Commlink)) { lblGearResponse.Text = objCommlink.TotalResponse.ToString(); lblGearSignal.Text = objCommlink.TotalSignal.ToString(); lblGearSystem.Text = ""; lblGearFirewall.Text = ""; } else if (objGear.GetType() == typeof(OperatingSystem)) { lblGearResponse.Text = ""; lblGearSignal.Text = ""; lblGearSystem.Text = objOperatingSystem.System.ToString(); lblGearFirewall.Text = objOperatingSystem.Firewall.ToString(); } else { lblGearResponse.Text = ""; lblGearSignal.Text = ""; lblGearSystem.Text = ""; lblGearFirewall.Text = ""; } if (objXmlGear["category"].InnerText.EndsWith("Software") || objXmlGear["category"].InnerText.EndsWith("Programs") || objXmlGear["category"].InnerText == "Program Options" || objXmlGear["category"].InnerText.StartsWith("Autosofts") || objXmlGear["category"].InnerText.StartsWith("Skillsoft") || objXmlGear["category"].InnerText == "Program Packages" || objXmlGear["category"].InnerText == "Software Suites") { chkHacked.Visible = true; } else { chkHacked.Visible = false; } string strBook = _objCharacter.Options.LanguageBookShort(objGear.Source); string strPage = objGear.Page; lblSource.Text = strBook + " " + strPage; // Avail. lblAvail.Text = objGear.TotalAvail(); double dblMultiplier = Convert.ToDouble(nudGearQty.Value / nudGearQty.Increment, GlobalOptions.Instance.CultureInfo); if (chkDoItYourself.Checked) { dblMultiplier *= 0.5; } // Cost. if (objGear.Cost.StartsWith("Variable")) { int intMin = 0; int intMax = 0; string strCost = objGear.Cost.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 (intMax == 0) { intMax = 1000000; lblCost.Text = String.Format("{0:###,###,##0¥+}", intMin); } else { lblCost.Text = String.Format("{0:###,###,##0}", intMin) + "-" + String.Format("{0:###,###,##0¥}", intMax); } intItemCost = intMin; } else { double dblCost = Convert.ToDouble(objGear.TotalCost, GlobalOptions.Instance.CultureInfo); dblCost *= dblMultiplier; dblCost *= 1 + (Convert.ToDouble(nudMarkup.Value, GlobalOptions.Instance.CultureInfo) / 100.0); if (chkHacked.Checked) { dblCost *= 0.1; } intItemCost = Convert.ToInt32(dblCost); lblCost.Text = String.Format("{0:###,###,##0¥}", intItemCost); } if (chkFreeItem.Checked) { lblCost.Text = String.Format("{0:###,###,##0¥}", 0); intItemCost = 0; } // Update the Avail Test Label. lblTest.Text = _objCharacter.AvailTest(intItemCost * _intCostMultiplier, lblAvail.Text); // Capacity. lblCapacity.Text = objGear.CalculatedCapacity; // Rating. if (Convert.ToInt32(objXmlGear["rating"].InnerText) > 0) { nudRating.Maximum = Convert.ToInt32(objXmlGear["rating"].InnerText); try { nudRating.Minimum = Convert.ToInt32(objXmlGear["minrating"].InnerText); } catch { nudRating.Minimum = 1; } if (nudRating.Minimum == nudRating.Maximum) { nudRating.Enabled = false; } else { nudRating.Enabled = true; } } else { nudRating.Minimum = 0; nudRating.Maximum = 0; nudRating.Enabled = false; } tipTooltip.SetToolTip(lblSource, _objCharacter.Options.LanguageBookLong(objGear.Source) + " " + LanguageManager.Instance.GetString("String_Page") + " " + strPage); } }
/// <summary> /// Select a piece of Gear to be added to the character. /// </summary> private bool PickGear() { bool blnNullParent = false; Gear objSelectedGear = _objFunctions.FindGear(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear); if (objSelectedGear == null) { objSelectedGear = new Gear(_objCharacter); blnNullParent = true; } // Open the Gear XML file and locate the selected Gear. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSelectedGear.Name + "\" and category = \"" + objSelectedGear.Category + "\"]"); bool blnFakeCareerMode = false; if (_objCharacter.Metatype == "A.I." || _objCharacter.MetatypeCategory == "Technocritters" || _objCharacter.MetatypeCategory == "Protosapients") blnFakeCareerMode = true; frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, blnFakeCareerMode, objSelectedGear.ChildAvailModifier, objSelectedGear.ChildCostMultiplier); try { if (treGear.SelectedNode.Level > 0) { if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSelectedGear.Category + ","; // If the Gear has a Capacity with no brackets (meaning it grants Capacity), show only Subsystems (those that conume Capacity). if (!objSelectedGear.Capacity.Contains('[')) frmPickGear.MaximumCapacity = objSelectedGear.CapacityRemaining; if (objSelectedGear.Category == "Commlinks" || objSelectedGear.Category == "Cyberdecks") { Commlink objCommlink = (Commlink)objSelectedGear; frmPickGear.CommlinkResponse = objCommlink.DeviceRating; } } } catch { } frmPickGear.ShowDialog(this); // Make sure the dialogue window was not canceled. if (frmPickGear.DialogResult == DialogResult.Cancel) return false; TreeNode objNode = new TreeNode(); // Open the Cyberware XML file and locate the selected piece. objXmlDocument = XmlManager.Instance.Load("gear.xml"); objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Gear objNewGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objCommlink.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objCommlink.DisplayName; // If a Commlink has just been added, see if the character already has one. If not, make it the active Commlink. if (_objFunctions.FindCharacterCommlinks(_objCharacter.Gear).Count == 0 && frmPickGear.SelectedCategory == "Commlinks") objCommlink.IsActive = true; objNewGear = objCommlink; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, true, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objGear.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return false; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objNewGear.Cost != "") objNewGear.Cost = "(" + objNewGear.Cost + ") * 0.1"; if (objNewGear.Cost3 != "") objNewGear.Cost3 = "(" + objNewGear.Cost3 + ") * 0.1"; if (objNewGear.Cost6 != "") objNewGear.Cost6 = "(" + objNewGear.Cost6 + ") * 0.1"; if (objNewGear.Cost10 != "") objNewGear.Cost10 = "(" + objNewGear.Cost10 + ") * 0.1"; if (objNewGear.Extra == "") objNewGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objNewGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objNewGear.Cost = "0"; objNewGear.Cost3 = "0"; objNewGear.Cost6 = "0"; objNewGear.Cost10 = "0"; } // Create any Weapons that came with this Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } objNewGear.Parent = objSelectedGear; if (blnNullParent) objNewGear.Parent = null; try { if (treGear.SelectedNode.Level > 0) { objNode.ContextMenuStrip = cmsGear; treGear.SelectedNode.Nodes.Add(objNode); treGear.SelectedNode.Expand(); objSelectedGear.Children.Add(objNewGear); } else { objNode.ContextMenuStrip = cmsGear; treGear.Nodes[0].Nodes.Add(objNode); treGear.Nodes[0].Expand(); _objCharacter.Gear.Add(objNewGear); } } catch { treGear.Nodes[0].Nodes.Add(objNode); treGear.Nodes[0].Expand(); _objCharacter.Gear.Add(objNewGear); } // Select the node that was just added. if (objNode.Level < 2) treGear.SelectedNode = objNode; UpdateCharacterInfo(); RefreshSelectedGear(); _blnIsDirty = true; UpdateWindowTitle(); return frmPickGear.AddAgain; }
private void tsVehicleWeaponAccessoryAddGear_Click(object sender, EventArgs e) { WeaponAccessory objAccessory = (WeaponAccessory)_objFunctions.FindEquipment(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, typeof(WeaponAccessory)); // Make sure the Weapon Accessory is allowed to accept Gear. if (objAccessory.AllowGear == null) { MessageBox.Show(LanguageManager.Instance.GetString("Message_WeaponGear"), LanguageManager.Instance.GetString("MessageTitle_CyberwareGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, true); string strCategories = ""; foreach (XmlNode objXmlCategory in objAccessory.AllowGear) strCategories += objXmlCategory.InnerText + ","; frmPickGear.AllowedCategories = strCategories; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; TreeNode objNode = new TreeNode(); // Open the Gear XML file and locate the selected piece. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + frmPickGear.SelectedGear + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Gear objNewGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlink": case "Commlink Upgrade": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objCommlink.Quantity = frmPickGear.SelectedQty; objNode.Text = objCommlink.DisplayName; objNewGear = objCommlink; break; case "Commlink Operating System": case "Commlink Operating System Upgrade": OperatingSystem objOperatingSystem = new OperatingSystem(_objCharacter); objOperatingSystem.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objOperatingSystem.Quantity = frmPickGear.SelectedQty; objNode.Text = objOperatingSystem.DisplayName; objNewGear = objOperatingSystem; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, false, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objNewGear.Cost != "") objNewGear.Cost = "(" + objNewGear.Cost + ") * 0.1"; if (objNewGear.Cost3 != "") objNewGear.Cost3 = "(" + objNewGear.Cost3 + ") * 0.1"; if (objNewGear.Cost6 != "") objNewGear.Cost6 = "(" + objNewGear.Cost6 + ") * 0.1"; if (objNewGear.Cost10 != "") objNewGear.Cost10 = "(" + objNewGear.Cost10 + ") * 0.1"; if (objNewGear.Extra == "") objNewGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objNewGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objNewGear.Cost = "0"; objNewGear.Cost3 = "0"; objNewGear.Cost6 = "0"; objNewGear.Cost10 = "0"; } int intCost = objNewGear.TotalCost; // Check the item's Cost and make sure the character can afford it. if (!frmPickGear.FreeCost) { if (intCost > _objCharacter.Nuyen) { _objFunctions.DeleteGear(objNewGear, treWeapons, _objImprovementManager); MessageBox.Show(LanguageManager.Instance.GetString("Message_NotEnoughNuyen"), LanguageManager.Instance.GetString("MessageTitle_NotEnoughNuyen"), MessageBoxButtons.OK, MessageBoxIcon.Information); if (frmPickGear.AddAgain) tsVehicleWeaponAccessoryAddGear_Click(sender, e); return; } else { // Create the Expense Log Entry. ExpenseLogEntry objExpense = new ExpenseLogEntry(); objExpense.Create(intCost * -1, LanguageManager.Instance.GetString("String_ExpensePurchaseWeaponGear") + " " + objNewGear.DisplayNameShort, ExpenseType.Nuyen, DateTime.Now); _objCharacter.ExpenseEntries.Add(objExpense); _objCharacter.Nuyen -= intCost; ExpenseUndo objUndo = new ExpenseUndo(); objUndo.CreateNuyen(NuyenExpenseType.AddWeaponGear, objNewGear.InternalId, 1); objExpense.Undo = objUndo; } } objAccessory.Gears.Add(objNewGear); objNode.ContextMenuStrip = cmsVehicleWeaponAccessoryGear; treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); UpdateCharacterInfo(); if (frmPickGear.AddAgain) tsVehicleWeaponAccessoryAddGear_Click(sender, e); _blnIsDirty = true; UpdateWindowTitle(); }
/// <summary> /// Add a PACKS Kit to the character. /// </summary> public void AddPACKSKit() { frmSelectPACKSKit frmPickPACKSKit = new frmSelectPACKSKit(_objCharacter); frmPickPACKSKit.ShowDialog(this); bool blnCreateChildren = true; // If the form was canceled, don't do anything. if (frmPickPACKSKit.DialogResult == DialogResult.Cancel) return; XmlDocument objXmlDocument = XmlManager.Instance.Load("packs.xml"); // Do not create child items for Gear if the chosen Kit is in the Custom category since these items will contain the exact plugins desired. if (frmPickPACKSKit.SelectedCategory == "Custom") blnCreateChildren = false; XmlNode objXmlKit = objXmlDocument.SelectSingleNode("/chummer/packs/pack[name = \"" + frmPickPACKSKit.SelectedKit + "\" and category = \"" + frmPickPACKSKit.SelectedCategory + "\"]"); // Update Qualities. if (objXmlKit["qualities"] != null) { XmlDocument objXmlQualityDocument = XmlManager.Instance.Load("qualities.xml"); // Positive Qualities. foreach (XmlNode objXmlQuality in objXmlKit.SelectNodes("qualities/positive/quality")) { XmlNode objXmlQualityNode = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQuality.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 (objXmlQuality.Attributes["select"] != null) strForceValue = objXmlQuality.Attributes["select"].InnerText; objQuality.Create(objXmlQualityNode, _objCharacter, QualitySource.Selected, objNode, objWeapons, objWeaponNodes, strForceValue); _objCharacter.Qualities.Add(objQuality); treQualities.Nodes[0].Nodes.Add(objNode); treQualities.Nodes[0].Expand(); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); // Create the Weapon Node if one exists. foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } } // Negative Qualities. foreach (XmlNode objXmlQuality in objXmlKit.SelectNodes("qualities/negative/quality")) { XmlNode objXmlQualityNode = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQuality.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 (objXmlQuality.Attributes["select"] != null) strForceValue = objXmlQuality.Attributes["select"].InnerText; objQuality.Create(objXmlQualityNode, _objCharacter, QualitySource.Selected, objNode, objWeapons, objWeaponNodes, strForceValue); _objCharacter.Qualities.Add(objQuality); treQualities.Nodes[1].Nodes.Add(objNode); treQualities.Nodes[1].Expand(); // Add any created Weapons to the character. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); // Create the Weapon Node if one exists. foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } } } // Update Attributes. if (objXmlKit["attributes"] != null) { // Reset all Attributes back to 1 so we don't go over any BP limits. nudBOD.Value = nudBOD.Minimum; nudAGI.Value = nudAGI.Minimum; nudREA.Value = nudREA.Minimum; nudSTR.Value = nudSTR.Minimum; nudCHA.Value = nudCHA.Minimum; nudINT.Value = nudINT.Minimum; nudLOG.Value = nudLOG.Minimum; nudWIL.Value = nudWIL.Minimum; nudEDG.Value = nudEDG.Minimum; nudMAG.Value = nudMAG.Minimum; nudRES.Value = nudRES.Minimum; foreach (XmlNode objXmlAttribute in objXmlKit["attributes"]) { // The Attribute is calculated as given value - (6 - Metatype Maximum) so that each Metatype has the values from the file adjusted correctly. switch (objXmlAttribute.Name) { case "bod": nudBOD.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.BOD.MetatypeMaximum); break; case "agi": nudAGI.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.AGI.MetatypeMaximum); break; case "rea": nudREA.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.REA.MetatypeMaximum); break; case "str": nudSTR.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.STR.MetatypeMaximum); break; case "cha": nudCHA.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.CHA.MetatypeMaximum); break; case "int": nudINT.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.INT.MetatypeMaximum); break; case "log": nudLOG.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.LOG.MetatypeMaximum); break; case "wil": nudWIL.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.WIL.MetatypeMaximum); break; case "mag": nudMAG.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.MAG.MetatypeMaximum); break; case "res": nudRES.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.RES.MetatypeMaximum); break; default: nudEDG.Value = Convert.ToInt32(objXmlAttribute.InnerText) - (6 - _objCharacter.EDG.MetatypeMaximum); break; } } } // Update Skills. if (objXmlKit["skills"] != null) { // Active Skills. foreach (XmlNode objXmlSkill in objXmlKit.SelectNodes("skills/skill")) { if (objXmlSkill["name"].InnerText.Contains("Exotic")) { int i = panActiveSkills.Controls.Count; Skill objSkill = new Skill(_objCharacter); SkillControl objSkillControl = new SkillControl(_objCharacter); objSkillControl.SkillObject = objSkill; objSkillControl.Width = 510; // Attach an EventHandler for the RatingChanged and SpecializationChanged Events. objSkillControl.RatingChanged += objActiveSkill_RatingChanged; objSkillControl.SpecializationChanged += objSkill_SpecializationChanged; objSkillControl.SkillName = objXmlSkill["name"].InnerText; switch (objXmlSkill["name"].InnerText) { case "Exotic Ranged Weapon": case "Exotic Melee Weapon": objSkill.Attribute = "AGI"; objSkillControl.SkillCategory = "Combat Active"; objSkill.Default = true; break; default: objSkill.Attribute = "REA"; objSkillControl.SkillCategory = "Vehicle Active"; objSkill.Default = false; break; } objSkill.ExoticSkill = true; _objCharacter.Skills.Add(objSkill); if (_objCharacter.IgnoreRules) { objSkillControl.SkillRatingMaximum = 12; } else { objSkillControl.SkillRatingMaximum = 6; } // Make sure it's not going above the maximum number. if (Convert.ToInt32(objXmlSkill["rating"].InnerText) > objSkillControl.SkillRatingMaximum) objSkillControl.SkillRating = objSkillControl.SkillRatingMaximum; else objSkillControl.SkillRating = Convert.ToInt32(objXmlSkill["rating"].InnerText); if (objXmlSkill["spec"] != null) objSkillControl.SkillSpec = objXmlSkill["spec"].InnerText; else objSkillControl.SkillSpec = ""; // Set the SkillControl's Location since scrolling the Panel causes it to actually change the child Controls' Locations. objSkillControl.Location = new Point(0, objSkillControl.Height * i + panActiveSkills.AutoScrollPosition.Y); panActiveSkills.Controls.Add(objSkillControl); } else { // Find the correct Skill Control. SkillControl objSkillControl = new SkillControl(_objCharacter); foreach (SkillControl objControl in panActiveSkills.Controls) { if (objControl.SkillName == objXmlSkill["name"].InnerText) { objSkillControl = objControl; break; } } // Make sure it's not going above the maximum number. if (Convert.ToInt32(objXmlSkill["rating"].InnerText) > objSkillControl.SkillRatingMaximum) objSkillControl.SkillRating = objSkillControl.SkillRatingMaximum; else objSkillControl.SkillRating = Convert.ToInt32(objXmlSkill["rating"].InnerText); if (objXmlSkill["spec"] != null) objSkillControl.SkillSpec = objXmlSkill["spec"].InnerText; else objSkillControl.SkillSpec = ""; } } // Skill Groups. foreach (XmlNode objXmlGroup in objXmlKit.SelectNodes("skills/skillgroup")) { // Find the correct SkillGroupControl. SkillGroupControl objSkillGroupControl = new SkillGroupControl(_objCharacter.Options, _objCharacter); foreach (SkillGroupControl objControl in panSkillGroups.Controls) { if (objControl.GroupName == objXmlGroup["name"].InnerText) { objSkillGroupControl = objControl; break; } } // Make sure it's not going above the maximum number. if (Convert.ToInt32(objXmlGroup["base"].InnerText) > objSkillGroupControl.GroupRatingMaximum) { objSkillGroupControl.BaseRating = objSkillGroupControl.GroupRatingMaximum; objSkillGroupControl.KarmaRating = 0; } else if (Convert.ToInt32(objXmlGroup["base"].InnerText) + Convert.ToInt32(objXmlGroup["karma"].InnerText) > objSkillGroupControl.GroupRatingMaximum) { objSkillGroupControl.BaseRating = Convert.ToInt32(objXmlGroup["base"].InnerText); objSkillGroupControl.KarmaRating = objSkillGroupControl.GroupRatingMaximum - objSkillGroupControl.BaseRating; } else { objSkillGroupControl.BaseRating = Convert.ToInt32(objXmlGroup["base"].InnerText); objSkillGroupControl.KarmaRating = Convert.ToInt32(objXmlGroup["karma"].InnerText); } } } // Update Knowledge Skills. if (objXmlKit["knowledgeskills"] != null) { foreach (XmlNode objXmlSkill in objXmlKit.SelectNodes("knowledgeskills/skill")) { int i = panKnowledgeSkills.Controls.Count; Skill objSkill = new Skill(_objCharacter); objSkill.Name = objXmlSkill["name"].InnerText; SkillControl objSkillControl = new SkillControl(_objCharacter); objSkillControl.SkillObject = objSkill; // Attach an EventHandler for the RatingChanged and SpecializationChanged Events. objSkillControl.RatingChanged += objKnowledgeSkill_RatingChanged; objSkillControl.SpecializationChanged += objSkill_SpecializationChanged; objSkillControl.DeleteSkill += objKnowledgeSkill_DeleteSkill; objSkillControl.KnowledgeSkill = true; objSkillControl.AllowDelete = true; if (_objCharacter.IgnoreRules) { objSkillControl.SkillRatingMaximum = 12; } else { objSkillControl.SkillRatingMaximum = 6; } // Set the SkillControl's Location since scrolling the Panel causes it to actually change the child Controls' Locations. objSkillControl.Location = new Point(0, objSkillControl.Height * i + panKnowledgeSkills.AutoScrollPosition.Y); panKnowledgeSkills.Controls.Add(objSkillControl); objSkillControl.SkillName = objXmlSkill["name"].InnerText; // Make sure it's not going above the maximum number. if (Convert.ToInt32(objXmlSkill["rating"].InnerText) > objSkillControl.SkillRatingMaximum) objSkillControl.SkillRating = objSkillControl.SkillRatingMaximum; else objSkillControl.SkillRating = Convert.ToInt32(objXmlSkill["rating"].InnerText); if (objXmlSkill["spec"] != null) objSkillControl.SkillSpec = objXmlSkill["spec"].InnerText; else objSkillControl.SkillSpec = ""; if (objXmlSkill["category"] != null) objSkillControl.SkillCategory = objXmlSkill["category"].InnerText; _objCharacter.Skills.Add(objSkill); } } // Select a Martial Art. if (objXmlKit["selectmartialart"] != null) { string strForcedValue = ""; int intRating = 1; if (objXmlKit["selectmartialart"].Attributes["select"] != null) strForcedValue = objXmlKit["selectmartialart"].Attributes["select"].InnerText; if (objXmlKit["selectmartialart"].Attributes["rating"] != null) intRating = Convert.ToInt32(objXmlKit["selectmartialart"].Attributes["rating"].InnerText); frmSelectMartialArt frmPickMartialArt = new frmSelectMartialArt(_objCharacter); frmPickMartialArt.ForcedValue = strForcedValue; frmPickMartialArt.ShowDialog(this); if (frmPickMartialArt.DialogResult != DialogResult.Cancel) { // Open the Martial Arts XML file and locate the selected piece. XmlDocument objXmlMartialArtDocument = XmlManager.Instance.Load("martialarts.xml"); XmlNode objXmlArt = objXmlMartialArtDocument.SelectSingleNode("/chummer/martialarts/martialart[name = \"" + frmPickMartialArt.SelectedMartialArt + "\"]"); TreeNode objNode = new TreeNode(); MartialArt objMartialArt = new MartialArt(_objCharacter); objMartialArt.Create(objXmlArt, objNode, _objCharacter); objMartialArt.Rating = intRating; _objCharacter.MartialArts.Add(objMartialArt); objNode.ContextMenuStrip = cmsMartialArts; treMartialArts.Nodes[0].Nodes.Add(objNode); treMartialArts.Nodes[0].Expand(); treMartialArts.SelectedNode = objNode; } } // Update Martial Arts. if (objXmlKit["martialarts"] != null) { // Open the Martial Arts XML file and locate the selected art. XmlDocument objXmlMartialArtDocument = XmlManager.Instance.Load("martialarts.xml"); foreach (XmlNode objXmlArt in objXmlKit.SelectNodes("martialarts/martialart")) { TreeNode objNode = new TreeNode(); MartialArt objArt = new MartialArt(_objCharacter); XmlNode objXmlArtNode = objXmlMartialArtDocument.SelectSingleNode("/chummer/martialarts/martialart[name = \"" + objXmlArt["name"].InnerText + "\"]"); objArt.Create(objXmlArtNode, objNode, _objCharacter); objArt.Rating = Convert.ToInt32(objXmlArt["rating"].InnerText); _objCharacter.MartialArts.Add(objArt); // Check for Advantages. foreach (XmlNode objXmlAdvantage in objXmlArt.SelectNodes("techniques/technique")) { TreeNode objChildNode = new TreeNode(); MartialArtAdvantage objAdvantage = new MartialArtAdvantage(_objCharacter); XmlNode objXmlAdvantageNode = objXmlMartialArtDocument.SelectSingleNode("/chummer/martialarts/martialart[name = \"" + objXmlArt["name"].InnerText + "\"]/techniques/technique[. = \"" + objXmlAdvantage.InnerText + "\"]"); objAdvantage.Create(objXmlAdvantageNode, _objCharacter, objChildNode); objArt.Advantages.Add(objAdvantage); objNode.Nodes.Add(objChildNode); objNode.Expand(); } treMartialArts.Nodes[0].Nodes.Add(objNode); treMartialArts.Nodes[0].Expand(); } } // Update Adept Powers. if (objXmlKit["powers"] != null) { // Open the Powers XML file and locate the selected power. XmlDocument objXmlPowerDocument = XmlManager.Instance.Load("powers.xml"); foreach (XmlNode objXmlPower in objXmlKit.SelectNodes("powers/power")) { XmlNode objXmlPowerNode = objXmlPowerDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower["name"].InnerText + "\"]"); int i = panPowers.Controls.Count; Power objPower = new Power(_objCharacter); _objCharacter.Powers.Add(objPower); PowerControl objPowerControl = new PowerControl(); objPowerControl.PowerObject = objPower; // Attach an EventHandler for the PowerRatingChanged Event. objPowerControl.PowerRatingChanged += objPower_PowerRatingChanged; objPowerControl.DeletePower += objPower_DeletePower; objPowerControl.PowerName = objXmlPowerNode["name"].InnerText; objPowerControl.PointsPerLevel = Convert.ToDecimal(objXmlPowerNode["points"].InnerText, GlobalOptions.Instance.CultureInfo); objPowerControl.AdeptWayDiscount = Convert.ToDecimal(objXmlPowerNode["adeptway"].InnerText, GlobalOptions.Instance.CultureInfo); if (objXmlPowerNode["levels"].InnerText == "no") { objPowerControl.LevelEnabled = false; } else { objPowerControl.LevelEnabled = true; if (objXmlPowerNode["levels"].InnerText != "yes") objPower.MaxLevels = Convert.ToInt32(objXmlPowerNode["levels"].InnerText); } objPower.Source = objXmlPowerNode["source"].InnerText; objPower.Page = objXmlPowerNode["page"].InnerText; if (objXmlPowerNode["doublecost"] != null) objPower.DoubleCost = false; if (objXmlPowerNode.InnerXml.Contains("bonus")) { objPower.Bonus = objXmlPowerNode["bonus"]; if (objXmlPower["name"].Attributes["select"] != null) _objImprovementManager.ForcedValue = objXmlPower["name"].Attributes["select"].InnerText; _objImprovementManager.CreateImprovements(Improvement.ImprovementSource.Power, objPower.InternalId, objPower.Bonus, false, Convert.ToInt32(objPower.Rating), objPower.DisplayNameShort); objPowerControl.Extra = _objImprovementManager.SelectedValue; } objPowerControl.Top = i * objPowerControl.Height; panPowers.Controls.Add(objPowerControl); // Set the Rating of the Power if applicable. if (objXmlPower["rating"] != null) objPowerControl.PowerLevel = Convert.ToInt32(objXmlPower["rating"].InnerText); } } // Update Complex Forms. if (objXmlKit["programs"] != null) { // Open the Programs XML file and locate the selected program. XmlDocument objXmlProgramDocument = XmlManager.Instance.Load("complexforms.xml"); foreach (XmlNode objXmlProgram in objXmlKit.SelectNodes("complexforms/complexform")) { XmlNode objXmlProgramNode = objXmlProgramDocument.SelectSingleNode("/chummer/complexforms/complexform[name = \"" + objXmlProgram["name"].InnerText + "\"]"); string strForceValue = ""; if (objXmlProgram.Attributes["select"] != null) strForceValue = objXmlProgram.Attributes["select"].InnerText; TreeNode objNode = new TreeNode(); ComplexForm objProgram = new ComplexForm(_objCharacter); objProgram.Create(objXmlProgramNode, _objCharacter, objNode, strForceValue); treComplexForms.Nodes[0].Nodes.Add(objNode); treComplexForms.Nodes[0].Expand(); _objCharacter.ComplexForms.Add(objProgram); treComplexForms.SortCustom(); } } // Update Spells. if (objXmlKit["spells"] != null) { XmlDocument objXmlSpellDocument = XmlManager.Instance.Load("spells.xml"); foreach (XmlNode objXmlSpell in objXmlKit.SelectNodes("spells/spell")) { // Make sure the Spell has not already been added to the character. bool blnFound = false; foreach (TreeNode nodSpell in treSpells.Nodes[0].Nodes) { if (nodSpell.Text == objXmlSpell.InnerText) { blnFound = true; break; } } // The Spell is not in the list, so add it. if (!blnFound) { string strForceValue = ""; if (objXmlSpell.Attributes["select"] != null) strForceValue = objXmlSpell.Attributes["select"].InnerText; XmlNode objXmlSpellNode = objXmlSpellDocument.SelectSingleNode("/chummer/spells/spell[name = \"" + objXmlSpell.InnerText + "\"]"); Spell objSpell = new Spell(_objCharacter); TreeNode objNode = new TreeNode(); objSpell.Create(objXmlSpellNode, _objCharacter, objNode, strForceValue); objNode.ContextMenuStrip = cmsSpell; _objCharacter.Spells.Add(objSpell); switch (objSpell.Category) { case "Combat": treSpells.Nodes[0].Nodes.Add(objNode); treSpells.Nodes[0].Expand(); break; case "Detection": treSpells.Nodes[1].Nodes.Add(objNode); treSpells.Nodes[1].Expand(); break; case "Health": treSpells.Nodes[2].Nodes.Add(objNode); treSpells.Nodes[2].Expand(); break; case "Illusion": treSpells.Nodes[3].Nodes.Add(objNode); treSpells.Nodes[3].Expand(); break; case "Manipulation": treSpells.Nodes[4].Nodes.Add(objNode); treSpells.Nodes[4].Expand(); break; case "Rituals": int intNode = 5; if (_objCharacter.AdeptEnabled && !_objCharacter.MagicianEnabled) intNode = 0; treSpells.Nodes[intNode].Nodes.Add(objNode); treSpells.Nodes[intNode].Expand(); break; } treSpells.SortCustom(); } } } // Update Spirits. if (objXmlKit["spirits"] != null) { foreach (XmlNode objXmlSpirit in objXmlKit.SelectNodes("spirits/spirit")) { int i = panSpirits.Controls.Count; Spirit objSpirit = new Spirit(_objCharacter); _objCharacter.Spirits.Add(objSpirit); SpiritControl objSpiritControl = new SpiritControl(); objSpiritControl.SpiritObject = objSpirit; objSpiritControl.EntityType = SpiritType.Spirit; // Attach an EventHandler for the ServicesOwedChanged Event. objSpiritControl.ServicesOwedChanged += objSpirit_ServicesOwedChanged; objSpiritControl.ForceChanged += objSpirit_ForceChanged; objSpiritControl.BoundChanged += objSpirit_BoundChanged; objSpiritControl.DeleteSpirit += objSpirit_DeleteSpirit; objSpiritControl.Name = objXmlSpirit["name"].InnerText; objSpiritControl.Force = Convert.ToInt32(objXmlSpirit["force"].InnerText); objSpiritControl.ServicesOwed = Convert.ToInt32(objXmlSpirit["services"].InnerText); objSpiritControl.Top = i * objSpiritControl.Height; panSpirits.Controls.Add(objSpiritControl); } } // Update Lifestyles. if (objXmlKit["lifestyles"] != null) { XmlDocument objXmlLifestyleDocument = XmlManager.Instance.Load("lifestyles.xml"); foreach (XmlNode objXmlLifestyle in objXmlKit.SelectNodes("lifestyles/lifestyle")) { string strName = objXmlLifestyle["name"].InnerText; int intMonths = Convert.ToInt32(objXmlLifestyle["months"].InnerText); // Create the Lifestyle. TreeNode objNode = new TreeNode(); Lifestyle objLifestyle = new Lifestyle(_objCharacter); XmlNode objXmlLifestyleNode = objXmlLifestyleDocument.SelectSingleNode("/chummer/lifestyles/lifestyle[name = \"" + strName + "\"]"); if (objXmlLifestyleNode != null) { // This is a standard Lifestyle, so just use the Create method. objLifestyle.Create(objXmlLifestyleNode, objNode); objLifestyle.Months = intMonths; } else { // This is an Advanced Lifestyle, so build it manually. objLifestyle.Name = strName; objLifestyle.Months = intMonths; objLifestyle.Cost = Convert.ToInt32(objXmlLifestyle["cost"].InnerText); objLifestyle.Dice = Convert.ToInt32(objXmlLifestyle["dice"].InnerText); objLifestyle.Multiplier = Convert.ToInt32(objXmlLifestyle["multiplier"].InnerText); objLifestyle.BaseLifestyle = objXmlLifestyle["baselifestyle"].InnerText; objLifestyle.Source = "SR5"; objLifestyle.Page = "373"; objLifestyle.Comforts = Convert.ToInt32(objXmlLifestyle["comforts"].InnerText); objLifestyle.ComfortsEntertainment = Convert.ToInt32(objXmlLifestyle["comfortsentertainment"].InnerText); objLifestyle.Security = Convert.ToInt32(objXmlLifestyle["security"].InnerText); objLifestyle.SecurityEntertainment = Convert.ToInt32(objXmlLifestyle["securityentertainment"].InnerText); objLifestyle.Area = Convert.ToInt32(objXmlLifestyle["area"].InnerText); objLifestyle.AreaEntertainment = Convert.ToInt32(objXmlLifestyle["areaentertainment"].InnerText); foreach (LifestyleQuality objXmlQuality in objXmlLifestyle.SelectNodes("lifestylequalities/lifestylequality")) objLifestyle.LifestyleQualities.Add(objXmlQuality); objNode.Text = strName; } // Add the Lifestyle to the character and Lifestyle Tree. if (objLifestyle.BaseLifestyle != "") objNode.ContextMenuStrip = cmsAdvancedLifestyle; else objNode.ContextMenuStrip = cmsLifestyleNotes; _objCharacter.Lifestyles.Add(objLifestyle); treLifestyles.Nodes[0].Nodes.Add(objNode); treLifestyles.Nodes[0].Expand(); } } // Update NuyenBP. if (objXmlKit["nuyenbp"] != null) { int intAmount = Convert.ToInt32(objXmlKit["nuyenbp"].InnerText); //if (_objCharacter.BuildMethod == CharacterBuildMethod.Karma) //intAmount *= 2; // Make sure we don't go over the field's maximum which would throw an Exception. if (nudNuyen.Value + intAmount > nudNuyen.Maximum) nudNuyen.Value = nudNuyen.Maximum; else nudNuyen.Value += intAmount; } // Update Armor. if (objXmlKit["armors"] != null) { XmlDocument objXmlArmorDocument = XmlManager.Instance.Load("armor.xml"); foreach (XmlNode objXmlArmor in objXmlKit.SelectNodes("armors/armor")) { XmlNode objXmlArmorNode = objXmlArmorDocument.SelectSingleNode("/chummer/armors/armor[name = \"" + objXmlArmor["name"].InnerText + "\"]"); Armor objArmor = new Armor(_objCharacter); TreeNode objNode = new TreeNode(); objArmor.Create(objXmlArmorNode, objNode, cmsArmorMod, Convert.ToInt32(objXmlArmor["rating"].InnerText), false, blnCreateChildren); _objCharacter.Armor.Add(objArmor); // Look for Armor Mods. if (objXmlArmor["mods"] != null) { foreach (XmlNode objXmlMod in objXmlArmor.SelectNodes("mods/mod")) { List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); XmlNode objXmlModNode = objXmlArmorDocument.SelectSingleNode("/chummer/mods/mod[name = \"" + objXmlMod["name"].InnerText + "\"]"); ArmorMod objMod = new ArmorMod(_objCharacter); TreeNode objModNode = new TreeNode(); int intRating = 0; if (objXmlMod["rating"] != null) intRating = Convert.ToInt32(objXmlMod["rating"].InnerText); objMod.Create(objXmlModNode, objModNode, intRating, lstWeapons, lstWeaponNodes); objModNode.ContextMenuStrip = cmsArmorMod; objMod.Parent = objArmor; objArmor.ArmorMods.Add(objMod); objNode.Nodes.Add(objModNode); objNode.Expand(); // Add any Weapons created by the Mod. foreach (Weapon objWeapon in lstWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in lstWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } } } XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlArmor.SelectNodes("gears/gear")) AddPACKSGear(objXmlGearDocument, objXmlGear, objNode, objArmor, cmsArmorGear, blnCreateChildren); objNode.ContextMenuStrip = cmsArmor; treArmor.Nodes[0].Nodes.Add(objNode); treArmor.Nodes[0].Expand(); } } // Update Weapons. if (objXmlKit["weapons"] != null) { XmlDocument objXmlWeaponDocument = XmlManager.Instance.Load("weapons.xml"); pgbProgress.Visible = true; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlKit.SelectNodes("weapons/weapon").Count; int i = 0; foreach (XmlNode objXmlWeapon in objXmlKit.SelectNodes("weapons/weapon")) { i++; pgbProgress.Value = i; Application.DoEvents(); XmlNode objXmlWeaponNode = objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + objXmlWeapon["name"].InnerText + "\"]"); Weapon objWeapon = new Weapon(_objCharacter); TreeNode objNode = new TreeNode(); objWeapon.Create(objXmlWeaponNode, _objCharacter, objNode, cmsWeapon, cmsWeaponAccessory, cmsWeaponMod, blnCreateChildren); _objCharacter.Weapons.Add(objWeapon); // Look for Weapon Accessories. if (objXmlWeapon["accessories"] != null) { foreach (XmlNode objXmlAccessory in objXmlWeapon.SelectNodes("accessories/accessory")) { XmlNode objXmlAccessoryNode = objXmlWeaponDocument.SelectSingleNode("/chummer/accessories/accessory[name = \"" + objXmlAccessory["name"].InnerText + "\"]"); WeaponAccessory objMod = new WeaponAccessory(_objCharacter); TreeNode objModNode = new TreeNode(); string strMount = ""; int intRating = 0; if (objXmlAccessory["mount"] != null) strMount = objXmlAccessory["mount"].InnerText; objMod.Create(objXmlAccessoryNode, objModNode, strMount, intRating); objModNode.ContextMenuStrip = cmsWeaponAccessory; objMod.Parent = objWeapon; objWeapon.WeaponAccessories.Add(objMod); XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlAccessory.SelectNodes("gears/gear")) AddPACKSGear(objXmlGearDocument, objXmlGear, objModNode, objMod, cmsWeaponAccessoryGear, blnCreateChildren); objNode.Nodes.Add(objModNode); objNode.Expand(); } } // Look for Weapon Mods. if (objXmlWeapon["mods"] != null) { foreach (XmlNode objXmlMod in objXmlWeapon.SelectNodes("mods/mod")) { XmlNode objXmlModNode = objXmlWeaponDocument.SelectSingleNode("/chummer/mods/mod[name = \"" + objXmlMod["name"].InnerText + "\"]"); WeaponMod objMod = new WeaponMod(_objCharacter); TreeNode objModNode = new TreeNode(); objMod.Create(objXmlModNode, objModNode); objModNode.ContextMenuStrip = cmsWeaponMod; objMod.Parent = objWeapon; objWeapon.WeaponMods.Add(objMod); objNode.Nodes.Add(objModNode); objNode.Expand(); } } // Look for an Underbarrel Weapon. if (objXmlWeapon["underbarrel"] != null) { XmlNode objXmlUnderbarrelNode = objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + objXmlWeapon["underbarrel"].InnerText + "\"]"); Weapon objUnderbarrelWeapon = new Weapon(_objCharacter); TreeNode objUnderbarrelNode = new TreeNode(); objUnderbarrelWeapon.Create(objXmlUnderbarrelNode, _objCharacter, objUnderbarrelNode, cmsWeapon, cmsWeaponAccessory, cmsWeaponMod, blnCreateChildren); objWeapon.UnderbarrelWeapons.Add(objUnderbarrelWeapon); objNode.Nodes.Add(objUnderbarrelNode); objNode.Expand(); } objNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objNode); treWeapons.Nodes[0].Expand(); Application.DoEvents(); } } // Update Cyberware. if (objXmlKit["cyberwares"] != null) { XmlDocument objXmlCyberwareDocument = XmlManager.Instance.Load("cyberware.xml"); XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); pgbProgress.Visible = true; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlKit.SelectNodes("cyberwares/cyberware").Count; int i = 0; foreach (XmlNode objXmlCyberware in objXmlKit.SelectNodes("cyberwares/cyberware")) { i++; pgbProgress.Value = i; Application.DoEvents(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Cyberware objCyberware = new Cyberware(_objCharacter); Grade objGrade = objCyberware.ConvertToCyberwareGrade(objXmlCyberware["grade"].InnerText, Improvement.ImprovementSource.Cyberware); int intRating = 0; if (objXmlCyberware["rating"] != null) intRating = Convert.ToInt32(objXmlCyberware["rating"].InnerText); XmlNode objXmlCyberwareNode = objXmlCyberwareDocument.SelectSingleNode("/chummer/cyberwares/cyberware[name = \"" + objXmlCyberware["name"].InnerText + "\"]"); objCyberware.Create(objXmlCyberwareNode, _objCharacter, objGrade, Improvement.ImprovementSource.Cyberware, intRating, objNode, objWeapons, objWeaponNodes, true, blnCreateChildren); _objCharacter.Cyberware.Add(objCyberware); // Add any children. if (objXmlCyberware["cyberwares"] != null) { foreach (XmlNode objXmlChild in objXmlCyberware.SelectNodes("cyberwares/cyberware")) { TreeNode objChildNode = new TreeNode(); Cyberware objChildCyberware = new Cyberware(_objCharacter); int intChildRating = 0; if (objXmlChild["rating"] != null) intChildRating = Convert.ToInt32(objXmlChild["rating"].InnerText); XmlNode objXmlChildNode = objXmlCyberwareDocument.SelectSingleNode("/chummer/cyberwares/cyberware[name = \"" + objXmlChild["name"].InnerText + "\"]"); objChildCyberware.Create(objXmlChildNode, _objCharacter, objGrade, Improvement.ImprovementSource.Cyberware, intChildRating, objChildNode, objWeapons, objWeaponNodes, true, blnCreateChildren); objCyberware.Children.Add(objChildCyberware); objChildNode.ContextMenuStrip = cmsCyberware; foreach (XmlNode objXmlGear in objXmlChild.SelectNodes("gears/gear")) AddPACKSGear(objXmlGearDocument, objXmlGear, objChildNode, objChildCyberware, cmsCyberwareGear, blnCreateChildren); objNode.Nodes.Add(objChildNode); objNode.Expand(); } } foreach (XmlNode objXmlGear in objXmlCyberware.SelectNodes("gears/gear")) AddPACKSGear(objXmlGearDocument, objXmlGear, objNode, objCyberware, cmsCyberwareGear, blnCreateChildren); objNode.ContextMenuStrip = cmsCyberware; treCyberware.Nodes[0].Nodes.Add(objNode); treCyberware.Nodes[0].Expand(); // Add any Weapons created by the Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } Application.DoEvents(); } treCyberware.SortCustom(); } // Update Bioware. if (objXmlKit["biowares"] != null) { XmlDocument objXmlBiowareDocument = XmlManager.Instance.Load("bioware.xml"); pgbProgress.Visible = true; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlKit.SelectNodes("biowares/bioware").Count; int i = 0; foreach (XmlNode objXmlBioware in objXmlKit.SelectNodes("biowares/bioware")) { i++; pgbProgress.Value = i; Application.DoEvents(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Cyberware objCyberware = new Cyberware(_objCharacter); Grade objGrade = objCyberware.ConvertToCyberwareGrade(objXmlBioware["grade"].InnerText, Improvement.ImprovementSource.Bioware); int intRating = 0; if (objXmlBioware["rating"] != null) intRating = Convert.ToInt32(objXmlBioware["rating"].InnerText); XmlNode objXmlBiowareNode = objXmlBiowareDocument.SelectSingleNode("/chummer/biowares/bioware[name = \"" + objXmlBioware["name"].InnerText + "\"]"); objCyberware.Create(objXmlBiowareNode, _objCharacter, objGrade, Improvement.ImprovementSource.Bioware, intRating, objNode, objWeapons, objWeaponNodes, true, blnCreateChildren); _objCharacter.Cyberware.Add(objCyberware); objNode.ContextMenuStrip = cmsBioware; treCyberware.Nodes[1].Nodes.Add(objNode); treCyberware.Nodes[1].Expand(); // Add any Weapons created by the Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } Application.DoEvents(); } treCyberware.SortCustom(); } // Update Gear. if (objXmlKit["gears"] != null) { XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); pgbProgress.Visible = true; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlKit.SelectNodes("gears/gear").Count; int i = 0; foreach (XmlNode objXmlGear in objXmlKit.SelectNodes("gears/gear")) { i++; pgbProgress.Value = i; Application.DoEvents(); AddPACKSGear(objXmlGearDocument, objXmlGear, treGear.Nodes[0], _objCharacter, cmsGear, blnCreateChildren); Application.DoEvents(); } } // Update Vehicles. if (objXmlKit["vehicles"] != null) { XmlDocument objXmlVehicleDocument = XmlManager.Instance.Load("vehicles.xml"); pgbProgress.Visible = true; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlKit.SelectNodes("vehicles/vehicle").Count; int i = 0; foreach (XmlNode objXmlVehicle in objXmlKit.SelectNodes("vehicles/vehicle")) { i++; pgbProgress.Value = i; Application.DoEvents(); Gear objDefaultSensor = new Gear(_objCharacter); TreeNode objNode = new TreeNode(); Vehicle objVehicle = new Vehicle(_objCharacter); XmlNode objXmlVehicleNode = objXmlVehicleDocument.SelectSingleNode("/chummer/vehicles/vehicle[name = \"" + objXmlVehicle["name"].InnerText + "\"]"); objVehicle.Create(objXmlVehicleNode, objNode, cmsVehicle, cmsVehicleGear, cmsVehicleWeapon, cmsVehicleWeaponAccessory, cmsVehicleWeaponMod, blnCreateChildren); _objCharacter.Vehicles.Add(objVehicle); // Grab the default Sensor that comes with the Vehicle. foreach (Gear objSensorGear in objVehicle.Gear) { if (objSensorGear.Category == "Sensors" && objSensorGear.Cost == "0" && objSensorGear.Rating == 0) { objDefaultSensor = objSensorGear; break; } } // Add any Vehicle Mods. if (objXmlVehicle["mods"] != null) { foreach (XmlNode objXmlMod in objXmlVehicle.SelectNodes("mods/mod")) { TreeNode objModNode = new TreeNode(); VehicleMod objMod = new VehicleMod(_objCharacter); int intRating = 0; if (objXmlMod["rating"] != null) intRating = Convert.ToInt32(objXmlMod["rating"].InnerText); XmlNode objXmlModNode = objXmlVehicleDocument.SelectSingleNode("/chummer/mods/mod[name = \"" + objXmlMod["name"].InnerText + "\"]"); objMod.Create(objXmlModNode, objModNode, intRating); objVehicle.Mods.Add(objMod); objNode.Nodes.Add(objModNode); objNode.Expand(); } } // Add any Vehicle Gear. if (objXmlVehicle["gears"] != null) { XmlDocument objXmlGearDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlVehicle.SelectNodes("gears/gear")) { List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objGearNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); int intQty = 1; int intRating = 0; if (objXmlGear["rating"] != null) intRating = Convert.ToInt32(objXmlGear["rating"].InnerText); string strForceValue = ""; if (objXmlGear["name"].Attributes["select"] != null) strForceValue = objXmlGear["name"].Attributes["select"].InnerText; if (objXmlGear["qty"] != null) intQty = Convert.ToInt32(objXmlGear["qty"].InnerText); XmlNode objXmlGearNode = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear["name"].InnerText + "\"]"); objGear.Create(objXmlGearNode, _objCharacter, objGearNode, intRating, objWeapons, objWeaponNodes, strForceValue, false, false, false, blnCreateChildren, false); objGear.Quantity = intQty; objGearNode.Text = objGear.DisplayName; objVehicle.Gear.Add(objGear); // Look for child components. if (objXmlGear["gears"] != null) { foreach (XmlNode objXmlChild in objXmlGear.SelectNodes("gears/gear")) { AddPACKSGear(objXmlGearDocument, objXmlChild, objGearNode, objGear, cmsVehicleGear, blnCreateChildren); } } objGearNode.Expand(); objGearNode.ContextMenuStrip = cmsVehicleGear; objNode.Nodes.Add(objGearNode); objNode.Expand(); // If this is a Sensor, it will replace the Vehicle's base sensor, so remove it. if (objGear.Category == "Sensors" && objGear.Cost == "0" && objGear.Rating == 0) { objVehicle.Gear.Remove(objDefaultSensor); foreach (TreeNode objSensorNode in objNode.Nodes) { if (objSensorNode.Tag.ToString() == objDefaultSensor.InternalId) { objSensorNode.Remove(); break; } } } } } // Add any Vehicle Weapons. if (objXmlVehicle["weapons"] != null) { XmlDocument objXmlWeaponDocument = XmlManager.Instance.Load("weapons.xml"); foreach (XmlNode objXmlWeapon in objXmlVehicle.SelectNodes("weapons/weapon")) { TreeNode objWeaponNode = new TreeNode(); Weapon objWeapon = new Weapon(_objCharacter); XmlNode objXmlWeaponNode = objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + objXmlWeapon["name"].InnerText + "\"]"); objWeapon.Create(objXmlWeaponNode, _objCharacter, objWeaponNode, cmsVehicleWeapon, cmsVehicleWeaponAccessory, cmsVehicleWeaponMod, blnCreateChildren); objWeapon.VehicleMounted = true; // Find the first Weapon Mount in the Vehicle. foreach (VehicleMod objMod in objVehicle.Mods) { if (objMod.Name.StartsWith("Weapon Mount") || objMod.Name.StartsWith("Heavy Weapon Mount")) { objMod.Weapons.Add(objWeapon); foreach (TreeNode objModNode in objNode.Nodes) { if (objModNode.Tag.ToString() == objMod.InternalId) { objWeaponNode.ContextMenuStrip = cmsVehicleWeapon; objModNode.Nodes.Add(objWeaponNode); objModNode.Expand(); break; } } break; } } // Look for Weapon Accessories. if (objXmlWeapon["accessories"] != null) { foreach (XmlNode objXmlAccessory in objXmlWeapon.SelectNodes("accessories/accessory")) { XmlNode objXmlAccessoryNode = objXmlWeaponDocument.SelectSingleNode("/chummer/accessories/accessory[name = \"" + objXmlAccessory["name"].InnerText + "\"]"); WeaponAccessory objMod = new WeaponAccessory(_objCharacter); TreeNode objModNode = new TreeNode(); string strMount = ""; int intRating = 0; if (objXmlAccessory["mount"] != null) strMount = objXmlAccessory["mount"].InnerText; objMod.Create(objXmlAccessoryNode, objModNode, strMount,intRating); objModNode.ContextMenuStrip = cmsWeaponAccessory; objMod.Parent = objWeapon; objWeapon.WeaponAccessories.Add(objMod); objWeaponNode.Nodes.Add(objModNode); objWeaponNode.Expand(); } } // Look for Weapon Mods. if (objXmlWeapon["mods"] != null) { foreach (XmlNode objXmlMod in objXmlWeapon.SelectNodes("mods/mod")) { XmlNode objXmlModNode = objXmlWeaponDocument.SelectSingleNode("/chummer/mods/mod[name = \"" + objXmlMod["name"].InnerText + "\"]"); WeaponMod objMod = new WeaponMod(_objCharacter); TreeNode objModNode = new TreeNode(); objMod.Create(objXmlModNode, objModNode); objModNode.ContextMenuStrip = cmsVehicleWeaponMod; objMod.Parent = objWeapon; objWeapon.WeaponMods.Add(objMod); objWeaponNode.Nodes.Add(objModNode); objWeaponNode.Expand(); } } } } objNode.ContextMenuStrip = cmsVehicle; treVehicles.Nodes[0].Nodes.Add(objNode); treVehicles.Nodes[0].Expand(); Application.DoEvents(); } } pgbProgress.Visible = false; if (frmPickPACKSKit.AddAgain) AddPACKSKit(); PopulateGearList(); UpdateCharacterInfo(); }
/// <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); } }
private void tsVehicleSensorAddAsPlugin_Click(object sender, EventArgs e) { // Make sure a parent items is selected, then open the Select Gear window. try { if (treVehicles.SelectedNode.Level < 2) { MessageBox.Show(LanguageManager.Instance.GetString("Message_ModifyVehicleGear"), LanguageManager.Instance.GetString("MessageTitle_ModifyVehicleGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } catch { MessageBox.Show(LanguageManager.Instance.GetString("Message_ModifyVehicleGear"), LanguageManager.Instance.GetString("MessageTitle_ModifyVehicleGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } // Locate the Vehicle Sensor Gear. bool blnFound = false; Vehicle objVehicle = new Vehicle(_objCharacter); Gear objSensor = _objFunctions.FindVehicleGear(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, out objVehicle); if (objSensor != null) blnFound = true; // Make sure the Gear was found. if (!blnFound) { MessageBox.Show(LanguageManager.Instance.GetString("Message_ModifyVehicleGear"), LanguageManager.Instance.GetString("MessageTitle_ModifyVehicleGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSensor.Name + "\" and category = \"" + objSensor.Category + "\"]"); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter); //frmPickGear.ShowNegativeCapacityOnly = true; if (objXmlGear != null) { if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSensor.Category + ","; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; // Open the Gear XML file and locate the selected piece. objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objCommlink.Quantity = frmPickGear.SelectedQty; objNode.Text = objCommlink.DisplayName; objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, false, true, frmPickGear.Aerodynamic); objNewGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objNewGear.DisplayName; objGear = objNewGear; break; } if (objGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objGear.Cost = (Convert.ToDouble(objGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objGear.Cost != "") objGear.Cost = "(" + objGear.Cost + ") * 0.1"; if (objGear.Cost3 != "") objGear.Cost3 = "(" + objGear.Cost3 + ") * 0.1"; if (objGear.Cost6 != "") objGear.Cost6 = "(" + objGear.Cost6 + ") * 0.1"; if (objGear.Cost10 != "") objGear.Cost10 = "(" + objGear.Cost10 + ") * 0.1"; if (objGear.Extra == "") objGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; } objNode.Text = objGear.DisplayName; try { _blnSkipRefresh = true; nudVehicleGearQty.Increment = objGear.CostFor; //nudVehicleGearQty.Minimum = objGear.CostFor; _blnSkipRefresh = false; } catch { } objGear.Parent = objSensor; objNode.ContextMenuStrip = cmsVehicleGear; treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); objSensor.Children.Add(objGear); if (frmPickGear.AddAgain) tsVehicleSensorAddAsPlugin_Click(sender, e); UpdateCharacterInfo(); RefreshSelectedVehicle(); }
private void TestGear() { Character objCharacter = new Character(); XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); pgbProgress.Minimum = 0; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlDocument.SelectNodes("/chummer/gears/gear").Count; // Gear. foreach (XmlNode objXmlGear in objXmlDocument.SelectNodes("/chummer/gears/gear")) { pgbProgress.Value++; Application.DoEvents(); try { TreeNode objTempNode = new TreeNode(); Gear objTemp = new Gear(objCharacter); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstNodes = new List<TreeNode>(); objTemp.Create(objXmlGear, objCharacter, objTempNode, 1, lstWeapons, lstNodes, "Blades"); try { int objValue = objTemp.TotalCost; } catch { if (objXmlGear["category"].InnerText != "Mook") txtOutput.Text += objXmlGear["name"].InnerText + " failed TotalCost\n"; } try { string objValue = objTemp.TotalAvail(); } catch { txtOutput.Text += objXmlGear["name"].InnerText + " failed TotalAvail\n"; } try { string objValue = objTemp.CalculatedArmorCapacity; } catch { txtOutput.Text += objXmlGear["name"].InnerText + " failed CalculatedArmorCapacity\n"; } try { string objValue = objTemp.CalculatedCapacity; } catch { txtOutput.Text += objXmlGear["name"].InnerText + " failed CalculatedCapacity\n"; } try { int objValue = objTemp.CalculatedCost; } catch { if (objXmlGear["category"].InnerText != "Mook") txtOutput.Text += objXmlGear["name"].InnerText + " failed CalculatedCost\n"; } } catch { txtOutput.Text += objXmlGear["name"].InnerText + " general failure\n"; } } }
/// <summary> /// Select a piece of Gear and add it to a piece of Armor. /// </summary> /// <param name="blnShowArmorCapacityOnly">Whether or not only items that consume capacity should be shown.</param> private bool PickArmorGear(bool blnShowArmorCapacityOnly = false) { bool blnNullParent = true; Gear objSelectedGear = new Gear(_objCharacter); Armor objSelectedArmor = new Armor(_objCharacter); ExpenseUndo objUndo = new ExpenseUndo(); foreach (Armor objArmor in _objCharacter.Armor) { if (objArmor.InternalId == treArmor.SelectedNode.Tag.ToString()) objSelectedArmor = objArmor; } if (treArmor.SelectedNode.Level > 1) { objSelectedGear = _objFunctions.FindArmorGear(treArmor.SelectedNode.Tag.ToString(), _objCharacter.Armor, out objSelectedArmor); if (objSelectedGear != null) blnNullParent = false; } // Open the Gear XML file and locate the selected Gear. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSelectedGear.Name + "\" and category = \"" + objSelectedGear.Category + "\"]"); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, true); frmPickGear.EnableStack = false; frmPickGear.ShowArmorCapacityOnly = blnShowArmorCapacityOnly; frmPickGear.CapacityDisplayStyle = objSelectedArmor.CapacityDisplayStyle; try { if (treArmor.SelectedNode.Level > 1) { if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSelectedGear.Category + ","; // If the Gear has a Capacity with no brackets (meaning it grants Capacity), show only Subsystems (those that conume Capacity). if (!objSelectedGear.Capacity.Contains('[')) { frmPickGear.MaximumCapacity = objSelectedGear.CapacityRemaining; // Do not allow the user to add a new piece of Gear if its Capacity has been reached. if (_objOptions.EnforceCapacity && objSelectedGear.CapacityRemaining < 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_CapacityReached"), LanguageManager.Instance.GetString("MessageTitle_CapacityReached"), MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } if (objSelectedGear.Category == "Commlink") { Commlink objCommlink = (Commlink)objSelectedGear; frmPickGear.CommlinkResponse = objCommlink.DeviceRating; } } else if (treArmor.SelectedNode.Level == 1) { // Open the Armor XML file and locate the selected Gear. objXmlDocument = XmlManager.Instance.Load("armor.xml"); objXmlGear = objXmlDocument.SelectSingleNode("/chummer/armors/armor[name = \"" + objSelectedArmor.Name + "\"]"); if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } } } catch { } frmPickGear.ShowDialog(this); // Make sure the dialogue window was not canceled. if (frmPickGear.DialogResult == DialogResult.Cancel) return false; TreeNode objNode = new TreeNode(); // Open the Cyberware XML file and locate the selected piece. objXmlDocument = XmlManager.Instance.Load("gear.xml"); objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. Gear objNewGear = new Gear(_objCharacter); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; objNewGear = objCommlink; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", false, false, true, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return false; if (!blnNullParent) objNewGear.Parent = objSelectedGear; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Apply a markup if applicable. int intCost = objNewGear.TotalCost; if (frmPickGear.Markup != 0) { double dblCost = Convert.ToDouble(intCost, GlobalOptions.Instance.CultureInfo); dblCost *= 1 + (Convert.ToDouble(frmPickGear.Markup, GlobalOptions.Instance.CultureInfo) / 100.0); intCost = Convert.ToInt32(dblCost); } // Multiply the cost if applicable. if (objNewGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailRestricted")) && _objOptions.MultiplyRestrictedCost) intCost *= _objOptions.RestrictedCostMultiplier; if (objNewGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailForbidden")) && _objOptions.MultiplyForbiddenCost) intCost *= _objOptions.ForbiddenCostMultiplier; // Do not allow the user to add new Gear if the Armor's Capacity has been reached. if (_objOptions.EnforceCapacity) { objSelectedArmor.Gear.Add(objSelectedGear); if (treArmor.SelectedNode.Level > 1) { if (objSelectedGear.CapacityRemaining < 0) { objSelectedArmor.Gear.Remove(objSelectedGear); MessageBox.Show(LanguageManager.Instance.GetString("Message_CapacityReached"), LanguageManager.Instance.GetString("MessageTitle_CapacityReached"), MessageBoxButtons.OK, MessageBoxIcon.Information); return frmPickGear.AddAgain; } else objSelectedArmor.Gear.Remove(objSelectedGear); } else { if (objSelectedArmor.CapacityRemaining < 0) { objSelectedArmor.Gear.Remove(objSelectedGear); MessageBox.Show(LanguageManager.Instance.GetString("Message_CapacityReached"), LanguageManager.Instance.GetString("MessageTitle_CapacityReached"), MessageBoxButtons.OK, MessageBoxIcon.Information); return frmPickGear.AddAgain; } else objSelectedArmor.Gear.Remove(objSelectedGear); } } // Check the item's Cost and make sure the character can afford it. if (!frmPickGear.FreeCost) { if (intCost > _objCharacter.Nuyen) { MessageBox.Show(LanguageManager.Instance.GetString("Message_NotEnoughNuyen"), LanguageManager.Instance.GetString("MessageTitle_NotEnoughNuyen"), MessageBoxButtons.OK, MessageBoxIcon.Information); // Remove any Improvements created by the Gear. _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Gear, objNewGear.InternalId); return frmPickGear.AddAgain; } else { // Create the Expense Log Entry. ExpenseLogEntry objExpense = new ExpenseLogEntry(); objExpense.Create(intCost * -1, LanguageManager.Instance.GetString("String_ExpensePurchaseArmorGear") + " " + objNewGear.DisplayNameShort, ExpenseType.Nuyen, DateTime.Now); _objCharacter.ExpenseEntries.Add(objExpense); _objCharacter.Nuyen -= intCost; objUndo.CreateNuyen(NuyenExpenseType.AddArmorGear, objNewGear.InternalId, objNewGear.Quantity); objExpense.Undo = objUndo; } } if (objNewGear.InternalId == Guid.Empty.ToString()) return false; // Create any Weapons that came with this Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } bool blnMatchFound = false; // If this is Ammunition, see if the character already has it on them. if (objNewGear.Category == "Ammunition") { foreach (Gear objCharacterGear in _objCharacter.Gear) { if (objCharacterGear.Name == objNewGear.Name && objCharacterGear.Category == objNewGear.Category && objCharacterGear.Rating == objNewGear.Rating && objCharacterGear.Extra == objNewGear.Extra) { // A match was found, so increase the quantity instead. objCharacterGear.Quantity += objNewGear.Quantity; blnMatchFound = true; if (objUndo.ObjectId != "") objUndo.ObjectId = objCharacterGear.InternalId; foreach (TreeNode objGearNode in treGear.Nodes[0].Nodes) { if (objCharacterGear.InternalId == objGearNode.Tag.ToString()) { objGearNode.Text = objCharacterGear.DisplayName; treArmor.SelectedNode = objGearNode; break; } } break; } } } // Add the Gear. if (!blnMatchFound) { if (objSelectedGear.Name == string.Empty) { objNode.ContextMenuStrip = cmsArmorGear; treArmor.SelectedNode.Nodes.Add(objNode); treArmor.SelectedNode.Expand(); objSelectedArmor.Gear.Add(objNewGear); } else { objNode.ContextMenuStrip = cmsArmorGear; treArmor.SelectedNode.Nodes.Add(objNode); treArmor.SelectedNode.Expand(); objSelectedGear.Children.Add(objNewGear); } // Select the node that was just added. treArmor.SelectedNode = objNode; } UpdateCharacterInfo(); RefreshSelectedArmor(); _blnIsDirty = true; UpdateWindowTitle(); return frmPickGear.AddAgain; }
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"; } } }
private void tsCyberwareAddGear_Click(object sender, EventArgs e) { // Make sure a parent items is selected, then open the Select Gear window. try { if (treCyberware.SelectedNode.Level == 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectCyberware"), LanguageManager.Instance.GetString("MessageTitle_SelectCyberware"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } catch { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectCyberware"), LanguageManager.Instance.GetString("MessageTitle_SelectCyberware"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } Cyberware objCyberware = new Cyberware(_objCharacter); foreach (Cyberware objCharacterCyberware in _objCharacter.Cyberware) { if (objCharacterCyberware.InternalId == treCyberware.SelectedNode.Tag.ToString()) { objCyberware = objCharacterCyberware; break; } foreach (Cyberware objChild in objCharacterCyberware.Children) { if (objChild.InternalId == treCyberware.SelectedNode.Tag.ToString()) { objCyberware = objChild; break; } } } // Make sure the Cyberware is allowed to accept Gear. if (objCyberware.AllowGear == null) { MessageBox.Show(LanguageManager.Instance.GetString("Message_CyberwareGear"), LanguageManager.Instance.GetString("MessageTitle_CyberwareGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, true); string strCategories = ""; foreach (XmlNode objXmlCategory in objCyberware.AllowGear) strCategories += objXmlCategory.InnerText + ","; frmPickGear.AllowedCategories = strCategories; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; TreeNode objNode = new TreeNode(); // Open the Gear XML file and locate the selected piece. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Gear objNewGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; objNode.Text = objCommlink.DisplayName; objNewGear = objCommlink; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, true, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objNewGear.Cost != "") objNewGear.Cost = "(" + objNewGear.Cost + ") * 0.1"; if (objNewGear.Cost3 != "") objNewGear.Cost3 = "(" + objNewGear.Cost3 + ") * 0.1"; if (objNewGear.Cost6 != "") objNewGear.Cost6 = "(" + objNewGear.Cost6 + ") * 0.1"; if (objNewGear.Cost10 != "") objNewGear.Cost10 = "(" + objNewGear.Cost10 + ") * 0.1"; if (objNewGear.Extra == "") objNewGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objNewGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objNewGear.Cost = "0"; objNewGear.Cost3 = "0"; objNewGear.Cost6 = "0"; objNewGear.Cost10 = "0"; } int intCost = objNewGear.TotalCost; // Multiply the cost if applicable. if (objNewGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailRestricted")) && _objOptions.MultiplyRestrictedCost) intCost *= _objOptions.RestrictedCostMultiplier; if (objNewGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailForbidden")) && _objOptions.MultiplyForbiddenCost) intCost *= _objOptions.ForbiddenCostMultiplier; // Check the item's Cost and make sure the character can afford it. if (!frmPickGear.FreeCost) { if (intCost > _objCharacter.Nuyen) { _objFunctions.DeleteGear(objNewGear, treWeapons, _objImprovementManager); MessageBox.Show(LanguageManager.Instance.GetString("Message_NotEnoughNuyen"), LanguageManager.Instance.GetString("MessageTitle_NotEnoughNuyen"), MessageBoxButtons.OK, MessageBoxIcon.Information); if (frmPickGear.AddAgain) tsCyberwareAddGear_Click(sender, e); return; } else { // Create the Expense Log Entry. ExpenseLogEntry objExpense = new ExpenseLogEntry(); objExpense.Create(intCost * -1, LanguageManager.Instance.GetString("String_ExpensePurchaseCyberwearGear") + " " + objNewGear.DisplayNameShort, ExpenseType.Nuyen, DateTime.Now); _objCharacter.ExpenseEntries.Add(objExpense); _objCharacter.Nuyen -= intCost; ExpenseUndo objUndo = new ExpenseUndo(); objUndo.CreateNuyen(NuyenExpenseType.AddCyberwareGear, objNewGear.InternalId, 1); objExpense.Undo = objUndo; } } // Create any Weapons that came with this Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } objCyberware.Gear.Add(objNewGear); objNode.ContextMenuStrip = cmsCyberwareGear; treCyberware.SelectedNode.Nodes.Add(objNode); treCyberware.SelectedNode.Expand(); UpdateCharacterInfo(); if (frmPickGear.AddAgain) tsCyberwareAddGear_Click(sender, e); _blnIsDirty = true; UpdateWindowTitle(); }
/// <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); } //TODO, when is this shit required, 4e holdover or need? // 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; // } // } //} //TODO: WHEN IS THIS NEEDED, 4e holdover? //// 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.SkillsSection.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); 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 tsCyberwareAddGear_Click(object sender, EventArgs e) { // Make sure a parent items is selected, then open the Select Gear window. try { if (treCyberware.SelectedNode.Level == 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectCyberware"), LanguageManager.Instance.GetString("MessageTitle_SelectCyberware"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } catch { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectCyberware"), LanguageManager.Instance.GetString("MessageTitle_SelectCyberware"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } Cyberware objCyberware = new Cyberware(_objCharacter); foreach (Cyberware objCharacterCyberware in _objCharacter.Cyberware) { if (objCharacterCyberware.InternalId == treCyberware.SelectedNode.Tag.ToString()) { objCyberware = objCharacterCyberware; break; } foreach (Cyberware objChild in objCharacterCyberware.Cyberwares) { if (objChild.InternalId == treCyberware.SelectedNode.Tag.ToString()) { objCyberware = objChild; break; } } } // Make sure the Cyberware is allowed to accept Gear. if (objCyberware.AllowGear == null) { MessageBox.Show(LanguageManager.Instance.GetString("Message_CyberwareGear"), LanguageManager.Instance.GetString("MessageTitle_CyberwareGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, false); string strCategories = ""; foreach (XmlNode objXmlCategory in objCyberware.AllowGear) strCategories += objXmlCategory.InnerText + ","; frmPickGear.AllowedCategories = strCategories; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; TreeNode objNode = new TreeNode(); // Open the Gear XML file and locate the selected piece. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[id = \"" + frmPickGear.SelectedGear + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Gear objNewGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlink": case "Commlink Upgrade": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objCommlink.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objCommlink.DisplayName; objNewGear = objCommlink; break; case "Commlink Operating System": case "Commlink Operating System Upgrade": OperatingSystem objOperatingSystem = new OperatingSystem(_objCharacter); objOperatingSystem.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objOperatingSystem.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objOperatingSystem.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objOperatingSystem.DisplayName; objNewGear = objOperatingSystem; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, true, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objGear.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objNewGear.Cost != "") objNewGear.Cost = "(" + objNewGear.Cost + ") * 0.1"; if (objNewGear.Cost3 != "") objNewGear.Cost3 = "(" + objNewGear.Cost3 + ") * 0.1"; if (objNewGear.Cost6 != "") objNewGear.Cost6 = "(" + objNewGear.Cost6 + ") * 0.1"; if (objNewGear.Cost10 != "") objNewGear.Cost10 = "(" + objNewGear.Cost10 + ") * 0.1"; if (objNewGear.Extra == "") objNewGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objNewGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objNewGear.Cost = "0"; objNewGear.Cost3 = "0"; objNewGear.Cost6 = "0"; objNewGear.Cost10 = "0"; } // Create any Weapons that came with this Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } objCyberware.Gears.Add(objNewGear); objNode.ContextMenuStrip = cmsCyberwareGear; treCyberware.SelectedNode.Nodes.Add(objNode); treCyberware.SelectedNode.Expand(); UpdateCharacterInfo(); if (frmPickGear.AddAgain) tsCyberwareAddGear_Click(sender, e); _blnIsDirty = true; UpdateWindowTitle(); }
/// <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(); }
/// Create a Armor Modification from an XmlNode. /// <param name="objXmlArmorNode">XmlNode to create the object from.</param> /// <param name="intRating">Rating of the selected ArmorMod.</param> /// <param name="lstWeapons">List of Weapons that are created by the Armor.</param> /// <param name="blnSkipCost">Whether or not creating the ArmorMod should skip the Variable price dialogue (should only be used by frmSelectArmor).</param> /// <param name="blnSkipSelectForms">Whether or not to skip selection forms (related to improvements) when creating this ArmorMod.</param> public void Create(XmlNode objXmlArmorNode, int intRating, List <Weapon> lstWeapons, bool blnSkipCost = false, bool blnSkipSelectForms = false) { if (objXmlArmorNode.TryGetStringFieldQuickly("name", ref _strName)) { _objCachedMyXmlNode = null; } objXmlArmorNode.TryGetStringFieldQuickly("category", ref _strCategory); objXmlArmorNode.TryGetStringFieldQuickly("armorcapacity", ref _strArmorCapacity); objXmlArmorNode.TryGetStringFieldQuickly("gearcapacity", ref _strGearCapacity); _intRating = intRating; objXmlArmorNode.TryGetInt32FieldQuickly("armor", ref _intArmorValue); objXmlArmorNode.TryGetInt32FieldQuickly("maxrating", ref _intMaxRating); objXmlArmorNode.TryGetStringFieldQuickly("avail", ref _strAvail); objXmlArmorNode.TryGetStringFieldQuickly("source", ref _strSource); objXmlArmorNode.TryGetStringFieldQuickly("page", ref _strPage); if (!objXmlArmorNode.TryGetStringFieldQuickly("altnotes", ref _strNotes)) { objXmlArmorNode.TryGetStringFieldQuickly("notes", ref _strNotes); } _nodBonus = objXmlArmorNode["bonus"]; _nodWirelessBonus = objXmlArmorNode["wirelessbonus"]; _blnWirelessOn = _nodWirelessBonus != null; objXmlArmorNode.TryGetStringFieldQuickly("cost", ref _strCost); // Check for a Variable Cost. if (!blnSkipCost && _strCost.StartsWith("Variable(")) { string strFirstHalf = _strCost.TrimStartOnce("Variable(", true).TrimEndOnce(')'); string strSecondHalf = string.Empty; int intHyphenIndex = strFirstHalf.IndexOf('-'); if (intHyphenIndex != -1) { if (intHyphenIndex + 1 < strFirstHalf.Length) { strSecondHalf = strFirstHalf.Substring(intHyphenIndex + 1); } strFirstHalf = strFirstHalf.Substring(0, intHyphenIndex); } if (!blnSkipSelectForms) { decimal decMin; decimal decMax = decimal.MaxValue; if (intHyphenIndex != -1) { decMin = Convert.ToDecimal(strFirstHalf, GlobalOptions.InvariantCultureInfo); decMax = Convert.ToDecimal(strSecondHalf, GlobalOptions.InvariantCultureInfo); } else { decMin = Convert.ToDecimal(strFirstHalf.FastEscape('+'), GlobalOptions.InvariantCultureInfo); } if (decMin != decimal.MinValue || decMax != decimal.MaxValue) { frmSelectNumber frmPickNumber = new frmSelectNumber(_objCharacter.Options.NuyenDecimals); if (decMax > 1000000) { decMax = 1000000; } frmPickNumber.Minimum = decMin; frmPickNumber.Maximum = decMax; frmPickNumber.Description = LanguageManager.GetString("String_SelectVariableCost", GlobalOptions.Language).Replace("{0}", DisplayNameShort(GlobalOptions.Language)); frmPickNumber.AllowCancel = false; frmPickNumber.ShowDialog(); _strCost = frmPickNumber.SelectedValue.ToString(GlobalOptions.InvariantCultureInfo); } else { _strCost = strFirstHalf; } } else { _strCost = strFirstHalf; } } if (objXmlArmorNode["bonus"] != null && !blnSkipSelectForms) { if (!ImprovementManager.CreateImprovements(_objCharacter, Improvement.ImprovementSource.ArmorMod, _guiID.ToString("D"), objXmlArmorNode["bonus"], false, intRating, DisplayNameShort(GlobalOptions.Language))) { _guiID = Guid.Empty; return; } if (!string.IsNullOrEmpty(ImprovementManager.SelectedValue)) { _strExtra = ImprovementManager.SelectedValue; } } // Add any Gear that comes with the Armor. XmlNode xmlChildrenNode = objXmlArmorNode["gears"]; if (xmlChildrenNode != null) { XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); using (XmlNodeList xmlUseGearList = xmlChildrenNode.SelectNodes("usegear")) if (xmlUseGearList != null) { foreach (XmlNode objXmlArmorGear in xmlUseGearList) { intRating = 0; string strForceValue = string.Empty; objXmlArmorGear.TryGetInt32FieldQuickly("rating", ref intRating); objXmlArmorGear.TryGetStringFieldQuickly("select", ref strForceValue); XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = " + objXmlArmorGear.InnerText.CleanXPath() + "]"); Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, intRating, lstWeapons, strForceValue, !blnSkipSelectForms); objGear.Capacity = "[0]"; objGear.ArmorCapacity = "[0]"; objGear.Cost = "0"; objGear.ParentID = InternalId; _lstGear.Add(objGear); } } } // Add Weapons if applicable. if (objXmlArmorNode.InnerXml.Contains("<addweapon>")) { XmlDocument objXmlWeaponDocument = XmlManager.Load("weapons.xml"); // More than one Weapon can be added, so loop through all occurrences. using (XmlNodeList xmlAddWeaponList = objXmlArmorNode.SelectNodes("addweapon")) if (xmlAddWeaponList != null) { foreach (XmlNode objXmlAddWeapon in xmlAddWeaponList) { string strLoopID = objXmlAddWeapon.InnerText; XmlNode objXmlWeapon = strLoopID.IsGuid() ? objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[id = \"" + strLoopID + "\"]") : objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + strLoopID + "\"]"); Weapon objGearWeapon = new Weapon(_objCharacter); objGearWeapon.Create(objXmlWeapon, lstWeapons, true, !blnSkipSelectForms, blnSkipCost); objGearWeapon.ParentID = InternalId; objGearWeapon.Cost = "0"; lstWeapons.Add(objGearWeapon); Guid.TryParse(objGearWeapon.InternalId, out _guiWeaponID); } } } SourceDetail = new SourceString(_strSource, _strPage); }
/// Create a Weapon Accessory from an XmlNode and return the TreeNodes for it. /// <param name="objXmlAccessory">XmlNode to create the object from.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="strMount">Mount slot that the Weapon Accessory will consume.</param> /// <param name="intRating">Rating of the Weapon Accessory.</param> public void Create(XmlNode objXmlAccessory, TreeNode objNode, Tuple <string, string> strMount, int intRating, ContextMenuStrip cmsAccessoryGear, bool blnSkipCost = false, bool blnCreateChildren = true) { objXmlAccessory.TryGetStringFieldQuickly("name", ref _strName); _strMount = strMount.Item1; _strExtraMount = strMount.Item2; _intRating = intRating; objXmlAccessory.TryGetStringFieldQuickly("avail", ref _strAvail); // Check for a Variable Cost. if (blnSkipCost) { _strCost = "0"; } else if (objXmlAccessory["cost"] != null) { _strCost = objXmlAccessory["cost"].InnerText; if (_strCost.StartsWith("Variable")) { decimal decMin = 0; decimal decMax = decimal.MaxValue; string strCost = _strCost.TrimStart("Variable", true).Trim("()".ToCharArray()); if (strCost.Contains('-')) { string[] strValues = strCost.Split('-'); decMin = Convert.ToDecimal(strValues[0], GlobalOptions.InvariantCultureInfo); decMax = Convert.ToDecimal(strValues[1], GlobalOptions.InvariantCultureInfo); } else { decMin = Convert.ToDecimal(strCost.FastEscape('+'), GlobalOptions.InvariantCultureInfo); } if (decMin != 0 || decMax != decimal.MaxValue) { frmSelectNumber frmPickNumber = new frmSelectNumber(); if (decMax > 1000000) { decMax = 1000000; } frmPickNumber.Minimum = decMin; frmPickNumber.Maximum = decMax; frmPickNumber.Description = LanguageManager.GetString("String_SelectVariableCost").Replace("{0}", DisplayNameShort); frmPickNumber.AllowCancel = false; frmPickNumber.ShowDialog(); _strCost = frmPickNumber.SelectedValue.ToString(); } } } objXmlAccessory.TryGetStringFieldQuickly("source", ref _strSource); objXmlAccessory.TryGetStringFieldQuickly("page", ref _strPage); _nodAllowGear = objXmlAccessory["allowgear"]; objXmlAccessory.TryGetStringFieldQuickly("rc", ref _strRC); objXmlAccessory.TryGetBoolFieldQuickly("rcdeployable", ref _blnDeployable); objXmlAccessory.TryGetInt32FieldQuickly("rcgroup", ref _intRCGroup); objXmlAccessory.TryGetStringFieldQuickly("conceal", ref _strConceal); objXmlAccessory.TryGetInt32FieldQuickly("ammoslots", ref _intAmmoSlots); objXmlAccessory.TryGetStringFieldQuickly("ammoreplace", ref _strAmmoReplace); objXmlAccessory.TryGetInt32FieldQuickly("accuracy", ref _intAccuracy); objXmlAccessory.TryGetStringFieldQuickly("dicepool", ref _strDicePool); objXmlAccessory.TryGetStringFieldQuickly("damagetype", ref _strDamageType); objXmlAccessory.TryGetStringFieldQuickly("damage", ref _strDamage); objXmlAccessory.TryGetStringFieldQuickly("damagereplace", ref _strDamageReplace); objXmlAccessory.TryGetStringFieldQuickly("firemode", ref _strFireMode); objXmlAccessory.TryGetStringFieldQuickly("firemodereplace", ref _strFireModeReplace); objXmlAccessory.TryGetStringFieldQuickly("ap", ref _strAP); objXmlAccessory.TryGetStringFieldQuickly("apreplace", ref _strAPReplace); objXmlAccessory.TryGetStringFieldQuickly("addmode", ref _strAddMode); objXmlAccessory.TryGetInt32FieldQuickly("fullburst", ref _intFullBurst); objXmlAccessory.TryGetInt32FieldQuickly("suppressive", ref _intSuppressive); objXmlAccessory.TryGetInt32FieldQuickly("rangebonus", ref _intRangeBonus); objXmlAccessory.TryGetStringFieldQuickly("extra", ref _strExtra); objXmlAccessory.TryGetInt32FieldQuickly("ammobonus", ref _intAmmoBonus); objXmlAccessory.TryGetInt32FieldQuickly("accessorycostmultiplier", ref _intAccessoryCostMultiplier); // Add any Gear that comes with the Weapon Accessory. if (objXmlAccessory["gears"] != null && blnCreateChildren) { XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); foreach (XmlNode objXmlAccessoryGear in objXmlAccessory.SelectNodes("gears/usegear")) { int intGearRating = 0; decimal decGearQty = 1; string strChildForceSource = string.Empty; string strChildForcePage = string.Empty; string strChildForceValue = string.Empty; bool blnStartCollapsed = objXmlAccessoryGear["name"].Attributes?["startcollapsed"]?.InnerText == "yes"; bool blnChildCreateChildren = objXmlAccessoryGear["name"].Attributes?["createchildren"]?.InnerText != "no"; bool blnAddChildImprovements = !blnSkipCost; if (objXmlAccessoryGear["name"].Attributes?["addimprovements"]?.InnerText == "no") { blnAddChildImprovements = false; } if (objXmlAccessoryGear["rating"] != null) { intGearRating = Convert.ToInt32(objXmlAccessoryGear["rating"].InnerText); } if (objXmlAccessoryGear["name"].Attributes?["qty"] != null) { decGearQty = Convert.ToDecimal(objXmlAccessoryGear["name"].Attributes["qty"].InnerText, GlobalOptions.InvariantCultureInfo); } if (objXmlAccessoryGear["name"].Attributes?["select"] != null) { strChildForceValue = objXmlAccessoryGear["name"].Attributes["select"].InnerText; } if (objXmlAccessoryGear["source"] != null) { strChildForceSource = objXmlAccessoryGear["source"].InnerText; } if (objXmlAccessoryGear["page"] != null) { strChildForcePage = objXmlAccessoryGear["page"].InnerText; } XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlAccessoryGear["name"].InnerText + "\" and category = \"" + objXmlAccessoryGear["category"].InnerText + "\"]"); Gear objGear = new Gear(_objCharacter); TreeNode objGearNode = new TreeNode(); List <Weapon> lstWeapons = new List <Weapon>(); List <TreeNode> lstWeaponNodes = new List <TreeNode>(); if (!string.IsNullOrEmpty(objXmlGear["devicerating"]?.InnerText)) { Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, objGearNode, intGearRating, lstWeapons, lstWeaponNodes, strChildForceValue, false, false, blnAddChildImprovements, blnChildCreateChildren); objGear = objCommlink; } else { objGear.Create(objXmlGear, objGearNode, intGearRating, lstWeapons, lstWeaponNodes, strChildForceValue, false, false, blnAddChildImprovements, blnChildCreateChildren); } objGear.Quantity = decGearQty; objGear.Cost = "0"; objGear.MinRating = intGearRating; objGear.MaxRating = intGearRating; objGear.ParentID = InternalId; if (!string.IsNullOrEmpty(strChildForceSource)) { objGear.Source = strChildForceSource; } if (!string.IsNullOrEmpty(strChildForcePage)) { objGear.Page = strChildForcePage; } _lstGear.Add(objGear); // Change the Capacity of the child if necessary. if (objXmlAccessoryGear["capacity"] != null) { objGear.Capacity = "[" + objXmlAccessoryGear["capacity"].InnerText + "]"; } objGearNode.ContextMenuStrip = cmsAccessoryGear; objGearNode.ForeColor = SystemColors.GrayText; objNode.Nodes.Add(objGearNode); if (!blnStartCollapsed) { objNode.Expand(); } } } if (GlobalOptions.Language != GlobalOptions.DefaultLanguage) { XmlNode objAccessoryNode = MyXmlNode; if (objAccessoryNode != null) { _strAltName = objAccessoryNode["translate"]?.InnerText ?? string.Empty; _strAltPage = objAccessoryNode["altpage"]?.InnerText ?? string.Empty; } } objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); }
/// <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 async void CreateCritter(string strCritterName, int intForce) { // Code from frmMetatype. XmlDocument objXmlDocument = XmlManager.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) { Program.MainForm.ShowMessageBox(string.Format(GlobalOptions.CultureInfo, LanguageManager.GetString("Message_UnknownCritterType"), strCritterName), LanguageManager.GetString("MessageTitle_SelectCritterType"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // The Critter should use the same settings file as the character. using (Character objCharacter = new Character { SettingsFile = _objSpirit.CharacterObject.SettingsFile, // Override the defaults for the setting. IgnoreRules = true, IsCritter = true, BuildMethod = CharacterBuildMethod.Karma }) { if (!string.IsNullOrEmpty(txtCritterName.Text)) { objCharacter.Name = txtCritterName.Text; } string strSpace = LanguageManager.GetString("String_Space"); using (SaveFileDialog saveFileDialog = new SaveFileDialog { Filter = LanguageManager.GetString("DialogFilter_Chum5") + '|' + LanguageManager.GetString("DialogFilter_All"), FileName = strCritterName + strSpace + '(' + LanguageManager.GetString(_objSpirit.RatingLabel) + strSpace + _objSpirit.Force.ToString(GlobalOptions.InvariantCultureInfo) + ").chum5" }) { if (saveFileDialog.ShowDialog(this) != DialogResult.OK) { return; } string strFileName = saveFileDialog.FileName; objCharacter.FileName = strFileName; } Cursor = Cursors.WaitCursor; // 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.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; 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.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.MetatypeMinimum = ExpressionToInt(objXmlMetatype["bodmin"]?.InnerText, intForce, 0); objCharacter.AGI.MetatypeMinimum = ExpressionToInt(objXmlMetatype["agimin"]?.InnerText, intForce, 0); objCharacter.REA.MetatypeMinimum = ExpressionToInt(objXmlMetatype["reamin"]?.InnerText, intForce, 0); objCharacter.STR.MetatypeMinimum = ExpressionToInt(objXmlMetatype["strmin"]?.InnerText, intForce, 0); objCharacter.CHA.MetatypeMinimum = ExpressionToInt(objXmlMetatype["chamin"]?.InnerText, intForce, 0); objCharacter.INT.MetatypeMinimum = ExpressionToInt(objXmlMetatype["intmin"]?.InnerText, intForce, 0); objCharacter.LOG.MetatypeMinimum = ExpressionToInt(objXmlMetatype["logmin"]?.InnerText, intForce, 0); objCharacter.WIL.MetatypeMinimum = ExpressionToInt(objXmlMetatype["wilmin"]?.InnerText, intForce, 0); objCharacter.MAG.MetatypeMinimum = ExpressionToInt(objXmlMetatype["magmin"]?.InnerText, intForce, 0); objCharacter.RES.MetatypeMinimum = ExpressionToInt(objXmlMetatype["resmin"]?.InnerText, intForce, 0); objCharacter.EDG.MetatypeMinimum = ExpressionToInt(objXmlMetatype["edgmin"]?.InnerText, intForce, 0); objCharacter.ESS.MetatypeMinimum = ExpressionToInt(objXmlMetatype["essmax"]?.InnerText, intForce, 0); // Sprites can never have Physical Attributes. if (objXmlMetatype["category"].InnerText.EndsWith("Sprite", StringComparison.Ordinal)) { 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.Metatype = strCritterName; objCharacter.MetatypeCategory = objXmlMetatype["category"].InnerText; objCharacter.Metavariant = string.Empty; objCharacter.MetatypeBP = 0; if (objXmlMetatype["movement"] != null) { objCharacter.Movement = objXmlMetatype["movement"].InnerText; } // Load the Qualities file. XmlDocument objXmlQualityDocument = XmlManager.Load("qualities.xml"); // Determine if the Metatype has any bonuses. if (objXmlMetatype.InnerXml.Contains("bonus")) { ImprovementManager.CreateImprovements(objCharacter, Improvement.ImprovementSource.Metatype, strCritterName, objXmlMetatype.SelectSingleNode("bonus"), 1, strCritterName); } // Create the Qualities that come with the Metatype. foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/*/quality")) { XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); List <Weapon> lstWeapons = new List <Weapon>(); Quality objQuality = new Quality(objCharacter); string strForceValue = objXmlQualityItem.Attributes?["select"]?.InnerText ?? string.Empty; QualitySource objSource = objXmlQualityItem.Attributes["removable"]?.InnerText == bool.TrueString ? QualitySource.MetatypeRemovable : QualitySource.Metatype; objQuality.Create(objXmlQuality, objSource, lstWeapons, strForceValue); objCharacter.Qualities.Add(objQuality); // Add any created Weapons to the character. foreach (Weapon objWeapon in lstWeapons) { 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.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); CritterPower objPower = new CritterPower(objCharacter); string strForcedValue = objXmlPower.Attributes?["select"]?.InnerText ?? string.Empty; int intRating = Convert.ToInt32(objXmlPower.Attributes?["rating"]?.InnerText, GlobalOptions.InvariantCultureInfo); objPower.Create(objXmlCritterPower, intRating, strForcedValue); objCharacter.CritterPowers.Add(objPower); } if (objXmlCritter["optionalpowers"] != null) { //For every 3 full points of Force a spirit has, it may gain one Optional Power. for (int i = intForce - 3; i >= 0; i -= 3) { XmlDocument objDummyDocument = new XmlDocument { XmlResolver = null }; XmlNode bonusNode = objDummyDocument.CreateNode(XmlNodeType.Element, "bonus", null); objDummyDocument.AppendChild(bonusNode); XmlNode powerNode = objDummyDocument.ImportNode(objXmlMetatype["optionalpowers"].CloneNode(true), true); objDummyDocument.ImportNode(powerNode, true); bonusNode.AppendChild(powerNode); ImprovementManager.CreateImprovements(objCharacter, Improvement.ImprovementSource.Metatype, objCharacter.Metatype, bonusNode, 1, objCharacter.Metatype); } } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Load("complexforms.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { string strForceValue = objXmlComplexForm.Attributes?["select"]?.InnerText ?? string.Empty; XmlNode objXmlComplexFormData = objXmlProgramDocument.SelectSingleNode("/chummer/complexforms/complexform[name = \"" + objXmlComplexForm.InnerText + "\"]"); ComplexForm objComplexForm = new ComplexForm(objCharacter); objComplexForm.Create(objXmlComplexFormData, strForceValue); objCharacter.ComplexForms.Add(objComplexForm); } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlCritter.SelectNodes("gears/gear")) { int intRating = 0; if (objXmlGear.Attributes["rating"] != null) { intRating = ExpressionToInt(objXmlGear.Attributes["rating"].InnerText, decimal.ToInt32(nudForce.Value), 0); } string strForceValue = objXmlGear.Attributes?["select"]?.InnerText ?? string.Empty; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = " + objXmlGear.InnerText.CleanXPath() + "]"); Gear objGear = new Gear(objCharacter); List <Weapon> lstWeapons = new List <Weapon>(); objGear.Create(objXmlGearItem, intRating, lstWeapons, strForceValue); objGear.Cost = "0"; objCharacter.Gear.Add(objGear); } // Add the Unarmed Attack Weapon to the character. objXmlDocument = XmlManager.Load("weapons.xml"); XmlNode objXmlWeapon = objXmlDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"Unarmed Attack\"]"); if (objXmlWeapon != null) { List <Weapon> lstWeapons = new List <Weapon>(); Weapon objWeapon = new Weapon(objCharacter); objWeapon.Create(objXmlWeapon, lstWeapons); objWeapon.ParentID = Guid.NewGuid().ToString("D", GlobalOptions.InvariantCultureInfo); // Unarmed Attack can never be removed objCharacter.Weapons.Add(objWeapon); foreach (Weapon objLoopWeapon in lstWeapons) { objCharacter.Weapons.Add(objLoopWeapon); } } objCharacter.Alias = strCritterName; objCharacter.Created = true; if (!objCharacter.Save()) { Cursor = Cursors.Default; return; } _objSpirit.FileName = objCharacter.FileName; } // Link the newly-created Critter to the Spirit. imgLink.SetToolTip(LanguageManager.GetString(_objSpirit.EntityType == SpiritType.Spirit ? "Tip_Spirit_OpenFile" : "Tip_Sprite_OpenFile")); ContactDetailChanged?.Invoke(this, null); Character objOpenCharacter = await Program.MainForm.LoadCharacter(_objSpirit.FileName).ConfigureAwait(true); Cursor = Cursors.Default; Program.MainForm.OpenCharacter(objOpenCharacter); }
private void TestGear() { Character objCharacter = new Character(); XmlDocument objXmlDocument = XmlManager.Load("gear.xml"); pgbProgress.Minimum = 0; pgbProgress.Value = 0; pgbProgress.Maximum = objXmlDocument.SelectNodes("/chummer/gears/gear").Count; // Gear. foreach (XmlNode objXmlGear in objXmlDocument.SelectNodes("/chummer/gears/gear")) { pgbProgress.Value++; Application.DoEvents(); try { Gear objTemp = new Gear(objCharacter); List <Weapon> lstWeapons = new List <Weapon>(); objTemp.Create(objXmlGear, 1, lstWeapons); try { decimal objValue = objTemp.TotalCost; } catch { if (objXmlGear["category"].InnerText != "Mook") { txtOutput.Text += objXmlGear["name"].InnerText + " failed TotalCost\r\n"; } } try { string objValue = objTemp.TotalAvail(GlobalOptions.CultureInfo, GlobalOptions.Language); } catch { txtOutput.Text += objXmlGear["name"].InnerText + " failed TotalAvail\r\n"; } try { string objValue = objTemp.CalculatedArmorCapacity; } catch { txtOutput.Text += objXmlGear["name"].InnerText + " failed CalculatedArmorCapacity\r\n"; } try { string objValue = objTemp.CalculatedCapacity; } catch { txtOutput.Text += objXmlGear["name"].InnerText + " failed CalculatedCapacity\r\n"; } try { decimal objValue = objTemp.CalculatedCost; } catch { if (objXmlGear["category"].InnerText != "Mook") { txtOutput.Text += objXmlGear["name"].InnerText + " failed CalculatedCost\r\n"; } } } catch { txtOutput.Text += objXmlGear["name"].InnerText + " general failure\r\n"; } } objCharacter.DeleteCharacter(); }
private void tsVehicleWeaponAccessoryAddGear_Click(object sender, EventArgs e) { WeaponAccessory objAccessory = _objFunctions.FindVehicleWeaponAccessory(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles); // Make sure the Weapon Accessory is allowed to accept Gear. if (objAccessory.AllowGear == null) { MessageBox.Show(LanguageManager.Instance.GetString("Message_WeaponGear"), LanguageManager.Instance.GetString("MessageTitle_CyberwareGear"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, false); string strCategories = ""; foreach (XmlNode objXmlCategory in objAccessory.AllowGear) strCategories += objXmlCategory.InnerText + ","; frmPickGear.AllowedCategories = strCategories; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; TreeNode objNode = new TreeNode(); // Open the Gear XML file and locate the selected piece. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Gear objNewGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objCommlink.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objCommlink.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objCommlink.DisplayName; objNewGear = objCommlink; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, false, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; try { _blnSkipRefresh = true; nudGearQty.Increment = objGear.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; _blnSkipRefresh = false; } catch { } objNode.Text = objGear.DisplayName; objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objNewGear.Cost != "") objNewGear.Cost = "(" + objNewGear.Cost + ") * 0.1"; if (objNewGear.Cost3 != "") objNewGear.Cost3 = "(" + objNewGear.Cost3 + ") * 0.1"; if (objNewGear.Cost6 != "") objNewGear.Cost6 = "(" + objNewGear.Cost6 + ") * 0.1"; if (objNewGear.Cost10 != "") objNewGear.Cost10 = "(" + objNewGear.Cost10 + ") * 0.1"; if (objNewGear.Extra == "") objNewGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objNewGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objNewGear.Cost = "0"; objNewGear.Cost3 = "0"; objNewGear.Cost6 = "0"; objNewGear.Cost10 = "0"; } objAccessory.Gear.Add(objNewGear); objNode.ContextMenuStrip = cmsVehicleWeaponAccessoryGear; treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); UpdateCharacterInfo(); if (frmPickGear.AddAgain) tsVehicleWeaponAccessoryAddGear_Click(sender, e); _blnIsDirty = true; UpdateWindowTitle(); }
void TestMetatype(string strFile) { XmlDocument objXmlDocument = XmlManager.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.Load(strFile); Character objCharacter = new Character(); 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.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["magaug"].InnerText, intForce, 0)); objCharacter.MAGAdept.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)); objCharacter.DEP.AssignLimits(ExpressionToString(objXmlMetatype["depmin"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["depmax"].InnerText, intForce, 0), ExpressionToString(objXmlMetatype["depaug"].InnerText, intForce, 0)); } else { int intMinModifier = -3; 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.MAG.AssignLimits(ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["magmin"].InnerText, intForce, 3)); objCharacter.MAGAdept.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)); objCharacter.DEP.AssignLimits(ExpressionToString(objXmlMetatype["depmin"].InnerText, intForce, intMinModifier), ExpressionToString(objXmlMetatype["depmin"].InnerText, intForce, 3), ExpressionToString(objXmlMetatype["depmin"].InnerText, intForce, 3)); } /* 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)); * _objCharacter.DEP.Value = Convert.ToInt32(ExpressionToString(objXmlMetatype["depmin"].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.Metatype = objXmlMetatype["name"].InnerText; * _objCharacter.MetatypeCategory = objXmlMetatype["category"].InnerText; * _objCharacter.Metavariant = string.Empty; * _objCharacter.MetatypeBP = 400; * * if (objXmlMetatype["movement"] != null) * _objCharacter.Movement = objXmlMetatype["movement"].InnerText; * // Load the Qualities file. * XmlDocument objXmlQualityDocument = XmlManager.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 + "\"]"); * List<Weapon> lstWeapons = new List<Weapon>(); * Quality objQuality = new Quality(_objCharacter); * string strForceValue = string.Empty; * 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, lstWeapons, strForceValue); * _objCharacter.Qualities.Add(objQuality); * } * foreach (XmlNode objXmlQualityItem in objXmlMetatype.SelectNodes("qualities/negative/quality")) * { * XmlNode objXmlQuality = objXmlQualityDocument.SelectSingleNode("/chummer/qualities/quality[name = \"" + objXmlQualityItem.InnerText + "\"]"); * List<Weapon> lstWeapons = new List<Weapon>(); * Quality objQuality = new Quality(_objCharacter); * string strForceValue = string.Empty; * 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, lstWeapons, 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.Load("critterpowers.xml"); foreach (XmlNode objXmlPower in objXmlCritter.SelectNodes("powers/power")) { XmlNode objXmlCritterPower = objXmlDocument.SelectSingleNode("/chummer/powers/power[name = \"" + objXmlPower.InnerText + "\"]"); CritterPower objPower = new CritterPower(objCharacter); string strForcedValue = objXmlPower.Attributes?["select"]?.InnerText ?? string.Empty; int intRating = 0; if (objXmlPower.Attributes["rating"] != null) { intRating = Convert.ToInt32(objXmlPower.Attributes["rating"].InnerText); } objPower.Create(objXmlCritterPower, 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(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.SkillsSection.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(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; } } } } //TODO: Sorry, whenever we get critter book... // 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) // { // //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.SkillsSection.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. } // Add any Complex Forms the Critter comes with (typically Sprites) XmlDocument objXmlProgramDocument = XmlManager.Load("complexforms.xml"); foreach (XmlNode objXmlComplexForm in objXmlCritter.SelectNodes("complexforms/complexform")) { int intRating = 0; if (objXmlComplexForm.Attributes["rating"] != null) { intRating = ExpressionToInt(objXmlComplexForm.Attributes["rating"].InnerText, intForce, 0); } string strForceValue = objXmlComplexForm.Attributes?["select"]?.InnerText ?? string.Empty; XmlNode objXmlComplexFormData = objXmlProgramDocument.SelectSingleNode("/chummer/complexforms/complexform[name = \"" + objXmlComplexForm.InnerText + "\"]"); ComplexForm objComplexForm = new ComplexForm(objCharacter); objComplexForm.Create(objXmlComplexFormData, strForceValue); objCharacter.ComplexForms.Add(objComplexForm); } // Add any Gear the Critter comes with (typically Programs for A.I.s) XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); foreach (XmlNode objXmlGear in objXmlCritter.SelectNodes("gears/gear")) { int intRating = 0; if (objXmlGear.Attributes["rating"] != null) { intRating = ExpressionToInt(objXmlGear.Attributes["rating"].InnerText, intForce, 0); } string strForceValue = objXmlGear.Attributes?["select"]?.InnerText ?? string.Empty; XmlNode objXmlGearItem = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlGear.InnerText + "\"]"); Gear objGear = new Gear(objCharacter); List <Weapon> lstWeapons = new List <Weapon>(); objGear.Create(objXmlGearItem, intRating, lstWeapons, strForceValue); objGear.Cost = "0"; objCharacter.Gear.Add(objGear); } } catch { txtOutput.Text += objCharacter.Metatype + " general failure\r\n"; } objCharacter.DeleteCharacter(); } }
/// <summary> /// Select a piece of Gear and add it to a piece of Armor. /// </summary> /// <param name="blnShowArmorCapacityOnly">Whether or not only items that consume capacity should be shown.</param> private bool PickArmorGear(bool blnShowArmorCapacityOnly = false) { bool blnNullParent = true; Gear objSelectedGear = new Gear(_objCharacter); Armor objSelectedArmor = new Armor(_objCharacter); foreach (Armor objArmor in _objCharacter.Armor) { if (objArmor.InternalId == treArmor.SelectedNode.Tag.ToString()) objSelectedArmor = objArmor; } if (treArmor.SelectedNode.Level > 1) { objSelectedGear = _objFunctions.FindArmorGear(treArmor.SelectedNode.Tag.ToString(), _objCharacter.Armor, out objSelectedArmor); if (objSelectedGear != null) blnNullParent = false; } // Open the Gear XML file and locate the selected Gear. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSelectedGear.Name + "\" and category = \"" + objSelectedGear.Category + "\"]"); bool blnFakeCareerMode = false; if (_objCharacter.Metatype == "A.I." || _objCharacter.MetatypeCategory == "Technocritters" || _objCharacter.MetatypeCategory == "Protosapients") blnFakeCareerMode = true; frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, blnFakeCareerMode); frmPickGear.ShowArmorCapacityOnly = blnShowArmorCapacityOnly; frmPickGear.CapacityDisplayStyle = objSelectedArmor.CapacityDisplayStyle; try { if (treArmor.SelectedNode.Level > 1) { if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } if (frmPickGear.AllowedCategories != "") frmPickGear.AllowedCategories += objSelectedGear.Category + ","; // If the Gear has a Capacity with no brackets (meaning it grants Capacity), show only Subsystems (those that conume Capacity). if (!objSelectedGear.Capacity.Contains('[')) frmPickGear.MaximumCapacity = objSelectedGear.CapacityRemaining; if (objSelectedGear.Category == "Commlinks" || objSelectedGear.Category == "Cyberdecks") { Commlink objCommlink = (Commlink)objSelectedGear; frmPickGear.CommlinkResponse = objCommlink.DeviceRating; } } else if (treArmor.SelectedNode.Level == 1) { // Open the Armor XML file and locate the selected Gear. objXmlDocument = XmlManager.Instance.Load("armor.xml"); objXmlGear = objXmlDocument.SelectSingleNode("/chummer/armors/armor[name = \"" + objSelectedArmor.Name + "\"]"); if (objXmlGear.InnerXml.Contains("<addoncategory>")) { string strCategories = ""; foreach (XmlNode objXmlCategory in objXmlGear.SelectNodes("addoncategory")) strCategories += objXmlCategory.InnerText + ","; // Remove the trailing comma. strCategories = strCategories.Substring(0, strCategories.Length - 1); frmPickGear.AddCategory(strCategories); } } } catch { } frmPickGear.ShowDialog(this); // Make sure the dialogue window was not canceled. if (frmPickGear.DialogResult == DialogResult.Cancel) return false; TreeNode objNode = new TreeNode(); // Open the Cyberware XML file and locate the selected piece. objXmlDocument = XmlManager.Instance.Load("gear.xml"); objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Gear objNewGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating); objCommlink.Quantity = frmPickGear.SelectedQty; try { nudGearQty.Increment = objCommlink.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; } catch { } objNewGear = objCommlink; break; default: Gear objGear = new Gear(_objCharacter); objGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", false, false, true, true, frmPickGear.Aerodynamic); objGear.Quantity = frmPickGear.SelectedQty; try { nudGearQty.Increment = objGear.CostFor; //nudGearQty.Minimum = nudGearQty.Increment; } catch { } objNewGear = objGear; break; } if (objNewGear.InternalId == Guid.Empty.ToString()) return false; if (!blnNullParent) objNewGear.Parent = objSelectedGear; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objNewGear.Cost = (Convert.ToDouble(objNewGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objNewGear.Cost = "0"; objNewGear.Cost3 = "0"; objNewGear.Cost6 = "0"; objNewGear.Cost10 = "0"; } // Create any Weapons that came with this Gear. foreach (Weapon objWeapon in objWeapons) _objCharacter.Weapons.Add(objWeapon); foreach (TreeNode objWeaponNode in objWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } bool blnMatchFound = false; // If this is Ammunition, see if the character already has it on them. if (objNewGear.Category == "Ammunition") { foreach (Gear objCharacterGear in _objCharacter.Gear) { if (objCharacterGear.Name == objNewGear.Name && objCharacterGear.Category == objNewGear.Category && objCharacterGear.Rating == objNewGear.Rating && objCharacterGear.Extra == objNewGear.Extra) { // A match was found, so increase the quantity instead. objCharacterGear.Quantity += objNewGear.Quantity; blnMatchFound = true; foreach (TreeNode objGearNode in treGear.Nodes[0].Nodes) { if (objCharacterGear.InternalId == objGearNode.Tag.ToString()) { objGearNode.Text = objCharacterGear.DisplayName; treGear.SelectedNode = objGearNode; break; } } break; } } } // Add the Gear. if (!blnMatchFound) { if (objSelectedGear.Name == string.Empty) { objNode.ContextMenuStrip = cmsArmorGear; treArmor.SelectedNode.Nodes.Add(objNode); treArmor.SelectedNode.Expand(); objSelectedArmor.Gear.Add(objNewGear); } else { objNode.ContextMenuStrip = cmsArmorGear; treArmor.SelectedNode.Nodes.Add(objNode); treArmor.SelectedNode.Expand(); objSelectedGear.Children.Add(objNewGear); } // Select the node that was just added. treGear.SelectedNode = objNode; } UpdateCharacterInfo(); RefreshSelectedArmor(); _blnIsDirty = true; UpdateWindowTitle(); return frmPickGear.AddAgain; }
private void tsVehicleAddGear_Click(object sender, EventArgs e) { // Make sure a parent items is selected, then open the Select Gear window. try { if (treVehicles.SelectedNode.Level == 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectGearVehicle"), LanguageManager.Instance.GetString("MessageTitle_SelectGearVehicle"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } catch { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectGearVehicle"), LanguageManager.Instance.GetString("MessageTitle_SelectGearVehicle"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (treVehicles.SelectedNode.Level > 1) treVehicles.SelectedNode = treVehicles.SelectedNode.Parent; // Locate the selected Vehicle. Vehicle objSelectedVehicle = _objFunctions.FindVehicle(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter, true); frmPickGear.ShowPositiveCapacityOnly = true; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; // Open the Gear XML file and locate the selected piece. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlink": case "Commlink Upgrade": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objCommlink.Quantity = frmPickGear.SelectedQty; objGear = objCommlink; break; case "Commlink Operating System": case "Commlink Operating System Upgrade": OperatingSystem objOperatingSystem = new OperatingSystem(_objCharacter); objOperatingSystem.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objOperatingSystem.Quantity = frmPickGear.SelectedQty; objGear = objOperatingSystem; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, false, true, frmPickGear.Aerodynamic); objNewGear.Quantity = frmPickGear.SelectedQty; objGear = objNewGear; break; } if (objGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objGear.Cost = (Convert.ToDouble(objGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objGear.Cost != "") objGear.Cost = "(" + objGear.Cost + ") * 0.1"; if (objGear.Cost3 != "") objGear.Cost3 = "(" + objGear.Cost3 + ") * 0.1"; if (objGear.Cost6 != "") objGear.Cost6 = "(" + objGear.Cost6 + ") * 0.1"; if (objGear.Cost10 != "") objGear.Cost10 = "(" + objGear.Cost10 + ") * 0.1"; if (objGear.Extra == "") objGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; } objGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objGear.DisplayName; // Change the cost of the Sensor itself to 0. if (frmPickGear.SelectedCategory == "Sensors") { objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; } int intCost = objGear.TotalCost; // Multiply the cost if applicable. if (objGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailRestricted")) && _objOptions.MultiplyRestrictedCost) intCost *= _objOptions.RestrictedCostMultiplier; if (objGear.TotalAvail().EndsWith(LanguageManager.Instance.GetString("String_AvailForbidden")) && _objOptions.MultiplyForbiddenCost) intCost *= _objOptions.ForbiddenCostMultiplier; // Check the item's Cost and make sure the character can afford it. if (!frmPickGear.FreeCost) { if (intCost > _objCharacter.Nuyen) { MessageBox.Show(LanguageManager.Instance.GetString("Message_NotEnoughNuyen"), LanguageManager.Instance.GetString("MessageTitle_NotEnoughNuyen"), MessageBoxButtons.OK, MessageBoxIcon.Information); if (frmPickGear.AddAgain) tsVehicleAddGear_Click(sender, e); return; } else { // Create the Expense Log Entry. ExpenseLogEntry objExpense = new ExpenseLogEntry(); objExpense.Create(intCost * -1, LanguageManager.Instance.GetString("String_ExpensePurchaseVehicleGear") + " " + objGear.DisplayNameShort, ExpenseType.Nuyen, DateTime.Now); _objCharacter.ExpenseEntries.Add(objExpense); _objCharacter.Nuyen -= intCost; ExpenseUndo objUndo = new ExpenseUndo(); objUndo.CreateNuyen(NuyenExpenseType.AddVehicleGear, objGear.InternalId, 1); objExpense.Undo = objUndo; } } objNode.ContextMenuStrip = cmsVehicleGear; bool blnMatchFound = false; // If this is Ammunition, see if the character already has it on them. if (objGear.Category == "Ammunition") { foreach (Gear objVehicleGear in objSelectedVehicle.Gear) { if (objVehicleGear.Name == objGear.Name && objVehicleGear.Category == objGear.Category && objVehicleGear.Rating == objGear.Rating && objVehicleGear.Extra == objGear.Extra) { // A match was found, so increase the quantity instead. objVehicleGear.Quantity += objGear.Quantity; blnMatchFound = true; foreach (TreeNode objGearNode in treVehicles.SelectedNode.Nodes) { if (objVehicleGear.InternalId == objGearNode.Tag.ToString()) { objGearNode.Text = objVehicleGear.DisplayName; break; } } break; } } } if (!blnMatchFound) { treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); // Add the Gear to the Vehicle. objSelectedVehicle.Gear.Add(objGear); } if (frmPickGear.AddAgain) tsVehicleAddGear_Click(sender, e); UpdateCharacterInfo(); RefreshSelectedVehicle(); _blnIsDirty = true; UpdateWindowTitle(); }
/// <summary> /// Change the size of a Vehicle's Sensor /// </summary> /// <param name="objVehicle">Vehicle to modify.</param> /// <param name="blnIncrease">True if the Sensor should increase in size, False if it should decrease.</param> private void ChangeVehicleSensor(Vehicle objVehicle, bool blnIncrease) { XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objNewNode; bool blnFound = false; Gear objSensor = new Gear(_objCharacter); Gear objNewSensor = new Gear(_objCharacter); TreeNode objTreeNode = new TreeNode(); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); foreach (Gear objCurrentGear in objVehicle.Gear) { if (objCurrentGear.Name == "Microdrone Sensor") { if (blnIncrease) { objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Minidrone Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; } break; } else if (objCurrentGear.Name == "Minidrone Sensor") { if (blnIncrease) objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Small Drone Sensor\" and category = \"Sensors\"]"); else objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Microdrone Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; break; } else if (objCurrentGear.Name == "Small Drone Sensor") { if (blnIncrease) objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Medium Drone Sensor\" and category = \"Sensors\"]"); else objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Minidrone Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; break; } else if (objCurrentGear.Name == "Medium Drone Sensor") { if (blnIncrease) objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Large Drone Sensor\" and category = \"Sensors\"]"); else objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Small Drone Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; break; } else if (objCurrentGear.Name == "Large Drone Sensor") { if (blnIncrease) objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Vehicle Sensor\" and category = \"Sensors\"]"); else objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Medium Drone Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; break; } else if (objCurrentGear.Name == "Vehicle Sensor") { if (blnIncrease) objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Extra-Large Vehicle Sensor\" and category = \"Sensors\"]"); else objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Large Drone Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; break; } else if (objCurrentGear.Name == "Extra-Large Vehicle Sensor") { if (!blnIncrease) { objNewNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"Vehicle Sensor\" and category = \"Sensors\"]"); objNewSensor.Create(objNewNode, _objCharacter, objTreeNode, 0, lstWeapons, lstWeaponNodes); objSensor = objCurrentGear; blnFound = true; } break; } } // If the item was found, update the Vehicle Sensor information. if (blnFound) { objSensor.Name = objNewSensor.Name; objSensor.Rating = objNewSensor.Rating; objSensor.Capacity = objNewSensor.Capacity; objSensor.DeviceRating = objNewSensor.DeviceRating; objSensor.Avail = objNewSensor.Avail; objSensor.Cost = objNewSensor.Cost; objSensor.Source = objNewSensor.Source; objSensor.Page = objNewSensor.Page; // Update the name of the item in the TreeView. TreeNode objNode = _objFunctions.FindNode(objSensor.InternalId, treVehicles); objNode.Text = objSensor.DisplayNameShort; } }
/// Create a Armor Modification from an XmlNode and return the TreeNodes for it. /// <param name="objXmlArmorNode">XmlNode to create the object from.</param> /// <param name="objNode">TreeNode to populate a TreeView.</param> /// <param name="intRating">Rating of the selected ArmorMod.</param> /// <param name="objWeapons">List of Weapons that are created by the Armor.</param> /// <param name="objWeaponNodes">List of Weapon Nodes that are created by the Armor.</param> /// <param name="blnSkipCost">Whether or not creating the Armor should skip the Variable price dialogue (should only be used by frmSelectArmor).</param> public void Create(XmlNode objXmlArmorNode, TreeNode objNode, ContextMenuStrip cmsArmorGear, int intRating, List <Weapon> objWeapons, List <TreeNode> objWeaponNodes, bool blnSkipCost = false, bool blnSkipSelectForms = false) { objXmlArmorNode.TryGetStringFieldQuickly("name", ref _strName); objXmlArmorNode.TryGetStringFieldQuickly("category", ref _strCategory); objXmlArmorNode.TryGetStringFieldQuickly("armorcapacity", ref _strArmorCapacity); objXmlArmorNode.TryGetStringFieldQuickly("gearcapacity", ref _strGearCapacity); _intRating = intRating; objXmlArmorNode.TryGetInt32FieldQuickly("armor", ref _intA); objXmlArmorNode.TryGetInt32FieldQuickly("maxrating", ref _intMaxRating); objXmlArmorNode.TryGetStringFieldQuickly("avail", ref _strAvail); objXmlArmorNode.TryGetStringFieldQuickly("source", ref _strSource); objXmlArmorNode.TryGetStringFieldQuickly("page", ref _strPage); _nodBonus = objXmlArmorNode["bonus"]; _nodWirelessBonus = objXmlArmorNode["wirelessbonus"]; _blnWirelessOn = _nodWirelessBonus != null; if (GlobalOptions.Language != GlobalOptions.DefaultLanguage) { XmlNode objArmorNode = MyXmlNode; if (objArmorNode != null) { objArmorNode.TryGetStringFieldQuickly("translate", ref _strAltName); objArmorNode.TryGetStringFieldQuickly("altpage", ref _strAltPage); } XmlDocument objXmlDocument = XmlManager.Load("armor.xml"); objArmorNode = objXmlDocument.SelectSingleNode("/chummer/categories/category[. = \"" + _strCategory + "\"]"); _strAltCategory = objArmorNode?.Attributes?["translate"]?.InnerText; } // Check for a Variable Cost. if (blnSkipCost) { _strCost = "0"; } else if (objXmlArmorNode["cost"] != null) { XmlNode objXmlArmorCostNode = objXmlArmorNode["cost"]; if (objXmlArmorCostNode.InnerText.StartsWith("Variable")) { decimal decMin = 0.0m; decimal decMax = decimal.MaxValue; char[] charParentheses = { '(', ')' }; string strCost = objXmlArmorNode["cost"].InnerText.TrimStart("Variable", true).Trim(charParentheses); if (strCost.Contains('-')) { string[] strValues = strCost.Split('-'); decMin = Convert.ToDecimal(strValues[0], GlobalOptions.InvariantCultureInfo); decMax = Convert.ToDecimal(strValues[1], GlobalOptions.InvariantCultureInfo); } else { decMin = Convert.ToDecimal(strCost.FastEscape('+'), GlobalOptions.InvariantCultureInfo); } if (decMin != 0 || decMax != decimal.MaxValue) { string strNuyenFormat = _objCharacter.Options.NuyenFormat; int intDecimalPlaces = strNuyenFormat.IndexOf('.'); if (intDecimalPlaces == -1) { intDecimalPlaces = 0; } else { intDecimalPlaces = strNuyenFormat.Length - intDecimalPlaces - 1; } frmSelectNumber frmPickNumber = new frmSelectNumber(intDecimalPlaces); if (decMax > 1000000) { decMax = 1000000; } frmPickNumber.Minimum = decMin; frmPickNumber.Maximum = decMax; frmPickNumber.Description = LanguageManager.GetString("String_SelectVariableCost").Replace("{0}", DisplayNameShort); frmPickNumber.AllowCancel = false; frmPickNumber.ShowDialog(); _strCost = frmPickNumber.SelectedValue.ToString(); } } else { _strCost = objXmlArmorCostNode.InnerText; } } if (objXmlArmorNode["bonus"] != null && !blnSkipCost && !blnSkipSelectForms) { if (!ImprovementManager.CreateImprovements(_objCharacter, Improvement.ImprovementSource.ArmorMod, _guiID.ToString(), objXmlArmorNode["bonus"], false, intRating, DisplayNameShort)) { _guiID = Guid.Empty; return; } if (!string.IsNullOrEmpty(ImprovementManager.SelectedValue)) { _strExtra = ImprovementManager.SelectedValue; objNode.Text += " (" + ImprovementManager.SelectedValue + ")"; } } // Add any Gear that comes with the Armor. if (objXmlArmorNode["gears"] != null) { XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); foreach (XmlNode objXmlArmorGear in objXmlArmorNode.SelectNodes("gears/usegear")) { intRating = 0; string strForceValue = string.Empty; objXmlArmorGear.TryGetInt32FieldQuickly("rating", ref intRating); objXmlArmorGear.TryGetStringFieldQuickly("select", ref strForceValue); XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlArmorGear.InnerText + "\"]"); Gear objGear = new Gear(_objCharacter); TreeNode objGearNode = new TreeNode(); List <Weapon> lstWeapons = new List <Weapon>(); List <TreeNode> lstWeaponNodes = new List <TreeNode>(); if (!string.IsNullOrEmpty(objXmlGear["devicerating"]?.InnerText)) { Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, objGearNode, intRating, lstWeapons, lstWeaponNodes, strForceValue, false, false, !blnSkipCost && !blnSkipSelectForms); objGear = objCommlink; } else { objGear.Create(objXmlGear, objGearNode, intRating, lstWeapons, lstWeaponNodes, strForceValue, false, false, !blnSkipCost && !blnSkipSelectForms); } objGear.Capacity = "[0]"; objGear.ArmorCapacity = "[0]"; objGear.Cost = "0"; objGear.MaxRating = objGear.Rating; objGear.MinRating = objGear.Rating; objGear.ParentID = InternalId; _lstGear.Add(objGear); objGearNode.ForeColor = SystemColors.GrayText; objGearNode.ContextMenuStrip = cmsArmorGear; objNode.Nodes.Add(objGearNode); objNode.Expand(); } } // Add Weapons if applicable. if (objXmlArmorNode.InnerXml.Contains("<addweapon>")) { XmlDocument objXmlWeaponDocument = XmlManager.Load("weapons.xml"); // More than one Weapon can be added, so loop through all occurrences. foreach (XmlNode objXmlAddWeapon in objXmlArmorNode.SelectNodes("addweapon")) { var objXmlWeapon = helpers.Guid.IsGuid(objXmlAddWeapon.InnerText) ? objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[id = \"" + objXmlAddWeapon.InnerText + "\" and starts-with(category, \"Cyberware\")]") : objXmlWeaponDocument.SelectSingleNode("/chummer/weapons/weapon[name = \"" + objXmlAddWeapon.InnerText + "\" and starts-with(category, \"Cyberware\")]"); List <TreeNode> lstGearWeaponNodes = new List <TreeNode>(); Weapon objGearWeapon = new Weapon(_objCharacter); objGearWeapon.Create(objXmlWeapon, lstGearWeaponNodes, null, null, objWeapons, null, true, !blnSkipCost && !blnSkipSelectForms); objGearWeapon.ParentID = InternalId; foreach (TreeNode objLoopNode in lstGearWeaponNodes) { objLoopNode.ForeColor = SystemColors.GrayText; objWeaponNodes.Add(objLoopNode); } objWeapons.Add(objGearWeapon); _guiWeaponID = Guid.Parse(objGearWeapon.InternalId); } } objNode.Text = DisplayName; objNode.Tag = _guiID.ToString(); }
private void tsVehicleAddGear_Click(object sender, EventArgs e) { // Make sure a parent items is selected, then open the Select Gear window. try { if (treVehicles.SelectedNode.Level == 0) { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectGearVehicle"), LanguageManager.Instance.GetString("MessageTitle_SelectGearVehicle"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } catch { MessageBox.Show(LanguageManager.Instance.GetString("Message_SelectGearVehicle"), LanguageManager.Instance.GetString("MessageTitle_SelectGearVehicle"), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (treVehicles.SelectedNode.Level > 1) treVehicles.SelectedNode = treVehicles.SelectedNode.Parent; // Locate the selected Vehicle. Vehicle objSelectedVehicle = _objFunctions.FindVehicle(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles); frmSelectGear frmPickGear = new frmSelectGear(_objCharacter); //frmPickGear.ShowPositiveCapacityOnly = true; frmPickGear.ShowDialog(this); if (frmPickGear.DialogResult == DialogResult.Cancel) return; // Open the Gear XML file and locate the selected piece. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objXmlGear = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + frmPickGear.SelectedGear + "\" and category = \"" + frmPickGear.SelectedCategory + "\"]"); // Create the new piece of Gear. List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); TreeNode objNode = new TreeNode(); Gear objGear = new Gear(_objCharacter); switch (frmPickGear.SelectedCategory) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, false); objCommlink.Quantity = frmPickGear.SelectedQty; objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Create(objXmlGear, _objCharacter, objNode, frmPickGear.SelectedRating, objWeapons, objWeaponNodes, "", frmPickGear.Hacked, frmPickGear.InherentProgram, false, true, frmPickGear.Aerodynamic); objNewGear.Quantity = frmPickGear.SelectedQty; objGear = objNewGear; break; } if (objGear.InternalId == Guid.Empty.ToString()) return; // Reduce the cost for Do It Yourself components. if (frmPickGear.DoItYourself) objGear.Cost = (Convert.ToDouble(objGear.Cost, GlobalOptions.Instance.CultureInfo) * 0.5).ToString(); // Reduce the cost to 10% for Hacked programs. if (frmPickGear.Hacked) { if (objGear.Cost != "") objGear.Cost = "(" + objGear.Cost + ") * 0.1"; if (objGear.Cost3 != "") objGear.Cost3 = "(" + objGear.Cost3 + ") * 0.1"; if (objGear.Cost6 != "") objGear.Cost6 = "(" + objGear.Cost6 + ") * 0.1"; if (objGear.Cost10 != "") objGear.Cost10 = "(" + objGear.Cost10 + ") * 0.1"; if (objGear.Extra == "") objGear.Extra = LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); else objGear.Extra += ", " + LanguageManager.Instance.GetString("Label_SelectGear_Hacked"); } // If the item was marked as free, change its cost. if (frmPickGear.FreeCost) { objGear.Cost = "0"; objGear.Cost3 = "0"; objGear.Cost6 = "0"; objGear.Cost10 = "0"; } objGear.Quantity = frmPickGear.SelectedQty; objNode.Text = objGear.DisplayName; try { nudVehicleRating.Increment = objGear.CostFor; nudVehicleRating.Minimum = nudGearQty.Increment; } catch { } // Change the cost of the Sensor itself to 0. //if (frmPickGear.SelectedCategory == "Sensors") //{ // objGear.Cost = "0"; // objGear.Cost3 = "0"; // objGear.Cost6 = "0"; // objGear.Cost10 = "0"; //} objNode.ContextMenuStrip = cmsVehicleGear; bool blnMatchFound = false; // If this is Ammunition, see if the character already has it on them. if (objGear.Category == "Ammunition") { foreach (Gear objVehicleGear in objSelectedVehicle.Gear) { if (objVehicleGear.Name == objGear.Name && objVehicleGear.Category == objGear.Category && objVehicleGear.Rating == objGear.Rating && objVehicleGear.Extra == objGear.Extra) { // A match was found, so increase the quantity instead. objVehicleGear.Quantity += objGear.Quantity; blnMatchFound = true; foreach (TreeNode objGearNode in treVehicles.SelectedNode.Nodes) { if (objVehicleGear.InternalId == objGearNode.Tag.ToString()) { objGearNode.Text = objVehicleGear.DisplayName; break; } } break; } } } if (!blnMatchFound) { treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); // Add the Gear to the Vehicle. objSelectedVehicle.Gear.Add(objGear); } if (frmPickGear.AddAgain) tsVehicleAddGear_Click(sender, e); UpdateCharacterInfo(); RefreshSelectedVehicle(); }
/// <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); }
/// Create a Weapon Accessory from an XmlNode and return the TreeNodes for it. /// <param name="objXmlAccessory">XmlNode to create the object from.</param> /// <param name="strMount">Mount slot that the Weapon Accessory will consume.</param> /// <param name="intRating">Rating of the Weapon Accessory.</param> /// <param name="blnCreateChildren">Whether or not child items should be created.</param> /// <param name="blnCreateImprovements">Whether or not bonuses should be created.</param> /// <param name="blnSkipCost">Whether or not forms asking to determine variable costs should be displayed.</param> public void Create(XmlNode objXmlAccessory, Tuple <string, string> strMount, int intRating, bool blnSkipCost = false, bool blnCreateChildren = true, bool blnCreateImprovements = true) { if (objXmlAccessory.TryGetStringFieldQuickly("name", ref _strName)) { _objCachedMyXmlNode = null; } _strMount = strMount.Item1; _strExtraMount = strMount.Item2; _intRating = intRating; objXmlAccessory.TryGetStringFieldQuickly("avail", ref _strAvail); // Check for a Variable Cost. if (blnSkipCost) { _strCost = "0"; } else { _strCost = objXmlAccessory["cost"]?.InnerText ?? "0"; if (_strCost.StartsWith("Variable(")) { decimal decMin; decimal decMax = decimal.MaxValue; string strCost = _strCost.TrimStartOnce("Variable(", true).TrimEndOnce(')'); if (strCost.Contains('-')) { string[] strValues = strCost.Split('-'); decMin = Convert.ToDecimal(strValues[0], GlobalOptions.InvariantCultureInfo); decMax = Convert.ToDecimal(strValues[1], GlobalOptions.InvariantCultureInfo); } else { decMin = Convert.ToDecimal(strCost.FastEscape('+'), GlobalOptions.InvariantCultureInfo); } if (decMin != 0 || decMax != decimal.MaxValue) { string strNuyenFormat = _objCharacter.Options.NuyenFormat; int intDecimalPlaces = strNuyenFormat.IndexOf('.'); if (intDecimalPlaces == -1) { intDecimalPlaces = 0; } else { intDecimalPlaces = strNuyenFormat.Length - intDecimalPlaces - 1; } frmSelectNumber frmPickNumber = new frmSelectNumber(intDecimalPlaces); if (decMax > 1000000) { decMax = 1000000; } frmPickNumber.Minimum = decMin; frmPickNumber.Maximum = decMax; frmPickNumber.Description = LanguageManager.GetString("String_SelectVariableCost", GlobalOptions.Language).Replace("{0}", DisplayNameShort(GlobalOptions.Language)); frmPickNumber.AllowCancel = false; frmPickNumber.ShowDialog(); _strCost = frmPickNumber.SelectedValue.ToString(GlobalOptions.InvariantCultureInfo); } } } objXmlAccessory.TryGetStringFieldQuickly("source", ref _strSource); objXmlAccessory.TryGetStringFieldQuickly("page", ref _strPage); _nodAllowGear = objXmlAccessory["allowgear"]; if (!objXmlAccessory.TryGetStringFieldQuickly("altnotes", ref _strNotes)) { objXmlAccessory.TryGetStringFieldQuickly("notes", ref _strNotes); } objXmlAccessory.TryGetStringFieldQuickly("rc", ref _strRC); objXmlAccessory.TryGetBoolFieldQuickly("rcdeployable", ref _blnDeployable); objXmlAccessory.TryGetInt32FieldQuickly("rcgroup", ref _intRCGroup); objXmlAccessory.TryGetStringFieldQuickly("conceal", ref _strConceal); objXmlAccessory.TryGetInt32FieldQuickly("ammoslots", ref _intAmmoSlots); objXmlAccessory.TryGetStringFieldQuickly("ammoreplace", ref _strAmmoReplace); objXmlAccessory.TryGetInt32FieldQuickly("accuracy", ref _intAccuracy); objXmlAccessory.TryGetStringFieldQuickly("dicepool", ref _strDicePool); objXmlAccessory.TryGetStringFieldQuickly("damagetype", ref _strDamageType); objXmlAccessory.TryGetStringFieldQuickly("damage", ref _strDamage); objXmlAccessory.TryGetStringFieldQuickly("damagereplace", ref _strDamageReplace); objXmlAccessory.TryGetStringFieldQuickly("firemode", ref _strFireMode); objXmlAccessory.TryGetStringFieldQuickly("firemodereplace", ref _strFireModeReplace); objXmlAccessory.TryGetStringFieldQuickly("ap", ref _strAP); objXmlAccessory.TryGetStringFieldQuickly("apreplace", ref _strAPReplace); objXmlAccessory.TryGetStringFieldQuickly("addmode", ref _strAddMode); objXmlAccessory.TryGetInt32FieldQuickly("fullburst", ref _intFullBurst); objXmlAccessory.TryGetInt32FieldQuickly("suppressive", ref _intSuppressive); objXmlAccessory.TryGetInt32FieldQuickly("rangebonus", ref _intRangeBonus); objXmlAccessory.TryGetStringFieldQuickly("extra", ref _strExtra); objXmlAccessory.TryGetInt32FieldQuickly("ammobonus", ref _intAmmoBonus); objXmlAccessory.TryGetInt32FieldQuickly("accessorycostmultiplier", ref _intAccessoryCostMultiplier); // Add any Gear that comes with the Weapon Accessory. XmlNode xmlGearsNode = objXmlAccessory["gears"]; if (xmlGearsNode != null && blnCreateChildren) { XmlDocument objXmlGearDocument = XmlManager.Load("gear.xml"); using (XmlNodeList xmlGearsList = xmlGearsNode.SelectNodes("usegear")) if (xmlGearsList != null) { foreach (XmlNode objXmlAccessoryGear in xmlGearsList) { XmlNode objXmlAccessoryGearName = objXmlAccessoryGear["name"]; XmlAttributeCollection objXmlAccessoryGearNameAttributes = objXmlAccessoryGearName?.Attributes; int intGearRating = 0; decimal decGearQty = 1; string strChildForceSource = objXmlAccessoryGear["source"]?.InnerText ?? string.Empty; string strChildForcePage = objXmlAccessoryGear["page"]?.InnerText ?? string.Empty; string strChildForceValue = objXmlAccessoryGearNameAttributes?["select"]?.InnerText ?? string.Empty; bool blnChildCreateChildren = objXmlAccessoryGearNameAttributes?["createchildren"]?.InnerText != bool.FalseString; bool blnAddChildImprovements = objXmlAccessoryGearNameAttributes?["addimprovements"]?.InnerText != bool.FalseString && blnCreateImprovements; if (objXmlAccessoryGear["rating"] != null) { intGearRating = Convert.ToInt32(objXmlAccessoryGear["rating"].InnerText); } if (objXmlAccessoryGearNameAttributes?["qty"] != null) { decGearQty = Convert.ToDecimal(objXmlAccessoryGearNameAttributes["qty"].InnerText, GlobalOptions.InvariantCultureInfo); } XmlNode objXmlGear = objXmlGearDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objXmlAccessoryGearName?.InnerText + "\" and category = \"" + objXmlAccessoryGear["category"].InnerText + "\"]"); Gear objGear = new Gear(_objCharacter); List <Weapon> lstWeapons = new List <Weapon>(); objGear.Create(objXmlGear, intGearRating, lstWeapons, strChildForceValue, blnAddChildImprovements, blnChildCreateChildren); objGear.Quantity = decGearQty; objGear.Cost = "0"; objGear.MinRating = intGearRating; objGear.MaxRating = intGearRating; objGear.ParentID = InternalId; if (!string.IsNullOrEmpty(strChildForceSource)) { objGear.Source = strChildForceSource; } if (!string.IsNullOrEmpty(strChildForcePage)) { objGear.Page = strChildForcePage; } _lstGear.Add(objGear); // Change the Capacity of the child if necessary. if (objXmlAccessoryGear["capacity"] != null) { objGear.Capacity = '[' + objXmlAccessoryGear["capacity"].InnerText + ']'; } } } } }
public void CreateAllGearTest() { // Create a new Human character. Character objCharacter = new Character(); objCharacter.LoadMetatype(Guid.Parse("e28e7075-f635-4c02-937c-e4fc61c51602")); TreeNode objNode = new TreeNode(); ContextMenuStrip cmsGear = new ContextMenuStrip(); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstTreeNodes = new List<TreeNode>(); XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); foreach (XmlNode objXmlNode in objXmlDocument.SelectNodes("/chummer/gears/gear")) { Gear objGear = new Gear(objCharacter); objGear.Create(objXmlNode, objCharacter, objNode, 1, lstWeapons, lstTreeNodes); } }