diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 996cae8f1..62f274902 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1519,6 +1519,7 @@ static const LuaWrapper::FunctionReg dfhack_units_module[] = { WRAPM(Units, getNominalSkill), WRAPM(Units, getEffectiveSkill), WRAPM(Units, getExperience), + WRAPM(Units, isValidLabor), WRAPM(Units, computeMovementSpeed), WRAPM(Units, computeSlowdownFactor), WRAPM(Units, getProfessionName), diff --git a/library/include/modules/Units.h b/library/include/modules/Units.h index 655f13b5a..d706778b6 100644 --- a/library/include/modules/Units.h +++ b/library/include/modules/Units.h @@ -269,6 +269,8 @@ DFHACK_EXPORT int getNominalSkill(df::unit *unit, df::job_skill skill_id, bool u DFHACK_EXPORT int getEffectiveSkill(df::unit *unit, df::job_skill skill_id); DFHACK_EXPORT int getExperience(df::unit *unit, df::job_skill skill_id, bool total = false); +DFHACK_EXPORT bool isValidLabor(df::unit *unit, df::unit_labor labor); + DFHACK_EXPORT int computeMovementSpeed(df::unit *unit); DFHACK_EXPORT float computeSlowdownFactor(df::unit *unit); diff --git a/library/modules/Units.cpp b/library/modules/Units.cpp index 99c0ebca7..4bd2b49aa 100644 --- a/library/modules/Units.cpp +++ b/library/modules/Units.cpp @@ -1223,6 +1223,19 @@ int Units::getEffectiveSkill(df::unit *unit, df::job_skill skill_id) return rating; } +bool Units::isValidLabor(df::unit *unit, df::unit_labor labor) +{ + CHECK_NULL_POINTER(unit); + if (!is_valid_enum_item(labor)) + return false; + if (labor == df::unit_labor::NONE) + return false; + df::historical_entity *entity = df::historical_entity::find(unit->civ_id); + if (entity && entity->entity_raw && !entity->entity_raw->jobs.permitted_labor[labor]) + return false; + return true; +} + inline void adjust_speed_rating(int &rating, bool is_adventure, int value, int dwarf100, int dwarf200, int adv50, int adv75, int adv100, int adv200) { if (is_adventure) diff --git a/plugins/autohauler.cpp b/plugins/autohauler.cpp index 47c64c0aa..9814b678e 100644 --- a/plugins/autohauler.cpp +++ b/plugins/autohauler.cpp @@ -951,6 +951,8 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) // For every dwarf... for(int dwarf = 0; dwarf < dwarfs.size(); dwarf++) { + if (!Units::isValidLabor(dwarfs[dwarf], labor)) + continue; // Set hauling labors based on employment states if(dwarf_info[dwarf].state == IDLE) { diff --git a/plugins/autolabor.cpp b/plugins/autolabor.cpp index 0ab28ca65..21b979416 100644 --- a/plugins/autolabor.cpp +++ b/plugins/autolabor.cpp @@ -658,7 +658,7 @@ static void enable_plugin(color_ostream &out) setOptionEnabled(CF_ENABLED, true); enable_autolabor = true; - out << "Enabling the plugin." << endl; + out << "Enabling autolabor." << endl; cleanup_state(); init_state(); @@ -975,7 +975,8 @@ static void assign_labor(unit_labor::unit_labor labor, if (!dwarfs[dwarf]->status.labors[labor]) dwarf_info[dwarf].assigned_jobs++; - dwarfs[dwarf]->status.labors[labor] = true; + if (Units::isValidLabor(dwarfs[dwarf], labor)) + dwarfs[dwarf]->status.labors[labor] = true; if (labor_infos[labor].is_exclusive) { diff --git a/plugins/manipulator.cpp b/plugins/manipulator.cpp index d6d2cb222..c2f6759a5 100644 --- a/plugins/manipulator.cpp +++ b/plugins/manipulator.cpp @@ -95,14 +95,6 @@ struct SkillColumn df::job_skill skill; // displayed rating char label[3]; // column header bool special; // specified labor is mutually exclusive with all other special labors - bool isValidLabor (df::historical_entity *entity = NULL) const - { - if (labor == unit_labor::NONE) - return false; - if (entity && entity->entity_raw && !entity->entity_raw->jobs.permitted_labor[labor]) - return false; - return true; - } }; #define NUM_COLUMNS (sizeof(columns) / sizeof(SkillColumn)) @@ -1631,9 +1623,10 @@ void viewscreen_unitlaborsst::feed(set *events) } UnitInfo *cur = units[input_row]; - if (events->count(interface_key::SELECT) && (cur->allowEdit) && columns[input_column].isValidLabor(ui->main.fortress_entity)) + df::unit *unit = cur->unit; + df::unit_labor cur_labor = columns[input_column].labor; + if (events->count(interface_key::SELECT) && (cur->allowEdit) && Units::isValidLabor(unit, cur_labor)) { - df::unit *unit = cur->unit; const SkillColumn &col = columns[input_column]; bool newstatus = !unit->status.labors[col.labor]; if (col.special) @@ -1650,16 +1643,15 @@ void viewscreen_unitlaborsst::feed(set *events) } unit->status.labors[col.labor] = newstatus; } - if (events->count(interface_key::SELECT_ALL) && (cur->allowEdit) && columns[input_column].isValidLabor(ui->main.fortress_entity)) + if (events->count(interface_key::SELECT_ALL) && (cur->allowEdit) && Units::isValidLabor(unit, cur_labor)) { - df::unit *unit = cur->unit; const SkillColumn &col = columns[input_column]; bool newstatus = !unit->status.labors[col.labor]; for (int i = 0; i < NUM_COLUMNS; i++) { if (columns[i].group != col.group) continue; - if (!columns[i].isValidLabor(ui->main.fortress_entity)) + if (!Units::isValidLabor(unit, columns[i].labor)) continue; if (columns[i].special) { @@ -2055,7 +2047,7 @@ void viewscreen_unitlaborsst::render() } - canToggle = (cur->allowEdit) && columns[sel_column].isValidLabor(ui->main.fortress_entity); + canToggle = (cur->allowEdit) && Units::isValidLabor(unit, columns[sel_column].labor); } int x = 2, y = dim.y - 4;