技能和数据查询调整

This commit is contained in:
milimoe 2026-01-17 01:26:22 +08:00
parent 0e5c1dd6d4
commit 91cb2eadf7
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
10 changed files with 221 additions and 89 deletions

View File

@ -8,22 +8,57 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
{ {
public override long Id => (long)PassiveEffectID.; public override long Id => (long)PassiveEffectID.;
public override string Name => "禁止治疗"; public override string Name => "禁止治疗";
public override string Description => $"此角色已被禁止治疗。来自:[ {Source} ] 的 [ {Skill.Name} ]"; public override string Description => $"此角色已被禁止治疗{禁止类型}。来自:[ {Source} ] 的 [ {Skill.Name} ]";
public override EffectType EffectType => EffectType.GrievousWound; public override EffectType EffectType => EffectType.GrievousWound;
public override Character Source => _sourceCharacter; public override Character Source => _sourceCharacter;
public override bool Durative => _durative; public override bool Durative => _durative;
public override double Duration => _duration; public override double Duration => _duration;
public override int DurationTurn => _durationTurn; public override int DurationTurn => _durationTurn;
public string
{
get
{
if (_allowRecovery && _allowLifeSteal && _allowHealing)
{
return "";
}
List<string> strings = [];
if (!_allowRecovery)
{
strings.Add("自然回复");
}
if (!_allowLifeSteal)
{
strings.Add("生命偷取");
}
if (!_allowHealing)
{
strings.Add("应用治疗");
}
return $"{string.Join("", strings)}";
}
}
private readonly Character _sourceCharacter; private readonly Character _sourceCharacter;
private readonly bool _allowRecovery;
private readonly bool _allowLifeSteal;
private readonly bool _allowHealing;
private readonly bool _durative; private readonly bool _durative;
private readonly double _duration; private readonly double _duration;
private readonly int _durationTurn; private readonly int _durationTurn;
public (Skill skill, Character sourceCharacter, bool durative = false, double duration = 0, int durationTurn = 1) : base(skill) public (Skill skill, Character sourceCharacter, bool allowRecovery = false, bool allowLifeSteal = false, bool allowHealing = false, bool durative = false, double duration = 0, int durationTurn = 1) : base(skill)
{ {
GamingQueue = skill.GamingQueue; GamingQueue = skill.GamingQueue;
_sourceCharacter = sourceCharacter; _sourceCharacter = sourceCharacter;
_allowRecovery = allowRecovery;
_allowLifeSteal = allowLifeSteal;
_allowHealing = allowHealing;
if (!_allowHealing)
{
_allowLifeSteal = false;
_allowRecovery = false;
}
_durative = durative; _durative = durative;
_duration = duration; _duration = duration;
_durationTurn = durationTurn; _durationTurn = durationTurn;
@ -31,11 +66,26 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
public override bool BeforeApplyRecoveryAtTimeLapsing(Character character, ref double hr, ref double mr) public override bool BeforeApplyRecoveryAtTimeLapsing(Character character, ref double hr, ref double mr)
{ {
return true; return _allowRecovery;
}
public override bool BeforeLifesteal(Character character, Character enemy, double damage, double steal)
{
return _allowLifeSteal;
}
public override bool BeforeHealToTarget(Character actor, Character target, double heal, bool canRespawn)
{
return _allowHealing;
} }
public override void OnEffectGained(Character character) public override void OnEffectGained(Character character)
{ {
if (_allowRecovery && _allowLifeSteal && _allowHealing)
{
character.Effects.Remove(this);
return;
}
if (_durative && RemainDuration == 0) if (_durative && RemainDuration == 0)
{ {
RemainDuration = Duration; RemainDuration = Duration;

View File

@ -47,7 +47,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists) public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists)
{ {
if (GamingQueue != null && killer != null && killer == _targetCharacter && Source != null && death != Source && GamingQueue.Queue.Contains(Source)) if (GamingQueue != null && !hasMaster && killer != null && killer == _targetCharacter && Source != null && death != Source && GamingQueue.Queue.Contains(Source))
{ {
WriteLine($"[ {Source} ] 正在观察 [ {killer} ] 的情绪。"); WriteLine($"[ {Source} ] 正在观察 [ {killer} ] 的情绪。");
if (LastType == CharacterActionType.NormalAttack) if (LastType == CharacterActionType.NormalAttack)
@ -82,15 +82,22 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
Source.Effects.Add(e); Source.Effects.Add(e);
WriteLine($"[ {Source} ] 复制了 [ {killer} ] 的技能:{LastSkill.Name}"); WriteLine($"[ {Source} ] 复制了 [ {killer} ] 的技能:{LastSkill.Name}");
} }
Effect e2 = new (Skill, Source) if (killer.Effects.FirstOrDefault(e => e is ) is e2)
{ {
Durative = false, e2.RemainDurationTurn = 3;
DurationTurn = 3, }
RemainDurationTurn = 3 else
}; {
e2.OnEffectGained(killer); e2 = new (Skill, Source)
killer.Effects.Add(e2); {
WriteLine($"[ {Source} ] 给予了 [ {killer} ] 时雨标记!"); Durative = false,
DurationTurn = 3,
RemainDurationTurn = 3
};
e2.OnEffectGained(killer);
killer.Effects.Add(e2);
WriteLine($"[ {Source} ] 给予了 [ {killer} ] 时雨标记!");
}
} }
} }
} }

View File

@ -28,7 +28,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"{Skill.SkillOwner()}在场上时,会召唤数名雇佣兵协助战斗,初始数量为 {最小数量} 名,雇佣兵具有独立的回合,生命值为{Skill.SkillOwner()}的 {生命值比例 * 100:0.##}% [ {Skill.Character?.MaxHP * 生命值比例:0.##} ],攻击力为{Skill.SkillOwner()}的 {攻击力比例 * 100:0.##}% 基础攻击力 [ {Skill.Character?.BaseATK * 攻击力比例:0.##} ]" + public override string Description => $"{Skill.SkillOwner()}在场上时,会召唤数名雇佣兵协助战斗,初始数量为 {最小数量} 名,雇佣兵具有独立的回合,生命值为{Skill.SkillOwner()}的 {生命值比例 * 100:0.##}% [ {Skill.Character?.MaxHP * 生命值比例:0.##} ],攻击力为{Skill.SkillOwner()}的 {攻击力比例 * 100:0.##}% 基础攻击力 [ {Skill.Character?.BaseATK * 攻击力比例:0.##} ]" +
$"完整继承其他能力值(暴击率、闪避率等)。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" + $"完整继承其他能力值(暴击率、闪避率等),雇佣兵每{GameplayEquilibriumConstant.InGameTime}流失 {生命流失 * 100:0.##}% 当前生命值。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" +
(.Count < && Skill.CurrentCD > 0 ? $"(下次补充:{Skill.CurrentCD} {GameplayEquilibriumConstant.InGameTime}后)" : ""); (.Count < && Skill.CurrentCD > 0 ? $"(下次补充:{Skill.CurrentCD} {GameplayEquilibriumConstant.InGameTime}后)" : "");
public List<> { get; } = []; public List<> { get; } = [];
@ -37,6 +37,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public const int = 30; public const int = 30;
public const double = 0.1; public const double = 0.1;
public const double = 0.6; public const double = 0.6;
public const double = 0.09;
public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists) public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney, Character[] assists)
{ {
@ -73,6 +74,18 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
(character); (character);
} }
foreach ( gyb in )
{
if (gyb.HP > 0)
{
double lost = gyb.HP * * elapsed;
gyb.HP -= lost;
if (gyb.HP <= 0)
{
gyb.HP = 1;
}
}
}
} }
public override void OnEffectLost(Character character) public override void OnEffectLost(Character character)
@ -125,7 +138,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
InitialHR = character.HR, InitialHR = character.HR,
InitialMR = character.MR, InitialMR = character.MR,
Lifesteal = character.Lifesteal, Lifesteal = character.Lifesteal,
ExPDR = character.PDR, ExPDR = character.ExPDR,
PhysicalPenetration = character.PhysicalPenetration, PhysicalPenetration = character.PhysicalPenetration,
MagicalPenetration = character.MagicalPenetration MagicalPenetration = character.MagicalPenetration
}; };

View File

@ -12,7 +12,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : "";
public override double EPCost => 100; public override double EPCost => 100;
public override double CD => 60; public override double CD => 75;
public override double HardnessTime { get; set; } = 10; public override double HardnessTime { get; set; } = 10;
public override bool CanSelectSelf => false; public override bool CanSelectSelf => false;
public override bool CanSelectEnemy => true; public override bool CanSelectEnemy => true;
@ -40,7 +40,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override ImmuneType IgnoreImmune => ImmuneType.All; public override ImmuneType IgnoreImmune => ImmuneType.All;
public string => $"对受到标记的目标造成伤害时将产生爆炸,爆炸将产生 {分裂伤害系数 * 100:0.##}% 分裂伤害。分裂伤害为全图索敌,会优先分裂至三个在持续时间内对{Skill.SkillOwner()}造成伤害最多的敌人,若没有符合条件的敌人或敌人数量不足,则将分裂至被标记的敌人,或至多三个随机的敌人。"; public string => $"对受到标记的目标造成伤害时将产生爆炸,爆炸将产生 {分裂伤害系数 * 100:0.##}% 分裂伤害。分裂伤害为全图索敌,会优先分裂至三个在持续时间内对{Skill.SkillOwner()}造成伤害最多的敌人,若没有符合条件的敌人或敌人数量不足,则将分裂至被标记的敌人,或至多三个随机的敌人。";
public double => 180 + 240 * (Skill.Level - 1); public double => 180 + 75 * (Skill.Level - 1);
public double => 25 + 2 * (Skill.Level - 1); public double => 25 + 2 * (Skill.Level - 1);
public double => 0.25 + 0.02 * (Skill.Level - 1); public double => 0.25 + 0.02 * (Skill.Level - 1);
public double => 0.6 * (Skill.Character?.BaseSTR ?? 0); public double => 0.6 * (Skill.Character?.BaseSTR ?? 0);

View File

@ -26,13 +26,13 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"{Skill.SkillOwner()}释放「熵灭」的力量,获得 135% 力量 [ {攻击力加成:0.##} ] 的攻击力加成,但每次普通攻击命中时都会损失自身 9% 当前生命值 [ {当前生命值:0.##} ],持续 {Duration:0.##} {GameplayEquilibriumConstant.InGameTime}。"; public override string Description => $"{Skill.SkillOwner()}释放「熵灭」的力量,获得 135% 力量 [ {攻击力加成:0.##} ] 的攻击力加成,但每次普通攻击命中时都会损失自身 6% 当前生命值 [ {当前生命值:0.##} ],持续 {Duration:0.##} {GameplayEquilibriumConstant.InGameTime}。";
public override bool Durative => true; public override bool Durative => true;
public override double Duration => 10 + 1 * (Level - 1); public override double Duration => 10 + 2 * (Level - 1);
public override DispelledType DispelledType => DispelledType.CannotBeDispelled; public override DispelledType DispelledType => DispelledType.CannotBeDispelled;
private double => Skill.Character?.STR * 1.35 ?? 0; private double => Skill.Character?.STR * 1.35 ?? 0;
private double => Skill.Character?.HP * 0.09 ?? 0; private double => Skill.Character?.HP * 0.06 ?? 0;
private double = 0; private double = 0;
public override void OnEffectGained(Character character) public override void OnEffectGained(Character character)

View File

@ -14,7 +14,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : "";
public override string ExemptionDescription => Effects.Count > 0 ? Effects.First().ExemptionDescription : ""; public override string ExemptionDescription => Effects.Count > 0 ? Effects.First().ExemptionDescription : "";
public override double EPCost => 100; public override double EPCost => 100;
public override double CD => 60; public override double CD => 80;
public override double HardnessTime { get; set; } = 2; public override double HardnessTime { get; set; } = 2;
public override bool CanSelectSelf => true; public override bool CanSelectSelf => true;
public override bool CanSelectEnemy => false; public override bool CanSelectEnemy => false;
@ -92,7 +92,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
if ( && character == Skill.Character && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && !CheckSkilledImmune(character, enemy, Skill)) if ( && character == Skill.Character && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && !CheckSkilledImmune(character, enemy, Skill))
{ {
Effect e = new (Skill, character, true, , 0) e = new(Skill, character, false, true, true, true, , 0)
{ {
ExemptionType = PrimaryAttribute.AGI, ExemptionType = PrimaryAttribute.AGI,
ExemptDuration = false, ExemptDuration = false,
@ -100,7 +100,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
}; };
if (enemy.AGI <= character.AGI || (enemy.AGI > character.AGI && !CheckExemption(character, enemy, e))) if (enemy.AGI <= character.AGI || (enemy.AGI > character.AGI && !CheckExemption(character, enemy, e)))
{ {
WriteLine($"[ {character} ] 对 [ {enemy} ] 施加了禁止治疗!!持续时间:{熵核影响敌人时间:0.##} {GameplayEquilibriumConstant.InGameTime}"); WriteLine($"[ {character} ] 对 [ {enemy} ] 施加了禁止治疗{e.禁止类型}!!持续时间:{熵核影响敌人时间:0.##} {GameplayEquilibriumConstant.InGameTime}");
enemy.Effects.Add(e); enemy.Effects.Add(e);
e.OnEffectGained(enemy); e.OnEffectGained(enemy);
GamingQueue?.LastRound.AddApplyEffects(enemy, e.EffectType); GamingQueue?.LastRound.AddApplyEffects(enemy, e.EffectType);

View File

@ -68,7 +68,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override double AlterActualDamageAfterCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult, ref bool isEvaded, Dictionary<Effect, double> totalDamageBonus) public override double AlterActualDamageAfterCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult, ref bool isEvaded, Dictionary<Effect, double> totalDamageBonus)
{ {
if (enemy == Skill.Character && > 0) if (enemy == Skill.Character && > 0 && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical))
{ {
double reduce = damage * ; double reduce = damage * ;
WriteLine($"[ {Skill.Character} ] 发动了概念之骰!伤害减少了 {reduce:0.##} 点!"); WriteLine($"[ {Skill.Character} ] 发动了概念之骰!伤害减少了 {reduce:0.##} 点!");

View File

@ -26,7 +26,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"敏捷提高 20% [ {敏捷提升:0.##} ] 点,然后将当前力量补充到敏捷的 {平衡系数 * 100:0.##}%{(Skill.Character != null ? $" [ {Skill.Character.AGI * :0.##} ]" : "")},持续 {Duration:0.##} {GameplayEquilibriumConstant.InGameTime}。"; public override string Description => $"敏捷提高 20% [ {敏捷提升:0.##} ] 点。若当前总力量低于敏捷,则获得额外力量提升,使得总力量等于敏捷的 {平衡系数 * 100:0.##}%{(Skill.Character != null ? $" [ {Skill.Character.AGI * :0.##} ]" : "")},持续 {Duration:0.##} {GameplayEquilibriumConstant.InGameTime}。";
public override bool Durative => true; public override bool Durative => true;
public override double Duration => 30; public override double Duration => 30;
public override DispelledType DispelledType => DispelledType.CannotBeDispelled; public override DispelledType DispelledType => DispelledType.CannotBeDispelled;

View File

@ -10,7 +10,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string Name => "天堂之吻"; public override string Name => "天堂之吻";
public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : "";
public override double EPCost => 60; public override double EPCost => 75;
public override double CD => 40; public override double CD => 40;
public override double HardnessTime { get; set; } = 10; public override double HardnessTime { get; set; } = 10;
public override bool CanSelectSelf => true; public override bool CanSelectSelf => true;
@ -21,7 +21,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public (Character? character = null) : base(SkillType.Skill, character) public (Character? character = null) : base(SkillType.Skill, character)
{ {
CastRange = 5; CastRange = 5;
Effects.Add(new (this, 120, 50, duration: 20)); Effects.Add(new (this, 90, 30, duration: 20));
} }
} }
} }

View File

@ -60,48 +60,80 @@ namespace Oshima.FunGame.WebAPI.Controllers
StringBuilder builder = new(); StringBuilder builder = new();
builder.AppendLine(character.ToStringWithOutUser()); builder.AppendLine(character.ToStringWithOutUser());
builder.AppendLine($"总计造成伤害:{stats.TotalDamage:0.##} / 场均:{stats.AvgDamage:0.##}");
builder.AppendLine($"总计造成物理伤害:{stats.TotalPhysicalDamage:0.##} / 场均:{stats.AvgPhysicalDamage:0.##}");
builder.AppendLine($"总计造成魔法伤害:{stats.TotalMagicDamage:0.##} / 场均:{stats.AvgMagicDamage:0.##}");
builder.AppendLine($"总计造成真实伤害:{stats.TotalTrueDamage:0.##} / 场均:{stats.AvgTrueDamage:0.##}");
builder.AppendLine($"总计承受伤害:{stats.TotalTakenDamage:0.##} / 场均:{stats.AvgTakenDamage:0.##}");
builder.AppendLine($"总计承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 场均:{stats.AvgTakenPhysicalDamage:0.##}");
builder.AppendLine($"总计承受魔法伤害:{stats.TotalTakenMagicDamage:0.##} / 场均:{stats.AvgTakenMagicDamage:0.##}");
builder.AppendLine($"总计承受真实伤害:{stats.TotalTakenTrueDamage:0.##} / 场均:{stats.AvgTakenTrueDamage:0.##}");
builder.AppendLine($"总计治疗:{stats.TotalHeal:0.##} / 场均:{stats.AvgHeal:0.##}");
builder.AppendLine($"总计存活回合数:{stats.LiveRound} / 场均:{stats.AvgLiveRound}");
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}");
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}");
builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}");
builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}");
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}");
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}");
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}");
builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##}");
builder.AppendLine($"总计回合决策数:{stats.TurnDecisions:0.##} / 场均:{stats.AvgTurnDecisions:0.##}");
builder.AppendLine($"总计使用决策点:{stats.UseDecisionPoints:0.##} / 场均:{stats.AvgUseDecisionPoints:0.##}");
builder.AppendLine($"总计击杀数:{stats.Kills}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Kills / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计死亡数:{stats.Deaths}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Deaths / stats.Plays:0.##}" : ""));
builder.AppendLine($"击杀死亡比:{(stats.Deaths == 0 ? stats.Kills : ((double)stats.Kills / stats.Deaths)):0.##}");
builder.AppendLine($"总计助攻数:{stats.Assists}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Assists / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计首杀数:{stats.FirstKills}" + (stats.Plays != 0 ? $" / 首杀率:{(double)stats.FirstKills / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计首死数:{stats.FirstDeaths}" + (stats.Plays != 0 ? $" / 首死率:{(double)stats.FirstDeaths / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计参赛数:{stats.Plays}");
builder.AppendLine($"总计冠军数:{stats.Wins}");
builder.AppendLine($"总计前三数:{stats.Top3s}");
builder.AppendLine($"总计败场数:{stats.Loses}");
List<string> names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.MVPs).Select(kv => kv.Key.GetName())]; List<string> names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成伤害:{stats.TotalDamage:0.##} / 场均:{stats.AvgDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgPhysicalDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成物理伤害:{stats.TotalPhysicalDamage:0.##} / 场均:{stats.AvgPhysicalDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgMagicDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成魔法伤害:{stats.TotalMagicDamage:0.##} / 场均:{stats.AvgMagicDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgTrueDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成真实伤害:{stats.TotalTrueDamage:0.##} / 场均:{stats.AvgTrueDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受伤害:{stats.TotalTakenDamage:0.##} / 场均:{stats.AvgTakenDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenPhysicalDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 场均:{stats.AvgTakenPhysicalDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenMagicDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受魔法伤害:{stats.TotalTakenMagicDamage:0.##} / 场均:{stats.AvgTakenMagicDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenTrueDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受真实伤害:{stats.TotalTakenTrueDamage:0.##} / 场均:{stats.AvgTakenTrueDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgHeal).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计治疗:{stats.TotalHeal:0.##} / 场均:{stats.AvgHeal:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgLiveRound).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计存活回合数:{stats.LiveRound} / 场均:{stats.AvgLiveRound}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgActionTurn).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgLiveTime).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgControlTime).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgShield).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgEarnedMoney).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.DamagePerRound).Select(kv => kv.Key.GetName())];
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.DamagePerTurn).Select(kv => kv.Key.GetName())];
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.DamagePerSecond).Select(kv => kv.Key.GetName())];
builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgTurnDecisions).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计回合决策数:{stats.TurnDecisions:0.##} / 场均:{stats.AvgTurnDecisions:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.AvgUseDecisionPoints).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计使用决策点:{stats.UseDecisionPoints:0.##} / 场均:{stats.AvgUseDecisionPoints:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.Kills : (double)kv.Value.Kills / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计击杀数:{stats.Kills}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Kills / stats.Plays:0.##}" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.Deaths : (double)kv.Value.Deaths / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计死亡数:{stats.Deaths}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Deaths / stats.Plays:0.##}" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Deaths == 0 ? kv.Value.Kills : ((double)kv.Value.Kills / kv.Value.Deaths)).Select(kv => kv.Key.GetName())];
builder.AppendLine($"击杀死亡比:{(stats.Deaths == 0 ? stats.Kills : ((double)stats.Kills / stats.Deaths)):0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.Assists : (double)kv.Value.Assists / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计助攻数:{stats.Assists}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Assists / stats.Plays:0.##}" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.FirstKills : (double)kv.Value.FirstKills / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计首杀数:{stats.FirstKills}" + (stats.Plays != 0 ? $" / 首杀率:{(double)stats.FirstKills / stats.Plays * 100:0.##}%" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.FirstDeaths : (double)kv.Value.FirstDeaths / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计首死数:{stats.FirstDeaths}" + (stats.Plays != 0 ? $" / 首死率:{(double)stats.FirstDeaths / stats.Plays * 100:0.##}%" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计参赛数:{stats.Plays}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Wins).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计胜场数:{stats.Wins}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Top3s).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计前三数:{stats.Top3s}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Loses).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计败场数:{stats.Loses}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.MVPs).Select(kv => kv.Key.GetName())];
builder.AppendLine($"MVP次数{stats.MVPs}#{names.IndexOf(character.GetName()) + 1}"); builder.AppendLine($"MVP次数{stats.MVPs}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Winrate).Select(kv => kv.Key.GetName())]; names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Winrate).Select(kv => kv.Key.GetName())];
builder.AppendLine($"胜率:{stats.Winrate * 100:0.##}%#{names.IndexOf(character.GetName()) + 1}"); builder.AppendLine($"胜率:{stats.Winrate * 100:0.##}%#{names.IndexOf(character.GetName()) + 1}");
builder.AppendLine($"前三率:{stats.Top3rate * 100:0.##}%"); names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Top3rate).Select(kv => kv.Key.GetName())];
builder.AppendLine($"前三率:{stats.Top3rate * 100:0.##}%#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Rating).Select(kv => kv.Key.GetName())]; names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Rating).Select(kv => kv.Key.GetName())];
builder.AppendLine($"技术得分:{stats.Rating:0.0#}#{names.IndexOf(character.GetName()) + 1}"); builder.AppendLine($"技术得分:{stats.Rating:0.0#}#{names.IndexOf(character.GetName()) + 1}");
builder.AppendLine($"上次排名:{stats.LastRank} / 场均名次:{stats.AvgRank:0.##}"); builder.AppendLine($"上次排名:#{stats.LastRank} / 场均名次:#{stats.AvgRank:0.##}");
return builder.ToString(); return builder.ToString();
} }
@ -121,37 +153,67 @@ namespace Oshima.FunGame.WebAPI.Controllers
StringBuilder builder = new(); StringBuilder builder = new();
builder.AppendLine(character.ToStringWithOutUser()); builder.AppendLine(character.ToStringWithOutUser());
builder.AppendLine($"总计造成伤害:{stats.TotalDamage:0.##} / 场均:{stats.AvgDamage:0.##}");
builder.AppendLine($"总计造成物理伤害:{stats.TotalPhysicalDamage:0.##} / 场均:{stats.AvgPhysicalDamage:0.##}");
builder.AppendLine($"总计造成魔法伤害:{stats.TotalMagicDamage:0.##} / 场均:{stats.AvgMagicDamage:0.##}");
builder.AppendLine($"总计造成真实伤害:{stats.TotalTrueDamage:0.##} / 场均:{stats.AvgTrueDamage:0.##}");
builder.AppendLine($"总计承受伤害:{stats.TotalTakenDamage:0.##} / 场均:{stats.AvgTakenDamage:0.##}");
builder.AppendLine($"总计承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 场均:{stats.AvgTakenPhysicalDamage:0.##}");
builder.AppendLine($"总计承受魔法伤害:{stats.TotalTakenMagicDamage:0.##} / 场均:{stats.AvgTakenMagicDamage:0.##}");
builder.AppendLine($"总计承受真实伤害:{stats.TotalTakenTrueDamage:0.##} / 场均:{stats.AvgTakenTrueDamage:0.##}");
builder.AppendLine($"总计治疗:{stats.TotalHeal:0.##} / 场均:{stats.AvgHeal:0.##}");
builder.AppendLine($"总计存活回合数:{stats.LiveRound} / 场均:{stats.AvgLiveRound}");
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}");
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}");
builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}");
builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}");
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}");
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}");
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}");
builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##}");
builder.AppendLine($"总计回合决策数:{stats.TurnDecisions:0.##} / 场均:{stats.AvgTurnDecisions:0.##}");
builder.AppendLine($"总计使用决策点:{stats.UseDecisionPoints:0.##} / 场均:{stats.AvgUseDecisionPoints:0.##}");
builder.AppendLine($"总计击杀数:{stats.Kills}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Kills / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计死亡数:{stats.Deaths}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Deaths / stats.Plays:0.##}" : ""));
builder.AppendLine($"击杀死亡比:{(stats.Deaths == 0 ? stats.Kills : ((double)stats.Kills / stats.Deaths)):0.##}");
builder.AppendLine($"总计助攻数:{stats.Assists}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Assists / stats.Plays:0.##}" : ""));
builder.AppendLine($"总计首杀数:{stats.FirstKills}" + (stats.Plays != 0 ? $" / 首杀率:{(double)stats.FirstKills / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计首死数:{stats.FirstDeaths}" + (stats.Plays != 0 ? $" / 首死率:{(double)stats.FirstDeaths / stats.Plays * 100:0.##}%" : ""));
builder.AppendLine($"总计参赛数:{stats.Plays}");
builder.AppendLine($"总计胜场数:{stats.Wins}");
builder.AppendLine($"总计败场数:{stats.Loses}");
List<string> names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.MVPs).Select(kv => kv.Key.GetName())]; List<string> names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成伤害:{stats.TotalDamage:0.##} / 场均:{stats.AvgDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgPhysicalDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成物理伤害:{stats.TotalPhysicalDamage:0.##} / 场均:{stats.AvgPhysicalDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgMagicDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成魔法伤害:{stats.TotalMagicDamage:0.##} / 场均:{stats.AvgMagicDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgTrueDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计造成真实伤害:{stats.TotalTrueDamage:0.##} / 场均:{stats.AvgTrueDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受伤害:{stats.TotalTakenDamage:0.##} / 场均:{stats.AvgTakenDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenPhysicalDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 场均:{stats.AvgTakenPhysicalDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenMagicDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受魔法伤害:{stats.TotalTakenMagicDamage:0.##} / 场均:{stats.AvgTakenMagicDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgTakenTrueDamage).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计承受真实伤害:{stats.TotalTakenTrueDamage:0.##} / 场均:{stats.AvgTakenTrueDamage:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgHeal).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计治疗:{stats.TotalHeal:0.##} / 场均:{stats.AvgHeal:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgLiveRound).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计存活回合数:{stats.LiveRound} / 场均:{stats.AvgLiveRound}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgActionTurn).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgLiveTime).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgControlTime).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgShield).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgEarnedMoney).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.DamagePerRound).Select(kv => kv.Key.GetName())];
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.DamagePerTurn).Select(kv => kv.Key.GetName())];
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.DamagePerSecond).Select(kv => kv.Key.GetName())];
builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgTurnDecisions).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计回合决策数:{stats.TurnDecisions:0.##} / 场均:{stats.AvgTurnDecisions:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.AvgUseDecisionPoints).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计使用决策点:{stats.UseDecisionPoints:0.##} / 场均:{stats.AvgUseDecisionPoints:0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.Kills : (double)kv.Value.Kills / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计击杀数:{stats.Kills}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Kills / stats.Plays:0.##}" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.Deaths : (double)kv.Value.Deaths / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计死亡数:{stats.Deaths}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Deaths / stats.Plays:0.##}" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Deaths == 0 ? kv.Value.Kills : ((double)kv.Value.Kills / kv.Value.Deaths)).Select(kv => kv.Key.GetName())];
builder.AppendLine($"击杀死亡比:{(stats.Deaths == 0 ? stats.Kills : ((double)stats.Kills / stats.Deaths)):0.##}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.Assists : (double)kv.Value.Assists / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计助攻数:{stats.Assists}" + (stats.Plays != 0 ? $" / 场均:{(double)stats.Assists / stats.Plays:0.##}" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.FirstKills : (double)kv.Value.FirstKills / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计首杀数:{stats.FirstKills}" + (stats.Plays != 0 ? $" / 首杀率:{(double)stats.FirstKills / stats.Plays * 100:0.##}%" : "") + $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Plays == 0 ? kv.Value.FirstDeaths : (double)kv.Value.FirstDeaths / kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计首死数:{stats.FirstDeaths}" + (stats.Plays != 0 ? $" / 首死率:{(double)stats.FirstDeaths / stats.Plays * 100:0.##}%" : "")+ $"#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Plays).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计参赛数:{stats.Plays}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Wins).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计胜场数:{stats.Wins}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Loses).Select(kv => kv.Key.GetName())];
builder.AppendLine($"总计败场数:{stats.Loses}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.MVPs).Select(kv => kv.Key.GetName())];
builder.AppendLine($"MVP次数{stats.MVPs}#{names.IndexOf(character.GetName()) + 1}"); builder.AppendLine($"MVP次数{stats.MVPs}#{names.IndexOf(character.GetName()) + 1}");
names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Winrate).Select(kv => kv.Key.GetName())]; names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Winrate).Select(kv => kv.Key.GetName())];
builder.AppendLine($"胜率:{stats.Winrate * 100:0.##}%#{names.IndexOf(character.GetName()) + 1}"); builder.AppendLine($"胜率:{stats.Winrate * 100:0.##}%#{names.IndexOf(character.GetName()) + 1}");