@ -945,6 +945,15 @@ private:
{
if ( labor > = 0 & & labor < = ENUM_LAST_ITEM ( unit_labor ) )
{
if ( ! Units : : isValidLabor ( dwarf - > dwarf , labor ) )
{
debug ( " WARN(labormanager): Attempted to %s dwarf %s with ineligible labor %s \n " ,
value ? " set " : " unset " ,
dwarf - > dwarf - > name . first_name . c_str ( ) ,
ENUM_KEY_STR ( unit_labor , labor ) . c_str ( ) ) ;
return ;
}
bool old = dwarf - > dwarf - > status . labors [ labor ] ;
dwarf - > dwarf - > status . labors [ labor ] = value ;
if ( old ! = value )
@ -1182,7 +1191,17 @@ private:
{
df : : unit * cre = * u ;
if ( Units : : isCitizen ( cre ) )
// following tests shamelessly stolen from Dwarf Manipulator plugin
bool isAssignable =
( Units : : isOwnCiv ( cre ) ) & &
( Units : : isOwnGroup ( cre ) ) & &
( Units : : isActive ( cre ) ) & &
( ! cre - > flags2 . bits . visitor ) & &
( ! cre - > flags3 . bits . ghostly ) & &
( ENUM_ATTR ( profession , can_assign_labor , cre - > profession ) ) ;
if ( isAssignable )
{
dwarf_info_t * dwarf = add_dwarf ( cre ) ;
@ -1438,7 +1457,7 @@ private:
{
if ( labor = = unit_labor : : NONE )
continue ;
if ( Units : : isValidLabor ( dwarf - > dwarf , labor ) )
set_labor ( dwarf , labor , false ) ;
}
}
@ -1690,6 +1709,8 @@ public:
{
dwarf_info_t * d = ( * k ) ;
if ( Units : : isValidLabor ( d - > dwarf , df : : unit_labor : : HAUL_FOOD ) )
{
int score = score_labor ( d , df : : unit_labor : : HAUL_FOOD ) ;
if ( score > best_score )
@ -1698,6 +1719,7 @@ public:
best_score = score ;
}
}
}
if ( best_score > INT_MIN )
{
@ -1708,7 +1730,7 @@ public:
{
if ( l = = df : : unit_labor : : NONE )
continue ;
if ( Units : : isValidLabor ( ( * bestdwarf ) - > dwarf , l ) )
set_labor ( * bestdwarf , l , l = = df : : unit_labor : : HAUL_FOOD ) ;
}
@ -1822,6 +1844,8 @@ public:
for ( std : : list < dwarf_info_t * > : : iterator k = available_dwarfs . begin ( ) ; k ! = available_dwarfs . end ( ) ; k + + )
{
dwarf_info_t * d = ( * k ) ;
if ( Units : : isValidLabor ( d - > dwarf , labor ) )
{
int score = score_labor ( d , labor ) ;
if ( score > best_score )
{
@ -1831,6 +1855,7 @@ public:
}
}
}
}
if ( best_labor = = df : : unit_labor : : NONE )
break ;
@ -1845,7 +1870,9 @@ public:
tools_enum t = default_labor_infos [ l ] . tool ;
if ( l = = best_labor & & ( t = = TOOL_NONE | | tool_in_use [ t ] < tool_count [ t ] ) )
if ( l = = best_labor & &
Units : : isValidLabor ( ( * bestdwarf ) - > dwarf , l ) & &
( t = = TOOL_NONE | | tool_in_use [ t ] < tool_count [ t ] ) )
{
set_labor ( * bestdwarf , l , true ) ;
if ( t ! = TOOL_NONE & & ! ( ( * bestdwarf ) - > has_tool [ t ] ) )
@ -1865,6 +1892,7 @@ public:
}
else if ( ( * bestdwarf ) - > state = = IDLE )
{
if ( Units : : isValidLabor ( ( * bestdwarf ) - > dwarf , l ) )
set_labor ( * bestdwarf , l , false ) ;
}
}
@ -1897,6 +1925,8 @@ public:
continue ;
if ( labor_needed [ l ] < = 0 )
continue ;
if ( ! Units : : isValidLabor ( ( * d ) - > dwarf , l ) )
continue ;
int score = score_labor ( * d , l ) ;
@ -1934,7 +1964,8 @@ public:
FOR_ENUM_ITEMS ( unit_labor , l )
{
if ( l > = df : : unit_labor : : HAUL_STONE & & l < = df : : unit_labor : : HAUL_ANIMALS & &
canary & ( 1 < < l ) )
canary & ( 1 < < l ) & &
Units : : isValidLabor ( canary_dwarf - > dwarf , l ) )
set_labor ( canary_dwarf , l , true ) ;
}
@ -1967,6 +1998,7 @@ public:
if ( l = = df : : unit_labor : : NONE )
continue ;
if ( Units : : isValidLabor ( ( * d ) - > dwarf , l ) )
set_labor ( * d , l ,
( l > = df : : unit_labor : : HAUL_STONE & & l < = df : : unit_labor : : HAUL_ANIMALS ) | |
l = = df : : unit_labor : : CLEAN | |