diff --git a/OshimaCore/Controllers/FunGameController.cs b/OshimaCore/Controllers/FunGameController.cs index ec58faf..ed75801 100644 --- a/OshimaCore/Controllers/FunGameController.cs +++ b/OshimaCore/Controllers/FunGameController.cs @@ -1130,18 +1130,29 @@ namespace Oshima.Core.Controllers { User user = FunGameService.GetUser(pc); - if (cIndex > 0 && cIndex <= user.Inventory.Characters.Count) + if (cIndex == 0) { - Character character = user.Inventory.Characters.ToList()[cIndex - 1]; if (isSimple) { - return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色简略信息:\r\n{character.GetSimpleInfo(showEXP: true).Trim()}"); + return NetworkUtility.JsonSerialize($"这是你的主战角色简略信息:\r\n{user.Inventory.MainCharacter.GetSimpleInfo(showEXP: true).Trim()}"); } - return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色详细信息:\r\n{character.GetInfo().Trim()}"); + return NetworkUtility.JsonSerialize($"这是你的主战角色详细信息:\r\n{user.Inventory.MainCharacter.GetInfo().Trim()}"); } else { - return NetworkUtility.JsonSerialize($"没有找到与这个序号相对应的角色!"); + if (cIndex > 0 && cIndex <= user.Inventory.Characters.Count) + { + Character character = user.Inventory.Characters.ToList()[cIndex - 1]; + if (isSimple) + { + return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色简略信息:\r\n{character.GetSimpleInfo(showEXP: true).Trim()}"); + } + return NetworkUtility.JsonSerialize($"这是你库存中序号为 {cIndex} 的角色详细信息:\r\n{character.GetInfo().Trim()}"); + } + else + { + return NetworkUtility.JsonSerialize($"没有找到与这个序号相对应的角色!"); + } } } else @@ -1347,7 +1358,7 @@ namespace Oshima.Core.Controllers if (user1 != null && user2 != null) { - return FunGameActionQueue.StartGame([user1.Inventory.MainCharacter, user2.Inventory.MainCharacter], false, false, false, false, false, showAllRound); + return FunGameActionQueue.StartGame([user1.Inventory.MainCharacter, user2.Inventory.MainCharacter], false, false, false, false, showAllRound); } else { @@ -2839,17 +2850,190 @@ namespace Oshima.Core.Controllers if (FunGameService.Bosses.Values.FirstOrDefault(kv => kv.Id == index) is Character boss) { - List msgs = FunGameActionQueue.StartGame([user.Inventory.MainCharacter, boss], false, false, false, false, false, showAllRound); + if (user.Inventory.MainCharacter.HP < user.Inventory.MainCharacter.MaxHP * 0.1) + { + return [$"主战角色重伤未愈,当前生命值低于 10%,请先等待生命值自动回复或设置其他主战角色!"]; + } - if (boss.HP <= 0) + Character boss2 = CharacterBuilder.Build(boss, false, true, null, FunGameService.AllItems, FunGameService.AllSkills, false); + List msgs = FunGameActionQueue.StartGame([user.Inventory.MainCharacter, boss2], false, false, false, false, showAllRound); + + if (boss2.HP <= 0) { FunGameService.Bosses.Remove(bossIndex); - double gained = 8 * boss.Level; + double gained = boss.Level; user.Inventory.Materials += gained; msgs.Add($"恭喜你击败了 Boss,获得 {gained} 材料奖励!"); } else { + boss.HP = boss2.HP; + boss.MP = boss2.MP; + boss.EP = boss2.EP; + msgs.Add($"挑战 Boss 失败,请稍后再来!"); + } + user.LastTime = DateTime.Now; + pc.Add("user", user); + pc.SaveConfig(); + + return msgs; + } + else + { + return [$"找不到指定编号的 Boss!"]; + } + } + else + { + return [noSaved]; + } + } + + [HttpPost("addsquad")] + public string AddSquad([FromQuery] long? qq = null, [FromQuery] int? c = null) + { + try + { + long userid = qq ?? Convert.ToInt64("10" + Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 11)); + int characterIndex = c ?? 0; + + PluginConfig pc = new("saved", userid.ToString()); + pc.LoadConfig(); + + if (pc.Count > 0) + { + User user = FunGameService.GetUser(pc); + + Character? character = null; + if (characterIndex > 0 && characterIndex <= user.Inventory.Characters.Count) + { + character = user.Inventory.Characters.ToList()[characterIndex - 1]; + } + else + { + return NetworkUtility.JsonSerialize($"没有找到与这个序号相对应的角色!"); + } + + if (user.Inventory.Squad.Count >= 4) + { + return NetworkUtility.JsonSerialize($"小队人数已满 4 人,无法继续添加角色!当前小队角色如下:\r\n" + + string.Join("\r\n", user.Inventory.Characters.Where(c => user.Inventory.Squad.Contains(c.Id)))); + } + + if (user.Inventory.Squad.Contains(character.Id)) + { + return NetworkUtility.JsonSerialize($"此角色已经在小队中了!"); + } + + user.Inventory.Squad.Add(character.Id); + user.LastTime = DateTime.Now; + pc.Add("user", user); + pc.SaveConfig(); + return NetworkUtility.JsonSerialize($"添加小队角色成功:{character}\r\n当前小队角色如下:\r\n" + + string.Join("\r\n", user.Inventory.Characters.Where(c => user.Inventory.Squad.Contains(c.Id)))); + } + else + { + return NetworkUtility.JsonSerialize(noSaved); + } + } + catch (Exception e) + { + return NetworkUtility.JsonSerialize(e.ToString()); + } + } + + [HttpPost("removesquad")] + public string RemoveSquad([FromQuery] long? qq = null, [FromQuery] int? c = null) + { + try + { + long userid = qq ?? Convert.ToInt64("10" + Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 11)); + int characterIndex = c ?? 0; + + PluginConfig pc = new("saved", userid.ToString()); + pc.LoadConfig(); + + if (pc.Count > 0) + { + User user = FunGameService.GetUser(pc); + + Character? character = null; + if (characterIndex > 0 && characterIndex <= user.Inventory.Characters.Count) + { + character = user.Inventory.Characters.ToList()[characterIndex - 1]; + } + else + { + return NetworkUtility.JsonSerialize($"没有找到与这个序号相对应的角色!"); + } + + if (!user.Inventory.Squad.Contains(character.Id)) + { + return NetworkUtility.JsonSerialize($"此角色不在小队中!"); + } + + user.Inventory.Squad.Remove(character.Id); + user.LastTime = DateTime.Now; + pc.Add("user", user); + pc.SaveConfig(); + return NetworkUtility.JsonSerialize($"移除小队角色成功:{character}\r\n当前小队角色如下:\r\n" + + string.Join("\r\n", user.Inventory.Characters.Where(c => user.Inventory.Squad.Contains(c.Id)))); + } + else + { + return NetworkUtility.JsonSerialize(noSaved); + } + } + catch (Exception e) + { + return NetworkUtility.JsonSerialize(e.ToString()); + } + } + + [HttpPost("fightbossteam")] + public List FightBossTeam([FromQuery] long? qq = null, [FromQuery] int? index = null, [FromQuery] bool? all = null) + { + return []; + + long userid = qq ?? Convert.ToInt64("10" + Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 11)); + int bossIndex = index ?? 0; + bool showAllRound = all ?? false; + + PluginConfig pc = new("saved", userid.ToString()); + pc.LoadConfig(); + + if (pc.Count > 0) + { + User user = FunGameService.GetUser(pc); + + if (FunGameService.Bosses.Values.FirstOrDefault(kv => kv.Id == index) is Character boss) + { + Character[] squad = [.. user.Inventory.Characters.Where(c => user.Inventory.Squad.Contains(c.Id))]; + + if (squad.All(c => c.HP < c.MaxHP * 0.1)) + { + return [$"小队角色均重伤未愈,当前生命值低于 10%,请先等待生命值自动回复或重组小队!", + "当前小队角色如下:", + string.Join("\r\n", user.Inventory.Characters.Where(c => user.Inventory.Squad.Contains(c.Id)))]; + } + + Character boss2 = CharacterBuilder.Build(boss, false, true, null, FunGameService.AllItems, FunGameService.AllSkills, false); + //List msgs = FunGameActionQueue.StartGameTeam; + List msgs = []; + + if (boss2.HP <= 0) + { + FunGameService.Bosses.Remove(bossIndex); + double gained = boss.Level; + user.Inventory.Materials += gained; + msgs.Add($"恭喜你击败了 Boss,获得 {gained} 材料奖励!"); + } + else + { + boss.HP = boss2.HP; + boss.MP = boss2.MP; + boss.EP = boss2.EP; msgs.Add($"挑战 Boss 失败,请稍后再来!"); } user.LastTime = DateTime.Now; diff --git a/OshimaCore/Utils/FunGameActionQueue.cs b/OshimaCore/Utils/FunGameActionQueue.cs index 37fe23e..9dde426 100644 --- a/OshimaCore/Utils/FunGameActionQueue.cs +++ b/OshimaCore/Utils/FunGameActionQueue.cs @@ -565,7 +565,7 @@ namespace Oshima.Core.Utils } } - public static List StartGame(List characters, bool printout, bool isWeb = false, bool isTeam = false, bool deathMatchRoundDetail = false, bool showRoundEndDetail = false, bool showAllRound = false) + public static List StartGame(List characters, bool printout, bool isWeb = false, bool deathMatchRoundDetail = false, bool showRoundEndDetail = false, bool showAllRound = false) { PrintOut = printout; IsWeb = isWeb; @@ -580,12 +580,7 @@ namespace Oshima.Core.Utils if (PrintOut) Console.WriteLine(); // 鍒涘缓椤哄簭琛ㄥ苟鎺掑簭 - ActionQueue actionQueue = new(characters, isTeam, WriteLine); - if (isTeam) - { - actionQueue.MaxRespawnTimes = -1; - actionQueue.MaxScoreToWin = 30; - } + ActionQueue actionQueue = new(characters, false, WriteLine); if (PrintOut) Console.WriteLine(); // 鎬绘父鎴忔椂闀 @@ -594,47 +589,12 @@ namespace Oshima.Core.Utils // 鏄剧ず瑙掕壊淇℃伅 if (PrintOut) characters.ForEach(c => Console.WriteLine(c.GetInfo())); - // 鍥㈤槦妯″紡 - if (isTeam) - { - Msg = "=== 鍥㈤槦妯″紡闅忔満鍒嗙粍 ===\r\n\r\n"; - // 鎵撲贡瑙掕壊鍒楄〃 - List shuffledCharacters = [.. characters.OrderBy(c => Random.Shared.Next())]; - - // 鍒涘缓涓や釜鍥㈤槦 - List group1 = []; - List group2 = []; - - // 灏嗚鑹蹭氦鏇垮垎閰嶅埌涓や釜鍥㈤槦涓 - for (int cid = 0; cid < shuffledCharacters.Count; cid++) - { - if (cid % 2 == 0) - { - group1.Add(shuffledCharacters[cid]); - } - else - { - group2.Add(shuffledCharacters[cid]); - } - } - - // 娣诲姞鍒板洟闃熷瓧鍏 - 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); - } - // 鏄剧ず鍒濆椤哄簭琛 actionQueue.DisplayQueue(); if (PrintOut) Console.WriteLine(); // 鎬诲洖鍚堟暟 - int maxRound = isTeam ? 9999 : 999; + int maxRound = 999; // 闅忔満鍥炲悎濂栧姳 Dictionary> roundRewards = GenerateRoundRewards(maxRound); @@ -645,31 +605,23 @@ namespace Oshima.Core.Utils Msg = ""; if (i == maxRound - 1) { - if (isTeam) + WriteLine($"=== 缁堝眬瀹″垽 ==="); + Dictionary 浠栦滑鐨勮閲忕櫨鍒嗘瘮 = []; + foreach (Character c in characters) { - WriteLine("涓ら槦鎵撳埌澶╂槒鍦版殫锛屾祦灞浜嗭紒锛"); - break; + 浠栦滑鐨勮閲忕櫨鍒嗘瘮.TryAdd(c, c.HP / c.MaxHP); } - else + double max = 浠栦滑鐨勮閲忕櫨鍒嗘瘮.Values.Max(); + Character winner = 浠栦滑鐨勮閲忕櫨鍒嗘瘮.Keys.Where(c => 浠栦滑鐨勮閲忕櫨鍒嗘瘮[c] == max).First(); + WriteLine("[ " + winner + " ] 鎴愪负浜嗗ぉ閫変箣浜猴紒锛"); + foreach (Character c in characters.Where(c => c != winner && c.HP > 0)) { - WriteLine($"=== 缁堝眬瀹″垽 ==="); - Dictionary 浠栦滑鐨勮閲忕櫨鍒嗘瘮 = []; - foreach (Character c in characters) - { - 浠栦滑鐨勮閲忕櫨鍒嗘瘮.TryAdd(c, c.HP / c.MaxHP); - } - double max = 浠栦滑鐨勮閲忕櫨鍒嗘瘮.Values.Max(); - Character winner = 浠栦滑鐨勮閲忕櫨鍒嗘瘮.Keys.Where(c => 浠栦滑鐨勮閲忕櫨鍒嗘瘮[c] == max).First(); - WriteLine("[ " + winner + " ] 鎴愪负浜嗗ぉ閫変箣浜猴紒锛"); - foreach (Character c in characters.Where(c => c != winner && c.HP > 0)) - { - WriteLine("[ " + winner + " ] 瀵 [ " + c + " ] 閫犳垚浜 99999999999 鐐圭湡瀹炰激瀹炽"); - actionQueue.DeathCalculation(winner, c); - } - actionQueue.EndGameInfo(winner); - result.Add(Msg); - break; + WriteLine("[ " + winner + " ] 瀵 [ " + c + " ] 閫犳垚浜 99999999999 鐐圭湡瀹炰激瀹炽"); + actionQueue.DeathCalculation(winner, c); } + actionQueue.EndGameInfo(winner); + result.Add(Msg); + break; } // 妫鏌ユ槸鍚︽湁瑙掕壊鍙互琛屽姩 @@ -686,7 +638,7 @@ namespace Oshima.Core.Utils } WriteLine($"=== Round {i++} ==="); - WriteLine("鐜板湪鏄 [ " + characterToAct + (isTeam ? "锛" + (actionQueue.GetTeam(characterToAct)?.Name ?? "") + "锛" : "") + " ] 鐨勫洖鍚堬紒"); + WriteLine($"鐜板湪鏄 [ {characterToAct} ] 鐨勫洖鍚堬紒"); // 瀹為檯鐨勫洖鍚堝鍔 List realSkillRewards = []; @@ -755,7 +707,7 @@ namespace Oshima.Core.Utils roundMsg = Msg; if (!deathMatchRoundDetail) { - roundMsg = actionQueue.LastRound.ToString().Trim() + $"\r\n{(isTeam ? $"姣斿垎锛歿string.Join(" / ", actionQueue.Teams.Values.Select(t => $"{t.Name}({t.Score})"))}锛屽嚮鏉鏉ヨ嚜{actionQueue.GetTeam(actionQueue.LastRound.Actor)}" : "")}"; + roundMsg = actionQueue.LastRound.ToString().Trim() + "\r\n"; if (showAllRound) { foreach (Character character in actionQueue.Queue) @@ -773,7 +725,7 @@ namespace Oshima.Core.Utils if (roundMsg != "") { - if ((isTeam && deathMatchRoundDetail || !isTeam) && isWeb) + if (isWeb) { roundMsg += "\r\n" + Msg; } @@ -789,7 +741,7 @@ namespace Oshima.Core.Utils } // 璧涘悗缁熻 - GetCharacterRating(actionQueue.CharacterStatistics, isTeam, actionQueue.EliminatedTeams); + GetCharacterRating(actionQueue.CharacterStatistics, false, actionQueue.EliminatedTeams); // 缁熻鎶鏈緱鍒嗭紝璇勯 MVP Character? mvp = actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key).FirstOrDefault(); @@ -798,7 +750,7 @@ namespace Oshima.Core.Utils { CharacterStatistics stats = actionQueue.CharacterStatistics[mvp]; stats.MVPs++; - mvpBuilder.AppendLine($"{(isTeam ? "[ " + actionQueue.GetTeamFromEliminated(mvp)?.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); + mvpBuilder.AppendLine($"[ {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}"); @@ -810,49 +762,24 @@ namespace Oshima.Core.Utils int count = 1; Msg = $"=== 鎶鏈緱鍒嗘帓琛屾 TOP{top} ===\r\n"; - if (isTeam) + foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).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()} ]"); + 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.AppendLine($"姣忕浼ゅ锛歿stats.DamagePerSecond} / 姣忓洖鍚堜激瀹筹細{stats.DamagePerTurn}"); + builder.Append($"鐢熷懡鍊硷細{character.HP:0.##}/{character.MaxHP:0.##} / 榄旀硶鍊硷細{character.MP:0.##}/{character.MaxMP:0.##}"); + if (count++ <= top) { - StringBuilder builder = new(); - CharacterStatistics stats = actionQueue.CharacterStatistics[character]; - builder.AppendLine($"{(isWeb ? count + "." : ("[ " + 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}"); - if (count++ <= top) - { - WriteLine(builder.ToString()); - } - else - { - if (PrintOut) Console.WriteLine(builder.ToString()); - } + WriteLine(builder.ToString()); } - } - else - { - foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.Rating).Select(d => d.Key)) + else { - StringBuilder builder = new(); - CharacterStatistics stats = actionQueue.CharacterStatistics[character]; - builder.AppendLine($"{count + ". "}[ {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.AppendLine($"姣忕浼ゅ锛歿stats.DamagePerSecond} / 姣忓洖鍚堜激瀹筹細{stats.DamagePerTurn}"); - builder.Append($"鐢熷懡鍊硷細{character.HP:0.##}/{character.MaxHP:0.##} / 榄旀硶鍊硷細{character.MP:0.##}/{character.MaxMP:0.##}"); - if (count++ <= top) - { - WriteLine(builder.ToString()); - } - else - { - if (PrintOut) Console.WriteLine(builder.ToString()); - } + if (PrintOut) Console.WriteLine(builder.ToString()); } } @@ -861,43 +788,10 @@ namespace Oshima.Core.Utils // 鏄剧ず姣忎釜瑙掕壊鐨勪俊鎭 if (isWeb) { - if (isTeam) + for (i = actionQueue.Eliminated.Count - 1; i >= 0; i--) { - top = 1; - for (i = actionQueue.EliminatedTeams.Count - 1; i >= 0; i--) - { - Team team = actionQueue.EliminatedTeams[i]; - string topTeam = ""; - if (top == 1) - { - topTeam = "鍐犲啗"; - } - if (top == 2) - { - topTeam = "浜氬啗"; - } - if (top == 3) - { - topTeam = "瀛e啗"; - } - if (top > 3) - { - topTeam = $"绗 {top} 鍚"; - } - foreach (Character character in team.Members) - { - result.Add($"== {topTeam}鍥㈤槦 [ {team.Name} ] ==\r\n== 瑙掕壊锛歔 {character} ] ==\r\n{character.GetInfo()}"); - } - top++; - } - } - else - { - for (i = actionQueue.Eliminated.Count - 1; i >= 0; i--) - { - Character character = actionQueue.Eliminated[i]; - result.Add($"=== 瑙掕壊 [ {character} ] ===\r\n{character.GetInfo()}"); - } + Character character = actionQueue.Eliminated[i]; + result.Add($"=== 瑙掕壊 [ {character} ] ===\r\n{character.GetInfo()}"); } } diff --git a/OshimaCore/Utils/FunGameService.cs b/OshimaCore/Utils/FunGameService.cs index 80ee2b0..bc11612 100644 --- a/OshimaCore/Utils/FunGameService.cs +++ b/OshimaCore/Utils/FunGameService.cs @@ -1,6 +1,7 @@ 锘縰sing System.Text; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Constant; using Oshima.FunGame.OshimaModules; using Oshima.FunGame.OshimaModules.Characters; @@ -448,7 +449,7 @@ namespace Oshima.Core.Utils List characters = new(user.Inventory.Characters); List items = new(user.Inventory.Items); Character mc = user.Inventory.MainCharacter; - List squad = [.. user.Inventory.Squad.Select(kv => kv.Id)]; + List squad = [.. user.Inventory.Squad]; Dictionary training = user.Inventory.Training.ToDictionary(kv => kv.Key, kv => kv.Value); user.Inventory.Characters.Clear(); user.Inventory.Items.Clear(); @@ -464,7 +465,53 @@ namespace Oshima.Core.Utils foreach (Character inventoryCharacter in characters) { - Character realCharacter = CharacterBuilder.Build(inventoryCharacter, false, true, user.Inventory, AllItems, AllSkills); + Character realCharacter = CharacterBuilder.Build(inventoryCharacter, false, true, user.Inventory, AllItems, AllSkills, false); + // 鑷姩鍥炶 + DateTime now = DateTime.Now; + int seconds = (int)(now - user.LastTime).TotalSeconds; + double recoveryHP = realCharacter.HR * seconds; + double recoveryMP = realCharacter.MR * seconds; + double recoveryEP = realCharacter.ER * seconds; + realCharacter.HP = inventoryCharacter.HP + recoveryHP; + realCharacter.MP = inventoryCharacter.MP + recoveryMP; + realCharacter.EP = inventoryCharacter.EP + recoveryEP; + // 鍑忓皯鎵鏈夋妧鑳界殑鍐峰嵈鏃堕棿 + foreach (Skill skill in realCharacter.Skills) + { + skill.CurrentCD -= seconds; + if (skill.CurrentCD <= 0) + { + skill.CurrentCD = 0; + skill.Enable = true; + } + } + // 绉婚櫎鍒版椂闂寸殑鐗规晥 + List effects = realCharacter.Effects.Where(e => e.Level > 0).ToList(); + foreach (Effect effect in effects) + { + if (effect.Level == 0) + { + realCharacter.Effects.Remove(effect); + continue; + } + effect.OnTimeElapsed(realCharacter, seconds); + // 鑷韩琚姩涓嶄細鑰冭檻 + if (effect.EffectType == EffectType.None && effect.Skill.SkillType == SkillType.Passive) + { + continue; + } + + if (effect.Durative) + { + effect.RemainDuration -= seconds; + if (effect.RemainDuration <= 0) + { + effect.RemainDuration = 0; + realCharacter.Effects.Remove(effect); + effect.OnEffectLost(realCharacter); + } + } + } realCharacter.User = user; user.Inventory.Characters.Add(realCharacter); } @@ -478,7 +525,7 @@ namespace Oshima.Core.Utils { if (user.Inventory.Characters.FirstOrDefault(c => c.Id == id) is Character s) { - user.Inventory.Squad.Add(s); + user.Inventory.Squad.Add(id); } } @@ -1012,83 +1059,121 @@ namespace Oshima.Core.Utils if (Bosses.Count < 10) { int genCount = 10 - Bosses.Count; + for (int i = 0; i < genCount; i++) { int nowIndex = Bosses.Count > 0 ? Bosses.Keys.Max() + 1 : 1; Character boss = new CustomCharacter(nowIndex, GenerateRandomChineseUserName(), "", "Boss"); - int cLevel, sLevel, mLevel, naLevel; - switch (Random.Shared.Next(3)) + int cutRate = Random.Shared.Next(3) switch { - case 0: - cLevel = General.GameplayEquilibriumConstant.MaxLevel; - sLevel = General.GameplayEquilibriumConstant.MaxSkillLevel; - mLevel = General.GameplayEquilibriumConstant.MaxMagicLevel; - naLevel = General.GameplayEquilibriumConstant.MaxNormalAttackLevel; - break; - case 1: - cLevel = General.GameplayEquilibriumConstant.MaxLevel / 2; - sLevel = General.GameplayEquilibriumConstant.MaxSkillLevel / 2; - mLevel = General.GameplayEquilibriumConstant.MaxMagicLevel / 2; - naLevel = General.GameplayEquilibriumConstant.MaxNormalAttackLevel / 2; - break; - case 2: - default: - cLevel = General.GameplayEquilibriumConstant.MaxLevel / 4; - sLevel = General.GameplayEquilibriumConstant.MaxSkillLevel / 4; - mLevel = General.GameplayEquilibriumConstant.MaxMagicLevel / 4; - naLevel = General.GameplayEquilibriumConstant.MaxNormalAttackLevel / 4; - break; + 0 => 1, + 1 => 2, + _ => 4, + }; + int cLevel = General.GameplayEquilibriumConstant.MaxLevel / cutRate; + int sLevel = General.GameplayEquilibriumConstant.MaxSkillLevel / cutRate; + int mLevel = General.GameplayEquilibriumConstant.MaxMagicLevel / cutRate; + int naLevel = General.GameplayEquilibriumConstant.MaxNormalAttackLevel / cutRate; + boss.Level = cLevel; + boss.NormalAttack.Level = naLevel; + boss.NormalAttack.HardnessTime = 6; + Item[] weapons = Equipment.Where(i => i.Id.ToString().StartsWith("11") && (int)i.QualityType == 4).ToArray(); + Item[] armors = Equipment.Where(i => i.Id.ToString().StartsWith("12") && (int)i.QualityType == 1).ToArray(); + Item[] shoes = Equipment.Where(i => i.Id.ToString().StartsWith("13") && (int)i.QualityType == 1).ToArray(); + Item[] accessory = Equipment.Where(i => i.Id.ToString().StartsWith("14") && (int)i.QualityType == 3).ToArray(); + Item? a = null, b = null, c = null, d = null, d2 = null; + if (weapons.Length > 0) + { + a = weapons[Random.Shared.Next(weapons.Length)]; } - Item[] 姝﹀櫒 = Equipment.Where(i => i.Id.ToString().StartsWith("11") && (int)i.QualityType == 4).ToArray(); - Item[] 闃插叿 = Equipment.Where(i => i.Id.ToString().StartsWith("12") && (int)i.QualityType == 1).ToArray(); - Item[] 闉嬪瓙 = Equipment.Where(i => i.Id.ToString().StartsWith("13") && (int)i.QualityType == 1).ToArray(); - Item[] 楗板搧 = Equipment.Where(i => i.Id.ToString().StartsWith("14") && (int)i.QualityType == 3).ToArray(); - Item? a = null, b = null, c = null, d = null; - if (姝﹀櫒.Length > 0) + if (armors.Length > 0) { - a = 姝﹀櫒[Random.Shared.Next(姝﹀櫒.Length)]; + b = armors[Random.Shared.Next(armors.Length)]; } - if (闃插叿.Length > 0) + if (shoes.Length > 0) { - b = 闃插叿[Random.Shared.Next(闃插叿.Length)]; + c = shoes[Random.Shared.Next(shoes.Length)]; } - if (闉嬪瓙.Length > 0) + if (accessory.Length > 0) { - c = 闉嬪瓙[Random.Shared.Next(闉嬪瓙.Length)]; + d = accessory[Random.Shared.Next(accessory.Length)]; } - if (楗板搧.Length > 0) + if (accessory.Length > 0) { - d = 楗板搧[Random.Shared.Next(楗板搧.Length)]; + d2 = accessory[Random.Shared.Next(accessory.Length)]; } - List 杩欐鍙戞斁鐨勭┖鎶 = []; - if (a != null) 杩欐鍙戞斁鐨勭┖鎶.Add(a); - if (b != null) 杩欐鍙戞斁鐨勭┖鎶.Add(b); - if (c != null) 杩欐鍙戞斁鐨勭┖鎶.Add(c); - if (d != null) 杩欐鍙戞斁鐨勭┖鎶.Add(d); - Item? 榄旀硶鍗″寘 = GenerateMagicCardPack(3, (QualityType)4); - if (榄旀硶鍗″寘 != null) + List dropItems = []; + if (a != null) dropItems.Add(a); + if (b != null) dropItems.Add(b); + if (c != null) dropItems.Add(c); + if (d != null) dropItems.Add(d); + if (d2 != null) dropItems.Add(d2); + Item? magicCardPack = GenerateMagicCardPack(5, (QualityType)4); + if (magicCardPack != null) { - foreach (Skill magic in 榄旀硶鍗″寘.Skills.Magics) + foreach (Skill magic in magicCardPack.Skills.Magics) { magic.Level = mLevel; } - boss.Equip(榄旀硶鍗″寘); + boss.Equip(magicCardPack); } - foreach (Item item in 杩欐鍙戞斁鐨勭┖鎶) + foreach (Item item in dropItems) { Item realItem = item.Copy(); boss.Equip(realItem); } - boss.Level = cLevel; - boss.NormalAttack.Level = naLevel; - boss.NormalAttack.HardnessTime = 7; - if (boss.CritRate < 65) boss.ExCritRate = 65 - boss.CritRate; - if (boss.CritDMG < 200) boss.ExCritDMG = 200 - boss.CritDMG; - if (boss.AccelerationCoefficient < 0.4) boss.ExAccelerationCoefficient = 0.4 - boss.AccelerationCoefficient; - boss.ExATK2 += boss.PrimaryAttributeValue; - boss.ExDEF2 += boss.PrimaryAttributeValue; - boss.MDF.None += 0.25; - boss.ExHPPercentage += 0.8; + Skill bossSkill = Factory.OpenFactory.GetInstance(0, "BOSS涓撳睘琚姩", []); + bossSkill.Level = 1; + bossSkill.Character = boss; + Effect effect = Factory.OpenFactory.GetInstance((long)EffectID.DynamicsEffect, "", new() + { + { "skill", bossSkill }, + { + "values", + new Dictionary() + { + { "exatk", 200 / cutRate }, + { "exdef", 200 / cutRate }, + { "exhp2", 1.5 }, + { "exmp2", 0.8 }, + { "exhr", 8 / cutRate }, + { "exmr", 4 / cutRate }, + { "excr", 0.35 }, + { "excrd", 0.9 }, + { "excdr", 0.25 }, + { "exacc", 0.25 } + } + } + }); + effect.OnEffectGained(boss); + bossSkill.Effects.Add(effect); + boss.Skills.Add(bossSkill); + effect = Factory.OpenFactory.GetInstance((long)EffectID.ExMDF, "", new() + { + { "skill", bossSkill }, + { + "values", + new Dictionary() + { + { "mdftype", 0 }, + { "mdfvalue", 0.15 } + } + } + }); + effect.OnEffectGained(boss); + bossSkill.Effects.Add(effect); + boss.Skills.Add(bossSkill); + Skill passive = Factory.OpenFactory.GetInstance(Random.Shared.Next(4001, 4013), "", []); + passive.Character = boss; + passive.Level = 1; + boss.Skills.Add(passive); + Skill super = Factory.OpenFactory.GetInstance(Random.Shared.Next(3001, 3013), "", []); + super.Character = boss; + super.Level = sLevel; + boss.Skills.Add(super); + + boss.Recovery(); + Bosses[nowIndex] = boss; } } diff --git a/OshimaModules/Characters/OshimaShiya.cs b/OshimaModules/Characters/OshimaShiya.cs index 7936d2a..5b1cf58 100644 --- a/OshimaModules/Characters/OshimaShiya.cs +++ b/OshimaModules/Characters/OshimaShiya.cs @@ -15,8 +15,8 @@ namespace Oshima.FunGame.OshimaModules.Characters InitialATK = 25; InitialHP = 85; InitialMP = 10; - InitialSTR = 35; - STRGrowth = 3.5; + InitialSTR = 30; + STRGrowth = 3; InitialAGI = 0; AGIGrowth = 0; InitialINT = 0; diff --git a/OshimaModules/Effects/EffectID.cs b/OshimaModules/Effects/EffectID.cs index c0c080d..b8f5cc2 100644 --- a/OshimaModules/Effects/EffectID.cs +++ b/OshimaModules/Effects/EffectID.cs @@ -165,6 +165,11 @@ /// ExMaxMP2 = 8031, + /// + /// 鍔ㄦ佹墿灞曠壒鏁 + /// + DynamicsEffect = 8032, + /// /// 琚姩鐗规晥缁堢偣 /// diff --git a/OshimaModules/Effects/OpenEffects/DynamicsEffect.cs b/OshimaModules/Effects/OpenEffects/DynamicsEffect.cs new file mode 100644 index 0000000..8e4bbcc --- /dev/null +++ b/OshimaModules/Effects/OpenEffects/DynamicsEffect.cs @@ -0,0 +1,502 @@ +锘縰sing Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects +{ + /// + /// 闄や簡纭洿鏃堕棿鍑忓皯鍜岄瓟娉曟姉鎬э紝鍙互閮界敤杩欎釜 + /// + public class DynamicsEffect : Effect + { + public override long Id => (long)EffectID.DynamicsEffect; + public override string Name { get; set; } = "鍔ㄦ佹墿灞曠壒鏁"; + public override string Description => string.Join("", Descriptions) + (Source != null && Skill.Character != Source ? $"鏉ヨ嚜锛歔 {Source} ]" + (Skill.Item != null ? $" 鐨 [ {Skill.Item.Name} ]" : "") : ""); + public override EffectType EffectType => EffectType.Item; + public HashSet Descriptions { get; } = []; + public Dictionary RealDynamicsValues { get; } = []; + + public override void OnEffectGained(Character character) + { + Resolve(character); + } + + public override void OnEffectLost(Character character) + { + Resolve(character, true); + } + + public override void OnAttributeChanged(Character character) + { + // 鍒锋柊鍔犳垚 + OnEffectLost(character); + OnEffectGained(character); + } + + private void Resolve(Character character, bool remove = false) + { + foreach (string key in Values.Keys) + { + string value = Values[key].ToString() ?? ""; + switch (key.ToLower()) + { + case "exatk": + if (double.TryParse(value, out double exATK)) + { + if (!remove) + { + character.ExATK2 += exATK; + } + else + { + character.ExATK2 -= exATK; + } + RealDynamicsValues["exatk"] = exATK; + Descriptions.Add($"{(exATK >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exATK):0.##} 鐐规敾鍑诲姏銆"); + } + break; + case "exdef": + if (double.TryParse(value, out double exDEF)) + { + if (!remove) + { + character.ExDEF2 += exDEF; + } + else + { + character.ExDEF2 -= exDEF; + } + RealDynamicsValues["exdef"] = exDEF; + Descriptions.Add($"{(exDEF >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exDEF):0.##} 鐐圭墿鐞嗘姢鐢层"); + } + break; + case "exstr": + if (double.TryParse(value, out double exSTR)) + { + if (!remove) + { + character.ExSTR += exSTR; + } + else + { + character.ExSTR -= exSTR; + } + RealDynamicsValues["exstr"] = exSTR; + Descriptions.Add($"{(exSTR >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exSTR):0.##} 鐐瑰姏閲忋"); + } + break; + case "exagi": + if (double.TryParse(value, out double exAGI)) + { + if (!remove) + { + character.ExAGI += exAGI; + } + else + { + character.ExAGI -= exAGI; + } + RealDynamicsValues["exagi"] = exAGI; + Descriptions.Add($"{(exAGI >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exAGI):0.##} 鐐规晱鎹枫"); + } + break; + case "exint": + if (double.TryParse(value, out double exINT)) + { + if (!remove) + { + character.ExINT += exINT; + } + else + { + character.ExINT -= exINT; + } + RealDynamicsValues["exint"] = exINT; + Descriptions.Add($"{(exINT >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exINT):0.##} 鐐规櫤鍔涖"); + } + break; + case "shtr": + if (double.TryParse(value, out double shtr)) + { + if (!remove) + { + foreach (Skill s in character.Skills) + { + s.HardnessTime -= shtr; + } + foreach (Skill? s in character.Items.Select(i => i.Skills.Active)) + { + if (s != null) + s.HardnessTime -= shtr; + } + } + else + { + foreach (Skill s in character.Skills) + { + s.HardnessTime += shtr; + } + foreach (Skill? s in character.Items.Select(i => i.Skills.Active)) + { + if (s != null) + s.HardnessTime += shtr; + } + } + RealDynamicsValues["shtr"] = shtr; + Descriptions.Add($"鍑忓皯瑙掕壊鐨勬墍鏈変富鍔ㄦ妧鑳 {shtr:0.##} 纭洿鏃堕棿銆"); + } + break; + case "nahtr": + if (double.TryParse(value, out double nahtr)) + { + if (!remove) + { + character.NormalAttack.HardnessTime -= nahtr; + } + else + { + character.NormalAttack.HardnessTime += nahtr; + } + RealDynamicsValues["nahtr"] = nahtr; + Descriptions.Add($"鍑忓皯瑙掕壊鐨勬櫘閫氭敾鍑 {nahtr:0.##} 纭洿鏃堕棿銆"); + } + break; + case "exacc": + if (double.TryParse(value, out double exacc)) + { + if (!remove) + { + character.ExAccelerationCoefficient += exacc; + } + else + { + character.ExAccelerationCoefficient -= exacc; + } + RealDynamicsValues["exacc"] = exacc; + Descriptions.Add($"{(exacc >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exacc) * 100:0.##}% 鍔犻熺郴鏁般"); + } + break; + case "exspd": + if (double.TryParse(value, out double exspd)) + { + if (!remove) + { + character.ExSPD += exspd; + } + else + { + character.ExSPD -= exspd; + } + RealDynamicsValues["exspd"] = exspd; + Descriptions.Add($"{(exspd >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exspd):0.##} 鐐硅鍔ㄩ熷害銆"); + } + break; + case "exac": + if (double.TryParse(value, out double exac)) + { + if (!remove) + { + character.ExActionCoefficient += exac; + } + else + { + character.ExActionCoefficient -= exac; + } + RealDynamicsValues["exac"] = exac; + Descriptions.Add($"{(exac >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exac) * 100:0.##}% 琛屽姩绯绘暟銆"); + } + break; + case "excdr": + if (double.TryParse(value, out double excdr)) + { + if (!remove) + { + character.ExCDR += excdr; + } + else + { + character.ExCDR -= excdr; + } + RealDynamicsValues["excdr"] = excdr; + Descriptions.Add($"{(excdr >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(excdr) * 100:0.##}% 鍐峰嵈缂╁噺銆"); + } + break; + case "exhp": + if (double.TryParse(value, out double exhp)) + { + if (!remove) + { + character.ExHP2 += exhp; + } + else + { + character.ExHP2 -= exhp; + } + RealDynamicsValues["exhp"] = exhp; + Descriptions.Add($"{(exhp >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exhp):0.##} 鐐规渶澶х敓鍛藉笺"); + } + break; + case "exmp": + if (double.TryParse(value, out double exmp)) + { + if (!remove) + { + character.ExMP2 += exmp; + } + else + { + character.ExMP2 -= exmp; + } + RealDynamicsValues["exmp"] = exmp; + Descriptions.Add($"{(exmp >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exmp):0.##} 鐐规渶澶ч瓟娉曞笺"); + } + break; + case "excr": + if (double.TryParse(value, out double excr)) + { + if (!remove) + { + character.ExCritRate += excr; + } + else + { + character.ExCritRate -= excr; + } + RealDynamicsValues["excr"] = excr; + Descriptions.Add($"{(excr >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(excr) * 100:0.##}% 鏆村嚮鐜囥"); + } + break; + case "excrd": + if (double.TryParse(value, out double excrd)) + { + if (!remove) + { + character.ExCritDMG += excrd; + } + else + { + character.ExCritDMG -= excrd; + } + RealDynamicsValues["excrd"] = excrd; + Descriptions.Add($"{(excrd >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(excrd) * 100:0.##}% 鏆村嚮浼ゅ銆"); + } + break; + case "exer": + if (double.TryParse(value, out double exer)) + { + if (!remove) + { + character.ExEvadeRate += exer; + } + else + { + character.ExEvadeRate -= exer; + } + RealDynamicsValues["exer"] = exer; + Descriptions.Add($"{(exer >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exer) * 100:0.##}% 闂伩鐜囥"); + } + break; + case "exppt": + if (double.TryParse(value, out double exppt)) + { + if (!remove) + { + character.PhysicalPenetration += exppt; + } + else + { + character.PhysicalPenetration -= exppt; + } + RealDynamicsValues["exppt"] = exppt; + Descriptions.Add($"{(exppt >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exppt) * 100:0.##}% 鐗╃悊绌块忋"); + } + break; + case "exmpt": + if (double.TryParse(value, out double exmpt)) + { + if (!remove) + { + character.MagicalPenetration += exmpt; + } + else + { + character.MagicalPenetration -= exmpt; + } + RealDynamicsValues["exmpt"] = exmpt; + Descriptions.Add($"{(exmpt >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exmpt) * 100:0.##}% 榄旀硶绌块忋"); + } + break; + case "expdr": + if (double.TryParse(value, out double expdr)) + { + if (!remove) + { + character.ExPDR += expdr; + } + else + { + character.ExPDR -= expdr; + } + RealDynamicsValues["expdr"] = expdr; + Descriptions.Add($"{(expdr >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(expdr) * 100:0.##}% 鐗╃悊浼ゅ鍑忓厤銆"); + } + break; + case "exhr": + if (double.TryParse(value, out double exhr)) + { + if (!remove) + { + character.ExHR += exhr; + } + else + { + character.ExHR -= exhr; + } + RealDynamicsValues["exhr"] = exhr; + Descriptions.Add($"{(exhr >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exhr):0.##} 鐐圭敓鍛藉洖澶嶃"); + } + break; + case "exmr": + if (double.TryParse(value, out double exmr)) + { + if (!remove) + { + character.ExMR += exmr; + } + else + { + character.ExMR -= exmr; + } + RealDynamicsValues["exmr"] = exmr; + Descriptions.Add($"{(exmr >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exmr):0.##} 鐐归瓟娉曞洖澶嶃"); + } + break; + case "exatk2": + if (double.TryParse(value, out double exATK2)) + { + double real = 0; + if (!remove) + { + real = character.BaseATK * exATK2; + character.ExATKPercentage += exATK2; + } + else if (RealDynamicsValues.TryGetValue("exatk2", out double percentage)) + { + character.ExATKPercentage -= percentage; + } + RealDynamicsValues["exatk2"] = exATK2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exATK2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐规敾鍑诲姏銆"); + } + break; + case "exdef2": + if (double.TryParse(value, out double exDEF2)) + { + double real = 0; + if (!remove) + { + real = character.BaseDEF * exDEF2; + character.ExDEFPercentage += exDEF2; + } + else if (RealDynamicsValues.TryGetValue("exdef2", out double percentage)) + { + character.ExDEFPercentage -= percentage; + } + RealDynamicsValues["exdef2"] = exDEF2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exDEF2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐圭墿鐞嗘姢鐢层"); + } + break; + case "exstr2": + if (double.TryParse(value, out double exSTR2)) + { + double real = 0; + if (!remove) + { + real = character.BaseSTR * exSTR2; + character.ExSTRPercentage += exSTR2; + } + else if (RealDynamicsValues.TryGetValue("exstr2", out double percentage)) + { + character.ExSTRPercentage -= percentage; + } + RealDynamicsValues["exstr2"] = exSTR2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exSTR2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐瑰姏閲忋"); + } + break; + case "exagi2": + if (double.TryParse(value, out double exAGI2)) + { + double real = 0; + if (!remove) + { + real = character.BaseAGI * exAGI2; + character.ExAGIPercentage += exAGI2; + } + else if (RealDynamicsValues.TryGetValue("exagi2", out double percentage)) + { + character.ExAGIPercentage -= percentage; + } + RealDynamicsValues["exagi2"] = exAGI2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exAGI2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐规晱鎹枫"); + } + break; + case "exint2": + if (double.TryParse(value, out double exINT2)) + { + double real = 0; + if (!remove) + { + real = character.BaseINT * exINT2; + character.ExINTPercentage += exINT2; + } + else if (RealDynamicsValues.TryGetValue("exint2", out double percentage)) + { + character.ExINTPercentage -= percentage; + } + RealDynamicsValues["exint2"] = exINT2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exINT2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐规櫤鍔涖"); + } + break; + case "exhp2": + if (double.TryParse(value, out double exhp2)) + { + double real = 0; + if (!remove) + { + real = character.MaxHP * exhp2; + character.ExHPPercentage += exhp2; + } + else if (RealDynamicsValues.TryGetValue("exhp2", out double percentage)) + { + character.ExHPPercentage -= percentage; + } + RealDynamicsValues["exhp2"] = exhp2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exhp2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐规渶澶х敓鍛藉笺"); + } + break; + case "exmp2": + if (double.TryParse(value, out double exmp2)) + { + double real = 0; + if (!remove) + { + real = character.MaxMP * exmp2; + character.ExMPPercentage += exmp2; + } + else if (RealDynamicsValues.TryGetValue("exmp2", out double percentage)) + { + character.ExMPPercentage -= percentage; + } + RealDynamicsValues["exmp2"] = exmp2; + Descriptions.Add($"{(real >= 0 ? "澧炲姞" : "鍑忓皯")}瑙掕壊 {Math.Abs(exmp2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 鐐规渶澶ч瓟娉曞笺"); + } + break; + } + } + } + + public DynamicsEffect(Skill skill, Dictionary args, Character? source = null) : base(skill, args) + { + GamingQueue = skill.GamingQueue; + Source = source; + } + } +} diff --git a/OshimaModules/Effects/OpenEffects/ExMDF.cs b/OshimaModules/Effects/OpenEffects/ExMDF.cs index 3f03e08..e123e76 100644 --- a/OshimaModules/Effects/OpenEffects/ExMDF.cs +++ b/OshimaModules/Effects/OpenEffects/ExMDF.cs @@ -90,7 +90,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects Source = source; if (Values.Count > 0) { - string key = Values.Keys.FirstOrDefault(s => s.Equals("mdfType", StringComparison.CurrentCultureIgnoreCase)) ?? ""; + string key = Values.Keys.FirstOrDefault(s => s.Equals("mdftype", StringComparison.CurrentCultureIgnoreCase)) ?? ""; if (key.Length > 0 && int.TryParse(Values[key].ToString(), out int mdfType)) { if (Enum.IsDefined(typeof(MagicType), mdfType)) diff --git a/OshimaModules/Modules/SkillModule.cs b/OshimaModules/Modules/SkillModule.cs index cc67f95..e7240f0 100644 --- a/OshimaModules/Modules/SkillModule.cs +++ b/OshimaModules/Modules/SkillModule.cs @@ -113,6 +113,7 @@ namespace Oshima.FunGame.OshimaModules EffectID.NormalAttackHardTimeReduce2 => new NormalAttackHardTimeReduce2(skill, dict), EffectID.ExMaxHP2 => new ExMaxHP2(skill, dict), EffectID.ExMaxMP2 => new ExMaxMP2(skill, dict), + EffectID.DynamicsEffect => new DynamicsEffect(skill, dict), EffectID.RecoverHP => new RecoverHP(skill, dict), EffectID.RecoverMP => new RecoverMP(skill, dict), EffectID.RecoverHP2 => new RecoverHP2(skill, dict), diff --git a/OshimaModules/Skills/Oshima/META椹.cs b/OshimaModules/Skills/Oshima/META椹.cs index 3d5e984..126e24e 100644 --- a/OshimaModules/Skills/Oshima/META椹.cs +++ b/OshimaModules/Skills/Oshima/META椹.cs @@ -24,7 +24,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"META椹笓灞炶鍔細鍔涢噺+5锛屽姏閲忔垚闀+0.5锛涘湪鍙楀埌浼ゅ鏃讹紝鑾峰緱鐨勮兘閲忔彁鍗50%锛屾瘡鍥炲悎寮濮嬭繕鑳借幏寰楅澶栫殑 [ {EP:0.##} ] 鑳介噺鍊笺"; + public override string Description => $"META椹笓灞炶鍔細鍒濆鍔涢噺+5锛屽姏閲忔垚闀+0.5锛涘湪鍙楀埌浼ゅ鏃讹紝鑾峰緱鐨勮兘閲忔彁鍗50%锛屾瘡鍥炲悎寮濮嬭繕鑳借幏寰楅澶栫殑 [ {EP:0.##} ] 鑳介噺鍊笺"; public static double EP => 7; @@ -42,5 +42,17 @@ namespace Oshima.FunGame.OshimaModules.Skills WriteLine($"[ {character} ] 鍙戝姩浜哅ETA椹笓灞炶鍔紒鏈鑾峰緱浜 {EP:0.##} 鑳介噺锛"); } } + + public override void OnEffectGained(Character character) + { + character.InitialSTR += 5; + character.STRGrowth += 0.5; + } + + public override void OnEffectLost(Character character) + { + character.InitialSTR -= 5; + character.STRGrowth -= 0.5; + } } }