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:
uye
2026-01-02 00:15:30 +08:00
committed by GitHub
parent 9395bc3094
commit 52363f2e9e
18 changed files with 324 additions and 119 deletions

View File

@@ -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;
}