/// <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(); }