Renewable resources: tree growth + WildGrowth + Quarry on BigRockNode
Trees: 4 growth stages (Sapling→Young→Growing→Mature), only Mature yields wood. WildGrowth ticker fires every in-game hour; rejection- samples grass tiles and plants a sapling with ~30% probability (capped at MAP_TREE_LIMIT=60). New `paint_plant_tree` designation lets the player manually plant — ghost sapling registered as a build_site that ConstructionProvider fulfils. Stage round-trips through save/load. Initial seed mixes 4 saplings + 6 mature so growth is visible day 1. Quarry: new BigRockNode entity (2×2 permanent stone outcrop, never depletes). 3 nodes seeded far from cabin. New QuarryWorkbench (extends Workbench, auto-FOREVER `quarry_stone` bill, recipe drops 1 stone per 300 work-ticks). New `paint_quarry` designation only accepts BigRockNode tiles. CraftingProvider now supports recipes with `ingredient_count == 0` — skips ingredient-fetch and goes straight to walk+craft toils. Recipe gains `ingredient_count` field (defaults 0). Save/load layering: big_rock_node spawns at priority 0 (same as rock/tree), quarry_workbench at priority 2 (after the node). UI: Plant tree + Build quarry buttons added to Build drawer. build_drawer_thumb gains `plant_tree` (sapling sprout in dirt) and `paint_quarry` (stone block + chisel + cut-stone pile) shapes. inspect_tooltip recognises BigRockNode + shows tree growth stage on hover. Delegation: gdscript-refactor (Sonnet ×2) for trees full impl + quarry skeleton; quick-edit (Haiku) for CraftingProvider no-ingredient plumbing + TopBar polish; integration handled on Opus.
This commit is contained in:
parent
296894ff7a
commit
d98d2c2425
20 changed files with 716 additions and 38 deletions
|
|
@ -19,6 +19,9 @@ var id: StringName = &""
|
|||
## Item type consumed by this recipe (single-ingredient for Phase 6).
|
||||
var ingredient_type: StringName = &""
|
||||
|
||||
## Count of ingredient_type required by this recipe. 0 = no ingredient (work only).
|
||||
var ingredient_count: int = 0
|
||||
|
||||
## Phase 14 — optional secondary ingredient. Empty string = no secondary.
|
||||
## CraftingProvider Phase 14 follow-up: enforce pickup of ingredient2 before
|
||||
## assigning a pawn to this bill (currently stub — only ingredient_type enforced).
|
||||
|
|
@ -59,6 +62,7 @@ func to_dict() -> Dictionary:
|
|||
return {
|
||||
"id": String(id),
|
||||
"ingredient_type": String(ingredient_type),
|
||||
"ingredient_count": ingredient_count,
|
||||
"ingredient2_type": String(ingredient2_type),
|
||||
"ingredient2_count": ingredient2_count,
|
||||
"output_type": String(output_type),
|
||||
|
|
@ -73,6 +77,7 @@ static func from_dict(d: Dictionary) -> Recipe:
|
|||
var r := Recipe.new()
|
||||
r.id = StringName(d.get("id", ""))
|
||||
r.ingredient_type = StringName(d.get("ingredient_type", ""))
|
||||
r.ingredient_count = int(d.get("ingredient_count", 0))
|
||||
r.ingredient2_type = StringName(d.get("ingredient2_type", ""))
|
||||
r.ingredient2_count = int(d.get("ingredient2_count", 0))
|
||||
r.output_type = StringName(d.get("output_type", ""))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue