コード例 #1
0
ファイル: clsCharacter.cs プロジェクト: Nebual/chummer
        /// <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();
        }