diff --git a/plugins/autolabor.cpp b/plugins/autolabor.cpp index ad7992038..fedc1992f 100644 --- a/plugins/autolabor.cpp +++ b/plugins/autolabor.cpp @@ -380,6 +380,8 @@ struct labor_info int maximum_dwarfs() { return config.ival(2); } void set_maximum_dwarfs(int maximum_dwarfs) { config.ival(2) = maximum_dwarfs; } + int talent_pool() { return config.ival(3); } + void set_talent_pool(int talent_pool) { config.ival(3) = talent_pool; } }; struct labor_default @@ -545,6 +547,7 @@ static void reset_labor(df::unit_labor labor) { labor_infos[labor].set_minimum_dwarfs(default_labor_infos[labor].minimum_dwarfs); labor_infos[labor].set_maximum_dwarfs(default_labor_infos[labor].maximum_dwarfs); + labor_infos[labor].set_talent_pool(200); labor_infos[labor].set_mode(default_labor_infos[labor].mode); } @@ -662,7 +665,7 @@ DFhackCExport command_result plugin_init ( color_ostream &out, std::vector []\n" + " autolabor [] []\n" " Set number of dwarves assigned to a labor.\n" " autolabor haulers\n" " Set a labor to be handled by hauler dwarves.\n" @@ -760,6 +763,7 @@ static void assign_labor(unit_labor::unit_labor labor, std::vector values(n_dwarfs); std::vector candidates; std::map dwarf_skill; + std::map dwarf_skillxp; std::vector previously_enabled(n_dwarfs); auto mode = labor_infos[labor].mode(); @@ -797,6 +801,7 @@ static void assign_labor(unit_labor::unit_labor labor, } dwarf_skill[dwarf] = skill_level; + dwarf_skillxp[dwarf] = skill_experience; value += skill_level * 100; value += skill_experience / 20; @@ -827,6 +832,21 @@ static void assign_labor(unit_labor::unit_labor labor, } + int pool = labor_infos[labor].talent_pool(); + if (pool < 200 && candidates.size() > 1) + { + // Sort in descending order + std::sort(candidates.begin(), candidates.end(), [&](const int lhs, const int rhs) { + if (dwarf_skill[lhs] == dwarf_skill[rhs]) + return dwarf_skillxp[lhs] > dwarf_skillxp[rhs]; + else + return dwarf_skill[lhs] > dwarf_skill[rhs]; + }); + + // Trim down to our top talents + candidates.resize(pool); + } + // Sort candidates by preference value values_sorter ivs(values); std::sort(candidates.begin(), candidates.end(), ivs); @@ -1296,7 +1316,8 @@ void print_labor (df::unit_labor labor, color_ostream &out) if (labor_infos[labor].mode() == HAULERS) out << "haulers"; else - out << "minimum " << labor_infos[labor].minimum_dwarfs() << ", maximum " << labor_infos[labor].maximum_dwarfs(); + out << "minimum " << labor_infos[labor].minimum_dwarfs() << ", maximum " << labor_infos[labor].maximum_dwarfs() + << ", pool " << labor_infos[labor].talent_pool(); out << ", currently " << labor_infos[labor].active_dwarfs << " dwarfs" << endl; } } @@ -1352,7 +1373,7 @@ command_result autolabor (color_ostream &out, std::vector & parame hauler_pct = pct; return CR_OK; } - else if (parameters.size() == 2 || parameters.size() == 3) + else if (parameters.size() >= 2 && parameters.size() <= 4) { if (!enable_autolabor) { @@ -1395,17 +1416,22 @@ command_result autolabor (color_ostream &out, std::vector & parame int minimum = atoi (parameters[1].c_str()); int maximum = 200; - if (parameters.size() == 3) + int pool = 200; + + if (parameters.size() >= 3) maximum = atoi (parameters[2].c_str()); + if (parameters.size() == 4) + pool = std::stoi(parameters[3]); if (maximum < minimum || maximum < 0 || minimum < 0) { - out.printerr("Syntax: autolabor []\n", maximum, minimum); + out.printerr("Syntax: autolabor [] []\n", maximum, minimum); return CR_WRONG_USAGE; } labor_infos[labor].set_minimum_dwarfs(minimum); labor_infos[labor].set_maximum_dwarfs(maximum); + labor_infos[labor].set_talent_pool(pool); labor_infos[labor].set_mode(AUTOMATIC); print_labor(labor, out); diff --git a/scripts/autolabor-artisans.lua b/scripts/autolabor-artisans.lua index 9998c03ac..61aa96335 100644 --- a/scripts/autolabor-artisans.lua +++ b/scripts/autolabor-artisans.lua @@ -44,7 +44,7 @@ function run() print('Applies an autolabor command to all labors with quality-based output.') print('') print('Examples:') - print(' autolabor-artisans 0 2') + print(' autolabor-artisans 0 2 3') print(' autolabor-artisans disable') return false end