From 765b42155ed10b6093a0adec0c13b2c9b8587b6c Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 8 Jan 2026 01:34:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=BC=82=E6=AD=A5=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=8A=80=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Desktop/GameMapTesting/GameMapController.cs | 4 +- Desktop/GameMapTesting/GameMapTesting.cs | 135 ++++++++++--------- Desktop/GameMapTesting/GameMapViewer.xaml.cs | 43 +++++- Desktop/GameMapTesting/SyncAwaiter.cs | 42 ++++++ Library/Tests/CharacterTest.cs | 10 +- Library/Tests/FunGame.cs | 63 +++++---- 6 files changed, 188 insertions(+), 109 deletions(-) create mode 100644 Desktop/GameMapTesting/SyncAwaiter.cs diff --git a/Desktop/GameMapTesting/GameMapController.cs b/Desktop/GameMapTesting/GameMapController.cs index e19c593..034e0da 100644 --- a/Desktop/GameMapTesting/GameMapController.cs +++ b/Desktop/GameMapTesting/GameMapController.cs @@ -53,11 +53,11 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting }); } - public async Task SetPreCastSuperSkill(Character character, Skill skill) + public void SetPreCastSuperSkill(Character character, Skill skill) { if (_game != null) { - await _game.SetPreCastSuperSkill(character, skill); + _game.SetPreCastSuperSkill(character, skill); } } diff --git a/Desktop/GameMapTesting/GameMapTesting.cs b/Desktop/GameMapTesting/GameMapTesting.cs index 6c74374..74171ea 100644 --- a/Desktop/GameMapTesting/GameMapTesting.cs +++ b/Desktop/GameMapTesting/GameMapTesting.cs @@ -3,6 +3,7 @@ using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Common.Addon; +using Milimoe.FunGame.Core.Library.Common.Architecture; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; using Oshima.Core.Constant; @@ -60,12 +61,18 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting c.Level = clevel; c.NormalAttack.Level = mlevel; FunGameService.AddCharacterSkills(c, 1, slevel, slevel); - //Skill test = new 钻石星尘 - //{ - // Character = c, - // Level = 8 - //}; - //c.Skills.Add(test); + Skill test = new 地狱之门 + { + Character = c, + Level = 8 + }; + c.Skills.Add(test); + Skill test2 = new 岩石之息 + { + Character = c, + Level = 8 + }; + c.Skills.Add(test2); foreach (Skill skillLoop in FunGameConstant.Skills) { Skill skill = skillLoop.Copy(); @@ -222,22 +229,22 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting } } await Controller.SetGameMap(map); - _gamingQueue.SelectTargetGrid += GamingQueue_SelectTargetGrid; - _gamingQueue.CharacterMove += GamingQueue_CharacterMove; + _gamingQueue.SelectTargetGridEvent += GamingQueue_SelectTargetGrid; + _gamingQueue.CharacterMoveEvent += GamingQueue_CharacterMove; } // 绑定事件 await Controller.SetQueue(_gamingQueue.HardnessTime); await Controller.SetCharacterStatistics(_gamingQueue.CharacterStatistics); - _gamingQueue.TurnStart += GamingQueue_TurnStart; - _gamingQueue.DecideAction += GamingQueue_DecideAction; - _gamingQueue.SelectNormalAttackTargets += GamingQueue_SelectNormalAttackTargets; - _gamingQueue.SelectSkill += GamingQueue_SelectSkill; - _gamingQueue.SelectSkillTargets += GamingQueue_SelectSkillTargets; - _gamingQueue.SelectNonDirectionalSkillTargets += GamingQueue_SelectNonDirectionalSkillTargets; - _gamingQueue.SelectItem += GamingQueue_SelectItem; - _gamingQueue.QueueUpdated += GamingQueue_QueueUpdated; - _gamingQueue.TurnEnd += GamingQueue_TurnEnd; + _gamingQueue.TurnStartEvent += GamingQueue_TurnStart; + _gamingQueue.DecideActionEvent += GamingQueue_DecideAction; + _gamingQueue.SelectNormalAttackTargetsEvent += GamingQueue_SelectNormalAttackTargets; + _gamingQueue.SelectSkillEvent += GamingQueue_SelectSkill; + _gamingQueue.SelectSkillTargetsEvent += GamingQueue_SelectSkillTargets; + _gamingQueue.SelectNonDirectionalSkillTargetsEvent += GamingQueue_SelectNonDirectionalSkillTargets; + _gamingQueue.SelectItemEvent += GamingQueue_SelectItem; + _gamingQueue.QueueUpdatedEvent += GamingQueue_QueueUpdated; + _gamingQueue.TurnEndEvent += GamingQueue_TurnEnd; // 总游戏时长 double totalTime = 0; @@ -322,11 +329,11 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting foreach (Character c in characters.Where(c => c != winner && c.HP > 0)) { await Controller.WriteLine("[ " + winner + " ] 对 [ " + c + " ] 造成了 99999999999 点真实伤害。"); - await _gamingQueue.DeathCalculationAsync(winner, c); + _gamingQueue.DeathCalculation(winner, c); } if (mgq != null) { - await mgq.EndGameInfo(winner); + mgq.EndGameInfo(winner); } } result.Add(Msg); @@ -334,7 +341,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting } // 检查是否有角色可以行动 - Character? characterToAct = await _gamingQueue.NextCharacterAsync(); + Character? characterToAct = _gamingQueue.NextCharacter(); DecisionPoints dp = GetDP(_gamingQueue); await Controller.UpdateQueue(dp); await Controller.UpdateCharacterPositionsOnMap(); @@ -357,7 +364,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting try { - isGameEnd = await _gamingQueue.ProcessTurnAsync(characterToAct); + isGameEnd = _gamingQueue.ProcessTurn(characterToAct); } catch (Exception e) { @@ -382,7 +389,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting } // 模拟时间流逝 - double timeLapse = await _gamingQueue.TimeLapse(); + double timeLapse = _gamingQueue.TimeLapse(); totalTime += timeLapse; nextDropItemTime -= timeLapse; dp = GetDP(_gamingQueue); @@ -530,7 +537,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting } } - private async Task GamingQueue_SelectTargetGrid(GamingQueue queue, Character character, List enemys, List teammates, GameMap map, List moveRange) + private Grid GamingQueue_SelectTargetGrid(GamingQueue queue, Character character, List enemys, List teammates, GameMap map, List moveRange) { if (!IsPlayer_OnlyTest(queue, character) || _gamingQueue is null || _gamingQueue.Map is null) return Grid.Empty; @@ -545,63 +552,63 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting } // 通过UI请求目标选择 - Grid? selectedTargetGrid = await Controller.RequestTargetGridSelection( + Grid? selectedTargetGrid = SyncAwaiter.WaitResult(Controller.RequestTargetGridSelection( character, current, _gamingQueue.Map.GetGridsByRange(current, character.MOV) - ); - await Controller.ResolveTargetGridSelection(selectedTargetGrid); + )); + SyncAwaiter.Wait(Controller.ResolveTargetGridSelection(selectedTargetGrid)); return selectedTargetGrid ?? Grid.Empty; } - private async Task GamingQueue_CharacterMove(GamingQueue queue, Character actor, DecisionPoints dp, Grid grid) + private void GamingQueue_CharacterMove(GamingQueue queue, Character actor, DecisionPoints dp, Grid grid) { - await Controller.UpdateCharacterPositionsOnMap(); + SyncAwaiter.Wait(Controller.UpdateCharacterPositionsOnMap()); } - private async Task GamingQueue_QueueUpdated(GamingQueue queue, List characters, Character character, DecisionPoints dp, double hardnessTime, QueueUpdatedReason reason, string msg) + private void GamingQueue_QueueUpdated(GamingQueue queue, List characters, Character character, DecisionPoints dp, double hardnessTime, QueueUpdatedReason reason, string msg) { if (reason != QueueUpdatedReason.Action) { - await Controller.UpdateQueue(dp); + SyncAwaiter.Wait(Controller.UpdateQueue(dp)); } } - private async Task GamingQueue_TurnStart(GamingQueue queue, Character character, DecisionPoints dp, List enemys, List teammates, List skills, List items) + private bool GamingQueue_TurnStart(GamingQueue queue, Character character, DecisionPoints dp, List enemys, List teammates, List skills, List items) { - await Controller.UpdateBottomInfoPanel(dp); + SyncAwaiter.Wait(Controller.UpdateBottomInfoPanel(dp)); return true; } - private async Task> GamingQueue_SelectNormalAttackTargets(GamingQueue queue, Character character, NormalAttack attack, List enemys, List teammates, List attackRange) + private List GamingQueue_SelectNormalAttackTargets(GamingQueue queue, Character character, NormalAttack attack, List enemys, List teammates, List attackRange) { if (!IsPlayer_OnlyTest(queue, character)) return []; // 通过UI请求目标选择 - List selectedTargets = await Controller.RequestTargetSelection( + List selectedTargets = SyncAwaiter.WaitResult(Controller.RequestTargetSelection( character, attack, enemys, teammates, attackRange - ); - await Controller.ResolveTargetSelection(selectedTargets); + )); + SyncAwaiter.Wait(Controller.ResolveTargetSelection(selectedTargets)); return selectedTargets ?? []; // 如果取消,返回空列表 } - private async Task GamingQueue_SelectItem(GamingQueue queue, Character character, List items) + private Item? GamingQueue_SelectItem(GamingQueue queue, Character character, List items) { if (!IsPlayer_OnlyTest(queue, character)) return null; // 通过UI请求物品选择 - Item? selectedItem = await Controller.RequestItemSelection(character, items); - await Controller.ResolveItemSelection(selectedItem); + Item? selectedItem = SyncAwaiter.WaitResult(Controller.RequestItemSelection(character, items)); + SyncAwaiter.Wait(Controller.ResolveItemSelection(selectedItem)); return selectedItem; } - private async Task> GamingQueue_SelectSkillTargets(GamingQueue queue, Character caster, Skill skill, List enemys, List teammates, List castRange) + private List GamingQueue_SelectSkillTargets(GamingQueue queue, Character caster, Skill skill, List enemys, List teammates, List castRange) { if (!IsPlayer_OnlyTest(queue, caster)) return []; @@ -611,19 +618,19 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting if (skill.CanSelectSelf) potentialTargets.Add(caster); // 通过UI请求目标选择 - List? selectedTargets = await Controller.RequestTargetSelection( + List? selectedTargets = SyncAwaiter.WaitResult(Controller.RequestTargetSelection( caster, skill, enemys, teammates, castRange - ); - await Controller.ResolveTargetSelection(selectedTargets); + )); + SyncAwaiter.Wait(Controller.ResolveTargetSelection(selectedTargets)); return selectedTargets ?? []; // 如果取消,返回空列表 } - private async Task> GamingQueue_SelectNonDirectionalSkillTargets(GamingQueue queue, Character caster, Skill skill, List enemys, List teammates, List castRange) + private List GamingQueue_SelectNonDirectionalSkillTargets(GamingQueue queue, Character caster, Skill skill, List enemys, List teammates, List castRange) { if (!IsPlayer_OnlyTest(queue, caster) || _gamingQueue is null || _gamingQueue.Map is null) return []; @@ -643,59 +650,59 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting } // 通过UI请求目标选择 - List? selectedTargets = await Controller.RequestTargetGridsSelection( + List? selectedTargets = SyncAwaiter.WaitResult(Controller.RequestTargetGridsSelection( caster, skill, enemys, teammates, current, castRange - ); - await Controller.ResolveTargetGridsSelection(selectedTargets); + )); + SyncAwaiter.Wait(Controller.ResolveTargetGridsSelection(selectedTargets)); return selectedTargets ?? []; // 如果取消,返回空列表 } - private async Task GamingQueue_SelectSkill(GamingQueue queue, Character character, List skills) + private Skill? GamingQueue_SelectSkill(GamingQueue queue, Character character, List skills) { if (!IsPlayer_OnlyTest(queue, character)) return null; // 通过UI请求技能选择 - Skill? selectedSkill = await Controller.RequestSkillSelection(character, skills); - await Controller.ResolveSkillSelection(selectedSkill); + Skill? selectedSkill = SyncAwaiter.WaitResult(Controller.RequestSkillSelection(character, skills)); + SyncAwaiter.Wait(Controller.ResolveSkillSelection(selectedSkill)); return selectedSkill; } - private async Task GamingQueue_TurnEnd(GamingQueue queue, Character character, DecisionPoints dp) + private void GamingQueue_TurnEnd(GamingQueue queue, Character character, DecisionPoints dp) { double ht = queue.HardnessTime[character]; - await Controller.SetPredictCharacter(character.NickName, ht); - await Controller.UpdateBottomInfoPanel(dp); + SyncAwaiter.Wait(Controller.SetPredictCharacter(character.NickName, ht)); + SyncAwaiter.Wait(Controller.UpdateBottomInfoPanel(dp)); if (!_fastMode) { if (IsRoundHasPlayer_OnlyTest(queue, character)) { // 玩家回合结束,等待玩家确认 - await Controller.RequestContinuePrompt("你的回合(或与你相关的回合)已结束,请查看本回合日志,然后点击继续. . ."); - await Controller.ResolveContinuePrompt(); + SyncAwaiter.Wait(Controller.RequestContinuePrompt("你的回合(或与你相关的回合)已结束,请查看本回合日志,然后点击继续. . .")); + SyncAwaiter.Wait(Controller.ResolveContinuePrompt()); } else { - await Controller.RequestCountDownContinuePrompt("该角色的回合已结束. . ."); - await Controller.ResolveCountDownContinuePrompt(); + SyncAwaiter.Wait(Controller.RequestCountDownContinuePrompt("该角色的回合已结束. . .")); + SyncAwaiter.Wait(Controller.ResolveCountDownContinuePrompt()); } } - else await Task.Delay(100); + else Thread.Sleep(100); } - private async Task GamingQueue_DecideAction(GamingQueue queue, Character character, DecisionPoints dp , List enemys, List teammates, List skills, List items) + private CharacterActionType GamingQueue_DecideAction(GamingQueue queue, Character character, DecisionPoints dp , List enemys, List teammates, List skills, List items) { if (IsPlayer_OnlyTest(queue, character)) { // 通过UI按钮请求行动类型 - await Controller.UpdateCharacterPositionsOnMap(); - CharacterActionType actionType = await Controller.RequestActionType(character, items); - await Controller.ResolveActionType(actionType); + SyncAwaiter.Wait(Controller.UpdateCharacterPositionsOnMap()); + CharacterActionType actionType = SyncAwaiter.WaitResult(Controller.RequestActionType(character, items)); + SyncAwaiter.Wait(Controller.ResolveActionType(actionType)); return actionType; } return CharacterActionType.None; // 非玩家角色,由AI处理,或默认None @@ -726,11 +733,11 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting return queue.CustomData.TryGetValue("player", out object? value) && value is Character player && (player == current || (current.CharacterState != CharacterState.Casting && queue.LastRound.Targets.Values.SelectMany(c => c).Any(c => c == player))); } - public async Task SetPreCastSuperSkill(Character character, Skill skill) + public void SetPreCastSuperSkill(Character character, Skill skill) { if (_gamingQueue is GamingQueue queue) { - await queue.SetCharacterPreCastSuperSkill(character, skill); + queue.SetCharacterPreCastSuperSkill(character, skill); } } diff --git a/Desktop/GameMapTesting/GameMapViewer.xaml.cs b/Desktop/GameMapTesting/GameMapViewer.xaml.cs index d0e3f5b..9442aec 100644 --- a/Desktop/GameMapTesting/GameMapViewer.xaml.cs +++ b/Desktop/GameMapTesting/GameMapViewer.xaml.cs @@ -356,7 +356,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting return; } - int maxLines = 150; + int maxLines = 250; // 获取 FlowDocument FlowDocument doc = DebugLogRichTextBox.Document; @@ -372,6 +372,9 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting doc.Blocks.Clear(); } + // 获取当前滚动位置 + double verticalOffsetBefore = DebugLogScrollViewer.VerticalOffset; + // 添加新的段落 Paragraph newParagraph = new(new Run(message)) { @@ -385,9 +388,39 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting doc.Blocks.Remove(doc.Blocks.FirstBlock); } - // 滚动到底部 - DebugLogRichTextBox.ScrollToEnd(); - DebugLogScrollViewer.ScrollToEnd(); + bool wasAtBottom = verticalOffsetBefore == 0; + + if (wasAtBottom) + { + // 滚动到底部 + DebugLogRichTextBox.ScrollToEnd(); + DebugLogScrollViewer.ScrollToEnd(); + } + } + + /// + /// 判断滚动条是否在最底部 + /// + private bool IsScrollViewerAtBottom() + { + // 检查 DebugLogScrollViewer + if (DebugLogScrollViewer != null) + { + // 使用一个小容差值来处理浮点数精度问题 + const double tolerance = 0.1; + double verticalOffset = DebugLogScrollViewer.VerticalOffset; + double scrollableHeight = DebugLogScrollViewer.ScrollableHeight; + + // 如果可滚动高度很小或为0,说明内容不足一屏,视为在底部 + if (scrollableHeight <= 0) + return true; + + // 检查是否已经滚动到底部(容差范围内) + return Math.Abs(verticalOffset - scrollableHeight) <= tolerance; + } + + // 如果没有找到滚动条,默认返回 true 以保持原有行为 + return true; } private void CurrentRoundChanged() @@ -1368,7 +1401,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting Skill? skill = PlayerCharacter.Skills.FirstOrDefault(s => s.IsSuperSkill && s.Enable && s.CurrentCD == 0 && s.RealEPCost <= PlayerCharacter.EP); if (skill != null) { - await _controller.SetPreCastSuperSkill(PlayerCharacter, skill); + _controller.SetPreCastSuperSkill(PlayerCharacter, skill); } else { diff --git a/Desktop/GameMapTesting/SyncAwaiter.cs b/Desktop/GameMapTesting/SyncAwaiter.cs new file mode 100644 index 0000000..c395f31 --- /dev/null +++ b/Desktop/GameMapTesting/SyncAwaiter.cs @@ -0,0 +1,42 @@ +namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting +{ + public static class SyncAwaiter + { + /// + /// 在同步方法中安全等待一个 Task 完成并获取结果 + /// 内部使用 ManualResetEventSlim,避免死锁 + /// + public static T WaitResult(Task task) + { + if (task.IsCompleted) + return task.Result; + + ManualResetEventSlim mres = new(false); + + // 当 task 完成时,设置事件信号 + task.ContinueWith(_ => + { + mres.Set(); + }, TaskScheduler.Default); + + // 阻塞当前线程直到 task 完成 + // 注意:这会阻塞调用线程! + mres.Wait(); + + // 现在可以安全取 Result(不会抛死锁) + return task.Result; + } + + /// + /// 无返回值版本 + /// + public static void Wait(Task task) + { + if (task.IsCompleted) return; + + ManualResetEventSlim mres = new(false); + task.ContinueWith(_ => mres.Set(), TaskScheduler.Default); + mres.Wait(); + } + } +} diff --git a/Library/Tests/CharacterTest.cs b/Library/Tests/CharacterTest.cs index 160208c..aac2227 100644 --- a/Library/Tests/CharacterTest.cs +++ b/Library/Tests/CharacterTest.cs @@ -37,23 +37,23 @@ namespace Milimoe.FunGame.Testing.Tests skill.GamingQueue = queue; skill.Character = teammate; skill.Level += 6; - await skill.OnSkillCasted(queue, teammate, [character], []); - await skill.OnSkillCasted(queue, teammate, [character], []); + skill.OnSkillCasted(queue, teammate, [character], []); + skill.OnSkillCasted(queue, teammate, [character], []); Character enemy = new CustomCharacter(1, "敌人"); Console.ReadKey(); enemy.SetLevel(60); skill = new 混沌烙印(enemy); skill.GamingQueue = queue; skill.Level += 8; - await skill.OnSkillCasted(queue, enemy, [teammate], []); + skill.OnSkillCasted(queue, enemy, [teammate], []); queue.CharacterStatistics[teammate] = new CharacterStatistics(); queue.AddCharacter(teammate, 10); - await queue.TimeLapse(); + queue.TimeLapse(); Console.WriteLine(teammate.GetInfo()); skill = new 虚弱领域(enemy); skill.GamingQueue = queue; skill.Level += 8; - await skill.OnSkillCasted(queue, enemy, [character], []); + skill.OnSkillCasted(queue, enemy, [character], []); character.UnEquip(EquipSlotType.Armor); Console.WriteLine(character.GetInfo()); Console.ReadKey(); diff --git a/Library/Tests/FunGame.cs b/Library/Tests/FunGame.cs index 6fd7249..fefc3e7 100644 --- a/Library/Tests/FunGame.cs +++ b/Library/Tests/FunGame.cs @@ -21,7 +21,7 @@ namespace Milimoe.FunGame.Testing.Tests public static bool PrintOut { get; set; } = false; public static string Msg { get; set; } = ""; - public static async Task> StartGame(bool printout, bool isWeb = false) + public static List StartGame(bool printout, bool isWeb = false) { PrintOut = printout; IsWeb = isWeb; @@ -80,7 +80,7 @@ namespace Milimoe.FunGame.Testing.Tests // 询问玩家需要选择哪个角色 Character? player = null; - await Task.Run(() => + Task.Run(() => { while (player is null) { @@ -110,14 +110,14 @@ namespace Milimoe.FunGame.Testing.Tests if (PrintOut) Console.WriteLine(); // 绑定事件 - gamingQueue.TurnStart += GamingQueue_TurnStart; - gamingQueue.DecideAction += GamingQueue_DecideAction; - gamingQueue.SelectNormalAttackTargets += GamingQueue_SelectNormalAttackTargets; - gamingQueue.SelectSkill += GamingQueue_SelectSkill; - gamingQueue.SelectSkillTargets += GamingQueue_SelectSkillTargets; - gamingQueue.SelectItem += GamingQueue_SelectItem; - gamingQueue.QueueUpdated += GamingQueue_QueueUpdated; - gamingQueue.TurnEnd += GamingQueue_TurnEnd; + gamingQueue.TurnStartEvent += GamingQueue_TurnStart; + gamingQueue.DecideActionEvent += GamingQueue_DecideAction; + gamingQueue.SelectNormalAttackTargetsEvent += GamingQueue_SelectNormalAttackTargets; + gamingQueue.SelectSkillEvent += GamingQueue_SelectSkill; + gamingQueue.SelectSkillTargetsEvent += GamingQueue_SelectSkillTargets; + gamingQueue.SelectItemEvent += GamingQueue_SelectItem; + gamingQueue.QueueUpdatedEvent += GamingQueue_QueueUpdated; + gamingQueue.TurnEndEvent += GamingQueue_TurnEnd; // 总游戏时长 double totalTime = 0; @@ -208,15 +208,15 @@ namespace Milimoe.FunGame.Testing.Tests foreach (Character c in characters.Where(c => c != winner && c.HP > 0)) { WriteLine("[ " + winner + " ] 对 [ " + c + " ] 造成了 99999999999 点真实伤害。"); - await gamingQueue.DeathCalculationAsync(winner, c); + gamingQueue.DeathCalculation(winner, c); } - await gamingQueue.EndGameInfo(winner); + gamingQueue.EndGameInfo(winner); result.Add(Msg); break; } // 检查是否有角色可以行动 - Character? characterToAct = await gamingQueue.NextCharacterAsync(); + Character? characterToAct = gamingQueue.NextCharacter(); // 处理回合 if (characterToAct != null) @@ -224,7 +224,7 @@ namespace Milimoe.FunGame.Testing.Tests WriteLine($"=== Round {i++} ==="); WriteLine("现在是 [ " + characterToAct + " ] 的回合!"); - bool isGameEnd = await gamingQueue.ProcessTurnAsync(characterToAct); + bool isGameEnd = gamingQueue.ProcessTurn(characterToAct); if (isGameEnd) { @@ -244,7 +244,7 @@ namespace Milimoe.FunGame.Testing.Tests } // 模拟时间流逝 - double timeLapse = await gamingQueue.TimeLapse(); + double timeLapse = gamingQueue.TimeLapse(); totalTime += timeLapse; nextDropItemTime -= timeLapse; @@ -397,7 +397,7 @@ namespace Milimoe.FunGame.Testing.Tests } } - private static async Task GamingQueue_QueueUpdated(GamingQueue queue, List characters, Character character, DecisionPoints dp, double hardnessTime, QueueUpdatedReason reason, string msg) + private static void GamingQueue_QueueUpdated(GamingQueue queue, List characters, Character character, DecisionPoints dp, double hardnessTime, QueueUpdatedReason reason, string msg) { if (IsPlayer_OnlyTest(queue, character)) { @@ -412,30 +412,28 @@ namespace Milimoe.FunGame.Testing.Tests // QueueUpdatedReason.PreCastSuperSkill 是指角色释放了爆发技 // 通知玩家,让玩家知道下一次行动需要选择目标 Console.WriteLine($"你的下一回合需要选择爆发技目标,知晓请按任意键继续. . ."); - await Console.In.ReadLineAsync(); + Console.In.ReadLine(); } } - await Task.CompletedTask; } - private static async Task GamingQueue_TurnStart(GamingQueue queue, Character character, DecisionPoints dp, List enemys, List teammates, List skills, List items) + private static bool GamingQueue_TurnStart(GamingQueue queue, Character character, DecisionPoints dp, List enemys, List teammates, List skills, List items) { if (IsPlayer_OnlyTest(queue, character)) { // 结束 AI 托管 queue.SetCharactersToAIControl(cancel: true, character); - await Task.CompletedTask; } // 注意,此事件返回 false 将全程接管此回合。 return true; } - private static async Task> GamingQueue_SelectNormalAttackTargets(GamingQueue queue, Character character, NormalAttack attack, List enemys, List teammates, List attackRange) + private static List GamingQueue_SelectNormalAttackTargets(GamingQueue queue, Character character, NormalAttack attack, List enemys, List teammates, List attackRange) { List characters = []; if (IsPlayer_OnlyTest(queue, character)) { - await Task.Run(() => + Task.Run(() => { Console.WriteLine($"你的角色编号:{character.GetIdName()}"); Console.WriteLine("【敌对角色列表】" + "\r\n" + string.Join("\r\n", enemys.Select(c => $"{c.GetIdName()}:{c.GetSimpleInBattleInfo(queue.HardnessTime[c])}"))); @@ -500,13 +498,13 @@ namespace Milimoe.FunGame.Testing.Tests return characters; } - private static async Task GamingQueue_SelectItem(GamingQueue queue, Character character, List items) + private static Item? GamingQueue_SelectItem(GamingQueue queue, Character character, List items) { Item? item = null; if (IsPlayer_OnlyTest(queue, character)) { // 询问玩家需要选择哪个物品 - await Task.Run(() => + Task.Run(() => { Console.WriteLine(string.Join("\r\n", items.Select(i => $"{i.GetIdName()}:{i}"))); while (item is null) @@ -532,12 +530,12 @@ namespace Milimoe.FunGame.Testing.Tests return item; } - private static async Task> GamingQueue_SelectSkillTargets(GamingQueue queue, Character caster, Skill skill, List enemys, List teammates, List castRange) + private static List GamingQueue_SelectSkillTargets(GamingQueue queue, Character caster, Skill skill, List enemys, List teammates, List castRange) { List characters = []; if (IsPlayer_OnlyTest(queue, caster)) { - await Task.Run(() => + Task.Run(() => { Console.WriteLine($"你的角色编号:{caster.GetIdName()}"); Console.WriteLine("【敌对角色列表】" + "\r\n" + string.Join("\r\n", enemys.Select(c => $"{c.GetIdName()}:{c.GetSimpleInBattleInfo(queue.HardnessTime[c])}"))); @@ -602,13 +600,13 @@ namespace Milimoe.FunGame.Testing.Tests return characters; } - private static async Task GamingQueue_SelectSkill(GamingQueue queue, Character character, List skills) + private static Skill? GamingQueue_SelectSkill(GamingQueue queue, Character character, List skills) { Skill? skill = null; if (IsPlayer_OnlyTest(queue, character)) { // 询问玩家需要选择哪个技能 - await Task.Run(() => + Task.Run(() => { Console.WriteLine(string.Join("\r\n", skills.Select(s => $"{s.GetIdName()}:{s}"))); while (skill is null) @@ -634,23 +632,22 @@ namespace Milimoe.FunGame.Testing.Tests return skill; } - private static async Task GamingQueue_TurnEnd(GamingQueue queue, Character character, DecisionPoints dp) + private static void GamingQueue_TurnEnd(GamingQueue queue, Character character, DecisionPoints dp) { if (IsRoundHasPlayer_OnlyTest(queue, character)) { // 暂停让玩家查看本回合日志 Console.WriteLine("你的回合(或与你相关的回合)已结束,请查看本回合日志,然后按任意键继续. . ."); - await Console.In.ReadLineAsync(); + Console.In.ReadLine(); } - await Task.CompletedTask; } - private static async Task GamingQueue_DecideAction(GamingQueue queue, Character character, DecisionPoints dp, List enemys, List teammates, List skills, List items) + private static CharacterActionType GamingQueue_DecideAction(GamingQueue queue, Character character, DecisionPoints dp, List enemys, List teammates, List skills, List items) { CharacterActionType type = CharacterActionType.None; if (IsPlayer_OnlyTest(queue, character)) { - await Task.Run(() => + Task.Run(() => { Console.WriteLine(character.GetSimpleInfo()); while (type == CharacterActionType.None)