/// <summary> /// Locate a Commlink. /// </summary> /// <param name="strGuid">InternalId of the Gear to find.</param> /// <param name="lstCommlink">List of Commlinks to search.</param> public Commlink FindCommlink(string strGuid, List<Gear> lstCommlink) { Commlink objReturn = new Commlink(_objCharacter); List<Gear> lstCheckGear = new List<Gear>(); foreach (Gear objGear in lstCommlink) { if (objGear.Category == "Commlinks") { lstCheckGear.Add(objGear); } } foreach (Commlink objCommlink in lstCheckGear) { if (objCommlink.InternalId == strGuid) objReturn = objCommlink; else { if (objCommlink.Children.Count > 0) objReturn = FindCommlink(strGuid, objCommlink.Children); } if (objReturn != null) { if (objReturn.InternalId != Guid.Empty.ToString() && objReturn.Name != "") return objReturn; } } objReturn = null; return objReturn; }
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> /// Change the active Commlink for the Character. /// </summary> /// <param name="objActiveCommlink"></param> private void ChangeActiveCommlink(Commlink objActiveCommlink) { List<Commlink> lstCommlinks = _objFunctions.FindCharacterCommlinks(_objCharacter.Gear); foreach (Commlink objCommlink in lstCommlinks) { if (objCommlink.InternalId != objActiveCommlink.InternalId) objCommlink.IsActive = false; } }
/// <summary> /// Enable/Disable the Paste Menu and ToolStrip items as appropriate. /// </summary> private void RefreshPasteStatus() { bool blnPasteEnabled = false; bool blnCopyEnabled = false; if (tabCharacterTabs.SelectedTab == tabStreetGear) { // Lifestyle Tab. if (tabStreetGearTabs.SelectedTab == tabLifestyle) { if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Lifestyle) blnPasteEnabled = true; try { foreach (Lifestyle objLifestyle in _objCharacter.Lifestyles) { if (objLifestyle.InternalId == treLifestyles.SelectedNode.Tag.ToString()) { blnCopyEnabled = true; break; } } } catch { } } // Armor Tab. if (tabStreetGearTabs.SelectedTab == tabArmor) { if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Armor) blnPasteEnabled = true; if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Gear || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Commlink || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.OperatingSystem) { // Gear can only be pasted into Armor, not Armor Mods. try { foreach (Armor objArmor in _objCharacter.Armor) { if (objArmor.InternalId == treArmor.SelectedNode.Tag.ToString()) { blnPasteEnabled = true; break; } } } catch { } } try { foreach (Armor objArmor in _objCharacter.Armor) { if (objArmor.InternalId == treArmor.SelectedNode.Tag.ToString()) { blnCopyEnabled = true; break; } } } catch { } try { Armor objArmor = new Armor(_objCharacter); Gear objGear = _objFunctions.FindArmorGear(treArmor.SelectedNode.Tag.ToString(), _objCharacter.Armor, out objArmor); if (objGear != null) blnCopyEnabled = true; } catch { } } // Weapons Tab. if (tabStreetGearTabs.SelectedTab == tabWeapons) { if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Weapon) blnPasteEnabled = true; if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Gear || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Commlink || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.OperatingSystem) { // Check if the copied Gear can be pasted into the selected Weapon Accessory. Gear objGear = new Gear(_objCharacter); XmlNode objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/gear"); if (objXmlNode != null) { switch (objXmlNode["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Load(objXmlNode, true); objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Load(objXmlNode, true); objGear = objNewGear; break; } objGear.Parent = null; // Make sure that a Weapon Accessory is selected and that it allows Gear of the item's Category. WeaponAccessory objAccessory = new WeaponAccessory(_objCharacter); try { foreach (Weapon objCharacterWeapon in _objCharacter.Weapons) { foreach (WeaponAccessory objWeaponAccessory in objCharacterWeapon.WeaponAccessories) { if (objWeaponAccessory.InternalId == treWeapons.SelectedNode.Tag.ToString()) { objAccessory = objWeaponAccessory; break; } } } if (objAccessory.AllowGear != null) { foreach (XmlNode objAllowed in objAccessory.AllowGear.SelectNodes("gearcategory")) { if (objAllowed.InnerText == objGear.Category) { blnPasteEnabled = true; break; } } } } catch { } } } try { foreach (Weapon objWeapon in _objCharacter.Weapons) { if (objWeapon.InternalId == treWeapons.SelectedNode.Tag.ToString()) { blnCopyEnabled = true; break; } } } catch { } try { WeaponAccessory objAccessory = new WeaponAccessory(_objCharacter); Gear objGear = _objFunctions.FindWeaponGear(treWeapons.SelectedNode.Tag.ToString(), _objCharacter.Weapons, out objAccessory); if (objGear != null) blnCopyEnabled = true; } catch { } } // Gear Tab. if (tabStreetGearTabs.SelectedTab == tabGear) { if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Gear || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Commlink || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.OperatingSystem) blnPasteEnabled = true; try { Gear objGear = _objFunctions.FindGear(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear); if (objGear != null) blnCopyEnabled = true; } catch { } } } // Vehicles Tab. if (tabCharacterTabs.SelectedTab == tabVehicles) { if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Vehicle) blnPasteEnabled = true; if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Gear || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Commlink || GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.OperatingSystem) { // Gear can only be pasted into Vehicles and Vehicle Gear. try { foreach (Vehicle objVehicle in _objCharacter.Vehicles) { if (objVehicle.InternalId == treVehicles.SelectedNode.Tag.ToString()) { blnPasteEnabled = true; break; } } } catch { } try { Vehicle objVehicle = new Vehicle(_objCharacter); Gear objGear = _objFunctions.FindVehicleGear(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, out objVehicle); if (objGear != null) blnPasteEnabled = true; } catch { } } if (GlobalOptions.Instance.ClipboardContentType == ClipboardContentType.Weapon) { // Weapons can only be pasted into Vehicle Mods that allow them (Weapon Mounts and Mechanical Arms). try { VehicleMod objMod = new VehicleMod(_objCharacter); foreach (Vehicle objVehicle in _objCharacter.Vehicles) { foreach (VehicleMod objVehicleMod in objVehicle.Mods) { if (objVehicleMod.InternalId == treVehicles.SelectedNode.Tag.ToString()) { if (objVehicleMod.Name.StartsWith("Weapon Mount") || objVehicleMod.Name.StartsWith("Heavy Weapon Mount") || objVehicleMod.Name.StartsWith("Mechanical Arm")) { blnPasteEnabled = true; break; } } } } } catch { } } try { foreach (Vehicle objVehicle in _objCharacter.Vehicles) { if (objVehicle.InternalId == treVehicles.SelectedNode.Tag.ToString()) { blnCopyEnabled = true; break; } } } catch { } try { Vehicle objVehicle = new Vehicle(_objCharacter); Gear objGear = _objFunctions.FindVehicleGear(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, out objVehicle); if (objGear != null) blnCopyEnabled = true; } catch { } try { foreach (Vehicle objVehicle in _objCharacter.Vehicles) { foreach (VehicleMod objMod in objVehicle.Mods) { foreach (Weapon objWeapon in objMod.Weapons) { if (objWeapon.InternalId == treVehicles.SelectedNode.Tag.ToString()) { blnCopyEnabled = true; break; } } } } } catch { } } mnuEditPaste.Enabled = blnPasteEnabled; tsbPaste.Enabled = blnPasteEnabled; mnuEditCopy.Enabled = blnCopyEnabled; tsbCopy.Enabled = blnCopyEnabled; }
/// <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 chkGearHomeNode_CheckedChanged(object sender, EventArgs e) { Commlink objCommlink = new Commlink(_objCharacter); objCommlink = _objFunctions.FindCommlink(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear); objCommlink.HomeNode = chkGearHomeNode.Checked; _objCharacter.HasHomeNode = chkGearHomeNode.Checked; _objFunctions.ReplaceHomeNodes(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear, _objCharacter.Vehicles); RefreshSelectedGear(); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); }
/// <summary> /// Save the Character to an XML file. /// </summary> public void Save() { FileStream objStream = new FileStream(_strFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); XmlTextWriter objWriter = new XmlTextWriter(objStream, Encoding.Unicode); objWriter.Formatting = Formatting.Indented; objWriter.Indentation = 1; objWriter.IndentChar = '\t'; objWriter.WriteStartDocument(); // <character> objWriter.WriteStartElement("character"); // <createdversion /> objWriter.WriteElementString("createdversion", _strVersionCreated); // <appversion /> objWriter.WriteElementString("appversion", Application.ProductVersion.ToString().Replace("0.0.", string.Empty)); // <gameedition /> objWriter.WriteElementString("gameedition", "SR5"); // <settings /> objWriter.WriteElementString("settings", _strSettingsFileName); // <metatype /> objWriter.WriteElementString("metatype", _strMetatype); // <metatypebp /> objWriter.WriteElementString("metatypebp", _intMetatypeBP.ToString()); // <metavariant /> objWriter.WriteElementString("metavariant", _strMetavariant); // <metatypecategory /> objWriter.WriteElementString("metatypecategory", _strMetatypeCategory); // <movement /> objWriter.WriteElementString("movement", _strMovement); // <walk /> objWriter.WriteElementString("walk", _strWalk); // <run /> objWriter.WriteElementString("run", _strRun); // <sprint /> objWriter.WriteElementString("sprint", _strSprint); // <mutantcritterbaseskills /> objWriter.WriteElementString("mutantcritterbaseskills", _intMutantCritterBaseSkills.ToString()); // <prioritymetatype /> objWriter.WriteElementString("prioritymetatype", _strPriorityMetatype); // <priorityattributes /> objWriter.WriteElementString("priorityattributes", _strPriorityAttributes); // <priorityspecial /> objWriter.WriteElementString("priorityspecial", _strPrioritySpecial); // <priorityskills /> objWriter.WriteElementString("priorityskills", _strPrioritySkills); // <priorityresources /> objWriter.WriteElementString("priorityresources", _strPriorityResources); // <priorityskill1 /> objWriter.WriteElementString("priorityskill1", _strSkill1); // <priorityskill2 /> objWriter.WriteElementString("priorityskill2", _strSkill2); // <priorityskillgroup /> objWriter.WriteElementString("priorityskillgroup", _strSkillGroup); // <essenceatspecialstart /> objWriter.WriteElementString("essenceatspecialstart", _decEssenceAtSpecialStart.ToString(GlobalOptions.Instance.CultureInfo)); // <name /> objWriter.WriteElementString("name", _strName); // <mugshot /> objWriter.WriteElementString("mugshot", _strMugshot); // <sex /> objWriter.WriteElementString("sex", _strSex); // <age /> objWriter.WriteElementString("age", _strAge); // <eyes /> objWriter.WriteElementString("eyes", _strEyes); // <height /> objWriter.WriteElementString("height", _strHeight); // <weight /> objWriter.WriteElementString("weight", _strWeight); // <skin /> objWriter.WriteElementString("skin", _strSkin); // <hair /> objWriter.WriteElementString("hair", _strHair); // <description /> objWriter.WriteElementString("description", _strDescription); // <background /> objWriter.WriteElementString("background", _strBackground); // <concept /> objWriter.WriteElementString("concept", _strConcept); // <notes /> objWriter.WriteElementString("notes", _strNotes); // <alias /> objWriter.WriteElementString("alias", _strAlias); // <playername /> objWriter.WriteElementString("playername", _strPlayerName); // <gamenotes /> objWriter.WriteElementString("gamenotes", _strGameNotes); // <ignorerules /> if (_blnIgnoreRules) objWriter.WriteElementString("ignorerules", _blnIgnoreRules.ToString()); // <iscritter /> if (_blnIsCritter) objWriter.WriteElementString("iscritter", _blnIsCritter.ToString()); if (_blnPossessed) objWriter.WriteElementString("possessed", _blnPossessed.ToString()); if (_blnOverrideSpecialAttributeESSLoss) objWriter.WriteElementString("overridespecialattributeessloss", _blnOverrideSpecialAttributeESSLoss.ToString()); // <karma /> objWriter.WriteElementString("karma", _intKarma.ToString()); // <totalkarma /> objWriter.WriteElementString("totalkarma", _intTotalKarma.ToString()); // <special /> objWriter.WriteElementString("special", _intSpecial.ToString()); // <totalspecial /> objWriter.WriteElementString("totalspecial", _intTotalSpecial.ToString()); // <totalattributes /> objWriter.WriteElementString("totalattributes", _intTotalAttributes.ToString()); // <contactpoints /> objWriter.WriteElementString("contactpoints", _intContactPoints.ToString()); // <contactpoints /> objWriter.WriteElementString("contactpointsused", _intContactPointsUsed.ToString()); // <spelllimit /> objWriter.WriteElementString("spelllimit", _intSpellLimit.ToString()); // <cfplimit /> objWriter.WriteElementString("cfplimit", _intCFPLimit.ToString()); // <streetcred /> objWriter.WriteElementString("streetcred", _intStreetCred.ToString()); // <notoriety /> objWriter.WriteElementString("notoriety", _intNotoriety.ToString()); // <publicaware /> objWriter.WriteElementString("publicawareness", _intPublicAwareness.ToString()); // <burntstreetcred /> objWriter.WriteElementString("burntstreetcred", _intBurntStreetCred.ToString()); // <created /> objWriter.WriteElementString("created", _blnCreated.ToString()); // <maxavail /> objWriter.WriteElementString("maxavail", _intMaxAvail.ToString()); // <nuyen /> objWriter.WriteElementString("nuyen", _intNuyen.ToString()); // <nuyen /> objWriter.WriteElementString("startingnuyen", _intStartingNuyen.ToString()); // <adeptwaydiscount /> objWriter.WriteElementString("adeptwaydiscount", _intAdeptWayDiscount.ToString()); // <sumtoten /> objWriter.WriteElementString("sumtoten", _intSumtoTen.ToString()); // <buildpoints /> objWriter.WriteElementString("bp", _intBuildPoints.ToString()); // <buildkarma /> objWriter.WriteElementString("buildkarma", _intBuildKarma.ToString()); // <buildmethod /> objWriter.WriteElementString("buildmethod", _objBuildMethod.ToString()); // <gameplayoption /> objWriter.WriteElementString("gameplayoption", _strGameplayOption); // <gameplayoptionqualitylimit /> objWriter.WriteElementString("gameplayoptionqualitylimit", _intGameplayOptionQualityLimit.ToString()); // <maxnuyen /> objWriter.WriteElementString("maxnuyen", _intMaxNuyen.ToString()); // <maxkarma /> objWriter.WriteElementString("maxkarma", _intMaxKarma.ToString()); // <contactmultiplier /> objWriter.WriteElementString("contactmultiplier", _intContactMultiplier.ToString()); // <knowpts /> objWriter.WriteElementString("knowskillpts", _intKnowledgeSkills.ToString()); // <knowpts /> objWriter.WriteElementString("knowpts", _intKnowledgeSkillPoints.ToString()); // <skillpts /> objWriter.WriteElementString("skillpts", _intSkillPoints.ToString()); // <skillptsmax /> objWriter.WriteElementString("skillptsmax", _intSkillPointsMaximum.ToString()); // <skillgrps /> objWriter.WriteElementString("skillgrps", _intSkillGroups.ToString()); // <skillgrpsmax /> objWriter.WriteElementString("skillgrpsmax", _intSkillGroupsMaximum.ToString()); // <nuyenbp /> objWriter.WriteElementString("nuyenbp", _decNuyenBP.ToString()); // <nuyenmaxbp /> objWriter.WriteElementString("nuyenmaxbp", _decNuyenMaximumBP.ToString()); // <adept /> objWriter.WriteElementString("adept", _blnAdeptEnabled.ToString()); // <magician /> objWriter.WriteElementString("magician", _blnMagicianEnabled.ToString()); // <technomancer /> objWriter.WriteElementString("technomancer", _blnTechnomancerEnabled.ToString()); // <initiationoverride /> objWriter.WriteElementString("initiationoverride", _blnInitiationEnabled.ToString()); // <critter /> objWriter.WriteElementString("critter", _blnCritterEnabled.ToString()); // <uneducated /> objWriter.WriteElementString("uneducated", _blnUneducated.ToString()); // <uncouth /> objWriter.WriteElementString("uncouth", _blnUncouth.ToString()); // <uncouth /> objWriter.WriteElementString("schoolofhardknocks", _blnSchoolOfHardKnocks.ToString()); // <collegeeducation /> objWriter.WriteElementString("collegeeducation", _blnCollegeEducation.ToString()); // <friendsinhighplaces /> objWriter.WriteElementString("friendsinhighplaces", _blnFriendsInHighPlaces.ToString()); // <jackofalltrades /> objWriter.WriteElementString("jackofalltrades", _blnJackOfAllTrades.ToString()); // <infirm /> objWriter.WriteElementString("infirm", _blnInfirm.ToString()); // <blackmarket /> objWriter.WriteElementString("blackmarket", _blnBlackMarket.ToString()); objWriter.WriteElementString("excon", _blnExCon.ToString()); objWriter.WriteElementString("trustfund", _blnTrustFund.ToString()); objWriter.WriteElementString("techschool", _blnTechSchool.ToString()); objWriter.WriteElementString("restrictedgear", _blnRestrictedGear.ToString()); objWriter.WriteElementString("overclocker", _blnOverclocker.ToString()); objWriter.WriteElementString("mademan", _blnMadeMan.ToString()); objWriter.WriteElementString("linguist", _blnLinguist.ToString()); objWriter.WriteElementString("lightningreflexes", _blnLightningReflexes.ToString()); objWriter.WriteElementString("fame", _blnFame.ToString()); objWriter.WriteElementString("bornrich", _blnBornRich.ToString()); objWriter.WriteElementString("erased", _blnErased.ToString()); // <attributes> objWriter.WriteStartElement("attributes"); _attBOD.Save(objWriter); _attAGI.Save(objWriter); _attREA.Save(objWriter); _attSTR.Save(objWriter); _attCHA.Save(objWriter); _attINT.Save(objWriter); _attLOG.Save(objWriter); _attWIL.Save(objWriter); _attINI.Save(objWriter); _attEDG.Save(objWriter); _attMAG.Save(objWriter); _attRES.Save(objWriter); _attESS.Save(objWriter); // Include any special A.I. Attributes if applicable. if (_strMetatype.EndsWith("A.I.") || _strMetatypeCategory == "Technocritters" || _strMetatypeCategory == "Protosapients") { objWriter.WriteElementString("response", _intResponse.ToString()); objWriter.WriteElementString("signal", _intSignal.ToString()); } if (_intMaxSkillRating > 0) objWriter.WriteElementString("maxskillrating", _intMaxSkillRating.ToString()); // </attributes> objWriter.WriteEndElement(); // <magenabled /> objWriter.WriteElementString("magenabled", _blnMAGEnabled.ToString()); // <initiategrade /> objWriter.WriteElementString("initiategrade", _intInitiateGrade.ToString()); // <resenabled /> objWriter.WriteElementString("resenabled", _blnRESEnabled.ToString()); // <submersiongrade /> objWriter.WriteElementString("submersiongrade", _intSubmersionGrade.ToString()); // <groupmember /> objWriter.WriteElementString("groupmember", _blnGroupMember.ToString()); // <groupname /> objWriter.WriteElementString("groupname", _strGroupName); // <groupnotes /> objWriter.WriteElementString("groupnotes", _strGroupNotes); // External reader friendly stuff. objWriter.WriteElementString("totaless", Essence.ToString()); // Write out the Mystic Adept MAG split info. if (_blnAdeptEnabled && _blnMagicianEnabled) { objWriter.WriteElementString("magsplitadept", _intMAGAdept.ToString()); objWriter.WriteElementString("magsplitmagician", _intMAGMagician.ToString()); } // Write the Magic Tradition. objWriter.WriteElementString("tradition", _strMagicTradition); // Write the Drain Attributes. objWriter.WriteElementString("traditiondrain", _strTraditionDrain); // Write the Tradition Name. objWriter.WriteElementString("traditionname", _strTraditionName); // Write the Tradition Spirits. objWriter.WriteElementString("spiritcombat", _strSpiritCombat); objWriter.WriteElementString("spiritdetection", _strSpiritDetection); objWriter.WriteElementString("spirithealth", _strSpiritHealth); objWriter.WriteElementString("spiritillusion", _strSpiritIllusion); objWriter.WriteElementString("spiritmanipulation", _strSpiritManipulation); // Write the Technomancer Stream. objWriter.WriteElementString("stream", _strTechnomancerStream); // Condition Monitor Progress. // <physicalcmfilled /> objWriter.WriteElementString("physicalcmfilled", _intPhysicalCMFilled.ToString()); // <stuncmfilled /> objWriter.WriteElementString("stuncmfilled", _intStunCMFilled.ToString()); // <skillgroups> objWriter.WriteStartElement("skillgroups"); foreach (SkillGroup objSkillGroup in _lstSkillGroups) { objSkillGroup.Save(objWriter); } // </skillgroups> objWriter.WriteEndElement(); // <skills> objWriter.WriteStartElement("skills"); foreach (Skill objSkill in _lstSkills) { objSkill.Save(objWriter); } // </skills> objWriter.WriteEndElement(); // <contacts> objWriter.WriteStartElement("contacts"); foreach (Contact objContact in _lstContacts) { objContact.Save(objWriter); } // </contacts> objWriter.WriteEndElement(); // <spells> objWriter.WriteStartElement("spells"); foreach (Spell objSpell in _lstSpells) { objSpell.Save(objWriter); } // </spells> objWriter.WriteEndElement(); // <foci> objWriter.WriteStartElement("foci"); foreach (Focus objFocus in _lstFoci) { objFocus.Save(objWriter); } // </foci> objWriter.WriteEndElement(); // <stackedfoci> objWriter.WriteStartElement("stackedfoci"); foreach (StackedFocus objStack in _lstStackedFoci) { objStack.Save(objWriter); } // </stackedfoci> objWriter.WriteEndElement(); // <powers> objWriter.WriteStartElement("powers"); foreach (Power objPower in _lstPowers) { objPower.Save(objWriter); } // </powers> objWriter.WriteEndElement(); // <spirits> objWriter.WriteStartElement("spirits"); foreach (Spirit objSpirit in _lstSpirits) { objSpirit.Save(objWriter); } // </spirits> objWriter.WriteEndElement(); // <complexforms> objWriter.WriteStartElement("complexforms"); foreach (ComplexForm objProgram in _lstComplexForms) { objProgram.Save(objWriter); } // </complexforms> objWriter.WriteEndElement(); // <martialarts> objWriter.WriteStartElement("martialarts"); foreach (MartialArt objMartialArt in _lstMartialArts) { objMartialArt.Save(objWriter); } // </martialarts> objWriter.WriteEndElement(); // <martialartmaneuvers> objWriter.WriteStartElement("martialartmaneuvers"); foreach (MartialArtManeuver objManeuver in _lstMartialArtManeuvers) { objManeuver.Save(objWriter); } // </martialartmaneuvers> objWriter.WriteEndElement(); // <limitmodifiers> objWriter.WriteStartElement("limitmodifiers"); foreach (LimitModifier objLimitModifier in _lstLimitModifiers) { objLimitModifier.Save(objWriter); } // </limitmodifiers> objWriter.WriteEndElement(); // <armors> objWriter.WriteStartElement("armors"); foreach (Armor objArmor in _lstArmor) { objArmor.Save(objWriter); } // </armors> objWriter.WriteEndElement(); // <weapons> objWriter.WriteStartElement("weapons"); foreach (Weapon objWeapon in _lstWeapons) { objWeapon.Save(objWriter); } // </weapons> objWriter.WriteEndElement(); // <cyberwares> objWriter.WriteStartElement("cyberwares"); foreach (Cyberware objCyberware in _lstCyberware) { objCyberware.Save(objWriter); } // </cyberwares> objWriter.WriteEndElement(); // <qualities> objWriter.WriteStartElement("qualities"); foreach (Quality objQuality in _lstQualities) { objQuality.Save(objWriter); } // </qualities> objWriter.WriteEndElement(); // <lifestyles> objWriter.WriteStartElement("lifestyles"); foreach (Lifestyle objLifestyle in _lstLifestyles) { objLifestyle.Save(objWriter); } // </lifestyles> objWriter.WriteEndElement(); // <gears> objWriter.WriteStartElement("gears"); foreach (Gear objGear in _lstGear) { // Use the Gear's SubClass if applicable. if (objGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(this); objCommlink = (Commlink)objGear; objCommlink.Save(objWriter); } else { objGear.Save(objWriter); } } // </gears> objWriter.WriteEndElement(); // <vehicles> objWriter.WriteStartElement("vehicles"); foreach (Vehicle objVehicle in _lstVehicles) { objVehicle.Save(objWriter); } // </vehicles> objWriter.WriteEndElement(); // <metamagics> objWriter.WriteStartElement("metamagics"); foreach (Metamagic objMetamagic in _lstMetamagics) { objMetamagic.Save(objWriter); } // </metamagics> objWriter.WriteEndElement(); // <arts> objWriter.WriteStartElement("arts"); foreach (Art objArt in _lstArts) { objArt.Save(objWriter); } // </arts> objWriter.WriteEndElement(); // <enhancements> objWriter.WriteStartElement("enhancements"); foreach (Enhancement objEnhancement in _lstEnhancements) { objEnhancement.Save(objWriter); } // </enhancements> objWriter.WriteEndElement(); // <critterpowers> objWriter.WriteStartElement("critterpowers"); foreach (CritterPower objPower in _lstCritterPowers) { objPower.Save(objWriter); } // </critterpowers> objWriter.WriteEndElement(); // <initiationgrades> objWriter.WriteStartElement("initiationgrades"); foreach (InitiationGrade objGrade in _lstInitiationGrades) { objGrade.Save(objWriter); } // </initiationgrades> objWriter.WriteEndElement(); // <improvements> objWriter.WriteStartElement("improvements"); foreach (Improvement objImprovement in _lstImprovements) { objImprovement.Save(objWriter); } // </improvements> objWriter.WriteEndElement(); // <expenses> objWriter.WriteStartElement("expenses"); foreach (ExpenseLogEntry objExpenseLogEntry in _lstExpenseLog) { objExpenseLogEntry.Save(objWriter); } // </expenses> objWriter.WriteEndElement(); // <locations> objWriter.WriteStartElement("locations"); foreach (string strLocation in _lstLocations) { objWriter.WriteElementString("location", strLocation); } // </locations> objWriter.WriteEndElement(); // <armorbundles> objWriter.WriteStartElement("armorbundles"); foreach (string strBundle in _lstArmorBundles) { objWriter.WriteElementString("armorbundle", strBundle); } // </armorbundles> objWriter.WriteEndElement(); // <weaponlocations> objWriter.WriteStartElement("weaponlocations"); foreach (string strLocation in _lstWeaponLocations) { objWriter.WriteElementString("weaponlocation", strLocation); } // </weaponlocations> objWriter.WriteEndElement(); // <improvementgroups> objWriter.WriteStartElement("improvementgroups"); foreach (string strGroup in _lstImprovementGroups) { objWriter.WriteElementString("improvementgroup", strGroup); } // </improvementgroups> objWriter.WriteEndElement(); // <calendar> objWriter.WriteStartElement("calendar"); foreach (CalendarWeek objWeek in _lstCalendar) { objWeek.Save(objWriter); } objWriter.WriteEndElement(); // </calendar> // </character> objWriter.WriteEndElement(); objWriter.WriteEndDocument(); objWriter.Close(); objStream.Close(); }
/// <summary> /// Load the Character from an XML file. /// </summary> public bool Load() { XmlDocument objXmlDocument = new XmlDocument(); objXmlDocument.Load(_strFileName); XmlNode objXmlCharacter = objXmlDocument.SelectSingleNode("/character"); XmlNodeList objXmlNodeList; try { _blnIgnoreRules = Convert.ToBoolean(objXmlCharacter["ignorerules"].InnerText); } catch { _blnIgnoreRules = false; } try { _blnCreated = Convert.ToBoolean(objXmlCharacter["created"].InnerText); } catch { } ResetCharacter(); // Get the game edition of the file if possible and make sure it's intended to be used with this version of the application. try { if (objXmlCharacter["gameedition"].InnerText != string.Empty && objXmlCharacter["gameedition"].InnerText != "SR5") { MessageBox.Show(LanguageManager.Instance.GetString("Message_IncorrectGameVersion_SR4"), LanguageManager.Instance.GetString("MessageTitle_IncorrectGameVersion"), MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } catch { } // Get the name of the settings file in use if possible. try { _strSettingsFileName = objXmlCharacter["settings"].InnerText; } catch { } // Load the character's settings file. if (!_objOptions.Load(_strSettingsFileName)) return false; try { _decEssenceAtSpecialStart = Convert.ToDecimal(objXmlCharacter["essenceatspecialstart"].InnerText, GlobalOptions.Instance.CultureInfo); // fix to work around a mistake made when saving decimal values in previous versions. if (_decEssenceAtSpecialStart > EssenceMaximum) _decEssenceAtSpecialStart /= 10; } catch { } try { _strVersionCreated = objXmlCharacter["createdversion"].InnerText; } catch { } // Metatype information. _strMetatype = objXmlCharacter["metatype"].InnerText; try { _strWalk = objXmlCharacter["walk"].InnerText; _strRun = objXmlCharacter["run"].InnerText; _strSprint = objXmlCharacter["sprint"].InnerText; } catch { } _intMetatypeBP = Convert.ToInt32(objXmlCharacter["metatypebp"].InnerText); _strMetavariant = objXmlCharacter["metavariant"].InnerText; try { _strMetatypeCategory = objXmlCharacter["metatypecategory"].InnerText; } catch { } try { _intMutantCritterBaseSkills = Convert.ToInt32(objXmlCharacter["mutantcritterbaseskills"].InnerText); } catch { } // General character information. _strName = objXmlCharacter["name"].InnerText; try { _strMugshot = objXmlCharacter["mugshot"].InnerText; } catch { } try { _strSex = objXmlCharacter["sex"].InnerText; } catch { } try { _strAge = objXmlCharacter["age"].InnerText; } catch { } try { _strEyes = objXmlCharacter["eyes"].InnerText; } catch { } try { _strHeight = objXmlCharacter["height"].InnerText; } catch { } try { _strWeight = objXmlCharacter["weight"].InnerText; } catch { } try { _strSkin = objXmlCharacter["skin"].InnerText; } catch { } try { _strHair = objXmlCharacter["hair"].InnerText; } catch { } try { _strDescription = objXmlCharacter["description"].InnerText; } catch { } try { _strBackground = objXmlCharacter["background"].InnerText; } catch { } try { _strConcept = objXmlCharacter["concept"].InnerText; } catch { } try { _strNotes = objXmlCharacter["notes"].InnerText; } catch { } try { _strAlias = objXmlCharacter["alias"].InnerText; } catch { } try { _strPlayerName = objXmlCharacter["playername"].InnerText; } catch { } try { _strGameNotes = objXmlCharacter["gamenotes"].InnerText; } catch { } try { _strGameplayOption = objXmlCharacter["gameplayoption"].InnerText; } catch { } try { _intMaxNuyen = Convert.ToInt32(objXmlCharacter["maxnuyen"].InnerText); } catch { } try { _intContactMultiplier = Convert.ToInt32(objXmlCharacter["contactmultiplier"].InnerText); } catch { } try { _intMaxKarma = Convert.ToInt32(objXmlCharacter["maxkarma"].InnerText); } catch { } try { _strPriorityMetatype = objXmlCharacter["prioritymetatype"].InnerText; } catch { } try { _strPriorityAttributes = objXmlCharacter["priorityattributes"].InnerText; } catch { } try { _strPrioritySpecial = objXmlCharacter["priorityspecial"].InnerText; } catch { } try { _strPrioritySkills = objXmlCharacter["priorityskills"].InnerText; } catch { } try { _strPriorityResources = objXmlCharacter["priorityresources"].InnerText; } catch { } try { _strSkill1 = objXmlCharacter["priorityskill1"].InnerText; } catch { } try { _strSkill2 = objXmlCharacter["priorityskill2"].InnerText; } catch { } try { _strSkillGroup = objXmlCharacter["priorityskillgroup"].InnerText; } catch { } try { _blnIsCritter = Convert.ToBoolean(objXmlCharacter["iscritter"].InnerText); } catch { } try { _blnPossessed = Convert.ToBoolean(objXmlCharacter["possessed"].InnerText); } catch { } try { _blnOverrideSpecialAttributeESSLoss = Convert.ToBoolean(objXmlCharacter["overridespecialattributeessloss"].InnerText); } catch { } try { _intContactPoints = Convert.ToInt32(objXmlCharacter["contactpoints"].InnerText); } catch { } try { _intContactPointsUsed = Convert.ToInt32(objXmlCharacter["contactpointsused"].InnerText); } catch { } try { _intCFPLimit = Convert.ToInt32(objXmlCharacter["cfplimit"].InnerText); } catch { } try { _intSpellLimit = Convert.ToInt32(objXmlCharacter["spelllimit"].InnerText); } catch { } try { _intKarma = Convert.ToInt32(objXmlCharacter["karma"].InnerText); } catch { } try { _intTotalKarma = Convert.ToInt32(objXmlCharacter["totalkarma"].InnerText); } catch { } try { _intSpecial = Convert.ToInt32(objXmlCharacter["special"].InnerText); } catch { } try { _intTotalSpecial = Convert.ToInt32(objXmlCharacter["totalspecial"].InnerText); } catch { } try { _intAttributes = Convert.ToInt32(objXmlCharacter["attributes"].InnerText); } catch { } try { _intTotalAttributes = Convert.ToInt32(objXmlCharacter["totalattributes"].InnerText); } catch { } try { _intContactPoints = Convert.ToInt32(objXmlCharacter["contactpoints"].InnerText); } catch { } try { _intContactPointsUsed = Convert.ToInt32(objXmlCharacter["contactpointsused"].InnerText); } catch { } try { _intStreetCred = Convert.ToInt32(objXmlCharacter["streetcred"].InnerText); } catch { } try { _intNotoriety = Convert.ToInt32(objXmlCharacter["notoriety"].InnerText); } catch { } try { _intPublicAwareness = Convert.ToInt32(objXmlCharacter["publicawareness"].InnerText); } catch { } try { _intBurntStreetCred = Convert.ToInt32(objXmlCharacter["burntstreetcred"].InnerText); } catch { } try { _intMaxAvail = Convert.ToInt32(objXmlCharacter["maxavail"].InnerText); } catch { } try { _intNuyen = Convert.ToInt32(objXmlCharacter["nuyen"].InnerText); } catch { } try { _intStartingNuyen = Convert.ToInt32(objXmlCharacter["startingnuyen"].InnerText); } catch { } try { _intAdeptWayDiscount = Convert.ToInt32(objXmlCharacter["adeptwaydiscount"].InnerText); } catch { } // Sum to X point value. try { _intSumtoTen = Convert.ToInt32(objXmlCharacter["sumtoten"].InnerText); } catch { } // Build Points/Karma. _intBuildPoints = Convert.ToInt32(objXmlCharacter["bp"].InnerText); try { _intBuildKarma = Convert.ToInt32(objXmlCharacter["buildkarma"].InnerText); if (_intMaxKarma == 0) _intMaxKarma = _intBuildKarma; if (_intBuildKarma == 35 && _strGameplayOption == "") { _strGameplayOption = "Prime Runner"; } if (_intBuildKarma == 35 && _intMaxNuyen == 0) { _intMaxNuyen = 25; } } catch { } //Maximum number of Karma that can be spent/gained on Qualities. try { _intGameplayOptionQualityLimit = Convert.ToInt32(objXmlCharacter["gameplayoptionqualitylimit"].InnerText); } catch { } try { _objBuildMethod = ConvertToCharacterBuildMethod(objXmlCharacter["buildmethod"].InnerText); } catch { } try { _intKnowledgeSkills = Convert.ToInt32(objXmlCharacter["knowskillpts"].InnerText); } catch { } _intKnowledgeSkillPoints = Convert.ToInt32(objXmlCharacter["knowpts"].InnerText); _intSkillPoints = Convert.ToInt32(objXmlCharacter["skillpts"].InnerText); _intSkillPointsMaximum = Convert.ToInt32(objXmlCharacter["skillptsmax"].InnerText); _intSkillGroups = Convert.ToInt32(objXmlCharacter["skillgrps"].InnerText); _intSkillGroupsMaximum = Convert.ToInt32(objXmlCharacter["skillgrpsmax"].InnerText); _decNuyenBP = Convert.ToDecimal(objXmlCharacter["nuyenbp"].InnerText, GlobalOptions.Instance.CultureInfo); _decNuyenMaximumBP = Convert.ToDecimal(objXmlCharacter["nuyenmaxbp"].InnerText, GlobalOptions.Instance.CultureInfo); _blnAdeptEnabled = Convert.ToBoolean(objXmlCharacter["adept"].InnerText); _blnMagicianEnabled = Convert.ToBoolean(objXmlCharacter["magician"].InnerText); _blnTechnomancerEnabled = Convert.ToBoolean(objXmlCharacter["technomancer"].InnerText); try { _blnInitiationEnabled = Convert.ToBoolean(objXmlCharacter["initiationoverride"].InnerText); } catch { } try { _blnCritterEnabled = Convert.ToBoolean(objXmlCharacter["critter"].InnerText); } catch { } try { _blnUneducated = Convert.ToBoolean(objXmlCharacter["uneducated"].InnerText); } catch { } try { _blnUncouth = Convert.ToBoolean(objXmlCharacter["uncouth"].InnerText); } catch { } try { _blnSchoolOfHardKnocks = Convert.ToBoolean(objXmlCharacter["schoolofhardknocks"].InnerText); } catch { } try { _blnFriendsInHighPlaces = Convert.ToBoolean(objXmlCharacter["friendsinhighplaces"].InnerText); } catch { } try { _blnCollegeEducation = Convert.ToBoolean(objXmlCharacter["collegeeducation"].InnerText); } catch { } try { _blnJackOfAllTrades = Convert.ToBoolean(objXmlCharacter["jackofalltrades"].InnerText); } catch { } try { _blnInfirm = Convert.ToBoolean(objXmlCharacter["infirm"].InnerText); } catch { } try { _blnBlackMarket = Convert.ToBoolean(objXmlCharacter["blackmarket"].InnerText); } catch { } try { _blnExCon = Convert.ToBoolean(objXmlCharacter["excon"].InnerText); } catch { } try { _blnTrustFund = Convert.ToBoolean(objXmlCharacter["trustfund"].InnerText); } catch { } try { _blnTechSchool = Convert.ToBoolean(objXmlCharacter["techschool"].InnerText); } catch { } try { _blnRestrictedGear = Convert.ToBoolean(objXmlCharacter["restrictedgear"].InnerText); } catch { } try { _blnOverclocker = Convert.ToBoolean(objXmlCharacter["overclocker"].InnerText); } catch { } try { _blnMadeMan = Convert.ToBoolean(objXmlCharacter["mademan"].InnerText); } catch { } try { _blnLinguist = Convert.ToBoolean(objXmlCharacter["linguist"].InnerText); } catch { } try { _blnLightningReflexes = Convert.ToBoolean(objXmlCharacter["lightningreflexes"].InnerText); } catch { } try { _blnFame = Convert.ToBoolean(objXmlCharacter["fame"].InnerText); } catch { } try { _blnBornRich = Convert.ToBoolean(objXmlCharacter["bornrich"].InnerText); } catch { } try { _blnErased = Convert.ToBoolean(objXmlCharacter["erased"].InnerText); } catch { } _blnMAGEnabled = Convert.ToBoolean(objXmlCharacter["magenabled"].InnerText); try { _intInitiateGrade = Convert.ToInt32(objXmlCharacter["initiategrade"].InnerText); } catch { } _blnRESEnabled = Convert.ToBoolean(objXmlCharacter["resenabled"].InnerText); try { _intSubmersionGrade = Convert.ToInt32(objXmlCharacter["submersiongrade"].InnerText); } catch { } try { _blnGroupMember = Convert.ToBoolean(objXmlCharacter["groupmember"].InnerText); } catch { } try { _strGroupName = objXmlCharacter["groupname"].InnerText; _strGroupNotes = objXmlCharacter["groupnotes"].InnerText; } catch { } // Improvements. XmlNodeList objXmlImprovementList = objXmlDocument.SelectNodes("/character/improvements/improvement"); foreach (XmlNode objXmlImprovement in objXmlImprovementList) { Improvement objImprovement = new Improvement(); objImprovement.Load(objXmlImprovement); _lstImprovements.Add(objImprovement); } // Qualities objXmlNodeList = objXmlDocument.SelectNodes("/character/qualities/quality"); bool blnHasOldQualities = false; foreach (XmlNode objXmlQuality in objXmlNodeList) { if (objXmlQuality["name"] != null) { Quality objQuality = new Quality(this); objQuality.Load(objXmlQuality); _lstQualities.Add(objQuality); } else { // If the Quality does not have a name tag, it is in the old format. Set the flag to show that old Qualities are in use. blnHasOldQualities = true; } } // If old Qualities are in use, they need to be converted before we can continue. if (blnHasOldQualities) ConvertOldQualities(objXmlNodeList); // Attributes. objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"BOD\"]"); _attBOD.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"AGI\"]"); _attAGI.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"REA\"]"); _attREA.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"STR\"]"); _attSTR.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"CHA\"]"); _attCHA.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"INT\"]"); _attINT.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"LOG\"]"); _attLOG.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"WIL\"]"); _attWIL.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"INI\"]"); _attINI.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"EDG\"]"); _attEDG.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"MAG\"]"); _attMAG.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"RES\"]"); _attRES.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"ESS\"]"); _attESS.Load(objXmlCharacter); // A.I. Attributes. try { _intSignal = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/attributes/signal").InnerText); _intResponse = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/attributes/response").InnerText); } catch { } // Force. try { _intMaxSkillRating = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/attributes/maxskillrating").InnerText); } catch { } // Attempt to load the split MAG Attribute information for Mystic Adepts. if (_blnAdeptEnabled && _blnMagicianEnabled) { try { _intMAGAdept = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/magsplitadept").InnerText); _intMAGMagician = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/magsplitmagician").InnerText); } catch { } } // Attempt to load the Magic Tradition. try { _strMagicTradition = objXmlDocument.SelectSingleNode("/character/tradition").InnerText; } catch { } // Attempt to load the Magic Tradition Drain Attributes. try { _strTraditionDrain = objXmlDocument.SelectSingleNode("/character/traditiondrain").InnerText; } catch { } // Attempt to load the Magic Tradition Name. try { _strTraditionName = objXmlDocument.SelectSingleNode("/character/traditionname").InnerText; } catch { } // Attempt to load the Spirit Combat Name. try { _strSpiritCombat = objXmlDocument.SelectSingleNode("/character/spiritcombat").InnerText; } catch { } // Attempt to load the Spirit Detection Name. try { _strSpiritDetection = objXmlDocument.SelectSingleNode("/character/spiritdetection").InnerText; } catch { } // Attempt to load the Spirit Health Name. try { _strSpiritHealth = objXmlDocument.SelectSingleNode("/character/spirithealth").InnerText; } catch { } // Attempt to load the Spirit Illusion Name. try { _strSpiritIllusion = objXmlDocument.SelectSingleNode("/character/spiritillusion").InnerText; } catch { } // Attempt to load the Spirit Manipulation Name. try { _strSpiritManipulation = objXmlDocument.SelectSingleNode("/character/spiritmanipulation").InnerText; } catch { } // Attempt to load the Technomancer Stream. try { _strTechnomancerStream = objXmlDocument.SelectSingleNode("/character/stream").InnerText; } catch { } // Attempt to load Condition Monitor Progress. try { _intPhysicalCMFilled = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/physicalcmfilled").InnerText); _intStunCMFilled = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/stuncmfilled").InnerText); } catch { } // Skills. foreach (Skill objSkill in _lstSkills) { XmlNode objXmlSkill = objXmlDocument.SelectSingleNode("/character/skills/skill[name = \"" + objSkill.Name + "\"]"); if (objXmlSkill != null) { objSkill.Load(objXmlSkill); } } // Exotic Skills. objXmlNodeList = objXmlDocument.SelectNodes("/character/skills/skill[exotic = \"True\"]"); foreach (XmlNode objXmlSkill in objXmlNodeList) { Skill objSkill = new Skill(this); objSkill.Load(objXmlSkill); _lstSkills.Add(objSkill); } // SkillGroups. foreach (SkillGroup objGroup in _lstSkillGroups) { XmlNode objXmlSkill = objXmlDocument.SelectSingleNode("/character/skillgroups/skillgroup[name = \"" + objGroup.Name + "\"]"); if (objXmlSkill != null) { objGroup.Load(objXmlSkill); // If the character is set to ignore rules or is in Career Mode, Skill Groups should have a maximum Rating of 6 unless they have been given a higher maximum Rating already. if ((_blnIgnoreRules || _blnCreated) && objGroup.RatingMaximum < 12) objGroup.RatingMaximum = 12; } } // Apply the broken skill group fix foreach (Skill objSkill in _lstSkills) { foreach (SkillGroup objGroup in _lstSkillGroups) { if (objGroup.Broken && objGroup.Name == objSkill.SkillGroup) { objSkill.FreeLevels = objGroup.Rating; objSkill.Base = objGroup.Rating; objSkill.Karma = objSkill.Rating - objSkill.Base; } } } foreach (SkillGroup objGroup in _lstSkillGroups) { if (objGroup.Base == 0 && objGroup.Karma == 0 && objGroup.Rating > 0) objGroup.Base = objGroup.Rating; } // Knowledge Skills. List<ListItem> lstKnowledgeSkillOrder = new List<ListItem>(); objXmlNodeList = objXmlDocument.SelectNodes("/character/skills/skill[knowledge = \"True\"]"); // Sort the Knowledge Skills in alphabetical order. foreach (XmlNode objXmlSkill in objXmlNodeList) { ListItem objGroup = new ListItem(); objGroup.Value = objXmlSkill["name"].InnerText; objGroup.Name = objXmlSkill["name"].InnerText; lstKnowledgeSkillOrder.Add(objGroup); } SortListItem objSort = new SortListItem(); lstKnowledgeSkillOrder.Sort(objSort.Compare); foreach (ListItem objItem in lstKnowledgeSkillOrder) { Skill objSkill = new Skill(this); XmlNode objNode = objXmlDocument.SelectSingleNode("/character/skills/skill[knowledge = \"True\" and name = " + CleanXPath(objItem.Value) + "]"); objSkill.Load(objNode); _lstSkills.Add(objSkill); } // Contacts. objXmlNodeList = objXmlDocument.SelectNodes("/character/contacts/contact"); foreach (XmlNode objXmlContact in objXmlNodeList) { Contact objContact = new Contact(this); objContact.Load(objXmlContact); _lstContacts.Add(objContact); } // Armor. objXmlNodeList = objXmlDocument.SelectNodes("/character/armors/armor"); foreach (XmlNode objXmlArmor in objXmlNodeList) { Armor objArmor = new Armor(this); objArmor.Load(objXmlArmor); _lstArmor.Add(objArmor); } // Weapons. objXmlNodeList = objXmlDocument.SelectNodes("/character/weapons/weapon"); foreach (XmlNode objXmlWeapon in objXmlNodeList) { Weapon objWeapon = new Weapon(this); objWeapon.Load(objXmlWeapon); _lstWeapons.Add(objWeapon); } // Cyberware/Bioware. objXmlNodeList = objXmlDocument.SelectNodes("/character/cyberwares/cyberware"); foreach (XmlNode objXmlCyberware in objXmlNodeList) { Cyberware objCyberware = new Cyberware(this); objCyberware.Load(objXmlCyberware); _lstCyberware.Add(objCyberware); } // Spells. objXmlNodeList = objXmlDocument.SelectNodes("/character/spells/spell"); foreach (XmlNode objXmlSpell in objXmlNodeList) { Spell objSpell = new Spell(this); objSpell.Load(objXmlSpell); _lstSpells.Add(objSpell); } // Foci. objXmlNodeList = objXmlDocument.SelectNodes("/character/foci/focus"); foreach (XmlNode objXmlFocus in objXmlNodeList) { Focus objFocus = new Focus(); objFocus.Load(objXmlFocus); _lstFoci.Add(objFocus); } // Stacked Foci. objXmlNodeList = objXmlDocument.SelectNodes("/character/stackedfoci/stackedfocus"); foreach (XmlNode objXmlStack in objXmlNodeList) { StackedFocus objStack = new StackedFocus(this); objStack.Load(objXmlStack); _lstStackedFoci.Add(objStack); } // Powers. List<ListItem> lstPowerOrder = new List<ListItem>(); objXmlNodeList = objXmlDocument.SelectNodes("/character/powers/power"); // Sort the Powers in alphabetical order. foreach (XmlNode objXmlPower in objXmlNodeList) { ListItem objGroup = new ListItem(); objGroup.Value = objXmlPower["extra"].InnerText; objGroup.Name = objXmlPower["name"].InnerText; lstPowerOrder.Add(objGroup); } objSort = new SortListItem(); lstPowerOrder.Sort(objSort.Compare); foreach (ListItem objItem in lstPowerOrder) { Power objPower = new Power(this); XmlNode objNode = objXmlDocument.SelectSingleNode("/character/powers/power[name = " + CleanXPath(objItem.Name) + " and extra = " + CleanXPath(objItem.Value) + "]"); objPower.Load(objNode); _lstPowers.Add(objPower); } // Spirits/Sprites. objXmlNodeList = objXmlDocument.SelectNodes("/character/spirits/spirit"); foreach (XmlNode objXmlSpirit in objXmlNodeList) { Spirit objSpirit = new Spirit(this); objSpirit.Load(objXmlSpirit); _lstSpirits.Add(objSpirit); } // Compex Forms/Technomancer Programs. objXmlNodeList = objXmlDocument.SelectNodes("/character/complexforms/complexform"); foreach (XmlNode objXmlProgram in objXmlNodeList) { ComplexForm objProgram = new ComplexForm(this); objProgram.Load(objXmlProgram); _lstComplexForms.Add(objProgram); } // Martial Arts. objXmlNodeList = objXmlDocument.SelectNodes("/character/martialarts/martialart"); foreach (XmlNode objXmlArt in objXmlNodeList) { MartialArt objMartialArt = new MartialArt(this); objMartialArt.Load(objXmlArt); _lstMartialArts.Add(objMartialArt); } // Martial Art Maneuvers. objXmlNodeList = objXmlDocument.SelectNodes("/character/martialartmaneuvers/martialartmaneuver"); foreach (XmlNode objXmlManeuver in objXmlNodeList) { MartialArtManeuver objManeuver = new MartialArtManeuver(this); objManeuver.Load(objXmlManeuver); _lstMartialArtManeuvers.Add(objManeuver); } // Limit Modifiers. objXmlNodeList = objXmlDocument.SelectNodes("/character/limitmodifiers/limitmodifier"); foreach (XmlNode objXmlLimit in objXmlNodeList) { LimitModifier obLimitModifier = new LimitModifier(this); obLimitModifier.Load(objXmlLimit); _lstLimitModifiers.Add(obLimitModifier); } // Lifestyles. objXmlNodeList = objXmlDocument.SelectNodes("/character/lifestyles/lifestyle"); foreach (XmlNode objXmlLifestyle in objXmlNodeList) { Lifestyle objLifestyle = new Lifestyle(this); objLifestyle.Load(objXmlLifestyle); _lstLifestyles.Add(objLifestyle); } // <gears> objXmlNodeList = objXmlDocument.SelectNodes("/character/gears/gear"); foreach (XmlNode objXmlGear in objXmlNodeList) { switch (objXmlGear["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(this); objCommlink.Load(objXmlGear); _lstGear.Add(objCommlink); break; default: Gear objGear = new Gear(this); objGear.Load(objXmlGear); _lstGear.Add(objGear); break; } } // Vehicles. objXmlNodeList = objXmlDocument.SelectNodes("/character/vehicles/vehicle"); foreach (XmlNode objXmlVehicle in objXmlNodeList) { Vehicle objVehicle = new Vehicle(this); objVehicle.Load(objXmlVehicle); _lstVehicles.Add(objVehicle); } // Metamagics/Echoes. objXmlNodeList = objXmlDocument.SelectNodes("/character/metamagics/metamagic"); foreach (XmlNode objXmlMetamagic in objXmlNodeList) { Metamagic objMetamagic = new Metamagic(this); objMetamagic.Load(objXmlMetamagic); _lstMetamagics.Add(objMetamagic); } // Arts objXmlNodeList = objXmlDocument.SelectNodes("/character/arts/art"); foreach (XmlNode objXmlArt in objXmlNodeList) { Art objArt = new Art(this); objArt.Load(objXmlArt); _lstArts.Add(objArt); } // Enhancements objXmlNodeList = objXmlDocument.SelectNodes("/character/enhancements/enhancement"); foreach (XmlNode objXmlEnhancement in objXmlNodeList) { Enhancement objEnhancement = new Enhancement(this); objEnhancement.Load(objXmlEnhancement); _lstEnhancements.Add(objEnhancement); } // Critter Powers. objXmlNodeList = objXmlDocument.SelectNodes("/character/critterpowers/critterpower"); foreach (XmlNode objXmlPower in objXmlNodeList) { CritterPower objPower = new CritterPower(this); objPower.Load(objXmlPower); _lstCritterPowers.Add(objPower); } // Initiation Grades. objXmlNodeList = objXmlDocument.SelectNodes("/character/initiationgrades/initiationgrade"); foreach (XmlNode objXmlGrade in objXmlNodeList) { InitiationGrade objGrade = new InitiationGrade(this); objGrade.Load(objXmlGrade); _lstInitiationGrades.Add(objGrade); } // Expense Log Entries. XmlNodeList objXmlExpenseList = objXmlDocument.SelectNodes("/character/expenses/expense"); foreach (XmlNode objXmlExpense in objXmlExpenseList) { ExpenseLogEntry objExpenseLogEntry = new ExpenseLogEntry(); objExpenseLogEntry.Load(objXmlExpense); _lstExpenseLog.Add(objExpenseLogEntry); } // Locations. XmlNodeList objXmlLocationList = objXmlDocument.SelectNodes("/character/locations/location"); foreach (XmlNode objXmlLocation in objXmlLocationList) { _lstLocations.Add(objXmlLocation.InnerText); } // Armor Bundles. XmlNodeList objXmlBundleList = objXmlDocument.SelectNodes("/character/armorbundles/armorbundle"); foreach (XmlNode objXmlBundle in objXmlBundleList) { _lstArmorBundles.Add(objXmlBundle.InnerText); } // Weapon Locations. XmlNodeList objXmlWeaponLocationList = objXmlDocument.SelectNodes("/character/weaponlocations/weaponlocation"); foreach (XmlNode objXmlLocation in objXmlWeaponLocationList) { _lstWeaponLocations.Add(objXmlLocation.InnerText); } // Improvement Groups. XmlNodeList objXmlGroupList = objXmlDocument.SelectNodes("/character/improvementgroups/improvementgroup"); foreach (XmlNode objXmlGroup in objXmlGroupList) { _lstImprovementGroups.Add(objXmlGroup.InnerText); } // Calendar. XmlNodeList objXmlWeekList = objXmlDocument.SelectNodes("/character/calendar/week"); foreach (XmlNode objXmlWeek in objXmlWeekList) { CalendarWeek objWeek = new CalendarWeek(); objWeek.Load(objXmlWeek); _lstCalendar.Add(objWeek); } // Look for the unarmed attack bool blnFoundUnarmed = false; foreach (Weapon objWeapon in _lstWeapons) { if (objWeapon.Name == "Unarmed Attack") blnFoundUnarmed = true; } if (!blnFoundUnarmed) { // Add the Unarmed Attack Weapon to the character. try { XmlDocument objXmlWeaponDoc = XmlManager.Instance.Load("weapons.xml"); XmlNode objXmlWeapon = objXmlWeaponDoc.SelectSingleNode("/chummer/weapons/weapon[name = \"Unarmed Attack\"]"); TreeNode objGearWeaponNode = new TreeNode(); Weapon objWeapon = new Weapon(this); objWeapon.Create(objXmlWeapon, this, objGearWeaponNode, null, null, null); objGearWeaponNode.ForeColor = SystemColors.GrayText; _lstWeapons.Add(objWeapon); } catch { } } // converting from old dwarven resistance to new dwarven resistance if (this.Metatype.ToLower().Equals("dwarf") && this.Qualities.Where(x => x.Name.Equals("Dwarf Resistance")).FirstOrDefault() == null && this.Qualities.Where(x => x.Name.Equals("Resistance to Pathogens and Toxins")).FirstOrDefault() != null) { this.Qualities.Remove(this.Qualities.Where(x => x.Name.Equals("Resistance to Pathogens and Toxins")).First()); XmlNode objXmlDwarfQuality = XmlManager.Instance.Load("qualities.xml").SelectSingleNode("/chummer/qualities/quality[name = \"Dwarf Resistance\"]"); TreeNode objNode = new TreeNode(); List<Weapon> objWeapons = new List<Weapon>(); List<TreeNode> objWeaponNodes = new List<TreeNode>(); Quality objQuality = new Quality(this); objQuality.Create(objXmlDwarfQuality, this, QualitySource.Metatype, objNode, objWeapons, objWeaponNodes); this._lstQualities.Add(objQuality); blnHasOldQualities = true; } // load issue where the contact multiplier was set to 0 if (_intContactMultiplier == 0 && _strGameplayOption != string.Empty) { XmlDocument objXmlDocumentPriority = XmlManager.Instance.Load("gameplayoptions.xml"); XmlNode objXmlGameplayOption = objXmlDocumentPriority.SelectSingleNode("/chummer/gameplayoptions/gameplayoption[name = \"" + _strGameplayOption + "\"]"); string strKarma = objXmlGameplayOption["karma"].InnerText; string strNuyen = objXmlGameplayOption["maxnuyen"].InnerText; string strContactMultiplier = "0"; if (!_objOptions.FreeContactsMultiplierEnabled) { strContactMultiplier = objXmlGameplayOption["contactmultiplier"].InnerText; } else { strContactMultiplier = _objOptions.FreeContactsMultiplier.ToString(); } _intMaxKarma = Convert.ToInt32(strKarma); _intMaxNuyen = Convert.ToInt32(strNuyen); _intContactMultiplier = Convert.ToInt32(strContactMultiplier); _intContactPoints = (CHA.Base + CHA.Karma) * _intContactMultiplier; } // If the character had old Qualities that were converted, immediately save the file so they are in the new format. if (blnHasOldQualities) Save(); return true; }
/// <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; }
/// <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; }
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> /// Save the Character to an XML file. /// </summary> public void Save() { FileStream objStream = new FileStream(_strFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); XmlTextWriter objWriter = new XmlTextWriter(objStream, Encoding.Unicode); objWriter.Formatting = Formatting.Indented; objWriter.Indentation = 1; objWriter.IndentChar = '\t'; objWriter.WriteStartDocument(); // <character> objWriter.WriteStartElement("character"); // <appversion /> objWriter.WriteElementString("appversion", Application.ProductVersion.ToString().Replace("0.0.0.", string.Empty)); // <gameedition /> objWriter.WriteElementString("gameedition", "SR4"); // <settings /> objWriter.WriteElementString("settings", _strSettingsFileName); // <metatype /> objWriter.WriteElementString("metatype", _strMetatype); // <metatypebp /> objWriter.WriteElementString("metatypebp", _intMetatypeBP.ToString()); // <metavariant /> objWriter.WriteElementString("metavariant", _strMetavariant); // <metatypecategory /> objWriter.WriteElementString("metatypecategory", _strMetatypeCategory); // <movement /> objWriter.WriteElementString("movement", _strMovement); // <mutantcritterbaseskills /> objWriter.WriteElementString("mutantcritterbaseskills", _intMutantCritterBaseSkills.ToString()); // <essenceatspecialstart /> objWriter.WriteElementString("essenceatspecialstart", _decEssenceAtSpecialStart.ToString(GlobalOptions.Instance.CultureInfo)); // <name /> objWriter.WriteElementString("name", _strName); // <mugshot /> objWriter.WriteElementString("mugshot", _strMugshot); // <sex /> objWriter.WriteElementString("sex", _strSex); // <age /> objWriter.WriteElementString("age", _strAge); // <eyes /> objWriter.WriteElementString("eyes", _strEyes); // <height /> objWriter.WriteElementString("height", _strHeight); // <weight /> objWriter.WriteElementString("weight", _strWeight); // <skin /> objWriter.WriteElementString("skin", _strSkin); // <hair /> objWriter.WriteElementString("hair", _strHair); // <description /> objWriter.WriteElementString("description", _strDescription); // <background /> objWriter.WriteElementString("background", _strBackground); // <concept /> objWriter.WriteElementString("concept", _strConcept); // <notes /> objWriter.WriteElementString("notes", _strNotes); // <alias /> objWriter.WriteElementString("alias", _strAlias); // <playername /> objWriter.WriteElementString("playername", _strPlayerName); // <gamenotes /> objWriter.WriteElementString("gamenotes", _strGameNotes); // <ignorerules /> if (_blnIgnoreRules) objWriter.WriteElementString("ignorerules", _blnIgnoreRules.ToString()); // <iscritter /> if (_blnIsCritter) objWriter.WriteElementString("iscritter", _blnIsCritter.ToString()); if (_blnPossessed) objWriter.WriteElementString("possessed", _blnPossessed.ToString()); if (_blnOverrideSpecialAttributeESSLoss) objWriter.WriteElementString("overridespecialattributeessloss", _blnOverrideSpecialAttributeESSLoss.ToString()); // <karma /> objWriter.WriteElementString("karma", _intKarma.ToString()); // <totalkarma /> objWriter.WriteElementString("totalkarma", _intTotalKarma.ToString()); // <streetcred /> objWriter.WriteElementString("streetcred", _intStreetCred.ToString()); // <notoriety /> objWriter.WriteElementString("notoriety", _intNotoriety.ToString()); // <publicaware /> objWriter.WriteElementString("publicawareness", _intPublicAwareness.ToString()); // <burntstreetcred /> objWriter.WriteElementString("burntstreetcred", _intBurntStreetCred.ToString()); // <created /> objWriter.WriteElementString("created", _blnCreated.ToString()); // <maxavail /> objWriter.WriteElementString("maxavail", _intMaxAvail.ToString()); // <nuyen /> objWriter.WriteElementString("nuyen", _intNuyen.ToString()); // <buildpoints /> objWriter.WriteElementString("bp", _intBuildPoints.ToString()); // <buildkarma /> objWriter.WriteElementString("buildkarma", _intBuildKarma.ToString()); // <buildmethod /> objWriter.WriteElementString("buildmethod", _objBuildMethod.ToString()); // <knowpts /> objWriter.WriteElementString("knowpts", _intKnowledgeSkillPoints.ToString()); // <nuyenbp /> objWriter.WriteElementString("nuyenbp", _decNuyenBP.ToString()); // <nuyenmaxbp /> objWriter.WriteElementString("nuyenmaxbp", _decNuyenMaximumBP.ToString()); // <adept /> objWriter.WriteElementString("adept", _blnAdeptEnabled.ToString()); // <magician /> objWriter.WriteElementString("magician", _blnMagicianEnabled.ToString()); // <technomancer /> objWriter.WriteElementString("technomancer", _blnTechnomancerEnabled.ToString()); // <initiationoverride /> objWriter.WriteElementString("initiationoverride", _blnInitiationEnabled.ToString()); // <critter /> objWriter.WriteElementString("critter", _blnCritterEnabled.ToString()); // <uneducated /> objWriter.WriteElementString("uneducated", _blnUneducated.ToString()); // <uncouth /> objWriter.WriteElementString("uncouth", _blnUncouth.ToString()); // <infirm /> objWriter.WriteElementString("infirm", _blnInfirm.ToString()); // <blackmarket /> objWriter.WriteElementString("blackmarket", _blnBlackMarket.ToString()); // <attributes> objWriter.WriteStartElement("attributes"); _attBOD.Save(objWriter); _attAGI.Save(objWriter); _attREA.Save(objWriter); _attSTR.Save(objWriter); _attCHA.Save(objWriter); _attINT.Save(objWriter); _attLOG.Save(objWriter); _attWIL.Save(objWriter); _attINI.Save(objWriter); _attEDG.Save(objWriter); _attMAG.Save(objWriter); _attRES.Save(objWriter); _attESS.Save(objWriter); // Include any special A.I. Attributes if applicable. if (_strMetatype.EndsWith("A.I.") || _strMetatypeCategory == "Technocritters" || _strMetatypeCategory == "Protosapients") { objWriter.WriteElementString("response", _intResponse.ToString()); objWriter.WriteElementString("signal", _intSignal.ToString()); } if (_intMaxSkillRating > 0) objWriter.WriteElementString("maxskillrating", _intMaxSkillRating.ToString()); // </attributes> objWriter.WriteEndElement(); // <magenabled /> objWriter.WriteElementString("magenabled", _blnMAGEnabled.ToString()); // <initiategrade /> objWriter.WriteElementString("initiategrade", _intInitiateGrade.ToString()); // <resenabled /> objWriter.WriteElementString("resenabled", _blnRESEnabled.ToString()); // <submersiongrade /> objWriter.WriteElementString("submersiongrade", _intSubmersionGrade.ToString()); // <groupmember /> objWriter.WriteElementString("groupmember", _blnGroupMember.ToString()); // <groupname /> objWriter.WriteElementString("groupname", _strGroupName); // <groupnotes /> objWriter.WriteElementString("groupnotes", _strGroupNotes); // External reader friendly stuff. objWriter.WriteElementString("totaless", Essence.ToString()); // Write out the Mystic Adept MAG split info. if (_blnAdeptEnabled && _blnMagicianEnabled) { objWriter.WriteElementString("magsplitadept", _intMAGAdept.ToString()); objWriter.WriteElementString("magsplitmagician", _intMAGMagician.ToString()); } // Write the Magic Tradition. objWriter.WriteElementString("tradition", _strMagicTradition); // Write the Technomancer Stream. objWriter.WriteElementString("stream", _strTechnomancerStream); // Condition Monitor Progress. // <physicalcmfilled /> objWriter.WriteElementString("physicalcmfilled", _intPhysicalCMFilled.ToString()); // <stuncmfilled /> objWriter.WriteElementString("stuncmfilled", _intStunCMFilled.ToString()); // <skillgroups> objWriter.WriteStartElement("skillgroups"); foreach (SkillGroup objSkillGroup in _lstSkillGroups) { objSkillGroup.Save(objWriter); } // </skillgroups> objWriter.WriteEndElement(); // <skills> objWriter.WriteStartElement("skills"); foreach (Skill objSkill in _lstSkills) { objSkill.Save(objWriter); } // </skills> objWriter.WriteEndElement(); // <contacts> objWriter.WriteStartElement("contacts"); foreach (Contact objContact in _lstContacts) { objContact.Save(objWriter); } // </contacts> objWriter.WriteEndElement(); // <spells> objWriter.WriteStartElement("spells"); foreach (Spell objSpell in _lstSpells) { objSpell.Save(objWriter); } // </spells> objWriter.WriteEndElement(); // <foci> objWriter.WriteStartElement("foci"); foreach (Focus objFocus in _lstFoci) { objFocus.Save(objWriter); } // </foci> objWriter.WriteEndElement(); // <stackedfoci> objWriter.WriteStartElement("stackedfoci"); foreach (StackedFocus objStack in _lstStackedFoci) { objStack.Save(objWriter); } // </stackedfoci> objWriter.WriteEndElement(); // <powers> objWriter.WriteStartElement("powers"); foreach (Power objPower in _lstPowers) { objPower.Save(objWriter); } // </powers> objWriter.WriteEndElement(); // <spirits> objWriter.WriteStartElement("spirits"); foreach (Spirit objSpirit in _lstSpirits) { objSpirit.Save(objWriter); } // </spirits> objWriter.WriteEndElement(); // <techprograms> objWriter.WriteStartElement("techprograms"); foreach (TechProgram objProgram in _lstTechPrograms) { objProgram.Save(objWriter); } // </techprograms> objWriter.WriteEndElement(); // <martialarts> objWriter.WriteStartElement("martialarts"); foreach (MartialArt objMartialArt in _lstMartialArts) { objMartialArt.Save(objWriter); } // </martialarts> objWriter.WriteEndElement(); // <martialartmaneuvers> objWriter.WriteStartElement("martialartmaneuvers"); foreach (MartialArtManeuver objManeuver in _lstMartialArtManeuvers) { objManeuver.Save(objWriter); } // </martialartmaneuvers> objWriter.WriteEndElement(); // <armors> objWriter.WriteStartElement("armors"); foreach (Armor objArmor in _lstArmor) { objArmor.Save(objWriter); } // </armors> objWriter.WriteEndElement(); // <weapons> objWriter.WriteStartElement("weapons"); foreach (Weapon objWeapon in _lstWeapons) { objWeapon.Save(objWriter); } // </weapons> objWriter.WriteEndElement(); // <cyberwares> objWriter.WriteStartElement("cyberwares"); foreach (Cyberware objCyberware in _lstCyberware) { objCyberware.Save(objWriter); } // </cyberwares> objWriter.WriteEndElement(); // <qualities> objWriter.WriteStartElement("qualities"); foreach (Quality objQuality in _lstQualities) { objQuality.Save(objWriter); } // </qualities> objWriter.WriteEndElement(); // <lifestyles> objWriter.WriteStartElement("lifestyles"); foreach (Lifestyle objLifestyle in _lstLifestyles) { objLifestyle.Save(objWriter); } // </lifestyles> objWriter.WriteEndElement(); // <gears> objWriter.WriteStartElement("gears"); foreach (Gear objGear in _lstGear) { // Use the Gear's SubClass if applicable. if (objGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(this); objCommlink = (Commlink)objGear; objCommlink.Save(objWriter); } else if (objGear.GetType() == typeof(OperatingSystem)) { OperatingSystem objOperatinSystem = new OperatingSystem(this); objOperatinSystem = (OperatingSystem)objGear; objOperatinSystem.Save(objWriter); } else { objGear.Save(objWriter); } } // </gears> objWriter.WriteEndElement(); // <vehicles> objWriter.WriteStartElement("vehicles"); foreach (Vehicle objVehicle in _lstVehicles) { objVehicle.Save(objWriter); } // </vehicles> objWriter.WriteEndElement(); // <metamagics> objWriter.WriteStartElement("metamagics"); foreach (Metamagic objMetamagic in _lstMetamagics) { objMetamagic.Save(objWriter); } // </metamagics> objWriter.WriteEndElement(); // <critterpowers> objWriter.WriteStartElement("critterpowers"); foreach (CritterPower objPower in _lstCritterPowers) { objPower.Save(objWriter); } // </critterpowers> objWriter.WriteEndElement(); // <initiationgrades> objWriter.WriteStartElement("initiationgrades"); foreach (InitiationGrade objGrade in _lstInitiationGrades) { objGrade.Save(objWriter); } // </initiationgrades> objWriter.WriteEndElement(); // <improvements> objWriter.WriteStartElement("improvements"); foreach (Improvement objImprovement in _lstImprovements) { objImprovement.Save(objWriter); } // </improvements> objWriter.WriteEndElement(); // <expenses> objWriter.WriteStartElement("expenses"); foreach (ExpenseLogEntry objExpenseLogEntry in _lstExpenseLog) { objExpenseLogEntry.Save(objWriter); } // </expenses> objWriter.WriteEndElement(); // <locations> objWriter.WriteStartElement("locations"); foreach (string strLocation in _lstLocations) { objWriter.WriteElementString("location", strLocation); } // </locations> objWriter.WriteEndElement(); // <armorbundles> objWriter.WriteStartElement("armorbundles"); foreach (string strBundle in _lstArmorBundles) { objWriter.WriteElementString("armorbundle", strBundle); } // </armorbundles> objWriter.WriteEndElement(); // <weaponlocations> objWriter.WriteStartElement("weaponlocations"); foreach (string strLocation in _lstWeaponLocations) { objWriter.WriteElementString("weaponlocation", strLocation); } // </weaponlocations> objWriter.WriteEndElement(); // <improvementgroups> objWriter.WriteStartElement("improvementgroups"); foreach (string strGroup in _lstImprovementGroups) { objWriter.WriteElementString("improvementgroup", strGroup); } // </improvementgroups> objWriter.WriteEndElement(); // <calendar> objWriter.WriteStartElement("calendar"); foreach (CalendarWeek objWeek in _lstCalendar) { objWeek.Save(objWriter); } objWriter.WriteEndElement(); // </calendar> // </character> objWriter.WriteEndElement(); objWriter.WriteEndDocument(); objWriter.Close(); objStream.Close(); }
/// <summary> /// Print this character information to a MemoryStream. This creates only the character object itself, not any of the opening or closing XmlDocument items. /// This can be used to write multiple characters to a single XmlDocument. /// </summary> /// <param name="objStream">MemoryStream to use.</param> /// <param name="objWriter">XmlTextWriter to write to.</param> public void PrintToStream(MemoryStream objStream, XmlTextWriter objWriter) { XmlDocument objXmlDocument = new XmlDocument(); XmlDocument objMetatypeDoc = new XmlDocument(); XmlNode objMetatypeNode; string strMetatype = ""; string strMetavariant = ""; // Get the name of the Metatype and Metavariant. objMetatypeDoc = XmlManager.Instance.Load("metatypes.xml"); { objMetatypeNode = objMetatypeDoc.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _strMetatype + "\"]"); if (objMetatypeNode == null) objMetatypeDoc = XmlManager.Instance.Load("critters.xml"); objMetatypeNode = objMetatypeDoc.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _strMetatype + "\"]"); if (objMetatypeNode["translate"] != null) strMetatype = objMetatypeNode["translate"].InnerText; else strMetatype = _strMetatype; if (_strMetavariant != "") { objMetatypeNode = objMetatypeNode.SelectSingleNode("metavariants/metavariant[name = \"" + _strMetavariant + "\"]"); if (objMetatypeNode["translate"] != null) strMetavariant = objMetatypeNode["translate"].InnerText; else strMetavariant = _strMetavariant; } } Guid guiImage = new Guid(); guiImage = Guid.NewGuid(); // This line left in for debugging. Write the output to a fixed file name. //FileStream objStream = new FileStream("D:\\temp\\print.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);//(_strFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); // <character> objWriter.WriteStartElement("character"); // <metatype /> objWriter.WriteElementString("metatype", strMetatype); // <metatype_english /> objWriter.WriteElementString("metatype_english", _strMetatype); // <metavariant /> objWriter.WriteElementString("metavariant", strMetavariant); // <metavariant_english /> objWriter.WriteElementString("metavariant_english", _strMetavariant); // <movement /> objWriter.WriteElementString("movement", FullMovement()); // <movementwalk /> objWriter.WriteElementString("movementwalk", Movement); // <movementswim /> objWriter.WriteElementString("movementswim", Swim); // <movementfly /> objWriter.WriteElementString("movementfly", Fly); // If the character does not have a name, call them Unnamed Character. This prevents a transformed document from having a self-terminated title tag which causes browser to not rendering anything. // <name /> if (_strName != "") objWriter.WriteElementString("name", _strName); else objWriter.WriteElementString("name", LanguageManager.Instance.GetString("String_UnnamedCharacter")); // Since IE is retarded and can't handle base64 images before IE9, we need to dump the image to a temporary directory and re-write the information. // If you give it an extension of jpg, gif, or png, it expects the file to be in that format and won't render the image unless it was originally that type. // But if you give it the extension img, it will render whatever you give it (which doesn't make any damn sense, but that's IE for you). string strMugshotPath = ""; if (_strMugshot != "") { if (!Directory.Exists(Application.StartupPath + Path.DirectorySeparatorChar + "mugshots")) Directory.CreateDirectory(Application.StartupPath + Path.DirectorySeparatorChar + "mugshots"); byte[] bytImage = Convert.FromBase64String(_strMugshot); MemoryStream objImageStream = new MemoryStream(bytImage, 0, bytImage.Length); objImageStream.Write(bytImage, 0, bytImage.Length); Image imgMugshot = Image.FromStream(objImageStream, true); imgMugshot.Save(Application.StartupPath + Path.DirectorySeparatorChar + "mugshots" + Path.DirectorySeparatorChar + guiImage.ToString() + ".img"); strMugshotPath = "file://" + (Application.StartupPath + Path.DirectorySeparatorChar + "mugshots" + Path.DirectorySeparatorChar + guiImage.ToString() + ".img").Replace(Path.DirectorySeparatorChar, '/'); } // <mugshot /> objWriter.WriteElementString("mugshot", strMugshotPath); // <mugshotbase64 /> objWriter.WriteElementString("mugshotbase64", _strMugshot); // <sex /> objWriter.WriteElementString("sex", _strSex); // <age /> objWriter.WriteElementString("age", _strAge); // <eyes /> objWriter.WriteElementString("eyes", _strEyes); // <height /> objWriter.WriteElementString("height", _strHeight); // <weight /> objWriter.WriteElementString("weight", _strWeight); // <skin /> objWriter.WriteElementString("skin", _strSkin); // <hair /> objWriter.WriteElementString("hair", _strHair); // <description /> objWriter.WriteElementString("description", _strDescription); // <background /> objWriter.WriteElementString("background", _strBackground); // <concept /> objWriter.WriteElementString("concept", _strConcept); // <notes /> objWriter.WriteElementString("notes", _strNotes); // <alias /> objWriter.WriteElementString("alias", _strAlias); // <playername /> objWriter.WriteElementString("playername", _strPlayerName); // <gamenotes /> objWriter.WriteElementString("gamenotes", _strGameNotes); // <karma /> objWriter.WriteElementString("karma", _intKarma.ToString()); // <totalkarma /> objWriter.WriteElementString("totalkarma", String.Format("{0:###,###,##0}", Convert.ToInt32(CareerKarma))); // <streetcred /> objWriter.WriteElementString("streetcred", _intStreetCred.ToString()); // <calculatedstreetcred /> objWriter.WriteElementString("calculatedstreetcred", CalculatedStreetCred.ToString()); // <totalstreetcred /> objWriter.WriteElementString("totalstreetcred", TotalStreetCred.ToString()); // <burntstreetcred /> objWriter.WriteElementString("burntstreetcred", _intBurntStreetCred.ToString()); // <notoriety /> objWriter.WriteElementString("notoriety", _intNotoriety.ToString()); // <calculatednotoriety /> objWriter.WriteElementString("calculatednotoriety", CalculatedNotoriety.ToString()); // <totalnotoriety /> objWriter.WriteElementString("totalnotoriety", TotalNotoriety.ToString()); // <publicawareness /> objWriter.WriteElementString("publicawareness", _intPublicAwareness.ToString()); // <calculatedpublicawareness /> objWriter.WriteElementString("calculatedpublicawareness", CalculatedPublicAwareness.ToString()); // <totalpublicawareness /> objWriter.WriteElementString("totalpublicawareness", TotalPublicAwareness.ToString()); // <created /> objWriter.WriteElementString("created", _blnCreated.ToString()); // <nuyen /> objWriter.WriteElementString("nuyen", _intNuyen.ToString()); // <adept /> objWriter.WriteElementString("adept", _blnAdeptEnabled.ToString()); // <magician /> objWriter.WriteElementString("magician", _blnMagicianEnabled.ToString()); // <technomancer /> objWriter.WriteElementString("technomancer", _blnTechnomancerEnabled.ToString()); // <critter /> objWriter.WriteElementString("critter", _blnCritterEnabled.ToString()); // <tradition /> objWriter.WriteElementString("tradition", _strMagicTradition); // <stream /> objWriter.WriteElementString("stream", _strTechnomancerStream); // <drain /> if (_strMagicTradition != "") { string strDrainAtt = ""; objXmlDocument = new XmlDocument(); objXmlDocument = XmlManager.Instance.Load("traditions.xml"); XmlNode objXmlTradition = objXmlDocument.SelectSingleNode("/chummer/traditions/tradition[name = \"" + _strMagicTradition + "\"]"); strDrainAtt = objXmlTradition["drain"].InnerText; XPathNavigator nav = objXmlDocument.CreateNavigator(); string strDrain = strDrainAtt.Replace("BOD", _attBOD.TotalValue.ToString()); strDrain = strDrain.Replace("AGI", _attAGI.TotalValue.ToString()); strDrain = strDrain.Replace("REA", _attREA.TotalValue.ToString()); strDrain = strDrain.Replace("STR", _attSTR.TotalValue.ToString()); strDrain = strDrain.Replace("CHA", _attCHA.TotalValue.ToString()); strDrain = strDrain.Replace("INT", _attINT.TotalValue.ToString()); strDrain = strDrain.Replace("LOG", _attLOG.TotalValue.ToString()); strDrain = strDrain.Replace("WIL", _attWIL.TotalValue.ToString()); strDrain = strDrain.Replace("MAG", _attMAG.TotalValue.ToString()); XPathExpression xprDrain = nav.Compile(strDrain); // Add any Improvements for Drain Resistance. int intDrain = Convert.ToInt32(nav.Evaluate(xprDrain)) + _objImprovementManager.ValueOf(Improvement.ImprovementType.DrainResistance); objWriter.WriteElementString("drain", strDrainAtt + " (" + intDrain.ToString() + ")"); } if (_strTechnomancerStream != "") { string strDrainAtt = ""; objXmlDocument = new XmlDocument(); objXmlDocument = XmlManager.Instance.Load("streams.xml"); XmlNode objXmlTradition = objXmlDocument.SelectSingleNode("/chummer/traditions/tradition[name = \"" + _strTechnomancerStream + "\"]"); strDrainAtt = objXmlTradition["drain"].InnerText; XPathNavigator nav = objXmlDocument.CreateNavigator(); string strDrain = strDrainAtt.Replace("BOD", _attBOD.TotalValue.ToString()); strDrain = strDrain.Replace("AGI", _attAGI.TotalValue.ToString()); strDrain = strDrain.Replace("REA", _attREA.TotalValue.ToString()); strDrain = strDrain.Replace("STR", _attSTR.TotalValue.ToString()); strDrain = strDrain.Replace("CHA", _attCHA.TotalValue.ToString()); strDrain = strDrain.Replace("INT", _attINT.TotalValue.ToString()); strDrain = strDrain.Replace("LOG", _attLOG.TotalValue.ToString()); strDrain = strDrain.Replace("WIL", _attWIL.TotalValue.ToString()); strDrain = strDrain.Replace("RES", _attRES.TotalValue.ToString()); XPathExpression xprDrain = nav.Compile(strDrain); // Add any Improvements for Fading Resistance. int intDrain = Convert.ToInt32(nav.Evaluate(xprDrain)) + _objImprovementManager.ValueOf(Improvement.ImprovementType.FadingResistance); objWriter.WriteElementString("drain", strDrainAtt + " (" + intDrain.ToString() + ")"); } // <attributes> objWriter.WriteStartElement("attributes"); _attBOD.Print(objWriter); _attAGI.Print(objWriter); _attREA.Print(objWriter); _attSTR.Print(objWriter); _attCHA.Print(objWriter); _attINT.Print(objWriter); _attLOG.Print(objWriter); _attWIL.Print(objWriter); _attINI.Print(objWriter); _attEDG.Print(objWriter); _attMAG.Print(objWriter); _attRES.Print(objWriter); if (_strMetatype.EndsWith("A.I.") || _strMetatypeCategory == "Technocritters" || _strMetatypeCategory == "Protosapients") { objWriter.WriteElementString("signal", _intSignal.ToString()); objWriter.WriteElementString("response", _intResponse.ToString()); objWriter.WriteElementString("system", System.ToString()); objWriter.WriteElementString("firewall", Firewall.ToString()); objWriter.WriteElementString("rating", Rating.ToString()); } objWriter.WriteStartElement("attribute"); objWriter.WriteElementString("name", "ESS"); objWriter.WriteElementString("base", Essence.ToString()); objWriter.WriteEndElement(); // </attributes> objWriter.WriteEndElement(); // <armorb /> objWriter.WriteElementString("armorb", TotalBallisticArmorRating.ToString()); // <armori /> objWriter.WriteElementString("armori", TotalImpactArmorRating.ToString()); // Condition Monitors. // <physicalcm /> objWriter.WriteElementString("physicalcm", PhysicalCM.ToString()); // <stuncm /> objWriter.WriteElementString("stuncm", StunCM.ToString()); // Condition Monitor Progress. // <physicalcmfilled /> objWriter.WriteElementString("physicalcmfilled", _intPhysicalCMFilled.ToString()); // <stuncmfilled /> objWriter.WriteElementString("stuncmfilled", _intStunCMFilled.ToString()); // <cmthreshold> objWriter.WriteElementString("cmthreshold", CMThreshold.ToString()); // <cmthresholdoffset> objWriter.WriteElementString("cmthresholdoffset", CMThresholdOffset.ToString()); // <cmoverflow> objWriter.WriteElementString("cmoverflow", CMOverflow.ToString()); // Calculate Initiatives. // Initiative. // Start by adding INT and REA together. int intINI = _attINT.TotalValue + _attREA.TotalValue; // Add modifiers. intINI += _attINI.AttributeModifiers; // Add in any Initiative Improvements. intINI += _objImprovementManager.ValueOf(Improvement.ImprovementType.Initiative); // If INI exceeds the Metatype maximum set it back to the maximum. if (intINI > _attINI.MetatypeAugmentedMaximum) intINI = _attINI.MetatypeAugmentedMaximum; objWriter.WriteStartElement("init"); objWriter.WriteElementString("base", (_attINT.Value + _attREA.Value).ToString()); objWriter.WriteElementString("total", intINI.ToString()); objWriter.WriteEndElement(); // Initiative Passes. int intIP = 1 + Convert.ToInt32(_objImprovementManager.ValueOf(Improvement.ImprovementType.InitiativePass)) + Convert.ToInt32(_objImprovementManager.ValueOf(Improvement.ImprovementType.InitiativePassAdd)); objWriter.WriteStartElement("ip"); objWriter.WriteElementString("base", "1"); objWriter.WriteElementString("total", intIP.ToString()); objWriter.WriteEndElement(); // Astral Initiative. if (_blnMAGEnabled) { int intAstralInit = _attINT.TotalValue * 2; objWriter.WriteStartElement("astralinit"); objWriter.WriteElementString("base", intAstralInit.ToString()); objWriter.WriteEndElement(); objWriter.WriteStartElement("astralip"); objWriter.WriteElementString("base", "3"); objWriter.WriteEndElement(); } // Matrix Initiative. objWriter.WriteStartElement("matrixinit"); objWriter.WriteElementString("base", MatrixInitiative); objWriter.WriteEndElement(); objWriter.WriteStartElement("matrixip"); objWriter.WriteElementString("base", MatrixInitiativePasses); objWriter.WriteEndElement(); // <magenabled /> objWriter.WriteElementString("magenabled", _blnMAGEnabled.ToString()); // <initiategrade /> objWriter.WriteElementString("initiategrade", _intInitiateGrade.ToString()); // <resenabled /> objWriter.WriteElementString("resenabled", _blnRESEnabled.ToString()); // <submersiongrade /> objWriter.WriteElementString("submersiongrade", _intSubmersionGrade.ToString()); // <groupmember /> objWriter.WriteElementString("groupmember", _blnGroupMember.ToString()); // <groupname /> objWriter.WriteElementString("groupname", _strGroupName); // <groupnotes /> objWriter.WriteElementString("groupnotes", _strGroupNotes); // <composure /> objWriter.WriteElementString("composure", Composure.ToString()); // <judgeintentions /> objWriter.WriteElementString("judgeintentions", JudgeIntentions.ToString()); // <liftandcarry /> objWriter.WriteElementString("liftandcarry", LiftAndCarry.ToString()); // <memory /> objWriter.WriteElementString("memory", Memory.ToString()); // <liftweight /> objWriter.WriteElementString("liftweight", (_attSTR.TotalValue * 15).ToString()); // <carryweight /> objWriter.WriteElementString("carryweight", (_attSTR.TotalValue * 10).ToString()); // Staple on the alternate Leadership Skills. Skill objLeadership = new Skill(this); Skill objLeadershipCommand = new Skill(this); Skill objLeadershipDirect = new Skill(this); if (_objOptions.PrintLeadershipAlternates) { foreach (Skill objSkill in _lstSkills) { if (objSkill.Name == "Leadership") { objLeadership = objSkill; break; } } // Leadership, Command. objLeadershipCommand.Name = objLeadership.DisplayName + ", " + LanguageManager.Instance.GetString("String_SkillCommand"); objLeadershipCommand.SkillGroup = objLeadership.SkillGroup; objLeadershipCommand.SkillCategory = objLeadership.SkillCategory; objLeadershipCommand.IsGrouped = objLeadership.IsGrouped; objLeadershipCommand.Default = objLeadership.Default; objLeadershipCommand.Rating = objLeadership.Rating; objLeadershipCommand.RatingMaximum = objLeadership.RatingMaximum; objLeadershipCommand.KnowledgeSkill = objLeadership.KnowledgeSkill; objLeadershipCommand.ExoticSkill = objLeadership.ExoticSkill; objLeadershipCommand.Specialization = objLeadership.Specialization; objLeadershipCommand.Attribute = "LOG"; objLeadershipCommand.Source = objLeadership.Source; objLeadershipCommand.Page = objLeadership.Page; _lstSkills.Add(objLeadershipCommand); // Leadership, Direct Fire objLeadershipDirect.Name = objLeadership.DisplayName + ", " + LanguageManager.Instance.GetString("String_SkillDirectFire"); objLeadershipDirect.SkillGroup = objLeadership.SkillGroup; objLeadershipDirect.SkillCategory = objLeadership.SkillCategory; objLeadershipDirect.IsGrouped = objLeadership.IsGrouped; objLeadershipDirect.Default = objLeadership.Default; objLeadershipDirect.Rating = objLeadership.Rating; objLeadershipDirect.RatingMaximum = objLeadership.RatingMaximum; objLeadershipDirect.KnowledgeSkill = objLeadership.KnowledgeSkill; objLeadershipDirect.ExoticSkill = objLeadership.ExoticSkill; objLeadershipDirect.Specialization = objLeadership.Specialization; objLeadershipDirect.Attribute = "INT"; objLeadershipDirect.Source = objLeadership.Source; objLeadershipDirect.Page = objLeadership.Page; _lstSkills.Add(objLeadershipDirect); } // Staple on the alternate Arcana Skills. Skill objArcana = new Skill(this); Skill objArcanaMetamagic = new Skill(this); Skill objArcanaArtificing = new Skill(this); if (_objOptions.PrintArcanaAlternates) { foreach (Skill objSkill in _lstSkills) { if (objSkill.Name == "Arcana") { objArcana = objSkill; break; } } // Arcana, Metamagic. objArcanaMetamagic.Name = objArcana.DisplayName + ", " + LanguageManager.Instance.GetString("String_SkillMetamagic"); objArcanaMetamagic.SkillGroup = objArcana.SkillGroup; objArcanaMetamagic.SkillCategory = objArcana.SkillCategory; objArcanaMetamagic.IsGrouped = objArcana.IsGrouped; objArcanaMetamagic.Default = objArcana.Default; objArcanaMetamagic.Rating = objArcana.Rating; objArcanaMetamagic.RatingMaximum = objArcana.RatingMaximum; objArcanaMetamagic.KnowledgeSkill = objArcana.KnowledgeSkill; objArcanaMetamagic.ExoticSkill = objArcana.ExoticSkill; objArcanaMetamagic.Specialization = objArcana.Specialization; objArcanaMetamagic.Attribute = "INT"; objArcanaMetamagic.Source = objArcana.Source; objArcanaMetamagic.Page = objArcana.Page; _lstSkills.Add(objArcanaMetamagic); // Arcana, Artificing objArcanaArtificing.Name = objArcana.DisplayName + ", " + LanguageManager.Instance.GetString("String_SkillArtificing"); objArcanaArtificing.SkillGroup = objArcana.SkillGroup; objArcanaArtificing.SkillCategory = objArcana.SkillCategory; objArcanaArtificing.IsGrouped = objArcana.IsGrouped; objArcanaArtificing.Default = objArcana.Default; objArcanaArtificing.Rating = objArcana.Rating; objArcanaArtificing.RatingMaximum = objArcana.RatingMaximum; objArcanaArtificing.KnowledgeSkill = objArcana.KnowledgeSkill; objArcanaArtificing.ExoticSkill = objArcana.ExoticSkill; objArcanaArtificing.Specialization = objArcana.Specialization; objArcanaArtificing.Attribute = "MAG"; objArcanaArtificing.Source = objArcana.Source; objArcanaArtificing.Page = objArcana.Page; _lstSkills.Add(objArcanaArtificing); } // <skills> objWriter.WriteStartElement("skills"); foreach (Skill objSkill in _lstSkills) { if (_objOptions.PrintSkillsWithZeroRating || (!_objOptions.PrintSkillsWithZeroRating && objSkill.Rating > 0) || objSkill.KnowledgeSkill) objSkill.Print(objWriter); } // </skills> objWriter.WriteEndElement(); // Remove the stapled on Leadership Skills now that we're done with them. if (_objOptions.PrintLeadershipAlternates) { _lstSkills.Remove(objLeadershipCommand); _lstSkills.Remove(objLeadershipDirect); } // Remove the stapled on Arcana Skills now that we're done with them. if (_objOptions.PrintArcanaAlternates) { _lstSkills.Remove(objArcanaMetamagic); _lstSkills.Remove(objArcanaArtificing); } // <contacts> objWriter.WriteStartElement("contacts"); foreach (Contact objContact in _lstContacts) { objContact.Print(objWriter); } // </contacts> objWriter.WriteEndElement(); // <spells> objWriter.WriteStartElement("spells"); foreach (Spell objSpell in _lstSpells) { objSpell.Print(objWriter); } // </spells> objWriter.WriteEndElement(); // <powers> objWriter.WriteStartElement("powers"); foreach (Power objPower in _lstPowers) { objPower.Print(objWriter); } // </powers> objWriter.WriteEndElement(); // <spirits> objWriter.WriteStartElement("spirits"); foreach (Spirit objSpirit in _lstSpirits) { objSpirit.Print(objWriter); } // </spirits> objWriter.WriteEndElement(); // <techprograms> objWriter.WriteStartElement("techprograms"); foreach (TechProgram objProgram in _lstTechPrograms) { objProgram.Print(objWriter); } // </techprograms> objWriter.WriteEndElement(); // <martialarts> objWriter.WriteStartElement("martialarts"); foreach (MartialArt objMartialArt in _lstMartialArts) { objMartialArt.Print(objWriter); } // </martialarts> objWriter.WriteEndElement(); // <martialartmaneuvers> objWriter.WriteStartElement("martialartmaneuvers"); foreach (MartialArtManeuver objManeuver in _lstMartialArtManeuvers) { objManeuver.Print(objWriter); } // </martialartmaneuvers> objWriter.WriteEndElement(); // <armors> objWriter.WriteStartElement("armors"); foreach (Armor objArmor in _lstArmor) { objArmor.Print(objWriter); } // </armors> objWriter.WriteEndElement(); // <weapons> objWriter.WriteStartElement("weapons"); foreach (Weapon objWeapon in _lstWeapons) { objWeapon.Print(objWriter); } // </weapons> objWriter.WriteEndElement(); // <cyberwares> objWriter.WriteStartElement("cyberwares"); foreach (Cyberware objCyberware in _lstCyberware) { objCyberware.Print(objWriter); } // </cyberwares> objWriter.WriteEndElement(); // Load the Qualities file so we can figure out whether or not each Quality should be printed. objXmlDocument = XmlManager.Instance.Load("qualities.xml"); // <qualities> objWriter.WriteStartElement("qualities"); foreach (Quality objQuality in _lstQualities) { objQuality.Print(objWriter); } // </qualities> objWriter.WriteEndElement(); // <lifestyles> objWriter.WriteStartElement("lifestyles"); foreach (Lifestyle objLifestyle in _lstLifestyles) { objLifestyle.Print(objWriter); } // </lifestyles> objWriter.WriteEndElement(); // <gears> objWriter.WriteStartElement("gears"); foreach (Gear objGear in _lstGear) { // Use the Gear's SubClass if applicable. if (objGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(this); objCommlink = (Commlink)objGear; objCommlink.Print(objWriter); } else if (objGear.GetType() == typeof(OperatingSystem)) { OperatingSystem objOperatinSystem = new OperatingSystem(this); objOperatinSystem = (OperatingSystem)objGear; objOperatinSystem.Print(objWriter); } else { objGear.Print(objWriter); } } // If the character is a Technomander, write out the Living Persona "Commlink". if (_blnTechnomancerEnabled) { int intFirewall = _attWIL.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaFirewall); int intResponse = _attINT.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaResponse); int intSignal = Convert.ToInt32(Math.Ceiling((Convert.ToDecimal(_attRES.TotalValue, GlobalOptions.Instance.CultureInfo) / 2))) + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaSignal); int intSystem = _attLOG.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaSystem); // Make sure none of the Attributes exceed the Technomancer's RES. intFirewall = Math.Min(intFirewall, _attRES.TotalValue); intResponse = Math.Min(intResponse, _attRES.TotalValue); intSignal = Math.Min(intSignal, _attRES.TotalValue); intSystem = Math.Min(intSystem, _attRES.TotalValue); Commlink objLivingPersona = new Commlink(this); objLivingPersona.Name = LanguageManager.Instance.GetString("String_LivingPersona"); objLivingPersona.Category = LanguageManager.Instance.GetString("String_Commlink"); objLivingPersona.Response = intResponse; objLivingPersona.Signal = intSignal; objLivingPersona.Source = _objOptions.LanguageBookShort("SR4"); objLivingPersona.Page = "239"; objLivingPersona.IsLivingPersona = true; OperatingSystem objLivingPersonaOS = new OperatingSystem(this); objLivingPersonaOS.Name = LanguageManager.Instance.GetString("String_LivingPersona"); objLivingPersonaOS.Category = LanguageManager.Instance.GetString("String_CommlinkOperatingSystem"); objLivingPersonaOS.Firewall = intFirewall; objLivingPersonaOS.System = intSystem; objLivingPersonaOS.Source = _objOptions.LanguageBookShort("SR4"); objLivingPersonaOS.Page = "239"; Gear objLivingPersonaFilter = new Gear(this); objLivingPersonaFilter.Name = LanguageManager.Instance.GetString("String_BiofeedbackFilter"); objLivingPersonaFilter.Category = LanguageManager.Instance.GetString("String_LivingPersonaGear"); objLivingPersonaFilter.MaxRating = _attCHA.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaBiofeedback); objLivingPersonaFilter.Rating = _attCHA.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaBiofeedback); objLivingPersonaFilter.Source = _objOptions.LanguageBookShort("SR4"); objLivingPersonaFilter.Page = "239"; objLivingPersona.Children.Add(objLivingPersonaOS); objLivingPersona.Children.Add(objLivingPersonaFilter); objLivingPersona.Print(objWriter); } // </gears> objWriter.WriteEndElement(); // <vehicles> objWriter.WriteStartElement("vehicles"); foreach (Vehicle objVehicle in _lstVehicles) { objVehicle.Print(objWriter); } // </vehicles> objWriter.WriteEndElement(); // <metamagics> objWriter.WriteStartElement("metamagics"); foreach (Metamagic objMetamagic in _lstMetamagics) { objMetamagic.Print(objWriter); } // </metamagics> objWriter.WriteEndElement(); // <critterpowers> objWriter.WriteStartElement("critterpowers"); foreach (CritterPower objPower in _lstCritterPowers) { objPower.Print(objWriter); } // </critterpowers> objWriter.WriteEndElement(); // Print the Expense Log Entries if the option is enabled. if (_objOptions.PrintExpenses) { // <expenses> objWriter.WriteStartElement("expenses"); _lstExpenseLog.Sort(ExpenseLogEntry.CompareDate); foreach (ExpenseLogEntry objExpense in _lstExpenseLog) objExpense.Print(objWriter); // </expenses> objWriter.WriteEndElement(); } // </character> objWriter.WriteEndElement(); }
/// <summary> /// Load the Character from an XML file. /// </summary> public bool Load() { XmlDocument objXmlDocument = new XmlDocument(); objXmlDocument.Load(_strFileName); XmlNode objXmlCharacter = objXmlDocument.SelectSingleNode("/character"); XmlNodeList objXmlNodeList; try { _blnIgnoreRules = Convert.ToBoolean(objXmlCharacter["ignorerules"].InnerText); } catch { _blnIgnoreRules = false; } try { _blnCreated = Convert.ToBoolean(objXmlCharacter["created"].InnerText); } catch { } ResetCharacter(); // Get the game edition of the file if possible and make sure it's intended to be used with this version of the application. try { if (objXmlCharacter["gameedition"].InnerText != string.Empty && objXmlCharacter["gameedition"].InnerText != "SR4") { MessageBox.Show(LanguageManager.Instance.GetString("Message_IncorrectGameVersion_SR5"), LanguageManager.Instance.GetString("MessageTitle_IncorrectGameVersion"), MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } catch { } // Get the name of the settings file in use if possible. try { _strSettingsFileName = objXmlCharacter["settings"].InnerText; } catch { } // Load the character's settings file. if (!_objOptions.Load(_strSettingsFileName)) return false; try { _decEssenceAtSpecialStart = Convert.ToDecimal(objXmlCharacter["essenceatspecialstart"].InnerText, GlobalOptions.Instance.CultureInfo); // fix to work around a mistake made when saving decimal values in previous versions. if (_decEssenceAtSpecialStart > EssenceMaximum) _decEssenceAtSpecialStart /= 10; } catch { } // Metatype information. _strMetatype = objXmlCharacter["metatype"].InnerText; try { _strMovement = objXmlCharacter["movement"].InnerText; } catch { } _intMetatypeBP = Convert.ToInt32(objXmlCharacter["metatypebp"].InnerText); _strMetavariant = objXmlCharacter["metavariant"].InnerText; try { _strMetatypeCategory = objXmlCharacter["metatypecategory"].InnerText; } catch { } try { _intMutantCritterBaseSkills = Convert.ToInt32(objXmlCharacter["mutantcritterbaseskills"].InnerText); } catch { } // General character information. _strName = objXmlCharacter["name"].InnerText; try { _strMugshot = objXmlCharacter["mugshot"].InnerText; } catch { } try { _strSex = objXmlCharacter["sex"].InnerText; } catch { } try { _strAge = objXmlCharacter["age"].InnerText; } catch { } try { _strEyes = objXmlCharacter["eyes"].InnerText; } catch { } try { _strHeight = objXmlCharacter["height"].InnerText; } catch { } try { _strWeight = objXmlCharacter["weight"].InnerText; } catch { } try { _strSkin = objXmlCharacter["skin"].InnerText; } catch { } try { _strHair = objXmlCharacter["hair"].InnerText; } catch { } try { _strDescription = objXmlCharacter["description"].InnerText; } catch { } try { _strBackground = objXmlCharacter["background"].InnerText; } catch { } try { _strConcept = objXmlCharacter["concept"].InnerText; } catch { } try { _strNotes = objXmlCharacter["notes"].InnerText; } catch { } try { _strAlias = objXmlCharacter["alias"].InnerText; } catch { } try { _strPlayerName = objXmlCharacter["playername"].InnerText; } catch { } try { _strGameNotes = objXmlCharacter["gamenotes"].InnerText; } catch { } try { _blnIsCritter = Convert.ToBoolean(objXmlCharacter["iscritter"].InnerText); } catch { } try { _blnPossessed = Convert.ToBoolean(objXmlCharacter["possessed"].InnerText); } catch { } try { _blnOverrideSpecialAttributeESSLoss = Convert.ToBoolean(objXmlCharacter["overridespecialattributeessloss"].InnerText); } catch { } try { _intKarma = Convert.ToInt32(objXmlCharacter["karma"].InnerText); } catch { } try { _intTotalKarma = Convert.ToInt32(objXmlCharacter["totalkarma"].InnerText); } catch { } try { _intStreetCred = Convert.ToInt32(objXmlCharacter["streetcred"].InnerText); } catch { } try { _intNotoriety = Convert.ToInt32(objXmlCharacter["notoriety"].InnerText); } catch { } try { _intPublicAwareness = Convert.ToInt32(objXmlCharacter["publicawareness"].InnerText); } catch { } try { _intBurntStreetCred = Convert.ToInt32(objXmlCharacter["burntstreetcred"].InnerText); } catch { } try { _intMaxAvail = Convert.ToInt32(objXmlCharacter["maxavail"].InnerText); } catch { } try { _intNuyen = Convert.ToInt32(objXmlCharacter["nuyen"].InnerText); } catch { } // Build Points/Karma. _intBuildPoints = Convert.ToInt32(objXmlCharacter["bp"].InnerText); try { _intBuildKarma = Convert.ToInt32(objXmlCharacter["buildkarma"].InnerText); } catch { } try { _objBuildMethod = ConvertToCharacterBuildMethod(objXmlCharacter["buildmethod"].InnerText); } catch { } _intKnowledgeSkillPoints = Convert.ToInt32(objXmlCharacter["knowpts"].InnerText); _decNuyenBP = Convert.ToDecimal(objXmlCharacter["nuyenbp"].InnerText, GlobalOptions.Instance.CultureInfo); _decNuyenMaximumBP = Convert.ToDecimal(objXmlCharacter["nuyenmaxbp"].InnerText, GlobalOptions.Instance.CultureInfo); _blnAdeptEnabled = Convert.ToBoolean(objXmlCharacter["adept"].InnerText); _blnMagicianEnabled = Convert.ToBoolean(objXmlCharacter["magician"].InnerText); _blnTechnomancerEnabled = Convert.ToBoolean(objXmlCharacter["technomancer"].InnerText); try { _blnInitiationEnabled = Convert.ToBoolean(objXmlCharacter["initiationoverride"].InnerText); } catch { } try { _blnCritterEnabled = Convert.ToBoolean(objXmlCharacter["critter"].InnerText); } catch { } try { _blnUneducated = Convert.ToBoolean(objXmlCharacter["uneducated"].InnerText); } catch { } try { _blnUncouth = Convert.ToBoolean(objXmlCharacter["uncouth"].InnerText); } catch { } try { _blnInfirm = Convert.ToBoolean(objXmlCharacter["infirm"].InnerText); } catch { } try { _blnBlackMarket = Convert.ToBoolean(objXmlCharacter["blackmarket"].InnerText); } catch { } _blnMAGEnabled = Convert.ToBoolean(objXmlCharacter["magenabled"].InnerText); try { _intInitiateGrade = Convert.ToInt32(objXmlCharacter["initiategrade"].InnerText); } catch { } _blnRESEnabled = Convert.ToBoolean(objXmlCharacter["resenabled"].InnerText); try { _intSubmersionGrade = Convert.ToInt32(objXmlCharacter["submersiongrade"].InnerText); } catch { } try { _blnGroupMember = Convert.ToBoolean(objXmlCharacter["groupmember"].InnerText); } catch { } try { _strGroupName = objXmlCharacter["groupname"].InnerText; _strGroupNotes = objXmlCharacter["groupnotes"].InnerText; } catch { } // Improvements. XmlNodeList objXmlImprovementList = objXmlDocument.SelectNodes("/character/improvements/improvement"); foreach (XmlNode objXmlImprovement in objXmlImprovementList) { Improvement objImprovement = new Improvement(); objImprovement.Load(objXmlImprovement); _lstImprovements.Add(objImprovement); } // Qualities objXmlNodeList = objXmlDocument.SelectNodes("/character/qualities/quality"); bool blnHasOldQualities = false; foreach (XmlNode objXmlQuality in objXmlNodeList) { if (objXmlQuality["name"] != null) { Quality objQuality = new Quality(this); objQuality.Load(objXmlQuality); _lstQualities.Add(objQuality); } else { // If the Quality does not have a name tag, it is in the old format. Set the flag to show that old Qualities are in use. blnHasOldQualities = true; } } // If old Qualities are in use, they need to be converted before we can continue. if (blnHasOldQualities) ConvertOldQualities(objXmlNodeList); // Attributes. objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"BOD\"]"); _attBOD.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"AGI\"]"); _attAGI.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"REA\"]"); _attREA.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"STR\"]"); _attSTR.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"CHA\"]"); _attCHA.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"INT\"]"); _attINT.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"LOG\"]"); _attLOG.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"WIL\"]"); _attWIL.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"INI\"]"); _attINI.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"EDG\"]"); _attEDG.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"MAG\"]"); _attMAG.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"RES\"]"); _attRES.Load(objXmlCharacter); objXmlCharacter = objXmlDocument.SelectSingleNode("/character/attributes/attribute[name = \"ESS\"]"); _attESS.Load(objXmlCharacter); // A.I. Attributes. try { _intSignal = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/attributes/signal").InnerText); _intResponse = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/attributes/response").InnerText); } catch { } // Force. try { _intMaxSkillRating = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/attributes/maxskillrating").InnerText); } catch { } // Attempt to load the split MAG Attribute information for Mystic Adepts. if (_blnAdeptEnabled && _blnMagicianEnabled) { try { _intMAGAdept = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/magsplitadept").InnerText); _intMAGMagician = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/magsplitmagician").InnerText); } catch { } } // Attempt to load the Magic Tradition. try { _strMagicTradition = objXmlDocument.SelectSingleNode("/character/tradition").InnerText; } catch { } // Attempt to load the Technomancer Stream. try { _strTechnomancerStream = objXmlDocument.SelectSingleNode("/character/stream").InnerText; } catch { } // Attempt to load Condition Monitor Progress. try { _intPhysicalCMFilled = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/physicalcmfilled").InnerText); _intStunCMFilled = Convert.ToInt32(objXmlDocument.SelectSingleNode("/character/stuncmfilled").InnerText); } catch { } // Skills. foreach (Skill objSkill in _lstSkills) { XmlNode objXmlSkill = objXmlDocument.SelectSingleNode("/character/skills/skill[name = \"" + objSkill.Name + "\"]"); if (objXmlSkill != null) { objSkill.Load(objXmlSkill); } } // Exotic Skills. objXmlNodeList = objXmlDocument.SelectNodes("/character/skills/skill[exotic = \"True\"]"); foreach (XmlNode objXmlSkill in objXmlNodeList) { Skill objSkill = new Skill(this); objSkill.Load(objXmlSkill); _lstSkills.Add(objSkill); } // SkillGroups. foreach (SkillGroup objGroup in _lstSkillGroups) { XmlNode objXmlSkill = objXmlDocument.SelectSingleNode("/character/skillgroups/skillgroup[name = \"" + objGroup.Name + "\"]"); if (objXmlSkill != null) { objGroup.Load(objXmlSkill); // If the character is set to ignore rules or is in Career Mode, Skill Groups should have a maximum Rating of 6 unless they have been given a higher maximum Rating already. if ((_blnIgnoreRules || _blnCreated) && objGroup.RatingMaximum < 6) objGroup.RatingMaximum = 6; } } // Knowledge Skills. List<ListItem> lstKnowledgeSkillOrder = new List<ListItem>(); objXmlNodeList = objXmlDocument.SelectNodes("/character/skills/skill[knowledge = \"True\"]"); // Sort the Knowledge Skills in alphabetical order. foreach (XmlNode objXmlSkill in objXmlNodeList) { ListItem objGroup = new ListItem(); objGroup.Value = objXmlSkill["name"].InnerText; objGroup.Name = objXmlSkill["name"].InnerText; lstKnowledgeSkillOrder.Add(objGroup); } SortListItem objSort = new SortListItem(); lstKnowledgeSkillOrder.Sort(objSort.Compare); foreach (ListItem objItem in lstKnowledgeSkillOrder) { Skill objSkill = new Skill(this); XmlNode objNode = objXmlDocument.SelectSingleNode("/character/skills/skill[knowledge = \"True\" and name = " + CleanXPath(objItem.Value) + "]"); objSkill.Load(objNode); _lstSkills.Add(objSkill); } // Contacts. objXmlNodeList = objXmlDocument.SelectNodes("/character/contacts/contact"); foreach (XmlNode objXmlContact in objXmlNodeList) { Contact objContact = new Contact(this); objContact.Load(objXmlContact); _lstContacts.Add(objContact); } // Armor. objXmlNodeList = objXmlDocument.SelectNodes("/character/armors/armor"); foreach (XmlNode objXmlArmor in objXmlNodeList) { Armor objArmor = new Armor(this); objArmor.Load(objXmlArmor); _lstArmor.Add(objArmor); } // Weapons. objXmlNodeList = objXmlDocument.SelectNodes("/character/weapons/weapon"); foreach (XmlNode objXmlWeapon in objXmlNodeList) { Weapon objWeapon = new Weapon(this); objWeapon.Load(objXmlWeapon); _lstWeapons.Add(objWeapon); } // Cyberware/Bioware. objXmlNodeList = objXmlDocument.SelectNodes("/character/cyberwares/cyberware"); foreach (XmlNode objXmlCyberware in objXmlNodeList) { Cyberware objCyberware = new Cyberware(this); objCyberware.Load(objXmlCyberware); _lstCyberware.Add(objCyberware); } // Spells. objXmlNodeList = objXmlDocument.SelectNodes("/character/spells/spell"); foreach (XmlNode objXmlSpell in objXmlNodeList) { Spell objSpell = new Spell(this); objSpell.Load(objXmlSpell); _lstSpells.Add(objSpell); } // Foci. objXmlNodeList = objXmlDocument.SelectNodes("/character/foci/focus"); foreach (XmlNode objXmlFocus in objXmlNodeList) { Focus objFocus = new Focus(); objFocus.Load(objXmlFocus); _lstFoci.Add(objFocus); } // Stacked Foci. objXmlNodeList = objXmlDocument.SelectNodes("/character/stackedfoci/stackedfocus"); foreach (XmlNode objXmlStack in objXmlNodeList) { StackedFocus objStack = new StackedFocus(this); objStack.Load(objXmlStack); _lstStackedFoci.Add(objStack); } // Powers. objXmlNodeList = objXmlDocument.SelectNodes("/character/powers/power"); foreach (XmlNode objXmlPower in objXmlNodeList) { Power objPower = new Power(this); objPower.Load(objXmlPower); _lstPowers.Add(objPower); } // Spirits/Sprites. objXmlNodeList = objXmlDocument.SelectNodes("/character/spirits/spirit"); foreach (XmlNode objXmlSpirit in objXmlNodeList) { Spirit objSpirit = new Spirit(this); objSpirit.Load(objXmlSpirit); _lstSpirits.Add(objSpirit); } // Compex Forms/Technomancer Programs. objXmlNodeList = objXmlDocument.SelectNodes("/character/techprograms/techprogram"); foreach (XmlNode objXmlProgram in objXmlNodeList) { TechProgram objProgram = new TechProgram(this); objProgram.Load(objXmlProgram); _lstTechPrograms.Add(objProgram); } // Martial Arts. objXmlNodeList = objXmlDocument.SelectNodes("/character/martialarts/martialart"); foreach (XmlNode objXmlArt in objXmlNodeList) { MartialArt objMartialArt = new MartialArt(this); objMartialArt.Load(objXmlArt); _lstMartialArts.Add(objMartialArt); } // Martial Art Maneuvers. objXmlNodeList = objXmlDocument.SelectNodes("/character/martialartmaneuvers/martialartmaneuver"); foreach (XmlNode objXmlManeuver in objXmlNodeList) { MartialArtManeuver objManeuver = new MartialArtManeuver(this); objManeuver.Load(objXmlManeuver); _lstMartialArtManeuvers.Add(objManeuver); } // Lifestyles. objXmlNodeList = objXmlDocument.SelectNodes("/character/lifestyles/lifestyle"); foreach (XmlNode objXmlLifestyle in objXmlNodeList) { Lifestyle objLifestyle = new Lifestyle(this); objLifestyle.Load(objXmlLifestyle); _lstLifestyles.Add(objLifestyle); } // <gears> objXmlNodeList = objXmlDocument.SelectNodes("/character/gears/gear"); foreach (XmlNode objXmlGear in objXmlNodeList) { switch (objXmlGear["category"].InnerText) { case "Commlink": case "Commlink Upgrade": Commlink objCommlink = new Commlink(this); objCommlink.Load(objXmlGear); _lstGear.Add(objCommlink); break; case "Commlink Operating System": case "Commlink Operating System Upgrade": OperatingSystem objOperatingSystem = new OperatingSystem(this); objOperatingSystem.Load(objXmlGear); _lstGear.Add(objOperatingSystem); break; default: Gear objGear = new Gear(this); objGear.Load(objXmlGear); _lstGear.Add(objGear); break; } } // Vehicles. objXmlNodeList = objXmlDocument.SelectNodes("/character/vehicles/vehicle"); foreach (XmlNode objXmlVehicle in objXmlNodeList) { Vehicle objVehicle = new Vehicle(this); objVehicle.Load(objXmlVehicle); _lstVehicles.Add(objVehicle); } // Metamagics/Echoes. objXmlNodeList = objXmlDocument.SelectNodes("/character/metamagics/metamagic"); foreach (XmlNode objXmlMetamagic in objXmlNodeList) { Metamagic objMetamagic = new Metamagic(this); objMetamagic.Load(objXmlMetamagic); _lstMetamagics.Add(objMetamagic); } // Critter Powers. objXmlNodeList = objXmlDocument.SelectNodes("/character/critterpowers/critterpower"); foreach (XmlNode objXmlPower in objXmlNodeList) { CritterPower objPower = new CritterPower(this); objPower.Load(objXmlPower); _lstCritterPowers.Add(objPower); } // Initiation Grades. objXmlNodeList = objXmlDocument.SelectNodes("/character/initiationgrades/initiationgrade"); foreach (XmlNode objXmlGrade in objXmlNodeList) { InitiationGrade objGrade = new InitiationGrade(this); objGrade.Load(objXmlGrade); _lstInitiationGrades.Add(objGrade); } // Expense Log Entries. XmlNodeList objXmlExpenseList = objXmlDocument.SelectNodes("/character/expenses/expense"); foreach (XmlNode objXmlExpense in objXmlExpenseList) { ExpenseLogEntry objExpenseLogEntry = new ExpenseLogEntry(); objExpenseLogEntry.Load(objXmlExpense); _lstExpenseLog.Add(objExpenseLogEntry); } // Locations. XmlNodeList objXmlLocationList = objXmlDocument.SelectNodes("/character/locations/location"); foreach (XmlNode objXmlLocation in objXmlLocationList) { _lstLocations.Add(objXmlLocation.InnerText); } // Armor Bundles. XmlNodeList objXmlBundleList = objXmlDocument.SelectNodes("/character/armorbundles/armorbundle"); foreach (XmlNode objXmlBundle in objXmlBundleList) { _lstArmorBundles.Add(objXmlBundle.InnerText); } // Weapon Locations. XmlNodeList objXmlWeaponLocationList = objXmlDocument.SelectNodes("/character/weaponlocations/weaponlocation"); foreach (XmlNode objXmlLocation in objXmlWeaponLocationList) { _lstWeaponLocations.Add(objXmlLocation.InnerText); } // Improvement Groups. XmlNodeList objXmlGroupList = objXmlDocument.SelectNodes("/character/improvementgroups/improvementgroup"); foreach (XmlNode objXmlGroup in objXmlGroupList) { _lstImprovementGroups.Add(objXmlGroup.InnerText); } // Calendar. XmlNodeList objXmlWeekList = objXmlDocument.SelectNodes("/character/calendar/week"); foreach (XmlNode objXmlWeek in objXmlWeekList) { CalendarWeek objWeek = new CalendarWeek(); objWeek.Load(objXmlWeek); _lstCalendar.Add(objWeek); } // If the character had old Qualities that were converted, immediately save the file so they are in the new format. if (blnHasOldQualities) Save(); return 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.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(); }
private void chkVehicleHomeNode_CheckedChanged(object sender, EventArgs e) { if (treVehicles.SelectedNode.Level == 1) { Vehicle objVehicle = (Vehicle)_objFunctions.FindEquipment(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, typeof(Vehicle)); if (objVehicle == null) return; objVehicle.HomeNode = chkVehicleHomeNode.Checked; } else { Commlink objGear = new Commlink(_objCharacter); objGear = (Commlink)_objFunctions.FindEquipment(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, typeof(Gear)); objGear.HomeNode = chkVehicleHomeNode.Checked; } RefreshSelectedVehicle(); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); }
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> /// Print this character information to a MemoryStream. This creates only the character object itself, not any of the opening or closing XmlDocument items. /// This can be used to write multiple characters to a single XmlDocument. /// </summary> /// <param name="objStream">MemoryStream to use.</param> /// <param name="objWriter">XmlTextWriter to write to.</param> public void PrintToStream(MemoryStream objStream, XmlTextWriter objWriter) { XmlDocument objXmlDocument = new XmlDocument(); XmlDocument objMetatypeDoc = new XmlDocument(); XmlNode objMetatypeNode; string strMetatype = ""; string strMetavariant = ""; // Get the name of the Metatype and Metavariant. objMetatypeDoc = XmlManager.Instance.Load("metatypes.xml"); { objMetatypeNode = objMetatypeDoc.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _strMetatype + "\"]"); if (objMetatypeNode == null) objMetatypeDoc = XmlManager.Instance.Load("critters.xml"); objMetatypeNode = objMetatypeDoc.SelectSingleNode("/chummer/metatypes/metatype[name = \"" + _strMetatype + "\"]"); if (objMetatypeNode["translate"] != null) strMetatype = objMetatypeNode["translate"].InnerText; else strMetatype = _strMetatype; if (_strMetavariant != "") { objMetatypeNode = objMetatypeNode.SelectSingleNode("metavariants/metavariant[name = \"" + _strMetavariant + "\"]"); if (objMetatypeNode["translate"] != null) strMetavariant = objMetatypeNode["translate"].InnerText; else strMetavariant = _strMetavariant; } } Guid guiImage = new Guid(); guiImage = Guid.NewGuid(); // This line left in for debugging. Write the output to a fixed file name. //FileStream objStream = new FileStream("D:\\temp\\print.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);//(_strFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); // <character> objWriter.WriteStartElement("character"); // <metatype /> objWriter.WriteElementString("metatype", strMetatype); // <metatype_english /> objWriter.WriteElementString("metatype_english", _strMetatype); // <metavariant /> objWriter.WriteElementString("metavariant", strMetavariant); // <metavariant_english /> objWriter.WriteElementString("metavariant_english", _strMetavariant); // <movement /> objWriter.WriteElementString("movement", FullMovement()); // <walk /> objWriter.WriteElementString("walk", FullMovement()); // <run /> objWriter.WriteElementString("run", FullMovement()); // <sprint /> objWriter.WriteElementString("sprint", FullMovement()); // <movementwalk /> objWriter.WriteElementString("movementwalk", Movement); // <movementswim /> objWriter.WriteElementString("movementswim", Swim); // <movementfly /> objWriter.WriteElementString("movementfly", Fly); // <gameplayoption /> objWriter.WriteElementString("gameplayoption", _strGameplayOption); // <maxkarma /> objWriter.WriteElementString("maxkarma", _intMaxKarma.ToString()); // <maxnuyen /> objWriter.WriteElementString("maxnuyen", _intMaxKarma.ToString()); // <contactmultiplier /> objWriter.WriteElementString("contactmultiplier", _intContactMultiplier.ToString()); // <prioritymetatype /> objWriter.WriteElementString("prioritymetatype", _strPriorityMetatype); // <priorityattributes /> objWriter.WriteElementString("priorityattributes", _strPriorityAttributes); // <priorityspecial /> objWriter.WriteElementString("priorityspecial", _strPrioritySpecial); // <priorityskills /> objWriter.WriteElementString("priorityskills", _strPrioritySkills); // <priorityresources /> objWriter.WriteElementString("priorityresources", _strPriorityResources); // <priorityskill1 /> objWriter.WriteElementString("priorityskill1", _strSkill1); // <priorityskill2 /> objWriter.WriteElementString("priorityskill2", _strSkill2); // <priorityskillgroup /> objWriter.WriteElementString("priorityskillgroup", _strSkillGroup); // If the character does not have a name, call them Unnamed Character. This prevents a transformed document from having a self-terminated title tag which causes browser to not rendering anything. // <name /> if (_strName != "") objWriter.WriteElementString("name", _strName); else objWriter.WriteElementString("name", LanguageManager.Instance.GetString("String_UnnamedCharacter")); // Since IE is retarded and can't handle base64 images before IE9, we need to dump the image to a temporary directory and re-write the information. // If you give it an extension of jpg, gif, or png, it expects the file to be in that format and won't render the image unless it was originally that type. // But if you give it the extension img, it will render whatever you give it (which doesn't make any damn sense, but that's IE for you). string strMugshotPath = ""; if (_strMugshot != "") { if (!Directory.Exists(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "mugshots")) Directory.CreateDirectory(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "mugshots"); byte[] bytImage = Convert.FromBase64String(_strMugshot); MemoryStream objImageStream = new MemoryStream(bytImage, 0, bytImage.Length); objImageStream.Write(bytImage, 0, bytImage.Length); Image imgMugshot = Image.FromStream(objImageStream, true); imgMugshot.Save(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "mugshots" + Path.DirectorySeparatorChar + guiImage.ToString() + ".img"); strMugshotPath = "file://" + (Environment.CurrentDirectory + Path.DirectorySeparatorChar + "mugshots" + Path.DirectorySeparatorChar + guiImage.ToString() + ".img").Replace(Path.DirectorySeparatorChar, '/'); } // <mugshot /> objWriter.WriteElementString("mugshot", strMugshotPath); // <mugshotbase64 /> objWriter.WriteElementString("mugshotbase64", _strMugshot); // <sex /> objWriter.WriteElementString("sex", _strSex); // <age /> objWriter.WriteElementString("age", _strAge); // <eyes /> objWriter.WriteElementString("eyes", _strEyes); // <height /> objWriter.WriteElementString("height", _strHeight); // <weight /> objWriter.WriteElementString("weight", _strWeight); // <skin /> objWriter.WriteElementString("skin", _strSkin); // <hair /> objWriter.WriteElementString("hair", _strHair); // <description /> objWriter.WriteElementString("description", _strDescription); // <background /> objWriter.WriteElementString("background", _strBackground); // <concept /> objWriter.WriteElementString("concept", _strConcept); // <notes /> objWriter.WriteElementString("notes", _strNotes); // <alias /> objWriter.WriteElementString("alias", _strAlias); // <playername /> objWriter.WriteElementString("playername", _strPlayerName); // <gamenotes /> objWriter.WriteElementString("gamenotes", _strGameNotes); // <limitphysical /> objWriter.WriteElementString("limitphysical", LimitPhysical.ToString()); // <limitmental /> objWriter.WriteElementString("limitmental", LimitMental.ToString()); // <limitsocial /> objWriter.WriteElementString("limitsocial", LimitSocial.ToString()); // <limitastral /> objWriter.WriteElementString("limitastral", LimitAstral.ToString()); // <contactpoints /> objWriter.WriteElementString("contactpoints", _intContactPoints.ToString()); // <contactpointsused /> objWriter.WriteElementString("contactpointsused", _intContactPointsUsed.ToString()); // <cfplimit /> objWriter.WriteElementString("cfplimit", _intCFPLimit.ToString()); // <spelllimit /> objWriter.WriteElementString("spelllimit", _intSpellLimit.ToString()); // <karma /> objWriter.WriteElementString("karma", _intKarma.ToString()); // <totalkarma /> objWriter.WriteElementString("totalkarma", String.Format("{0:###,###,##0}", Convert.ToInt32(CareerKarma))); // <special /> objWriter.WriteElementString("special", _intSpecial.ToString()); // <totalspecial /> objWriter.WriteElementString("totalspecial", String.Format("{0:###,###,##0}", Convert.ToInt32(_intTotalSpecial))); // <attributes /> objWriter.WriteElementString("attributes", _intSpecial.ToString()); // <totalattributes /> objWriter.WriteElementString("totalattributes", String.Format("{0:###,###,##0}", Convert.ToInt32(_intTotalAttributes))); // <streetcred /> objWriter.WriteElementString("streetcred", _intStreetCred.ToString()); // <calculatedstreetcred /> objWriter.WriteElementString("calculatedstreetcred", CalculatedStreetCred.ToString()); // <totalstreetcred /> objWriter.WriteElementString("totalstreetcred", TotalStreetCred.ToString()); // <burntstreetcred /> objWriter.WriteElementString("burntstreetcred", _intBurntStreetCred.ToString()); // <notoriety /> objWriter.WriteElementString("notoriety", _intNotoriety.ToString()); // <calculatednotoriety /> objWriter.WriteElementString("calculatednotoriety", CalculatedNotoriety.ToString()); // <totalnotoriety /> objWriter.WriteElementString("totalnotoriety", TotalNotoriety.ToString()); // <publicawareness /> objWriter.WriteElementString("publicawareness", _intPublicAwareness.ToString()); // <calculatedpublicawareness /> objWriter.WriteElementString("calculatedpublicawareness", CalculatedPublicAwareness.ToString()); // <totalpublicawareness /> objWriter.WriteElementString("totalpublicawareness", TotalPublicAwareness.ToString()); // <created /> objWriter.WriteElementString("created", _blnCreated.ToString()); // <nuyen /> objWriter.WriteElementString("nuyen", _intNuyen.ToString()); // <adeptwaydiscount /> objWriter.WriteElementString("adeptwaydiscount", _intAdeptWayDiscount.ToString()); int i = this._intNuyen; // <adept /> objWriter.WriteElementString("adept", _blnAdeptEnabled.ToString()); // <magician /> objWriter.WriteElementString("magician", _blnMagicianEnabled.ToString()); // <technomancer /> objWriter.WriteElementString("technomancer", _blnTechnomancerEnabled.ToString()); // <critter /> objWriter.WriteElementString("critter", _blnCritterEnabled.ToString()); // <tradition /> string strTraditionName = _strMagicTradition; if (strTraditionName == "Custom") strTraditionName = _strTraditionName; objWriter.WriteStartElement("tradition"); objWriter.WriteElementString("name", strTraditionName); if (_strMagicTradition != "") { string strDrainAtt = ""; objXmlDocument = new XmlDocument(); objXmlDocument = XmlManager.Instance.Load("traditions.xml"); XmlNode objXmlTradition = objXmlDocument.SelectSingleNode("/chummer/traditions/tradition[name = \"" + _strMagicTradition + "\"]"); try { if (objXmlTradition["name"].InnerText == "Custom") strDrainAtt = _strTraditionDrain; else strDrainAtt = objXmlTradition["drain"].InnerText; } catch { strDrainAtt = objXmlTradition["drain"].InnerText; } XPathNavigator nav = objXmlDocument.CreateNavigator(); string strDrain = strDrainAtt.Replace("BOD", _attBOD.TotalValue.ToString()); strDrain = strDrain.Replace("AGI", _attAGI.TotalValue.ToString()); strDrain = strDrain.Replace("REA", _attREA.TotalValue.ToString()); strDrain = strDrain.Replace("STR", _attSTR.TotalValue.ToString()); strDrain = strDrain.Replace("CHA", _attCHA.TotalValue.ToString()); strDrain = strDrain.Replace("INT", _attINT.TotalValue.ToString()); strDrain = strDrain.Replace("LOG", _attLOG.TotalValue.ToString()); strDrain = strDrain.Replace("WIL", _attWIL.TotalValue.ToString()); strDrain = strDrain.Replace("MAG", _attMAG.TotalValue.ToString()); XPathExpression xprDrain = nav.Compile(strDrain); // Add any Improvements for Drain Resistance. int intDrain = Convert.ToInt32(nav.Evaluate(xprDrain)) + _objImprovementManager.ValueOf(Improvement.ImprovementType.DrainResistance); objWriter.WriteElementString("drain", strDrainAtt + " (" + intDrain.ToString() + ")"); // Get spirit type per spell category XmlNodeList lstXmlSpiritTypes = objXmlTradition.SelectNodes("spirits/spirit"); string strSpiritCombat = lstXmlSpiritTypes[0] != null ? lstXmlSpiritTypes[0].InnerText : _strSpiritCombat; string strSpiritDetection = lstXmlSpiritTypes[1] != null ? lstXmlSpiritTypes[1].InnerText : _strSpiritDetection; string strSpiritHealth = lstXmlSpiritTypes[2] != null ? lstXmlSpiritTypes[2].InnerText : _strSpiritHealth; string strSpiritIllusion = lstXmlSpiritTypes[3] != null ? lstXmlSpiritTypes[3].InnerText : _strSpiritIllusion; string strSpiritManipulation = lstXmlSpiritTypes[4] != null ? lstXmlSpiritTypes[4].InnerText : _strSpiritManipulation; objWriter.WriteElementString("spiritcombat", strSpiritCombat); objWriter.WriteElementString("spiritdetection", strSpiritDetection); objWriter.WriteElementString("spirithealth", strSpiritHealth); objWriter.WriteElementString("spiritillusion", strSpiritIllusion); objWriter.WriteElementString("spiritmanipulation", strSpiritManipulation); //Spirit form, default to materialization unless field with other data persists string strSpiritForm; objXmlTradition.TryGetField("spiritform", out strSpiritForm, "Materialization"); objWriter.WriteElementString("spiritform", strSpiritForm); //Rulebook reference string strSource, strPage; objXmlTradition.TryGetField("source", out strSource); objXmlTradition.TryGetField("page", out strPage); objWriter.WriteElementString("source", strSource); objWriter.WriteElementString("page", strPage); } objWriter.WriteEndElement(); // <stream /> objWriter.WriteElementString("stream", _strTechnomancerStream); if (_strTechnomancerStream != "") { string strDrainAtt = ""; objXmlDocument = new XmlDocument(); objXmlDocument = XmlManager.Instance.Load("streams.xml"); XmlNode objXmlTradition = objXmlDocument.SelectSingleNode("/chummer/traditions/tradition[name = \"" + _strTechnomancerStream + "\"]"); strDrainAtt = objXmlTradition["drain"].InnerText; XPathNavigator nav = objXmlDocument.CreateNavigator(); string strDrain = strDrainAtt.Replace("BOD", _attBOD.TotalValue.ToString()); strDrain = strDrain.Replace("AGI", _attAGI.TotalValue.ToString()); strDrain = strDrain.Replace("REA", _attREA.TotalValue.ToString()); strDrain = strDrain.Replace("STR", _attSTR.TotalValue.ToString()); strDrain = strDrain.Replace("CHA", _attCHA.TotalValue.ToString()); strDrain = strDrain.Replace("INT", _attINT.TotalValue.ToString()); strDrain = strDrain.Replace("LOG", _attLOG.TotalValue.ToString()); strDrain = strDrain.Replace("WIL", _attWIL.TotalValue.ToString()); strDrain = strDrain.Replace("RES", _attRES.TotalValue.ToString()); XPathExpression xprDrain = nav.Compile(strDrain); // Add any Improvements for Fading Resistance. int intDrain = Convert.ToInt32(nav.Evaluate(xprDrain)) + _objImprovementManager.ValueOf(Improvement.ImprovementType.FadingResistance); objWriter.WriteElementString("drain", strDrainAtt + " (" + intDrain.ToString() + ")"); } // <attributes> objWriter.WriteStartElement("attributes"); _attBOD.Print(objWriter); _attAGI.Print(objWriter); _attREA.Print(objWriter); _attSTR.Print(objWriter); _attCHA.Print(objWriter); _attINT.Print(objWriter); _attLOG.Print(objWriter); _attWIL.Print(objWriter); _attINI.Print(objWriter); _attEDG.Print(objWriter); _attMAG.Print(objWriter); _attRES.Print(objWriter); if (_strMetatype.EndsWith("A.I.") || _strMetatypeCategory == "Technocritters" || _strMetatypeCategory == "Protosapients") { objWriter.WriteElementString("signal", _intSignal.ToString()); objWriter.WriteElementString("response", _intResponse.ToString()); objWriter.WriteElementString("system", System.ToString()); objWriter.WriteElementString("firewall", Firewall.ToString()); objWriter.WriteElementString("rating", Rating.ToString()); } objWriter.WriteStartElement("attribute"); objWriter.WriteElementString("name", "ESS"); objWriter.WriteElementString("base", Essence.ToString()); objWriter.WriteEndElement(); // </attributes> objWriter.WriteEndElement(); // <armor /> objWriter.WriteElementString("armor", TotalArmorRating.ToString()); // Condition Monitors. // <physicalcm /> objWriter.WriteElementString("physicalcm", PhysicalCM.ToString()); // <stuncm /> objWriter.WriteElementString("stuncm", StunCM.ToString()); // Condition Monitor Progress. // <physicalcmfilled /> objWriter.WriteElementString("physicalcmfilled", _intPhysicalCMFilled.ToString()); // <stuncmfilled /> objWriter.WriteElementString("stuncmfilled", _intStunCMFilled.ToString()); // <cmthreshold> objWriter.WriteElementString("cmthreshold", CMThreshold.ToString()); // <cmthresholdoffset> objWriter.WriteElementString("cmthresholdoffset", CMThresholdOffset.ToString()); // <cmoverflow> objWriter.WriteElementString("cmoverflow", CMOverflow.ToString()); // Calculate Initiatives. // Initiative. string strInit = this.Initiative; objWriter.WriteElementString("init", strInit); // Astral Initiative. if (this.MAGEnabled) { string strAstralInit = this.AstralInitiative; objWriter.WriteElementString("astralinit", strAstralInit); } // Matrix Initiative (AR). string strMatrixInitAR = this.MatrixInitiative; objWriter.WriteElementString("matrixarinit", strMatrixInitAR); // Matrix Initiative (Cold). string strMatrixInitCold = this.MatrixInitiativeCold; objWriter.WriteElementString("matrixcoldinit", strMatrixInitCold); // Matrix Initiative (Hot). string strMatrixInitHot = this.MatrixInitiativeHot; objWriter.WriteElementString("matrixhotinit", strMatrixInitHot); // Rigger Initiative. string strRiggerInit = this.RiggerInitiative; objWriter.WriteElementString("riggerinit", strRiggerInit); // <magenabled /> objWriter.WriteElementString("magenabled", _blnMAGEnabled.ToString()); // <initiategrade /> objWriter.WriteElementString("initiategrade", _intInitiateGrade.ToString()); // <resenabled /> objWriter.WriteElementString("resenabled", _blnRESEnabled.ToString()); // <submersiongrade /> objWriter.WriteElementString("submersiongrade", _intSubmersionGrade.ToString()); // <groupmember /> objWriter.WriteElementString("groupmember", _blnGroupMember.ToString()); // <groupname /> objWriter.WriteElementString("groupname", _strGroupName); // <groupnotes /> objWriter.WriteElementString("groupnotes", _strGroupNotes); // <composure /> objWriter.WriteElementString("composure", Composure.ToString()); // <judgeintentions /> objWriter.WriteElementString("judgeintentions", JudgeIntentions.ToString()); // <liftandcarry /> objWriter.WriteElementString("liftandcarry", LiftAndCarry.ToString()); // <memory /> objWriter.WriteElementString("memory", Memory.ToString()); // <liftweight /> objWriter.WriteElementString("liftweight", (_attSTR.TotalValue * 15).ToString()); // <carryweight /> objWriter.WriteElementString("carryweight", (_attSTR.TotalValue * 10).ToString()); // <skills> objWriter.WriteStartElement("skills"); foreach (Skill objSkill in _lstSkills) { if (_objOptions.PrintSkillsWithZeroRating || (!_objOptions.PrintSkillsWithZeroRating && objSkill.Rating > 0) || objSkill.KnowledgeSkill) objSkill.Print(objWriter); } // </skills> objWriter.WriteEndElement(); // <contacts> objWriter.WriteStartElement("contacts"); foreach (Contact objContact in _lstContacts) { objContact.Print(objWriter); } // </contacts> objWriter.WriteEndElement(); // <limitmodifiersphys> objWriter.WriteStartElement("limitmodifiersphys"); foreach (LimitModifier objLimitModifier in _lstLimitModifiers) { if (objLimitModifier.Limit == "Physical") objLimitModifier.Print(objWriter); } // Populate Limit Modifiers from Improvements foreach (Improvement objImprovement in _lstImprovements) { if (objImprovement.ImproveType == Improvement.ImprovementType.LimitModifier) { if (objImprovement.ImprovedName == "Physical") { string strName = objImprovement.UniqueName; if (objImprovement.Value > 0) strName += " [+" + objImprovement.Value.ToString() + "]"; else strName += " [" + objImprovement.Value.ToString() + "]"; if (objImprovement.Exclude != "") strName += " (" + objImprovement.Exclude + ")"; objWriter.WriteStartElement("limitmodifier"); objWriter.WriteElementString("name", strName); if (this.Options.PrintNotes) objWriter.WriteElementString("notes", objImprovement.Notes); objWriter.WriteEndElement(); } } } // </limitmodifiersphys> objWriter.WriteEndElement(); // <limitmodifiersment> objWriter.WriteStartElement("limitmodifiersment"); foreach (LimitModifier objLimitModifier in _lstLimitModifiers) { if (objLimitModifier.Limit == "Mental") objLimitModifier.Print(objWriter); } // Populate Limit Modifiers from Improvements foreach (Improvement objImprovement in _lstImprovements) { if (objImprovement.ImproveType == Improvement.ImprovementType.LimitModifier) { if (objImprovement.ImprovedName == "Mental") { string strName = objImprovement.UniqueName; if (objImprovement.Value > 0) strName += " [+" + objImprovement.Value.ToString() + "]"; else strName += " [" + objImprovement.Value.ToString() + "]"; if (objImprovement.Exclude != "") strName += " (" + objImprovement.Exclude + ")"; objWriter.WriteStartElement("limitmodifier"); objWriter.WriteElementString("name", strName); if (this.Options.PrintNotes) objWriter.WriteElementString("notes", objImprovement.Notes); objWriter.WriteEndElement(); } } } // </limitmodifiersment> objWriter.WriteEndElement(); // <limitmodifierssoc> objWriter.WriteStartElement("limitmodifierssoc"); foreach (LimitModifier objLimitModifier in _lstLimitModifiers) { if (objLimitModifier.Limit == "Social") objLimitModifier.Print(objWriter); } // Populate Limit Modifiers from Improvements foreach (Improvement objImprovement in _lstImprovements) { if (objImprovement.ImproveType == Improvement.ImprovementType.LimitModifier) { if (objImprovement.ImprovedName == "Social") { string strName = objImprovement.UniqueName; if (objImprovement.Value > 0) strName += " [+" + objImprovement.Value.ToString() + "]"; else strName += " [" + objImprovement.Value.ToString() + "]"; if (objImprovement.Exclude != "") strName += " (" + objImprovement.Exclude + ")"; objWriter.WriteStartElement("limitmodifier"); objWriter.WriteElementString("name", strName); if (this.Options.PrintNotes) objWriter.WriteElementString("notes", objImprovement.Notes); objWriter.WriteEndElement(); } } } // </limitmodifierssoc> objWriter.WriteEndElement(); // <spells> objWriter.WriteStartElement("spells"); foreach (Spell objSpell in _lstSpells) { objSpell.Print(objWriter); } // </spells> objWriter.WriteEndElement(); // <powers> objWriter.WriteStartElement("powers"); foreach (Power objPower in _lstPowers) { objPower.Print(objWriter); } // </powers> objWriter.WriteEndElement(); // <spirits> objWriter.WriteStartElement("spirits"); foreach (Spirit objSpirit in _lstSpirits) { objSpirit.Print(objWriter); } // </spirits> objWriter.WriteEndElement(); // <complexforms> objWriter.WriteStartElement("complexforms"); foreach (ComplexForm objProgram in _lstComplexForms) { objProgram.Print(objWriter); } // </complexforms> objWriter.WriteEndElement(); // <martialarts> objWriter.WriteStartElement("martialarts"); foreach (MartialArt objMartialArt in _lstMartialArts) { objMartialArt.Print(objWriter); } // </martialarts> objWriter.WriteEndElement(); // <martialartmaneuvers> objWriter.WriteStartElement("martialartmaneuvers"); foreach (MartialArtManeuver objManeuver in _lstMartialArtManeuvers) { objManeuver.Print(objWriter); } // </martialartmaneuvers> objWriter.WriteEndElement(); // <armors> objWriter.WriteStartElement("armors"); foreach (Armor objArmor in _lstArmor) { objArmor.Print(objWriter); } // </armors> objWriter.WriteEndElement(); // <weapons> objWriter.WriteStartElement("weapons"); foreach (Weapon objWeapon in _lstWeapons) { objWeapon.Print(objWriter); } // </weapons> objWriter.WriteEndElement(); // <cyberwares> objWriter.WriteStartElement("cyberwares"); foreach (Cyberware objCyberware in _lstCyberware) { objCyberware.Print(objWriter); } // </cyberwares> objWriter.WriteEndElement(); // Load the Qualities file so we can figure out whether or not each Quality should be printed. objXmlDocument = XmlManager.Instance.Load("qualities.xml"); // <qualities> objWriter.WriteStartElement("qualities"); foreach (Quality objQuality in _lstQualities) { objQuality.Print(objWriter); } // </qualities> objWriter.WriteEndElement(); // <lifestyles> objWriter.WriteStartElement("lifestyles"); foreach (Lifestyle objLifestyle in _lstLifestyles) { objLifestyle.Print(objWriter); } // </lifestyles> objWriter.WriteEndElement(); // <gears> objWriter.WriteStartElement("gears"); foreach (Gear objGear in _lstGear) { // Use the Gear's SubClass if applicable. // if (objGear.GetType() == typeof(Commlink)) if (objGear.Category == "Commlinks" || objGear.Category == "Rigger Command Consoles" || objGear.Category == "Cyberdecks" || objGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(this); objCommlink = (Commlink)objGear; objCommlink.Print(objWriter); } else { objGear.Print(objWriter); } } // If the character is a Technomancer, write out the Living Persona "Commlink". if (_blnTechnomancerEnabled) { int intFirewall = _attWIL.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaFirewall); int intResponse = _attINT.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaResponse); int intSignal = Convert.ToInt32(Math.Ceiling((Convert.ToDecimal(_attRES.TotalValue, GlobalOptions.Instance.CultureInfo) / 2))) + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaSignal); int intSystem = _attLOG.TotalValue + _objImprovementManager.ValueOf(Improvement.ImprovementType.LivingPersonaSystem); // Make sure none of the Attributes exceed the Technomancer's RES. intFirewall = Math.Min(intFirewall, _attRES.TotalValue); intResponse = Math.Min(intResponse, _attRES.TotalValue); intSignal = Math.Min(intSignal, _attRES.TotalValue); intSystem = Math.Min(intSystem, _attRES.TotalValue); Commlink objLivingPersona = new Commlink(this); objLivingPersona.Name = LanguageManager.Instance.GetString("String_LivingPersona"); objLivingPersona.Category = LanguageManager.Instance.GetString("String_Commlink"); objLivingPersona.DeviceRating = _attRES.TotalValue; objLivingPersona.Attack = _attCHA.TotalValue; objLivingPersona.Sleaze = _attINT.TotalValue; objLivingPersona.DataProcessing = _attLOG.TotalValue; objLivingPersona.Firewall = _attWIL.TotalValue; objLivingPersona.Source = _objOptions.LanguageBookShort("SR5"); objLivingPersona.Page = "251"; objLivingPersona.IsLivingPersona = true; objLivingPersona.Print(objWriter); } // </gears> objWriter.WriteEndElement(); // <vehicles> objWriter.WriteStartElement("vehicles"); foreach (Vehicle objVehicle in _lstVehicles) { objVehicle.Print(objWriter); } // </vehicles> objWriter.WriteEndElement(); // <metamagics> objWriter.WriteStartElement("metamagics"); foreach (Metamagic objMetamagic in _lstMetamagics) { objMetamagic.Print(objWriter); } // </metamagics> objWriter.WriteEndElement(); // <arts> objWriter.WriteStartElement("arts"); foreach (Art objArt in _lstArts) { objArt.Print(objWriter); } // </arts> objWriter.WriteEndElement(); // <enhancements> objWriter.WriteStartElement("enhancements"); foreach (Enhancement objEnhancement in _lstEnhancements) { objEnhancement.Print(objWriter); } // </enhancements> objWriter.WriteEndElement(); // <critterpowers> objWriter.WriteStartElement("critterpowers"); foreach (CritterPower objPower in _lstCritterPowers) { objPower.Print(objWriter); } // </critterpowers> objWriter.WriteEndElement(); // <calendar> objWriter.WriteStartElement("calendar"); //_lstCalendar.Sort(); foreach (CalendarWeek objWeek in _lstCalendar) objWeek.Print(objWriter); // </expenses> objWriter.WriteEndElement(); // Print the Expense Log Entries if the option is enabled. if (_objOptions.PrintExpenses) { // <expenses> objWriter.WriteStartElement("expenses"); _lstExpenseLog.Sort(ExpenseLogEntry.CompareDate); foreach (ExpenseLogEntry objExpense in _lstExpenseLog) objExpense.Print(objWriter); // </expenses> objWriter.WriteEndElement(); } // </character> objWriter.WriteEndElement(); }
private void cmdGearMoveToVehicle_Click(object sender, EventArgs e) { frmSelectItem frmPickItem = new frmSelectItem(); frmPickItem.Vehicles = _objCharacter.Vehicles; frmPickItem.ShowDialog(this); if (frmPickItem.DialogResult == DialogResult.Cancel) return; // Locate the selected Vehicle. Vehicle objVehicle = new Vehicle(_objCharacter); foreach (Vehicle objCharacterVehicle in _objCharacter.Vehicles) { if (objCharacterVehicle.InternalId == frmPickItem.SelectedItem) { objVehicle = objCharacterVehicle; break; } } Gear objSelectedGear = _objFunctions.FindGear(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear); int intMove = 0; if (objSelectedGear.Quantity == 1) intMove = 1; else { frmSelectNumber frmPickNumber = new frmSelectNumber(); frmPickNumber.Minimum = 1; frmPickNumber.Maximum = objSelectedGear.Quantity; frmPickNumber.Description = LanguageManager.Instance.GetString("String_MoveGear"); frmPickNumber.ShowDialog(this); if (frmPickNumber.DialogResult == DialogResult.Cancel) return; intMove = frmPickNumber.SelectedValue; } // See if the Vehicle already has a matching piece of Gear. bool blnMatch = false; Gear objFoundGear = new Gear(_objCharacter); foreach (Gear objVehicleGear in objVehicle.Gear) { if (objVehicleGear.Name == objSelectedGear.Name && objVehicleGear.Category == objSelectedGear.Category && objVehicleGear.Rating == objSelectedGear.Rating && objVehicleGear.Extra == objSelectedGear.Extra && objVehicleGear.GearName == objSelectedGear.GearName && objVehicleGear.Notes == objSelectedGear.Notes) { blnMatch = true; objFoundGear = objVehicleGear; if (objVehicleGear.Children.Count == objSelectedGear.Children.Count) { for (int i = 0; i <= objVehicleGear.Children.Count - 1; i++) { if (objVehicleGear.Children[i].Name != objSelectedGear.Children[i].Name || objVehicleGear.Children[i].Extra != objSelectedGear.Children[i].Extra || objVehicleGear.Children[i].Rating != objSelectedGear.Children[i].Rating) { blnMatch = false; break; } } } else blnMatch = false; } } if (!blnMatch) { // Create a new piece of Gear. TreeNode objGearNode = new TreeNode(); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); Gear objGear = new Gear(_objCharacter); if (objSelectedGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Copy(objSelectedGear, objGearNode, lstWeapons, lstWeaponNodes); objGear = objCommlink; } else objGear.Copy(objSelectedGear, objGearNode, lstWeapons, lstWeaponNodes); objGear.Parent = null; objGear.Quantity = intMove; objGear.Location = string.Empty; objGearNode.Text = objGear.DisplayName; objGearNode.ContextMenuStrip = cmsVehicleGear; // Locate the Node for the selected Vehicle. TreeNode nodParent = new TreeNode(); foreach (TreeNode nodNode in treVehicles.Nodes[0].Nodes) { if (nodNode.Tag.ToString() == objVehicle.InternalId) { nodParent = nodNode; break; } } nodParent.Nodes.Add(objGearNode); objVehicle.Gear.Add(objGear); } else { // Everything matches up, so just increase the quantity. objFoundGear.Quantity += intMove; foreach (TreeNode nodVehicle in treVehicles.Nodes[0].Nodes) { if (nodVehicle.Tag.ToString() == objVehicle.InternalId) { foreach (TreeNode nodGear in nodVehicle.Nodes) { if (nodGear.Tag.ToString() == objFoundGear.InternalId) nodGear.Text = objFoundGear.DisplayName; } } } } // Update the selected item. objSelectedGear.Quantity -= intMove; if (objSelectedGear.Quantity == 0) { if (objSelectedGear.Parent != null) objSelectedGear.Parent.Children.Remove(objSelectedGear); else _objCharacter.Gear.Remove(objSelectedGear); _objFunctions.DeleteGear(objSelectedGear, treWeapons, _objImprovementManager); treGear.SelectedNode.Remove(); UpdateCharacterInfo(); } else { treGear.SelectedNode.Text = objSelectedGear.DisplayName; } _blnIsDirty = true; UpdateWindowTitle(); }
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(); }
private void cmdGearSplitQty_Click(object sender, EventArgs e) { // This can only be done with the first level of Nodes. try { if (treGear.SelectedNode.Level != 1) return; } catch { return; } Gear objSelectedGear = _objFunctions.FindGear(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear); // Cannot split a stack of 1 item. if (objSelectedGear.Quantity == 1) { MessageBox.Show(LanguageManager.Instance.GetString("Message_CannotSplitGear"), LanguageManager.Instance.GetString("MessageTitle_CannotSplitGear"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } frmSelectNumber frmPickNumber = new frmSelectNumber(); frmPickNumber.Minimum = 1; frmPickNumber.Maximum = objSelectedGear.Quantity - 1; frmPickNumber.Description = LanguageManager.Instance.GetString("String_SplitGear"); frmPickNumber.ShowDialog(this); if (frmPickNumber.DialogResult == DialogResult.Cancel) return; // Create a new piece of Gear. XmlDocument objXmlDocument = XmlManager.Instance.Load("gear.xml"); XmlNode objNode = objXmlDocument.SelectSingleNode("/chummer/gears/gear[name = \"" + objSelectedGear.Name + "\" and category = \"" + objSelectedGear.Category + "\"]"); TreeNode objGearNode = new TreeNode(); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); Gear objGear = new Gear(_objCharacter); if (objSelectedGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Copy(objSelectedGear, objGearNode, lstWeapons, lstWeaponNodes); objGear = objCommlink; } else objGear.Copy(objSelectedGear, objGearNode, lstWeapons, lstWeaponNodes); objGear.Quantity = frmPickNumber.SelectedValue; objGear.Equipped = objSelectedGear.Equipped; objGear.Location = objSelectedGear.Location; objGear.Notes = objSelectedGear.Notes; objGearNode.Text = objGear.DisplayName; objGearNode.ContextMenuStrip = treGear.SelectedNode.ContextMenuStrip; // Update the selected item. objSelectedGear.Quantity -= frmPickNumber.SelectedValue; treGear.SelectedNode.Text = objSelectedGear.DisplayName; treGear.SelectedNode.Parent.Nodes.Add(objGearNode); _objCharacter.Gear.Add(objGear); // Create any Weapons that came with this Gear. 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(); } _blnIsDirty = true; UpdateWindowTitle(); }
private void chkVehicleHomeNode_CheckedChanged(object sender, EventArgs e) { if (treVehicles.SelectedNode.Level == 1) { Vehicle objVehicle = _objFunctions.FindVehicle(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles); if (objVehicle == null) return; objVehicle.HomeNode = chkVehicleHomeNode.Checked; } else { Commlink objGear = new Commlink(_objCharacter); Vehicle objSelectedVehicle = new Vehicle(_objCharacter); objGear = (Commlink)_objFunctions.FindVehicleGear(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, out objSelectedVehicle); objGear.HomeNode = chkVehicleHomeNode.Checked; } _objFunctions.ReplaceHomeNodes(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Gear, _objCharacter.Vehicles); RefreshSelectedVehicle(); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); }
private void cmdVehicleMoveToInventory_Click(object sender, EventArgs e) { // Locate the selected Weapon. bool blnFound = false; Weapon objWeapon = new Weapon(_objCharacter); Vehicle objVehicle = new Vehicle(_objCharacter); VehicleMod objMod = new VehicleMod(_objCharacter); foreach (Vehicle objCharacterVehicle in _objCharacter.Vehicles) { foreach (Weapon objVehicleWeapon in objCharacterVehicle.Weapons) { if (objVehicleWeapon.InternalId == treVehicles.SelectedNode.Tag.ToString()) { objWeapon = objVehicleWeapon; objVehicle = objCharacterVehicle; blnFound = true; break; } } foreach (VehicleMod objVehicleMod in objCharacterVehicle.Mods) { foreach (Weapon objVehicleWeapon in objVehicleMod.Weapons) { if (objVehicleWeapon.InternalId == treVehicles.SelectedNode.Tag.ToString()) { objWeapon = objVehicleWeapon; objVehicle = objCharacterVehicle; objMod = objVehicleMod; blnFound = true; break; } } } } if (blnFound){ // Move the Weapons from the Vehicle Mod (or Vehicle) to the character. if (objMod.InternalId != Guid.Empty.ToString()) objMod.Weapons.Remove(objWeapon); else objVehicle.Weapons.Remove(objWeapon); _objCharacter.Weapons.Add(objWeapon); TreeNode objNode = new TreeNode(); objNode = treVehicles.SelectedNode; treVehicles.SelectedNode.Remove(); treWeapons.Nodes[0].Nodes.Add(objNode); objWeapon.VehicleMounted = false; objNode.Expand(); } else { // Locate the selected Gear. Vehicle objSelectedVehicle = new Vehicle(_objCharacter); Gear objSelectedGear = _objFunctions.FindVehicleGear(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, out objSelectedVehicle); int intMove = 0; if (objSelectedGear.Quantity == 1) intMove = 1; else { frmSelectNumber frmPickNumber = new frmSelectNumber(); frmPickNumber.Minimum = 1; frmPickNumber.Maximum = objSelectedGear.Quantity; frmPickNumber.Description = LanguageManager.Instance.GetString("String_MoveGear"); frmPickNumber.ShowDialog(this); if (frmPickNumber.DialogResult == DialogResult.Cancel) return; intMove = frmPickNumber.SelectedValue; } // See if the character already has a matching piece of Gear. bool blnMatch = false; Gear objFoundGear = new Gear(_objCharacter); foreach (Gear objCharacterGear in _objCharacter.Gear) { if (objCharacterGear.Name == objSelectedGear.Name && objCharacterGear.Category == objSelectedGear.Category && objCharacterGear.Rating == objSelectedGear.Rating && objCharacterGear.Extra == objSelectedGear.Extra && objCharacterGear.GearName == objSelectedGear.GearName && objCharacterGear.Notes == objSelectedGear.Notes) { blnMatch = true; objFoundGear = objCharacterGear; if (objCharacterGear.Children.Count == objSelectedGear.Children.Count) { for (int i = 0; i <= objCharacterGear.Children.Count - 1; i++) { if (objCharacterGear.Children[i].Name != objSelectedGear.Children[i].Name || objCharacterGear.Children[i].Extra != objSelectedGear.Children[i].Extra || objCharacterGear.Children[i].Rating != objSelectedGear.Children[i].Rating) { blnMatch = false; break; } } } else blnMatch = false; } } if (!blnMatch) { // Create a new piece of Gear. TreeNode objGearNode = new TreeNode(); List<Weapon> lstWeapons = new List<Weapon>(); List<TreeNode> lstWeaponNodes = new List<TreeNode>(); Gear objGear = new Gear(_objCharacter); if (objSelectedGear.GetType() == typeof(Commlink)) { Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Copy(objSelectedGear, objGearNode, lstWeapons, lstWeaponNodes); objGear = objCommlink; } else objGear.Copy(objSelectedGear, objGearNode, lstWeapons, lstWeaponNodes); objGear.Parent = null; objGear.Quantity = intMove; objGearNode.Text = objGear.DisplayName; objGearNode.ContextMenuStrip = cmsGear; treGear.Nodes[0].Nodes.Add(objGearNode); _objCharacter.Gear.Add(objGear); // Create any Weapons that came with this Gear. foreach (Weapon objGearWeapon in lstWeapons) _objCharacter.Weapons.Add(objGearWeapon); foreach (TreeNode objWeaponNode in lstWeaponNodes) { objWeaponNode.ContextMenuStrip = cmsWeapon; treWeapons.Nodes[0].Nodes.Add(objWeaponNode); treWeapons.Nodes[0].Expand(); } AddGearImprovements(objGear); UpdateCharacterInfo(); } else { // Everything matches up, so just increase the quantity. objFoundGear.Quantity += intMove; foreach (TreeNode nodGear in treGear.Nodes[0].Nodes) { if (nodGear.Tag.ToString() == objFoundGear.InternalId) nodGear.Text = objFoundGear.DisplayName; } } // Update the selected item. objSelectedGear.Quantity -= intMove; if (objSelectedGear.Quantity == 0) { // The quantity has reached 0, so remove it entirely. treVehicles.SelectedNode.Remove(); foreach (Vehicle objCharacterVehicle in _objCharacter.Vehicles) objCharacterVehicle.Gear.Remove(objSelectedGear); } else treVehicles.SelectedNode.Text = objSelectedGear.DisplayName; } _blnIsDirty = true; UpdateWindowTitle(); }
/// <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 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> /// 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(); } }
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 mnuEditPaste_Click(object sender, EventArgs e) { if (tabCharacterTabs.SelectedTab == tabStreetGear) { // Lifestyle Tab. if (tabStreetGearTabs.SelectedTab == tabLifestyle) { // Paste Lifestyle. Lifestyle objLifestyle = new Lifestyle(_objCharacter); XmlNode objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/lifestyle"); if (objXmlNode != null) { objLifestyle.Load(objXmlNode, true); // Reset the number of months back to 1 since 0 isn't valid in Create Mode. objLifestyle.Months = 1; _objCharacter.Lifestyles.Add(objLifestyle); TreeNode objLifestyleNode = new TreeNode(); objLifestyleNode.Text = objLifestyle.DisplayName; objLifestyleNode.Tag = objLifestyle.InternalId; if (objLifestyle.StyleType.ToString() != "Standard") objLifestyleNode.ContextMenuStrip = cmsAdvancedLifestyle; else objLifestyleNode.ContextMenuStrip = cmsLifestyleNotes; if (objLifestyle.Notes != string.Empty) objLifestyleNode.ForeColor = Color.SaddleBrown; objLifestyleNode.ToolTipText = CommonFunctions.WordWrap(objLifestyle.Notes, 100); treLifestyles.Nodes[0].Nodes.Add(objLifestyleNode); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } } // Armor Tab. if (tabStreetGearTabs.SelectedTab == tabArmor) { // Paste Armor. Armor objArmor = new Armor(_objCharacter); XmlNode objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/armor"); if (objXmlNode != null) { objArmor.Load(objXmlNode, true); _objCharacter.Armor.Add(objArmor); _objFunctions.CreateArmorTreeNode(objArmor, treArmor, cmsArmor, cmsArmorMod, cmsArmorGear); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } // Paste Gear. Gear objGear = new Gear(_objCharacter); objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/gear"); if (objXmlNode != null) { switch (objXmlNode["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Load(objXmlNode, true); objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Load(objXmlNode, true); objGear = objNewGear; break; } foreach (Armor objCharacterArmor in _objCharacter.Armor) { if (objCharacterArmor.InternalId == treArmor.SelectedNode.Tag.ToString()) { objCharacterArmor.Gear.Add(objGear); TreeNode objNode = new TreeNode(); objNode.Text = objGear.DisplayName; objNode.Tag = objGear.InternalId; objNode.ContextMenuStrip = cmsArmorGear; _objFunctions.BuildGearTree(objGear, objNode, cmsArmorGear); treArmor.SelectedNode.Nodes.Add(objNode); treArmor.SelectedNode.Expand(); } } // Add any Weapons that come with the Gear. objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/weapon"); if (objXmlNode != null) { Weapon objWeapon = new Weapon(_objCharacter); objWeapon.Load(objXmlNode, true); _objCharacter.Weapons.Add(objWeapon); objGear.WeaponID = objWeapon.InternalId; _objFunctions.CreateWeaponTreeNode(objWeapon, treWeapons.Nodes[0], cmsWeapon, cmsWeaponMod, cmsWeaponAccessory, cmsWeaponAccessoryGear); } UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } } // Weapons Tab. if (tabStreetGearTabs.SelectedTab == tabWeapons) { // Paste Gear into a Weapon Accessory. Gear objGear = new Gear(_objCharacter); XmlNode objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/gear"); if (objXmlNode != null) { switch (objXmlNode["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Load(objXmlNode, true); objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Load(objXmlNode, true); objGear = objNewGear; break; } objGear.Parent = null; // Make sure that a Weapon Accessory is selected and that it allows Gear of the item's Category. WeaponAccessory objAccessory = _objFunctions.FindWeaponAccessory(treWeapons.SelectedNode.Tag.ToString(), _objCharacter.Weapons); bool blnAllowPaste = false; if (objAccessory.AllowGear != null) { foreach (XmlNode objAllowed in objAccessory.AllowGear.SelectNodes("gearcategory")) { if (objAllowed.InnerText == objGear.Category) { blnAllowPaste = true; break; } } } if (blnAllowPaste) { objAccessory.Gear.Add(objGear); TreeNode objNode = new TreeNode(); objNode.Text = objGear.DisplayName; objNode.Tag = objGear.InternalId; objNode.ContextMenuStrip = cmsWeaponAccessoryGear; _objFunctions.BuildGearTree(objGear, objNode, cmsWeaponAccessoryGear); treWeapons.SelectedNode.Nodes.Add(objNode); treWeapons.SelectedNode.Expand(); // Add any Weapons that come with the Gear. objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/weapon"); if (objXmlNode != null) { Weapon objGearWeapon = new Weapon(_objCharacter); objGearWeapon.Load(objXmlNode, true); _objCharacter.Weapons.Add(objGearWeapon); objGear.WeaponID = objGearWeapon.InternalId; _objFunctions.CreateWeaponTreeNode(objGearWeapon, treWeapons.Nodes[0], cmsWeapon, cmsWeaponMod, cmsWeaponAccessory, cmsWeaponAccessoryGear); } UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } } // Paste Weapon. Weapon objWeapon = new Weapon(_objCharacter); objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/weapon"); if (objXmlNode != null) { objWeapon.Load(objXmlNode, true); objWeapon.VehicleMounted = false; _objCharacter.Weapons.Add(objWeapon); _objFunctions.CreateWeaponTreeNode(objWeapon, treWeapons.Nodes[0], cmsWeapon, cmsWeaponMod, cmsWeaponAccessory, cmsWeaponAccessoryGear); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } } // Gear Tab. if (tabStreetGearTabs.SelectedTab == tabGear) { // Paste Gear. Gear objGear = new Gear(_objCharacter); XmlNode objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/gear"); if (objXmlNode != null) { switch (objXmlNode["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Load(objXmlNode, true); _objCharacter.Gear.Add(objCommlink); objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Load(objXmlNode, true); _objCharacter.Gear.Add(objNewGear); objGear = objNewGear; break; } objGear.Parent = null; TreeNode objNode = new TreeNode(); objNode.Text = objGear.DisplayName; objNode.Tag = objGear.InternalId; if (objGear.Notes != string.Empty) objNode.ForeColor = Color.SaddleBrown; objNode.ToolTipText = CommonFunctions.WordWrap(objGear.Notes, 100); _objFunctions.BuildGearTree(objGear, objNode, cmsGear); objNode.ContextMenuStrip = cmsGear; TreeNode objParent = new TreeNode(); if (objGear.Location == "") objParent = treGear.Nodes[0]; else { foreach (TreeNode objFind in treGear.Nodes) { if (objFind.Text == objGear.Location) { objParent = objFind; break; } } } objParent.Nodes.Add(objNode); objParent.Expand(); // Add any Weapons that come with the Gear. objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/weapon"); if (objXmlNode != null) { Weapon objWeapon = new Weapon(_objCharacter); objWeapon.Load(objXmlNode, true); _objCharacter.Weapons.Add(objWeapon); objGear.WeaponID = objWeapon.InternalId; _objFunctions.CreateWeaponTreeNode(objWeapon, treWeapons.Nodes[0], cmsWeapon, cmsWeaponMod, cmsWeaponAccessory, cmsWeaponAccessoryGear); } UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } } } // Vehicles Tab. if (tabCharacterTabs.SelectedTab == tabVehicles) { // Paste Vehicle. Vehicle objVehicle = new Vehicle(_objCharacter); XmlNode objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/vehicle"); if (objXmlNode != null) { objVehicle.Load(objXmlNode, true); _objCharacter.Vehicles.Add(objVehicle); _objFunctions.CreateVehicleTreeNode(objVehicle, treVehicles, cmsVehicle, cmsVehicleLocation, cmsVehicleWeapon, cmsVehicleWeaponMod, cmsVehicleWeaponAccessory, cmsVehicleWeaponAccessoryGear, cmsVehicleGear); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } // Paste Gear. Gear objGear = new Gear(_objCharacter); objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/gear"); if (objXmlNode != null) { switch (objXmlNode["category"].InnerText) { case "Commlinks": case "Cyberdecks": case "Rigger Command Consoles": Commlink objCommlink = new Commlink(_objCharacter); objCommlink.Load(objXmlNode, true); objGear = objCommlink; break; default: Gear objNewGear = new Gear(_objCharacter); objNewGear.Load(objXmlNode, true); objGear = objNewGear; break; } // Paste the Gear into a Vehicle. foreach (Vehicle objCharacterVehicle in _objCharacter.Vehicles) { if (objCharacterVehicle.InternalId == treVehicles.SelectedNode.Tag.ToString()) { objCharacterVehicle.Gear.Add(objGear); TreeNode objNode = new TreeNode(); objNode.Text = objGear.DisplayName; objNode.Tag = objGear.InternalId; objNode.ContextMenuStrip = cmsVehicleGear; objVehicle = objCharacterVehicle; _objFunctions.BuildGearTree(objGear, objNode, cmsVehicleGear); treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); } } // Paste the Gear into a Vehicle's Gear. Vehicle objTempVehicle = objVehicle; Gear objVehicleGear = _objFunctions.FindVehicleGear(treVehicles.SelectedNode.Tag.ToString(), _objCharacter.Vehicles, out objVehicle); if (objVehicle == null) objVehicle = objTempVehicle; if (objVehicleGear != null) { objVehicleGear.Children.Add(objGear); objGear.Parent = objVehicleGear; TreeNode objNode = new TreeNode(); objNode.Text = objGear.DisplayName; objNode.Tag = objGear.InternalId; objNode.ContextMenuStrip = cmsVehicleGear; _objFunctions.BuildGearTree(objGear, objNode, cmsVehicleGear); treVehicles.SelectedNode.Nodes.Add(objNode); treVehicles.SelectedNode.Expand(); } UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } // Paste Weapon. Weapon objWeapon = new Weapon(_objCharacter); objXmlNode = GlobalOptions.Instance.Clipboard.SelectSingleNode("/character/weapon"); if (objXmlNode != null) { objWeapon.Load(objXmlNode, true); objWeapon.VehicleMounted = true; try { // Weapons can only be added to Vehicle Mods that support them (Weapon Mounts and Mechanical Arms). VehicleMod objMod = new VehicleMod(_objCharacter); foreach (Vehicle objCharacterVehicle in _objCharacter.Vehicles) { foreach (VehicleMod objVehicleMod in objCharacterVehicle.Mods) { if (objVehicleMod.InternalId == treVehicles.SelectedNode.Tag.ToString()) { if (objVehicleMod.Name.StartsWith("Weapon Mount") || objVehicleMod.Name.StartsWith("Heavy Weapon Mount") || objVehicleMod.Name.StartsWith("Mechanical Arm")) { objVehicleMod.Weapons.Add(objWeapon); _objFunctions.CreateWeaponTreeNode(objWeapon, treVehicles.SelectedNode, cmsVehicleWeapon, cmsVehicleWeaponMod, cmsVehicleWeaponAccessory, null); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); return; } } } } } catch { } } } }
private void chkGearHomeNode_CheckedChanged(object sender, EventArgs e) { Commlink objGear = new Commlink(_objCharacter); objGear = (Commlink)_objFunctions.FindEquipment(treGear.SelectedNode.Tag.ToString(), _objCharacter.Gear, typeof(Commlink)); objGear.HomeNode = chkGearHomeNode.Checked; RefreshSelectedGear(); UpdateCharacterInfo(); _blnIsDirty = true; UpdateWindowTitle(); }
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(); }
/// <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); } }