fix six critical bugs from audit sprint

save/load round-trip: workbench bills, crop static-method, bed owner,
wolf target now all survive reload via Bill.from_dict reconstruction,
_spawn_crop using setup(), and a new _post_load_resolve_references pass.

PlantProvider: sow path added; consumes 1 grain on a TILLED crop tile.

CraftingProvider: ingredient2 supported via new KIND_DEPOSIT_AT_WB toil
and Workbench.deposited_inputs buffer. Cremation pyre now actually
consumes wood.

HaulingProvider: per-item haul_retry_count + haul_rejected after 3
orphan passes; new EventBus.stockpile_layout_changed resets rejects on
any player stockpile edit.

Storyteller: 14 stubbed event effects implemented. New buff registry
(add_buff/get_buff_multiplier/has_buff, day-prune, save/load) drives
seasonal/resource events. New request_pawn_spawn signal + WANDERER
table for arrivals. New SICK status + 3 mood thoughts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
megaproxy 2026-05-16 18:06:55 +01:00
parent 00cf8f445d
commit d9638a4ea4
19 changed files with 711 additions and 101 deletions

View file

@ -25,6 +25,7 @@ const KIND_TREAT: StringName = &"treat" # Multi-tick: apply medicine unt
const KIND_CLEAN: StringName = &"clean" # Multi-tick: reduce dirt on a tile until clean (Phase 13 Cleaning category)
const KIND_PICKUP_CORPSE: StringName = &"pickup_corpse" # Phase 14: pick up a Corpse entity at pawn.tile into pawn.carried_item
const KIND_DEPOSIT_CORPSE: StringName = &"deposit_corpse" # Phase 14: deliver pawn.carried_item (Corpse) into a GraveSlot at pawn.tile
const KIND_DEPOSIT_AT_WB: StringName = &"deposit_at_wb" # Multi-ingredient: stash pawn.carried_item into the workbench's deposited_inputs buffer
var kind: StringName = KIND_IDLE
## Toil-specific params — all values must be int, float, bool, String, Dict, or Array.
@ -225,6 +226,20 @@ static func deposit_corpse() -> Toil:
return t
## Stash pawn.carried_item into the workbench's deposited_inputs buffer.
## Used as the first leg of a two-ingredient craft: pawn carries ingredient1
## here, deposits it into the workbench's buffer, then fetches ingredient2.
## `workbench_path` is the NodePath of the Workbench entity (String, JSON-safe).
##
## data keys:
## "workbench" — String(workbench_path)
static func deposit_at_wb(workbench_path: NodePath) -> Toil:
var t := Toil.new()
t.kind = KIND_DEPOSIT_AT_WB
t.data = {"workbench": String(workbench_path)}
return t
## Timed crafting action at a Workbench.
## `workbench_path` is the NodePath of the Workbench entity (stored as String for JSON safety).
## `bill_index` is the index into workbench.bills that this toil should run.