private void CopyFields(ScoreEntry2 scoreEntry)
 {
     foreach (PropertyInfo prop in scoreEntry.GetType().GetProperties())
     {
         GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(scoreEntry, null), null);
     }
 }
        public EnhancedScoreEntry(ScoreEntry2 scoreEntry) : base(scoreEntry.Score, scoreEntry.Description, scoreEntry.Details, scoreEntry.Turns, scoreEntry.GameId, scoreEntry.GameMode)
        {
            if ((scoreEntry == null) || (string.IsNullOrEmpty(scoreEntry.Details)))
            {
                return;
            }

            CopyFields(scoreEntry);

            var details = scoreEntry.Details.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

            int line = 0;

            int posGsf = details[line].IndexOf("Game summary for");

            if (posGsf > 0)
            {
                Version = "0";
            }

            try
            {
                // Get Character Name
                var charLine  = details[line].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                var charLine2 = charLine.Skip(1).Take(charLine.Length - 2);
                CharacterName = string.Join(" ", charLine2.Skip(3));

                // Get Date of death
                line++;
                string date = details[line].Substring(details[line].IndexOf(",") + 2);
                string time = date.Substring(date.IndexOf("at") + 3, date.Length - date.IndexOf("at") - 4);
                date = date.Substring(0, date.IndexOf("at") - 1);
                DateTime deathDate;
                if (!DateTime.TryParseExact(date + " " + time, "dd MMMM yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out deathDate))
                {
                    if (!DateTime.TryParseExact(date + " " + time, "MMMM dd, yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out deathDate))
                    {
                        deathDate = DateTime.MinValue;
                    }
                }
                DeathDate = deathDate;
                // get cause of death
                line++;
                int    posKb = details[line].IndexOf(" by ");
                string kb    = "";


                if (posKb > -1)
                {
                    // killed by
                    kb = details[line].Substring(posKb + 4);
                    if (kb.StartsWith("a "))
                    {
                        kb = kb.Substring(2, kb.Length - 2);
                    }
                    if (kb.StartsWith("an "))
                    {
                        kb = kb.Substring(3, kb.Length - 3);
                    }
                }
                else
                {
                    // from ?
                    int posFrom = details[line].IndexOf(" from ");
                    if (posFrom > -1)
                    {
                        kb = details[line].Substring(posFrom + 6);
                        if (kb.StartsWith("a "))
                        {
                            kb = kb.Substring(2, kb.Length - 2);
                        }
                        if (kb.StartsWith("an "))
                        {
                            kb = kb.Substring(3, kb.Length - 3);
                        }
                    }
                    else
                    {
                        if (details[line].StartsWith("You were"))
                        {
                            kb = details[line].Substring(9);
                        }
                        else
                        {
                            if (details[line].StartsWith("You "))
                            {
                                kb = details[line].Substring(4);
                            }
                        }
                    }
                }

                if (kb.EndsWith("."))
                {
                    kb = kb.Remove(kb.Length - 1);
                }
                KilledBy = ColorUtility.StripFormatting(RemoveEffect(kb)).Trim();

                Abandoned = KilledBy.StartsWith("abandoned");

                // get Level
                line++;
                var    elts = details[line].Split(' ');
                Regex  rgx  = new Regex("[^0-9]");
                string lvl  = rgx.Replace(elts[3], "");
                Level = int.Parse(lvl);

                // get Turns (note: probably not needed anymore now that ScoreEntry2 has a Turns field? For now, I've renamed this to "TurnsOld")
                line++;
                line++;
                elts = details[line].Split(' ');
                string turns = rgx.Replace(elts[2], "");
                TurnsOld = int.Parse(turns);
            }
            catch (Exception ex)
            {
                Utilities.Logger.Log($"(Error) Unexpected issue parsing High Score entry [{ex}]");
            }
        }