====================
crafting and recipes
====================

the crafting system lets players combine materials to create new items. recipes
are defined in TOML files, loaded at startup, and executed via the ``craft``
command.

recipe structure
================

recipes live in ``content/recipes/`` as TOML files. each defines:

- ``name`` - unique identifier (lowercase, underscores)
- ``description`` - what you're making (shown in recipe listings)
- ``ingredients`` - list of thing template names (duplicates = need multiples)
- ``result`` - thing template name to spawn

example::

    name = "wooden_table"
    description = "Craft a sturdy table from planks and nails"
    ingredients = ["plank", "plank", "plank", "nail", "nail"]
    result = "table"

all ingredient and result names must match existing thing templates in the
``thing_templates`` registry.

loading
=======

``load_recipe(path)`` parses a single TOML file into a Recipe dataclass.
``load_recipes(dir)`` walks the directory and loads all ``.toml`` files.

the global ``recipes`` dict (keyed by name) is updated at server startup in
``server.py``. recipes are immutable after load.

crafting
========

``cmd_craft(player, args)`` executes the crafting flow:

1. parse recipe name from args (case-insensitive, prefix matching)
2. find matching recipe (error if ambiguous or not found)
3. count required ingredients via ``Counter()``
4. count available items in player inventory
5. check all ingredients present (list missing if not)
6. verify result template exists in ``thing_templates``
7. consume ingredients (remove from world)
8. spawn result via ``spawn_thing``, add to inventory
9. send success message

ingredient counting uses python's ``Counter`` to handle duplicates. "2x plank"
means the ingredients list contains ``"plank"`` twice.

browsing recipes
================

``cmd_recipes()`` shows available recipes:

- no args: lists all recipes with descriptions
- with args: shows detailed recipe for a specific name (prefix matching)

detail view shows ingredients with counts ("2x plank, 2x nail") and the result
item. ambiguous prefixes are detected and reported.

materials
=========

existing thing templates usable as materials:

- ``plank`` - wooden plank
- ``nail`` - iron nail
- ``table`` - wooden table
- ``chair`` - wooden chair

new materials require adding thing templates to ``things.py`` and
creating recipes that reference them.

code
====

- ``src/mudlib/crafting.py`` - Recipe dataclass, loading, registry
- ``src/mudlib/commands/crafting.py`` - craft and recipes commands
- ``content/recipes/`` - TOML recipe definitions
- ``src/mudlib/things.py`` - thing template registry
