mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-17 10:00:44 +08:00
feat: 隐秘战线支持系列任务 (#15249)
* feat: 隐秘战线支持系列事件 * fix: 漏了个事件 * fix: 避免修改任务导致后续无法进入系列任务 * fix: 怎么小游戏没禁用运行时修改 * rft: 提取通用逻辑 * i18n: KR * i18n: EN * i18n: KR fix typo * i18n: JP * i18n: txwy * perf: 优化解析逻辑 * fix: 隐秘战线结局与事件无法保存 * chore: text → ocrReplace * chore: 再改一點 gui 上的東西 --------- Co-authored-by: HX3N <scarlet7518@gmail.com> Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com> Co-authored-by: Manicsteiner <Manicsteiner@outlook.com> Co-authored-by: momomochi987 <as99us301@gmail.com>
This commit is contained in:
@@ -30,18 +30,96 @@ bool asst::CustomTask::set_params(const json::value& params)
|
||||
Log.error("set_params failed, task is not string");
|
||||
return false;
|
||||
}
|
||||
if (Task.get(t.as_string()) == nullptr) {
|
||||
Log.error("set_params failed, task not found: ", t.as_string());
|
||||
|
||||
std::string task_name = t.as_string();
|
||||
std::string resolved_task = task_name;
|
||||
|
||||
if (parse_and_register_secretfront(task_name, resolved_task)) {
|
||||
Log.info("Parsed and registered SecretFront task: ", task_name, " -> ", resolved_task);
|
||||
}
|
||||
/* else if (parse_and_register_xxx) */
|
||||
else {
|
||||
resolved_task = task_name;
|
||||
}
|
||||
|
||||
if (Task.get(resolved_task) == nullptr) {
|
||||
Log.error("set_params failed, task not found: ", resolved_task);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (t.as_string().starts_with("MiniGame@SecretFront@")) {
|
||||
m_custom_task_ptr->register_plugin<SecretFrontTaskPlugin>();
|
||||
}
|
||||
|
||||
tasks.emplace_back(t.as_string());
|
||||
tasks.emplace_back(std::move(resolved_task));
|
||||
}
|
||||
m_custom_task_ptr->set_tasks(std::move(tasks));
|
||||
m_subtasks.emplace_back(m_custom_task_ptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool asst::CustomTask::parse_and_register_secretfront(const std::string& task_name, std::string& resolved_task)
|
||||
{
|
||||
if (!task_name.starts_with("MiniGame@SecretFront@Begin")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::optional<std::string> event_name;
|
||||
std::optional<std::string> ending_token;
|
||||
|
||||
// 允许识别形式:MiniGame@SecretFront@Begin@Ending[ABCDE]@[事件名]
|
||||
size_t start = strlen("MiniGame@SecretFront@Begin");
|
||||
if (start < task_name.size() && task_name[start] == '@') {
|
||||
++start; // skip the separator '@'
|
||||
}
|
||||
|
||||
// 提取 Ending token(直到下一个 '@' 或末尾)
|
||||
size_t next_at = task_name.find('@', start);
|
||||
std::string ending;
|
||||
if (start < task_name.size()) {
|
||||
if (next_at == std::string::npos) {
|
||||
ending = task_name.substr(start);
|
||||
}
|
||||
else {
|
||||
ending = task_name.substr(start, next_at - start);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ending.empty()) {
|
||||
ending_token = ending;
|
||||
}
|
||||
|
||||
// 如果存在第二个 '@' 分隔,后续内容视为事件名(直到末尾)
|
||||
if (next_at != std::string::npos && next_at + 1 < task_name.size()) {
|
||||
event_name = task_name.substr(next_at + 1);
|
||||
}
|
||||
|
||||
auto plugin_ptr = m_custom_task_ptr->register_plugin<SecretFrontTaskPlugin>();
|
||||
if (!plugin_ptr) {
|
||||
Log.error("Failed to register SecretFrontTaskPlugin");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (event_name && !event_name->empty()) {
|
||||
plugin_ptr->set_event_name(*event_name);
|
||||
Log.info("Set SecretFront event name:", *event_name);
|
||||
}
|
||||
if (ending_token && !ending_token->empty()) {
|
||||
if (*ending_token == "EndingA") {
|
||||
plugin_ptr->set_ending(SecretFrontTaskPlugin::Ending::A);
|
||||
}
|
||||
else if (*ending_token == "EndingB") {
|
||||
plugin_ptr->set_ending(SecretFrontTaskPlugin::Ending::B);
|
||||
}
|
||||
else if (*ending_token == "EndingC") {
|
||||
plugin_ptr->set_ending(SecretFrontTaskPlugin::Ending::C);
|
||||
}
|
||||
else if (*ending_token == "EndingD") {
|
||||
plugin_ptr->set_ending(SecretFrontTaskPlugin::Ending::D);
|
||||
}
|
||||
else if (*ending_token == "EndingE") {
|
||||
plugin_ptr->set_ending(SecretFrontTaskPlugin::Ending::E);
|
||||
}
|
||||
Log.info("Set SecretFront ending:", *ending_token);
|
||||
}
|
||||
|
||||
resolved_task = "MiniGame@SecretFront@Begin";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user