diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index c8a05d3ead..85c070c33f 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -292,29 +292,36 @@ bool asst::Assistance::append_infrast(infrast::WorkMode work_mode, const std::ve auto info_task_ptr = std::make_shared(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(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(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(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(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(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(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(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(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(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(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(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") { diff --git a/src/MeoAssistance/InfrastAbstractTask.cpp b/src/MeoAssistance/InfrastAbstractTask.cpp index 3077e5be40..4911d640de 100644 --- a/src/MeoAssistance/InfrastAbstractTask.cpp +++ b/src/MeoAssistance/InfrastAbstractTask.cpp @@ -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; diff --git a/src/MeoAssistance/InfrastAbstractTask.h b/src/MeoAssistance/InfrastAbstractTask.h index b9128c5763..8babda9020 100644 --- a/src/MeoAssistance/InfrastAbstractTask.h +++ b/src/MeoAssistance/InfrastAbstractTask.h @@ -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; }; } diff --git a/src/MeoAssistance/InfrastDormTask.cpp b/src/MeoAssistance/InfrastDormTask.cpp index acf320bf71..0e6c8b5a0e 100644 --- a/src/MeoAssistance/InfrastDormTask.cpp +++ b/src/MeoAssistance/InfrastDormTask.cpp @@ -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"); diff --git a/src/MeoAssistance/InfrastDormTask.h b/src/MeoAssistance/InfrastDormTask.h index f266617086..166193a145 100644 --- a/src/MeoAssistance/InfrastDormTask.h +++ b/src/MeoAssistance/InfrastDormTask.h @@ -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; }; } diff --git a/src/MeoAssistance/InfrastProductionTask.cpp b/src/MeoAssistance/InfrastProductionTask.cpp index bc7c4831b0..bffab44e6a 100644 --- a/src/MeoAssistance/InfrastProductionTask.cpp +++ b/src/MeoAssistance/InfrastProductionTask.cpp @@ -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(),