コード例 #1
0
        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);
        }
コード例 #2
0
        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>());
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
 public static string ToHandle(this ImportCharacter import)
 {
     return(String.Format("* {0} ({1}{2})", import.Name, import.SafeGetRuleNameByType("Class"), import.Level));
 }