Compare commits

...

9 Commits

Author SHA1 Message Date
Rbqwow
fb31cbf511 chore: fuck submodule
[skip changelog] [skip ci]
2025-07-24 22:39:49 +08:00
Rbqwow
0dbf8345e6 chore: test 2025-07-24 22:21:33 +08:00
Rbqwow
4c95b738e0 feat: 我不知道我在糊什么 2025-07-24 22:21:33 +08:00
Weiyou Wang
6f592771d8 feat: 给你做做样子 2025-07-24 22:21:32 +08:00
Weiyou Wang
e55fd4a093 fix: add [[maybe_unused]] attribute 2025-07-24 22:21:32 +08:00
Rbqwow
874632f926 chore: 屎 2025-07-24 22:21:32 +08:00
Weiyou Wang
ce68e802f1 style: nitpicking 2025-07-24 22:21:31 +08:00
YuHuanTin
55d7b7127f improve: github action compilation compatibility 2025-07-24 22:21:31 +08:00
YuHuanTin
6951b1e881 feature: provided some infomation to DGLab using callback 2025-07-24 22:21:24 +08:00
21 changed files with 567 additions and 184 deletions

View File

@@ -1,174 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EN/@EntryIndexedValue">EN</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KR/@EntryIndexedValue">KR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JP/@EntryIndexedValue">JP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GUI/@EntryIndexedValue">GUI</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SWMINIMIZE/@EntryIndexedValue">SWMINIMIZE</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=AP/@EntryIndexedValue">AP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=AP_002D/@EntryIndexedValue">AP-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=CA/@EntryIndexedValue">CA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=CA_002D/@EntryIndexedValue">CA-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=CE/@EntryIndexedValue">CE</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=CE_002D/@EntryIndexedValue">CE-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=EN/@EntryIndexedValue">EN</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=IS/@EntryIndexedValue">IS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=JP/@EntryIndexedValue">JP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=KR/@EntryIndexedValue">KR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=LD/@EntryIndexedValue">LD</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=LS/@EntryIndexedValue">LS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=LS_002D/@EntryIndexedValue">LS-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DA/@EntryIndexedValue">PR-A</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DA_002D/@EntryIndexedValue">PR-A-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DB/@EntryIndexedValue">PR-B</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DB_002D/@EntryIndexedValue">PR-B-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DC/@EntryIndexedValue">PR-C</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DC_002D/@EntryIndexedValue">PR-C-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DD/@EntryIndexedValue">PR-D</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=PR_002DD_002D/@EntryIndexedValue">PR-D-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=SK/@EntryIndexedValue">SK</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=SK_002D/@EntryIndexedValue">SK-</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=SSS/@EntryIndexedValue">SSS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=WSA/@EntryIndexedValue">WSA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=XYAZ/@EntryIndexedValue">XYAZ</s:String>
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=Github/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=_4E00_9375_8F2A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=_591C_95F4_6A21_5F0F/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acast/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acfend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acguad/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acpion/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acspec/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acsupo/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=advapi/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Aero/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Affero/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=aguard/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=amedic/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=amiya/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=apionr/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=arget/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Arknights/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=arkplanner/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=asnipe/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=autofill/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Bilibili/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Bluestacks/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=bsconsole/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ccast/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cdfend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cguard/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Chayn/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Chyan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cmedic/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Collapsal/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cpione/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=csnipe/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cspec/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=csuppo/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ctrler/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=desp/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=dnplayer/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ehem/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Epilog/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=esource/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Eyjafjalla/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Favourite/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=filetime/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=findstr/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=FLASHW/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=FLASHWINFO/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=foldartal/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Foldartals/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=framerate/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=furni/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Gacha/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Gavial/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Grandet/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Hotkey/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=hwnd/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Infrast/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Inited/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=iter/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=jsend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ldconsole/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ldplayer/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=LD_0027s/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=leidian/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Lolicon/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=lpwndpl/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ls_005B_0022sub/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=luestacks/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=maatouch/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=MAA_0027s/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=memuc/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Minitouch/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=mirrorc/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mirrorchyan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mizuki/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=mrfz/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mumu/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nahimic/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nemu/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Netease/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=netstat/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nonfriend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=notstationed/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=objstr/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=oper/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=opers/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Originite/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Originium/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=originiums/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Orundum/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Orundums/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=o_FF9Fv_FF9F/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pallas/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=pidl/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pormpt/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=powrprof/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ppidl/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Prts/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=pwfi/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=qmsg/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Raidian/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rcast/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rdfend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=removelist/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rguard/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rmean/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rmedic/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Roguelike/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rsnipe/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Sami/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Sarkaz/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Screencap/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=sctp/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=serilog/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Showminimized/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Shownormal/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Skland/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=specialaccess/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=spid/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=SSS/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=STGM/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Stormeye/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=strlen/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Stylet/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=subtask/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Suppressions/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Surtr/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=SWMINIMIZE/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=taskchain/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Todays/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=txwy/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ucrtbase/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=vmonitor/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Webhook/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=XYAZ/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Yahei/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=yituliu/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Yostar/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ZOOT/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0020_0020_0020wp_002ELength_0020/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0020_003D_0020stri/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@@ -6,6 +6,15 @@
#include <string>
#include <thread>
void ASST_CALL callback(AsstMsgId msg, const char* details_json, void* custom_arg)
{
if (msg == 2) {
return;
}
std::printf("%d: %s", msg, details_json);
}
int main([[maybe_unused]] int argc, char** argv)
{
const auto cur_path = std::filesystem::path(argv[0]).parent_path();
@@ -38,7 +47,7 @@ int main([[maybe_unused]] int argc, char** argv)
}
#endif
auto ptr = AsstCreate();
auto ptr = AsstCreateEx(callback, nullptr);
if (ptr == nullptr) {
std::cerr << "create failed" << std::endl;
return -1;
@@ -50,10 +59,11 @@ int main([[maybe_unused]] int argc, char** argv)
#endif
#ifndef ASST_DEBUG
AsstAsyncConnect(ptr, "adb", "127.0.0.1:5555", nullptr, true);
//AsstAsyncConnect(ptr, "adb", "127.0.0.1:5555", nullptr, true);
#else
AsstAsyncConnect(ptr, "adb", "127.0.0.1:5555", "DEBUG", true);
AsstAsyncConnect(ptr, R"("D:\\Program Files\\Netease\\MuMu\\nx_main\\adb.exe")", "127.0.0.1:5555", "", true);
#endif
AsstAsyncConnect(ptr, R"("D:\\Program Files\\Netease\\MuMu\\nx_main\\adb.exe")", "127.0.0.1:5555", "", true);
if (!AsstConnected(ptr)) {
std::cerr << "connect failed" << std::endl;
AsstDestroy(ptr);
@@ -65,7 +75,7 @@ int main([[maybe_unused]] int argc, char** argv)
#ifndef ASST_DEBUG
/* 详细参数可参考 docs / 集成文档.md */
AsstAppendTask(ptr, "StartUp", nullptr);
/*AsstAppendTask(ptr, "StartUp", nullptr);
AsstAppendTask(ptr, "Fight", R"(
{
@@ -120,20 +130,29 @@ int main([[maybe_unused]] int argc, char** argv)
"roles": "稳扎稳打",
"core_char": "维什戴尔"
}
)");
)");*/
#else
AsstAppendTask(ptr, "Debug", nullptr);
//AsstAppendTask(ptr, "Debug", nullptr);
#endif
AsstStart(ptr);
// AsstAppendTask(ptr, "Copilot", R"(
//{
// "filename": "D:\\MaaAssistantArknights\\resource\\copilot\\OF-1_credit_fight.json"
//})");
while (AsstRunning(ptr)) {
std::this_thread::yield();
bool stop = false;
while (!stop) {
AsstAppendTask(ptr, "DGLab", nullptr);
AsstStart(ptr);
while (AsstRunning(ptr)) {
std::this_thread::yield();
}
}
AsstStop(ptr);
AsstDestroy(ptr);
ptr = nullptr;

View File

@@ -14,6 +14,7 @@
#include "Task/Interface/CloseDownTask.h"
#include "Task/Interface/CopilotTask.h"
#include "Task/Interface/CustomTask.h"
#include "Task/Interface/DGLabTask.h"
#include "Task/Interface/DepotTask.h"
#include "Task/Interface/FightTask.h"
#include "Task/Interface/InfrastTask.h"
@@ -237,6 +238,7 @@ asst::Assistant::TaskId asst::Assistant::append_task(const std::string& type, co
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(DepotTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(OperBoxTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(ReclamationTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(DGLabTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(CustomTask)
#ifdef ASST_DEBUG
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(DebugTask)

View File

@@ -128,8 +128,10 @@
<ClInclude Include="Task\Infrast\InfrastProcessingTask.h" />
<ClInclude Include="Task\Infrast\InfrastTrainingTask.h" />
<ClInclude Include="Task\Interface\CustomTask.h" />
<ClInclude Include="Task\Interface\DGLabTask.h" />
<ClInclude Include="Task\Interface\VideoRecognitionTask.h" />
<ClInclude Include="Task\Interface\OperBoxTask.h" />
<ClInclude Include="Task\Miscellaneous\BattleSpyTask.h" />
<ClInclude Include="Task\Miscellaneous\ScreenshotTaskPlugin.h" />
<ClInclude Include="Task\Miscellaneous\OperBoxRecognitionTask.h" />
<ClInclude Include="Task\Miscellaneous\AccountSwitchTask.h" />
@@ -327,8 +329,10 @@
<ClCompile Include="Task\Fight\StageQueueMissionCompletedTaskPlugin.cpp" />
<ClCompile Include="Task\Infrast\InfrastProcessingTask.cpp" />
<ClCompile Include="Task\Infrast\InfrastTrainingTask.cpp" />
<ClCompile Include="Task\Interface\DGLabTask.cpp" />
<ClCompile Include="Task\Interface\VideoRecognitionTask.cpp" />
<ClCompile Include="Task\Interface\OperBoxTask.cpp" />
<ClCompile Include="Task\Miscellaneous\BattleSpyTask.cpp" />
<ClCompile Include="Task\Miscellaneous\ScreenshotTaskPlugin.cpp" />
<ClCompile Include="Task\Miscellaneous\OperBoxRecognitionTask.cpp" />
<ClCompile Include="Task\Miscellaneous\AccountSwitchTask.cpp" />

View File

@@ -1061,6 +1061,12 @@
<ClInclude Include="Vision\Miscellaneous\OperNameAnalyzer.h">
<Filter>Source\Vision\Miscellaneous</Filter>
</ClInclude>
<ClInclude Include="Task\Interface\DGLabTask.h">
<Filter>Source\Task\Interface</Filter>
</ClInclude>
<ClInclude Include="Task\Miscellaneous\BattleSpyTask.h">
<Filter>Source\Task\Miscellaneous</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Vision\VisionHelper.cpp">
@@ -1581,6 +1587,12 @@
<ClCompile Include="Vision\Miscellaneous\OperNameAnalyzer.cpp">
<Filter>Source\Vision\Miscellaneous</Filter>
</ClCompile>
<ClCompile Include="Task\Interface\DGLabTask.cpp">
<Filter>Source\Task\Interface</Filter>
</ClCompile>
<ClCompile Include="Task\Miscellaneous\BattleSpyTask.cpp">
<Filter>Source\Task\Miscellaneous</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Natvis Include="meojson.natvis" />

View File

@@ -0,0 +1,20 @@
#include "DGLabTask.h"
#include "Utils/Logger.hpp"
asst::DGLabTask::DGLabTask(const AsstCallback& callback, Assistant* inst) :
InterfaceTask(callback, inst, TaskType),
m_battle_spy_ptr(std::make_shared<BattleSpyTask>(callback, inst, TaskType))
{
LogTraceFunction;
m_subtasks.emplace_back(m_battle_spy_ptr);
}
bool asst::DGLabTask::set_params([[maybe_unused]] const json::value& params)
{
// 一直监视,直到战斗结束
m_battle_spy_ptr->set_wait_until_end(true);
return true;
}

View File

@@ -0,0 +1,20 @@
#pragma once
#include "Task/InterfaceTask.h"
#include <Task/Miscellaneous/BattleSpyTask.h>
namespace asst
{
class DGLabTask final : public InterfaceTask
{
public:
inline static constexpr std::string_view TaskType = "DGLab";
DGLabTask(const AsstCallback& callback, Assistant* inst);
virtual ~DGLabTask() override = default;
bool set_params(const json::value& params) override;
private:
std::shared_ptr<BattleSpyTask> m_battle_spy_ptr = nullptr;
};
}

View File

@@ -0,0 +1,318 @@
#include "BattleSpyTask.h"
#include "Utils/Ranges.hpp"
#include <chrono>
#include <future>
#include <thread>
#include "Utils/NoWarningCV.h"
#include "Config/GeneralConfig.h"
#include "Config/Miscellaneous/BattleDataConfig.h"
#include "Config/Miscellaneous/CopilotConfig.h"
#include "Config/Miscellaneous/TilePack.h"
#include "Config/TaskData.h"
#include "Controller/Controller.h"
#include "Task/ProcessTask.h"
#include "Utils/Algorithm.hpp"
#include "Utils/ImageIo.hpp"
#include "Utils/Logger.hpp"
#include "Vision/Battle/BattlefieldMatcher.h"
#include "Vision/Matcher.h"
#include "Vision/RegionOCRer.h"
#include <Vision/Miscellaneous/StageDropsImageAnalyzer.h>
#include <Vision/Battle/BattlefieldDetector.h>
#include <Vision/Battle/BattlefieldClassifier.h>
using namespace asst::battle;
using namespace asst::battle::copilot;
asst::BattleSpyTask::BattleSpyTask(const AsstCallback& callback, Assistant* inst, std::string_view task_chain) :
AbstractTask(callback, inst, task_chain),
BattleHelper(inst)
{
}
bool asst::BattleSpyTask::_run()
{
LogTraceFunction;
json::value info = basic_info_with_what("DGLabMsg");
auto& details = info["details"];
details["Msg"] = "进入 asst::BattleSpyTask::_run() 了";
callback(AsstMsg::SubTaskExtraInfo, info);
clear();
// TODO, 识别关卡名
/*if (!calc_tiles_info(m_stage_name)) {
Log.error("get stage info failed");
json::value error_info = basic_info_with_what("GetStageInfoFailed");
callback(AsstMsg::SubTaskError, error_info);
return false;
}*/
if (!update_deployment(true)) {
Log.error("update deployment failed");
json::value error_info = basic_info_with_what("UpdateDeploymentFailed");
details["Msg"] = "update deployment failed";
callback(AsstMsg::SubTaskError, error_info);
return false;
}
if (!to_group()) {
Log.error("to_group failed");
json::value error_info = basic_info_with_what("ToGroupFailed");
details["Msg"] = "to_group failed";
callback(AsstMsg::SubTaskError, error_info);
return false;
}
while (need_to_wait_until_end() && check_in_battle() && update_deployment() && update_kills(ctrler()->get_image())) {
// TODO: 分析技能准备情况
//cv::Mat image = ctrler()->get_image();
//BattlefieldDetector analyzer(image);
//analyzer.set_object_of_interest({ .operators = true });
//auto result_opt = analyzer.analyze();
//for (auto& it : result_opt->operators) {
// auto f = image(
// cv::Rect(it.rect.x, it.rect.y + static_cast<int>(image.rows * -0.2), it.rect.width, it.rect.height + static_cast<int>(image.rows * 0.17)));
// cv::imshow("test1", f);
// cv::waitKey(0);
// auto ready = is_skill_ready(f);
// printf("%d", ready);
//}
//cv::imshow("test", analyzer.get_draw());
//cv::waitKey(0);
// 获取携带干员
auto names =
m_cur_deployment_opers | std::views::transform([](const DeploymentOper& user) { return user.name; });
json::value value;
value["deployment"] = std::vector<std::string> { names.begin(), names.end() };
value["kills"] = m_kills;
notify_action(value);
}
int maxTry = 5;
for (int i = 0; i < maxTry; i++) {
sleep(2000);
StageDropsImageAnalyzer analyzer(ctrler()->get_image());
// 大概率失败
// 也有可能是因为匹配到一些关卡,然后输出 `_INVALID_`,见 `StageDrops-StageName`
if (analyzer.analyze()) {
auto&& [code, difficulty] = analyzer.get_stage_key();
std::string stage_code = std::move(code);
ranges::transform(stage_code, stage_code.begin(), [](char ch) -> char {
return static_cast<char>(::toupper(ch));
});
Log.info(__FUNCTION__, "Stage Code:", stage_code, "Stars:", analyzer.get_stars());
json::value stage_info = basic_info_with_what("StageAnalysisCompleted");
auto& stage_details = stage_info["details"];
stage_details["stage_code"] = stage_code;
stage_details["stars"] = analyzer.get_stars();
stage_details["difficulty"] = difficulty;
int stars = analyzer.get_stars();
details["Msg"] = stage_code + ", " + std::to_string(stars) + ", " + enum_to_string(difficulty);
callback(AsstMsg::SubTaskExtraInfo, stage_info);
break;
}
else {
// 几星完成作战?
int star = analyzer.get_stars();
auto&& [code, difficulty] = analyzer.get_stage_key();
// 识别出内容就退出
if (!code.empty()) {
notify_action({ { "star", star }, { "difficulty", difficulty } });
break;
}
if (i == maxTry - 1) {
Log.warn(__FUNCTION__, "Failed to analyze stage after", maxTry, "attempts");
json::value warn_info = basic_info_with_what("StageAnalysisFailed");
auto& warn_details = warn_info["details"];
warn_details["attempts"] = maxTry;
details["Msg"] = "__FUNCTION__, Failed to analyze stage after " + std::to_string(maxTry) + " attempts";
callback(AsstMsg::SubTaskExtraInfo, warn_info);
}
}
}
json::value completion_info = basic_info_with_what("BattleSpyTaskCompleted");
callback(AsstMsg::SubTaskExtraInfo, completion_info);
return true;
}
void asst::BattleSpyTask::clear()
{
BattleHelper::clear();
m_oper_in_group.clear();
m_in_bullet_time = false;
json::value clear_info = basic_info_with_what("BattleSpyTaskCleared");
auto& details = clear_info["details"];
details["Msg"] = "BattleSpyTask cleared";
callback(AsstMsg::SubTaskExtraInfo, clear_info);
}
bool asst::BattleSpyTask::set_stage_name(const std::string& stage_name)
{
LogTraceFunction;
if (!BattleHelper::set_stage_name(stage_name)) {
json::value info = basic_info_with_what("UnsupportedLevel");
auto& details = info["details"];
details["level"] = stage_name;
callback(AsstMsg::SubTaskExtraInfo, info);
return false;
}
m_combat_data = Copilot.get_data();
json::value stage_set_info = basic_info_with_what("StageNameSet");
auto& stage_set_details = stage_set_info["details"];
stage_set_details["stage_name"] = stage_name;
auto& details = stage_set_info["details"];
details["Msg"] = "Stage name set to " + stage_name;
callback(AsstMsg::SubTaskExtraInfo, stage_set_info);
return true;
}
void asst::BattleSpyTask::set_wait_until_end(bool wait_until_end)
{
m_need_to_wait_until_end = wait_until_end;
}
void
asst::BattleSpyTask::set_formation_task_ptr(std::shared_ptr<std::unordered_map<std::string, std::string>> value)
{
m_formation_ptr = value;
}
bool asst::BattleSpyTask::to_group()
{
std::unordered_map<std::string, std::vector<std::string>> groups;
// 从编队任务中获取<干员-组名>映射
if (m_formation_ptr != nullptr) {
for (const auto& [group, oper] : *m_formation_ptr) {
groups.emplace(oper, std::vector<std::string> { group });
}
}
// 补充剩余的干员
for (const auto& [group_name, oper_list] : get_combat_data().groups) {
if (groups.contains(group_name)) {
continue;
}
std::vector<std::string> oper_name_list;
ranges::transform(oper_list, std::back_inserter(oper_name_list), [](const auto& oper) { return oper.name; });
groups.emplace(group_name, std::move(oper_name_list));
}
std::unordered_set<std::string> char_set; // 干员集合
for (const auto& oper : m_cur_deployment_opers) {
char_set.emplace(oper.name);
}
auto result_opt = algorithm::get_char_allocation_for_each_group(groups, char_set);
if (result_opt) {
m_oper_in_group = *result_opt;
}
else {
Log.warn("get_char_allocation_for_each_group failed");
json::value warn_info = basic_info_with_what("CharAllocationFailed");
auto& details = warn_info["details"];
details["Msg"] = "get_char_allocation_for_each_group failed";
callback(AsstMsg::SubTaskExtraInfo, warn_info);
for (const auto& [gp, names] : groups) {
if (names.empty()) {
continue;
}
m_oper_in_group.emplace(gp, names.front());
}
}
std::unordered_map<std::string, std::string> ungrouped;
const auto& grouped_view = m_oper_in_group | views::values;
for (const auto& name : char_set) {
if (ranges::find(grouped_view, name) != grouped_view.end()) {
continue;
}
ungrouped.emplace(name, name);
}
m_oper_in_group.merge(ungrouped);
for (const auto& action : m_combat_data.actions) {
const std::string& action_name = action.name;
if (action_name.empty() || m_oper_in_group.contains(action_name)) {
continue;
}
m_oper_in_group.emplace(action_name, action_name);
}
for (const auto& [group_name, oper_name] : m_oper_in_group) {
const auto& group_it = ranges::find_if(get_combat_data().groups, [&](const OperUsageGroup& pair) {
return pair.first == group_name;
});
if (group_it == get_combat_data().groups.end()) {
Log.warn(__FUNCTION__, "Group not found in combat data: ", group_name);
json::value warn_info = basic_info_with_what("GroupNotFoundInCombatData");
auto& group_details = warn_info["details"];
group_details["group_name"] = group_name;
auto& details = warn_info["details"];
details["Msg"] = "Group not found in combat data: " + group_name;
callback(AsstMsg::SubTaskExtraInfo, warn_info);
continue;
}
const auto& this_group = group_it->second;
// there is a build error on macOS
// https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/3779762713/jobs/6425284487
const std::string& oper_name_for_lambda = oper_name;
auto iter = ranges::find_if(this_group, [&](const auto& oper) { return oper.name == oper_name_for_lambda; });
if (iter == this_group.end()) {
continue;
}
m_skill_usage.emplace(oper_name, iter->skill_usage);
m_skill_times.emplace(oper_name, iter->skill_times);
}
return true;
}
void asst::BattleSpyTask::notify_action(const json::value& value)
{
json::value info = basic_info_with_what("BattleSpyTask");
info["details"] = value;
callback(AsstMsg::SubTaskExtraInfo, info);
}
bool asst::BattleSpyTask::is_skill_ready(const cv::Mat& imageRect)
{
BattlefieldClassifier skill_analyzer(imageRect);
skill_analyzer.set_object_of_interest({ .skill_ready = true });
//const Point& battlefield_point = target_iter->second.pos;
skill_analyzer.set_base_point({0,0});
auto result = skill_analyzer.analyze();
if (!result) {
Log.warn(__FUNCTION__, "Failed to analyze skill readiness");
json::value warn_info = basic_info_with_what("SkillAnalysisFailed");
auto& details = warn_info["details"];
details["Msg"] = "Failed to analyze skill readiness";
callback(AsstMsg::SubTaskExtraInfo, warn_info);
return false;
}
return result->skill_ready.ready;
}

View File

@@ -0,0 +1,50 @@
#pragma once
#include "Task/AbstractTask.h"
#include "Task/BattleHelper.h"
#include "Common/AsstBattleDef.h"
#include "Common/AsstTypes.h"
#include "Config/Miscellaneous/TilePack.h"
namespace asst
{
class BattleSpyTask : public AbstractTask, public BattleHelper
{
public:
BattleSpyTask(const AsstCallback& callback, Assistant* inst, std::string_view task_chain);
virtual ~BattleSpyTask() override = default;
virtual bool set_stage_name(const std::string& stage_name) override;
void set_wait_until_end(bool wait_until_end);
void set_formation_task_ptr(std::shared_ptr<std::unordered_map<std::string, std::string>> value);
protected:
virtual bool _run() override;
virtual AbstractTask& this_task() override { return *this; }
virtual void clear() override;
virtual bool
do_derived_action([[maybe_unused]] const battle::copilot::Action& action, [[maybe_unused]] size_t index)
{
return false;
}
virtual battle::copilot::CombatData& get_combat_data() { return m_combat_data; }
virtual bool need_to_wait_until_end() const { return m_need_to_wait_until_end; }
bool to_group();
void notify_action(const json::value& value);
bool is_skill_ready(const cv::Mat& imageRect);
battle::copilot::CombatData m_combat_data;
std::unordered_map</*group*/ std::string, /*oper*/ std::string> m_oper_in_group;
bool m_in_bullet_time = false;
bool m_need_to_wait_until_end = false;
std::shared_ptr<std::unordered_map<std::string, std::string>> m_formation_ptr = nullptr;
};
}

View File

@@ -320,6 +320,8 @@ namespace MaaWpfGui.Constants
public const string DebugTaskName = "Debug.TaskName";
public const string DGLabTaskName = "DGLab.TaskName";
public const string MiniGameTaskName = "MiniGame.TaskName";
public const string AchievementBubbleAutoClose = "Achievement.BubbleAutoClose";

View File

@@ -1914,6 +1914,9 @@ namespace MaaWpfGui.Main
case "StageQueueMissionCompleted":
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetString("StageQueue") + $" {subTaskDetails!["stage_code"]} - {subTaskDetails["stars"]} ★", UiLogColor.Info);
break;
case "DGLabMsg":
Instances.TaskQueueViewModel.AddLog($"{subTaskDetails!["Msg"]}", UiLogColor.Info);
break;
}
}
@@ -2191,6 +2194,7 @@ namespace MaaWpfGui.Main
Reclamation,
MiniGame,
Custom,
DGLab,
}
private readonly HashSet<TaskType> _mainTaskTypes =
@@ -2205,6 +2209,7 @@ namespace MaaWpfGui.Main
TaskType.Award,
TaskType.Roguelike,
TaskType.Reclamation,
TaskType.DGLab,
];
private readonly ObservableDictionary<AsstTaskId, (TaskType Type, TaskStatus Status)> _tasksStatus = [];
@@ -2240,6 +2245,12 @@ namespace MaaWpfGui.Main
return false;
}
public bool AsstAppendDGLab()
{
return AsstAppendTaskWithEncoding(TaskType.DGLab, AsstTaskType.DGLab) && AsstStart();
}
public bool AsstAppendCloseDown(string clientType)
{
if (!AsstStop())
@@ -2410,6 +2421,11 @@ namespace MaaWpfGui.Main
{
MaaService.AsstDestroy(_handle);
}
public bool AsstDGLab()
{
return MaaService.AsstDGLab(_handle);
}
}
/// <summary>

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MaaWpfGui.Models.AsstTasks;
using MaaWpfGui.Services;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MaaWpfGui.Models.AsstTasks;
public class AsstDGLabTask : AsstBaseTask
{
public override AsstTaskType TaskType => AsstTaskType.DGLab;
public override (AsstTaskType TaskType, JObject Params) Serialize() => (TaskType, JObject.FromObject(this));
}

View File

@@ -541,6 +541,7 @@ The primary instance is 0, and other instances are the numbers after the version
<system:String x:Key="Reclamation">Reclamation Algorithm</system:String>
<system:String x:Key="MiniGame">Mini-Games</system:String>
<system:String x:Key="Custom">Custom Task</system:String>
<system:String x:Key="DGLab">DG-Lab</system:String>
<system:String x:Key="SingleStep">Single-Step Task</system:String>
<system:String x:Key="ReclamationTheme">Reclamation Algorithm Theme</system:String>
<system:String x:Key="ReclamationThemeFire">Fire Within the Sand</system:String>

View File

@@ -542,6 +542,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="Reclamation">生息演算</system:String>
<system:String x:Key="MiniGame">ミニゲーム</system:String>
<system:String x:Key="Custom">カスタムタスク</system:String>
<system:String x:Key="DGLab">DG-Lab</system:String>
<system:String x:Key="SingleStep">単一ステップタスク</system:String>
<system:String x:Key="ReclamationTheme">主題</system:String>
<system:String x:Key="ReclamationThemeFire">砂中の火</system:String>

View File

@@ -541,6 +541,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="Reclamation">생존연산</system:String>
<system:String x:Key="MiniGame">미니게임</system:String>
<system:String x:Key="Custom">사용자 정의 작업</system:String>
<system:String x:Key="DGLab">DG-Lab</system:String>
<system:String x:Key="SingleStep">단일 단계 작업</system:String>
<system:String x:Key="ReclamationTheme">생존연산 테마</system:String>
<system:String x:Key="ReclamationThemeFire">모래 속의 불</system:String>

View File

@@ -541,6 +541,7 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="Reclamation">生息演算</system:String>
<system:String x:Key="MiniGame">小游戏</system:String>
<system:String x:Key="Custom">自定义任务</system:String>
<system:String x:Key="DGLab">DG-Lab</system:String>
<system:String x:Key="SingleStep">单步任务</system:String>
<system:String x:Key="ReclamationTheme">生息演算主题</system:String>
<system:String x:Key="ReclamationThemeFire">沙中之火</system:String>

View File

@@ -539,6 +539,7 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="Reclamation">生息演算</system:String>
<system:String x:Key="MiniGame">小遊戲</system:String>
<system:String x:Key="Custom">自訂任務</system:String>
<system:String x:Key="DGLab">DG-Lab</system:String>
<system:String x:Key="SingleStep">單步任務</system:String>
<system:String x:Key="ReclamationTheme">生息演算主題</system:String>
<system:String x:Key="ReclamationThemeFire">沙中之火</system:String>

View File

@@ -80,6 +80,9 @@ namespace MaaWpfGui.Services
[DllImport("MaaCore.dll")]
public static extern unsafe void AsstSetConnectionExtras(byte* name, byte* extras);
[DllImport("MaaCore.dll")]
public static extern bool AsstDGLab(AsstHandle handle);
}
public enum AsstTaskType : byte
@@ -163,5 +166,10 @@ namespace MaaWpfGui.Services
/// 自定义任务
/// </summary>
Custom,
/// <summary>
/// DGLab
/// </summary>
DGLab,
}
}

View File

@@ -678,6 +678,10 @@ namespace MaaWpfGui.Services.RemoteControl
taskRet &= Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.Reclamation, ReclamationSettingsUserControlModel.Instance.Serialize());
break;
case "DGLab":
taskRet &= Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.DGLab, DGLabSettingsUserControlModel.Instance.Serialize());
break;
default:
--count;

View File

@@ -128,6 +128,8 @@ namespace MaaWpfGui.ViewModels.UI
/// </summary>
public static CustomSettingsUserControlModel CustomTask => CustomSettingsUserControlModel.Instance;
public static DGLabSettingsUserControlModel DGLabTask => DGLabSettingsUserControlModel.Instance;
#endregion Model
private static readonly IEnumerable<TaskViewModel> _taskViewModelTypes = InitTaskViewModelList();
@@ -701,6 +703,7 @@ namespace MaaWpfGui.ViewModels.UI
if (Instances.VersionUpdateViewModel.IsDebugVersion() || File.Exists("DEBUG") || File.Exists("DEBUG.txt"))
{
taskList.Add("Custom");
taskList.Add("DGLab");
}
var tempOrderList = new List<DragItemViewModel?>(new DragItemViewModel[taskList.Count]);
@@ -1420,6 +1423,13 @@ namespace MaaWpfGui.ViewModels.UI
break;
}
case "DGLab":
if (Instances.VersionUpdateViewModel.IsDebugVersion() || File.Exists("DEBUG") || File.Exists("DEBUG.txt"))
{
taskRet &= Instances.AsstProxy.AsstAppendTaskWithEncoding(TaskType.DGLab, DGLabTask.Serialize());
}
break;
default:
--count;
_logger.Error("Unknown task: " + item.OriginalName);

View File

@@ -0,0 +1,50 @@
// <copyright file="TaskQueueViewModel.cs" company="MaaAssistantArknights">
// Part of the MaaWpfGui project, maintained by the MaaAssistantArknights team (Maa Team)
// Copyright (C) 2021-2025 MaaAssistantArknights Contributors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License v3.0 only as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using MaaWpfGui.Constants;
using MaaWpfGui.Helper;
using MaaWpfGui.Models.AsstTasks;
using MaaWpfGui.Services;
using Newtonsoft.Json.Linq;
namespace MaaWpfGui.ViewModels.UserControl.TaskQueue;
public class DGLabSettingsUserControlModel : TaskViewModel
{
static DGLabSettingsUserControlModel()
{
Instance = new();
}
public static DGLabSettingsUserControlModel Instance { get; }
private string _taskName = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.DGLabTaskName, string.Empty);
public string TaskName
{
get => _taskName;
set
{
value = value.Replace("", ",").Replace("", ";");
SetAndNotify(ref _taskName, value);
}
}
public override (AsstTaskType Type, JObject Params) Serialize()
{
var task = new AsstDGLabTask();
return task.Serialize();
}
}