diff --git a/plugins/autolabor.cpp b/plugins/autolabor.cpp index 97719f8ef..5fb5216e5 100644 --- a/plugins/autolabor.cpp +++ b/plugins/autolabor.cpp @@ -769,6 +769,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) std::vector values(n_dwarfs); std::vector candidates; std::map dwarf_skill; + std::vector previously_enabled(n_dwarfs); auto mode = labor_infos[labor].mode; @@ -834,6 +835,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) if (dwarf_info[dwarf].state == CHILD) continue; + previously_enabled[dwarf] = dwarfs[dwarf]->status.labors[labor]; dwarfs[dwarf]->status.labors[labor] = false; } @@ -850,14 +852,22 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) if (state_count[IDLE] < 2) want_idle_dwarf = false; - for (int i = 0; i < candidates.size() && labor_infos[labor].active_dwarfs < max_dwarfs && (labor_infos[labor].active_dwarfs < min_dwarfs || want_idle_dwarf); i++) + for (int i = 0; i < candidates.size() && labor_infos[labor].active_dwarfs < max_dwarfs; i++) { int dwarf = candidates[i]; assert(dwarf >= 0); assert(dwarf < n_dwarfs); - if (labor_infos[labor].active_dwarfs >= min_dwarfs && dwarf_info[dwarf].state != IDLE && dwarf_skill[dwarf] == 0) + bool preferred_dwarf = false; + if (want_idle_dwarf && dwarf_info[dwarf].state == IDLE) + preferred_dwarf = true; + if (dwarf_skill[dwarf] > 0) + preferred_dwarf = true; + if (previously_enabled[dwarf] && labor_infos[labor].is_exclusive) + preferred_dwarf = true; + + if (labor_infos[labor].active_dwarfs >= min_dwarfs && !preferred_dwarf) continue; if (!dwarfs[dwarf]->status.labors[labor]) @@ -878,7 +888,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) if (dwarf_info[dwarf].state == IDLE || dwarf_info[dwarf].state == BUSY) labor_infos[labor].active_dwarfs++; - if (labor_infos[labor].active_dwarfs >= min_dwarfs && dwarf_info[dwarf].state == IDLE) + if (dwarf_info[dwarf].state == IDLE) want_idle_dwarf = false; } }