autolabor: Add a talent pool parameter.

develop
Patrick Dawson 2014-11-27 15:56:14 +01:00
parent 42dd60a24c
commit 8b1b32a499
2 changed files with 32 additions and 6 deletions

@ -380,6 +380,8 @@ struct labor_info
int maximum_dwarfs() { return config.ival(2); } int maximum_dwarfs() { return config.ival(2); }
void set_maximum_dwarfs(int maximum_dwarfs) { config.ival(2) = maximum_dwarfs; } 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 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_minimum_dwarfs(default_labor_infos[labor].minimum_dwarfs);
labor_infos[labor].set_maximum_dwarfs(default_labor_infos[labor].maximum_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); labor_infos[labor].set_mode(default_labor_infos[labor].mode);
} }
@ -662,7 +665,7 @@ DFhackCExport command_result plugin_init ( color_ostream &out, std::vector <Plug
" autolabor enable\n" " autolabor enable\n"
" autolabor disable\n" " autolabor disable\n"
" Enables or disables the plugin.\n" " Enables or disables the plugin.\n"
" autolabor <labor> <minimum> [<maximum>]\n" " autolabor <labor> <minimum> [<maximum>] [<talent pool>]\n"
" Set number of dwarves assigned to a labor.\n" " Set number of dwarves assigned to a labor.\n"
" autolabor <labor> haulers\n" " autolabor <labor> haulers\n"
" Set a labor to be handled by hauler dwarves.\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<int> values(n_dwarfs); std::vector<int> values(n_dwarfs);
std::vector<int> candidates; std::vector<int> candidates;
std::map<int, int> dwarf_skill; std::map<int, int> dwarf_skill;
std::map<int, int> dwarf_skillxp;
std::vector<bool> previously_enabled(n_dwarfs); std::vector<bool> previously_enabled(n_dwarfs);
auto mode = labor_infos[labor].mode(); 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_skill[dwarf] = skill_level;
dwarf_skillxp[dwarf] = skill_experience;
value += skill_level * 100; value += skill_level * 100;
value += skill_experience / 20; 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 // Sort candidates by preference value
values_sorter ivs(values); values_sorter ivs(values);
std::sort(candidates.begin(), candidates.end(), ivs); 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) if (labor_infos[labor].mode() == HAULERS)
out << "haulers"; out << "haulers";
else 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; out << ", currently " << labor_infos[labor].active_dwarfs << " dwarfs" << endl;
} }
} }
@ -1352,7 +1373,7 @@ command_result autolabor (color_ostream &out, std::vector <std::string> & parame
hauler_pct = pct; hauler_pct = pct;
return CR_OK; return CR_OK;
} }
else if (parameters.size() == 2 || parameters.size() == 3) else if (parameters.size() >= 2 && parameters.size() <= 4)
{ {
if (!enable_autolabor) if (!enable_autolabor)
{ {
@ -1395,17 +1416,22 @@ command_result autolabor (color_ostream &out, std::vector <std::string> & parame
int minimum = atoi (parameters[1].c_str()); int minimum = atoi (parameters[1].c_str());
int maximum = 200; int maximum = 200;
if (parameters.size() == 3) int pool = 200;
if (parameters.size() >= 3)
maximum = atoi (parameters[2].c_str()); maximum = atoi (parameters[2].c_str());
if (parameters.size() == 4)
pool = std::stoi(parameters[3]);
if (maximum < minimum || maximum < 0 || minimum < 0) if (maximum < minimum || maximum < 0 || minimum < 0)
{ {
out.printerr("Syntax: autolabor <labor> <minimum> [<maximum>]\n", maximum, minimum); out.printerr("Syntax: autolabor <labor> <minimum> [<maximum>] [<talent pool>]\n", maximum, minimum);
return CR_WRONG_USAGE; return CR_WRONG_USAGE;
} }
labor_infos[labor].set_minimum_dwarfs(minimum); labor_infos[labor].set_minimum_dwarfs(minimum);
labor_infos[labor].set_maximum_dwarfs(maximum); labor_infos[labor].set_maximum_dwarfs(maximum);
labor_infos[labor].set_talent_pool(pool);
labor_infos[labor].set_mode(AUTOMATIC); labor_infos[labor].set_mode(AUTOMATIC);
print_labor(labor, out); print_labor(labor, out);

@ -44,7 +44,7 @@ function run()
print('Applies an autolabor command to all labors with quality-based output.') print('Applies an autolabor command to all labors with quality-based output.')
print('') print('')
print('Examples:') print('Examples:')
print(' autolabor-artisans 0 2') print(' autolabor-artisans 0 2 3')
print(' autolabor-artisans disable') print(' autolabor-artisans disable')
return false return false
end end