namespace Milimoe.FunGame.Core.Entity
{
///
/// 记录 的生涯、赛季统计数据
/// Key为赛季(long),每个key代表第key赛季,key = 0时为生涯数据。
///
public class UserStatistics
{
public long Id => User.Id;
public User User { get; }
public Dictionary DamageStats { get; } = [];
public Dictionary PhysicalDamageStats { get; } = [];
public Dictionary MagicDamageStats { get; } = [];
public Dictionary RealDamageStats { get; } = [];
public Dictionary AvgDamageStats
{
get
{
Dictionary avgdamage = [];
foreach (long key in Plays.Keys)
{
long plays = Plays[key];
double total = 0;
if (DamageStats.ContainsKey(key))
{
total = DamageStats.Values.Sum();
}
avgdamage.Add(key, Math.Round(total / plays, 2));
}
return avgdamage;
}
}
public Dictionary AvgPhysicalDamageStats
{
get
{
Dictionary avgdamage = [];
foreach (long key in Plays.Keys)
{
long plays = Plays[key];
double total = 0;
if (PhysicalDamageStats.ContainsKey(key))
{
total = PhysicalDamageStats.Values.Sum();
}
avgdamage.Add(key, Math.Round(total / plays, 2));
}
return avgdamage;
}
}
public Dictionary AvgMagicDamageStats
{
get
{
Dictionary avgdamage = [];
foreach (long key in Plays.Keys)
{
long plays = Plays[key];
double total = 0;
if (MagicDamageStats.ContainsKey(key))
{
total = MagicDamageStats.Values.Sum();
}
avgdamage.Add(key, Math.Round(total / plays, 2));
}
return avgdamage;
}
}
public Dictionary AvgRealDamageStats
{
get
{
Dictionary avgdamage = [];
foreach (long key in Plays.Keys)
{
long plays = Plays[key];
double total = 0;
if (RealDamageStats.ContainsKey(key))
{
total = RealDamageStats.Values.Sum();
}
avgdamage.Add(key, Math.Round(total / plays, 2));
}
return avgdamage;
}
}
public Dictionary Kills { get; } = [];
public Dictionary Deaths { get; } = [];
public Dictionary Assists { get; } = [];
public Dictionary Plays { get; } = [];
public Dictionary Wins { get; } = [];
public Dictionary Loses { get; } = [];
public Dictionary Winrates
{
get
{
Dictionary winrates = [];
foreach (long key in Plays.Keys)
{
long plays = Plays[key];
long wins = 0;
if (Wins.TryGetValue(key, out long value))
{
wins = value;
}
winrates.Add(key, Math.Round(wins * 1.0 / plays * 1.0, 4));
}
return winrates;
}
}
public Dictionary RatingStats { get; } = [];
public Dictionary EloStats { get; } = [];
public Dictionary RankStats { get; } = [];
public string GetWinrate(long season)
{
if (Winrates.TryGetValue(season, out double value))
{
return value.ToString("0.##%");
}
return "0%";
}
internal UserStatistics(User user)
{
User = user;
}
}
}