From fd2bf430c3031761bb7ccd4887555a8378b2c5ee Mon Sep 17 00:00:00 2001 From: milimoe Date: Wed, 30 Oct 2024 01:24:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=A2=E9=98=9F=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OshimaCore/Controllers/FunGameController.cs | 60 +- OshimaCore/Utils/FunGameUtil.cs | 340 +++++++--- OshimaModules/Items/Accessory/鏀诲嚮涔嬬埅.cs | 3 + OshimaModules/Modules/SkillModule.cs | 9 + OshimaServers/FastAutoServer.cs | 2 +- .../oshima-studios/oshima.fungame.items.json | 639 +++++++++++++++++- 6 files changed, 953 insertions(+), 100 deletions(-) diff --git a/OshimaCore/Controllers/FunGameController.cs b/OshimaCore/Controllers/FunGameController.cs index d881fd9..ed0eaa0 100644 --- a/OshimaCore/Controllers/FunGameController.cs +++ b/OshimaCore/Controllers/FunGameController.cs @@ -17,16 +17,11 @@ namespace Oshima.Core.Controllers private readonly ILogger _logger = logger; [HttpGet("test")] - public List GetTest([FromQuery] bool? isweb = null) + public List GetTest([FromQuery] bool? isweb = null, [FromQuery] bool? isteam = null) { - if (isweb ?? true) - { - return FunGameSimulation.StartGame(false, true); - } - else - { - return FunGameSimulation.StartGame(false, false); - } + bool web = isweb ?? true; + bool team = isteam ?? false; + return FunGameSimulation.StartGame(false, web, team); } [HttpGet("stats")] @@ -58,6 +53,53 @@ namespace Oshima.Core.Controllers 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.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}"); + builder.AppendLine($"胜率:{stats.Winrates * 100:0.##}%"); + builder.AppendLine($"前三率:{stats.Top3rates * 100:0.##}%"); + builder.AppendLine($"上次排名:{stats.LastRank} / 场均名次:{stats.AvgRank}"); + + return NetworkUtility.JsonSerialize(builder.ToString()); + } + } + return NetworkUtility.JsonSerialize(""); + } + + [HttpGet("teamstats")] + public string GetTeamStats([FromQuery] int? id = null) + { + if (id != null && id > 0 && id <= FunGameSimulation.Characters.Count) + { + Character character = FunGameSimulation.Characters[Convert.ToInt32(id) - 1]; + if (FunGameSimulation.TeamCharacterStatistics.TryGetValue(character, out CharacterStatistics? stats) && stats != null) + { + StringBuilder builder = new(); + + builder.AppendLine(character.ToString()); + 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.TotalRealDamage:0.##} / 场均:{stats.AvgRealDamage: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.TotalTakenRealDamage:0.##} / 场均:{stats.AvgTakenRealDamage:0.##}"); + builder.AppendLine($"总计存活回合数:{stats.LiveRound} / 场均:{stats.AvgLiveRound}"); + builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}"); + builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime: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.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.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}"); diff --git a/OshimaCore/Utils/FunGameUtil.cs b/OshimaCore/Utils/FunGameUtil.cs index 8ffabc3..12d987b 100644 --- a/OshimaCore/Utils/FunGameUtil.cs +++ b/OshimaCore/Utils/FunGameUtil.cs @@ -1,6 +1,7 @@ 锘縰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; @@ -31,13 +32,15 @@ namespace Oshima.Core.Utils public static List Characters { get; } = []; public static List Items { get; } = []; public static Dictionary CharacterStatistics { get; } = []; + public static Dictionary TeamCharacterStatistics { get; } = []; public static PluginConfig StatsConfig { get; } = new(nameof(FunGameSimulation), nameof(CharacterStatistics)); + public static PluginConfig TeamStatsConfig { get; } = new(nameof(FunGameSimulation), nameof(TeamCharacterStatistics)); public static bool IsRuning { get; set; } = false; public static bool IsWeb { get; set; } = false; public static bool PrintOut { get; set; } = false; public static string Msg { get; set; } = ""; - public static List StartGame(bool printout, bool isWeb = false) + public static List StartGame(bool printout, bool isWeb = false, bool isTeam = false) { PrintOut = printout; IsWeb = isWeb; @@ -291,15 +294,8 @@ namespace Oshima.Core.Utils } } - // 鏄剧ず瑙掕壊淇℃伅 - if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo())); - // 鍒涘缓椤哄簭琛ㄥ苟鎺掑簭 - ActionQueue actionQueue = new(characters, WriteLine); - if (PrintOut) Console.WriteLine(); - - // 鏄剧ず鍒濆椤哄簭琛 - actionQueue.DisplayQueue(); + ActionQueue actionQueue = new(characters, isTeam, WriteLine); if (PrintOut) Console.WriteLine(); // 鎬绘父鎴忔椂闀 @@ -307,9 +303,41 @@ namespace Oshima.Core.Utils // 寮濮嬬┖鎶 Msg = ""; - 绌烘姇(actionQueue); + int 鍙戞斁鐨勬鍣ㄥ搧璐 = 0; + int 鍙戞斁鐨勯槻鍏峰搧璐 = 0; + int 鍙戞斁鐨勯瀷瀛愬搧璐 = 0; + int 鍙戞斁鐨勯グ鍝佸搧璐 = 0; + 绌烘姇(actionQueue, ref 鍙戞斁鐨勬鍣ㄥ搧璐, ref 鍙戞斁鐨勯槻鍏峰搧璐, ref 鍙戞斁鐨勯瀷瀛愬搧璐, ref 鍙戞斁鐨勯グ鍝佸搧璐); if (isWeb) result.Add("=== 绌烘姇 ===\r\n" + Msg); - double 涓嬩竴娆$┖鎶 = 80; + double 涓嬩竴娆$┖鎶 = 40; + + // 鏄剧ず瑙掕壊淇℃伅 + if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo())); + + // 鍥犺祴浜堜簡瑁呭锛屾墍浠ユ竻闄ゆ帓搴忛噸鏂版帓 + actionQueue.ClearQueue(); + actionQueue.InitCharacterQueue(characters); + if (PrintOut) Console.WriteLine(); + + // 鍥㈤槦妯″紡 + if (isTeam) + { + // 鎵撲贡鍘熷鏁扮粍鐨勯『搴 + IEnumerable shuffledCharacters = characters.OrderBy(c => Random.Shared.Next()); + + // 璁$畻鍒嗗壊鐐 + int splitIndex = shuffledCharacters.Count() / 2; + + // 鍒嗘垚涓や釜鏁扮粍 + List group1 = shuffledCharacters.Take(splitIndex).ToList(); + List group2 = shuffledCharacters.Skip(splitIndex).ToList(); + actionQueue.Teams.Add("闃熶紞涓", group1); + actionQueue.Teams.Add("闃熶紞浜", group2); + } + + // 鏄剧ず鍒濆椤哄簭琛 + actionQueue.DisplayQueue(); + if (PrintOut) Console.WriteLine(); // 鎬诲洖鍚堟暟 int i = 1; @@ -366,9 +394,9 @@ namespace Oshima.Core.Utils { // 绌烘姇 Msg = ""; - 绌烘姇(actionQueue); + 绌烘姇(actionQueue, ref 鍙戞斁鐨勬鍣ㄥ搧璐, ref 鍙戞斁鐨勯槻鍏峰搧璐, ref 鍙戞斁鐨勯瀷瀛愬搧璐, ref 鍙戞斁鐨勯グ鍝佸搧璐); if (isWeb) result.Add("=== 绌烘姇 ===\r\n" + Msg); - 涓嬩竴娆$┖鎶 = 100; + 涓嬩竴娆$┖鎶 = 40; } if (actionQueue.Eliminated.Count > deaths) @@ -400,72 +428,150 @@ namespace Oshima.Core.Utils int top = isWeb ? 12 : 6; Msg = $"=== 浼ゅ鎺掕姒 TOP{top} ===\r\n"; int count = 1; - foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key)) - { - StringBuilder builder = new(); - CharacterStatistics stats = actionQueue.CharacterStatistics[character]; - builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] 锛坽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}"); - if (count++ <= top) - { - WriteLine(builder.ToString()); - } - else - { - if (PrintOut) Console.WriteLine(builder.ToString()); - } - CharacterStatistics? totalStats = CharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault(); - if (totalStats != null) + if (isTeam) + { + foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key)) { - // 缁熻姝よ鑹茬殑鎵鏈夋暟鎹 - 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.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) + StringBuilder builder = new(); + CharacterStatistics stats = actionQueue.CharacterStatistics[character]; + builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] 锛坽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}"); + if (count++ <= top) { - 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)); + WriteLine(builder.ToString()); + } + else + { + if (PrintOut) Console.WriteLine(builder.ToString()); + } + + 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); } - 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); } } + else + { + foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key)) + { + StringBuilder builder = new(); + CharacterStatistics stats = actionQueue.CharacterStatistics[character]; + builder.AppendLine($"{count}. [ {character.ToStringWithLevel()} ] 锛坽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}"); + if (count++ <= top) + { + WriteLine(builder.ToString()); + } + else + { + if (PrintOut) Console.WriteLine(builder.ToString()); + } + + 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); + } + } + } + result.Add(Msg); // 鏄剧ず姣忎釜瑙掕壊鐨勪俊鎭 @@ -478,13 +584,27 @@ namespace Oshima.Core.Utils } } - lock (StatsConfig) + if (isTeam) { - foreach (Character c in CharacterStatistics.Keys) + lock (TeamStatsConfig) { - StatsConfig.Add(c.ToStringWithOutUser(), CharacterStatistics[c]); + foreach (Character c in TeamCharacterStatistics.Keys) + { + TeamStatsConfig.Add(c.ToStringWithOutUser(), TeamCharacterStatistics[c]); + } + TeamStatsConfig.SaveConfig(); + } + } + else + { + lock (StatsConfig) + { + foreach (Character c in CharacterStatistics.Keys) + { + StatsConfig.Add(c.ToStringWithOutUser(), CharacterStatistics[c]); + } + StatsConfig.SaveConfig(); } - StatsConfig.SaveConfig(); } IsRuning = false; @@ -506,13 +626,57 @@ namespace Oshima.Core.Utils if (PrintOut) Console.WriteLine(str); } - public static void 绌烘姇(ActionQueue queue) + public static void 绌烘姇(ActionQueue queue, ref int wQuality, ref int aQuality, ref int sQuality, ref int acQuality) { - Item a = Items[Random.Shared.Next(Items.Count)]; - Item[] 杩欐鍙戞斁鐨勭┖鎶 = [a]; - WriteLine($"绀惧尯閫佹俯鏆栦簡锛岀幇鍦ㄥ悜鎵鏈変汉鍙戞斁 [ {a.Name} ]锛侊紒"); + 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? a = null, b = null, c = null, d = null; + if (姝﹀櫒.Length > 0) + { + a = 姝﹀櫒[Random.Shared.Next(姝﹀櫒.Length)]; + } + if (闃插叿.Length > 0) + { + b = 闃插叿[Random.Shared.Next(闃插叿.Length)]; + } + if (闉嬪瓙.Length > 0) + { + c = 闉嬪瓙[Random.Shared.Next(闉嬪瓙.Length)]; + } + if (楗板搧.Length > 0) + { + d = 楗板搧[Random.Shared.Next(楗板搧.Length)]; + } + List 杩欐鍙戞斁鐨勭┖鎶 = []; + if (a != null) 杩欐鍙戞斁鐨勭┖鎶.Add(a); + if (b != null) 杩欐鍙戞斁鐨勭┖鎶.Add(b); + if (c != null) 杩欐鍙戞斁鐨勭┖鎶.Add(c); + if (d != null) 杩欐鍙戞斁鐨勭┖鎶.Add(d); foreach (Item item in 杩欐鍙戞斁鐨勭┖鎶) { Item realItem = item.Copy(1); @@ -551,6 +715,20 @@ namespace Oshima.Core.Utils CharacterStatistics[character] = StatsConfig.Get(character.ToStringWithOutUser()) ?? CharacterStatistics[character]; } } + + foreach (Character c in Characters) + { + TeamCharacterStatistics.Add(c, new()); + } + + TeamStatsConfig.LoadConfig(); + foreach (Character character in TeamCharacterStatistics.Keys) + { + if (TeamStatsConfig.ContainsKey(character.ToStringWithOutUser())) + { + TeamCharacterStatistics[character] = TeamStatsConfig.Get(character.ToStringWithOutUser()) ?? TeamCharacterStatistics[character]; + } + } Dictionary exItems = Factory.GetGameModuleInstances(OshimaGameModuleConstant.General, OshimaGameModuleConstant.Item); Items.AddRange(exItems.Values); diff --git a/OshimaModules/Items/Accessory/鏀诲嚮涔嬬埅.cs b/OshimaModules/Items/Accessory/鏀诲嚮涔嬬埅.cs index f81723e..ed4f2be 100644 --- a/OshimaModules/Items/Accessory/鏀诲嚮涔嬬埅.cs +++ b/OshimaModules/Items/Accessory/鏀诲嚮涔嬬埅.cs @@ -10,6 +10,7 @@ namespace Oshima.FunGame.OshimaModules.Items public override long Id => (long)AccessoryID.鏀诲嚮涔嬬埅10; public override string Name => "鏀诲嚮涔嬬埅 +10"; public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : ""; + public override QualityType QualityType => QualityType.White; public 鏀诲嚮涔嬬埅10(Character? character = null) : base(ItemType.Accessory) { @@ -22,6 +23,7 @@ namespace Oshima.FunGame.OshimaModules.Items public override long Id => (long)AccessoryID.鏀诲嚮涔嬬埅30; public override string Name => "鏀诲嚮涔嬬埅 +30"; public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : ""; + public override QualityType QualityType => QualityType.Green; public 鏀诲嚮涔嬬埅30(Character? character = null) : base(ItemType.Accessory) { @@ -34,6 +36,7 @@ namespace Oshima.FunGame.OshimaModules.Items public override long Id => (long)AccessoryID.鏀诲嚮涔嬬埅50; public override string Name => "鏀诲嚮涔嬬埅 +50"; public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : ""; + public override QualityType QualityType => QualityType.Blue; public 鏀诲嚮涔嬬埅50(Character? character = null) : base(ItemType.Accessory) { diff --git a/OshimaModules/Modules/SkillModule.cs b/OshimaModules/Modules/SkillModule.cs index 195dfba..0300f5a 100644 --- a/OshimaModules/Modules/SkillModule.cs +++ b/OshimaModules/Modules/SkillModule.cs @@ -100,6 +100,15 @@ namespace Oshima.FunGame.OshimaModules EffectID.ExMDF => new ExMDF(skill, dict), EffectID.ExHR => new ExHR(skill, dict), EffectID.ExMR => new ExMR(skill, dict), + EffectID.ExATK2 => new ExATK2(skill, dict), + EffectID.ExDEF2 => new ExDEF2(skill, dict), + EffectID.ExSTR2 => new ExSTR2(skill, dict), + EffectID.ExAGI2 => new ExAGI2(skill, dict), + EffectID.ExINT2 => new ExINT2(skill, dict), + EffectID.SkillHardTimeReduce2 => new SkillHardTimeReduce2(skill, dict), + EffectID.NormalAttackHardTimeReduce2 => new NormalAttackHardTimeReduce2(skill, dict), + EffectID.ExMaxHP2 => new ExMaxHP2(skill, dict), + EffectID.ExMaxMP2 => new ExMaxMP2(skill, dict), _ => null }; } diff --git a/OshimaServers/FastAutoServer.cs b/OshimaServers/FastAutoServer.cs index 8257746..6baae42 100644 --- a/OshimaServers/FastAutoServer.cs +++ b/OshimaServers/FastAutoServer.cs @@ -339,7 +339,7 @@ namespace Oshima.FunGame.OshimaServers SendAllGamingMessage(data, c.GetInfo()); } - ActionQueue actionQueue = new(inGameCharacters, (str) => + ActionQueue actionQueue = new(inGameCharacters, false, (str) => { SendAllGamingMessage(data, str); }); diff --git a/configs/oshima-studios/oshima.fungame.items.json b/configs/oshima-studios/oshima.fungame.items.json index 4668e53..bffa05c 100644 --- a/configs/oshima-studios/oshima.fungame.items.json +++ b/configs/oshima-studios/oshima.fungame.items.json @@ -6,6 +6,7 @@ "BackgroundStory": "浼犺涓殑榛戞殫涔嬪垉锛岃暣鍚偑鎭跺姏閲忋", "ItemType": 1, "WeaponType": 1, + "QualityType": 0, "Price": 0, "Skills": { "Active": null, @@ -31,6 +32,7 @@ "BackgroundStory": "鐏劙涓敾閫犵殑闀垮墤锛屾暎鍙戠潃鐐欑儹姘旀伅銆", "ItemType": 1, "WeaponType": 2, + "QualityType": 0, "Price": 0, "Skills": { "Active": null, @@ -56,6 +58,7 @@ "BackgroundStory": "鐢辩█鏈夐摱鏈堟潗鏂欏埗鎴愶紝绮惧噯鏃犳瘮銆", "ItemType": 1, "WeaponType": 3, + "QualityType": 0, "Price": 0, "Skills": { "Active": null, @@ -81,6 +84,7 @@ "BackgroundStory": "鎹曟崏椋庢毚涔嬪姏鐨勬鍣紝灏勯熸儕浜恒", "ItemType": 1, "WeaponType": 5, + "QualityType": 0, "Price": 0, "Skills": { "Active": null, @@ -106,6 +110,7 @@ "BackgroundStory": "鏃犲舰鐨勫姏閲忓寮烘嫵濂楋紝閫傚悎杩呮嵎鏀诲嚮銆", "ItemType": 1, "WeaponType": 11, + "QualityType": 0, "Price": 0, "Skills": { "Active": null, @@ -131,6 +136,7 @@ "BackgroundStory": "钑村惈闆烽渾涔嬪姏鐨勭绉樹箣鍓戯紝鏂╁嚮鏃跺甫鏈夐浄鐢点", "ItemType": 1, "WeaponType": 1, + "QualityType": 1, "Price": 0, "Skills": { "Active": null, @@ -156,6 +162,7 @@ "BackgroundStory": "鐢辫繙鍙ら緳楠ㄩ敾閫犺屾垚鐨勫法鍓戯紝濞佸姏鏃犳瘮銆", "ItemType": 1, "WeaponType": 2, + "QualityType": 1, "Price": 0, "Skills": { "Active": null, @@ -181,6 +188,7 @@ "BackgroundStory": "鑳藉绌块忛粦鏆楃殑寮擄紝閫傚悎闅愬尶灏勫嚮銆", "ItemType": 1, "WeaponType": 3, + "QualityType": 1, "Price": 0, "Skills": { "Active": null, @@ -206,6 +214,7 @@ "BackgroundStory": "鑳藉鍙戝皠璧ょ劙鐨勬墜鏋紝杩戣窛绂诲▉鍔涙瀬澶с", "ItemType": 1, "WeaponType": 4, + "QualityType": 1, "Price": 0, "Skills": { "Active": null, @@ -231,6 +240,7 @@ "BackgroundStory": "鎹鑳藉鍙敜澶╃┖涔嬪姏鐨勬硶鏉栵紝鎷ユ湁寮哄ぇ榄斿姏銆", "ItemType": 1, "WeaponType": 8, + "QualityType": 1, "Price": 0, "Skills": { "Active": null, @@ -256,6 +266,7 @@ "BackgroundStory": "杩欐妸鍓戠噧鐑х潃姘告亽鐨勭伀鐒帮紝浼犺鍙互鐒氬敖涓鍒囥", "ItemType": 1, "WeaponType": 1, + "QualityType": 2, "Skills": { "Active": null, "Passives": [ @@ -280,6 +291,7 @@ "BackgroundStory": "姣忔灏勫嚮閮借兘寮曞彂鐙傞锛屼紶璇村畠鐢遍绁炰翰鎵嬫墦閫犮", "ItemType": 1, "WeaponType": 3, + "QualityType": 2, "Skills": { "Active": null, "Passives": [ @@ -304,6 +316,7 @@ "BackgroundStory": "鍦ㄧ牬鏅撴椂鍒嗭紝杩欐妸闀挎灙鑳藉绌块忎换浣曢粦鏆椼", "ItemType": 1, "WeaponType": 9, + "QualityType": 2, "Skills": { "Active": null, "Passives": [ @@ -328,6 +341,7 @@ "BackgroundStory": "杩欏鍖曢闂儊鐫姝讳骸鐨勫厜鑺掞紝涓撲负鍒哄鎵鐢ㄣ", "ItemType": 1, "WeaponType": 6, + "QualityType": 2, "Skills": { "Active": null, "Passives": [ @@ -352,6 +366,7 @@ "BackgroundStory": "鍙敜澶╅浄鐨勬硶鏉栵紝鎷ユ湁姣佸ぉ鐏湴鐨勫姏閲忋", "ItemType": 1, "WeaponType": 8, + "QualityType": 2, "Skills": { "Active": null, "Passives": [ @@ -376,6 +391,7 @@ "BackgroundStory": "姝ゅ墤椹鹃┉椋為浄涔嬪姏锛岃兘寮曞彂鐚涚儓鐨勯浄鍑汇", "ItemType": 1, "WeaponType": 1, + "QualityType": 3, "Skills": { "Active": null, "Passives": [ @@ -400,6 +416,7 @@ "BackgroundStory": "娉曟潠涓噧鐑х潃涓嶇伃鐨勭伀鐒帮紝璞″緛鐫鏃犲敖鐨勫姏閲忋", "ItemType": 1, "WeaponType": 8, + "QualityType": 3, "Skills": { "Active": null, "Passives": [ @@ -424,6 +441,7 @@ "BackgroundStory": "鐢辫繙鍙ら緳楠ㄥ埗鎴愮殑闀挎焺姝﹀櫒锛屽潥涓嶅彲鎽с", "ItemType": 1, "WeaponType": 9, + "QualityType": 3, "Skills": { "Active": null, "Passives": [ @@ -448,6 +466,7 @@ "BackgroundStory": "鍙屾寔鐭垁锛岄熷害濡傜柧椋庤埇杩呮嵎銆", "ItemType": 1, "WeaponType": 6, + "QualityType": 3, "Skills": { "Active": null, "Passives": [ @@ -472,6 +491,7 @@ "BackgroundStory": "鐢卞啺鏅舵墦閫犵殑鎵嬫灙锛屽瓙寮瑰甫鏈夋瀬瀵掍箣鍔涖", "ItemType": 1, "WeaponType": 4, + "QualityType": 3, "Skills": { "Active": null, "Passives": [ @@ -496,6 +516,7 @@ "BackgroundStory": "钘忎簬榛戞殫涓殑閿嬪埄鍒鍒冿紝鍙湪鏁屼汉鏈療瑙夋椂鐜拌韩銆", "ItemType": 1, "WeaponType": 11, + "QualityType": 4, "Skills": { "Active": null, "Passives": [ @@ -520,6 +541,7 @@ "BackgroundStory": "寮撳鸡涓婂嚌鑱氬瘨闇滐紝绠煝鑳藉喕缁撲竴鍒囥", "ItemType": 1, "WeaponType": 3, + "QualityType": 4, "Skills": { "Active": null, "Passives": [ @@ -544,6 +566,7 @@ "BackgroundStory": "鎼哄甫闆风數涔嬪姏鐨勫法鏂э紝涓鍑讳箣涓嬶紝闆峰0杞伴福銆", "ItemType": 1, "WeaponType": 2, + "QualityType": 4, "Skills": { "Active": null, "Passives": [ @@ -568,6 +591,7 @@ "BackgroundStory": "鎷冲鍐呯殑鍔涢噺鑳芥縺鍙戜僵鎴磋呯殑鐙傛掞紝閫犳垚澶ч噺浼ゅ銆", "ItemType": 1, "WeaponType": 10, + "QualityType": 4, "Skills": { "Active": null, "Passives": [ @@ -592,6 +616,7 @@ "BackgroundStory": "娉曞櫒涓暣鍚潃鏄熻景涔嬪姏锛屾瘡涓娆℃敾鍑婚兘濡傚ぉ澶栭櫒鐭抽檷涓淬", "ItemType": 1, "WeaponType": 7, + "QualityType": 4, "Skills": { "Active": null, "Passives": [ @@ -609,24 +634,76 @@ ] } }, - "鍦f磥涔嬬浘": { - "Id": 20001, - "Name": "鍦f磥涔嬬浘", - "Description": "鍙楀埌鐨勭墿鐞嗕激瀹冲噺灏 25%銆", - "BackgroundStory": "浼犺涓敱鍦e厜绁濈鐨勭浘鐗岋紝鑳藉鎶垫尅閭伓鐨勫姏閲忋", + "鍒濈骇娉曡": { + "Id": 12501, + "Name": "鍒濈骇娉曡", + "Description": "澧炲姞 20 鐐圭墿鐞嗘姢鐢层", + "BackgroundStory": "鍙互涓嶇┛锛屼笉鑳芥病鏈夈", "ItemType": 2, "WeaponType": 0, + "QualityType": 0, "Skills": { "Active": null, "Passives": [ { - "Id": 7100, + "Id": 7101, + "Name": "鍒濈骇娉曡", + "SkillType": 3, + "Effects": [ + { + "Id": 8002, + "exdef": 20 + } + ] + } + ] + } + }, + "楂樹腑鏍℃湇": { + "Id": 12502, + "Name": "鍒濈骇娉曡", + "Description": "澧炲姞 10% 榄旀硶鎶楁с", + "BackgroundStory": "鐝嶈棌鐨勫洖蹇嗐", + "ItemType": 2, + "WeaponType": 0, + "QualityType": 0, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7102, + "Name": "楂樹腑鏍℃湇", + "SkillType": 3, + "Effects": [ + { + "Id": 8020, + "mdftype": 0, + "mdfvalue": 0.2 + } + ] + } + ] + } + }, + "鍦f磥涔嬬浘": { + "Id": 12503, + "Name": "鍦f磥涔嬬浘", + "Description": "鍙楀埌鐨勭墿鐞嗕激瀹冲噺灏 20%銆", + "BackgroundStory": "浼犺涓敱鍦e厜绁濈鐨勭浘鐗岋紝鑳藉鎶垫尅閭伓鐨勫姏閲忋", + "ItemType": 2, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7103, "Name": "鍦e厜鎶や綉", "SkillType": 3, "Effects": [ { "Id": 8019, - "expdr": 0.25 + "expdr": 0.20 } ] } @@ -634,12 +711,13 @@ } }, "榄旇兘娉曡": { - "Id": 20005, + "Id": 12504, "Name": "榄旇兘娉曡", - "Description": "鎻愰珮 20% 榄旀姉锛屽鍔 15 鐐规櫤鍔涖", + "Description": "澧炲姞 15 鐐规櫤鍔涘拰 20% 榄旀硶鎶楁с", "BackgroundStory": "娉曡钑村惈鐫绁炵鐨勯瓟鍔涳紝绌挎埓鑰呰兘澧炲己榄旀硶濞佸姏銆", "ItemType": 2, "WeaponType": 0, + "QualityType": 1, "Skills": { "Active": null, "Passives": [ @@ -661,5 +739,548 @@ } ] } + }, + "鐐肩嫳鎴橀摖": { + "Id": 12505, + "Name": "鐐肩嫳鎴橀摖", + "Description": "澧炲姞 40 鐐圭墿鐞嗘姢鐢诧紝澧炲姞 10 鐐规瘡鏃堕棿鐢熷懡鍥炲銆", + "BackgroundStory": "鍦ㄦ棤灏芥垬鐏腑閿婚犺屾垚锛屽叿鏈夋瀬楂樼殑闃插尽鍔涖", + "ItemType": 2, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7105, + "Name": "鎴樼伀搴囨姢", + "SkillType": 3, + "Effects": [ + { + "Id": 8002, + "exdef": 40 + }, + { + "Id": 8021, + "exhr": 10 + } + ] + } + ] + } + }, + "骞藉奖鏂楃": { + "Id": 12506, + "Name": "骞藉奖鏂楃", + "Description": "澧炲姞 30 鐐圭墿鐞嗘姢鐢插拰 8% 闂伩鐜囥", + "BackgroundStory": "榛戞殫涓紪缁囪屾垚鐨勬枟绡凤紝鑳借绌挎埓鑰呮洿鍔犳晱鎹枫", + "ItemType": 2, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7106, + "Name": "骞藉奖闂伩", + "SkillType": 3, + "Effects": [ + { + "Id": 8002, + "exdef": 30 + }, + { + "Id": 8016, + "exer": 0.08 + } + ] + } + ] + } + }, + "甯嗗竷闉": { + "Id": 13501, + "Name": "甯嗗竷闉", + "Description": "澧炲姞 30 鐐硅鍔ㄩ熷害銆", + "BackgroundStory": "涓濡傚勾灏戞ā鏍枫", + "ItemType": 3, + "WeaponType": 0, + "QualityType": 0, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7701, + "Name": "甯嗗竷闉", + "SkillType": 3, + "Effects": [ + { + "Id": 8009, + "exspd": 30 + } + ] + } + ] + } + }, + "鐤鹃闈": { + "Id": 13502, + "Name": "鐤鹃闈", + "Description": "澧炲姞 65 鐐硅鍔ㄩ熷害锛屼娇绌挎埓鑰呰鍔ㄦ洿鍔犳晱鎹枫", + "BackgroundStory": "杩欏弻闈村瓙鐢遍鍏冪礌鍔犳寔锛屾浼愯交鐩堝椋庛", + "ItemType": 3, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7702, + "Name": "鐤鹃闈", + "SkillType": 3, + "Effects": [ + { + "Id": 8009, + "exspd": 65 + } + ] + } + ] + } + }, + "杞荤伒涔嬮瀷": { + "Id": 13503, + "Name": "杞荤伒涔嬮瀷", + "Description": "澧炲姞 45 鐐硅鍔ㄩ熷害锛屽苟鎻愰珮 10% 闂伩鐜囥", + "BackgroundStory": "浼犺杩欏弻闉嬭兘璁╃┛鎴磋呯殑姝ヤ紣楝奸瓍鑸蹇戒笉瀹氥", + "ItemType": 3, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7703, + "Name": "杞荤伒涔嬫", + "SkillType": 3, + "Effects": [ + { + "Id": 8009, + "exspd": 45 + }, + { + "Id": 8016, + "exer": 0.1 + } + ] + } + ] + } + }, + "闆风數闈": { + "Id": 13504, + "Name": "闆风數闈", + "Description": "澧炲姞 45 鐐硅鍔ㄩ熷害锛屽苟鎻愰珮 10% 鍐峰嵈缂╁噺銆", + "BackgroundStory": "杩欏弻闈村瓙钑村惈闆风數涔嬪姏锛屼娇绌挎埓鑰呭揩閫熷嚭鍑汇", + "ItemType": 3, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7704, + "Name": "闆烽渾涔嬮", + "SkillType": 3, + "Effects": [ + { + "Id": 8009, + "exspd": 45 + }, + { + "Id": 8011, + "excdr": 0.1 + } + ] + } + ] + } + }, + "鏆楀奖涔嬮澊": { + "Id": 13505, + "Name": "鏆楀奖涔嬮澊", + "Description": "澧炲姞 38 鐐硅鍔ㄩ熷害锛屽苟鎻愰珮 8% 鏆村嚮鐜囥", + "BackgroundStory": "杩欏弻闉嬪湪榛戞殫涓殣钘忥紝璧嬩簣绌挎埓鑰呮殫褰辩殑鍔涢噺銆", + "ItemType": 3, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7705, + "Name": "鏆楀奖鐤捐", + "SkillType": 3, + "Effects": [ + { + "Id": 8009, + "exspd": 38 + }, + { + "Id": 8014, + "excr": 0.08 + } + ] + } + ] + } + }, + "瀹堟姢鍚婂潬": { + "Id": 14501, + "Name": "瀹堟姢鍚婂潬", + "Description": "澧炲姞 3 鐐规墍鏈夊姏閲忋佹晱鎹枫佹櫤鍔涖", + "BackgroundStory": "甯︾潃涓涓濅笣蹇垫兂銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 0, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7301, + "Name": "瀹堟姢鍚婂潬", + "SkillType": 3, + "Effects": [ + { + "Id": 8003, + "exstr": 3 + }, + { + "Id": 8004, + "exagi": 3 + }, + { + "Id": 8005, + "exint": 3 + } + ] + } + ] + } + }, + "瀵岃吹澶村啝": { + "Id": 14502, + "Name": "瀵岃吹澶村啝", + "Description": "澧炲姞 170 鐐规渶澶х敓鍛藉煎拰 80 鐐规渶澶ч瓟娉曞笺", + "BackgroundStory": "杈夌厡鍗庤吹鐨勫ご鍐犮", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 0, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7302, + "Name": "瀹堟姢鍚婂潬", + "SkillType": 3, + "Effects": [ + { + "Id": 8012, + "exhp": 170 + }, + { + "Id": 8013, + "exmp": 80 + } + ] + } + ] + } + }, + "榛勯噾鎸傚潬": { + "Id": 14503, + "Name": "榛勯噾鎸傚潬", + "Description": "澧炲姞 300 鐐规渶澶х敓鍛藉笺", + "BackgroundStory": "鐝嶈吹绋鏈夌殑榛勯噾鎸備欢锛岃薄寰佽储瀵屼笌鑽h鐨勬姢韬銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7303, + "Name": "瀹堟姢鍚婂潬", + "SkillType": 3, + "Effects": [ + { + "Id": 8012, + "exhp": 300 + } + ] + } + ] + } + }, + "杈夌厡鍏夌幆": { + "Id": 14504, + "Name": "杈夌厡鍏夌幆", + "Description": "澧炲姞 170 鐐规渶澶ч瓟娉曞煎拰 6 鐐规瘡鏃堕棿榄旀硶鍥炲銆", + "BackgroundStory": "娴佸厜婧㈠僵鐨勫厜鐜", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7304, + "Name": "杈夌厡鍏夌幆", + "SkillType": 3, + "Effects": [ + { + "Id": 8013, + "exmp": 170 + }, + { + "Id": 8022, + "exmr": 6 + } + ] + } + ] + } + }, + "閾惰川鎵嬬幆": { + "Id": 14505, + "Name": "閾惰川鎵嬬幆", + "Description": "鎻愬崌 6 鐐规墍鏈夊姏閲忋佹晱鎹枫佹櫤鍔涖", + "BackgroundStory": "绱犻泤绮捐嚧鐨勯摱璐ㄦ墜鐜", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 1, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7305, + "Name": "閾惰川鎵嬬幆", + "SkillType": 3, + "Effects": [ + { + "Id": 8003, + "exstr": 6 + }, + { + "Id": 8004, + "exagi": 6 + }, + { + "Id": 8005, + "exint": 6 + } + ] + } + ] + } + }, + "鏄熻緣鎶ょ": { + "Id": 14506, + "Name": "鏄熻緣鎶ょ", + "Description": "鎻愬崌 15 鐐规櫤鍔涳紝鎻愬崌鏆村嚮浼ゅ 12%銆", + "BackgroundStory": "鎶ょ涓婇暥宓岀潃绁炵鐨勬槦杈夊疂鐭筹紝浼犺鑳芥彁鍗囦僵鎴磋呯殑娉曟湳濞佸姏銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 2, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7306, + "Name": "鏄熻緣鍚ず", + "SkillType": 3, + "Effects": [ + { + "Id": 8005, + "exint": 15 + }, + { + "Id": 8015, + "excrd": 0.12 + } + ] + } + ] + } + }, + "闆烽福涔嬫垝": { + "Id": 14507, + "Name": "闆烽福涔嬫垝", + "Description": "澧炲姞 12 鐐瑰姏閲忓拰 8% 鏆村嚮鐜囥", + "BackgroundStory": "鎴掓寚涓祦娣岀潃闆风數鐨勫姏閲忥紝澧炲己浣╂埓鑰呯殑鎴樻枟濞佸姏銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 2, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7307, + "Name": "闆风數涔嬪姏", + "SkillType": 3, + "Effects": [ + { + "Id": 8003, + "exstr": 12 + }, + { + "Id": 8014, + "excr": 0.08 + } + ] + } + ] + } + }, + "绮剧伒涔嬫垝": { + "Id": 14508, + "Name": "绮剧伒涔嬫垝", + "Description": "鎻愬崌 10 姣忔椂闂撮瓟娉曞洖澶嶏紝骞跺鍔 8 鐐规櫤鍔涖", + "BackgroundStory": "杩欐灇鎴掓寚鐢辩簿鐏靛埗鎴愶紝鑳藉甯姪娉曞笀鏇村揩鍦版仮澶嶆硶鍔涖", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 2, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7308, + "Name": "娉曞姏澶嶈嫃", + "SkillType": 3, + "Effects": [ + { + "Id": 8022, + "exmr": 10 + }, + { + "Id": 8005, + "exint": 8 + } + ] + } + ] + } + }, + "鏆楀奖椤归摼": { + "Id": 14509, + "Name": "鏆楀奖椤归摼", + "Description": "澧炲姞 20 鐐规晱鎹峰拰 20 鐐硅鍔ㄩ熷害銆", + "BackgroundStory": "椤归摼钑村惈鐫榛戞殫鐨勫姏閲忥紝璁╀僵鎴磋呮洿鍏锋晱鎹锋с", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 2, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7309, + "Name": "榛戞殫鏁忔嵎", + "SkillType": 3, + "Effects": [ + { + "Id": 8015, + "excrd": 0.15 + }, + { + "Id": 8009, + "exspd": 20 + } + ] + } + ] + } + }, + "Yuki銇瓹alfSocks": { + "Id": 14510, + "Name": "Yuki銇瓹alfSocks", + "Description": "澧炲姞 15% 鏆村嚮鐜囧拰 30% 鏆村嚮浼ゅ銆", + "BackgroundStory": "灏忛洩鐨勫皬鑵胯锛屾嫢鏈夌绉樼殑鍔涢噺锛屼护浜虹寰銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 3, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7310, + "Name": "Yuki銇瓹alfSocks", + "SkillType": 3, + "Effects": [ + { + "Id": 8014, + "excr": 0.15 + }, + { + "Id": 8015, + "excrd": 0.3 + } + ] + } + ] + } + }, + "璇哄皵甯岀殑鐜颁唬姹夎瀛楀吀": { + "Id": 14511, + "Name": "璇哄皵甯岀殑鐜颁唬姹夎瀛楀吀", + "Description": "澧炲姞 15% 鏀诲嚮鍔涘拰 8% 鐗╃悊鎶ょ敳銆", + "BackgroundStory": "鎳傚張涓嶆噦銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 3, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7311, + "Name": "璇哄皵甯岀殑鐜颁唬姹夎瀛楀吀", + "SkillType": 3, + "Effects": [ + { + "Id": 8024, + "exdef": 0.08 + }, + { + "Id": 8023, + "exatk": 0.15 + } + ] + } + ] + } + }, + "閲戝垰鐭": { + "Id": 14512, + "Name": "閲戝垰鐭", + "Description": "澧炲姞 10% 鏈澶х敓鍛藉笺", + "BackgroundStory": "缃曡瀹濈煶锛岃暣鍚笉鍙姩鎽囩殑鍧氶煣涔嬪姏銆", + "ItemType": 4, + "WeaponType": 0, + "QualityType": 3, + "Skills": { + "Active": null, + "Passives": [ + { + "Id": 7312, + "Name": "閲戝垰鐭", + "SkillType": 3, + "Effects": [ + { + "Id": 8030, + "exhp": 0.10 + } + ] + } + ] + } } } \ No newline at end of file