anchor.diff:  	c.labels.add(new ConsoleLink(c.rightJustified(autocraftString), c.height - 1,  autocraftString, 190, (c, l) {
   		autocraft = !autocraft;
   	}, autocraftColor));
  +}
  +
  +typedef void SelectMaterialCallback(Console c, ItemStack stack);
  +ConsoleRefreshHandler onSelectMaterial(Console c, RecipeInput input, SelectMaterialCallback onDone) {
  +	return (c) {
  +		c.labels.add(new ConsoleLabel(0, 0, "Select " + input.name + ":"));
  +		
  +		int i = 0;
  +		for (ItemStack stack in world.player.inventory.items) {
  +			if (input.matches(stack)) {
  +				c.labels.add(new ConsoleLink(0, i+2,  getKeyForInt(i+1) + ") " + stack.name, getKeyForInt(i+1), (c, l) {
  +					onDone(c, stack);
  +				}, stack.color));
  +				i++;
  +			}
  +		}
  +		
  +		c.labels.add(new ConsoleLink(0, c.height - 1, "ENTER) Back", 13, (c, l) {
  +			onDone(c, null);
  +		}));
  +	};
   }
positive.code: 					
  					selFeatureRecipe.craft(world.player.tile, items);
  					
  					c.onRefresh = handleTileView;
  				} else {
  					// show material selection gui
  				}
  			}));
  		} else {
  
negative.code: }
  
  FeatureRecipe selFeatureRecipe;
  bool autocraft = false;
  void handleCraftFeature(Console c) {
  	c.labels.add(new ConsoleLabel(0, 0,  "Craft Structure"));
  	
  