diff --git a/docs/3.5-肉鸽辅助协议.md b/docs/3.5-肉鸽辅助协议.md index b6cc02e016..0651f64020 100644 --- a/docs/3.5-肉鸽辅助协议.md +++ b/docs/3.5-肉鸽辅助协议.md @@ -28,7 +28,7 @@ icon: ri:game-fill { "theme": "Phantom", //肉鸽主题(这里是傀影) "priority": [ //群组的优先度,有序 - ... + ... ], "team_complete_condition": [ //阵容完备度检测 ... @@ -41,6 +41,18 @@ icon: ri:game-fill 按照你的游戏理解将干员分成不同的 ***groups*** (群组,相关概念参考 [战斗流程协议](3.3-战斗流程协议.md)) +::: info 注意 + + 1. 同一group内的干员和召唤物必须部署方式一致(即同为近战或者同为高台) + + 2. 允许同一干员或者召唤物根据用法不同,被分类至不同的group + + 3. 请不要修改已经存在的group名称,以免在MAA更新时导致之前版本的作业无法使用 + + 4. 请尽量不要新增group,尽量将新添加进作业的单位按照用法纳入已经存在的group + +::: + ```json { "theme": "Phantom", @@ -62,7 +74,8 @@ icon: ri:game-fill "team_complete_condition": [ ... ] -} + ] +} ``` 1. 已有群组介绍 @@ -74,12 +87,12 @@ icon: ri:game-fill | ***地面单切*** | 单独对战精英怪 | 处决者特种 | 史尔特尔、异德、夜刀x、M3、红 | | ***高台C*** | 常态和决战输出 | 狙击、术士 | 假日威龙陈、澄闪、艾雅法拉、肥鸭 | | ***高台输出*** | 对空和常态输出 | 狙击、术士 | 空弦、能天使、克洛丝、史都华德 | - | ***奶*** | 站场和清杂能力 | 治疗、辅助 | 凯尔希、浊心斯卡蒂、芙蓉、安赛尔 | + | ***奶*** | 治疗能力 | 治疗、辅助 | 凯尔希、浊心斯卡蒂、芙蓉、安赛尔 | | ***回费*** | 回复cost | 先锋 | 桃金娘、伊内丝、芬、香草 | | ***炮灰*** | 吸收炮弹、再部署 | 特种、召唤物 | M3、红、桃金娘、预备干员 | | ***高台预备*** | 有一定输出能力 | | 梓兰、预备干员 | -2. 需要特殊操作的群组 +3. 需要特殊操作的群组 除了上面那些比较笼统的分组,我们有时候需要对一些干员或者干员种类进行一些定制的精细化操作,比如 | 分组 | 包括干员 | 主要特点 | @@ -88,6 +101,7 @@ icon: ri:game-fill | 召唤类 | 凯尔希、令、稀音 | 自带地面阻挡,有的图需要优先部署,召唤物可以当阻挡也可以当炮灰 | | 情报官 | 晓歌、伊内丝 | 既可以回费、又可以侧面输出、还可以单切 | | 浊心斯卡蒂 | 浊心斯卡蒂 | 低压时奶量尚可,但是范围特殊,一些图有比较适配的位置 | + | 焰苇 | 焰影苇草 | 萨米肉鸽常用开局干员,兼具治疗和输出,一些图有比较适配的位置 | | 银灰 | 银灰、玛恩纳 | 地面大范围决战输出,可以针对boss进行部署 | | 史尔特尔 | 史尔特尔 | 由于精二后固定携带3技能,这时站场能力几乎为零,需要阻挡位的部署优先度极低 | | 骰子 | 骰子 | 水月肉鸽中的骰子需要单独操作 | @@ -109,7 +123,7 @@ icon: ri:game-fill { "theme": "Phantom", //肉鸽主题 "priority": [ //群组 - ... + ... ], "team_complete_condition": [ //阵容完备度检测 { @@ -168,12 +182,12 @@ icon: ri:game-fill } ] }, - ... + ... ], "team_complete_condition": [ ... ] - } + } ``` 3. 按照你的理解新增群组和干员 @@ -450,7 +464,7 @@ OCR识别不期而遇事件,但是选项是操作固定的位置 `resource/roguelike/主题名/shopping.json` 描述了商店购买藏品(和战斗后选择藏品?)的策略 -```jsonc +```json { "theme": "Phantom", //肉鸽主题名(这里是傀影) "priority": [ //优先度,有序,顺序即为优先级,越在前面越优先购买,但优先级判断在chars,roles的筛选之前,可能出现高优先级商品被筛掉,什么都不买的情况 diff --git a/resource/global/YoStarEN/resource/tasks.json b/resource/global/YoStarEN/resource/tasks.json index 1fa27fb43f..aecdd1b624 100644 --- a/resource/global/YoStarEN/resource/tasks.json +++ b/resource/global/YoStarEN/resource/tasks.json @@ -3502,6 +3502,9 @@ "Mizuki@Roguelike@GetDropSelectRecruit": { "templThreshold": 0.75 }, + "Mizuki@Roguelike@GetDropBoxOpen": { + "templThreshold": 0.95 + }, "Mizuki@Roguelike@NextLevel": { "text": [ "Celeste and Seashore", @@ -3683,19 +3686,19 @@ "解约协议" ], [ - "Vanguard Rec. Voucher", + "Vanguard Rec. *Voucher", "先锋招募券" ], [ - "Sabotage Co-op Rec. Voucher", + "Sabotage Co-op Rec. *Voucher", "破坏协议招募券" ], [ - "Elite Defender Rec. Voucher", + "Elite Defender Rec. *Voucher", "高级重装招募券" ], [ - "Guard Rec. Voucher", + "Guard Rec. *Voucher", "近卫招募券" ], [ @@ -3719,7 +3722,7 @@ "玻璃小鸟" ], [ - "Specialist Rec. Voucher", + "Specialist Rec. *Voucher", "特种招募券" ], [ @@ -3727,11 +3730,11 @@ "酒神的印记" ], [ - "Elite Specialist Rec. Voucher", + "Elite Specialist Rec. *Voucher", "高级特种招募券" ], [ - "Backline Corps Rec. Voucher", + "Backline Corps Rec. *Voucher", "后方协调招募券" ], [ @@ -3755,7 +3758,7 @@ "《独行客》" ], [ - "Defender Rec. Voucher", + "Defender Rec. *Voucher", "重装招募券" ], [ @@ -3763,7 +3766,7 @@ "《旧高卢地名源流考》" ], [ - "Elite Medic Rec. Voucher", + "Elite Medic Rec. *Voucher", "高级医疗招募券" ], [ @@ -3783,7 +3786,7 @@ "高卢小圆饼" ], [ - "Sniper Rec. Voucher", + "Sniper Rec. *Voucher", "狙击招募券" ], [ @@ -3791,7 +3794,7 @@ "高级人事调度函" ], [ - "Elite Sniper Rec. Voucher", + "Elite Sniper Rec. *Voucher", "高级狙击招募券" ], [ @@ -3807,7 +3810,7 @@ "扩散之手" ], [ - "Caster Rec. Voucher", + "Caster Rec. *Voucher", "术师招募券" ], [ @@ -3815,19 +3818,19 @@ "医者-理智固剂" ], [ - "Elite Vanguard Rec. Voucher", + "Elite Vanguard Rec. *Voucher", "高级先锋招募券" ], [ - "Supporter Rec. Voucher", + "Supporter Rec. *Voucher", "辅助招募券" ], [ - "Elite Supporter Rec. Voucher", + "Elite Supporter Rec. *Voucher", "高级辅助招募券" ], [ - "Medic Rec. Voucher", + "Medic Rec. *Voucher", "医疗招募券" ], [ @@ -3839,7 +3842,7 @@ "《大静谧》" ], [ - "Elite Guard Rec. Voucher", + "Elite Guard Rec. *Voucher", "高级近卫招募券" ], [ @@ -3847,11 +3850,11 @@ "“静音小队”" ], [ - "Elite Caster Rec. Voucher", + "Elite Caster Rec. *Voucher", "高级术师招募券" ], [ - "Assault Co-op Rec. Voucher", + "Assault Co-op Rec. *Voucher", "突击协议招募券" ], [ @@ -3859,15 +3862,15 @@ "特别人事调度函" ], [ - "Fortification Co-op Rec. Voucher", + "Fortification Co-op Rec. *Voucher", "堡垒协议招募券" ], [ - "Ranged Co-op Rec. Voucher", + "Ranged Co-op Rec. *Voucher", "远程协议招募券" ], [ - "Frontline Corps Rec. Voucher", + "Frontline Corps Rec. *Voucher", "前线统合招募券" ], [ @@ -4439,7 +4442,7 @@ "锈刃-单兵" ], [ - "Rusted Blade *-* *No Man's Land", + "Rusted Blade *-* *No Man's.*", "锈刃-无人之境" ], [ @@ -4847,7 +4850,7 @@ "支援地雷组" ], [ - "Support Mr. Rumbles", + "Support Mr. *Boom", "支援轰隆隆" ], [ @@ -5195,7 +5198,7 @@ "锈刃-研磨" ], [ - "Rusted Blade *-* *No Man's Land", + "Rusted Blade *-* *No Man's.*", "锈刃-可视静谧" ], [ @@ -5549,4 +5552,4 @@ "Headhunt x10" ] } -} +} \ No newline at end of file diff --git a/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBox.png b/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBox.png index 7af2d92d6f..1027d55692 100644 Binary files a/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBox.png and b/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBox.png differ diff --git a/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxOpen.png b/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxOpen.png new file mode 100644 index 0000000000..083c99e6ca Binary files /dev/null and b/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxOpen.png differ diff --git a/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxSelect.png b/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxSelect.png index bb2cc243ab..b040b6e42b 100644 Binary files a/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxSelect.png and b/resource/global/YoStarEN/resource/template/Mizuki@Roguelike@GetDropBoxSelect.png differ diff --git a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs index 7941cf68c2..65f73613ee 100644 --- a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs @@ -43,6 +43,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Serilog; using Stylet; +using ComboBox = System.Windows.Controls.ComboBox; using Timer = System.Timers.Timer; namespace MaaWpfGui.ViewModels.UI @@ -252,7 +253,8 @@ namespace MaaWpfGui.ViewModels.UI new CombinedData { Display = LocalizationHelper.GetString("RoguelikeThemeSami"), Value = "Sami" }, }; - UpdateRoguelikeThemeList(); + UpdateRoguelikeSquadList(); + UpdateRoguelikeCoreCharList(); RoguelikeRolesList = new List { @@ -1407,7 +1409,8 @@ namespace MaaWpfGui.ViewModels.UI set { SetAndNotify(ref _roguelikeTheme, value); - UpdateRoguelikeThemeList(); + UpdateRoguelikeSquadList(); + UpdateRoguelikeCoreCharList(); ConfigurationHelper.SetValue(ConfigurationKeys.RoguelikeTheme, value); } } @@ -1467,11 +1470,28 @@ namespace MaaWpfGui.ViewModels.UI get => _roguelikeCoreChar; set { + if (_roguelikeCoreChar == (value ??= string.Empty)) + { + return; + } + SetAndNotify(ref _roguelikeCoreChar, value); + Instances.TaskQueueViewModel.AddLog(value); ConfigurationHelper.SetValue(ConfigurationKeys.RoguelikeCoreChar, value); } } + private ObservableCollection _roguelikeCoreCharList = new ObservableCollection(); + + /// + /// Gets or sets the roguelike core character. + /// + public ObservableCollection RoguelikeCoreCharList + { + get => _roguelikeCoreCharList; + set => SetAndNotify(ref _roguelikeCoreCharList, value); + } + private string _roguelikeUseSupportUnit = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeUseSupportUnit, false.ToString()); /// @@ -3231,7 +3251,7 @@ namespace MaaWpfGui.ViewModels.UI return false; } - public void UpdateRoguelikeThemeList() + public void UpdateRoguelikeSquadList() { var roguelikeSquad = RoguelikeSquad; @@ -3308,6 +3328,49 @@ namespace MaaWpfGui.ViewModels.UI _roguelikeSquad = RoguelikeSquadList.Any(x => x.Value == roguelikeSquad) ? roguelikeSquad : string.Empty; } + public void UpdateRoguelikeCoreCharList() + { + var filePath = $"resource/roguelike/{RoguelikeTheme}/recruitment.json"; + if (File.Exists(filePath) is false) + { + RoguelikeCoreCharList.Clear(); + return; + } + + var jsonStr = File.ReadAllText(filePath); + var json = (JObject)JsonConvert.DeserializeObject(jsonStr); + + var roguelikeCoreCharList = new ObservableCollection(); + + if (json?["priority"] is JArray priorityArray) + { + foreach (var priorityItem in priorityArray) + { + if (!(priorityItem?["opers"] is JArray opersArray)) + { + continue; + } + + foreach (var operItem in opersArray) + { + var isStart = (bool?)operItem.SelectToken("is_start") ?? false; + if (!isStart) + { + continue; + } + + var name = (string)operItem.SelectToken("name"); + if (!string.IsNullOrEmpty(name)) + { + roguelikeCoreCharList.Add(name); + } + } + } + } + + RoguelikeCoreCharList = roguelikeCoreCharList; + } + #region SettingsGuide // 目前共4步,再多塞不下了,后续可以整个新功能展示( @@ -3355,5 +3418,19 @@ namespace MaaWpfGui.ViewModels.UI } #endregion SettingsGuide + + /// + /// Make comboBox searchable + /// + /// Event sender + /// Event args + // xaml 中绑定了 Loaded 事件,需要添加 qodana ignore rule + // EventArgs 不能省略,否则会报错 + // ReSharper disable once UnusedMember.Global + // ReSharper disable once UnusedParameter.Global + public void MakeComboBoxSearchable(object sender, EventArgs e) + { + (sender as ComboBox)?.MakeComboBoxSearchable(); + } } } diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index f5de276a64..3b28a1b18f 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -970,7 +970,13 @@ namespace MaaWpfGui.ViewModels.UI bool mainFightRet = Instances.AsstProxy.AsstAppendFight(curStage, medicine, stone, times, DropsItemId, dropsQuantity); - if (mainFightRet && (curStage == "Annihilation") && Instances.SettingsViewModel.UseAlternateStage) + if (!mainFightRet) + { + AddLog(LocalizationHelper.GetString("UnsupportedStages") + ": " + curStage, UiLogColor.Error); + return false; + } + + if ((curStage == "Annihilation") && Instances.SettingsViewModel.UseAlternateStage) { foreach (var stage in new[] { Stage1, Stage2, Stage3 }) { @@ -2746,7 +2752,7 @@ namespace MaaWpfGui.ViewModels.UI } /// - /// DropsList ComboBox loaded + /// Make comboBox searchable /// /// Event sender /// Event args @@ -2754,7 +2760,7 @@ namespace MaaWpfGui.ViewModels.UI // EventArgs 不能省略,否则会报错 // ReSharper disable once UnusedMember.Global // ReSharper disable once UnusedParameter.Global - public void DropsListLoaded(object sender, EventArgs e) + public void MakeComboBoxSearchable(object sender, EventArgs e) { (sender as ComboBox)?.MakeComboBoxSearchable(); } diff --git a/src/MaaWpfGui/Views/UserControl/FightSettingsUserControl.xaml b/src/MaaWpfGui/Views/UserControl/FightSettingsUserControl.xaml index cd46f59bc5..665f362827 100644 --- a/src/MaaWpfGui/Views/UserControl/FightSettingsUserControl.xaml +++ b/src/MaaWpfGui/Views/UserControl/FightSettingsUserControl.xaml @@ -124,7 +124,7 @@ IsEditable="True" IsTextSearchEnabled="False" ItemsSource="{Binding DropsList}" - Loaded="{s:Action DropsListLoaded}" + Loaded="{s:Action MakeComboBoxSearchable}" SelectedValue="{Binding DropsItemId}" SelectedValuePath="Value" Text="{Binding DropsItemName}" /> diff --git a/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml b/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml index 4c77b460df..a0fab6b8bb 100644 --- a/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml +++ b/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml @@ -97,10 +97,13 @@ Foreground="{DynamicResource PrimaryTextBrush}" Text="{DynamicResource StartingCoreChar}" TextWrapping="Wrap" /> -