From 8bcb95795b9a9900d51da493938f6db86ab4fe16 Mon Sep 17 00:00:00 2001 From: milimoe Date: Tue, 6 Jan 2026 02:01:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E6=8C=87=E5=90=91=E6=80=A7=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E6=B5=8B=E8=AF=95=E5=92=8C=E6=B7=BB=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=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 | 15 + Desktop/GameMapTesting/GameMapTesting.cs | 35 +++ Desktop/GameMapTesting/GameMapViewer.xaml | 48 +++ Desktop/GameMapTesting/GameMapViewer.xaml.cs | 314 ++++++++++++++++++- Library/Tests/CharacterTest.cs | 8 +- 5 files changed, 414 insertions(+), 6 deletions(-) diff --git a/Desktop/GameMapTesting/GameMapController.cs b/Desktop/GameMapTesting/GameMapController.cs index 8a3abac..e19c593 100644 --- a/Desktop/GameMapTesting/GameMapController.cs +++ b/Desktop/GameMapTesting/GameMapController.cs @@ -18,6 +18,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting private readonly UserInputRequester _targetGridSelectionRequester = new(); private readonly UserInputRequester _actionTypeRequester = new(); private readonly UserInputRequester> _targetSelectionRequester = new(); + private readonly UserInputRequester> _targetGridsSelectionRequester = new(); private readonly UserInputRequester _skillSelectionRequester = new(); private readonly UserInputRequester _itemSelectionRequester = new(); private readonly UserInputRequester _continuePromptRequester = new(); // 用于“按任意键继续”提示 @@ -109,6 +110,14 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting return [.. targets.Where(selectable.Contains)]; } + public async Task> RequestTargetGridsSelection(Character character, Skill skill, List enemys, List teammates, Grid currentGrid, List range) + { + await WriteLine($"请选择作用目标范围。"); + return await _targetGridsSelectionRequester.RequestInput( + async (callback) => await UI.InvokeAsync(() => UI.ShowTargetGridsSelectionUI(character, skill, enemys, teammates, currentGrid, range, callback)) + ) ?? []; + } + public async Task RequestSkillSelection(Character character, List availableSkills) { await WriteLine($"请为 {character.NickName} 选择一个技能。"); @@ -170,6 +179,12 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting await UI.InvokeAsync(() => UI.HideTargetGridSelectionUI()); } + public async Task ResolveTargetGridsSelection(List grids) + { + _targetGridsSelectionRequester.ResolveInput(grids); + await UI.InvokeAsync(() => UI.HideTargetGridsSelectionUI()); + } + public async Task ResolveSkillSelection(Skill? skill) { _skillSelectionRequester.ResolveInput(skill); diff --git a/Desktop/GameMapTesting/GameMapTesting.cs b/Desktop/GameMapTesting/GameMapTesting.cs index da95bc8..2aa0ce5 100644 --- a/Desktop/GameMapTesting/GameMapTesting.cs +++ b/Desktop/GameMapTesting/GameMapTesting.cs @@ -1,6 +1,7 @@ using System.Text; 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.Constant; using Milimoe.FunGame.Core.Model; @@ -226,6 +227,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting _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; @@ -605,6 +607,39 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting return selectedTargets ?? []; // 如果取消,返回空列表 } + private async Task> 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 []; + + List potentialTargets = []; + if (skill.CanSelectEnemy) potentialTargets.AddRange(enemys); + if (skill.CanSelectTeammate) potentialTargets.AddRange(teammates); + if (skill.CanSelectSelf) potentialTargets.Add(caster); + + Grid current = Grid.Empty; + if (_gamingQueue.CustomData.TryGetValue("currentGrid", out object? currentGrid) && currentGrid is Grid grid) + { + current = grid; + } + if (current == Grid.Empty) + { + return []; + } + + // 通过UI请求目标选择 + List? selectedTargets = await Controller.RequestTargetGridsSelection( + caster, + skill, + enemys, + teammates, + current, + castRange + ); + await Controller.ResolveTargetGridsSelection(selectedTargets); + + return selectedTargets ?? []; // 如果取消,返回空列表 + } + private async Task GamingQueue_SelectSkill(GamingQueue queue, Character character, List skills) { if (!IsPlayer_OnlyTest(queue, character)) return null; diff --git a/Desktop/GameMapTesting/GameMapViewer.xaml b/Desktop/GameMapTesting/GameMapViewer.xaml index 18cc276..a73811b 100644 --- a/Desktop/GameMapTesting/GameMapViewer.xaml +++ b/Desktop/GameMapTesting/GameMapViewer.xaml @@ -590,6 +590,54 @@ + + + + + + + + + + + + + + + + + + + + + +