internal static async Task <Character> LoadFromFileAsync(string filename, Rules rules) { Character character = null; Stopwatch timer = Stopwatch.StartNew(); try { string xmlString; using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, useAsync: true)) { using (var reader = new StreamReader(file)) { xmlString = await reader.ReadToEndAsync(); } } // cleanup campaign settings // CBuilder sometimes seems to insert invalid XML values? var endStr = "</D20CampaignSetting>"; int start = xmlString.IndexOf("<D20CampaignSetting"); int end = xmlString.IndexOf(endStr) + endStr.Length; if (start != -1 && end != -1 && start < end) { xmlString = xmlString.Remove(start, end - start + 1); } ImportCharacter import = await xmlString.DeserializeXmlAsync <ImportCharacter>(); character = import.ToCharacter(rules); } finally { timer.Stop(); Trace.TraceInformation("Deserializing Character [{0}] from CB took {1}ms", Path.GetFileName(filename), timer.ElapsedMilliseconds); } return(character); }
private static List <string> ToRuleNamesList(this ImportCharacter import, string ruleType) { Dictionary <string, List <Rule> > rules; if (import.Sheet.Rules.ByType().TryGetValue(ruleType, out rules) && rules.Keys.Count > 0) { return(rules.Keys.ToList()); } return(new List <string>()); }
private static string SafeGetRuleNameByType(this ImportCharacter import, string ruleType) { Dictionary <string, List <Rule> > rules; var output = String.Empty; if (import.Sheet.Rules.ByType().TryGetValue(ruleType, out rules) && rules.Count == 1) { output = rules.Keys.First(); } return(output); }
private static Dictionary <Skill, ExportSkillValue> ToSkills(this ImportCharacter character) { var output = new Dictionary <Skill, ExportSkillValue>(); var skills = character.Skills; for (int i = 1; i <= 17; ++i) { var skill = (Skill)i; var trained = skill.ToString() + " Trained"; var value = new ExportSkillValue() { Value = skills[(Skill)i], IsTrained = character.Sheet.Stats[trained] != 0 }; output[(Skill)i] = value; } return(output); }
public static ExportCharacter ToCharacter(this ImportCharacter import, Rules d20Rules) { Rules rules = d20Rules ?? import.Sheet.Rules; var export = new ExportCharacter(); export.AbilityScores = import.AbilityScores.ToDictionary(); export.ActionPoints = import.Sheet.Stats["_BaseActionPoints"]; export.Alignment = import.SafeGetRuleNameByType("Alignment").ToAlignment(); export.Class = import.SafeGetRuleNameByType("Class"); export.ClassFeatures = import.Sheet.Rules.ByType()["Class Feature"].ToFeats(rules); export.Defenses = import.Defenses.ToDictionary(); export.Experience = import.Sheet.Details.Experience.SafeToInt(); export.Feats = import.Sheet.Rules.ByType()["Feat"].ToFeats(rules); export.Gender = import.SafeGetRuleNameByType("Gender"); export.Handle = import.ToHandle(); export.HealingSurges = import.HealingSurges; export.HitPoints = import.HitPoints; export.Initiative = import.Initiative; export.Items = import.Items.ToItems(rules); export.Languages = import.ToRuleNamesList("Language"); export.Level = import.Level; export.Name = import.Name; export.PassiveInsight = import.PassiveInsight; export.PassivePerception = import.PassivePerception; export.Powers = import.Powers.ToPowers(import.Sheet.Rules, rules); export.PowerSource = import.SafeGetRuleNameByType("Power Source"); export.Race = import.SafeGetRuleNameByType("Race"); export.RacialTraits = import.Sheet.Rules.ByType()["Racial Trait"].ToFeats(rules); export.Role = import.SafeGetRuleNameByType("Role"); export.Skills = import.ToSkills(); export.Size = import.SafeGetRuleNameByType("Size"); export.Speed = import.Sheet.Stats["Speed"].Value; export.Vision = import.SafeGetRuleNameByType("Vision"); return(export); }
public static string ToHandle(this ImportCharacter import) { return(String.Format("* {0} ({1}{2})", import.Name, import.SafeGetRuleNameByType("Class"), import.Level)); }