From 0d1f1b532192df07142e61cf16dacc6e3a8ef7fa Mon Sep 17 00:00:00 2001 From: milimoe Date: Sat, 6 Sep 2025 19:34:43 +0800 Subject: [PATCH] =?UTF-8?q?ISkill=20=E6=B7=BB=E5=8A=A0=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E5=8F=AF=E9=80=89=E5=8F=96=E7=9A=84=E7=9B=AE=E6=A0=87=E6=95=B0?= =?UTF-8?q?=E9=87=8F=EF=BC=9B=E9=A1=BA=E5=BA=8F=E8=A1=A8=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=92=8C=E7=A1=AC=E7=9B=B4=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Desktop/GameMapTesting/GameMapController.cs | 9 ++-- Desktop/GameMapTesting/GameMapViewer.xaml.cs | 45 +++++++------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/Desktop/GameMapTesting/GameMapController.cs b/Desktop/GameMapTesting/GameMapController.cs index 4e64c60..63534fb 100644 --- a/Desktop/GameMapTesting/GameMapController.cs +++ b/Desktop/GameMapTesting/GameMapController.cs @@ -91,12 +91,13 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting public async Task> RequestTargetSelection(Character character, ISkill skill, List enemys, List teammates) { - await WriteLine($"请为 {character.NickName} 选择目标 (最多 {skill.CanSelectTargetCount} 个)。"); + List selectable = skill.GetSelectableTargets(character, enemys, teammates); + await WriteLine($"请为 {character.NickName} 选择目标 (最多 {skill.RealCanSelectTargetCount(enemys, teammates)} 个)。"); List targetIds = await _targetSelectionRequester.RequestInput( - async (callback) => await UI.InvokeAsync(() => UI.ShowTargetSelectionUI(character, skill, enemys, teammates, callback)) + async (callback) => await UI.InvokeAsync(() => UI.ShowTargetSelectionUI(character, skill, selectable, enemys, teammates, callback)) ) ?? []; if (targetIds == null) return []; - return [.. enemys.Union(teammates).Union([character]).Where(targetIds.Contains)]; + return [.. selectable.Where(targetIds.Contains)]; } public async Task RequestSkillSelection(Character character, List availableSkills) @@ -130,7 +131,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting await WriteLine(message); // 调用 _continuePromptRequester 的 RequestInput 方法,它会等待回调被触发 await _continuePromptRequester.RequestInput( - async (callback) => await UI.InvokeAsync(() => UI.StartCountdownForContinue(countdownSeconds, callback)) + async (callback) => await UI.InvokeAsync(async () => await UI.StartCountdownForContinue(countdownSeconds, callback)) ); } diff --git a/Desktop/GameMapTesting/GameMapViewer.xaml.cs b/Desktop/GameMapTesting/GameMapViewer.xaml.cs index 8db6f8c..7eb39c5 100644 --- a/Desktop/GameMapTesting/GameMapViewer.xaml.cs +++ b/Desktop/GameMapTesting/GameMapViewer.xaml.cs @@ -1,20 +1,17 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; -using System.ComponentModel; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; -using System.Windows.Threading; 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; -using Oshima.FunGame.OshimaServers.Service; using static Milimoe.FunGame.Core.Library.Constant.General; using Brush = System.Windows.Media.Brush; using Brushes = System.Windows.Media.Brushes; @@ -50,7 +47,6 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting public ObservableCollection SelectedTargets { get; set; } = []; // 新增:倒计时相关的字段 - private readonly DispatcherTimer _countdownTimer; private int _remainingCountdownSeconds; private Action? _currentContinueCallback; @@ -85,12 +81,6 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting _selectionPredictCharacter.Character.Promotion = 1800; this.DataContext = this; // 将UserControl自身设置为DataContext,以便ItemsControl可以绑定到CharacterQueueItems和SelectedTargets属性 - _countdownTimer = new() - { - Interval = TimeSpan.FromSeconds(1) // 每秒触发一次 - }; - _countdownTimer.Tick += CountdownTimer_Tick; // 绑定事件处理器 - // 初始化 SelectedTargetsItemsControl 的 ItemsSource SelectedTargetsItemsControl.ItemsSource = SelectedTargets; @@ -1557,14 +1547,15 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting /// /// 发起行动的角色。 /// 请求选择目标的技能/普攻。 + /// 所有可选择的目标列表。 /// 所有可选敌方目标列表。 /// 所有可选友方目标列表。 /// 选择完成后调用的回调函数。 - public void ShowTargetSelectionUI(Character character, ISkill skill, List enemys, List teammates, Action> callback) + public void ShowTargetSelectionUI(Character character, ISkill skill, List selectable, List enemys, List teammates, Action> callback) { _resolveTargetSelection = callback; _actingCharacterForTargetSelection = character; - _potentialTargetsForSelection = skill.GetSelectableTargets(character, enemys, teammates); + _potentialTargetsForSelection = selectable; _maxTargetsForSelection = skill.CanSelectTargetCount; _canSelectAllTeammates = skill.SelectAllTeammates; _canSelectAllEnemies = skill.SelectAllEnemies; @@ -1574,7 +1565,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting _isSelectingTargets = true; // 进入目标选择模式 SelectedTargets.Clear(); // 清空之前的选择 - TargetSelectionTitle.Text = $"选择 {character.NickName} 的目标 (最多 {skill.CanSelectTargetCount} 个)"; + TargetSelectionTitle.Text = $"选择 {character.NickName} 的目标 (最多 {skill.RealCanSelectTargetCount(enemys, teammates)} 个)"; TargetSelectionOverlay.Visibility = Visibility.Visible; if (_canSelectAllTeammates) { @@ -1766,25 +1757,21 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting _resolveContinuePrompt = null; } - private void CountdownTimer_Tick(object? sender, EventArgs e) + private async Task StartCountdownTimer() { - _remainingCountdownSeconds--; - - if (_remainingCountdownSeconds > 0) + while (_remainingCountdownSeconds > 0) { // 更新倒计时文本 CountdownTextBlock.Text = $"{_remainingCountdownSeconds} 秒后继续..."; + await Task.Delay(1000); + _remainingCountdownSeconds--; } - else - { - // 倒计时结束 - _countdownTimer.Stop(); // 停止计时器 - CountdownTextBlock.Visibility = Visibility.Collapsed; // 隐藏倒计时文本 + // 倒计时结束 + CountdownTextBlock.Visibility = Visibility.Collapsed; - // 触发继续回调 - _currentContinueCallback?.Invoke(true); - _currentContinueCallback = null; // 清除回调,防止重复触发 - } + // 触发继续回调 + _currentContinueCallback?.Invoke(true); + _currentContinueCallback = null; } /// @@ -1792,7 +1779,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting /// /// 倒计时秒数。 /// 倒计时结束后调用的回调函数。 - public void StartCountdownForContinue(int seconds, Action callback) + public async Task StartCountdownForContinue(int seconds, Action callback) { _remainingCountdownSeconds = seconds; _currentContinueCallback = callback; @@ -1802,7 +1789,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting CountdownTextBlock.Visibility = Visibility.Visible; // 启动计时器 - _countdownTimer.Start(); + await InvokeAsync(StartCountdownTimer); } ///