diff --git a/OshimaCore/Controllers/FunGameController.cs b/OshimaCore/Controllers/FunGameController.cs index ed0eaa0..4f0e9ee 100644 --- a/OshimaCore/Controllers/FunGameController.cs +++ b/OshimaCore/Controllers/FunGameController.cs @@ -61,6 +61,7 @@ namespace Oshima.Core.Controllers builder.AppendLine($"总计败场数:{stats.Loses}"); builder.AppendLine($"胜率:{stats.Winrates * 100:0.##}%"); builder.AppendLine($"前三率:{stats.Top3rates * 100:0.##}%"); + builder.AppendLine($"技术得分:{stats.Rating:0.##}"); builder.AppendLine($"上次排名:{stats.LastRank} / 场均名次:{stats.AvgRank}"); return NetworkUtility.JsonSerialize(builder.ToString()); @@ -68,7 +69,7 @@ namespace Oshima.Core.Controllers } return NetworkUtility.JsonSerialize(""); } - + [HttpGet("teamstats")] public string GetTeamStats([FromQuery] int? id = null) { @@ -106,6 +107,7 @@ namespace Oshima.Core.Controllers builder.AppendLine($"总计败场数:{stats.Loses}"); builder.AppendLine($"胜率:{stats.Winrates * 100:0.##}%"); builder.AppendLine($"前三率:{stats.Top3rates * 100:0.##}%"); + builder.AppendLine($"技术得分:{stats.Rating:0.##}"); builder.AppendLine($"上次排名:{stats.LastRank} / 场均名次:{stats.AvgRank}"); return NetworkUtility.JsonSerialize(builder.ToString()); diff --git a/OshimaCore/Utils/FunGameUtil.cs b/OshimaCore/Utils/FunGameUtil.cs index 6e09fee..0849ddb 100644 --- a/OshimaCore/Utils/FunGameUtil.cs +++ b/OshimaCore/Utils/FunGameUtil.cs @@ -1,7 +1,6 @@ 锘縰sing System.Text; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; -using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; using Oshima.FunGame.OshimaModules; using Oshima.FunGame.OshimaModules.Characters; @@ -307,9 +306,25 @@ namespace Oshima.Core.Utils int 鍙戞斁鐨勯槻鍏峰搧璐 = 0; int 鍙戞斁鐨勯瀷瀛愬搧璐 = 0; int 鍙戞斁鐨勯グ鍝佸搧璐 = 0; - 绌烘姇(actionQueue, ref 鍙戞斁鐨勬鍣ㄥ搧璐, ref 鍙戞斁鐨勯槻鍏峰搧璐, ref 鍙戞斁鐨勯瀷瀛愬搧璐, ref 鍙戞斁鐨勯グ鍝佸搧璐); + 绌烘姇(actionQueue, 鍙戞斁鐨勬鍣ㄥ搧璐, 鍙戞斁鐨勯槻鍏峰搧璐, 鍙戞斁鐨勯瀷瀛愬搧璐, 鍙戞斁鐨勯グ鍝佸搧璐); if (isWeb) result.Add("=== 绌烘姇 ===\r\n" + Msg); double 涓嬩竴娆$┖鎶 = 40; + if (鍙戞斁鐨勬鍣ㄥ搧璐 < 4) + { + 鍙戞斁鐨勬鍣ㄥ搧璐++; + } + if (鍙戞斁鐨勯槻鍏峰搧璐 < 1) + { + 鍙戞斁鐨勯槻鍏峰搧璐++; + } + if (鍙戞斁鐨勯瀷瀛愬搧璐 < 1) + { + 鍙戞斁鐨勯瀷瀛愬搧璐++; + } + if (鍙戞斁鐨勯グ鍝佸搧璐 < 3) + { + 鍙戞斁鐨勯グ鍝佸搧璐++; + } // 鏄剧ず瑙掕壊淇℃伅 if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo())); @@ -322,8 +337,9 @@ namespace Oshima.Core.Utils // 鍥㈤槦妯″紡 if (isTeam) { + Msg = "=== 鍥㈤槦妯″紡闅忔満鍒嗙粍 ===\r\n\r\n"; // 鎵撲贡瑙掕壊鍒楄〃 - List shuffledCharacters = characters.OrderBy(c => Random.Shared.Next()).ToList(); + List shuffledCharacters = [.. characters.OrderBy(c => Random.Shared.Next())]; // 鍒涘缓涓や釜鍥㈤槦 List group1 = []; @@ -343,8 +359,14 @@ namespace Oshima.Core.Utils } // 娣诲姞鍒板洟闃熷瓧鍏 - actionQueue.Teams.Add("闃熶紞涓", group1); - actionQueue.Teams.Add("闃熶紞浜", group2); + actionQueue.AddTeam("闃熶紞涓", group1); + actionQueue.AddTeam("闃熶紞浜", group2); + + foreach (string team in actionQueue.Teams.Keys) + { + WriteLine($"鍥㈤槦銆恵team}銆戠殑鎴愬憳锛歕r\n{string.Join("\r\n", actionQueue.Teams[team].Members)}\r\n"); + } + result.Add(Msg); } // 鏄剧ず鍒濆椤哄簭琛 @@ -414,9 +436,25 @@ namespace Oshima.Core.Utils { // 绌烘姇 Msg = ""; - 绌烘姇(actionQueue, ref 鍙戞斁鐨勬鍣ㄥ搧璐, ref 鍙戞斁鐨勯槻鍏峰搧璐, ref 鍙戞斁鐨勯瀷瀛愬搧璐, ref 鍙戞斁鐨勯グ鍝佸搧璐); + 绌烘姇(actionQueue, 鍙戞斁鐨勬鍣ㄥ搧璐, 鍙戞斁鐨勯槻鍏峰搧璐, 鍙戞斁鐨勯瀷瀛愬搧璐, 鍙戞斁鐨勯グ鍝佸搧璐); if (isWeb) result.Add("=== 绌烘姇 ===\r\n" + Msg); 涓嬩竴娆$┖鎶 = 40; + if (鍙戞斁鐨勬鍣ㄥ搧璐 < 4) + { + 鍙戞斁鐨勬鍣ㄥ搧璐++; + } + if (鍙戞斁鐨勯槻鍏峰搧璐 < 1) + { + 鍙戞斁鐨勯槻鍏峰搧璐++; + } + if (鍙戞斁鐨勯瀷瀛愬搧璐 < 1) + { + 鍙戞斁鐨勯瀷瀛愬搧璐++; + } + if (鍙戞斁鐨勯グ鍝佸搧璐 < 3) + { + 鍙戞斁鐨勯グ鍝佸搧璐++; + } } if (actionQueue.Eliminated.Count > deaths) @@ -444,18 +482,48 @@ namespace Oshima.Core.Utils } // 璧涘悗缁熻 - WriteLine("=== 浼ゅ鎺掕姒 ==="); - int top = isWeb ? 12 : 6; - Msg = $"=== 浼ゅ鎺掕姒 TOP{top} ===\r\n"; + GetCharacterRating(actionQueue.CharacterStatistics); + int top = isWeb ? actionQueue.CharacterStatistics.Count : 0; // 鍥炴墽澶氬皯涓鑹茬殑缁熻淇℃伅 int count = 1; + if (isWeb) + { + WriteLine("=== 鎶鏈緱鍒嗘帓琛屾 ==="); // 杩欐槸杈撳嚭鍦ㄧ晫闈笂鐨 + Msg = $"=== 鎶鏈緱鍒嗘帓琛屾 TOP{top} ===\r\n"; // 杩欎釜鏄笅涓鏉$粰Result鍥炴墽鐨勬爣棰橈紝瑕嗙洊鎺変笂闈㈡柟娉曢噷鐨勮祴鍊间簡 + } + else + { + WriteLine("=== 鏈満姣旇禌鏈浣宠鑹 ==="); + Msg = $"=== 鏈満姣旇禌鏈浣宠鑹 ===\r\n"; + // 缁熻鎶鏈緱鍒 + Character? character = actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key).FirstOrDefault(); + if (character != null) + { + CharacterStatistics stats = actionQueue.CharacterStatistics[character]; + StringBuilder builder = new(); + builder.AppendLine($"{(isWeb ? count + "." : (isTeam ? "[ " + actionQueue.GetTeamFromEliminated(character)?.Name + " ]" ?? "" : ""))} [ {character.ToStringWithLevel()} ]"); + builder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}"); + builder.AppendLine($"瀛樻椿鏃堕暱锛歿stats.LiveTime} / 瀛樻椿鍥炲悎鏁帮細{stats.LiveRound} / 琛屽姩鍥炲悎鏁帮細{stats.ActionTurn}"); + builder.AppendLine($"鎬昏浼ゅ锛歿stats.TotalDamage} / 鎬昏鐗╃悊浼ゅ锛歿stats.TotalPhysicalDamage} / 鎬昏榄旀硶浼ゅ锛歿stats.TotalMagicDamage}"); + builder.AppendLine($"鎬绘壙鍙椾激瀹筹細{stats.TotalTakenDamage} / 鎬绘壙鍙楃墿鐞嗕激瀹筹細{stats.TotalTakenPhysicalDamage} / 鎬绘壙鍙楅瓟娉曚激瀹筹細{stats.TotalTakenMagicDamage}"); + builder.Append($"姣忕浼ゅ锛歿stats.DamagePerSecond} / 姣忓洖鍚堜激瀹筹細{stats.DamagePerTurn}"); + WriteLine(builder.ToString()); + } + } + + if (PrintOut) + { + Console.WriteLine(); + Console.WriteLine("=== 鎶鏈緱鍒嗘帓琛屾 ==="); + } if (isTeam) { - foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key)) + foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key)) { StringBuilder builder = new(); CharacterStatistics stats = actionQueue.CharacterStatistics[character]; - builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] 锛坽stats.Kills} / {stats.Assists}锛"); + builder.AppendLine($"{(isWeb ? count + "." : ("[ " + actionQueue.GetTeamFromEliminated(character)?.Name + " ]" ?? ""))} [ {character.ToStringWithLevel()} ]"); + builder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}"); builder.AppendLine($"瀛樻椿鏃堕暱锛歿stats.LiveTime} / 瀛樻椿鍥炲悎鏁帮細{stats.LiveRound} / 琛屽姩鍥炲悎鏁帮細{stats.ActionTurn}"); builder.AppendLine($"鎬昏浼ゅ锛歿stats.TotalDamage} / 鎬昏鐗╃悊浼ゅ锛歿stats.TotalPhysicalDamage} / 鎬昏榄旀硶浼ゅ锛歿stats.TotalMagicDamage}"); builder.AppendLine($"鎬绘壙鍙椾激瀹筹細{stats.TotalTakenDamage} / 鎬绘壙鍙楃墿鐞嗕激瀹筹細{stats.TotalTakenPhysicalDamage} / 鎬绘壙鍙楅瓟娉曚激瀹筹細{stats.TotalTakenMagicDamage}"); @@ -472,61 +540,18 @@ namespace Oshima.Core.Utils CharacterStatistics? totalStats = TeamCharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault(); if (totalStats != null) { - // 缁熻姝よ鑹茬殑鎵鏈夋暟鎹 - totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage); - totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage); - totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage); - totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage); - totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage); - totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage); - totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage); - totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage); - totalStats.LiveRound += stats.LiveRound; - totalStats.ActionTurn += stats.ActionTurn; - totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime); - totalStats.TotalEarnedMoney += stats.TotalEarnedMoney; - totalStats.Kills += stats.Kills; - totalStats.Deaths += stats.Deaths; - totalStats.Assists += stats.Assists; - totalStats.FirstKills += stats.FirstKills; - totalStats.FirstDeaths += stats.FirstDeaths; - totalStats.LastRank = stats.LastRank; - double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank; - totalStats.Plays += stats.Plays; - if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays); - totalStats.Wins += stats.Wins; - totalStats.Top3s += stats.Top3s; - totalStats.Loses += stats.Loses; - if (totalStats.Plays != 0) - { - totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays); - totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays); - totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays); - totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays); - totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays); - totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays); - totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays); - totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays); - totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays; - totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays; - totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays); - totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays; - totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays)); - totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays)); - } - if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound); - if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn); - if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime); + UpdateStatistics(totalStats, stats); } } } else { - foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key)) + foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key)) { StringBuilder builder = new(); CharacterStatistics stats = actionQueue.CharacterStatistics[character]; - builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] 锛坽stats.Kills} / {stats.Assists}锛"); + builder.AppendLine($"{(isWeb ? count + ". " : "")}[ {character.ToStringWithLevel()} ]"); + builder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}"); builder.AppendLine($"瀛樻椿鏃堕暱锛歿stats.LiveTime} / 瀛樻椿鍥炲悎鏁帮細{stats.LiveRound} / 琛屽姩鍥炲悎鏁帮細{stats.ActionTurn}"); builder.AppendLine($"鎬昏浼ゅ锛歿stats.TotalDamage} / 鎬昏鐗╃悊浼ゅ锛歿stats.TotalPhysicalDamage} / 鎬昏榄旀硶浼ゅ锛歿stats.TotalMagicDamage}"); builder.AppendLine($"鎬绘壙鍙椾激瀹筹細{stats.TotalTakenDamage} / 鎬绘壙鍙楃墿鐞嗕激瀹筹細{stats.TotalTakenPhysicalDamage} / 鎬绘壙鍙楅瓟娉曚激瀹筹細{stats.TotalTakenMagicDamage}"); @@ -543,51 +568,7 @@ namespace Oshima.Core.Utils CharacterStatistics? totalStats = CharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault(); if (totalStats != null) { - // 缁熻姝よ鑹茬殑鎵鏈夋暟鎹 - totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage); - totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage); - totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage); - totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage); - totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage); - totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage); - totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage); - totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage); - totalStats.LiveRound += stats.LiveRound; - totalStats.ActionTurn += stats.ActionTurn; - totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime); - totalStats.TotalEarnedMoney += stats.TotalEarnedMoney; - totalStats.Kills += stats.Kills; - totalStats.Deaths += stats.Deaths; - totalStats.Assists += stats.Assists; - totalStats.FirstKills += stats.FirstKills; - totalStats.FirstDeaths += stats.FirstDeaths; - totalStats.LastRank = stats.LastRank; - double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank; - totalStats.Plays += stats.Plays; - if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays); - totalStats.Wins += stats.Wins; - totalStats.Top3s += stats.Top3s; - totalStats.Loses += stats.Loses; - if (totalStats.Plays != 0) - { - totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays); - totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays); - totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays); - totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays); - totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays); - totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays); - totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays); - totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays); - totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays; - totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays; - totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays); - totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays; - totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays)); - totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays)); - } - if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound); - if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn); - if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime); + UpdateStatistics(totalStats, stats); } } } @@ -646,35 +627,15 @@ namespace Oshima.Core.Utils if (PrintOut) Console.WriteLine(str); } - public static void 绌烘姇(ActionQueue queue, ref int wQuality, ref int aQuality, ref int sQuality, ref int acQuality) + public static void 绌烘姇(ActionQueue queue, int wQuality, int aQuality, int sQuality, int acQuality) { WriteLine($"绀惧尯閫佹俯鏆栦簡锛岀幇鍦ㄩ殢鏈哄彂鏀剧┖鎶曪紒锛"); foreach (Character character in queue.Queue) { - int t1 = wQuality; - int t2 = aQuality; - int t3 = sQuality; - int t4 = acQuality; - Item[] 姝﹀櫒 = Items.Where(i => i.Id.ToString().StartsWith("11") && (int)i.QualityType == t1).ToArray(); - if (wQuality < 4) - { - wQuality++; - } - Item[] 闃插叿 = Items.Where(i => i.Id.ToString().StartsWith("12") && (int)i.QualityType == t2).ToArray(); - if (aQuality < 1) - { - aQuality++; - } - Item[] 闉嬪瓙 = Items.Where(i => i.Id.ToString().StartsWith("13") && (int)i.QualityType == t3).ToArray(); - if (sQuality < 1) - { - sQuality++; - } - Item[] 楗板搧 = Items.Where(i => i.Id.ToString().StartsWith("14") && (int)i.QualityType == t4).ToArray(); - if (acQuality < 3) - { - acQuality++; - } + Item[] 姝﹀櫒 = Items.Where(i => i.Id.ToString().StartsWith("11") && (int)i.QualityType == wQuality).ToArray(); + Item[] 闃插叿 = Items.Where(i => i.Id.ToString().StartsWith("12") && (int)i.QualityType == aQuality).ToArray(); + Item[] 闉嬪瓙 = Items.Where(i => i.Id.ToString().StartsWith("13") && (int)i.QualityType == sQuality).ToArray(); + Item[] 楗板搧 = Items.Where(i => i.Id.ToString().StartsWith("14") && (int)i.QualityType == acQuality).ToArray(); Item? a = null, b = null, c = null, d = null; if (姝﹀櫒.Length > 0) { @@ -735,7 +696,7 @@ namespace Oshima.Core.Utils CharacterStatistics[character] = StatsConfig.Get(character.ToStringWithOutUser()) ?? CharacterStatistics[character]; } } - + foreach (Character c in Characters) { TeamCharacterStatistics.Add(c, new()); @@ -754,5 +715,110 @@ namespace Oshima.Core.Utils Items.AddRange(exItems.Values); Items.AddRange([new 鏀诲嚮涔嬬埅10(), new 鏀诲嚮涔嬬埅30(), new 鏀诲嚮涔嬬埅50()]); } + + public static void UpdateStatistics(CharacterStatistics totalStats, CharacterStatistics stats) + { + // 缁熻姝よ鑹茬殑鎵鏈夋暟鎹 + totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage); + totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage); + totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage); + totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage); + totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage); + totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage); + totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage); + totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage); + totalStats.LiveRound += stats.LiveRound; + totalStats.ActionTurn += stats.ActionTurn; + totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime); + totalStats.TotalEarnedMoney += stats.TotalEarnedMoney; + totalStats.Kills += stats.Kills; + totalStats.Deaths += stats.Deaths; + totalStats.Assists += stats.Assists; + totalStats.FirstKills += stats.FirstKills; + totalStats.FirstDeaths += stats.FirstDeaths; + totalStats.LastRank = stats.LastRank; + double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank; + double totalRating = totalStats.Rating * totalStats.Plays + stats.Rating; + totalStats.Plays += stats.Plays; + if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays); + else totalStats.AvgRank = stats.LastRank; + if (totalStats.Plays != 0) totalStats.Rating = Calculation.Round4Digits(totalRating / totalStats.Plays); + else totalStats.Rating = stats.Rating; + totalStats.Wins += stats.Wins; + totalStats.Top3s += stats.Top3s; + totalStats.Loses += stats.Loses; + if (totalStats.Plays != 0) + { + totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays); + totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays); + totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays); + totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays); + totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays); + totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays); + totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays); + totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays); + totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays; + totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays; + totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays); + totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays; + totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays)); + totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays)); + } + if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound); + if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn); + if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime); + } + + public static void GetCharacterRating(Dictionary statistics) + { + Dictionary ratings = statistics.ToDictionary(k => k.Key, v => CalculateRating(v.Value)); + foreach (Character character in ratings.Keys) + { + statistics[character].Rating = ratings[character]; + } + } + + public static double CalculateRating(CharacterStatistics stats) + { + // 璁惧畾鍩哄噯鍊 + double avgKills = 4.0; + double avgAssists = 2.5; + double avgDeaths = 1.0; + double avgLiveTime = 90.0; + double avgTotalDamage = 7500.0; + double avgTotalTakenDamage = 5500.0; + double avgDamagePerSecond = 80.0; + + // 褰掍竴鍖栬绠 + double normalizedKills = stats.Kills / avgKills; + double normalizedAssists = stats.Assists / avgAssists; + double normalizedDeaths = avgDeaths - stats.Deaths / avgDeaths; + double normalizedLiveTime = stats.LiveTime / avgLiveTime; + double normalizedTotalDamage = stats.TotalDamage / avgTotalDamage; + double normalizedTotalTakenDamage = stats.TotalTakenDamage / avgTotalTakenDamage; + double normalizedDamagePerSecond = stats.DamagePerSecond / avgDamagePerSecond; + + // 鏉冮噸璁剧疆 + double killWeight = 0.4; + double assistWeight = 0.15; + double deathWeight = -0.20; + double liveTimeWeight = 0.2; + double totalDamageWeight = 0.3; + double totalTakenDamageWeight = 0.15; + double damagePerSecondWeight = 0.05; + + // 璁$畻褰掍竴鍖栧悗鐨凴ating + double rating = + killWeight * normalizedKills + + assistWeight * normalizedAssists + + deathWeight * normalizedDeaths + + liveTimeWeight * normalizedLiveTime + + totalDamageWeight * normalizedTotalDamage + + totalTakenDamageWeight * normalizedTotalTakenDamage + + damagePerSecondWeight * normalizedDamagePerSecond; + + // 闄愬埗Rating鍦 0 鍜 5 涔嬮棿 + return Math.Clamp(rating, 0, 5); + } } } diff --git a/OshimaModules/Modules/SkillModule.cs b/OshimaModules/Modules/SkillModule.cs index 0300f5a..06384f5 100644 --- a/OshimaModules/Modules/SkillModule.cs +++ b/OshimaModules/Modules/SkillModule.cs @@ -1,6 +1,5 @@ 锘縰sing Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; -using Oshima.FunGame.OshimaModules.Effects; using Oshima.FunGame.OshimaModules.Effects.OpenEffects; using Oshima.FunGame.OshimaModules.Items; using Oshima.FunGame.OshimaModules.Skills; diff --git a/OshimaModules/Skills/NiuNan/鏅烘収涓庡姏閲.cs b/OshimaModules/Skills/NiuNan/鏅烘収涓庡姏閲.cs index 764bedf..e50f1b5 100644 --- a/OshimaModules/Skills/NiuNan/鏅烘収涓庡姏閲.cs +++ b/OshimaModules/Skills/NiuNan/鏅烘収涓庡姏閲.cs @@ -1,5 +1,4 @@ 锘縰sing Milimoe.FunGame.Core.Entity; -using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Oshima.FunGame.OshimaModules.Skills diff --git a/configs/oshima-studios/oshima.fungame.items.json b/configs/oshima-studios/oshima.fungame.items.json index bffa05c..486bc4d 100644 --- a/configs/oshima-studios/oshima.fungame.items.json +++ b/configs/oshima-studios/oshima.fungame.items.json @@ -637,7 +637,7 @@ "鍒濈骇娉曡": { "Id": 12501, "Name": "鍒濈骇娉曡", - "Description": "澧炲姞 20 鐐圭墿鐞嗘姢鐢层", + "Description": "澧炲姞 10% 榄旀硶鎶楁с", "BackgroundStory": "鍙互涓嶇┛锛屼笉鑳芥病鏈夈", "ItemType": 2, "WeaponType": 0, @@ -651,8 +651,9 @@ "SkillType": 3, "Effects": [ { - "Id": 8002, - "exdef": 20 + "Id": 8020, + "mdftype": 0, + "mdfvalue": 0.2 } ] } @@ -661,8 +662,8 @@ }, "楂樹腑鏍℃湇": { "Id": 12502, - "Name": "鍒濈骇娉曡", - "Description": "澧炲姞 10% 榄旀硶鎶楁с", + "Name": "楂樹腑鏍℃湇", + "Description": "澧炲姞 20 鐐圭墿鐞嗘姢鐢层", "BackgroundStory": "鐝嶈棌鐨勫洖蹇嗐", "ItemType": 2, "WeaponType": 0, @@ -676,9 +677,8 @@ "SkillType": 3, "Effects": [ { - "Id": 8020, - "mdftype": 0, - "mdfvalue": 0.2 + "Id": 8002, + "exdef": 20 } ] }