86 lines
2.6 KiB
ReStructuredText
86 lines
2.6 KiB
ReStructuredText
====================
|
|
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
|