@ -343,4 +343,266 @@ function ItemTypeDialog(args)
 
		
	
		
			
				    return  dlg.ListBox ( args ) 
 
		
	
		
			
				end  
		
	
		
			
				
 
		
	
		
			
				function  ItemTraitsDialog ( args )  
		
	
		
			
				    local  job_item_flags_map  =  { } 
 
		
	
		
			
				    for  i  =  1 ,  3  do 
 
		
	
		
			
				        for  _ ,  f  in  ipairs ( df [ ' job_item_flags ' .. i ] )  do 
 
		
	
		
			
				            if  f  then 
 
		
	
		
			
				                job_item_flags_map [ f ]  =  ' flags ' .. i 
 
		
	
		
			
				            end 
 
		
	
		
			
				        end 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  job_item_flags  =  { } 
 
		
	
		
			
				    for  k ,  _  in  pairs ( job_item_flags_map )  do 
 
		
	
		
			
				        job_item_flags [ # job_item_flags  +  1 ]  =  k 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.sort ( job_item_flags ) 
 
		
	
		
			
				    -------------------------------------- 
 
		
	
		
			
				    local  tool_uses  =  { } 
 
		
	
		
			
				    for  i ,  _  in  ipairs ( df.tool_uses )  do 
 
		
	
		
			
				        tool_uses [ # tool_uses  +  1 ]  =  df.tool_uses [ i ] 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  restore_none  =  false 
 
		
	
		
			
				    if  tool_uses [ 1 ]  ==  ' NONE '  then 
 
		
	
		
			
				        restore_none  =  true 
 
		
	
		
			
				        table.remove ( tool_uses ,  1 ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.sort ( tool_uses ) 
 
		
	
		
			
				    if  restore_none  then 
 
		
	
		
			
				        table.insert ( tool_uses ,  1 ,  ' NONE ' ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				    -------------------------------------- 
 
		
	
		
			
				    local  set_ore_ix  =  { } 
 
		
	
		
			
				    for  i ,  raw  in  ipairs ( df.global . world.raws . inorganics )  do 
 
		
	
		
			
				        for  _ ,  ix  in  ipairs ( raw.metal_ore . mat_index )  do 
 
		
	
		
			
				            set_ore_ix [ ix ]  =  true 
 
		
	
		
			
				        end 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  ores  =  { } 
 
		
	
		
			
				    for  ix  in  pairs ( set_ore_ix )  do 
 
		
	
		
			
				        local  raw  =  df.global . world.raws . inorganics [ ix ] 
 
		
	
		
			
				        ores [ # ores + 1 ]  =  { mat_index  =  ix ,  name  =  raw.material . state_name.Solid } 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.sort ( ores ,  function ( a , b )  return  a.name  <  b.name  end ) 
 
		
	
		
			
				
 
		
	
		
			
				    -------------------------------------- 
 
		
	
		
			
				    -- CALCIUM_CARBONATE, CAN_GLAZE, FAT, FLUX, 
 
		
	
		
			
				    -- GYPSUM, PAPER_PLANT, PAPER_SLURRY, TALLOW, WAX 
 
		
	
		
			
				    local  reaction_classes_set  =  { } 
 
		
	
		
			
				    for  ix , reaction  in  ipairs ( df.global . world.raws . reactions.reactions )  do 
 
		
	
		
			
				        if  # reaction.reagents  >  0  then 
 
		
	
		
			
				            for  _ ,  r  in  ipairs ( reaction.reagents )  do 
 
		
	
		
			
				                if  r.reaction_class  and  r.reaction_class  ~=  ' '  then 
 
		
	
		
			
				                    reaction_classes_set [ r.reaction_class ]  =  true 
 
		
	
		
			
				                end 
 
		
	
		
			
				            end 
 
		
	
		
			
				        end  --if 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  reaction_classes  =  { } 
 
		
	
		
			
				    for  k  in  pairs ( reaction_classes_set )  do 
 
		
	
		
			
				        reaction_classes [ # reaction_classes  +  1 ]  =  k 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.sort ( reaction_classes ) 
 
		
	
		
			
				    -------------------------------------- 
 
		
	
		
			
				    -- PRESS_LIQUID_MAT, TAN_MAT, BAG_ITEM etc 
 
		
	
		
			
				    local  product_materials_set  =  { } 
 
		
	
		
			
				    for  ix , reaction  in  ipairs ( df.global . world.raws . reactions.reactions )  do 
 
		
	
		
			
				        if  # reaction.products  >  0  then 
 
		
	
		
			
				            --for _, p in ipairs(reaction.products) do 
 
		
	
		
			
				            -- in the list in work order conditions there is no SEED_MAT. 
 
		
	
		
			
				            -- I think it's because the game doesn't iterate over all products. 
 
		
	
		
			
				                local  p  =  reaction.products [ 0 ] 
 
		
	
		
			
				                local  mat  =  p.get_material 
 
		
	
		
			
				                if  mat  and  mat.product_code  ~=  ' '  then 
 
		
	
		
			
				                    product_materials_set [ mat.product_code ]  =  true 
 
		
	
		
			
				                end 
 
		
	
		
			
				            --end 
 
		
	
		
			
				        end  --if 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  product_materials  =  { } 
 
		
	
		
			
				    for  k  in  pairs ( product_materials_set )  do 
 
		
	
		
			
				        product_materials [ # product_materials  +  1 ]  =  k 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.sort ( product_materials ) 
 
		
	
		
			
				    --==================================-- 
 
		
	
		
			
				
 
		
	
		
			
				    local  function  set_search_keys ( choices ) 
 
		
	
		
			
				        for  _ ,  choice  in  ipairs ( choices )  do 
 
		
	
		
			
				            if  not  choice.search_key  then 
 
		
	
		
			
				                if  type ( choice.text )  ==  ' table '  then 
 
		
	
		
			
				                    local  search_key  =  { } 
 
		
	
		
			
				                    for  _ ,  token  in  ipairs ( choice.text )  do 
 
		
	
		
			
				                        search_key [ # search_key + 1 ]  =  string.lower ( token.text  or  ' ' ) 
 
		
	
		
			
				                    end 
 
		
	
		
			
				                    choice.search_key  =  table.concat ( search_key ,  '   ' ) 
 
		
	
		
			
				                elseif  choice.text  then 
 
		
	
		
			
				                    choice.search_key  =  string.lower ( choice.text ) 
 
		
	
		
			
				                end 
 
		
	
		
			
				            end 
 
		
	
		
			
				        end 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    args.text  =  args.prompt  or  ' Type or select an item trait ' 
 
		
	
		
			
				    args.text_pen  =  COLOR_WHITE 
 
		
	
		
			
				    args.with_filter  =  true 
 
		
	
		
			
				    args.icon_width  =  2 
 
		
	
		
			
				    args.dismiss_on_select  =  false 
 
		
	
		
			
				
 
		
	
		
			
				    local  pen_active  =  COLOR_LIGHTCYAN 
 
		
	
		
			
				    local  pen_active_d  =  COLOR_CYAN 
 
		
	
		
			
				    local  pen_not_active  =  COLOR_LIGHTRED 
 
		
	
		
			
				    local  pen_not_active_d  =  COLOR_RED 
 
		
	
		
			
				    local  pen_action  =  COLOR_WHITE 
 
		
	
		
			
				    local  pen_action_d  =  COLOR_GREY 
 
		
	
		
			
				
 
		
	
		
			
				    local  job_item  =  args.job_item 
 
		
	
		
			
				    local  choices  =  { } 
 
		
	
		
			
				
 
		
	
		
			
				    local  pen_cb  =  function ( args ,  fnc ) 
 
		
	
		
			
				        if  not  ( args  and  fnc )  then 
 
		
	
		
			
				            return  COLOR_YELLOW 
 
		
	
		
			
				        end 
 
		
	
		
			
				        return  fnc ( args )  and  pen_active  or  pen_not_active 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  pen_d_cb  =  function ( args ,  fnc ) 
 
		
	
		
			
				        if  not  ( args  and  fnc )  then 
 
		
	
		
			
				            return  COLOR_YELLOW 
 
		
	
		
			
				        end 
 
		
	
		
			
				        return  fnc ( args )  and  pen_active_d  or  pen_not_active_d 
 
		
	
		
			
				    end 
 
		
	
		
			
				    local  icon_cb  =  function ( args ,  fnc ) 
 
		
	
		
			
				        if  not  ( args  and  fnc )  then 
 
		
	
		
			
				            return  ' \19 '  -- ‼ 
 
		
	
		
			
				        end 
 
		
	
		
			
				        -- '\251' is a checkmark 
 
		
	
		
			
				        -- '\254' is a square 
 
		
	
		
			
				        return  fnc ( args )  and  ' \251 '  or  ' \254 ' 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    if  not  args.hide_none  then 
 
		
	
		
			
				        table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  ' ! ' , 
 
		
	
		
			
				            text  =  { { text  =  args.none_caption  or  ' none ' ,  pen  =  pen_action ,  dpen  =  pen_action_d } } , 
 
		
	
		
			
				            reset_all_traits  =  true 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    local  isActiveFlag  =  function  ( obj ) 
 
		
	
		
			
				        return  obj.job_item [ obj.ffield ] [ obj.flag ] 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.insert ( choices ,  { 
 
		
	
		
			
				        icon  =  ' ! ' , 
 
		
	
		
			
				        text  =  { { text  =  ' unset flags ' ,  pen  =  pen_action ,  dpen  =  pen_action_d } } , 
 
		
	
		
			
				        reset_flags  =  true 
 
		
	
		
			
				    } ) 
 
		
	
		
			
				    for  _ ,  flag  in  ipairs ( job_item_flags )  do 
 
		
	
		
			
				        local  ffield  =  job_item_flags_map [ flag ] 
 
		
	
		
			
				        local  text  =  ' is  '  ..  ( value  and  ' '  or  ' any  ' )  ..  string.lower ( flag ) 
 
		
	
		
			
				        local  args  =  { job_item = job_item ,  ffield = ffield ,  flag = flag } 
 
		
	
		
			
				        table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  curry ( icon_cb ,  args ,  isActiveFlag ) , 
 
		
	
		
			
				            text  =  { { text  =  text , 
 
		
	
		
			
				                    pen  =  curry ( pen_cb ,  args ,  isActiveFlag ) , 
 
		
	
		
			
				                    dpen  =  curry ( pen_d_cb ,  args ,  isActiveFlag ) , 
 
		
	
		
			
				            } } , 
 
		
	
		
			
				            ffield  =  ffield ,  flag  =  flag 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    local  isActiveTool  =  function  ( args ) 
 
		
	
		
			
				        return  df.tool_uses [ args.tool_use ]  ==  args.job_item . has_tool_use 
 
		
	
		
			
				    end 
 
		
	
		
			
				    for  _ ,  tool_use  in  ipairs ( tool_uses )  do 
 
		
	
		
			
				        if  tool_use  ==  ' NONE '  then 
 
		
	
		
			
				            table.insert ( choices ,  { 
 
		
	
		
			
				                icon  =  ' ! ' , 
 
		
	
		
			
				                text  =  { { text  =  ' unset use ' ,  pen  =  pen_action ,  dpen  =  pen_action_d } } , 
 
		
	
		
			
				                tool_use  =  tool_use 
 
		
	
		
			
				            } ) 
 
		
	
		
			
				        else 
 
		
	
		
			
				            local  args  =  { job_item  =  job_item ,  tool_use = tool_use } 
 
		
	
		
			
				            table.insert ( choices ,  { 
 
		
	
		
			
				                icon  =  '   ' , 
 
		
	
		
			
				                text  =  { { text  =  ' has use  '  ..  tool_use , 
 
		
	
		
			
				                        pen  =  curry ( pen_cb ,  args ,  isActiveTool ) , 
 
		
	
		
			
				                        dpen  =  curry ( pen_d_cb ,  args ,  isActiveTool ) , 
 
		
	
		
			
				                } } , 
 
		
	
		
			
				                tool_use  =  tool_use 
 
		
	
		
			
				            } ) 
 
		
	
		
			
				        end 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    local  isActiveOre  =  function ( args ) 
 
		
	
		
			
				        return  ( args.job_item . metal_ore  ==  args.mat_index ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  ' ! ' , 
 
		
	
		
			
				            text  =  { { text  =  ' unset ore ' ,  pen  =  pen_action ,  dpen  =  pen_action_d } } , 
 
		
	
		
			
				            ore_ix  =  - 1 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    for  _ ,  ore  in  ipairs ( ores )  do 
 
		
	
		
			
				        local  args  =  { job_item  =  job_item ,  mat_index = ore.mat_index } 
 
		
	
		
			
				        table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  '   ' , 
 
		
	
		
			
				            text  =  { { text  =  ' ore of  '  ..  ore.name , 
 
		
	
		
			
				                    pen  =  curry ( pen_cb ,  args ,  isActiveOre ) , 
 
		
	
		
			
				                    dpen  =  curry ( pen_d_cb ,  args ,  isActiveOre ) , 
 
		
	
		
			
				            } } , 
 
		
	
		
			
				            ore_ix  =  ore.mat_index 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    local  isActiveReactionClass  =  function ( args ) 
 
		
	
		
			
				        return  ( args.job_item . reaction_class  ==  args.reaction_class ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  ' ! ' , 
 
		
	
		
			
				            text  =  { { text  =  ' unset reaction class ' ,  pen  =  pen_action ,  dpen  =  pen_action_d } } , 
 
		
	
		
			
				            reaction_class  =  ' ' 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    for  _ ,  reaction_class  in  ipairs ( reaction_classes )  do 
 
		
	
		
			
				        local  args  =  { job_item  =  job_item ,  reaction_class = reaction_class } 
 
		
	
		
			
				        table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  '   ' , 
 
		
	
		
			
				            text  =  { { text  =  ' reaction class  '  ..  reaction_class , 
 
		
	
		
			
				                    pen  =  curry ( pen_cb ,  args ,  isActiveReactionClass ) , 
 
		
	
		
			
				                    dpen  =  curry ( pen_d_cb ,  args ,  isActiveReactionClass ) 
 
		
	
		
			
				            } } , 
 
		
	
		
			
				            reaction_class  =  reaction_class 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    local  isActiveProduct  =  function ( args ) 
 
		
	
		
			
				        return  ( args.job_item . has_material_reaction_product  ==  args.product_materials ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				    table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  ' ! ' , 
 
		
	
		
			
				            text  =  { { text  =  ' unset producing ' ,  pen  =  pen_action ,  dpen  =  pen_action_d } } , 
 
		
	
		
			
				            product_materials  =  ' ' 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    for  _ ,  product_materials  in  ipairs ( product_materials )  do 
 
		
	
		
			
				        local  args  =  { job_item  =  job_item ,  product_materials = product_materials } 
 
		
	
		
			
				        table.insert ( choices ,  { 
 
		
	
		
			
				            icon  =  '   ' , 
 
		
	
		
			
				            text  =  { { text  =  product_materials  ..  ' -producing ' , 
 
		
	
		
			
				                    pen  =  curry ( pen_cb ,  args ,  isActiveProduct ) , 
 
		
	
		
			
				                    dpen  =  curry ( pen_d_cb ,  args ,  isActiveProduct ) 
 
		
	
		
			
				            } } , 
 
		
	
		
			
				            product_materials  =  product_materials 
 
		
	
		
			
				        } ) 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    set_search_keys ( choices ) 
 
		
	
		
			
				    args.choices  =  choices 
 
		
	
		
			
				
 
		
	
		
			
				    if  args.on_select  then 
 
		
	
		
			
				        local  cb  =  args.on_select 
 
		
	
		
			
				        args.on_select  =  function ( idx ,  obj ) 
 
		
	
		
			
				            return  cb ( obj ) 
 
		
	
		
			
				        end 
 
		
	
		
			
				    end 
 
		
	
		
			
				
 
		
	
		
			
				    return  dlg.ListBox ( args ) 
 
		
	
		
			
				end  
		
	
		
			
				
 
		
	
		
			
				return  _ENV