diff --git a/docs/战斗流程协议.md b/docs/战斗流程协议.md index b1f5887105..2cacb116c5 100644 --- a/docs/战斗流程协议.md +++ b/docs/战斗流程协议.md @@ -102,3 +102,8 @@ }, } ``` + +## 举例 + +[Sample](../resource/battle/test.json) +[GA-EX8 突袭作业](../resource/battle/GA-EX8-raid.json) diff --git a/docs/集成文档.md b/docs/集成文档.md index f8a5546d13..3a7986c8c3 100644 --- a/docs/集成文档.md +++ b/docs/集成文档.md @@ -143,6 +143,18 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p } ``` +- `Copilot` + 自动抄作业 + +```jsonc +{ + "stage_name": string, // 关卡名,需要与作业 JSON 中的 stage_name 字段相同。不支持运行期设置 + "filename": string // 作业 JSON 的文件路径,绝对、相对路径均可。不支持运行期设置 +} +``` + +作业 JSON请参考 [战斗流程协议](战斗流程协议.md) + ### `AsstSetTaskParams` #### 接口原型 diff --git a/resource/battle.json b/resource/battle.json deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 57f3ea30d9..49a5d82938 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -19,6 +19,7 @@ #include "InfrastTask.h" #include "RecruitTask.h" #include "RoguelikeTask.h" +#include "CopilotTask.h" #ifdef ASST_DEBUG #include "DebugTask.h" #endif @@ -107,6 +108,9 @@ asst::Assistant::TaskId asst::Assistant::append_task(const std::string& type, co else if (type == RoguelikeTask::TaskType) { ptr = std::make_shared(task_callback, (void*)this); } + else if (type == CopilotTask::TaskType) { + ptr = std::make_shared(task_callback, (void*)this); + } #ifdef ASST_DEBUG else if (type == DebugTask::TaskType) { ptr = std::make_shared(task_callback, (void*)this); diff --git a/src/MeoAssistant/CopilotTask.cpp b/src/MeoAssistant/CopilotTask.cpp new file mode 100644 index 0000000000..31c53e850b --- /dev/null +++ b/src/MeoAssistant/CopilotTask.cpp @@ -0,0 +1,25 @@ +#include "CopilotTask.h" + +#include "Resource.h" +#include "BattleProcessTask.h" + +asst::CopilotTask::CopilotTask(AsstCallback callback, void* callback_arg) + : PackageTask(callback, callback_arg, TaskType), + m_battle_task_ptr(std::make_shared(callback, callback_arg, TaskType)) +{ + m_subtasks.emplace_back(m_battle_task_ptr); +} + +bool asst::CopilotTask::set_params(const json::value& params) +{ + if (!params.contains("filename") || !params.at("filename").is_string() + || !params.contains("stage_name") || !params.at("stage_name").is_string()) { + return false; + } + std::string filename = params.at("filename").as_string(); + std::string stage_name = params.at("stage_name").as_string(); + + m_battle_task_ptr->set_stage_name(stage_name); + + return Resrc.battle().load(filename); +} diff --git a/src/MeoAssistant/CopilotTask.h b/src/MeoAssistant/CopilotTask.h new file mode 100644 index 0000000000..5c6e9d18aa --- /dev/null +++ b/src/MeoAssistant/CopilotTask.h @@ -0,0 +1,24 @@ +#pragma once +#include "PackageTask.h" + +#include + +namespace asst +{ + class BattleProcessTask; + + // 抄作业任务 + class CopilotTask final : public PackageTask + { + public: + CopilotTask(AsstCallback callback, void* callback_arg); + virtual ~CopilotTask() = default; + + virtual bool set_params(const json::value& params) override; + + static constexpr const char* TaskType = "Copilot"; + + private: + std::shared_ptr m_battle_task_ptr = nullptr; + }; +} diff --git a/src/MeoAssistant/MeoAssistant.vcxproj b/src/MeoAssistant/MeoAssistant.vcxproj index a697beb526..c4ff98ade2 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj +++ b/src/MeoAssistant/MeoAssistant.vcxproj @@ -28,6 +28,7 @@ + @@ -98,6 +99,7 @@ + diff --git a/src/MeoAssistant/MeoAssistant.vcxproj.filters b/src/MeoAssistant/MeoAssistant.vcxproj.filters index d8ffd000c2..519a303048 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj.filters +++ b/src/MeoAssistant/MeoAssistant.vcxproj.filters @@ -309,6 +309,9 @@ 头文件\Task\Sub + + 头文件\Task + @@ -515,6 +518,9 @@ 源文件\Task\Sub + + 源文件\Task + diff --git a/src/Python/asst.py b/src/Python/asst.py index 0813a7b192..414f4cf7d5 100644 --- a/src/Python/asst.py +++ b/src/Python/asst.py @@ -81,7 +81,7 @@ class Asst: :return: 任务 ID, 可用于 set_task_params 接口 """ - return Asst.__lib.AsstAppendTask(self.__ptr, type_name.encode('utf-8'), json.dumps(params).encode('utf-8')) + return Asst.__lib.AsstAppendTask(self.__ptr, type_name.encode('utf-8'), json.dumps(params, ensure_ascii=False).encode('utf-8')) def set_task_params(self, task_id: TaskId, params: JSON) -> bool: """ @@ -93,7 +93,7 @@ class Asst: :return: 是否成功 """ - return Asst.__lib.AsstSetTaskParams(self.__ptr, task_id, json.dumps(params).encode('utf-8')) + return Asst.__lib.AsstSetTaskParams(self.__ptr, task_id, json.dumps(params, ensure_ascii=False).encode('utf-8')) def start(self) -> bool: """ diff --git a/src/Python/sample.py b/src/Python/sample.py index 786b3db44b..4fadef7faa 100644 --- a/src/Python/sample.py +++ b/src/Python/sample.py @@ -35,6 +35,7 @@ if __name__ == "__main__": asst.append_task('StartUp') asst.append_task('Fight', { 'stage': 'LastBattle', + 'report_to_penguin': True, # 'penguin_id': '1234567' }) asst.append_task('Recruit', { @@ -55,6 +56,10 @@ if __name__ == "__main__": 'is_black_list': True }) asst.append_task('Award') + asst.append_task('Copilot', { + 'stage_name': '千层蛋糕', + 'filename': './GA-EX8-raid.json' + }) asst.start() diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index 9b1c77ca16..b317c0b853 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -90,11 +90,18 @@ int main(int argc, char** argv) //} //)"); - AsstAppendTask(ptr, "Debug", R"({})"); + //AsstAppendTask(ptr, "Debug", R"({})"); + + AsstAppendTask(ptr, "Copilot", R"( +{ + "stage_name": "千层蛋糕", + "filename": "./GA-EX8-raid.json" +} +)"); AsstStart(ptr); - getchar(); + std::ignore = getchar(); AsstStop(ptr); AsstDestroy(ptr);