split CookingProvider out of CraftingProvider — fixes starvation
Player report: pawns starve even with harvested crops because cooking never happens. Root cause: CraftingProvider handled both crafting-skill and cooking-skill bills with priority 4, below Plant=5 and Chop=5 in Decision's tiebreaker. Pawns endlessly harvested + chopped instead of cooking the food already on the floor; raw +25 vegetable couldn't outpace HUNGER_DECAY × 3 pawns. CraftingProvider now filters bills to required_skill == &"crafting" only. New CookingProvider (category=&"cooking", priority=6) handles required_skill == &"cooking" bills (bread, meal_from_vegetables) with identical find/score logic including the ingredient2 buffer flow. pawn.work_priorities default now includes &"cooking": 3 (matches the 9-category design spec). decision.gd category-list comment updated. WorkPriorityMatrix gains a "Cook" column. MCP runtime verified: pawns now decide `cooking(pri=3) → Craft Veggie meal at Hearth` immediately after vegetables exist; 2 bread items appeared by tick 261 of a fresh boot. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f30c7a858b
commit
87a7beb22b
6 changed files with 240 additions and 7 deletions
|
|
@ -21,6 +21,7 @@ const PLACEHOLDER_SOURCE_ID: int = 0
|
|||
const BEAUTY_SYSTEM_SCRIPT: Script = preload("res://scenes/world/beauty_system.gd")
|
||||
const DIRTINESS_SYSTEM_SCRIPT: Script = preload("res://scenes/world/dirtiness_system.gd")
|
||||
const CLEANING_PROVIDER_SCRIPT: Script = preload("res://scenes/ai/cleaning_provider.gd")
|
||||
const COOKING_PROVIDER_SCRIPT: Script = preload("res://scenes/ai/cooking_provider.gd")
|
||||
const INDOOR_TINT_SCRIPT: Script = preload("res://scenes/world/indoor_tint_overlay.gd")
|
||||
# Phase 14 — grave / burial entities (scripts only; no .tscn needed).
|
||||
const GRAVEYARD_ZONE_SCRIPT: Script = preload("res://scenes/world/graveyard_zone.gd")
|
||||
|
|
@ -215,14 +216,21 @@ func _ready() -> void:
|
|||
# completion (Tree.fell, Wall._complete, etc.).
|
||||
World.designation_ctl = designation_ctl
|
||||
|
||||
# Register all 9 providers — Decision iterates by .priority desc.
|
||||
# doctor=9 > sleep=8 > eat=7 > construction=6 > chop=5 ≈ plant=5 > mine=4
|
||||
# ≈ crafting=4 > haul=3 > clean=2.
|
||||
# Phase 17 will tune these via the work-priority matrix UI.
|
||||
# CookingProvider — runtime-instantiated (same pattern as CleaningProvider).
|
||||
# priority 6 = equal to Construction, above Plant(5)/Chop(5).
|
||||
var cooking_provider := Node.new()
|
||||
cooking_provider.set_script(COOKING_PROVIDER_SCRIPT)
|
||||
cooking_provider.name = "CookingProvider"
|
||||
add_child(cooking_provider)
|
||||
|
||||
# Register all 10 providers — Decision iterates by .priority desc.
|
||||
# doctor=9 > sleep=8 > eat=7 > construction=6 = cooking=6 > chop=5 ≈ plant=5
|
||||
# > mine=4 ≈ crafting=4 > haul=3 > clean=2.
|
||||
World.register_work_provider(doctor_provider)
|
||||
World.register_work_provider(sleep_provider)
|
||||
World.register_work_provider(eat_provider)
|
||||
World.register_work_provider(construction_provider)
|
||||
World.register_work_provider(cooking_provider)
|
||||
World.register_work_provider(chop_provider)
|
||||
World.register_work_provider(mine_provider)
|
||||
World.register_work_provider(crafting_provider)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue