diff --git a/OshimaCore/Controllers/FunGameController.cs b/OshimaCore/Controllers/FunGameController.cs index 95cda94..5d13aaf 100644 --- a/OshimaCore/Controllers/FunGameController.cs +++ b/OshimaCore/Controllers/FunGameController.cs @@ -1124,7 +1124,7 @@ namespace Oshima.Core.Controllers Character character = user.Inventory.Characters.ToList()[cIndex - 1]; if (isSimple) { - return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色简略信息:\r\n{character.GetSimpleInfo().Trim()}"); + return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色简略信息:\r\n{character.GetSimpleInfo(showEXP: true).Trim()}"); } return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色详细信息:\r\n{character.GetInfo().Trim()}"); } @@ -1340,7 +1340,7 @@ namespace Oshima.Core.Controllers return [$"对方似乎还没有自建角色,请发送【生成自建角色】创建!"]; } - return FunGameActionQueue.StartGame([character1, character2], false, false, false, false); + return FunGameActionQueue.StartGame([character1, character2], false, false, false, false, false); } else { @@ -1381,7 +1381,7 @@ namespace Oshima.Core.Controllers if (master != null && master == GeneralSettings.Master) { FunGameService.Reload(); - FunGameActionQueue.InitFunGame(); + FunGameActionQueue.InitFunGameActionQueue(); return NetworkUtility.JsonSerialize("FunGame已重新加载。"); } return NetworkUtility.JsonSerialize("提供的参数不正确。"); diff --git a/OshimaCore/Controllers/TestController.cs b/OshimaCore/Controllers/TestController.cs index d496317..98ccec8 100644 --- a/OshimaCore/Controllers/TestController.cs +++ b/OshimaCore/Controllers/TestController.cs @@ -3,9 +3,11 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Exception; using Milimoe.FunGame.Core.Library.SQLScript.Common; using Oshima.Core.Constant; +using TaskScheduler = Milimoe.FunGame.Core.Api.Utility.TaskScheduler; namespace Oshima.Core.Controllers { @@ -51,5 +53,11 @@ namespace Oshima.Core.Controllers } return NetworkUtility.JsonSerialize("鏃犳硶璋冪敤姝ゆ帴鍙c傚師鍥狅細涓 SQL 鏈嶅姟鍣ㄩ氫俊澶辫触銆"); } + + [HttpGet("gettask")] + public string GetTaskScheduler(string name) + { + return NetworkUtility.JsonSerialize(TaskScheduler.Shared.GetRunTimeInfo(name)); + } } } diff --git a/OshimaCore/OshimaWebAPI.cs b/OshimaCore/OshimaWebAPI.cs index c05a522..8fbda9c 100644 --- a/OshimaCore/OshimaWebAPI.cs +++ b/OshimaCore/OshimaWebAPI.cs @@ -1,10 +1,12 @@ 锘縰sing Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Common.Addon; +using Milimoe.FunGame.Core.Library.Constant; using Oshima.Core.Configs; using Oshima.Core.Constant; using Oshima.Core.Utils; using Oshima.FunGame.OshimaModules; +using TaskScheduler = Milimoe.FunGame.Core.Api.Utility.TaskScheduler; namespace Oshima.Core.WebAPI { @@ -45,78 +47,39 @@ namespace Oshima.Core.WebAPI SayNo.InitSayNo(); Ignore.InitIgnore(); FunGameService.InitFunGame(); - FunGameActionQueue.InitFunGame(); - Task taskTime = Task.Factory.StartNew(async () => + FunGameActionQueue.InitFunGameActionQueue(); + List<(int start, int end, double expPerLevel)> levelRanges = [ + (1, 9, 1000), + (10, 19, 1500), + (20, 29, 2000), + (30, 39, 3000), + (40, 49, 4000), + (50, 59, 5000) + ]; + foreach (var (start, end, expPerLevel) in levelRanges) { - bool check9 = true; - bool check15 = true; - while (true) + for (int level = start; level <= end; level++) { - try - { - DateTime now = DateTime.Now; - if (now.Hour == 8 && now.Minute == 30 && !Daily.DailyNews) - { - Daily.DailyNews = true; - Console.ForegroundColor = ConsoleColor.Magenta; - Console.ForegroundColor = ConsoleColor.Gray; - } - if (now.Hour == 8 && now.Minute == 31) - { - Daily.DailyNews = false; - } - if (now.Hour == 0 && now.Minute == 0 && Daily.ClearDailys) - { - Daily.ClearDailys = false; - // 娓呯┖杩愬娍 - Daily.ClearDaily(); - Console.ForegroundColor = ConsoleColor.Magenta; - Console.WriteLine("\r宸查噸缃墍鏈変汉鐨勪粖鏃ヨ繍鍔裤"); - Console.ForegroundColor = ConsoleColor.Gray; - Console.Write("\r> "); - } - if (now.Hour == 0 && now.Minute == 1) - { - Daily.ClearDailys = true; - } - if (now.Hour == 9 && now.Minute == 0 && check9) - { - check9 = false; - Console.ForegroundColor = ConsoleColor.Magenta; - Console.WriteLine("\r閲嶇疆鐗╁搧浜ゆ槗鍐峰嵈鏃堕棿銆"); - await FunGameService.AllowSellAndTrade(); - Console.ForegroundColor = ConsoleColor.Gray; - Console.Write("\r> "); - } - if (now.Hour == 9 && now.Minute == 1) - { - check9 = true; - } - if (now.Hour == 15 && now.Minute == 0 && check15) - { - check15 = false; - Console.ForegroundColor = ConsoleColor.Magenta; - Console.WriteLine("\r閲嶇疆鐗╁搧浜ゆ槗鍐峰嵈鏃堕棿銆"); - await FunGameService.AllowSellAndTrade(); - Console.ForegroundColor = ConsoleColor.Gray; - Console.Write("\r> "); - } - if (now.Hour == 15 && now.Minute == 1) - { - check15 = true; - } - await Task.Delay(1000); - } - catch (Exception e) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("\r" + e); - Console.ForegroundColor = ConsoleColor.Gray; - Console.Write("\r> "); - } + General.GameplayEquilibriumConstant.EXPUpperLimit[level] = expPerLevel; } + } + General.GameplayEquilibriumConstant.EXPUpperLimit[60] = 9999999999999; + TaskScheduler.Shared.AddTask("閲嶇疆姣忔棩杩愬娍", new TimeSpan(0, 0, 0), () => + { + Controller.WriteLine("宸查噸缃墍鏈変汉鐨勪粖鏃ヨ繍鍔"); + Daily.ClearDaily(); }); - Milimoe.FunGame.Core.Api.Utility.TaskScheduler.Shared.AddRecurringTask("鍒锋柊瀛樻。缂撳瓨", TimeSpan.FromSeconds(20), () => + TaskScheduler.Shared.AddTask("閲嶇疆浜ゆ槗鍐峰嵈1", new TimeSpan(9, 0, 0), () => + { + Controller.WriteLine("閲嶇疆鐗╁搧浜ゆ槗鍐峰嵈鏃堕棿"); + _ = FunGameService.AllowSellAndTrade(); + }); + TaskScheduler.Shared.AddTask("閲嶇疆浜ゆ槗鍐峰嵈2", new TimeSpan(15, 0, 0), () => + { + Controller.WriteLine("閲嶇疆鐗╁搧浜ゆ槗鍐峰嵈鏃堕棿"); + _ = FunGameService.AllowSellAndTrade(); + }); + TaskScheduler.Shared.AddRecurringTask("鍒锋柊瀛樻。缂撳瓨", TimeSpan.FromSeconds(20), () => { string directoryPath = $@"{AppDomain.CurrentDomain.BaseDirectory}configs/saved"; if (Directory.Exists(directoryPath)) diff --git a/OshimaCore/Utils/FunGameActionQueue.cs b/OshimaCore/Utils/FunGameActionQueue.cs index 376cc5f..d75fa97 100644 --- a/OshimaCore/Utils/FunGameActionQueue.cs +++ b/OshimaCore/Utils/FunGameActionQueue.cs @@ -20,7 +20,7 @@ namespace Oshima.Core.Utils public static bool DeathMatchRoundDetail { get; set; } = false; public static string Msg { get; set; } = ""; - public static void InitFunGame() + public static void InitFunGameActionQueue() { CharacterStatistics.Clear(); TeamCharacterStatistics.Clear(); @@ -387,6 +387,22 @@ namespace Oshima.Core.Utils // 璧涘悗缁熻 GetCharacterRating(actionQueue.CharacterStatistics, isTeam, actionQueue.EliminatedTeams); + + // 缁熻鎶鏈緱鍒嗭紝璇勯 MVP + Character? mvp = actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key).FirstOrDefault(); + StringBuilder mvpBuilder = new(); + if (mvp != null) + { + CharacterStatistics stats = actionQueue.CharacterStatistics[mvp]; + stats.MVPs++; + mvpBuilder.AppendLine($"{(isTeam ? "[ " + actionQueue.GetTeamFromEliminated(mvp)?.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); + mvpBuilder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 姝讳骸鏁帮細" + stats.Deaths : "")}"); + mvpBuilder.AppendLine($"瀛樻椿鏃堕暱锛歿stats.LiveTime} / 瀛樻椿鍥炲悎鏁帮細{stats.LiveRound} / 琛屽姩鍥炲悎鏁帮細{stats.ActionTurn}"); + mvpBuilder.AppendLine($"鎬昏浼ゅ锛歿stats.TotalDamage} / 鎬昏鐗╃悊浼ゅ锛歿stats.TotalPhysicalDamage} / 鎬昏榄旀硶浼ゅ锛歿stats.TotalMagicDamage}"); + mvpBuilder.AppendLine($"鎬绘壙鍙椾激瀹筹細{stats.TotalTakenDamage} / 鎬绘壙鍙楃墿鐞嗕激瀹筹細{stats.TotalTakenPhysicalDamage} / 鎬绘壙鍙楅瓟娉曚激瀹筹細{stats.TotalTakenMagicDamage}"); + mvpBuilder.Append($"姣忕浼ゅ锛歿stats.DamagePerSecond} / 姣忓洖鍚堜激瀹筹細{stats.DamagePerTurn}"); + } + int top = isWeb ? actionQueue.CharacterStatistics.Count : 0; // 鍥炴墽澶氬皯涓鑹茬殑缁熻淇℃伅 int count = 1; if (isWeb) @@ -398,27 +414,13 @@ namespace Oshima.Core.Utils { 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]; - stats.MVPs++; - StringBuilder builder = new(); - builder.AppendLine($"{(isWeb ? count + "." : (isTeam ? "[ " + actionQueue.GetTeamFromEliminated(character)?.Name + " ]" ?? "" : ""))} [ {character.ToStringWithLevel()} ]"); - builder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 姝讳骸鏁帮細" + stats.Deaths : "")}"); - 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()); - } - } + WriteLine(mvpBuilder.ToString()); - if (PrintOut) - { - Console.WriteLine(); - Console.WriteLine("=== 鎶鏈緱鍒嗘帓琛屾 ==="); + if (PrintOut) + { + Console.WriteLine(); + Console.WriteLine("=== 鎶鏈緱鍒嗘帓琛屾 ==="); + } } if (isTeam) @@ -559,7 +561,7 @@ namespace Oshima.Core.Utils } } - public static List StartGame(List characters, bool printout, bool isWeb = false, bool isTeam = false, bool deathMatchRoundDetail = false) + public static List StartGame(List characters, bool printout, bool isWeb = false, bool isTeam = false, bool deathMatchRoundDetail = false, bool showRoundEndDetail = false) { PrintOut = printout; IsWeb = isWeb; @@ -739,7 +741,7 @@ namespace Oshima.Core.Utils break; } - actionQueue.DisplayQueue(); + if (showRoundEndDetail) actionQueue.DisplayQueue(); WriteLine(""); } @@ -777,43 +779,24 @@ namespace Oshima.Core.Utils // 璧涘悗缁熻 GetCharacterRating(actionQueue.CharacterStatistics, isTeam, actionQueue.EliminatedTeams); + + // 缁熻鎶鏈緱鍒嗭紝璇勯 MVP + Character? mvp = actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key).FirstOrDefault(); + StringBuilder mvpBuilder = new(); + if (mvp != null) + { + CharacterStatistics stats = actionQueue.CharacterStatistics[mvp]; + stats.MVPs++; + mvpBuilder.AppendLine($"{(isTeam ? "[ " + actionQueue.GetTeamFromEliminated(mvp)?.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); + mvpBuilder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 姝讳骸鏁帮細" + stats.Deaths : "")}"); + mvpBuilder.AppendLine($"瀛樻椿鏃堕暱锛歿stats.LiveTime} / 瀛樻椿鍥炲悎鏁帮細{stats.LiveRound} / 琛屽姩鍥炲悎鏁帮細{stats.ActionTurn}"); + mvpBuilder.AppendLine($"鎬昏浼ゅ锛歿stats.TotalDamage} / 鎬昏鐗╃悊浼ゅ锛歿stats.TotalPhysicalDamage} / 鎬昏榄旀硶浼ゅ锛歿stats.TotalMagicDamage}"); + mvpBuilder.AppendLine($"鎬绘壙鍙椾激瀹筹細{stats.TotalTakenDamage} / 鎬绘壙鍙楃墿鐞嗕激瀹筹細{stats.TotalTakenPhysicalDamage} / 鎬绘壙鍙楅瓟娉曚激瀹筹細{stats.TotalTakenMagicDamage}"); + mvpBuilder.Append($"姣忕浼ゅ锛歿stats.DamagePerSecond} / 姣忓洖鍚堜激瀹筹細{stats.DamagePerTurn}"); + } + int top = isWeb ? actionQueue.CharacterStatistics.Count : 2; // 鍥炴墽澶氬皯涓鑹茬殑缁熻淇℃伅 int count = 1; - if (isWeb) - { - WriteLine("=== 鎶鏈緱鍒嗘帓琛屾 ==="); // 杩欐槸杈撳嚭鍦ㄧ晫闈笂鐨 - Msg = $"=== 鎶鏈緱鍒嗘帓琛屾 TOP{top} ===\r\n"; // 杩欎釜鏄笅涓鏉$粰Result鍥炴墽鐨勬爣棰橈紝瑕嗙洊鎺変笂闈㈡柟娉曢噷鐨勮祴鍊间簡 - } - else - { - if (isTeam) - { - 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]; - stats.MVPs++; - StringBuilder builder = new(); - builder.AppendLine($"{(isTeam ? "[ " + actionQueue.GetTeamFromEliminated(character)?.Name + " ] " : "")}[ {character.ToStringWithLevel()} ]"); - builder.AppendLine($"鎶鏈緱鍒嗭細{stats.Rating:0.##} / 鍑绘潃鏁帮細{stats.Kills} / 鍔╂敾鏁帮細{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 姝讳骸鏁帮細" + stats.Deaths : "")}"); - 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("=== 鎶鏈緱鍒嗘帓琛屾 ==="); - } - Msg = $"=== 鎶鏈緱鍒嗘帓琛屾 TOP{top} ===\r\n"; if (isTeam) diff --git a/OshimaCore/Utils/FunGameService.cs b/OshimaCore/Utils/FunGameService.cs index 71703b9..93e4ad6 100644 --- a/OshimaCore/Utils/FunGameService.cs +++ b/OshimaCore/Utils/FunGameService.cs @@ -357,6 +357,8 @@ namespace Oshima.Core.Utils Equipment.Clear(); Skills.Clear(); Magics.Clear(); + AllItems.Clear(); + ItemSkills.Clear(); InitFunGame(); } diff --git a/OshimaModules/Characters/CustomCharacter.cs b/OshimaModules/Characters/CustomCharacter.cs index 52a0d94..7f29786 100644 --- a/OshimaModules/Characters/CustomCharacter.cs +++ b/OshimaModules/Characters/CustomCharacter.cs @@ -12,7 +12,7 @@ namespace Oshima.FunGame.OshimaModules.Characters Name = name; FirstName = firstname; NickName = nickname; - PrimaryAttribute = (PrimaryAttribute)Random.Shared.Next(4); + PrimaryAttribute = (PrimaryAttribute)Random.Shared.Next(1, 4); InitialATK = Random.Shared.Next(15, 26); InitialHP = Random.Shared.Next(40, 86); InitialMP = Random.Shared.Next(20, 56);