@ -705,7 +705,22 @@ static df::unit_labor construction_build_labor (df::item* i)
return df : : unit_labor : : MASON ;
return df : : unit_labor : : MASON ;
}
}
color_ostream * debug_stream ;
void debug ( char * fmt , . . . )
{
if ( debug_stream )
{
va_list args ;
va_start ( args , fmt ) ;
debug_stream - > vprint ( fmt , args ) ;
va_end ( args ) ;
}
}
class JobLaborMapper {
class JobLaborMapper {
private :
private :
class jlfunc
class jlfunc
{
{
@ -772,7 +787,9 @@ private:
return df : : unit_labor : : PLANT ;
return df : : unit_labor : : PLANT ;
}
}
// FIXME
debug ( " AUTOLABOR: Cannot deduce labor for construct building job of type %s \n " ,
ENUM_KEY_STR ( building_type , bld - > getType ( ) ) . c_str ( ) ) ;
return df : : unit_labor : : NONE ;
return df : : unit_labor : : NONE ;
}
}
jlfunc_construct_bld ( ) { }
jlfunc_construct_bld ( ) { }
@ -786,7 +803,35 @@ private:
df : : building * bld = get_building_from_job ( j ) ;
df : : building * bld = get_building_from_job ( j ) ;
df : : building_type type = bld - > getType ( ) ;
df : : building_type type = bld - > getType ( ) ;
// FIXME
switch ( bld - > getType ( ) )
{
case df : : building_type : : Workshop :
{
df : : building_workshopst * ws = ( df : : building_workshopst * ) bld ;
if ( ws - > type = = df : : workshop_type : : Custom )
{
df : : building_def * def = df : : building_def : : find ( ws - > custom_type ) ;
return def - > build_labors [ 0 ] ;
}
else
return workshop_build_labor [ ws - > type ] ;
}
break ;
case df : : building_type : : Furnace :
case df : : building_type : : TradeDepot :
case df : : building_type : : Construction :
{
df : : building_actual * b = ( df : : building_actual * ) bld ;
return construction_build_labor ( j - > items [ 0 ] - > item ) ;
}
break ;
case df : : building_type : : FarmPlot :
return df : : unit_labor : : PLANT ;
}
debug ( " AUTOLABOR: Cannot deduce labor for destroy building job of type %s \n " ,
ENUM_KEY_STR ( building_type , bld - > getType ( ) ) . c_str ( ) ) ;
return df : : unit_labor : : NONE ;
return df : : unit_labor : : NONE ;
}
}
jlfunc_destroy_bld ( ) { }
jlfunc_destroy_bld ( ) { }
@ -816,9 +861,14 @@ private:
if ( j - > material_category . bits . bone )
if ( j - > material_category . bits . bone )
return df : : unit_labor : : BONE_CARVE ;
return df : : unit_labor : : BONE_CARVE ;
else
else
return df : : unit_labor : : NONE ; //FIXME
{
debug ( " AUTOLABOR: Cannot deduce labor for make crafts job (not bone) \n " ) ;
return df : : unit_labor : : NONE ;
}
default :
default :
return df : : unit_labor : : NONE ; //FIXME
debug ( " AUTOLABOR: Cannot deduce labor for make crafts job, item type %s \n " ,
ENUM_KEY_STR ( item_type , jobitem ) . c_str ( ) ) ;
return df : : unit_labor : : NONE ;
}
}
}
}
case df : : workshop_type : : Masons :
case df : : workshop_type : : Masons :
@ -833,7 +883,9 @@ private:
case df : : workshop_type : : MetalsmithsForge :
case df : : workshop_type : : MetalsmithsForge :
return metaltype ;
return metaltype ;
default :
default :
return df : : unit_labor : : NONE ; // FIXME
debug ( " AUTOLABOR: Cannot deduce labor for make job, workshop type %s \n " ,
ENUM_KEY_STR ( workshop_type , type ) . c_str ( ) ) ;
return df : : unit_labor : : NONE ;
}
}
}
}
else if ( bld - > getType ( ) = = df : : building_type : : Furnace )
else if ( bld - > getType ( ) = = df : : building_type : : Furnace )
@ -845,11 +897,16 @@ private:
case df : : furnace_type : : GlassFurnace :
case df : : furnace_type : : GlassFurnace :
return df : : unit_labor : : GLASSMAKER ;
return df : : unit_labor : : GLASSMAKER ;
default :
default :
return df : : unit_labor : : NONE ; // FIXME
debug ( " AUTOLABOR: Cannot deduce labor for make job, furnace type %s \n " ,
ENUM_KEY_STR ( furnace_type , type ) . c_str ( ) ) ;
return df : : unit_labor : : NONE ;
}
}
}
}
return df : : unit_labor : : NONE ; // FIXME
debug ( " AUTOLABOR: Cannot deduce labor for make job, building type %s \n " ,
ENUM_KEY_STR ( building_type , bld - > getType ( ) ) . c_str ( ) ) ;
return df : : unit_labor : : NONE ;
}
}
jlfunc_make ( df : : unit_labor mt ) : metaltype ( mt ) { }
jlfunc_make ( df : : unit_labor mt ) : metaltype ( mt ) { }
@ -1515,9 +1572,6 @@ private:
if ( item - > flags . whole & bad_flags . whole )
if ( item - > flags . whole & bad_flags . whole )
continue ;
continue ;
if ( ! item - > flags . bits . in_inventory & & ! item - > isAssignedToStockpile ( ) )
labor_needed [ hauling_labor_map [ item - > getType ( ) ] ] + + ;
if ( ! item - > isWeapon ( ) )
if ( ! item - > isWeapon ( ) )
continue ;
continue ;
@ -1675,6 +1729,11 @@ private:
state = OTHER ;
state = OTHER ;
else if ( dwarf - > dwarf - > burrows . size ( ) > 0 )
else if ( dwarf - > dwarf - > burrows . size ( ) > 0 )
state = OTHER ; // dwarfs assigned to burrows are treated as if permanently busy
state = OTHER ; // dwarfs assigned to burrows are treated as if permanently busy
else if ( dwarf - > dwarf - > status2 . able_grasp_impair = = 0 )
{
state = OTHER ; // dwarfs unable to grasp are incapable of nearly all labors
dwarf - > clear_all = true ;
}
else
else
state = IDLE ;
state = IDLE ;
}
}
@ -1834,6 +1893,17 @@ public:
labor_needed [ df : : unit_labor : : BONE_SETTING ] + = cnt_traction ;
labor_needed [ df : : unit_labor : : BONE_SETTING ] + = cnt_traction ;
labor_needed [ df : : unit_labor : : HAUL_ITEM ] + = cnt_crutch ;
labor_needed [ df : : unit_labor : : HAUL_ITEM ] + = cnt_crutch ;
// add entries for hauling jobs
labor_needed [ df : : unit_labor : : HAUL_STONE ] + = world - > stockpile . num_jobs [ 1 ] ;
labor_needed [ df : : unit_labor : : HAUL_WOOD ] + = world - > stockpile . num_jobs [ 2 ] ;
labor_needed [ df : : unit_labor : : HAUL_ITEM ] + = world - > stockpile . num_jobs [ 3 ] ;
labor_needed [ df : : unit_labor : : HAUL_BODY ] + = world - > stockpile . num_jobs [ 5 ] ;
labor_needed [ df : : unit_labor : : HAUL_FOOD ] + = world - > stockpile . num_jobs [ 6 ] ;
labor_needed [ df : : unit_labor : : HAUL_REFUSE ] + = world - > stockpile . num_jobs [ 7 ] ;
labor_needed [ df : : unit_labor : : HAUL_FURNITURE ] + = world - > stockpile . num_jobs [ 8 ] ;
labor_needed [ df : : unit_labor : : HAUL_ANIMAL ] + = world - > stockpile . num_jobs [ 9 ] ;
if ( print_debug )
if ( print_debug )
{
{
for ( auto i = labor_needed . begin ( ) ; i ! = labor_needed . end ( ) ; i + + )
for ( auto i = labor_needed . begin ( ) ; i ! = labor_needed . end ( ) ; i + + )
@ -1853,6 +1923,15 @@ public:
if ( print_debug )
if ( print_debug )
out . print ( " idle count = %d, labor need count = %d \n " , available_dwarfs . size ( ) , pq . size ( ) ) ;
out . print ( " idle count = %d, labor need count = %d \n " , available_dwarfs . size ( ) , pq . size ( ) ) ;
int canary = ( 1 < < df : : unit_labor : : HAUL_STONE ) |
( 1 < < df : : unit_labor : : HAUL_WOOD ) |
( 1 < < df : : unit_labor : : HAUL_BODY ) |
( 1 < < df : : unit_labor : : HAUL_FOOD ) |
( 1 < < df : : unit_labor : : HAUL_REFUSE ) |
( 1 < < df : : unit_labor : : HAUL_ITEM ) |
( 1 < < df : : unit_labor : : HAUL_FURNITURE ) |
( 1 < < df : : unit_labor : : HAUL_ANIMAL ) ;
while ( ! available_dwarfs . empty ( ) & & ! pq . empty ( ) )
while ( ! available_dwarfs . empty ( ) & & ! pq . empty ( ) )
{
{
df : : unit_labor labor = pq . top ( ) . second ;
df : : unit_labor labor = pq . top ( ) . second ;
@ -1899,6 +1978,9 @@ public:
( * bestdwarf ) - > clear_labor ( l ) ;
( * bestdwarf ) - > clear_labor ( l ) ;
}
}
if ( labor > = df : : unit_labor : : HAUL_STONE & & labor < = df : : unit_labor : : HAUL_ANIMAL )
canary & = ~ ( 1 < < labor ) ;
available_dwarfs . erase ( bestdwarf ) ;
available_dwarfs . erase ( bestdwarf ) ;
pq . pop ( ) ;
pq . pop ( ) ;
if ( - - labor_needed [ labor ] > 0 )
if ( - - labor_needed [ labor ] > 0 )
@ -1908,6 +1990,19 @@ public:
}
}
}
}
if ( canary ! = 0 )
{
dwarf_info_t * d = dwarf_info . front ( ) ;
FOR_ENUM_ITEMS ( unit_labor , l )
{
if ( l > = df : : unit_labor : : HAUL_STONE & & l < = df : : unit_labor : : HAUL_ANIMAL & &
canary & ( 1 < < l ) )
d - > set_labor ( l ) ;
}
if ( print_debug )
out . print ( " Setting %s as the hauling canary \n " , d - > dwarf - > name . first_name . c_str ( ) ) ;
}
print_debug = 0 ;
print_debug = 0 ;
}
}
@ -1946,6 +2041,8 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
return CR_OK ;
return CR_OK ;
step_count = 0 ;
step_count = 0 ;
debug_stream = & out ;
AutoLaborManager alm ( out ) ;
AutoLaborManager alm ( out ) ;
alm . process ( ) ;
alm . process ( ) ;