This commit is contained in:
Lancarus
2023-08-19 21:05:46 +08:00
9 changed files with 146 additions and 43 deletions

View File

@@ -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的筛选之前可能出现高优先级商品被筛掉什么都不买的情况

View File

@@ -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"
]
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -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<CombinedData>
{
@@ -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<string> _roguelikeCoreCharList = new ObservableCollection<string>();
/// <summary>
/// Gets or sets the roguelike core character.
/// </summary>
public ObservableCollection<string> RoguelikeCoreCharList
{
get => _roguelikeCoreCharList;
set => SetAndNotify(ref _roguelikeCoreCharList, value);
}
private string _roguelikeUseSupportUnit = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeUseSupportUnit, false.ToString());
/// <summary>
@@ -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<string>();
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
/// <summary>
/// Make comboBox searchable
/// </summary>
/// <param name="sender">Event sender</param>
/// <param name="e">Event args</param>
// 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();
}
}
}

View File

@@ -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
}
/// <summary>
/// DropsList ComboBox loaded
/// Make comboBox searchable
/// </summary>
/// <param name="sender">Event sender</param>
/// <param name="e">Event args</param>
@@ -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();
}

View File

@@ -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}" />

View File

@@ -97,10 +97,13 @@
Foreground="{DynamicResource PrimaryTextBrush}"
Text="{DynamicResource StartingCoreChar}"
TextWrapping="Wrap" />
<hc:TextBox
<ComboBox
Margin="0,5"
IsEditable="True"
IsTextSearchEnabled="False"
ItemsSource="{Binding RoguelikeCoreCharList}"
Loaded="{s:Action MakeComboBoxSearchable}"
Text="{Binding RoguelikeCoreChar}"
TextWrapping="Wrap"
ToolTip="{DynamicResource StartingCoreCharTip}" />
<CheckBox Margin="0,10" IsChecked="{Binding RoguelikeUseSupportUnit}">
<TextBlock