From 91cb2eadf7ecba05c162bbd24e3338ddef6829a3 Mon Sep 17 00:00:00 2001 From: milimoe Date: Sat, 17 Jan 2026 01:26:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=80=E8=83=BD=E5=92=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Effects/PassiveEffects/禁止治疗.cs | 56 +++++- .../Effects/PassiveEffects/长期监视.cs | 25 ++- OshimaModules/Skills/CHAOS/雇佣兵团.cs | 17 +- OshimaModules/Skills/Neptune/海王星的野望.cs | 4 +- OshimaModules/Skills/Oshima/熵灭极诣.cs | 6 +- OshimaModules/Skills/Ryuko/宿命之潮.cs | 6 +- OshimaModules/Skills/TheGodK/概念之骰.cs | 2 +- OshimaModules/Skills/dddovo/身心一境.cs | 2 +- OshimaModules/Skills/战技/天堂之吻.cs | 4 +- OshimaWebAPI/Controllers/FunGameController.cs | 188 ++++++++++++------ 10 files changed, 221 insertions(+), 89 deletions(-) diff --git a/OshimaModules/Effects/PassiveEffects/禁止治疗.cs b/OshimaModules/Effects/PassiveEffects/禁止治疗.cs index 82f94fc..e4b938f 100644 --- a/OshimaModules/Effects/PassiveEffects/禁止治疗.cs +++ b/OshimaModules/Effects/PassiveEffects/禁止治疗.cs @@ -8,22 +8,57 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects { public override long Id => (long)PassiveEffectID.禁止治疗; 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 Character Source => _sourceCharacter; public override bool Durative => _durative; public override double Duration => _duration; public override int DurationTurn => _durationTurn; + public string 禁止类型 + { + get + { + if (_allowRecovery && _allowLifeSteal && _allowHealing) + { + return ""; + } + List strings = []; + if (!_allowRecovery) + { + strings.Add("自然回复"); + } + if (!_allowLifeSteal) + { + strings.Add("生命偷取"); + } + if (!_allowHealing) + { + strings.Add("应用治疗"); + } + return $"({string.Join("、", strings)})"; + } + } private readonly Character _sourceCharacter; + private readonly bool _allowRecovery; + private readonly bool _allowLifeSteal; + private readonly bool _allowHealing; private readonly bool _durative; private readonly double _duration; 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; _sourceCharacter = sourceCharacter; + _allowRecovery = allowRecovery; + _allowLifeSteal = allowLifeSteal; + _allowHealing = allowHealing; + if (!_allowHealing) + { + _allowLifeSteal = false; + _allowRecovery = false; + } _durative = durative; _duration = duration; _durationTurn = durationTurn; @@ -31,11 +66,26 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects 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) { + if (_allowRecovery && _allowLifeSteal && _allowHealing) + { + character.Effects.Remove(this); + return; + } if (_durative && RemainDuration == 0) { RemainDuration = Duration; diff --git a/OshimaModules/Effects/PassiveEffects/长期监视.cs b/OshimaModules/Effects/PassiveEffects/长期监视.cs index 7efc68a..1195d5a 100644 --- a/OshimaModules/Effects/PassiveEffects/长期监视.cs +++ b/OshimaModules/Effects/PassiveEffects/长期监视.cs @@ -47,7 +47,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary continuousKilling, Dictionary 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} ] 的情绪。"); if (LastType == CharacterActionType.NormalAttack) @@ -82,15 +82,22 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects Source.Effects.Add(e); WriteLine($"[ {Source} ] 复制了 [ {killer} ] 的技能:{LastSkill.Name}!!"); } - Effect e2 = new 时雨标记(Skill, Source) + if (killer.Effects.FirstOrDefault(e => e is 时雨标记) is 时雨标记 e2) { - Durative = false, - DurationTurn = 3, - RemainDurationTurn = 3 - }; - e2.OnEffectGained(killer); - killer.Effects.Add(e2); - WriteLine($"[ {Source} ] 给予了 [ {killer} ] 时雨标记!"); + e2.RemainDurationTurn = 3; + } + else + { + e2 = new 时雨标记(Skill, Source) + { + Durative = false, + DurationTurn = 3, + RemainDurationTurn = 3 + }; + e2.OnEffectGained(killer); + killer.Effects.Add(e2); + WriteLine($"[ {Source} ] 给予了 [ {killer} ] 时雨标记!"); + } } } } diff --git a/OshimaModules/Skills/CHAOS/雇佣兵团.cs b/OshimaModules/Skills/CHAOS/雇佣兵团.cs index 3c401e4..cbf9095 100644 --- a/OshimaModules/Skills/CHAOS/雇佣兵团.cs +++ b/OshimaModules/Skills/CHAOS/雇佣兵团.cs @@ -28,7 +28,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override long Id => Skill.Id; 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.##} ]," + - $"完整继承其他能力值(暴击率、闪避率等)。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" + + $"完整继承其他能力值(暴击率、闪避率等),雇佣兵每{GameplayEquilibriumConstant.InGameTime}流失 {生命流失 * 100:0.##}% 当前生命值。当{Skill.SkillOwner()}参与击杀时,便会临时产生一名额外的雇佣兵。场上最多可以存在 {最大数量} 名雇佣兵,达到数量后不再产生新的雇佣兵;当不足 {最小数量} 名雇佣兵时,{补充间隔} {GameplayEquilibriumConstant.InGameTime}后会重新补充一名雇佣兵。" + (雇佣兵团.Count < 最小数量 && Skill.CurrentCD > 0 ? $"(下次补充:{Skill.CurrentCD} {GameplayEquilibriumConstant.InGameTime}后)" : ""); public List<雇佣兵> 雇佣兵团 { get; } = []; @@ -37,6 +37,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public const int 补充间隔 = 30; public const double 生命值比例 = 0.1; public const double 攻击力比例 = 0.6; + public const double 生命流失 = 0.09; public override void AfterDeathCalculation(Character death, bool hasMaster, Character? killer, Dictionary continuousKilling, Dictionary earnedMoney, Character[] assists) { @@ -73,6 +74,18 @@ namespace Oshima.FunGame.OshimaModules.Skills { 保底补充(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) @@ -125,7 +138,7 @@ namespace Oshima.FunGame.OshimaModules.Skills InitialHR = character.HR, InitialMR = character.MR, Lifesteal = character.Lifesteal, - ExPDR = character.PDR, + ExPDR = character.ExPDR, PhysicalPenetration = character.PhysicalPenetration, MagicalPenetration = character.MagicalPenetration }; diff --git a/OshimaModules/Skills/Neptune/海王星的野望.cs b/OshimaModules/Skills/Neptune/海王星的野望.cs index 90ff36b..d29c101 100644 --- a/OshimaModules/Skills/Neptune/海王星的野望.cs +++ b/OshimaModules/Skills/Neptune/海王星的野望.cs @@ -12,7 +12,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override double EPCost => 100; - public override double CD => 60; + public override double CD => 75; public override double HardnessTime { get; set; } = 10; public override bool CanSelectSelf => false; public override bool CanSelectEnemy => true; @@ -40,7 +40,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override ImmuneType IgnoreImmune => ImmuneType.All; 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 分裂伤害系数 => 0.25 + 0.02 * (Skill.Level - 1); public double 力量提升 => 0.6 * (Skill.Character?.BaseSTR ?? 0); diff --git a/OshimaModules/Skills/Oshima/熵灭极诣.cs b/OshimaModules/Skills/Oshima/熵灭极诣.cs index f9ed629..46efef3 100644 --- a/OshimaModules/Skills/Oshima/熵灭极诣.cs +++ b/OshimaModules/Skills/Oshima/熵灭极诣.cs @@ -26,13 +26,13 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; 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 double Duration => 10 + 1 * (Level - 1); + public override double Duration => 10 + 2 * (Level - 1); public override DispelledType DispelledType => DispelledType.CannotBeDispelled; 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; public override void OnEffectGained(Character character) diff --git a/OshimaModules/Skills/Ryuko/宿命之潮.cs b/OshimaModules/Skills/Ryuko/宿命之潮.cs index 6989b22..33b02f2 100644 --- a/OshimaModules/Skills/Ryuko/宿命之潮.cs +++ b/OshimaModules/Skills/Ryuko/宿命之潮.cs @@ -14,7 +14,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override string ExemptionDescription => Effects.Count > 0 ? Effects.First().ExemptionDescription : ""; public override double EPCost => 100; - public override double CD => 60; + public override double CD => 80; public override double HardnessTime { get; set; } = 2; public override bool CanSelectSelf => true; 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)) { - Effect e = new 禁止治疗(Skill, character, true, 熵核影响敌人时间, 0) + 禁止治疗 e = new(Skill, character, false, true, true, true, 熵核影响敌人时间, 0) { ExemptionType = PrimaryAttribute.AGI, ExemptDuration = false, @@ -100,7 +100,7 @@ namespace Oshima.FunGame.OshimaModules.Skills }; 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); e.OnEffectGained(enemy); GamingQueue?.LastRound.AddApplyEffects(enemy, e.EffectType); diff --git a/OshimaModules/Skills/TheGodK/概念之骰.cs b/OshimaModules/Skills/TheGodK/概念之骰.cs index 47e8005..9e7543a 100644 --- a/OshimaModules/Skills/TheGodK/概念之骰.cs +++ b/OshimaModules/Skills/TheGodK/概念之骰.cs @@ -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 totalDamageBonus) { - if (enemy == Skill.Character && 实际受到伤害减少 > 0) + if (enemy == Skill.Character && 实际受到伤害减少 > 0 && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical)) { double reduce = damage * 实际受到伤害减少; WriteLine($"[ {Skill.Character} ] 发动了概念之骰!伤害减少了 {reduce:0.##} 点!"); diff --git a/OshimaModules/Skills/dddovo/身心一境.cs b/OshimaModules/Skills/dddovo/身心一境.cs index 8895130..8e0cdf2 100644 --- a/OshimaModules/Skills/dddovo/身心一境.cs +++ b/OshimaModules/Skills/dddovo/身心一境.cs @@ -26,7 +26,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; 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 double Duration => 30; public override DispelledType DispelledType => DispelledType.CannotBeDispelled; diff --git a/OshimaModules/Skills/战技/天堂之吻.cs b/OshimaModules/Skills/战技/天堂之吻.cs index aac8bfe..0f6c6c2 100644 --- a/OshimaModules/Skills/战技/天堂之吻.cs +++ b/OshimaModules/Skills/战技/天堂之吻.cs @@ -10,7 +10,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override string Name => "天堂之吻"; public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; 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 HardnessTime { get; set; } = 10; public override bool CanSelectSelf => true; @@ -21,7 +21,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public 天堂之吻(Character? character = null) : base(SkillType.Skill, character) { CastRange = 5; - Effects.Add(new 提升友方行动速度(this, 120, 50, duration: 20)); + Effects.Add(new 提升友方行动速度(this, 90, 30, duration: 20)); } } } diff --git a/OshimaWebAPI/Controllers/FunGameController.cs b/OshimaWebAPI/Controllers/FunGameController.cs index e9bbf32..59449c4 100644 --- a/OshimaWebAPI/Controllers/FunGameController.cs +++ b/OshimaWebAPI/Controllers/FunGameController.cs @@ -60,48 +60,80 @@ namespace Oshima.FunGame.WebAPI.Controllers StringBuilder builder = new(); 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 names = [.. FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.MVPs).Select(kv => kv.Key.GetName())]; + List 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})"); 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.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())]; 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(); } @@ -121,37 +153,67 @@ namespace Oshima.FunGame.WebAPI.Controllers StringBuilder builder = new(); 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 names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.MVPs).Select(kv => kv.Key.GetName())]; + List 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})"); names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Winrate).Select(kv => kv.Key.GetName())]; builder.AppendLine($"胜率:{stats.Winrate * 100:0.##}%(#{names.IndexOf(character.GetName()) + 1})");