From d31ca81e83ea1ae05b63af082da01bfb716062c6 Mon Sep 17 00:00:00 2001 From: uye <99072975+ABA2396@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:56:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B8=B8=E9=A9=BB=E5=85=B3=E5=8D=A1?= =?UTF-8?q?=E5=A4=87=E9=80=89=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaWpfGui/Res/Localizations/en-us.xaml | 1 + src/MaaWpfGui/Res/Localizations/ja-jp.xaml | 1 + src/MaaWpfGui/Res/Localizations/ko-kr.xaml | 1 + src/MaaWpfGui/Res/Localizations/zh-cn.xaml | 1 + src/MaaWpfGui/Res/Localizations/zh-tw.xaml | 1 + .../FightSettingsUserControlModel.cs | 31 +++++++++++++++++++ 6 files changed, 36 insertions(+) diff --git a/src/MaaWpfGui/Res/Localizations/en-us.xaml b/src/MaaWpfGui/Res/Localizations/en-us.xaml index 877607580a..ff2a7d0d1d 100644 --- a/src/MaaWpfGui/Res/Localizations/en-us.xaml +++ b/src/MaaWpfGui/Res/Localizations/en-us.xaml @@ -849,6 +849,7 @@ Do not adjust the proxy multiplier setting in the game Custom {key=AnnihilationStage} Annihilation Mode Current Annihilation + The selected stage 「{0}」 is a permanent stage or Current/Last; subsequent stages will not be selected Chernobog Lungmen Outskirts Lungmen Downtown diff --git a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml index d3806ee109..ce80e4c216 100644 --- a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml +++ b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml @@ -850,6 +850,7 @@ C:\\leidian\\LDPlayer9 カスタム{key=AnnihilationStage} 殲滅作戦 今期の殲滅作戦 + 選択されたステージ 「{0}」 は常設ステージまたは現在/最後のため、後続のステージは選択されません チェルノボーグ 龍門郊外 龍門市街 diff --git a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml index f9e2bfcf0e..664ef8753a 100644 --- a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml +++ b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml @@ -851,6 +851,7 @@ C:\\leidian\\LDPlayer9 커스텀 {key=AnnihilationStage} 섬멸 모드 이번 섬멸 작전 + 선택된 스테이지 「{0}」 는 상설 스테이지 또는 현재/마지막이므로 이후 스테이지는 선택되지 않습니다 체르노보그 용문 외곽 용문 시내 diff --git a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml index 046fed8e07..75109aeebd 100644 --- a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml +++ b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml @@ -850,6 +850,7 @@ C:\\leidian\\LDPlayer9。\n 自定义{key=AnnihilationStage} 剿灭模式 当期剿灭 + 当前选中的关卡 「{0}」 为常驻关卡或当前/上次,其后的关卡不会被选中执行 切尔诺伯格 龙门外环 龙门市区 diff --git a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml index 8270d671e9..fcf702ed3a 100644 --- a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml +++ b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml @@ -850,6 +850,7 @@ C:\\leidian\\LDPlayer9\n 自定義{key=AnnihilationStage} 剿滅模式 當期剿滅 + 目前選中的關卡 「{0}」 為常駐關卡或當前/上次,其後的關卡不會被選中執行 切爾諾伯格 龍門外環 龍門市區 diff --git a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs index 875262c4e4..570c48ae11 100644 --- a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs +++ b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/FightSettingsUserControlModel.cs @@ -1061,6 +1061,20 @@ public class FightSettingsUserControlModel : TaskSettingsViewModel, FightSetting return stage; } + /// + /// 判断指定关卡是否为常驻关卡(无周期限制且非限时活动,每天都开放)。 + /// 资源关(如 LS-6)虽有关联活动但 IsResourceCollection 为 true 且无周期限制,同样视为常驻。 + /// + /// 关卡代码。 + /// 若该关卡为常驻关卡则返回 true + private static bool IsPermanentStage(string stage) + { + var stageInfo = Instances.StageManager.GetStageInfo(stage); + bool noPeriodicLimit = stageInfo.OpenDaysOfWeek == null || !stageInfo.OpenDaysOfWeek.Any(); + bool notLimitedActivity = stageInfo.Activity == null || stageInfo.Activity.IsResourceCollection; + return noPeriodicLimit && notLimitedActivity; + } + public override void RefreshUI(BaseTask baseTask) { if (baseTask is not FightTask fight) @@ -1361,6 +1375,23 @@ public class FightSettingsUserControlModel : TaskSettingsViewModel, FightSetting return (null, []); } + // 选关逻辑为从上至下找第一个开放关卡, + // 常驻关卡(如剿灭、1-7)或"当前/上次"(空字符串)一旦被选中便不会继续往下查找, + // 因此其后配置的关卡不会被选中执行 + if (taskId is null && (stage == string.Empty || IsPermanentStage(stage))) + { + int stageIndex = fight.StagePlan.IndexOf(stage); + if (stageIndex >= 0 && stageIndex < fight.StagePlan.Count - 1) + { + var stageName = stage == string.Empty + ? LocalizationHelper.GetString("DefaultStage") + : Instances.StageManager.GetStageInfo(stage).Display; + Instances.TaskQueueViewModel.AddLog( + LocalizationHelper.GetStringFormat("PermanentStageBlocksStages", stageName), + UiLogColor.Warning); + } + } + var time = DateTimeOffset.Now; var activityExpireIn2Days = false; var activityList = Instances.StageManager.ActivityList.Where(ss => ss.Value.Info.StartTimeUtc <= time && time <= ss.Value.Info.ExpireTimeUtc);