public static ExportMonster ToMonster(this ImportMonster import)
        {
            var export = new ExportMonster()
            {
                AbilityScores = import.AbilityScores.ToDictionary(),
                ActionPoints  = import.ActionPoints.Value,
                Alignment     = import.Alignment.Name.ToAlignment(),
                CompendiumUrl = import.CompendiumUrl,
                Defenses      = import.Defenses.ToDictionary(),
                Description   = import.Description,
                Experience    = import.Experience.Value,
                GroupRole     = import.GroupRole.Name,
                Handle        = import.ToHandle(),
                HitPoints     = import.HitPoints.Value,
                Immunities    = import.Immunities.Count != 0 ? import.Immunities.Select(r => r.Name).ToList() : null,
                Initiative    = import.Initiative.Value,
                IsLeader      = import.IsLeader,
                Items         = import.Items.Count != 0 ? import.Items.Select(i => new KeyValuePair <string, int>(i.Item.Name, i.Quantity)).ToList() : null,
                Keywords      = import.Keywords.Count != 0 ? import.Keywords.Select(r => r.Name).ToList() : null,
                OtherSpeeds   = import.Speeds.Count != 0 ? import.Speeds.Select(s => (s.ToString() ?? String.Empty).Trim()).ToList() : null,
                Languages     = import.Languages.Count != 0 ? import.Languages.Select(r => r.Name).ToList() : null,
                Level         = import.Level,
                Name          = import.Name,
                Origin        = import.Origin.Name,
                Phasing       = import.Phasing,
                Powers        = import.Powers.Select(p => p.ToExportPower()).ToList(),
                Race          = import.Race.Name,
                Regeneration  = new ExportRegeneration()
                {
                    Value = import.Regeneration.Value, Details = import.Regeneration.Details
                },
                Resistances  = import.Resistances.Count != 0 ? import.Resistances.Select(r => r.ToString()).ToList() : null,
                Role         = import.Role.Name,
                SavingThrows = import.SavingThrows.Count > 0 ? import.SavingThrows[0].Value : 0,
                Senses       = import.Senses.Count != 0 ? import.Senses.Select(s => new KeyValuePair <string, int>(s.Name, s.Range)).ToList() : null,
                Skills       = import.Skills.ToDictionary(),
                Size         = import.Size.Name,
                SourceBook   = import.SourceBook.Name,
                Speed        = import.LandSpeed.Value,
                Tactics      = (import.Tactics ?? String.Empty).FixWhitespace(),
                Traits       = import.Traits.ToExportTraitList(),
                Type         = import.Type.Name,
                Weaknesses   = import.Weaknesses.Count != 0 ? import.Weaknesses.Select(r => r.ToString()).ToList() : null,
            };

            return(export);
        }
        public static string ToHandle(this ImportMonster import)
        {
            var handle = new StringBuilder();

            handle.AppendFormat(
                "{0} ({1}{2}",
                import.Name,
                import.Role.Name.Substring(0, 2),
                import.Level
                );
            if (!String.IsNullOrWhiteSpace(import.GroupRole.Name))
            {
                handle.AppendFormat("{0}", import.GroupRole.Name.Substring(0, 1));
            }
            handle.Append(")");

            return(handle.ToString());
        }
 public static bool TryCreateFromFile(string path, out Monster monster)
 {
     using (var fs = new FileStream(path, FileMode.Open)) {
         using (var xml = new XmlTextReader(fs)) {
             XmlSerializer serializer = new XmlSerializer(typeof(Monster));
             if (serializer.CanDeserialize(xml)) {
                 monster = serializer.Deserialize(xml) as Monster;
                 return true;
             }
             else {
                 monster = null;
                 return false;
             }
         }
     }
 }