diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index da39497..b84cb1b 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -564,7 +564,9 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe - [x] Add campfire recipe. - [x] Add shelter recipe. - [x] Add recipes or gather paths for primitive shelter structure parts. -- [ ] Add simple container recipe. +- [x] Add simple container recipe. Added `simple_container` item and recipe + data assets, using wood, fiber, and hide as MVP ingredients for later + placed-storage/container systems. - [x] Add bandage or basic treatment recipe. - [ ] Add crafting UI. - [x] Add multiplayer authority checks. diff --git a/Content/Agrarian/DataAssets/Items/DA_Item_SimpleContainer.uasset b/Content/Agrarian/DataAssets/Items/DA_Item_SimpleContainer.uasset new file mode 100644 index 0000000..8b2fe79 --- /dev/null +++ b/Content/Agrarian/DataAssets/Items/DA_Item_SimpleContainer.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:307544ce599cf2a45b18cc44a1945c64f1be68ac850bc5b1c88eb9e945e42e37 +size 2219 diff --git a/Content/Agrarian/DataAssets/Recipes/DA_Recipe_SimpleContainer.uasset b/Content/Agrarian/DataAssets/Recipes/DA_Recipe_SimpleContainer.uasset new file mode 100644 index 0000000..04a8e5f --- /dev/null +++ b/Content/Agrarian/DataAssets/Recipes/DA_Recipe_SimpleContainer.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2059de6ef1d07a90207958a5206358458c84dbd513d88e43fa339ce2427bb577 +size 2682 diff --git a/Docs/InventoryDataModel.md b/Docs/InventoryDataModel.md index f99f4f0..ac32e2c 100644 --- a/Docs/InventoryDataModel.md +++ b/Docs/InventoryDataModel.md @@ -145,6 +145,11 @@ awkward-object handling, and hard over-encumbrance rules for later systems. Those systems should build on the existing total-weight hook instead of adding a parallel inventory burden model. +The 0.1.G `simple_container` recipe is intentionally only a craftable inventory +item. It uses wood, fiber, and hide so the survival loop can produce a storage +foundation now, while actual placed-container inventory, permissions, volume, +and persistence remain later system work. + ## Equipment Slot Decision Dedicated equipment slots are deferred for the 0.1.E MVP. Current MVP tools, diff --git a/Docs/TechnicalDesignDocument.md b/Docs/TechnicalDesignDocument.md index 2f610aa..0e3ad2c 100644 --- a/Docs/TechnicalDesignDocument.md +++ b/Docs/TechnicalDesignDocument.md @@ -73,7 +73,10 @@ Early runtime systems should remain small and explicit: temperature, injury, and survival damage. - Inventory component/classes: item stacks, item definitions, resource intake, and crafting inputs/outputs. -- Crafting component/classes: recipes, validation, output creation. +- Crafting component/classes: recipes, validation, output creation. Current + primitive recipes include campfire, shelter parts, primitive shelter, basic + tool, bandage, and `simple_container`; the simple container is an inventory + craftable foundation for later placed storage and trade-container systems. - Interaction component/classes: player-facing use/gather/build entry points. - Resource actors: gatherable wood, stone, fiber, water, wildlife, and future natural resources. diff --git a/Scripts/setup_item_definitions.py b/Scripts/setup_item_definitions.py index 40176c2..e045080 100644 --- a/Scripts/setup_item_definitions.py +++ b/Scripts/setup_item_definitions.py @@ -103,6 +103,15 @@ ITEMS = [ "unit_weight": 25.0, "max_stack_size": 1, }, + { + "asset": "DA_Item_SimpleContainer", + "item_id": "simple_container", + "display_name": "Simple Container", + "description": "A crude hide-and-frame container for early storage, trade, and later placed-container systems.", + "item_type": unreal.AgrarianItemType.STRUCTURE, + "unit_weight": 8.0, + "max_stack_size": 5, + }, { "asset": "DA_Item_BasicTool", "item_id": "basic_tool", diff --git a/Scripts/setup_recipe_definitions.py b/Scripts/setup_recipe_definitions.py index af6371b..221b734 100644 --- a/Scripts/setup_recipe_definitions.py +++ b/Scripts/setup_recipe_definitions.py @@ -13,6 +13,7 @@ ITEM_DISPLAY = { "primitive_roof_panel": ("Primitive Roof Panel", 4.0), "campfire": ("Campfire", 12.0), "primitive_shelter": ("Primitive Shelter", 25.0), + "simple_container": ("Simple Container", 8.0), "basic_tool": ("Basic Tool", 1.2), "bandage": ("Bandage", 0.1), } @@ -78,6 +79,15 @@ RECIPES = [ "craft_seconds": 6.0, "requires_campfire": False, }, + { + "asset": "DA_Recipe_SimpleContainer", + "recipe_id": "simple_container", + "display_name": "Simple Container", + "ingredients": [("wood", 3), ("fiber", 6), ("hide", 2)], + "result": ("simple_container", 1), + "craft_seconds": 10.0, + "requires_campfire": False, + }, { "asset": "DA_Recipe_Bandage", "recipe_id": "bandage", diff --git a/Scripts/verify_item_definitions.py b/Scripts/verify_item_definitions.py index 5026e99..bad8186 100644 --- a/Scripts/verify_item_definitions.py +++ b/Scripts/verify_item_definitions.py @@ -15,6 +15,7 @@ EXPECTED_ITEMS = { "DA_Item_PrimitiveRoofPanel": ("primitive_roof_panel", unreal.AgrarianItemType.STRUCTURE), "DA_Item_Campfire": ("campfire", unreal.AgrarianItemType.STRUCTURE), "DA_Item_PrimitiveShelter": ("primitive_shelter", unreal.AgrarianItemType.STRUCTURE), + "DA_Item_SimpleContainer": ("simple_container", unreal.AgrarianItemType.STRUCTURE), "DA_Item_BasicTool": ("basic_tool", unreal.AgrarianItemType.TOOL), "DA_Item_Bandage": ("bandage", unreal.AgrarianItemType.MEDICINE), } diff --git a/Scripts/verify_recipe_definitions.py b/Scripts/verify_recipe_definitions.py index a16602b..597fd45 100644 --- a/Scripts/verify_recipe_definitions.py +++ b/Scripts/verify_recipe_definitions.py @@ -40,6 +40,11 @@ EXPECTED_RECIPES = { "ingredients": {"wood": 1, "stone": 2, "fiber": 1}, "result": ("basic_tool", 1), }, + "DA_Recipe_SimpleContainer": { + "recipe_id": "simple_container", + "ingredients": {"wood": 3, "fiber": 6, "hide": 2}, + "result": ("simple_container", 1), + }, "DA_Recipe_Bandage": { "recipe_id": "bandage", "ingredients": {"fiber": 3, "hide": 1}, diff --git a/Scripts/verify_simple_container_recipe.py b/Scripts/verify_simple_container_recipe.py new file mode 100644 index 0000000..43a3248 --- /dev/null +++ b/Scripts/verify_simple_container_recipe.py @@ -0,0 +1,58 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] + +EXPECTED = { + ROOT / "Scripts" / "setup_item_definitions.py": [ + '"asset": "DA_Item_SimpleContainer"', + '"item_id": "simple_container"', + '"display_name": "Simple Container"', + "early storage, trade, and later placed-container systems", + ], + ROOT / "Scripts" / "verify_item_definitions.py": [ + '"DA_Item_SimpleContainer": ("simple_container", unreal.AgrarianItemType.STRUCTURE)', + ], + ROOT / "Scripts" / "setup_recipe_definitions.py": [ + '"asset": "DA_Recipe_SimpleContainer"', + '"recipe_id": "simple_container"', + '("wood", 3)', + '("fiber", 6)', + '("hide", 2)', + '"result": ("simple_container", 1)', + ], + ROOT / "Scripts" / "verify_recipe_definitions.py": [ + '"DA_Recipe_SimpleContainer"', + '"ingredients": {"wood": 3, "fiber": 6, "hide": 2}', + '"result": ("simple_container", 1)', + ], + ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md": [ + "[x] Add simple container recipe.", + ], + ROOT / "Docs" / "TechnicalDesignDocument.md": [ + "`simple_container`", + "foundation for later placed storage and trade-container systems", + ], + ROOT / "Docs" / "InventoryDataModel.md": [ + "The 0.1.G `simple_container` recipe is intentionally only a craftable inventory", + "actual placed-container inventory, permissions, volume", + ], +} + + +def main() -> None: + missing = [] + for path, snippets in EXPECTED.items(): + text = path.read_text(encoding="utf-8") + for snippet in snippets: + if snippet not in text: + missing.append(f"{path.relative_to(ROOT)}: {snippet}") + + if missing: + raise RuntimeError("Simple container recipe verification failed: " + "; ".join(missing)) + + print("PASS: simple container item and recipe definitions are scripted, verified, and tracked in the roadmap.") + + +if __name__ == "__main__": + main()