mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-18 10:10:45 +08:00
feat.基建支持先换班,后进宿舍
This commit is contained in:
@@ -292,29 +292,36 @@ bool asst::Assistance::append_infrast(infrast::WorkMode work_mode, const std::ve
|
||||
auto info_task_ptr = std::make_shared<InfrastInfoTask>(task_callback, (void*)this);
|
||||
info_task_ptr->set_work_mode(work_mode);
|
||||
info_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
info_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
|
||||
m_tasks_queue.emplace(info_task_ptr);
|
||||
|
||||
// 因为后期要考虑多任务间的联动等,所以这些任务的声明暂时不妨到for循环中
|
||||
// 因为后期要考虑多任务间的联动等,所以这些任务的声明暂时不放到for循环中
|
||||
auto mfg_task_ptr = std::make_shared<InfrastMfgTask>(task_callback, (void*)this);
|
||||
mfg_task_ptr->set_work_mode(work_mode);
|
||||
mfg_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
mfg_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
auto trade_task_ptr = std::make_shared<InfrastTradeTask>(task_callback, (void*)this);
|
||||
trade_task_ptr->set_work_mode(work_mode);
|
||||
trade_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
trade_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
auto power_task_ptr = std::make_shared<InfrastPowerTask>(task_callback, (void*)this);
|
||||
power_task_ptr->set_work_mode(work_mode);
|
||||
power_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
power_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
auto office_task_ptr = std::make_shared<InfrastOfficeTask>(task_callback, (void*)this);
|
||||
office_task_ptr->set_work_mode(work_mode);
|
||||
office_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
office_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
auto recpt_task_ptr = std::make_shared<InfrastReceptionTask>(task_callback, (void*)this);
|
||||
recpt_task_ptr->set_work_mode(work_mode);
|
||||
recpt_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
recpt_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
|
||||
auto dorm_task_ptr = std::make_shared<InfrastDormTask>(task_callback, (void*)this);
|
||||
dorm_task_ptr->set_work_mode(work_mode);
|
||||
dorm_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
dorm_task_ptr->set_mood_threshold(dorm_threshold);
|
||||
auto mfg_task_ptr = std::make_shared<InfrastMfgTask>(task_callback, (void*)this);
|
||||
mfg_task_ptr->set_work_mode(work_mode);
|
||||
mfg_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
auto trade_task_ptr = std::make_shared<InfrastTradeTask>(task_callback, (void*)this);
|
||||
trade_task_ptr->set_work_mode(work_mode);
|
||||
trade_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
auto power_task_ptr = std::make_shared<InfrastPowerTask>(task_callback, (void*)this);
|
||||
power_task_ptr->set_work_mode(work_mode);
|
||||
power_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
auto office_task_ptr = std::make_shared<InfrastOfficeTask>(task_callback, (void*)this);
|
||||
office_task_ptr->set_work_mode(work_mode);
|
||||
office_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
auto recpt_task_ptr = std::make_shared<InfrastReceptionTask>(task_callback, (void*)this);
|
||||
recpt_task_ptr->set_work_mode(work_mode);
|
||||
recpt_task_ptr->set_task_chain(InfrastTaskCahin);
|
||||
|
||||
for (const auto& facility : order) {
|
||||
if (facility == "Dorm") {
|
||||
|
||||
@@ -28,6 +28,11 @@ void asst::InfrastAbstractTask::set_work_mode(infrast::WorkMode work_mode) noexc
|
||||
}
|
||||
}
|
||||
|
||||
void asst::InfrastAbstractTask::set_mood_threshold(double mood_thres) noexcept
|
||||
{
|
||||
m_mood_threshold = mood_thres;
|
||||
}
|
||||
|
||||
bool asst::InfrastAbstractTask::on_run_fails()
|
||||
{
|
||||
LogTraceFunction;
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace asst
|
||||
using AbstractTask::AbstractTask;
|
||||
virtual ~InfrastAbstractTask() = default;
|
||||
virtual void set_work_mode(infrast::WorkMode work_mode) noexcept;
|
||||
virtual void set_mood_threshold(double mood_thres) noexcept;
|
||||
|
||||
protected:
|
||||
virtual bool on_run_fails() override;
|
||||
@@ -32,5 +33,6 @@ namespace asst
|
||||
int m_last_swipe_id = 0;
|
||||
infrast::WorkMode m_work_mode = infrast::WorkMode::Gentle;
|
||||
std::string m_work_mode_name = "Gentle";
|
||||
double m_mood_threshold = 0;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -67,10 +67,8 @@ bool asst::InfrastDormTask::_run()
|
||||
break;
|
||||
case infrast::SmileyType::Work:
|
||||
case infrast::SmileyType::Distract:
|
||||
// 干员没有被选择的情况下,心情小于30%,或不在工作,就进驻宿舍
|
||||
if (oper.selected == false &&
|
||||
(oper.mood_ratio < m_mood_threshold
|
||||
|| oper.doing != infrast::Doing::Working)) {
|
||||
// 干员没有被选择的情况下,且不在工作,就进驻宿舍
|
||||
if (oper.selected == false && oper.doing != infrast::Doing::Working) {
|
||||
ctrler.click(oper.rect);
|
||||
if (++quantity_selected >= MaxNumOfOpers) {
|
||||
log.trace("quantity_selected:", quantity_selected, ", just break");
|
||||
|
||||
@@ -9,11 +9,6 @@ namespace asst
|
||||
using InfrastAbstractTask::InfrastAbstractTask;
|
||||
virtual ~InfrastDormTask() = default;
|
||||
|
||||
void set_mood_threshold(double mood_threshold) noexcept
|
||||
{
|
||||
m_mood_threshold = mood_threshold;
|
||||
}
|
||||
|
||||
const static std::string FacilityName;
|
||||
const static int MaxNumOfOpers = 5;
|
||||
|
||||
@@ -23,6 +18,5 @@ namespace asst
|
||||
|
||||
int m_cur_dorm_index = 0;
|
||||
int m_max_num_of_dorm = 4;
|
||||
double m_mood_threshold = 0;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -187,6 +187,11 @@ size_t asst::InfrastProductionTask::opers_detect()
|
||||
--cur_available_num;
|
||||
continue;
|
||||
}
|
||||
// 心情过低的干员则不可用
|
||||
if (cur_oper.mood_ratio < m_mood_threshold) {
|
||||
//--cur_available_num;
|
||||
continue;
|
||||
}
|
||||
auto find_iter = std::find_if(
|
||||
m_all_available_opers.cbegin(), m_all_available_opers.cend(),
|
||||
[&cur_oper](const infrast::Oper& oper) -> bool {
|
||||
@@ -343,7 +348,7 @@ bool asst::InfrastProductionTask::optimal_calc()
|
||||
if (!opt.possible_hashs.empty()) {
|
||||
for (const auto& [key, hash] : opt.possible_hashs) {
|
||||
int dist = utils::hamming(find_iter->name_hash, hash);
|
||||
log.trace("optimal_calc | hash dist", dist, hash, find_iter->name_hash);
|
||||
log.trace("optimal_calc | name hash dist", dist, hash, find_iter->name_hash);
|
||||
if (dist < m_name_hash_thres) {
|
||||
hash_matched = true;
|
||||
break;
|
||||
@@ -443,6 +448,11 @@ bool asst::InfrastProductionTask::opers_choose()
|
||||
}
|
||||
}
|
||||
auto cur_all_opers = oper_analyzer.get_result();
|
||||
// 小于心情阈值的干员则不可用
|
||||
std::remove_if(cur_all_opers.begin(), cur_all_opers.end(),
|
||||
[&](const infrast::Oper& rhs) -> bool {
|
||||
return rhs.mood_ratio < m_mood_threshold;
|
||||
});
|
||||
for (auto opt_iter = m_optimal_combs.begin(); opt_iter != m_optimal_combs.end();) {
|
||||
auto find_iter = std::find_if(
|
||||
cur_all_opers.cbegin(), cur_all_opers.cend(),
|
||||
|
||||
Reference in New Issue
Block a user