Crafter
-------

Crafters can craft items by recipe or desired output item. Crafted items
are placed in the Output inventory, along with any replacement items (for
example if a bucket of milk is used in the craft the bucket is placed in
the Output inventory as well). Source items for the craft must be in the
Input inventory. If the crafter is adjoined to a storage unit the crafter
will also use source items from it as well.

Only the owner can dig or access the form of the locked version.

Unowned crafters can only access unowned units. Owned crafters can access
units of the same owner or unowned units.

UI
Input inventory - top left, source items for crafting.
Player inventory - lower left.
Channel - digilines channel of crafter, press enter or click Set to set.
Crafting grid - center top, enter a recipe to craft.
Automatic - if checked a craft of the recipe is performed every second (if possible).
Preview - this is a preview of the item crafted from the recipe.
Craft - perform 1 craft from the recipe (if possible).
Output inventory - center bottom, where crafted and replacement items are placed.
Search - top right.
Craftable list - right, list of all items that are possible to craft from
						the input items. clicking an item crafts it (if possible).

The form does not update while open. A craft from source items no longer
available will not craft. If an attempt is made to craft by item when the
source materials have run out, the form does update.

Terms can be entered into the search field, and when enter is pressed or
the Search button is pressed, only items whose name or description contains
these terms are shown in the list. That is if they match any of the space
separated terms.

When items are placed into the crafting grid a copy is used and the item
returns to where it was taken from. When items are removed from the crafting
grid they are disposed of.

The preview displays the craft preformed by the recipe. Items cannot be
pulled from here.

The automatic crafting is only operable when the crafter is in an active
block. Mesecons and digilines operations operate in unloaded blocks.

When crafting by item, if more than one recipe is satisfied by the input
items, the crafting grid is replaced with the available crafts for that
item. Clicking the < and > buttons walks through the recipes. Clicking
Craft performs one craft with the displayed recipe. Clicking Close displays
the crafting grid. If only one recipe is satisfied by the input items one
craft is immediately performed without displaying the recipe.

Hoppers placed to the top or sides of a crafter will feed items into the
input. Hoppers placed below a crafter will take items from the output.

Pipeworks tubes can push items into the input, and pull items from the
output.

Mesecons
	Perform 1 craft from the recipe when power is turned on (if possible).

Digilines messages
"craft [qty]"
	Craft from the recipe if possible. qty is optional, if given must be an
	integer between 1 to 10. If not given defaults to 1. A return message
	is sent with it's own channel in the following format:
	{
		action = "crafted",
		qty = number, -- craft qty requested
		crafted = number -- crafts successfully performed
	}


"craftitem itemname [qty]"
	Craft the given item if possible. itemname must be a valid item name
	(eg. "default:wood"). qty is optional, if given must be an integer
	between 1 to 10. If not given defaults to 1. A return message is sent
	with it's own channel in the following format:
	{
		action = "crafted",
		itemname = string, -- the name of the item requested to craft
		qty = number, -- craft qty requested
		crafted = number -- crafts successfully performed
	}

"can_craft [itemname]"
	Test whether a single craft can be performed for the item. itemname is
	optional, if given will test craft by item. If not given will test if
	the recipe in the crafting grid can be performed. A return message is
	sent with it's own channel in the following format:
	{
		action = "can_craft",
		itemname = string, -- the name of the item requested, nil for recipe
		result = boolean -- true if craft can be performed, false if not
	}

"automatic state"
	Sets the automatic running state of the crafter. state must be true or
	false.

"craftable"
	Sends a digilines message with it's own channel of the possible craftable
	items in the following form:
	{
		action = "craftable",
		items = {
			<items>
		}
	}
		The items key is an indexed list of items. Each item entry is
		a table with the following keys:
		{
			name -- string, the name of the item, as <mod>:<name>
			description -- string, short description of item
		}

"inventory"
	Sends a digilines message with it's own channel of the source items,
	including any attached storage, in the following form:
	{
		action = "inventory",
		inventory = {
			<items>
		}
	}
		The inventory key is an indexed list of items. Each item entry is
		a table with the following keys:
		{
			name -- string, the name of the item, as <mod>:<name>
			description -- string, short description of item
			count -- number, the total number of this item in storage
		}


Set recipe grid:
{
	action = "recipe",
	items = { ... }
}
	items must be a string list of item names as <mod>:<name>. The grid is
	filled left to right, top to bottom. Up to the first 9 items are used.

*	When crafting by item the output may not be as expected. For the digilines
	"craftitem" message, the first found recipe for the craft which is
	satisfied by the available items is used. So if you have saplings and
	wood in the input and try to craft sticks, if the first recipe found
	uses the saplings 1 stick will be output, if wood then 4 sticks.
	Also, sometimes the same recipe is registered for more than 1 item.
	In this case, what item will actually be crafted is ambiguous.

*	The file 'crafting_mods.lua' in the mod folder contains a list of
	crafting modifications. Modify this file as necessary. The field name
	is the item being crafted. Each item in the add list is added to the
	output inventory. Each item in the remove list is removed from the
	replacements or source storage.

*	Gaining the list of craftable items is an exponential process, based
	on the number of unique source items and the total number of items
	available. As a guide, 320 source items and 795 total items that resulted
	623 craftable items took approx. 200ms (1st gen i5 processor). The
	list is obtained in a granular function to minimise server burden, but
	may take a moment to update. This list is only gained: when the form is
	opened; when the Search button is clicked; and when the digilines
	"craftable" message is sent.
