/// <summary>
        /// Adds custom talents to the talents list if enabled
        /// </summary>
        private static void AddCustomTalents(CharacterModel character)
        {
            if (SimpleIoc.Default.GetInstance <SettingsViewModel>().Setting.AdditionalTrials)
            {
                if (character.Talentliste != null)
                {
                    // Heimlichkeit
                    if (character.Talentliste.Any(t => t.Name == "Sinnenschärfe") &&
                        character.Talentliste.Any(t => t.Name == "Sich verstecken") &&
                        character.Talentliste.Any(t => t.Name == "Schleichen"))
                    {
                        var schleichen     = character.Talentliste.Single(t => t.Name == "Schleichen").Value;
                        var sichverstecken = character.Talentliste.Single(t => t.Name == "Sich verstecken").Value;
                        var sinnenschaerfe = character.Talentliste.Single(t => t.Name == "Sinnenschärfe").Value;

                        int talentValue = (int)Math.Round(((double)(sinnenschaerfe + sichverstecken + schleichen) / 3), 0, MidpointRounding.AwayFromZero);
                        var maxValue = new int[] { sinnenschaerfe * 2, sichverstecken * 2, schleichen * 2 }.Min();

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Heimlichkeit",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Mut,
                                Attribut2 = AttributType.Intuition,
                                Attribut3 = AttributType.Gewandtheit
                            },
                            Value  = new int[] { talentValue, maxValue }.Min(),
                            Gruppe = TalentGruppe.Custom
                        });
                    }

                    // Traumkontrolle
                    if (character.Talentliste.Any(t => t.Name == "Orientierung") &&
                        character.Talentliste.Any(t => t.Name == "Sinnenschärfe") &&
                        character.Talentliste.Any(t => t.Name == "Selbstbeherrschung"))
                    {
                        var orientierung       = character.Talentliste.Single(t => t.Name == "Orientierung").Value;
                        var selbstbeherrschung = character.Talentliste.Single(t => t.Name == "Selbstbeherrschung").Value;
                        var sinnenschaerfe     = character.Talentliste.Single(t => t.Name == "Sinnenschärfe").Value;

                        int talentValue = (int)Math.Round(((double)(orientierung + (sinnenschaerfe * 2) + (selbstbeherrschung * 3)) / 6), 0, MidpointRounding.AwayFromZero);
                        var maxValue = new int[] { orientierung * 2, sinnenschaerfe * 2, selbstbeherrschung * 2 }.Min();

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Traumkontrolle",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Mut,
                                Attribut2 = AttributType.Mut,
                                Attribut3 = AttributType.Intuition
                            },
                            Value  = new int[] { talentValue, maxValue }.Min(),
                            Gruppe = TalentGruppe.Meta
                        });
                    }

                    // Sinnenschärfe FF + KL
                    if (character.Talentliste.Any(t => t.Name == "Sinnenschärfe"))
                    {
                        Talent talent = character.Talentliste.Single(t => t.Name == "Sinnenschärfe");

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Sinnenschärfe FF",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Klugheit,
                                Attribut2 = AttributType.Intuition,
                                Attribut3 = AttributType.Fingerfertigkeit
                            },
                            Value  = talent.Value,
                            Gruppe = TalentGruppe.Koerper
                        });

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Sinnenschärfe KL",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Klugheit,
                                Attribut2 = AttributType.Intuition,
                                Attribut3 = AttributType.Klugheit
                            },
                            Value  = talent.Value,
                            Gruppe = TalentGruppe.Koerper
                        });
                    }

                    // Fährtensuchen IN
                    if (character.Talentliste.Any(t => t.Name == "Fährtensuchen"))
                    {
                        Talent talent = character.Talentliste.Single(t => t.Name == "Fährtensuchen");

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Fährtensuchen IN",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Klugheit,
                                Attribut2 = AttributType.Intuition,
                                Attribut3 = AttributType.Intuition
                            },
                            Value  = talent.Value,
                            Gruppe = TalentGruppe.Natur
                        });
                    }

                    // Geistiger Widerstand
                    if (character.Talentliste.Any(t => t.Name == "Selbstbeherrschung"))
                    {
                        Talent talent = character.Talentliste.Single(t => t.Name == "Selbstbeherrschung");

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Geistiger Widerstand",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Mut,
                                Attribut2 = AttributType.Mut,
                                Attribut3 = AttributType.Klugheit
                            },
                            Value  = talent.Value,
                            Gruppe = TalentGruppe.Wissen
                        });
                    }

                    // Ausdauern klettern
                    if (character.Talentliste.Any(t => t.Name == "Klettern"))
                    {
                        Talent talent = character.Talentliste.Single(t => t.Name == "Klettern");

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Ausdauern klettern",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Mut,
                                Attribut2 = AttributType.Gewandtheit,
                                Attribut3 = AttributType.Konstitution
                            },
                            Value  = talent.Value,
                            Gruppe = TalentGruppe.Koerper
                        });
                    }

                    // Langlauf
                    if (character.Talentliste.Any(t => t.Name == "Athletik"))
                    {
                        Talent talent = character.Talentliste.Single(t => t.Name == "Athletik");

                        character.Talentliste.Add(new Talent
                        {
                            Name  = "Langlauf",
                            Probe = new Probe
                            {
                                Attribut1 = AttributType.Gewandtheit,
                                Attribut2 = AttributType.Konstitution,
                                Attribut3 = AttributType.Konstitution
                            },
                            Value  = talent.Value,
                            Gruppe = TalentGruppe.Koerper
                        });
                    }
                }
            }
        }
        /// <summary>
        /// convert a given character xml document to a CharacterModel object
        /// </summary>
        /// <param name="doc"></param>
        /// <returns></returns>
        private static CharacterModel XmlToCharacterModel(XDocument doc)
        {
            CharacterModel character =
                (
                    from e in doc.Root.Elements("held")
                    select new CharacterModel
            {
                Name = (string)e.Attribute("name"),
                Stand = (string)e.Attribute("stand"),
                Id = (string)e.Attribute("key"),
                Ausbildungen = new ObservableCollection <Ausbildung>(
                    (
                        from ausbildung in e.Elements("basis").Elements("ausbildungen").Elements("ausbildung")
                        select new Ausbildung
                {
                    Art = (string)ausbildung.Attribute("art"),
                    Name = (string)ausbildung.Attribute("string"),
                    Tarnidentitaet = (string)ausbildung.Attribute("tarnidentitaet")
                }).ToList()),
                Attribute = new ObservableCollection <Attribut>(
                    (
                        from attribut in e.Elements("eigenschaften").Elements("eigenschaft")
                        select new Attribut
                {
                    Name = (string)attribut.Attribute("name"),
                    Value = (int)attribut.Attribute("value"),
                    Mod = (int)attribut.Attribute("mod"),
                    Type = MapStringToAttributType((string)attribut.Attribute("name"))
                }).ToList()),
                Vorteile = new ObservableCollection <Vorteil>(
                    (
                        from vorteil in e.Elements("vt").Elements("vorteil")
                        select new Vorteil
                {
                    Name = (string)vorteil.Attribute("name"),
                    Value = (string)vorteil.Attribute("value"),
                    Auswahl =
                        (
                            from auswahl in vorteil.Elements("auswahl")
                            select new Auswahl
                    {
                        Name = (string)auswahl.Attribute("name"),
                        Value = (string)auswahl.Attribute("value")
                    }).ToArray(),
                }).ToList()),
                Sonderfertigkeiten = new ObservableCollection <Sonderfertigkeit>(
                    (
                        from sonderfertigkeit in e.Elements("sf").Elements("sonderfertigkeit")
                        select new Sonderfertigkeit
                {
                    Name = (string)sonderfertigkeit.Attribute("name")
                }).ToList()),
                Talentliste = new ObservableCollection <Talent>(
                    (
                        from talent in e.Elements("talentliste").Elements("talent")
                        select new Talent
                {
                    Name = (string)talent.Attribute("name"),
                    Value = (int)talent.Attribute("value"),
                    Probe = MapStringToProbe((string)talent.Attribute("probe")),
                    Behinderungsfaktor = (string)talent.Attribute("be"),
                    Gruppe = MapStringToTalentGruppe((string)talent.Attribute("name"))
                }).ToList()),
                Zauberliste = new ObservableCollection <Zauber>(
                    (
                        from zauber in e.Elements("zauberliste").Elements("zauber")
                        select new Zauber
                {
                    Name = (string)zauber.Attribute("name"),
                    Value = (int)zauber.Attribute("value"),
                    Probe = MapStringToProbe((string)zauber.Attribute("probe"))
                }).ToList()),
                Ausruestung = new ObservableCollection <Heldenausruestung>(
                    (
                        from heldenausruestung in e.Elements("ausrüstungen").Elements("heldenausruestung")
                        select new Heldenausruestung
                {
                    Name = (string)heldenausruestung.Attribute("name"),
                    Set = (string)heldenausruestung.Attribute("set"),
                    Slot = (string)heldenausruestung.Attribute("slot"),
                    Nummer = (string)heldenausruestung.Attribute("nummer"),
                    Talent = (string)heldenausruestung.Attribute("talent"),
                    Waffenname = (string)heldenausruestung.Attribute("waffenname"),
                }).ToList()),
            }).First();

            FindJagdwaffenTaW(character);
            AddMetaTalents(character);
            AddCustomTalents(character);
            CalcSuccessChances(character);

            //#if DEBUG
            //            Directory.CreateDirectory(@"c:\temp\");
            //            var path = $@"c:\temp\{character.Name}.xml";
            //            doc.Save(path);
            //#endif

            return(character);
        }
        /// <summary>
        /// Adds meta talents to the talents list
        /// </summary>
        private static void AddMetaTalents(CharacterModel character)
        {
            if (character.Talentliste != null)
            {
                // Ansitzjagd
                if (character.Talentliste.Any(t => t.Name == "Wildnisleben") &&
                    character.Talentliste.Any(t => t.Name == "Tierkunde") &&
                    character.Talentliste.Any(t => t.Name == "Fährtensuchen") &&
                    character.Talentliste.Any(t => t.Name == "Sich verstecken"))
                {
                    var faehrtensuchen = character.Talentliste.Single(t => t.Name == "Fährtensuchen").Value;
                    var sichverstecken = character.Talentliste.Single(t => t.Name == "Sich verstecken").Value;
                    var tierkunde      = character.Talentliste.Single(t => t.Name == "Tierkunde").Value;
                    var wildnisleben   = character.Talentliste.Single(t => t.Name == "Wildnisleben").Value;

                    int talentValue = (int)Math.Round(((double)(wildnisleben + tierkunde + faehrtensuchen + sichverstecken + character.JagdwaffenTaW) / 5), 0, MidpointRounding.AwayFromZero);
                    var maxValue = new int[] { wildnisleben * 2, tierkunde * 2, faehrtensuchen * 2, sichverstecken * 2 }.Min();

                    character.Talentliste.Add(new Talent
                    {
                        Name  = "Ansitzjagd",
                        Probe = new Probe
                        {
                            Attribut1 = AttributType.Mut,
                            Attribut2 = AttributType.Intuition,
                            Attribut3 = AttributType.Gewandtheit
                        },
                        Value  = new int[] { talentValue, maxValue }.Min(),
                        Gruppe = TalentGruppe.Meta
                    });
                }

                // Pirschjagd
                if (character.Talentliste.Any(t => t.Name == "Wildnisleben") &&
                    character.Talentliste.Any(t => t.Name == "Tierkunde") &&
                    character.Talentliste.Any(t => t.Name == "Fährtensuchen") &&
                    character.Talentliste.Any(t => t.Name == "Schleichen"))
                {
                    var faehrtensuchen = character.Talentliste.Single(t => t.Name == "Fährtensuchen").Value;
                    var schleichen     = character.Talentliste.Single(t => t.Name == "Schleichen").Value;
                    var tierkunde      = character.Talentliste.Single(t => t.Name == "Tierkunde").Value;
                    var wildnisleben   = character.Talentliste.Single(t => t.Name == "Wildnisleben").Value;

                    int talentValue = (int)Math.Round(((double)(wildnisleben + tierkunde + faehrtensuchen + schleichen + character.JagdwaffenTaW) / 5), 0, MidpointRounding.AwayFromZero);
                    var maxValue = new int[] { wildnisleben * 2, tierkunde * 2, faehrtensuchen * 2, schleichen * 2 }.Min();

                    character.Talentliste.Add(new Talent
                    {
                        Name  = "Pirschjagd",
                        Probe = new Probe
                        {
                            Attribut1 = AttributType.Mut,
                            Attribut2 = AttributType.Intuition,
                            Attribut3 = AttributType.Gewandtheit
                        },
                        Value  = new int[] { talentValue, maxValue }.Min(),
                        Gruppe = TalentGruppe.Meta
                    });
                }

                // Hetzjagd
                if (character.Talentliste.Any(t => t.Name == "Wildnisleben") &&
                    character.Talentliste.Any(t => t.Name == "Tierkunde") &&
                    character.Talentliste.Any(t => t.Name == "Reiten"))
                {
                    var reiten       = character.Talentliste.Single(t => t.Name == "Reiten").Value;
                    var tierkunde    = character.Talentliste.Single(t => t.Name == "Tierkunde").Value;
                    var wildnisleben = character.Talentliste.Single(t => t.Name == "Wildnisleben").Value;

                    int talentValue = (int)Math.Round(((double)(wildnisleben + tierkunde + (2 * reiten) + character.JagdwaffenTaW) / 5), 0, MidpointRounding.AwayFromZero);
                    var maxValue = new int[] { wildnisleben * 2, tierkunde * 2, reiten * 2 }.Min();

                    character.Talentliste.Add(new Talent
                    {
                        Name  = "Hetzjagd",
                        Probe = new Probe
                        {
                            Attribut1 = AttributType.Mut,
                            Attribut2 = AttributType.Intuition,
                            Attribut3 = AttributType.Gewandtheit
                        },
                        Value  = new int[] { talentValue, maxValue }.Min(),
                        Gruppe = TalentGruppe.Meta
                    });
                }

                // Häuserlauf
                // besitze keine der Quellen: https://de.wiki-aventurica.de/wiki/H%C3%A4userlauf

                // Traumreise
                // besitze keine der Quellen: https://de.wiki-aventurica.de/wiki/Traumreise

                // Kräuter Suchen + Nahrung Sammeln
                if (character.Talentliste.Any(t => t.Name == "Wildnisleben") &&
                    character.Talentliste.Any(t => t.Name == "Sinnenschärfe") &&
                    character.Talentliste.Any(t => t.Name == "Pflanzenkunde"))
                {
                    var pflanzenkunde  = character.Talentliste.Single(t => t.Name == "Pflanzenkunde").Value;
                    var sinnenschaerfe = character.Talentliste.Single(t => t.Name == "Sinnenschärfe").Value;
                    var wildnisleben   = character.Talentliste.Single(t => t.Name == "Wildnisleben").Value;

                    int talentValue = (int)Math.Round(((double)(wildnisleben + sinnenschaerfe + pflanzenkunde) / 3), 0, MidpointRounding.AwayFromZero);
                    var maxValue = new int[] { wildnisleben * 2, sinnenschaerfe * 2, pflanzenkunde * 2 }.Min();

                    character.Talentliste.Add(new Talent
                    {
                        Name  = "Kräuter suchen",
                        Probe = new Probe
                        {
                            Attribut1 = AttributType.Mut,
                            Attribut2 = AttributType.Intuition,
                            Attribut3 = AttributType.Fingerfertigkeit
                        },
                        Value  = new int[] { talentValue, maxValue }.Min(),
                        Gruppe = TalentGruppe.Meta
                    });

                    character.Talentliste.Add(new Talent
                    {
                        Name  = "Nahrung sammeln",
                        Probe = new Probe
                        {
                            Attribut1 = AttributType.Mut,
                            Attribut2 = AttributType.Intuition,
                            Attribut3 = AttributType.Fingerfertigkeit
                        },
                        Value  = new int[] { talentValue, maxValue }.Min(),
                        Gruppe = TalentGruppe.Meta
                    });
                }

                // Wassersuchen
                // Besitze keine der Quellen: https://de.wiki-aventurica.de/wiki/Wassersuchen

                // Wache halten
                if (character.Talentliste.Any(t => t.Name == "Selbstbeherrschung") &&
                    character.Talentliste.Any(t => t.Name == "Sinnenschärfe"))
                {
                    var selbstbeherrschung = character.Talentliste.Single(t => t.Name == "Selbstbeherrschung").Value;
                    var sinnenschaerfe     = character.Talentliste.Single(t => t.Name == "Sinnenschärfe").Value;

                    int talentValue = (int)Math.Round(((double)(selbstbeherrschung + (2 * sinnenschaerfe) + 1) / 3), 0, MidpointRounding.AwayFromZero);
                    var maxValue = new int[] { selbstbeherrschung * 2, sinnenschaerfe * 2 }.Min();

                    character.Talentliste.Add(new Talent
                    {
                        Name  = "Wache halten",
                        Probe = new Probe
                        {
                            Attribut1 = AttributType.Mut,
                            Attribut2 = AttributType.Intuition,
                            Attribut3 = AttributType.Konstitution
                        },
                        Value  = new int[] { talentValue, maxValue }.Min(),
                        Gruppe = TalentGruppe.Meta
                    });
                }
            }
        }