diff --git a/docs/战斗流程协议.md b/docs/战斗流程协议.md index f69ec536a8..1ea8bf2684 100644 --- a/docs/战斗流程协议.md +++ b/docs/战斗流程协议.md @@ -51,13 +51,15 @@ "actions": [ // 战斗中的操作。有序,执行完前一个才会去执行下一个。必选 { "type": "部署", // 操作类型,可选,默认 "Deploy" - // "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" - // "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" + // "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Ouput" | "SkillDaemon" + // "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机" // 中英文皆可,效果相同 // 若为 "部署", 当费用不够时,会一直等待到费用够(除非 timeout) // 若为 "技能", 当技能 cd 没转好时,一直等待到技能 cd 好(除非 timeout) // "二倍速" 是可切换的,即使用一次变成二倍速,再次使用又变回一倍速 // "子弹时间" 即点击任意干员后的 1/5 速度,再进行任意 action 会恢复正常速度 + // "打印" 界面不显示这条步骤,仅用于输出 doc 里的内容(用来做字幕之类的) + // "摆完挂机" 仅使用 "好了就用" 的技能,其他什么都不做,直到战斗结束 "kills": 0, // 击杀数条件,如果没达到就一直等待。可选,默认为 0,直接执行 diff --git a/src/MeoAssistant/AsstBattleDef.h b/src/MeoAssistant/AsstBattleDef.h index d7be21d1af..88af5c5bd6 100644 --- a/src/MeoAssistant/AsstBattleDef.h +++ b/src/MeoAssistant/AsstBattleDef.h @@ -48,7 +48,9 @@ namespace asst SkillUsage, // 技能用法 SwitchSpeed, // 切换二倍速 BulletTime, // 使用 1/5 的速度(点击任意干员),会在下一个任意操作后恢复原速度 - UseAllSkill // 使用所有技能,仅肉鸽模式 + UseAllSkill, // 使用所有技能,仅肉鸽模式 + Output, // 仅输出,什么都不操作,界面上也不显示 + SkillDaemon, // 什么都不做,有技能开技能,直到战斗结束 }; struct BattleAction // 操作 diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index 57e5c79fc3..846dab9ea8 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -317,6 +317,12 @@ bool asst::BattleProcessTask::do_action(const BattleAction& action) case BattleActionType::SwitchSpeed: action_desc = "切换二倍速"; break; + case BattleActionType::SkillDaemon: + action_desc = "摆完挂机"; + break; + case BattleActionType::BulletTime: + action_desc = "子弹时间"; + break; } details["action"] = action_desc; details["doc"] = action.doc; @@ -347,14 +353,21 @@ bool asst::BattleProcessTask::do_action(const BattleAction& action) ret = battle_speedup(); break; case BattleActionType::BulletTime: + // TODO break; case BattleActionType::SkillUsage: { auto& oper_info = m_group_to_oper_mapping[action.group_name]; oper_info.skill_usage = action.modify_usage; m_used_opers[oper_info.name].info.skill_usage = action.modify_usage; - return true; + ret = true; } break; + case BattleActionType::Output: + // DoNothing + break; + case BattleActionType::SkillDaemon: + ret = wait_to_end(action); + break; } sleep_with_possible_skill(action.rear_delay); @@ -551,6 +564,25 @@ bool asst::BattleProcessTask::use_skill(const BattleAction& action) .run(); } +bool asst::BattleProcessTask::wait_to_end(const BattleAction& action) +{ + std::ignore = action; + + MatchImageAnalyzer officially_begin_analyzer; + officially_begin_analyzer.set_task_info("BattleOfficiallyBegin"); + cv::Mat image; + while (!need_exit()) { + image = m_ctrler->get_image(); + officially_begin_analyzer.set_image(image); + if (!officially_begin_analyzer.analyze()) { + break; + } + try_possible_skill(image); + std::this_thread::yield(); + } + return true; +} + bool asst::BattleProcessTask::try_possible_skill(const cv::Mat& image) { auto task_ptr = Task.get("BattleAutoSkillFlag"); diff --git a/src/MeoAssistant/BattleProcessTask.h b/src/MeoAssistant/BattleProcessTask.h index 3dfffa4166..4b4ea54615 100644 --- a/src/MeoAssistant/BattleProcessTask.h +++ b/src/MeoAssistant/BattleProcessTask.h @@ -31,6 +31,7 @@ namespace asst bool oper_deploy(const BattleAction& action); bool oper_retreat(const BattleAction& action); bool use_skill(const BattleAction& action); + bool wait_to_end(const BattleAction& action); bool try_possible_skill(const cv::Mat& image); void sleep_with_possible_skill(unsigned millisecond); diff --git a/src/MeoAssistant/CopilotConfiger.cpp b/src/MeoAssistant/CopilotConfiger.cpp index c95a04bd47..11760dbce9 100644 --- a/src/MeoAssistant/CopilotConfiger.cpp +++ b/src/MeoAssistant/CopilotConfiger.cpp @@ -67,17 +67,31 @@ bool asst::CopilotConfiger::parse(const json::value& json) { "speedup", BattleActionType::SwitchSpeed }, { "二倍速", BattleActionType::SwitchSpeed }, - { "BulletTime", BattleActionType::SwitchSpeed }, - { "BULLETTIME", BattleActionType::SwitchSpeed }, - { "Bullettime", BattleActionType::SwitchSpeed }, - { "bullettime", BattleActionType::SwitchSpeed }, - { "子弹时间", BattleActionType::SwitchSpeed }, + { "BulletTime", BattleActionType::BulletTime }, + { "BULLETTIME", BattleActionType::BulletTime }, + { "Bullettime", BattleActionType::BulletTime }, + { "bullettime", BattleActionType::BulletTime }, + { "子弹时间", BattleActionType::BulletTime }, { "SkillUsage", BattleActionType::SkillUsage }, { "SKILLUSAGE", BattleActionType::SkillUsage }, { "Skillusage", BattleActionType::SkillUsage }, { "skillusage", BattleActionType::SkillUsage }, { "技能用法", BattleActionType::SkillUsage }, + + { "Output", BattleActionType::Output }, + { "OUTPUT", BattleActionType::Output }, + { "output", BattleActionType::Output }, + { "输出", BattleActionType::Output }, + { "打印", BattleActionType::Output }, + + { "SkillDaemon", BattleActionType::SkillDaemon }, + { "skilldaemon", BattleActionType::SkillDaemon }, + { "SKILLDAEMON", BattleActionType::SkillDaemon }, + { "Skilldaemon", BattleActionType::SkillDaemon }, + { "DoNothing", BattleActionType::SkillDaemon }, + { "摆完挂机", BattleActionType::SkillDaemon }, + { "开摆", BattleActionType::SkillDaemon }, }; std::string type_str = action_info.get("type", "Deploy"); diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index be66e72870..e3d3fb4cef 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -250,6 +250,7 @@ namespace MeoAsstGui { toast.Show(); } + copilotModel.Idle = true; mainModel.CheckAndShutdown(); break; } @@ -594,7 +595,11 @@ namespace MeoAsstGui string color = subTaskDetails["doc_color"].ToString(); copilotModel.AddLog(doc, color.Length == 0 ? "dark" : color); } - copilotModel.AddLog("当前步骤:" + subTaskDetails["action"].ToString()); + var action = subTaskDetails["action"].ToString(); + if (action.Length != 0) + { + copilotModel.AddLog("当前步骤:" + action); + } } break; diff --git a/tools/CopilotDesinger/CopilotDesinger.py b/tools/CopilotDesinger/CopilotDesinger.py index 7c9a7c1e70..ba41c92ed2 100644 --- a/tools/CopilotDesinger/CopilotDesinger.py +++ b/tools/CopilotDesinger/CopilotDesinger.py @@ -18,6 +18,8 @@ class ActionType: SpeedUp = "二倍速" BulletTime = "子弹时间" SkillUsage = "技能用法" + SkillDaemon = "摆完挂机" + Output = "打印" class SkillUsageType: @@ -83,7 +85,7 @@ class Action: def add_haisi_doc(self): if self._doc is not None: return - if self._action_type in [ActionType.SpeedUp, ActionType.BulletTime]: + if self._action_type in [ActionType.SpeedUp, ActionType.BulletTime, ActionType.SkillDaemon, ActionType.Output]: haisi_doc_list = [self._action_type, "执行"] elif self._action_type in [ActionType.Deploy, ActionType.Skill, ActionType.Retreat]: haisi_doc_list = [self._name] @@ -162,13 +164,16 @@ class OperatorOrGroup: return self def deploy(self, location: tuple, direction: str): - self._battle.add_action(self._add_conditions(Action(ActionType.Deploy, self.name, location, direction))) + self._battle.add_action(self._add_conditions( + Action(ActionType.Deploy, self.name, location, direction))) def use_skill(self): - self._battle.add_action(self._add_conditions(Action(ActionType.Skill, self.name))) + self._battle.add_action(self._add_conditions( + Action(ActionType.Skill, self.name))) def retreat(self): - self._battle.add_action(self._add_conditions(Action(ActionType.Retreat, self.name))) + self._battle.add_action(self._add_conditions( + Action(ActionType.Retreat, self.name))) def _add_conditions(self, action: Action) -> Action: if self._pre_delay != 0: @@ -262,7 +267,8 @@ class Operator(OperatorOrGroup): :param change_to: 需要调整到的 SkillUsageType :return: """ - self._battle.add_action(self._add_conditions(Action(ActionType.SkillUsage, skill_usage=change_to))) + self._battle.add_action(self._add_conditions( + Action(ActionType.SkillUsage, skill_usage=change_to))) def to_dict(self) -> dict: res = { @@ -429,7 +435,8 @@ class Battle: except ImportError: import sys import pathlib - sys.path.append(str(pathlib.Path.cwd().parent.parent / "src" / "Python")) + sys.path.append( + str(pathlib.Path.cwd().parent.parent / "src" / "Python")) try: from asst import Asst, Message except ImportError: diff --git a/tools/CopilotDesinger/index.js b/tools/CopilotDesinger/index.js index 1d9e84182f..195c9074fa 100644 --- a/tools/CopilotDesinger/index.js +++ b/tools/CopilotDesinger/index.js @@ -62,6 +62,8 @@ const action_type = () => { '' + '' + '' + + '' + + '' + ''); }; @@ -303,4 +305,4 @@ $(document).ready(() => { charName.forEach(c => $('#oper_names').append($(' + +
@@ -522,9 +524,12 @@ let location = [xcoordinate, ycoordinate] var actionData = { type, kills, cost_changes, name, location, direction, pre_delay, rear_delay, doc, doc_color }; if (isNaN(actionData.kills)) delete actionData.kills; + if (isNaN(actionData.cost_changes)) delete actionData.cost_changes; if (isNaN(actionData.pre_delay)) delete actionData.pre_delay; if (isNaN(actionData.rear_delay)) delete actionData.rear_delay; if (actionData.direction === "") delete actionData.direction; + if (actionData.doc === "") delete actionData.doc; + if (actionData.doc_color === "") delete actionData.doc_color; if (isNaN(actionData.location[0]) || isNaN(actionData.location[1])) delete actionData.location; return actionData; }