ISkill 添加实际可选取的目标数量;顺序表修复排序和硬直时间重复的问题

This commit is contained in:
milimoe 2025-09-06 19:34:43 +08:00
parent dfad02fd7c
commit 0d1f1b5321
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
2 changed files with 21 additions and 33 deletions

View File

@ -91,12 +91,13 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting
public async Task<List<Character>> RequestTargetSelection(Character character, ISkill skill, List<Character> enemys, List<Character> teammates)
{
await WriteLine($"请为 {character.NickName} 选择目标 (最多 {skill.CanSelectTargetCount} 个)。");
List<Character> selectable = skill.GetSelectableTargets(character, enemys, teammates);
await WriteLine($"请为 {character.NickName} 选择目标 (最多 {skill.RealCanSelectTargetCount(enemys, teammates)} 个)。");
List<Character> 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<Skill?> RequestSkillSelection(Character character, List<Skill> 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))
);
}

View File

@ -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<Character> SelectedTargets { get; set; } = [];
// 新增:倒计时相关的字段
private readonly DispatcherTimer _countdownTimer;
private int _remainingCountdownSeconds;
private Action<bool>? _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
/// </summary>
/// <param name="character">发起行动的角色。</param>
/// <param name="skill">请求选择目标的技能/普攻。</param>
/// <param name="selectable">所有可选择的目标列表。</param>
/// <param name="enemys">所有可选敌方目标列表。</param>
/// <param name="teammates">所有可选友方目标列表。</param>
/// <param name="callback">选择完成后调用的回调函数。</param>
public void ShowTargetSelectionUI(Character character, ISkill skill, List<Character> enemys, List<Character> teammates, Action<List<Character>> callback)
public void ShowTargetSelectionUI(Character character, ISkill skill, List<Character> selectable, List<Character> enemys, List<Character> teammates, Action<List<Character>> 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 = null;
}
/// <summary>
@ -1792,7 +1779,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting
/// </summary>
/// <param name="seconds">倒计时秒数。</param>
/// <param name="callback">倒计时结束后调用的回调函数。</param>
public void StartCountdownForContinue(int seconds, Action<bool> callback)
public async Task StartCountdownForContinue(int seconds, Action<bool> callback)
{
_remainingCountdownSeconds = seconds;
_currentContinueCallback = callback;
@ -1802,7 +1789,7 @@ namespace Milimoe.FunGame.Testing.Desktop.GameMapTesting
CountdownTextBlock.Visibility = Visibility.Visible;
// 启动计时器
_countdownTimer.Start();
await InvokeAsync(StartCountdownTimer);
}
/// <summary>