From d1d29b537a081b9b501ff409ebb0efbc18c5bd58 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 27 Mar 2022 23:47:13 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8A=84=E4=BD=9C=E4=B8=9A-=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=8A=80=E8=83=BD=E7=94=A8=E6=B3=95=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/战斗流程协议.md | 14 +++++++++----- resource/battle/test.json | 24 ++++++++++++++++++------ src/MeoAssistant/AsstBattleDef.h | 14 ++++++++------ src/MeoAssistant/BattleConfiger.cpp | 16 +++++++++++----- src/MeoAssistant/BattleProcessTask.cpp | 9 ++++++++- 5 files changed, 54 insertions(+), 23 deletions(-) diff --git a/docs/战斗流程协议.md b/docs/战斗流程协议.md index a1711e48bc..b1f5887105 100644 --- a/docs/战斗流程协议.md +++ b/docs/战斗流程协议.md @@ -29,7 +29,7 @@ } }, ], - "opers_groups": [ + "groups": [ { "name": "任意正常群奶", // 群组名,必选 // 自己随便取名字,与下面 deploy 中的 name 对应起来就行 @@ -50,9 +50,9 @@ ], "actions": [ // 战斗中的操作。有序,执行完前一个才会去执行下一个。必选 { - "type": "Deploy", // 操作类型,可选,默认 "Deploy" - // "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" - // "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" + "type": "部署", // 操作类型,可选,默认 "Deploy" + // "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" + // "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" // 中英文皆可,效果相同 // 若为 "部署", 当费用不够时,会一直等待到费用够(除非 timeout) // 若为 "技能", 当技能 cd 没转好时,一直等待到技能 cd 好(除非 timeout) @@ -68,11 +68,15 @@ "location": [ 5, 5 ], // 部署干员的位置。 type 为 "部署" 时必选 - "direction": "Left", // 部署干员的干员朝向。 type 为 "部署" 时必选 + "direction": "左", // 部署干员的干员朝向。 type 为 "部署" 时必选 // "Left" | "Right" | "Up" | "Down" | "None" // "左" | "右" | "上" | "下" | "无" // 中英文皆可,效果相同 + "skill_usage": 1, // 修改技能用法。当 type 为 "技能用法" 时必选 + // 举例:刚下淘金娘需要她帮忙打几个怪,不能自动开技能,中后期平稳了需要她自动开技能 + // 则可以在对应时刻设置为 1 + "pre_delay": 0, // 前置延时。可选,默认 0, 单位毫秒 "rear_delay": 0, // 后置延时。可选,默认 0, 单位毫秒 diff --git a/resource/battle/test.json b/resource/battle/test.json index d35211f1d4..c88bb328e9 100644 --- a/resource/battle/test.json +++ b/resource/battle/test.json @@ -10,11 +10,6 @@ { "name": "能天使" }, - { - "name": "桃金娘", - "skill": 1, - "skill_usage": 1 - }, { "name": "澄闪" }, @@ -22,9 +17,26 @@ "name": "临光" } ], + "groups": [ + { + "name": "投降先锋", + "opers": [ + { + "name": "桃金娘", + "skill": 1, + "skill_usage": 1 + }, + { + "name": "琴柳", + "skill": 1, + "skill_usage": 1 + } + ] + } + ], "actions": [ { - "name": "桃金娘", + "name": "投降先锋", "location": [ 8, 4 diff --git a/src/MeoAssistant/AsstBattleDef.h b/src/MeoAssistant/AsstBattleDef.h index 96f5e9f814..0484f49243 100644 --- a/src/MeoAssistant/AsstBattleDef.h +++ b/src/MeoAssistant/AsstBattleDef.h @@ -42,11 +42,12 @@ namespace asst enum class BattleActionType // 操作类型 { - Deploy = 0, // 部署干员 - UseSkill = 1, // 开技能 - Retreat = 2, // 撤退干员 - SwitchSpeed = 100, // 切换二倍速 - BulletTime = 101 // 使用 1/5 的速度(点击任意干员),会在下一个任意操作后恢复原速度 + Deploy, // 部署干员 + UseSkill, // 开技能 + Retreat, // 撤退干员 + SkillUsage, // 技能用法 + SwitchSpeed, // 切换二倍速 + BulletTime // 使用 1/5 的速度(点击任意干员),会在下一个任意操作后恢复原速度 }; struct BattleAction // 操作 @@ -56,6 +57,7 @@ namespace asst std::string group_name; // 目标名,若 type >= SwitchSpeed, group_name 为空 Point location; BattleDeployDirection direction = BattleDeployDirection::Right; + BattleSkillUsage modify_usage = BattleSkillUsage::NotUse; int pre_delay = 0; int rear_delay = 0; int time_out = INT_MAX; @@ -63,7 +65,7 @@ namespace asst struct BattleActionsGroup { - std::unordered_map> opers_groups; + std::unordered_map> groups; std::vector actions; }; diff --git a/src/MeoAssistant/BattleConfiger.cpp b/src/MeoAssistant/BattleConfiger.cpp index 6f5183b527..aff46ce6a0 100644 --- a/src/MeoAssistant/BattleConfiger.cpp +++ b/src/MeoAssistant/BattleConfiger.cpp @@ -10,8 +10,8 @@ bool asst::BattleConfiger::parse(const json::value& json) BattleActionsGroup battle_actions; - if (json.contains("opers_groups")) { - for (const auto& group_info : json.at("opers_groups").as_array()) { + if (json.contains("groups")) { + for (const auto& group_info : json.at("groups").as_array()) { std::string group_name = group_info.at("name").as_string(); std::vector oper_vec; for (const auto& oper_info : group_info.at("opers").as_array()) { @@ -21,7 +21,7 @@ bool asst::BattleConfiger::parse(const json::value& json) oper.skill_usage = static_cast(oper_info.get("skill_usage", 0)); oper_vec.emplace_back(std::move(oper)); } - battle_actions.opers_groups.emplace(std::move(group_name), std::move(oper_vec)); + battle_actions.groups.emplace(std::move(group_name), std::move(oper_vec)); } } @@ -35,7 +35,7 @@ bool asst::BattleConfiger::parse(const json::value& json) // 单个干员的,干员名直接作为组名 std::string group_name = oper.name; - battle_actions.opers_groups.emplace(std::move(group_name), std::vector{ std::move(oper) }); + battle_actions.groups.emplace(std::move(group_name), std::vector{ std::move(oper) }); } } @@ -68,6 +68,12 @@ bool asst::BattleConfiger::parse(const json::value& json) { "Bullettime", BattleActionType::SwitchSpeed }, { "bullettime", BattleActionType::SwitchSpeed }, { "子弹时间", BattleActionType::SwitchSpeed }, + + { "SkillUsage", BattleActionType::SkillUsage }, + { "SKILLUSAGE", BattleActionType::SkillUsage }, + { "Skillusage", BattleActionType::SkillUsage }, + { "skillusage", BattleActionType::SkillUsage }, + { "技能用法", BattleActionType::SkillUsage }, }; std::string type_str = action_info.get("type", "Deploy"); @@ -121,7 +127,7 @@ bool asst::BattleConfiger::parse(const json::value& json) else { action.direction = BattleDeployDirection::Right; } - + action.modify_usage = static_cast(action_info.get("skill_usage", 0)); action.pre_delay = action_info.get("pre_delay", 0); action.rear_delay = action_info.get("rear_delay", 0); action.time_out = action_info.get("timeout", INT_MAX); diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index 258f324f9e..6ce53b283c 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -102,7 +102,7 @@ bool asst::BattleProcessTask::analyze_opers_preview() opers.at(i).name = oper_name; // 找出这个干员是哪个组里的,以及他的技能用法等 - for (const auto& [group_name, deploy_opers] : m_actions_group.opers_groups) { + for (const auto& [group_name, deploy_opers] : m_actions_group.groups) { auto iter = std::find_if(deploy_opers.cbegin(), deploy_opers.cend(), [&](const BattleDeployOper& deploy) -> bool { return deploy.name == oper_name; @@ -263,6 +263,13 @@ bool asst::BattleProcessTask::do_action(const BattleAction& action) break; case BattleActionType::BulletTime: 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; + } break; } sleep(action.rear_delay);