public static string GetProfessionsInfo(this FightCharacterCounts counts)
 => string.Join(Environment.NewLine, Profession.All
                .Where(counts.HasProfession)
                .Select(p => new
 {
     profession        = p,
     count             = counts.GetProfessionCount(p),
     averageLevel      = counts.GetAverageProfessionLevel(p),
     averageAlienLevel = counts.GetAverageProfessionAlienLevel(p)
 })
                .Select(a => $"{a.count} {a.profession}{(a.count == 1 ? "" : "s")}, {a.averageLevel.Format()}/{a.averageAlienLevel.Format()}"));
        public static string GetFightCharacterCountsTooltip(this FightCharacterCounts counts, string title)
        => $@"{title}

{counts.FightCharacterCount} {(counts.FightCharacterCount == 1 ? "character" : "characters")}

{counts.PlayerCount} {(counts.PlayerCount == 1 ? "player" : "players")}, {counts.AveragePlayerLevel.Format()}/{counts.AveragePlayerAlienLevel.Format()}
  {counts.OmniPlayerCount} {(counts.OmniPlayerCount == 1 ? "Omni" : "Omnis")}, {counts.AverageOmniPlayerLevel.Format()}/{counts.AverageOmniPlayerAlienLevel.Format()}
  {counts.ClanPlayerCount} {(counts.ClanPlayerCount == 1 ? "Clan" : "Clan")}, {counts.AverageClanPlayerLevel.Format()}/{counts.AverageClanPlayerAlienLevel.Format()}
  {counts.NeutralPlayerCount} {(counts.NeutralPlayerCount == 1 ? "Neutral" : "Neutrals")}, {counts.AverageNeutralPlayerLevel.Format()}/{counts.AverageNeutralPlayerAlienLevel.Format()}"
        + (counts.UnknownPlayerCount == 0 ? null : $@"
  {counts.UnknownPlayerCount} {(counts.UnknownPlayerCount == 1 ? "Unknown" : "Unknowns")}, {counts.AverageUnknownPlayerLevel.Format()}/{counts.AverageUnknownPlayerAlienLevel.Format()}")
        + (counts.FightPetCount == 0 ? null : $@"
{counts.FightPetCount} {(counts.FightPetCount == 1 ? "pet" : "pets")}")
        + (counts.NPCCount == 0 ? null : $@"
{counts.NPCCount} {(counts.NPCCount == 1 ? "NPC" : "NPCs")}")
        + (counts.PlayerCount == 0 ? null : $@"

{counts.GetProfessionsInfo()}");